This commit was manufactured by cvs2svn to create branch 'R3_2_5_patches'.
diff --git a/bundles/org.eclipse.jst.jsp.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.jsp.core/.settings/org.eclipse.jdt.core.prefs
index 66ddc69..911428b 100644
--- a/bundles/org.eclipse.jst.jsp.core/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.jst.jsp.core/.settings/org.eclipse.jdt.core.prefs
@@ -56,7 +56,7 @@
 org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled

 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error

 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled

-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore

+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning

 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore

 org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning

 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore

diff --git a/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF
index 2d66309..b0ce616 100644
--- a/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jst.jsp.core; singleton:=true
-Bundle-Version: 1.2.101.qualifier
+Bundle-Version: 1.2.308.qualifier
 Bundle-Activator: org.eclipse.jst.jsp.core.internal.JSPCorePlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -42,19 +42,22 @@
  org.eclipse.jst.jsp.css.core.internal.modelhandler;x-friends:="org.eclipse.jst.jsp.ui",
  org.eclipse.jst.jsp.css.core.internal.parser;x-internal:=true,
  org.eclipse.jst.jsp.css.core.internal.parserz;x-internal:=true
-Require-Bundle: com.ibm.icu;bundle-version="[3.8.1,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.filebuffers;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.4.0,3.5.0)",
+Import-Package: com.ibm.icu.text;version="3.8",
+ com.ibm.icu.util;version="3.8",
+ javax.servlet.jsp.tagext;version="[2.0.0,2.2.0)"
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.jobs;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.filebuffers;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.5.0,3.9.0)",
  org.eclipse.wst.common.uriresolver;bundle-version="[1.1.301,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.300,1.2.0)",
- org.eclipse.wst.css.core;bundle-version="[1.1.200,1.2.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.200,1.2.0)",
- org.eclipse.wst.validation;bundle-version="[1.2.0,1.3.0)",
- javax.servlet.jsp;bundle-version="[2.0.0,3.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.3.0,2.0.0)";resolution:=optional,
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.200,2.0.0)";resolution:=optional
-Bundle-ActivationPolicy: lazy; exclude:="org.eclipse.jst.jsp.core.internal.contenttype"
+ org.eclipse.wst.sse.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.wst.css.core;bundle-version="[1.1.300,1.2.0)",
+ org.eclipse.wst.html.core;bundle-version="[1.1.400,1.2.0)",
+ org.eclipse.wst.validation;bundle-version="[1.2.100,1.3.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.4.0,2.0.0)";resolution:=optional,
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.300,2.0.0)";resolution:=optional,
+ org.eclipse.osgi.services;bundle-version="3.2.0"
+Bundle-ActivationPolicy: lazy; exclude:="org.eclipse.jst.jsp.core.internal.contenttype,org.eclipse.jst.jsp.css.core.internal.contenttype,org.eclipse.jst.jsp.core.internal.provisional.contenttype"
 Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.jst.jsp.core/build.properties b/bundles/org.eclipse.jst.jsp.core/build.properties
index 92ef44d..09a522d 100644
--- a/bundles/org.eclipse.jst.jsp.core/build.properties
+++ b/bundles/org.eclipse.jst.jsp.core/build.properties
@@ -16,7 +16,6 @@
                about.html
 bin.excludes = @dot/**,\
                temp.folder/**
-src.includes = component.xml,\
-               DevTimeSupport/,\
+src.includes = DevTimeSupport/,\
                schema/
 source.. = src/
diff --git a/bundles/org.eclipse.jst.jsp.core/component.xml b/bundles/org.eclipse.jst.jsp.core/component.xml
deleted file mode 100644
index ab88fac..0000000
--- a/bundles/org.eclipse.jst.jsp.core/component.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.jst.jsp">
-	<component-depends unrestricted="true" />
-	<plugin id="org.eclipse.jst.jsp.core" fragment="false" />
-	<package name="org.eclipse.jst.jsp.core.taglib" api="false">
-		<type name="IJarRecord" implement="false" />
-		<type name="ITagDirRecord" implement="false" />
-		<type name="ITaglibIndexDelta" implement="false" />
-		<type name="ITaglibIndexListener" implement="true" />
-		<type name="ITaglibDescriptor" implement="false" />
-		<type name="ITaglibRecord" implement="false" />
-		<!-- <type name="ITaglibRecordEvent" implement="false" /> -->
-		<type name="ITLDRecord" implement="false" />
-		<type name="IURLRecord" implement="false" />
-		<type name="TaglibIndex" subclass="false" instantiate="false" />
-		<type name="TaglibIndexDelta" subclass="false" instantiate="false" />
-	</package>
-	<plugin id="org.eclipse.jst.jsp.ui" fragment="false" />
-	<package name="org.eclipse.jst.jsp.ui" api="false">
-		<type name="StructuredTextViewerConfigurationJSP" subclass="true" instantiate="true" />
-	</package>
-	<package name="org.eclipse.jst.jsp.ui.views.contentoutline" api="false">
-		<type name="JSPContentOutlineConfiguration" subclass="true" instantiate="true" />
-	</package>
-	<plugin id="org.eclipse.jst.jsp.ui.infopop" fragment="false" />
-	<description url="http://eclipse.org/webtools/jst/components/jsp/overview.html" />
-</component>
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/plugin.properties b/bundles/org.eclipse.jst.jsp.core/plugin.properties
index f6fdf1e..f63b037 100644
--- a/bundles/org.eclipse.jst.jsp.core/plugin.properties
+++ b/bundles/org.eclipse.jst.jsp.core/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2004, 2008 IBM Corporation and others.
+# Copyright (c) 2004, 2010 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 ###############################################################################
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 pluginName=Structured Source JSP Model
 Structured_JSP_Document_Factory_Extension.name=Structured JSP Document Factory Extension
 JSP_Content_Type_Extension_Element.name=JSP
@@ -20,6 +20,7 @@
 JSP_Directive_Validator.name=JSP Directive Validator
 EL_Syntax_Validator.name=EL Syntax Validator
 JSP_Content_Validator.name=JSP Content Validator
+TLDValidator.name=Tag Library Descriptor Validator
 Structured_JSP_Document_Setup_participant.name=Structured JSP Document Setup Participant
 _validationMarker.name=JSP Problem
 _taskMarker.name=JSP Task
diff --git a/bundles/org.eclipse.jst.jsp.core/plugin.xml b/bundles/org.eclipse.jst.jsp.core/plugin.xml
index ad6153c..315fd6c 100644
--- a/bundles/org.eclipse.jst.jsp.core/plugin.xml
+++ b/bundles/org.eclipse.jst.jsp.core/plugin.xml
@@ -108,7 +108,7 @@
 		</processor>
 	</extension>
 
-	<extension point="org.eclipse.core.runtime.contentTypes">
+	<extension point="org.eclipse.core.contenttype.contentTypes">
 		<!-- create content type for JSP files -->
 		<content-type
 			file-extensions="jsp,jsv,jtpl,jspx"
@@ -146,7 +146,13 @@
 			name="%JSP_TLD_Content_Type_Extension_Element.name"
 			id="tldsource"
 			base-type="org.eclipse.core.runtime.xml"
-			default-charset="UTF-8"/>
+			default-charset="UTF-8">
+			<!-- add the describer so it's properly detected when opened from within .jar files -->
+			<describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
+				<parameter name="element" value="taglib"/>
+			</describer>
+		</content-type>
+		
 
   	<!--======================================================================================-->
 	<!-- minimal content-type css jsp support                                                 -->
@@ -186,7 +192,8 @@
             class="org.eclipse.jst.jsp.core.internal.validation.JSPBatchValidator"
             manual="true"
             version="1"
-            markerId="org.eclipse.jst.jsp.core.validationMarker">
+            markerId="org.eclipse.jst.jsp.core.validationMarker"
+            sourceid="org.eclipse.jst.jsp.jspelsourcevalidator, org.eclipse.jst.jsp.ui.internal.validation.jspactionvalidator, org.eclipse.jst.jsp.tldsourcevalidator, org.eclipse.jst.jsp.jspsourcevalidator">
          <include>
             <rules>
 	           <projectNature id="org.eclipse.jdt.core.javanature"/>
@@ -238,7 +245,8 @@
             class="org.eclipse.jst.jsp.core.internal.validation.JSPContentValidator"
             manual="true"
             version="1"
-            markerId="org.eclipse.jst.jsp.core.validationMarker">
+            markerId="org.eclipse.jst.jsp.core.validationMarker"
+            sourceid="org.eclipse.jst.jsp.ui.internal.validation.markupvalidator, org.eclipse.jst.jsp.ui.internal.validation.htmlsyntaxvalidator">
          <include>
             <rules>
 				<contentType id="org.eclipse.jst.jsp.core.jspsource"/>
@@ -277,6 +285,26 @@
          <group id="org.eclipse.wst.sse.core.structuredModelGroup"/>
       </validator>
    </extension>
+   
+   <extension id="TLDValidator" name="%TLDValidator.name" point="org.eclipse.wst.validation.validatorV2">
+      <validator
+            build="true"
+            class="org.eclipse.jst.jsp.core.internal.validation.TLDValidator"
+            manual="true"
+            version="1"
+            markerId="org.eclipse.jst.jsp.core.validationMarker">
+         <include>
+            <rules>
+				<contentType id="org.eclipse.jst.jsp.core.tldsource"/>
+               <fileext
+                     caseSensitive="false"
+                     ext="tld">
+               </fileext>
+           </rules>
+         </include>
+         <group id="org.eclipse.wst.sse.core.structuredModelGroup"/>
+      </validator>
+   </extension>
 		
     <extension
        point="org.eclipse.jst.jsp.core.elTranslator">
@@ -325,4 +353,30 @@
 			class="org.eclipse.wst.sse.core.internal.filebuffers.BasicStructuredDocumentFactory" />
 	</extension>	
 	-->
+	<extension point="org.eclipse.wst.xml.core.modelQueryExtensions">
+		<modelQueryExtension
+			class="org.eclipse.jst.jsp.core.internal.modelquery.JSPModelQueryExtension"
+			contentType="org.eclipse.jst.jsp.core.jspsource">
+		</modelQueryExtension>
+	</extension>
+	<extension point="org.eclipse.wst.xml.core.modelQueryExtensions">
+		<modelQueryExtension
+			class="org.eclipse.jst.jsp.core.internal.modelquery.TaglibModelQueryExtension"
+			contentType="org.eclipse.jst.jsp.core.jspsource">
+		</modelQueryExtension>
+	</extension>
+	<extension point="org.eclipse.wst.xml.core.modelQueryExtensions">
+		<modelQueryExtension
+			class="org.eclipse.jst.jsp.core.internal.modelquery.JSPModelQueryExtension"
+			contentType="org.eclipse.jst.jsp.core.tagsource">
+		</modelQueryExtension>
+	</extension>
+	<extension point="org.eclipse.wst.xml.core.modelQueryExtensions">
+		<modelQueryExtension
+			class="org.eclipse.jst.jsp.core.internal.modelquery.TaglibModelQueryExtension"
+			contentType="org.eclipse.jst.jsp.core.tagsource">
+		</modelQueryExtension>
+	</extension>	
+	
+
 </plugin>
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java
index e6a72fc..697124d 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCoreMessages.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -29,7 +29,12 @@
 	public static String JSPDirectiveValidator_6;
 	public static String JSPDirectiveValidator_7;
 	public static String JSPDirectiveValidator_8;
+	public static String JSPDirectiveValidator_9;
+	public static String JSPDirectiveValidator_10;
+	public static String JSPDirectiveValidator_11;
 	public static String JSPActionValidator_0;
+
+	public static String JSPActionValidator_1;
 	public static String JSPIndexManager_0;
 	public static String JSPIndexManager_2;
 	public static String JSP_Search;
@@ -47,6 +52,14 @@
 	public static String JSPTranslator_1;
 	public static String JSPTranslator_2;
 	public static String JSPTranslator_3;
+	public static String JSPTranslator_4;
+	public static String JSPTranslator_5;
+	public static String JSPELTranslator_0;
+	public static String TLDValidator_MissingValidator;
+	public static String TLDValidator_MissingVariable;
+	public static String TLDValidator_MissingListener;
+	public static String Initializing;
+	public static String Persisting_JSP_Translations;
 	
 	/**
 	 * @deprecated
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePlugin.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePlugin.java
index cda29d7..3b50941 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePlugin.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePlugin.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,7 +10,20 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal;
 
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ISaveContext;
+import org.eclipse.core.resources.ISaveParticipant;
+import org.eclipse.core.resources.ISavedState;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
 import org.eclipse.jst.jsp.core.internal.contentproperties.JSPFContentPropertiesManager;
@@ -24,22 +37,26 @@
  * The main plugin class to be used in the desktop.
  */
 public class JSPCorePlugin extends Plugin {
-	// The shared instance.
+	/** singleton instance of the plugin */
 	private static JSPCorePlugin plugin;
 
 	/**
+	 * <p>Job used to finish tasks needed to start up the plugin but that did not have
+	 * to block the plugin start up process.</p>
+	 */
+	private Job fPluginInitializerJob;
+	
+	/**
 	 * The constructor.
 	 */
 	public JSPCorePlugin() {
 		super();
 		plugin = this;
+		this.fPluginInitializerJob = new PluginInitializerJob();
 	}
 
 	/**
 	 * Returns the shared instance.
-	 * 
-	 * @deprecated - will be removed. Currently used to get "model
-	 *             preferences", but there are other, better ways.
 	 */
 	public static JSPCorePlugin getDefault() {
 		return plugin;
@@ -62,9 +79,9 @@
 
 		// listen for classpath changes
 		JavaCore.addElementChangedListener(TaglibHelperManager.getInstance());
-
-
-		JSPIndexManager.getInstance().initialize();
+		
+		//schedule delayed initialization
+		this.fPluginInitializerJob.schedule(2000);
 
 		// listen for resource changes to update content properties keys
 		JSPFContentPropertiesManager.startup();
@@ -80,14 +97,14 @@
 	public void stop(BundleContext context) throws Exception {
 		DeploymentDescriptorPropertyCache.stop();
 
-		/*
-		 * stop listening for resource changes to update content properties
-		 * keys
-		 */
+		// stop listening for resource changes to update content properties keys
 		JSPFContentPropertiesManager.shutdown();
 
+		//remove the plugin save participant
+		ResourcesPlugin.getWorkspace().removeSaveParticipant(plugin.getBundle().getSymbolicName());
+		
 		// stop any indexing
-		JSPIndexManager.getInstance().shutdown();
+		JSPIndexManager.getDefault().stop();
 
 		// stop listening for classpath changes
 		JavaCore.removeElementChangedListener(TaglibHelperManager.getInstance());
@@ -98,4 +115,116 @@
 
 		super.stop(context);
 	}
+	
+	/**
+	 * <p>A {@link Job} used to perform delayed initialization for the plugin</p>
+	 */
+	private static class PluginInitializerJob extends Job {
+		/**
+		 * <p>Default constructor to set up this {@link Job} as a
+		 * long running system {@link Job}</p>
+		 */
+		protected PluginInitializerJob() {
+			super(JSPCoreMessages.Initializing);
+			
+			this.setUser(false);
+			this.setSystem(true);
+			this.setPriority(Job.LONG);
+		}
+		
+		/**
+		 * <p>Perform delayed initialization for the plugin</p>
+		 * 
+		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+		 */
+		protected IStatus run(IProgressMonitor monitor) {
+			IStatus status = Status.OK_STATUS;
+			final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			try {
+				/*
+				 * Restore save state and process any events that happened before
+				 * plug-in loaded. Don't do it immediately since adding the save
+				 * participant requires a lock on the workspace to compute the
+				 * accumulated deltas, and if the tree is not already locked it
+				 * becomes a blocking call.
+				 */
+				workspace.run(new IWorkspaceRunnable() {
+					public void run(final IProgressMonitor worspaceMonitor) throws CoreException {
+						ISavedState savedState = null;
+						
+						try {
+							//add the save participant for this bundle
+							savedState = ResourcesPlugin.getWorkspace().addSaveParticipant(
+									JSPCorePlugin.plugin.getBundle().getSymbolicName(), new SaveParticipant());
+						} catch (CoreException e) {
+							Logger.logException("JSP Core Plugin failed at loading previously saved state." + //$NON-NLS-1$
+									" All componenets dependent on this state will start as if first workspace load.", e); //$NON-NLS-1$
+						}
+						
+						//if there is a saved state start up using that, else start up cold
+						if(savedState != null) {
+							try {
+								Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
+							} finally {
+								savedState.processResourceChangeEvents(new IResourceChangeListener() {
+									/**
+									 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+									 */
+									public void resourceChanged(IResourceChangeEvent event) {
+										JSPIndexManager.getDefault().start(event.getDelta(), worspaceMonitor);
+									}
+								});
+							}
+						} else {
+							JSPIndexManager.getDefault().start(null, worspaceMonitor);
+						}
+					}
+				}, monitor);
+			} catch(CoreException e) {
+				status = e.getStatus();
+			}
+			return status;
+		}
+		
+	}
+	
+	/**
+	 * Used so that all of the IResourceChangeEvents that occurred before
+	 * this plugin loaded can be processed.
+	 */
+	private static class SaveParticipant implements ISaveParticipant {
+		/**
+		 * <p>Default constructor</p>
+		 */
+		protected SaveParticipant() {
+		}
+		
+		/**
+		 * @see org.eclipse.core.resources.ISaveParticipant#doneSaving(org.eclipse.core.resources.ISaveContext)
+		 */
+		public void doneSaving(ISaveContext context) {
+			//ignore
+		}
+	
+		/**
+		 * @see org.eclipse.core.resources.ISaveParticipant#prepareToSave(org.eclipse.core.resources.ISaveContext)
+		 */
+		public void prepareToSave(ISaveContext context) throws CoreException {
+			//ignore
+		}
+	
+		/**
+		 * @see org.eclipse.core.resources.ISaveParticipant#rollback(org.eclipse.core.resources.ISaveContext)
+		 */
+		public void rollback(ISaveContext context) {
+			//ignore
+		}
+	
+		/**
+		 * @see org.eclipse.core.resources.ISaveParticipant#saving(org.eclipse.core.resources.ISaveContext)
+		 */
+		public void saving(ISaveContext context) throws CoreException {
+			context.needDelta();
+		}
+	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties
index 2ff51e7..e7e91b5 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/JSPCorePluginResources.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2004, 2008 IBM Corporation and others.
+# Copyright (c) 2004, 2009 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -18,21 +18,33 @@
 JSPFContentPropertiesManager_Updating=Updating JSP Fragment Content Settings
 JSPFContentPropertiesManager_Problems_Updating=Problem saving JSP Fragment Content Settings for {0}
 JSPDirectiveValidator_0={0} is a reserved prefix.  Try another
-JSPDirectiveValidator_1=Cannot find the tag library descriptor for "{0}"
+JSPDirectiveValidator_1=Can not find the tag library descriptor for "{0}"
 JSPDirectiveValidator_2=The prefix "{0} "is used more than once
 JSPDirectiveValidator_3=A {0} value is required in this directive
-JSPDirectiveValidator_4=Fragment "{0}" was not be found at expected path {1}
+JSPDirectiveValidator_4=Fragment "{0}" was not found at expected path {1}
 JSPDirectiveValidator_5=Missing required attribute "{0}"
 JSPDirectiveValidator_6=Undefined attribute name "{0}"
 JSPDirectiveValidator_7=A {0} or {1} value is required in this directive
-JSPDirectiveValidator_8=The superclass "{0}" was not found on the build path
+JSPDirectiveValidator_8=The superclass "{0}" was not found on the Java Build Path
+JSPDirectiveValidator_9=Can not find the tag library descriptor for "{0}".  Try increasing the version of the Dynamic Web Module project facet.
+JSPDirectiveValidator_10=Can not find the tag library descriptor for "{0}".  Try using a newer grammar or declared version in the Web Deployment Descriptor.
+JSPDirectiveValidator_11=Can not find the tag directory "{0}"
 JSPActionValidator_0=Tag ({0}) must be empty
+JSPActionValidator_1="{0}" does not support runtime expressions
 JSPBatchValidator_0=Gathering files in {0}
-TaglibHelper_0=The TagExtraInfo class for {0} ({1}) was not found on the build path
-TaglibHelper_1=The TagExtraInfo class for {0} ({1}) could not be instantiated
-TaglibHelper_2=A problem was encountered using TagExtraInfo class {1} for {0} 
-TaglibHelper_3=The tag handler class for {0} ({1}) was not found on the build path
+TaglibHelper_0=The TagExtraInfo class for "{0}" ({1}) was not found on the Java Build Path
+TaglibHelper_1=The TagExtraInfo class for "{0}" ({1}) could not be instantiated
+TaglibHelper_2=A problem was encountered using TagExtraInfo class {1} for '{0}' 
+TaglibHelper_3=The tag handler class for "{0}" ({1}) was not found on the Java Build Path
 JSPTranslator_0=Invalid identifier: "{0}"
 JSPTranslator_1=Undefined type: {0}
-JSPTranslator_2=Cannot declare both "class" and "beanName" attributes
+JSPTranslator_2=Can not declare both "class" and "beanName" attributes
 JSPTranslator_3=Unknown type for identifier "{0}"
+JSPTranslator_4=Missing start tag for "{0}"
+JSPTranslator_5=Missing end tag for "{0}"
+JSPELTranslator_0=The function {0} is undefined
+TLDValidator_MissingValidator=The TagLibraryValidator subclass '{0}' was not found on the Java Build Path
+TLDValidator_MissingVariable=The variable class '{0}' was not found on the Java Build Path
+TLDValidator_MissingListener=The listener class '{0}' was not found on the Java Build Path
+Initializing=Processing JSP changes since last activation
+Persisting_JSP_Translations=Persisting JSP Translations
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/JSPCMDocumentFactory.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/JSPCMDocumentFactory.java
index 59b2b3e..3ae1d2e 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/JSPCMDocumentFactory.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/JSPCMDocumentFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -25,7 +25,7 @@
 	}
 
 	public static CMDocument getCMDocument() {
-		return getCMDocument(CMDocType.JSP20_DOC_TYPE);
+		return getCMDocument(CMDocType.JSP21_DOC_TYPE);
 	}
 
 	/**
@@ -40,11 +40,13 @@
 	}
 
 	public static CMDocument getCMDocument(float jspVersion) {
-		if (jspVersion >= 2)
+		if (jspVersion >= 2.1f)
+			return getCMDocument(CMDocType.JSP21_DOC_TYPE);
+		else if (jspVersion >= 2)
 			return getCMDocument(CMDocType.JSP20_DOC_TYPE);
-		if (jspVersion >= 1.2)
+		else if (jspVersion >= 1.2f)
 			return getCMDocument(CMDocType.JSP12_DOC_TYPE);
-		if (jspVersion >= 1)
+		else if (jspVersion >= 1)
 			return getCMDocument(CMDocType.JSP11_DOC_TYPE);
 		return getCMDocument();
 	}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/TaglibController.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/TaglibController.java
index e4454cc..bea60aa 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/TaglibController.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/TaglibController.java
@@ -28,13 +28,13 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
 import org.eclipse.jst.jsp.core.taglib.ITaglibIndexDelta;
 import org.eclipse.jst.jsp.core.taglib.ITaglibIndexListener;
 import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument;
 import org.eclipse.wst.sse.core.internal.util.Assert;
+import org.eclipse.wst.xml.core.internal.parser.XMLSourceParser;
 
 /**
  * Provides a direct mapping from IStructuredDocument to supporting
@@ -135,7 +135,7 @@
 					info.location = buffer.getLocation();
 					info.locationKind = LocationKind.NORMALIZE;
 					info.tldDocumentManager = new TLDCMDocumentManager();
-					info.tldDocumentManager.setSourceParser((JSPSourceParser) info.document.getParser());
+					info.tldDocumentManager.setSourceParser((XMLSourceParser) info.document.getParser());
 					synchronized (_instance.fDocumentMap) {
 						_instance.fDocumentMap.put(document, info);
 					}
@@ -364,7 +364,7 @@
 		synchronized (_instance.fDocumentMap) {
 			_instance.fDocumentMap.put(document, info);
 		}
-		info.tldDocumentManager.setSourceParser((JSPSourceParser) info.document.getParser());
+		info.tldDocumentManager.setSourceParser((XMLSourceParser) info.document.getParser());
 		if (document instanceof BasicStructuredDocument && document.getLength() > 0) {
 			((BasicStructuredDocument) document).reparse(this);
 		}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMAttributeDeclarationImpl.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMAttributeDeclarationImpl.java
index 41d7ed9..f26a744 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMAttributeDeclarationImpl.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMAttributeDeclarationImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,7 +24,9 @@
 
 public class CMAttributeDeclarationImpl implements TLDAttributeDeclaration {
 
-	private CMDataType attrType = new CMDataTypeImpl(CMDataType.CDATA);
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=170556
+	private static final CMDataType attrType = new CMDataTypeImpl(CMDataType.CDATA);
+	
 	private String fDescription;
 
 	//
@@ -53,6 +55,11 @@
 		fOwnerDocument = owner;
 	}
 
+	public CMAttributeDeclarationImpl(CMDocument owner, String defaultRtexprvalue) {
+		this(owner);
+		rtexprvalue = defaultRtexprvalue;
+	}
+
 	/**
 	 * getAttrName method
 	 * 
@@ -135,7 +142,7 @@
 	 * 
 	 * @return java.lang.Object
 	 * 
-	 * Returns the object property desciped by the propertyName
+	 * Returns the object property described by the propertyName
 	 * 
 	 */
 	public Object getProperty(String propertyName) {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMDocumentFactoryTLD.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMDocumentFactoryTLD.java
index 2b5acef..18d777e 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMDocumentFactoryTLD.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMDocumentFactoryTLD.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,7 +16,6 @@
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLConnection;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
@@ -82,7 +81,6 @@
  * TLDAttributeDeclaration interfaces for extended properties.
  */
 public class CMDocumentFactoryTLD implements CMDocumentFactory {
-
 	static final boolean _debug = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/tldcmdocument/factory")); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
@@ -315,6 +313,29 @@
 					ed.setSmallIconURL(URIHelper.normalize(ed.getSmallIcon(), "file:" + tagFile.getLocation().toString(), tagFile.getLocation().removeLastSegments(1).toString()));
 				}
 			}
+			else if (isJarFile(document.getBaseLocation())) {
+				String jarLocation = document.getBaseLocation();
+				String[] entries = JarUtilities.getEntryNames(jarLocation);
+				boolean tag;
+				for (int jEntry = 0; jEntry < entries.length; jEntry++) {
+					tag = false;
+					if (((tag = entries[jEntry].endsWith(".tag")) || entries[jEntry].endsWith(".tagx")) && entries[jEntry].startsWith("META-INF/tags/")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+							InputStream contents = JarUtilities.getInputStream(jarLocation, entries[jEntry]);
+							if (tag) {//$NON-NLS-1$ 
+								loadTagFile(ed, tagFile, true, contents);
+							}
+							else {
+								loadTagXFile(ed, tagFile, true, contents);
+							}
+							try {
+								contents.close();
+							}
+							catch (IOException e) {
+								Logger.log(Logger.ERROR_DEBUG, null, e);
+							}
+						}
+					}	
+			}
 		}
 
 		// load information declared within the .tld
@@ -350,6 +371,13 @@
 		return ed;
 	}
 
+	private boolean isJarFile(String path) {
+		if (path == null)
+			return false;
+		final int idx = path.lastIndexOf('.');
+		return idx >= 0 && idx < (path.length() - 1) && path.substring(idx + 1).equalsIgnoreCase("jar"); //$NON-NLS-1$
+	}
+
 	protected CMElementDeclaration createElementDeclaration(CMDocument document, Node tagNode) {
 		CMElementDeclarationImpl ed = new CMElementDeclarationImpl(document);
 
@@ -402,6 +430,9 @@
 				else if (nodeName.equals(JSP20TLDNames.TAG_EXTENSION) && child.getNodeType() == Node.ELEMENT_NODE) {
 					ed.getExtensions().add(child);
 				}
+				else if (nodeName.equals(JSP20TLDNames.DYNAMIC_ATTRIBUTES) && child.hasChildNodes()) {
+					ed.setDynamicAttributes(getContainedText(child));
+				}
 			}
 			child = child.getNextSibling();
 		}
@@ -562,7 +593,7 @@
 	protected String getContainedText(Node parent) {
 		NodeList children = parent.getChildNodes();
 		if (children.getLength() == 1) {
-			return children.item(0).getNodeValue().trim();
+			return getValue(children.item(0));
 		}
 		StringBuffer s = new StringBuffer();
 		Node child = parent.getFirstChild();
@@ -577,13 +608,22 @@
 				}
 			}
 			else {
-				s.append(child.getNodeValue().trim());
+				s.append(getValue(child));
 			}
 			child = child.getNextSibling();
 		}
 		return s.toString().trim();
 	}
 
+	private String getValue(Node n) {
+		if (n == null)
+			return ""; //$NON-NLS-1$
+		String value = n.getNodeValue();
+		if (value == null)
+			return ""; //$NON-NLS-1$
+		return value.trim();
+	}
+
 	public boolean isBuilderForGrammar(String grammarFileName) {
 		String fileName = grammarFileName.toLowerCase();
 		return fileName.endsWith(".tld") || fileName.endsWith(".jar"); //$NON-NLS-2$//$NON-NLS-1$
@@ -661,7 +701,7 @@
 			}
 			// New JSP 1.2
 			// description
-			else if (nodeName.equals(JSP12TLDNames.DESCRIPTION)) {
+			else if (nodeName.equals(JSP12TLDNames.DESCRIPTION) && child.hasChildNodes()) {
 				document.setDescription(getContainedText(child));
 			}
 			// display name
@@ -700,12 +740,16 @@
 	}
 
 	private void loadTagXFile(final CMElementDeclarationImpl ed, IFile tagxFile, boolean allowIncludes) {
+	  loadTagXFile(ed, tagxFile, allowIncludes, null);
+	}
+	
+	private void loadTagXFile(final CMElementDeclarationImpl ed, IFile tagxFile, boolean allowIncludes, InputStream inputStream) {
 		ed.setPath(tagxFile.getFullPath().toString());
 		ed.setTagSource(TLDElementDeclaration.SOURCE_TAG_FILE);
 		try {
 			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
 			InputSource inputSource = new InputSource(tagxFile.getFullPath().toString());
-			InputStream input = tagxFile.getContents(false);
+			InputStream input = inputStream != null ? inputStream : tagxFile.getContents(false);
 			inputSource.setByteStream(input);
 			parser.parse(inputSource, new DefaultHandler() {
 				public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
@@ -809,11 +853,24 @@
 	}
 
 	private void loadTagFile(CMElementDeclarationImpl ed, IFile tagFile, boolean allowIncludes) {
+		loadTagFile(ed, tagFile, allowIncludes, null);
+	}
+	
+	private void loadTagFile(CMElementDeclarationImpl ed, IFile tagFile, boolean allowIncludes, InputStream inputStream) {
 		try {
-			IStructuredDocument document = (IStructuredDocument) new ModelHandlerForJSP().getDocumentLoader().createNewStructuredDocument(tagFile);
-			IStructuredDocumentRegion documentRegion = document.getFirstStructuredDocumentRegion();
 			ed.setPath(tagFile.getFullPath().toString());
 			ed.setTagSource(TLDElementDeclaration.SOURCE_TAG_FILE);
+			ed.setLocationString(tagFile.getFullPath().toString());
+			IStructuredDocument document = null;
+			if(inputStream != null) {
+				document = (IStructuredDocument)new ModelHandlerForJSP().getDocumentLoader().createNewStructuredDocument(tagFile.getName(), inputStream);
+			}
+			else if(tagFile.isAccessible()) {
+				document = (IStructuredDocument) new ModelHandlerForJSP().getDocumentLoader().createNewStructuredDocument(tagFile);
+			}
+			if (document == null)
+				return;
+			IStructuredDocumentRegion documentRegion = document.getFirstStructuredDocumentRegion();
 			while (documentRegion != null) {
 				if (documentRegion.getType().equals(DOMJSPRegionContexts.JSP_DIRECTIVE_NAME)) {
 					if (documentRegion.getNumberOfRegions() > 2) {
@@ -973,12 +1030,11 @@
 
 		}
 		catch (IOException e) {
-			Logger.logException("problem parsing " + tagFile, e);
+			// Logger.logException("problem parsing " + tagFile, e); // can be caused by a still-in-development file
 		}
 		catch (CoreException e) {
-			Logger.logException("problem parsing " + tagFile, e);
+			// Logger.logException("problem parsing " + tagFile, e); // frequently out of sync
 		}
-		ed.setLocationString(tagFile.getFullPath().toString());
 	}
 
 	/**
@@ -1021,7 +1077,7 @@
 					String iconPath = URIHelper.normalize(((TLDDocument) document).getLargeIcon(), record.getLocation().toString() + "!/META-INF/", "/"); //$NON-NLS-1$ //$NON-NLS-2$
 					document.setProperty(JSP12TLDNames.LARGE_ICON, "jar:file:" + iconPath); //$NON-NLS-1$
 				}
-				if (document != null && document.getElements().getLength() == 0) {
+				if (_debug && document != null && document.getElements().getLength() == 0) {
 					System.out.println("failure parsing " + record.getLocation()); //$NON-NLS-1$
 				}
 			}
@@ -1033,35 +1089,26 @@
 				break;
 			case (ITaglibRecord.URL) : {
 				IURLRecord record = (IURLRecord) reference;
-				InputStream urlContents = null;
-				URLConnection connection = null;
-				try {
-					connection = record.getURL().openConnection();
-					if (connection != null) {
-						connection.setUseCaches(false);
-						urlContents = connection.getInputStream();
-						document = (CMDocumentImpl) buildCMDocument(record.getBaseLocation(), urlContents);
-						document.setLocationString(record.getURL().toString());
-						if (document.getSmallIcon() != null) {
-							String iconPath = URIHelper.normalize(((TLDDocument) document).getSmallIcon(), record.getURL().toString(), "/"); //$NON-NLS-1$
-							document.setProperty(JSP12TLDNames.SMALL_ICON, iconPath);
-						}
-						if (document.getLargeIcon() != null) {
-							String iconPath = URIHelper.normalize(((TLDDocument) document).getLargeIcon(), record.getURL().toString(), "/"); //$NON-NLS-1$
-							document.setProperty(JSP12TLDNames.LARGE_ICON, iconPath);
-						}
+				URL url = record.getURL();
+				InputStream urlContents = JarUtilities.getInputStream(url);
+				if (urlContents != null) {
+					document = (CMDocumentImpl) buildCMDocument(record.getBaseLocation(), urlContents);
+					String urlString = url.toString();
+					document.setLocationString(urlString);
+					if (document.getSmallIcon() != null) {
+						String iconPath = URIHelper.normalize(((TLDDocument) document).getSmallIcon(), urlString, "/"); //$NON-NLS-1$
+						document.setProperty(JSP12TLDNames.SMALL_ICON, iconPath);
+					}
+					if (document.getLargeIcon() != null) {
+						String iconPath = URIHelper.normalize(((TLDDocument) document).getLargeIcon(), urlString, "/"); //$NON-NLS-1$
+						document.setProperty(JSP12TLDNames.LARGE_ICON, iconPath);
 					}
 				}
-				catch (IOException e) {
-					// not uncommon given invalid URLs
-				}
-				finally {
-					if (urlContents != null) {
-						try {
-							urlContents.close();
-						}
-						catch (IOException e) {
-						}
+				if (urlContents != null) {
+					try {
+						urlContents.close();
+					}
+					catch (IOException e) {
 					}
 				}
 			}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMElementDeclarationImpl.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMElementDeclarationImpl.java
index 52d0136..7984fba 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMElementDeclarationImpl.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/CMElementDeclarationImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -322,6 +322,9 @@
 			}
 			return getOwnerDocument().getProperty(propertyName);
 		}
+		else if(TLDElementDeclaration.IS_LIBRARY_TAG.equals(propertyName)) {
+			return Boolean.TRUE;
+		}
 		return null;
 	}
 
@@ -512,7 +515,7 @@
 	 * 
 	 */
 	public boolean supports(String propertyName) {
-		return propertyName == null || propertyName.equals("tagInfo") || propertyName.equals(JSP12TLDNames.DESCRIPTION) || propertyName.equals(TLDDocument.CM_KIND) || propertyName.equals(JSP12TLDNames.SMALL_ICON) || propertyName.equals(JSP12TLDNames.LARGE_ICON) || propertyName.equals(TLDElementDeclaration.TAG_SOURCE);//$NON-NLS-1$ //$NON-NLS-2$
+		return propertyName == null || propertyName.equals("tagInfo") || propertyName.equals(JSP12TLDNames.DESCRIPTION) || propertyName.equals(TLDDocument.CM_KIND) || propertyName.equals(JSP12TLDNames.SMALL_ICON) || propertyName.equals(JSP12TLDNames.LARGE_ICON) || propertyName.equals(TLDElementDeclaration.TAG_SOURCE) || propertyName.equals(TLDElementDeclaration.IS_LIBRARY_TAG);//$NON-NLS-1$ //$NON-NLS-2$
 	}
 
 	public String toString() {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java
index b392a68..363ce95 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -37,7 +37,6 @@
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
 import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache;
 import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache.PropertyGroup;
-import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
 import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.jst.jsp.core.internal.util.FacetModuleCoreSupport;
@@ -53,6 +52,7 @@
 import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
 import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
+import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
 import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandler;
 import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandlerExtension;
 import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
@@ -66,6 +66,7 @@
 import org.eclipse.wst.sse.core.utils.StringUtils;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.parser.XMLSourceParser;
 import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
 
 public class TLDCMDocumentManager implements ITaglibIndexListener {
@@ -75,7 +76,7 @@
 		 * Adds a block tagname (fully namespace qualified) into the list of
 		 * block tag names for the parser. The marker
 		 * IStructuredDocumentRegion along with position cues during reparses
-		 * allow the JSPSourceParser to enable/ignore the tags as blocks.
+		 * allow the XMLSourceParser to enable/ignore the tags as blocks.
 		 */
 		protected void addBlockTag(String tagnameNS, ITextRegionCollection marker) {
 			if (getParser() == null)
@@ -148,7 +149,7 @@
 			}
 		}
 		
-		protected void processRegionCollection(ITextRegionCollection regionCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, JSPSourceParser textSource) {
+		protected void processRegionCollection(ITextRegionCollection regionCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, XMLSourceParser textSource) {
 			/*
 			 * Would test > 1, but since we only care if there are 8 (<%@,
 			 * taglib, uri, =, where, prefix, =, what) [or 4 for include
@@ -196,7 +197,7 @@
 		 * anchorStructuredDocumentRegion. Includes use the including file as
 		 * the point of reference, not necessarily the "top" file.
 		 */
-		protected void processInclude(ITextRegionCollection includeDirectiveCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, JSPSourceParser textSource) {
+		protected void processInclude(ITextRegionCollection includeDirectiveCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, XMLSourceParser textSource) {
 			ITextRegionList regions = includeDirectiveCollection.getRegions();
 			String includedFile = null;
 			boolean isFilename = false;
@@ -266,9 +267,11 @@
 						includeHelper.parse(filePath);
 						List references = includeHelper.taglibReferences;
 						fTLDCMReferencesMap.put(filePath, references);
-						for (int i = 0; references != null && i < references.size(); i++) {
-							TLDCMDocumentReference reference = (TLDCMDocumentReference) references.get(i);
-							getParser().addNestablePrefix(new TagMarker(reference.prefix + ":")); //$NON-NLS-1$
+						if (getParser() instanceof JSPCapableParser) {
+							for (int i = 0; references != null && i < references.size(); i++) {
+								TLDCMDocumentReference reference = (TLDCMDocumentReference) references.get(i);
+								((JSPCapableParser) getParser()).addNestablePrefix(new TagMarker(reference.prefix + ":")); //$NON-NLS-1$
+							}
 						}
 						/*
 						 * TODO: walk up the include hierarchy and add
@@ -287,7 +290,9 @@
 							 * relative to the JSP fragment.
 							 */
 							enableTaglibFromURI(reference.prefix, reference.uri, anchorStructuredDocumentRegion);
-							getParser().addNestablePrefix(new TagMarker(reference.prefix + ":")); //$NON-NLS-1$
+							if (getParser() instanceof JSPCapableParser) {
+								((JSPCapableParser) getParser()).addNestablePrefix(new TagMarker(reference.prefix + ":")); //$NON-NLS-1$
+							}
 						}
 					}
 				}
@@ -298,7 +303,7 @@
 			}
 		}
 
-		protected void processXMLStartTag(ITextRegionCollection startTagRegionCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, JSPSourceParser textSource) {
+		protected void processXMLStartTag(ITextRegionCollection startTagRegionCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, XMLSourceParser textSource) {
 			ITextRegionList regions = startTagRegionCollection.getRegions();
 			String uri = null;
 			String prefix = null;
@@ -351,7 +356,7 @@
 		 * Pulls the URI and prefix from the given taglib directive
 		 * IStructuredDocumentRegion and makes sure the tags are known.
 		 */
-		protected void processTaglib(ITextRegionCollection taglibDirectiveCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, JSPSourceParser textSource) {
+		protected void processTaglib(ITextRegionCollection taglibDirectiveCollection, IStructuredDocumentRegion anchorStructuredDocumentRegion, XMLSourceParser textSource) {
 			ITextRegionList regions = taglibDirectiveCollection.getRegions();
 			String uri = null;
 			String prefix = null;
@@ -463,20 +468,20 @@
 		public void setStructuredDocument(IStructuredDocument newDocument) {
 			Assert.isTrue(newDocument != null, "null document"); //$NON-NLS-1$
 			Assert.isTrue(newDocument.getParser() != null, "null document parser"); //$NON-NLS-1$
-			Assert.isTrue(newDocument.getParser() instanceof JSPSourceParser, "can only listen to document with a JSPSourceParser"); //$NON-NLS-1$
+			Assert.isTrue(newDocument.getParser() instanceof XMLSourceParser, "can only listen to document with a XMLSourceParser"); //$NON-NLS-1$
 			getSourceParser().removeStructuredDocumentRegionHandler(this);
-			setSourceParser((JSPSourceParser) newDocument.getParser());
+			setSourceParser((XMLSourceParser) newDocument.getParser());
 			getSourceParser().addStructuredDocumentRegionHandler(this);
 		}
 	}
 
 	protected class IncludeHelper extends DirectiveStructuredDocumentRegionHandler {
 		protected IStructuredDocumentRegion fAnchor = null;
-		protected JSPSourceParser fLocalParser = null;
-		protected JSPSourceParser fParentParser = null;
+		protected XMLSourceParser fLocalParser = null;
+		protected XMLSourceParser fParentParser = null;
 		List taglibReferences = null;
 
-		public IncludeHelper(IStructuredDocumentRegion anchor, JSPSourceParser rootParser) {
+		public IncludeHelper(IStructuredDocumentRegion anchor, XMLSourceParser rootParser) {
 			super();
 			fAnchor = anchor;
 			fParentParser = rootParser;
@@ -504,7 +509,7 @@
 		 *            the fullpath for the resource to be parsed
 		 */
 		void parse(IPath path) {
-			JSPSourceParser p = new JSPSourceParser();
+			XMLSourceParser p = (XMLSourceParser) getParser().newInstance();
 			fLocalParser = p;
 			String s = getContents(path);
 			// Should we consider preludes on this segment?
@@ -515,9 +520,11 @@
 				BlockMarker marker = (BlockMarker) blockTags.get(i);
 				fLocalParser.addBlockMarker(new BlockMarker(marker.getTagName(), null, marker.getContext(), marker.isCaseSensitive()));
 			}
-			TagMarker[] knownPrefixes = (TagMarker[]) fParentParser.getNestablePrefixes().toArray(new TagMarker[0]);
-			for (int i = 0; i < knownPrefixes.length; i++) {
-				fLocalParser.addNestablePrefix(new TagMarker(knownPrefixes[i].getTagName(), null));
+			if (fParentParser instanceof JSPCapableParser && fLocalParser instanceof JSPCapableParser) {
+				TagMarker[] knownPrefixes = (TagMarker[]) ((JSPCapableParser) fParentParser).getNestablePrefixes().toArray(new TagMarker[0]);
+				for (int i = 0; i < knownPrefixes.length; i++) {
+					((JSPCapableParser) fLocalParser).addNestablePrefix(new TagMarker(knownPrefixes[i].getTagName(), null));
+				}
 			}
 			// force parse
 			fLocalParser.getDocumentRegions();
@@ -537,15 +544,6 @@
 		int referenceCount;
 	}
 
-	private static class TLDCMDocumentDescriptor {
-		Object cacheKey;
-		CMDocument document;
-
-		TLDCMDocumentDescriptor() {
-			super();
-		}
-	}
-
 	private class TLDCMDocumentReference {
 		String prefix;
 		String uri;
@@ -639,7 +637,7 @@
 
 	private Stack fIncludes = null;
 
-	private JSPSourceParser fParser = null;
+	private XMLSourceParser fParser = null;
 
 	private List fTaglibTrackers = null;
 
@@ -681,7 +679,11 @@
 	 * @return
 	 */
 	protected Object getCacheKey(String uri) {
-		ITaglibRecord record = TaglibIndex.resolve(getCurrentParserPath().toString(), uri, false);
+		IPath currentParserPath = getCurrentParserPath();
+		if (currentParserPath == null)
+			return null;
+		
+		ITaglibRecord record = TaglibIndex.resolve(currentParserPath.toString(), uri, false);
 		if (record != null) {
 			return getUniqueIdentifier(record);
 		}
@@ -697,9 +699,12 @@
 			return null;
 		String reference = uri;
 		Object cacheKey = getCacheKey(reference);
-		long lastModified = getModificationStamp(reference);
+		if (cacheKey == null)
+			return null;
+		
 		CMDocument doc = (CMDocument) getDocuments().get(cacheKey);
 		if (doc == null) {
+			long lastModified = getModificationStamp(reference);
 			/*
 			 * If hasn't been moved into the local table, do so and increment
 			 * the count. A local URI reference can be different depending on
@@ -740,12 +745,12 @@
 				if (_debugCache) {
 					System.out.println("TLDCMDocument cache miss on " + cacheKey);
 				}
-				TLDCMDocumentDescriptor descriptor = loadTaglib(reference);
-				if (descriptor != null) {
+				CMDocument document = loadTaglib(reference);
+				if (document != null) {
 					TLDCacheEntry entry = new TLDCacheEntry();
-					doc = entry.document = descriptor.document;
+					doc = entry.document = document;
 					entry.referenceCount = 1;
-					entry.modificationStamp = getModificationStamp(reference);
+					entry.modificationStamp = lastModified;
 					getSharedDocumentCache().put(cacheKey, entry);
 				}
 			}
@@ -757,7 +762,12 @@
 	}
 
 	private long getModificationStamp(String reference) {
-		ITaglibRecord record = TaglibIndex.resolve(getCurrentParserPath().toString(), reference, false);
+		IPath currentParserPath = getCurrentParserPath();
+		if (currentParserPath == null) {
+			return IResource.NULL_STAMP;
+		}
+		
+		ITaglibRecord record = TaglibIndex.resolve(currentParserPath.toString(), reference, false);
 		long modificationStamp = IResource.NULL_STAMP;
 		if (record != null) {
 			switch (record.getRecordType()) {
@@ -797,7 +807,18 @@
 				}
 					break;
 				case (ITaglibRecord.URL) : {
-					modificationStamp = IResource.NULL_STAMP;
+                    String loc = ((IURLRecord) record).getBaseLocation();
+                    if (loc != null && loc.endsWith(".jar")) { //$NON-NLS-1$
+                        File jarfile = new File(loc);
+                        if (jarfile.exists()) {
+                            try {
+                                modificationStamp = jarfile.lastModified();
+                            }
+                            catch (SecurityException e) {
+                                modificationStamp = IResource.NULL_STAMP;
+                            }
+                        }
+                    }
 				}
 					break;
 				default :
@@ -822,9 +843,9 @@
 
 	public List getCMDocumentTrackers(int offset) {
 		List validDocs = new ArrayList();
-		Iterator alldocs = getTaglibTrackers().iterator();
-		while (alldocs.hasNext()) {
-			TaglibTracker aTracker = (TaglibTracker) alldocs.next();
+		Object[] alldocs = getTaglibTrackers().toArray();
+		for (int i = 0; i < alldocs.length; i++) {
+			TaglibTracker aTracker = (TaglibTracker) alldocs[i];
 			if (aTracker.getStructuredDocumentRegion().getStartOffset() <= offset || offset < 0) {
 				validDocs.add(aTracker);
 			}
@@ -834,11 +855,11 @@
 
 	public List getCMDocumentTrackers(String prefix, int offset) {
 		List validDocs = new ArrayList();
-		Iterator alldocs = getTaglibTrackers().iterator();
-		while (alldocs.hasNext()) {
-			TaglibTracker aTracker = (TaglibTracker) alldocs.next();
+		Object[] alldocs = getTaglibTrackers().toArray();
+		for (int i = 0; i < alldocs.length; i++) {
+			TaglibTracker aTracker = (TaglibTracker) alldocs[i];
 			/**
-			 * '<' is used to support the immediate use of a custom tag in jspx files
+			 * '<' is used to support the immediate use of a custom tag in jspx files (instead of '<=')
 			 */
 			if ((aTracker.getStructuredDocumentRegion().getStartOffset() <= offset || offset < 0) && aTracker.getPrefix().equals(prefix)) {
 				validDocs.add(aTracker);
@@ -858,6 +879,8 @@
 	IPath getCurrentBaseLocation() {
 		IPath baseLocation = null;
 		IPath path = getCurrentParserPath();
+		if (path == null || path.segmentCount() < 2)
+			return path;
 		baseLocation = ResourcesPlugin.getWorkspace().getRoot().getFile(path).getLocation();
 		if (baseLocation == null) {
 			baseLocation = path;
@@ -912,11 +935,11 @@
 		return fIncludes;
 	}
 
-	JSPSourceParser getParser() {
+	XMLSourceParser getParser() {
 		return fParser;
 	}
 
-	public JSPSourceParser getSourceParser() {
+	public XMLSourceParser getSourceParser() {
 		return fParser;
 	}
 
@@ -951,9 +974,11 @@
 							includeHelper.parse(preludes[i]);
 							List references = includeHelper.taglibReferences;
 							fTLDCMReferencesMap.put(preludes[i], references);
-							for (int j = 0; j < references.size(); j++) {
-								TLDCMDocumentReference reference = (TLDCMDocumentReference) references.get(j);
-								getParser().addNestablePrefix(new TagMarker(reference.prefix + ":")); //$NON-NLS-1$
+							if (getParser() instanceof JSPCapableParser) {
+								for (int j = 0; j < references.size(); j++) {
+									TLDCMDocumentReference reference = (TLDCMDocumentReference) references.get(j);
+									((JSPCapableParser) getParser()).addNestablePrefix(new TagMarker(reference.prefix + ":")); //$NON-NLS-1$
+								}
 							}
 						}
 						else
@@ -1039,19 +1064,13 @@
 	 * Loads the taglib from the specified URI. It must point to a valid
 	 * taglib descriptor to work.
 	 */
-	protected TLDCMDocumentDescriptor loadTaglib(String uri) {
-		TLDCMDocumentDescriptor entry = null;
+	protected CMDocument loadTaglib(String uri) {
+		CMDocument document = null;
 		IPath currentPath = getCurrentParserPath();
 		if (currentPath != null) {
-			CMDocument document = null;
 			ITaglibRecord record = TaglibIndex.resolve(currentPath.toString(), uri, false);
 			if (record != null) {
 				document = getCMDocumentBuilder().createCMDocument(record);
-				if (document != null) {
-					entry = new TLDCMDocumentDescriptor();
-					entry.document = document;
-					entry.cacheKey = getUniqueIdentifier(record);
-				}
 			}
 			else {
 				/* Not a very-often used code path (we hope) */
@@ -1063,14 +1082,11 @@
 							System.out.println("Loading tags from " + uri + " at " + location); //$NON-NLS-2$//$NON-NLS-1$
 						}
 						document = getCMDocumentBuilder().createCMDocument(location);
-						entry = new TLDCMDocumentDescriptor();
-						entry.document = document;
-						entry.cacheKey = location;
 					}
 				}
 			}
 		}
-		return entry;
+		return document;
 	}
 
 	protected void resetTaglibTrackers() {
@@ -1081,11 +1097,11 @@
 		getTaglibTrackers().clear();
 	}
 
-	public void setSourceParser(JSPSourceParser parser) {
+	public void setSourceParser(XMLSourceParser parser) {
 		if (fParser != null)
 			fParser.removeStructuredDocumentRegionHandler(getStructuredDocumentRegionHandler());
 		fParser = parser;
 		if (fParser != null)
 			fParser.addStructuredDocumentRegionHandler(getStructuredDocumentRegionHandler());
 	}
-}
\ No newline at end of file
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/provisional/TLDElementDeclaration.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/provisional/TLDElementDeclaration.java
index 1057164..dd34980 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/provisional/TLDElementDeclaration.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/provisional/TLDElementDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,6 +16,12 @@
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 
 public interface TLDElementDeclaration extends CMElementDeclaration {
+	/** 
+	 * Property stating whether the {@link CMElementDeclaration}
+	 * is a library tag or not
+	 */
+	String IS_LIBRARY_TAG = "isLibraryTag"; //$NON-NLS-1$
+	
 	String TAG_SOURCE = "Tag Definition Source"; //$NON-NLS-1$
 	String SOURCE_JSP_TLD = "JSP Tag Library Descriptor"; //$NON-NLS-1$
 	String SOURCE_TAG_FILE = "JSP Tag 2.0 File"; //$NON-NLS-1$
@@ -41,6 +47,16 @@
 	 */
 	String getDisplayName();
 
+
+	/**
+	 * Indicates that the declared tag handler supports dynamic attributes. It
+	 * is not a guarantee that the class itself implements
+	 * javax.servlet.jsp.tagext.DynamicAttributes.
+	 * 
+	 * @see JSP 2.0
+	 */
+	String getDynamicAttributes();
+	
 	/**
 	 * Optional informal description of an example of a use of this tag
 	 * 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java
index 7802c77..87b73c7 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -47,6 +47,7 @@
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
 import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
 import org.w3c.dom.Element;
 import org.w3c.dom.EntityReference;
 import org.w3c.dom.Node;
@@ -58,15 +59,16 @@
 import org.xml.sax.SAXParseException;
 
 /**
- * A cache fo property group information stored in web.xml files. Information
+ * A cache for property group information stored in web.xml files. Information
  * is not persisted.
  */
 public final class DeploymentDescriptorPropertyCache {
 	private static final PropertyGroup[] NO_PROPERTY_GROUPS = new PropertyGroup[0];
 
-	private static class DeploymentDescriptor {
+	static class DeploymentDescriptor {
 		PropertyGroup[] groups;
 		long modificationStamp;
+		StringMatcher[] urlPatterns;
 		Float version = new Float(defaultWebAppVersion);
 	}
 
@@ -223,11 +225,11 @@
 		}
 
 		public String toString() {
-			return number + ":" + url_pattern;
+			return number + ":" + url_pattern; //$NON-NLS-1$
 		}
 	}
 
-	private static class ResourceChangeListener implements IResourceChangeListener {
+	static class ResourceChangeListener implements IResourceChangeListener {
 		public void resourceChanged(IResourceChangeEvent event) {
 			IResourceDelta delta = event.getDelta();
 			if (event.getType() != IResourceChangeEvent.POST_CHANGE)
@@ -241,7 +243,7 @@
 					if (resource.getType() == IResource.FILE) {
 						if (delta.getKind() == IResourceDelta.CHANGED && (delta.getFlags() == IResourceDelta.ENCODING || delta.getFlags() == IResourceDelta.MARKERS))
 							return false;
-						
+
 						IPath path = resource.getFullPath();
 						int segmentCount = path.segmentCount();
 						if (segmentCount > 1 && path.lastSegment().equals(WEB_XML) && path.segment(segmentCount - 2).equals(WEB_INF)) {
@@ -250,10 +252,12 @@
 					}
 					else if (resource.getType() == IResource.PROJECT) {
 						String name = resource.getName();
-						if(_debugResolutionCache) {
+						if (_debugResolutionCache) {
 							System.out.println("Removing DeploymentDescriptorPropertyCache resolution cache for project " + name); //$NON-NLS-1$ 
 						}
-						getInstance().resolvedMap.remove(name);
+						synchronized (LOCK) {
+							getInstance().resolvedMap.remove(name);
+						}
 					}
 					return true;
 				}
@@ -299,7 +303,7 @@
 	/**
 	 * Copied from org.eclipse.core.internal.propertytester.StringMatcher, but
 	 * should be replaced with a more accurate implementation of the rules in
-	 * Servlet spec SRV.11.2
+	 * Servlet spec SRV.11.2 and RFC 2396
 	 */
 	private static class StringMatcher {
 		private static final char SINGLE_WILD_CARD = '\u0000';
@@ -313,7 +317,7 @@
 
 		private boolean hasTrailingStar;
 
-		private final String pattern;
+		final String pattern;
 
 		private final int patternLength;
 
@@ -378,8 +382,8 @@
 
 		/**
 		 * Given the starting (inclusive) and the ending (exclusive) positions
-		 * in the <code>text</code>, determine if the given substring
-		 * matches with aPattern
+		 * in the <code>text</code>, determine if the given substring matches
+		 * with aPattern
 		 * 
 		 * @return true if the specified portion of the text matches the
 		 *         pattern
@@ -540,29 +544,34 @@
 			}
 			return true;
 		}
+		
+		public String toString() {
+			return "StringMatcher: " + pattern; //$NON-NLS-1$
+		}
 	}
 
-	private static DeploymentDescriptorPropertyCache _instance = new DeploymentDescriptorPropertyCache();
+	private static final DeploymentDescriptorPropertyCache _instance = new DeploymentDescriptorPropertyCache();
 	private static final boolean _debugResolutionCache = false;
 
-	private static final float defaultWebAppVersion = 2.4f;
-	private static String EL_IGNORED = "el-ignored";
-	private static String ID = "id";
-	private static String INCLUDE_CODA = "include-coda";
-	private static String INCLUDE_PRELUDE = "include-prelude";
+	private static final float defaultWebAppVersion = 3f;
+	static final String EL_IGNORED = "el-ignored"; //$NON-NLS-1$
+	static final String ID = "id"; //$NON-NLS-1$
+	static final String INCLUDE_CODA = "include-coda"; //$NON-NLS-1$
+	static final String INCLUDE_PRELUDE = "include-prelude"; //$NON-NLS-1$
 
-	private static String IS_XML = "is-xml";
-	private static String JSP_PROPERTY_GROUP = "jsp-property-group";
-	private static String PAGE_ENCODING = "page-encoding";
+	static final String IS_XML = "is-xml"; //$NON-NLS-1$
+	private static String JSP_PROPERTY_GROUP = "jsp-property-group"; //$NON-NLS-1$
+	static final String PAGE_ENCODING = "page-encoding"; //$NON-NLS-1$
 
-	private static String SCRIPTING_INVALID = "scripting-invalid";
-	private static String URL_PATTERN = "url-pattern";
-	private static final String WEB_APP_ELEMENT_LOCAL_NAME = ":web-app";
-	private static final String WEB_APP_ELEMENT_NAME = "web-app";
+	static final String SCRIPTING_INVALID = "scripting-invalid"; //$NON-NLS-1$
+	static final String URL_PATTERN = "url-pattern"; //$NON-NLS-1$
+	private static final String SERVLET_MAPPING = "servlet-mapping"; //$NON-NLS-1$
+	private static final String WEB_APP_ELEMENT_LOCAL_NAME = ":web-app"; //$NON-NLS-1$
+	private static final String WEB_APP_ELEMENT_NAME = "web-app"; //$NON-NLS-1$
 
-	private static final String WEB_APP_VERSION_NAME = "version";
-	private static final String WEB_INF = "WEB-INF";
-	private static final String WEB_XML = "web.xml";
+	private static final String WEB_APP_VERSION_NAME = "version"; //$NON-NLS-1$
+	private static final String WEB_INF = "WEB-INF"; //$NON-NLS-1$
+	private static final String WEB_XML = "web.xml"; //$NON-NLS-1$
 	// private static final String WEB_INF_WEB_XML = WEB_INF + IPath.SEPARATOR
 	// + WEB_XML;
 	private static final String SLASH_WEB_INF_WEB_XML = Path.ROOT.toString() + WEB_INF + IPath.SEPARATOR + WEB_XML;
@@ -618,31 +627,54 @@
 
 	// for use when reading TLDs
 	private EntityResolver resolver;
-	
+
 	Map resolvedMap = new HashMap();
 
+	final static Object LOCK = new Object();
+
 	private DeploymentDescriptorPropertyCache() {
 		super();
 	}
 
-	private void _parseDocument(IPath path, Float[] version, List groupList, SubProgressMonitor subMonitor, Document document) {
+	private void _parseDocument(IPath path, Float[] version, List groupList, List urlPatterns, SubProgressMonitor subMonitor, Document document) {
 		Element webapp = document.getDocumentElement();
 		if (webapp != null) {
 			if (webapp.getTagName().equals(WEB_APP_ELEMENT_NAME) || webapp.getNodeName().endsWith(WEB_APP_ELEMENT_LOCAL_NAME)) {
-				String versionValue = webapp.getAttribute(WEB_APP_VERSION_NAME);
-				if (versionValue != null) {
-					try {
-						version[0] = Float.valueOf(versionValue);
+				// this convention only started with 2.4?
+				if (webapp.hasAttribute(WEB_APP_VERSION_NAME)) {
+					String versionValue = webapp.getAttribute(WEB_APP_VERSION_NAME);
+					versionValue = versionValue.trim();
+					if (versionValue.length() > 0) {
+						try {
+							version[0] = Float.valueOf(versionValue);
+						}
+						catch (NumberFormatException e) {
+							// doesn't matter
+						}
 					}
-					catch (NumberFormatException e) {
-						// doesn't matter
+				}
+				if (version[0] == null) {
+					// try determining the version from the doctype reference
+					DocumentType doctype = document.getDoctype();
+					if (doctype != null) {
+						String systemId = doctype.getSystemId();
+						String publicId = doctype.getPublicId();
+						if ((systemId != null && systemId.endsWith("web-app_2_3.dtd")) || (publicId != null && publicId.indexOf("Web Application 2.3") > 0)) { //$NON-NLS-1$ //$NON-NLS-2$
+							version[0] = new Float(2.3);
+						}
+						else if ((systemId != null && systemId.endsWith("web-app_2_2.dtd")) || (publicId != null && publicId.indexOf("Web Application 2.2") > 0)) { //$NON-NLS-1$ //$NON-NLS-2$
+							version[0] = new Float(2.2);
+						}
+						else if ((systemId != null && systemId.endsWith("web-app_2_1.dtd")) || (publicId != null && publicId.indexOf("Web Application 2.1") > 0)) { //$NON-NLS-1$ //$NON-NLS-2$
+							version[0] = new Float(2.1);
+						}
 					}
 				}
 			}
 		}
 		NodeList propertyGroupElements = document.getElementsByTagName(JSP_PROPERTY_GROUP);
 		int length = propertyGroupElements.getLength();
-		subMonitor.beginTask("Reading Property Groups", length);
+		subMonitor.beginTask("Reading Property Groups", length); //$NON-NLS-1$
 		for (int i = 0; i < length; i++) {
 			PropertyGroup group = PropertyGroup.createFrom(path, propertyGroupElements.item(i), i);
 			subMonitor.worked(1);
@@ -650,6 +682,19 @@
 				groupList.add(group);
 			}
 		}
+		
+		// 325554 : only apply to URL patterns for Servlet mappings
+		NodeList urlPatternElements = document.getElementsByTagName(URL_PATTERN);
+		int urlPatternElementCount = urlPatternElements.getLength();
+		for (int i = 0; i < urlPatternElementCount; i++) {
+			Node urlPatternElement = urlPatternElements.item(i);
+			if (SERVLET_MAPPING.equals(urlPatternElement.getParentNode().getNodeName())) {
+				String urlPattern = getContainedText(urlPatternElement);
+				if (urlPattern != null && urlPattern.length() > 0) {
+					urlPatterns.add(new StringMatcher(urlPattern));
+				}
+			}
+		}
 	}
 
 	/**
@@ -657,6 +702,8 @@
 	 */
 	private float convertSpecVersions(float version) {
 		if (version > 0) {
+			if (version == 3f)
+				return 2.2f;
 			if (version == 2.5f)
 				return 2.1f;
 			else if (version == 2.4f)
@@ -682,25 +729,26 @@
 	 * SSE XML parser to find the property groups.
 	 */
 	private DeploymentDescriptor fetchDescriptor(IPath path, IProgressMonitor monitor) {
-		monitor.beginTask("Reading Deployment Descriptor", 3);
+		monitor.beginTask(Messages.DeploymentDescriptorPropertyCache_1, 3);
 		IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
 
 		PropertyGroup groups[] = null;
 
 		IStructuredModel model = null;
 		List groupList = new ArrayList();
+		List urlPatterns = new ArrayList();
 		Float[] version = new Float[1];
 		SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 2);
 		DocumentBuilder builder = CommonXML.getDocumentBuilder(false);
 		builder.setEntityResolver(getEntityResolver());
 		builder.setErrorHandler(getErrorHandler(path));
-		try {			
+		try {
 			InputSource inputSource = new InputSource();
 			String s = FileContentCache.getInstance().getContents(path);
 			inputSource.setCharacterStream(new StringReader(s));
 			inputSource.setSystemId(path.toString());
 			Document document = builder.parse(inputSource);
-			_parseDocument(path, version, groupList, subMonitor, document);
+			_parseDocument(path, version, groupList, urlPatterns, subMonitor, document);
 		}
 		catch (SAXException e1) {
 			/* encountered a fatal parsing error, try our own parser */
@@ -714,7 +762,7 @@
 				monitor.worked(1);
 				if (model instanceof IDOMModel) {
 					IDOMDocument document = ((IDOMModel) model).getDocument();
-					_parseDocument(path, version, groupList, subMonitor, document);
+					_parseDocument(path, version, groupList, urlPatterns, subMonitor, document);
 				}
 			}
 			catch (Exception e) {
@@ -741,12 +789,31 @@
 		DeploymentDescriptor deploymentDescriptor = new DeploymentDescriptor();
 		deploymentDescriptor.modificationStamp = file.getModificationStamp();
 		deploymentDescriptor.groups = groups;
+		deploymentDescriptor.urlPatterns = ((StringMatcher[]) urlPatterns.toArray(new StringMatcher[urlPatterns.size()]));
 		deploymentDescriptor.version = version[0];
 		monitor.done();
 		fDeploymentDescriptors.put(path, new SoftReference(deploymentDescriptor));
 		return deploymentDescriptor;
 	}
 
+	private DeploymentDescriptor getCachedDescriptor(IPath jspFilePath) {
+		IPath webxmlPath = getWebXMLPath(jspFilePath);
+		if (webxmlPath == null)
+			return null;
+
+		IFile webxmlFile = ResourcesPlugin.getWorkspace().getRoot().getFile(webxmlPath);
+		if (!webxmlFile.isAccessible())
+			return null;
+
+		Reference descriptorHolder = (Reference) fDeploymentDescriptors.get(webxmlPath);
+		DeploymentDescriptor descriptor = null;
+
+		if (descriptorHolder == null || ((descriptor = (DeploymentDescriptor) descriptorHolder.get()) == null) || (descriptor.modificationStamp == IResource.NULL_STAMP) || (descriptor.modificationStamp != webxmlFile.getModificationStamp())) {
+			descriptor = fetchDescriptor(webxmlPath, new NullProgressMonitor());
+		}
+		return descriptor;
+	}
+
 	private EntityResolver getEntityResolver() {
 		if (resolver == null) {
 			resolver = new EntityResolver() {
@@ -781,22 +848,10 @@
 	public float getJSPVersion(IPath fullPath) {
 		float version = defaultWebAppVersion;
 		/* try applicable web.xml file first */
-		IPath webxmlPath = getWebXMLPath(fullPath);
-		if (webxmlPath != null) {
-			IFile webxmlFile = ResourcesPlugin.getWorkspace().getRoot().getFile(webxmlPath);
-			if (webxmlFile.isAccessible()) {
-				Reference descriptorHolder = (Reference) fDeploymentDescriptors.get(webxmlPath);
-				DeploymentDescriptor descriptor = null;
-
-				if (descriptorHolder == null || ((descriptor = (DeploymentDescriptor) descriptorHolder.get()) == null) || (descriptor.modificationStamp == IResource.NULL_STAMP) || (descriptor.modificationStamp != webxmlFile.getModificationStamp())) {
-					descriptor = fetchDescriptor(webxmlPath, new NullProgressMonitor());
-				}
-
-				if (descriptor.version != null) {
-					version = descriptor.version.floatValue();
-					return convertSpecVersions(version);
-				}
-			}
+		DeploymentDescriptor descriptor = getCachedDescriptor(fullPath);
+		if (descriptor != null && descriptor.version != null) {
+			version = descriptor.version.floatValue();
+			return convertSpecVersions(version);
 		}
 
 		/* check facet settings */
@@ -815,21 +870,10 @@
 	 */
 	public PropertyGroup[] getPropertyGroups(IPath jspFilePath) {
 		List matchingGroups = new ArrayList(1);
-		IPath webxmlPath = getWebXMLPath(jspFilePath);
-		if (webxmlPath == null)
+		DeploymentDescriptor descriptor = getCachedDescriptor(jspFilePath);
+		if (descriptor == null)
 			return NO_PROPERTY_GROUPS;
 
-		IFile webxmlFile = ResourcesPlugin.getWorkspace().getRoot().getFile(webxmlPath);
-		if (!webxmlFile.isAccessible())
-			return NO_PROPERTY_GROUPS;
-
-		Reference descriptorHolder = (Reference) fDeploymentDescriptors.get(webxmlPath);
-		DeploymentDescriptor descriptor = null;
-
-		if (descriptorHolder == null || ((descriptor = (DeploymentDescriptor) descriptorHolder.get()) == null) || (descriptor.modificationStamp == IResource.NULL_STAMP) || (descriptor.modificationStamp != webxmlFile.getModificationStamp())) {
-			descriptor = fetchDescriptor(webxmlPath, new NullProgressMonitor());
-		}
-
 		for (int i = 0; i < descriptor.groups.length; i++) {
 			if (descriptor.groups[i].matches(FacetModuleCoreSupport.getRuntimePath(jspFilePath).toString(), false)) {
 				matchingGroups.add(descriptor.groups[i]);
@@ -845,6 +889,28 @@
 		return (PropertyGroup[]) matchingGroups.toArray(new PropertyGroup[matchingGroups.size()]);
 	}
 
+	/**
+	 * @param jspFilePath
+	 *            the path of the JSP file
+	 * @param reference
+	 *            a path reference to test for
+	 * @return a matching url-mapping value in the corresponding deployment
+	 *         descriptor for the given JSP file path, if a deployment
+	 *         descriptor could be found, null otherwise
+	 */
+	public String getURLMapping(IPath jspFilePath, String reference) {
+		DeploymentDescriptor descriptor = getCachedDescriptor(jspFilePath);
+		if (descriptor == null)
+			return null;
+		StringMatcher[] mappings = descriptor.urlPatterns;
+		for (int i = 0; i < mappings.length; i++) {
+			if (mappings[i].match(reference)) {
+				return mappings[i].pattern;
+			}
+		}
+		return null;
+	}
+	
 	private IPath getWebXMLPath(IPath fullPath) {
 		/*
 		 * It can take the better part of a full second to do this, so cache
@@ -852,15 +918,16 @@
 		 */
 		IPath resolved = null;
 		Map mapForProject = null;
-		mapForProject = (Map) resolvedMap.get(fullPath.segment(0));
-		if (mapForProject != null) {
-			resolved = (IPath) mapForProject.get(fullPath);
+		synchronized (LOCK) {
+			mapForProject = (Map) resolvedMap.get(fullPath.segment(0));
+			if (mapForProject != null) {
+				resolved = (IPath) mapForProject.get(fullPath);
+			}
+			else {
+				mapForProject = new HashMap();
+				resolvedMap.put(fullPath.segment(0), mapForProject);
+			}
 		}
-		else {
-			mapForProject = new HashMap();
-			resolvedMap.put(fullPath.segment(0), mapForProject);
-		}
-
 		if (resolved != null) {
 			if (_debugResolutionCache) {
 				System.out.println("DeploymentDescriptorPropertyCache resolution cache hit for " + fullPath); //$NON-NLS-1$ 
@@ -876,6 +943,14 @@
 		return resolved;
 	}
 
+	public IFile getWebXML(IPath jspFilePath) {
+		IPath webxmlPath = getWebXMLPath(jspFilePath);
+		if (webxmlPath == null)
+			return null;
+
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(webxmlPath);
+	}
+
 	private void updateCacheEntry(IPath fullPath) {
 		/* don't update right now; remove and wait for another query to update */
 		fDeploymentDescriptors.remove(fullPath);
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/IntStack.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/IntStack.java
index 99c7477..89fdc13 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/IntStack.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/IntStack.java
@@ -94,6 +94,21 @@
 	}
 
 	public int size() {
-		return list.length;
+		return size;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		StringBuffer s = new StringBuffer(getClass().getName() + ":" +size + " [");
+		for (int i = 0; i < size; i++) {
+			s.append(list[i]);
+			if(i < size - 1) {
+				s.append(", ");
+			}
+		}
+		s.append("]");
+		return s.toString();
 	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java
index f3f3e9c..8a6e5c6 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -28,9 +28,12 @@
 import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
 import org.eclipse.wst.sse.core.internal.encoding.NonContentBasedEncodingRules;
+import org.eclipse.wst.sse.core.utils.StringUtils;
 import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;
 import org.eclipse.wst.xml.core.internal.contenttype.XMLHeadTokenizerConstants;
 
+import com.ibm.icu.util.StringTokenizer;
+
 public class JSPResourceEncodingDetector implements IResourceCharsetDetector {
 
 	private String fCharset;
@@ -341,33 +344,49 @@
 	 * @param contentType
 	 */
 	private void parseContentTypeValue(String contentType) {
-		Pattern pattern = Pattern.compile(";\\s*charset\\s*=\\s*"); //$NON-NLS-1$
-		String[] parts = pattern.split(contentType);
-		if (parts.length > 0) {
-			// if only one item, it can still be charset instead of
-			// contentType
-			if (parts.length == 1) {
-				if (parts[0].length() > 6) {
-					String checkForCharset = parts[0].substring(0, 7);
-					if (checkForCharset.equalsIgnoreCase("charset")) { //$NON-NLS-1$
-						int eqpos = parts[0].indexOf('=');
-						eqpos = eqpos + 1;
-						if (eqpos < parts[0].length()) {
-							fCharset = parts[0].substring(eqpos);
-							fCharset = fCharset.trim();
-						}
-					}
-					else {
-						fContentType = parts[0];
-					}
-				}
-			}
-			else {
-				fContentType = parts[0];
-			}
+		/*
+		 * Based partially on
+		 * org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapterImpl
+		 * .getMimeTypeFromContentTypeValue(String) , divides the full value
+		 * into segments according to ';', assumes the first specifies the
+		 * content type itself if it has no '=', and that the remainder are
+		 * parameters which may specify a charset
+		 */
+		
+		String cleanContentTypeValue = StringUtils.stripNonLetterDigits(contentType);
+		/* Break the mime header into the main value and its parameters, separated by ';' */
+		StringTokenizer tokenizer = new StringTokenizer(cleanContentTypeValue, ";"); //$NON-NLS-1$
+		int tLen = tokenizer.countTokens();
+		if (tLen == 0)
+			return;
+		String[] tokens = new String[tLen];
+		int j = 0;
+		while (tokenizer.hasMoreTokens()) {
+			tokens[j] = tokenizer.nextToken();
+			j++;
 		}
-		if (parts.length > 1) {
-			fCharset = parts[1];
+		
+		int firstParameter = 0;
+		if (tokens[0].indexOf('=') == -1) {
+			/*
+			 * no equal sign in the first segment, so assume it indicates a
+			 * content type properly
+			 */
+			fContentType = tokens[0].trim();
+			firstParameter = 1;
+		}
+		/*
+		 * now handle parameters as name=value pairs, looking for "charset"
+		 * specifically
+		 */
+		Pattern equalPattern = Pattern.compile("\\s*=\\s*"); //$NON-NLS-1$
+		for (int i = firstParameter; i < tokens.length; i++) {
+			String[] pair = equalPattern.split(tokens[i]);
+			if (pair.length < 2)
+				continue;
+			if (pair[0].trim().equals("charset")) { //$NON-NLS-1$
+				fCharset = pair[1].trim();
+			}
 		}
 	}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/Messages.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/Messages.java
new file mode 100644
index 0000000..bd8b462
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/Messages.java
@@ -0,0 +1,15 @@
+package org.eclipse.jst.jsp.core.internal.contenttype;

+

+import org.eclipse.osgi.util.NLS;

+

+public class Messages extends NLS {

+	private static final String BUNDLE_NAME = "org.eclipse.jst.jsp.core.internal.contenttype.messages"; //$NON-NLS-1$

+	public static String DeploymentDescriptorPropertyCache_1;

+	static {

+		// initialize resource bundle

+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);

+	}

+

+	private Messages() {

+	}

+}

diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/messages.properties b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/messages.properties
new file mode 100644
index 0000000..269d3ad
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/messages.properties
@@ -0,0 +1 @@
+DeploymentDescriptorPropertyCache_1=Reading Deployment Descriptor

diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java
index 026c3a7..4c0cc87 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -144,6 +144,7 @@
 	private String cachedLanguage;
 	private String cachedContentType;
 	private INodeNotifier notifierAtCreation;
+	private String elIgnored = null;
 
 	private int firstLanguagePosition = -1;
 	private int firstContentTypePosition = -1;
@@ -700,4 +701,12 @@
 		}
 		return desc;
 	}
+
+	public String getElIgnored() {
+		return elIgnored;
+	}
+
+	public void setElIgnored(String ignored) {
+		elIgnored = ignored;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveWatcherImpl.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveWatcherImpl.java
index 5058785..be4ce58 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveWatcherImpl.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveWatcherImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -35,19 +35,23 @@
 	public PageDirectiveWatcherImpl(IDOMElement target) {
 		super();
 		targetElement = target;
-		String contentTypeValue = target.getAttribute("contentType"); //$NON-NLS-1$
-		if (contentTypeValue != null) {
+		if (target.hasAttribute("contentType")) { //$NON-NLS-1$
+			String contentTypeValue = target.getAttribute("contentType"); //$NON-NLS-1$
 			// using concrete class below, since "changed" is something of an internal method
 			PageDirectiveAdapterImpl pageDirectiveAdapter = (PageDirectiveAdapterImpl) ((IDOMDocument) targetElement.getOwnerDocument()).getAdapterFor(PageDirectiveAdapter.class);
 			pageDirectiveAdapter.changedContentType(((IndexedRegion) targetElement).getStartOffset(), contentTypeValue);
 		}
-		String languageValue = target.getAttribute("language"); //$NON-NLS-1$
-		if (languageValue != null) {
+		if (target.hasAttribute("language")) { //$NON-NLS-1$
+			String languageValue = target.getAttribute("language"); //$NON-NLS-1$
 			// using concrete class below, since "changed" is something of an internal method
 			PageDirectiveAdapterImpl pageDirectiveAdapter = (PageDirectiveAdapterImpl) ((IDOMDocument) targetElement.getOwnerDocument()).getAdapterFor(PageDirectiveAdapter.class);
 			pageDirectiveAdapter.changedLanguage(((IndexedRegion) targetElement).getStartOffset(), languageValue);
 		}
-
+		if (target.hasAttribute("isELIgnored")) { //$NON-NLS-1$
+			String elIgnored = target.getAttribute("isELIgnored"); //$NON-NLS-1$
+			PageDirectiveAdapterImpl pageDirectiveAdapter = (PageDirectiveAdapterImpl) ((IDOMDocument) targetElement.getOwnerDocument()).getAdapterFor(PageDirectiveAdapter.class);
+			pageDirectiveAdapter.setElIgnored(elIgnored);
+		}
 
 	}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/ElementImplForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/ElementImplForJSP.java
index 2969129..05fa231 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/ElementImplForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/ElementImplForJSP.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,7 +16,6 @@
 import org.eclipse.wst.html.core.internal.document.ElementStyleImpl;
 import org.eclipse.wst.xml.core.internal.document.ElementImpl;
 import org.w3c.dom.Document;
-import org.w3c.dom.Node;
 
 public class ElementImplForJSP extends ElementStyleImpl {
 	/**
@@ -60,10 +59,8 @@
 	protected void setTagName(String tagName) {
 		super.setTagName(tagName);
 	}
-	public Node cloneNode(boolean deep) {
-		ElementImpl cloned = new ElementImplForJSP(this);
-		if (deep)
-			cloneChildNodes(cloned, deep);
-		return cloned;
+
+	protected ElementImpl newInstance() {
+		return new ElementImplForJSP(this);
 	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java
index 8e1d3cb..9b21526 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java
@@ -39,7 +39,6 @@
 import org.eclipse.wst.sse.core.internal.encoding.ContentTypeEncodingPreferences;
 import org.eclipse.wst.sse.core.internal.encoding.util.BufferedLimitedReader;
 import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
 import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
 import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
 import org.eclipse.wst.sse.core.internal.modelhandler.EmbeddedTypeRegistry;
@@ -91,7 +90,7 @@
 
 			EmbeddedTypeHandler embeddedType = getEmbeddedType(iFile);
 			if (embeddedType != null)
-				embeddedType.initializeParser((JSPCapableParser) structuredDocument.getParser());
+				embeddedType.initializeParser(structuredDocument.getParser());
 
 			fFullPreparedReader.reset();
 			setDocumentContentsFromReader(structuredDocument, fFullPreparedReader);
@@ -134,7 +133,7 @@
 			EmbeddedTypeHandler embeddedType = getEmbeddedType((IFile) null);
 			fFullPreparedReader.reset();
 			if (embeddedType != null)
-				embeddedType.initializeParser((JSPCapableParser) ((IStructuredDocument) structuredDocument).getParser());
+				embeddedType.initializeParser(((IStructuredDocument) structuredDocument).getParser());
 			setDocumentContentsFromReader(structuredDocument, fFullPreparedReader);
 		}
 		catch (CoreException e) {
@@ -277,7 +276,7 @@
 		// the
 		// default embeddeded content type handler
 		EmbeddedTypeHandler embeddedType = getJSPDefaultEmbeddedType();
-		embeddedType.initializeParser((JSPCapableParser) structuredDocument.getParser());
+		embeddedType.initializeParser(structuredDocument.getParser());
 		return structuredDocument;
 	}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/CompilationUnitHelper.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/CompilationUnitHelper.java
index 8df5524..7ace8d4 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/CompilationUnitHelper.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/CompilationUnitHelper.java
@@ -1,5 +1,7 @@
 package org.eclipse.jst.jsp.core.internal.java;
 
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IProblemRequestor;
 import org.eclipse.jdt.core.WorkingCopyOwner;
 
 /**
@@ -38,6 +40,12 @@
 
         if (fWorkingCopyOwner == null) {
             fWorkingCopyOwner = new WorkingCopyOwner() {
+            	/* (non-Javadoc)
+            	 * @see org.eclipse.jdt.core.WorkingCopyOwner#getProblemRequestor(org.eclipse.jdt.core.ICompilationUnit)
+            	 */
+            	public IProblemRequestor getProblemRequestor(ICompilationUnit workingCopy) {
+            		return CompilationUnitHelper.this.getProblemRequestor();
+            	}
                 public String toString() {
                     return "JSP Working copy owner"; //$NON-NLS-1$
                 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java
index ff986cd..8270cd8 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/IJSPProblem.java
@@ -1,3 +1,13 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java;
 
 import org.eclipse.jdt.core.compiler.IProblem;
@@ -14,7 +24,12 @@
 	int UseBeanInvalidID = F_PROBLEM_ID_LITERAL + 6;
 	int UseBeanMissingTypeInfo = F_PROBLEM_ID_LITERAL + 7;
 	int UseBeanAmbiguousType  = F_PROBLEM_ID_LITERAL + 8;
-	
+	int StartCustomTagMissing  = F_PROBLEM_ID_LITERAL + 9;
+	int EndCustomTagMissing  = F_PROBLEM_ID_LITERAL + 10;
+	int UseBeanStartTagMissing  = F_PROBLEM_ID_LITERAL + 11;
+	int UseBeanEndTagMissing  = F_PROBLEM_ID_LITERAL + 12;
+	int ELProblem = F_PROBLEM_ID_LITERAL + 13;
+
 	/**
 	 * @return the ID of this JSP problem
 	 */
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSP2ServletNameUtil.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSP2ServletNameUtil.java
index bd6e94a..e9c6bd9 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSP2ServletNameUtil.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSP2ServletNameUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -108,11 +108,11 @@
 	  // ensure rest of characters are valid	
 	  for (int i=0; i< length; i++) {
 		  char currentChar = name.charAt(i);
-		  if (Character.isJavaIdentifierPart(currentChar) == true  ) { 
-			  modifiedName.append(currentChar);
-		  } else {
+		  // [290769] Mangle _ since mangling inserts _ as a delimiter
+		  if (currentChar == '_' || !Character.isJavaIdentifierPart(currentChar))
 			  modifiedName.append(mangleChar(currentChar));
-		  }
+		  else
+			  modifiedName.append(currentChar);
 	  }
 	  return modifiedName.toString();
 	  
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPIncludeRegionHelper.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPIncludeRegionHelper.java
index f0115c8..a9b5be3 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPIncludeRegionHelper.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPIncludeRegionHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,7 +17,7 @@
 
 
 /**
- * Extension of XMLJSPRegionHelper inteded to parse entire included JSP files.
+ * Extension of XMLJSPRegionHelper intended to parse entire included JSP files.
  * Basically it expands the rules for what tags are parsed as JSP.
  * 
  * @author pavery
@@ -91,4 +91,8 @@
 		processIncludeDirective(sdRegion);
 		processPageDirective(sdRegion);
 	}
+
+	protected void prepareText(IStructuredDocumentRegion sdRegion) {
+		fStrippedText = fTextBefore = fTextToParse.substring(sdRegion.getStartOffset(), sdRegion.getEndOffset());
+	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslation.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslation.java
index 29e24f9..e91499f 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslation.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -76,7 +76,6 @@
 	private HashMap fJava2JspImportsMap = null;
 	private HashMap fJava2JspUseBeanMap = null;
 	private HashMap fJava2JspIndirectMap = null;
-	private List fELProblems = null;
 	
 	// don't want to hold onto model (via translator)
 	// all relevant info is extracted in the constructor.
@@ -92,28 +91,41 @@
 	private String fJspName;
 	private List fTranslationProblems;
 	private Collection fIncludedPaths;
+	
+	/** the {@link JSPTranslator} used by this {@link JSPTranslator} */
+	private JSPTranslator fTranslator;
 
 	public JSPTranslation(IJavaProject javaProj, JSPTranslator translator) {
 
 		fLock = new byte[0];
 		fJavaProject = javaProj;
-		//fTranslator = translator;
+		fTranslator = translator;
 		
 		// can be null if it's an empty document (w/ NullJSPTranslation)
-		if(translator != null) {
-		    fJavaText = translator.getTranslation().toString();
-		    fJspText = translator.getJspText();
-			fClassname = translator.getClassname();
-			fJava2JspMap = translator.getJava2JspRanges();
-			fJsp2JavaMap = translator.getJsp2JavaRanges();
-			fJava2JspImportsMap = translator.getJava2JspImportRanges();
-			fJava2JspUseBeanMap = translator.getJava2JspUseBeanRanges();
-			fJava2JspIndirectMap = translator.getJava2JspIndirectRanges();
-			fELProblems = translator.getELProblems();
-			fTranslationProblems = translator.getTranslationProblems();
-			fIncludedPaths = translator.getIncludedPaths();
+		initialize();
+	}
+
+	private void initialize() {
+		if(fTranslator != null) {
+			fJavaText = fTranslator.getTranslation().toString();
+			fJspText = fTranslator.getJspText();
+			fClassname = fTranslator.getClassname();
+			fJava2JspMap = fTranslator.getJava2JspRanges();
+			fJsp2JavaMap = fTranslator.getJsp2JavaRanges();
+			fJava2JspImportsMap = fTranslator.getJava2JspImportRanges();
+			fJava2JspUseBeanMap = fTranslator.getJava2JspUseBeanRanges();
+			fJava2JspIndirectMap = fTranslator.getJava2JspIndirectRanges();
+			fTranslationProblems = fTranslator.getTranslationProblems();
+			fIncludedPaths = fTranslator.getIncludedPaths();
 		}
 	}
+
+	/**
+	 * @return {@link JSPTranslator} used by this {@link JSPTranslation}
+	 */
+	protected JSPTranslator getTranslator() {
+		return this.fTranslator;
+	}
 	
 	public IJavaProject getJavaProject() {
 		return fJavaProject;
@@ -420,56 +432,28 @@
 	 */
 	private ICompilationUnit createCompilationUnit() throws JavaModelException {
 		
-		IPackageFragment packageFragment = null;
-		IJavaElement je = getJavaProject();
+		IJavaProject je = getJavaProject();
 
 		if (je == null || !je.exists())
 			return null;
-
-		switch (je.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT :
-				je = je.getParent();
-			// fall through
-
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT :
-				IPackageFragmentRoot packageFragmentRoot = (IPackageFragmentRoot) je;
-				packageFragment = packageFragmentRoot.getPackageFragment(IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH);
-				break;
-
-			case IJavaElement.JAVA_PROJECT :
-				IJavaProject jProject = (IJavaProject) je;
-
-				if (!jProject.exists()) {
-					if(DEBUG) {
-						System.out.println("** Abort create working copy: cannot create working copy: JSP is not in a Java project"); //$NON-NLS-1$
-					}
-					return null;
-				}
-
-				packageFragmentRoot = null;
-				IPackageFragmentRoot[] packageFragmentRoots = jProject.getPackageFragmentRoots();
-				int i = 0;
-				while (i < packageFragmentRoots.length) {
-					if (!packageFragmentRoots[i].isArchive() && !packageFragmentRoots[i].isExternal()) {
-						packageFragmentRoot = packageFragmentRoots[i];
-						break;
-					}
-					i++;
-				}
-				if (packageFragmentRoot == null) {
-					if(DEBUG) {
-						System.out.println("** Abort create working copy: cannot create working copy: JSP is not in a Java project with source package fragment root"); //$NON-NLS-1$
-					}
-					return null;
-				}
-				packageFragment = packageFragmentRoot.getPackageFragment(IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH);
-				break;
-
-			default :
-				return null;
-		}
 		
-		ICompilationUnit cu = packageFragment.getCompilationUnit(getClassname() + ".java").getWorkingCopy(getWorkingCopyOwner(), getProblemRequestor(), getProgressMonitor()); //$NON-NLS-1$
+		final String name = getClassname() + ".java";
+		IPackageFragmentRoot packageFragmentRoot = null;
+		IPackageFragmentRoot[] packageFragmentRoots = je.getPackageFragmentRoots();
+		for (int i = 0; i < packageFragmentRoots.length; i++) {
+			if (!packageFragmentRoots[i].isArchive() && !packageFragmentRoots[i].isExternal()) {
+				packageFragmentRoot = packageFragmentRoots[i];
+				break;
+			}
+		}
+		if (packageFragmentRoot == null) {
+			if(DEBUG) {
+				System.out.println("** Abort create working copy: cannot create working copy: JSP is not in a Java project with source package fragment root"); //$NON-NLS-1$
+			}
+			return null;
+		}
+		final IPackageFragment fragment = packageFragmentRoot.getPackageFragment(IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH);
+		ICompilationUnit cu = fragment.getCompilationUnit(name).getWorkingCopy(getWorkingCopyOwner(), getProgressMonitor());
 		setContents(cu);
 
 		if(DEBUG) {
@@ -523,15 +507,6 @@
 		}
 		return fTranslationProblems;
 	}
-	
-	/**
-	 * 
-	 * @return the List of problems collected during reconcile of the compilation unit
-	 */
-	public List getELProblems() {
-		return fELProblems != null ? fELProblems : new ArrayList();
-	}
-
 
 	/**
 	 * Must be set true in order for problems to be collected during reconcile.
@@ -545,6 +520,15 @@
 		}
 	}
 
+	public void retranslate(JSPTranslator translator) {
+		fTranslator = translator;
+		initialize();
+
+		synchronized (fLock) {
+			setContents(getCompilationUnit());
+		}
+	}
+
 	/**
 	 * Reconciles the compilation unit for this JSPTranslation
 	 */
@@ -554,7 +538,7 @@
 			try {
 				synchronized(cu) {
 					cu.makeConsistent(getProgressMonitor());
-					cu.reconcile(ICompilationUnit.NO_AST, true, getWorkingCopyOwner(), getProgressMonitor());
+					cu.reconcile(ICompilationUnit.NO_AST, false, getWorkingCopyOwner(), getProgressMonitor());
 				}
 			}
 			catch (JavaModelException e) {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapter.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapter.java
index 5db6c87..365fc1d 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapter.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -47,10 +47,29 @@
 	private JSPTranslator fTranslator = null;
 	private NullProgressMonitor fTranslationMonitor = null;
 
+	/**
+	 * <p>Constructs a {@link JSPTranslationAdapter} that will create a new {@link JSPTranslator}<p>
+	 * 
+	 * @param xmlModel {@link IDOMModel} this {@link JSPTranslationAdapter} is for
+	 */
 	public JSPTranslationAdapter(IDOMModel xmlModel) {
 		setXMLModel(xmlModel);
 		initializeJavaPlugins();
 	}
+	
+	/**
+	 * <p>Constructs a {@link JSPTranslationAdapter} using an existing {@link JSPTranslator}</p>
+	 * 
+	 * @param xmlModel {@link IDOMModel} this {@link JSPTranslationAdapter} is for
+	 * @param translator existing {@link JSPTranslator} this {@link JSPTranslationAdapter} will use
+	 */
+	public JSPTranslationAdapter(IDOMModel xmlModel, JSPTranslator translator) {
+		this(xmlModel);
+		this.fTranslator = translator;
+		this.fJavaDocument = new Document(translator.getTranslation().toString());
+		this.fJSPTranslation = new JSPTranslationExtension(getXMLModel().getStructuredDocument(), fJavaDocument, getJavaProject(), this.fTranslator);
+		this.fDocumentIsDirty = false;
+	}
 
 	/**
 	 * Initialize the required Java Plugins
@@ -114,7 +133,13 @@
 	}
 
 	/**
-	 * Returns the JSPTranslation for this adapter.
+	 * <p>Returns the JSPTranslation for this adapter.</p>
+	 * 
+	 * <p><b>IMPORTANT: </b><i>This will force translation of the
+	 * document if it has not already been called.  To avoid
+	 * accidental translation before calling this method call
+	 * {@link #hasTranslation()} to verify a translation
+	 * has already been forced by this adapter.</i></p>
 	 * 
 	 * @return a JSPTranslationExtension
 	 */
@@ -134,17 +159,31 @@
 				StringBuffer emptyContents = translator.getEmptyTranslation();
 				fJavaDocument = new Document(emptyContents.toString());
 			}
-			// it's going to be rebuilt, so we release it here
+			// Just a dirty translation, re-translate
 			if (fJSPTranslation != null) {
 				if (DEBUG)
-					System.out.println("JSPTranslationAdapter releasing:" + fJSPTranslation); //$NON-NLS-1$
-				fJSPTranslation.release();
+					System.out.println("JSPTranslationAdapter retranslating:" + fJSPTranslation); //$NON-NLS-1$
+				fJSPTranslation.retranslate(fJavaDocument, translator);
+				fDocumentIsDirty = false;
+				return fJSPTranslation;
 			}
 			fJSPTranslation = new JSPTranslationExtension(getXMLModel().getStructuredDocument(), fJavaDocument, getJavaProject(), translator);
 			fDocumentIsDirty = false;
 		}
 		return fJSPTranslation;
 	}
+	
+	/**
+	 * <p>Knowing weather the translation has already been retrieved
+	 * from this adapter is important if you do not wan't to force
+	 * the translation of a document that has not yet been translated</p>
+	 * 
+	 * @return <code>true</code> if {@link #getJSPTranslation()} has
+	 * been called on this adapter already, <code>false</code> otherwise
+	 */
+	public boolean hasTranslation() {
+		return fJSPTranslation != null;
+	}
 
 	JSPTranslator createTranslator() {
 		return new JSPTranslator();
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapterFactory.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapterFactory.java
index dbe0b4e..52cac51 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapterFactory.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationAdapterFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,8 +13,8 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
 
 /**
@@ -25,6 +25,7 @@
  */
 public class JSPTranslationAdapterFactory extends AbstractAdapterFactory {
 
+	/** the adapter associated with this factory */
 	private JSPTranslationAdapter fAdapter = null;
 
 	// for debugging
@@ -34,13 +35,20 @@
 		super(IJSPTranslation.class, true);
 	}
 
-	public INodeAdapterFactory copy() {
-		return new JSPTranslationAdapterFactory();
-	}
 
 	protected INodeAdapter createAdapter(INodeNotifier target) {
 		if (target instanceof IDOMNode && fAdapter == null) {
-			fAdapter = new JSPTranslationAdapter(((IDOMNode) target).getModel());
+			/* attempt to load externalized translator and create adapter from it
+			 * else create new adapter */
+			IDOMModel model = ((IDOMNode) target).getModel();
+			
+			JSPTranslator translator = JSPTranslatorPersister.getPersistedTranslator(model);
+			if(translator != null) {
+				fAdapter = new JSPTranslationAdapter(model, translator);
+			} else {
+				fAdapter= new JSPTranslationAdapter(model);
+			}
+
 			if(DEBUG) {
 				System.out.println("(+) JSPTranslationAdapterFactory [" + this + "] created adapter: " + fAdapter); //$NON-NLS-1$ //$NON-NLS-2$
 			}
@@ -50,12 +58,13 @@
 
 
 	public void release() {
-		if (fAdapter != null) {
+		if(fAdapter != null) {
 			if(DEBUG) {
 				System.out.println("(-) JSPTranslationAdapterFactory [" + this + "] releasing adapter: " + fAdapter); //$NON-NLS-1$ //$NON-NLS-2$
 			}
 			fAdapter.release();
 		}
+	
 		super.release();
 	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationExtension.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationExtension.java
index 72ed408..9184076 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationExtension.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslationExtension.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -92,6 +92,13 @@
 		addPositionsToDocuments();
 	}
 
+	public void retranslate(IDocument javaDocument, JSPTranslator translator) {
+		fJavaDocument = javaDocument;
+		retranslate(translator);
+
+		addPositionsToDocuments();
+	}
+
 	public IDocument getJspDocument() {
 		return fJspDocument;
 	}
@@ -357,8 +364,10 @@
 		if (edits.length == 0)
 			return new MultiTextEdit();
 
-		IRegion region = TextEdit.getCoverage(edits);
-		MultiTextEdit multiEdit = new MultiTextEdit(region.getOffset(), region.getLength());
+		/* should not specify a limited region because other edits outside
+		 * these original edits might be added later.
+		 */
+		MultiTextEdit multiEdit = new MultiTextEdit();
 		for (int i = 0; i < edits.length; i++) {
 			addToMultiEdit(edits[i], multiEdit);
 		}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
index b200937..cb4f04d 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,15 +7,18 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - contributions for bug 150794
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -29,11 +32,10 @@
 
 import javax.servlet.jsp.tagext.VariableInfo;
 
-import org.eclipse.core.filebuffers.FileBuffers;
 import org.eclipse.core.filebuffers.ITextFileBuffer;
-import org.eclipse.core.filebuffers.ITextFileBufferManager;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
@@ -42,7 +44,6 @@
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.QualifiedName;
@@ -61,10 +62,10 @@
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
 import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache;
 import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache.PropertyGroup;
-import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
 import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
 import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
+import org.eclipse.jst.jsp.core.internal.taglib.CustomTag;
 import org.eclipse.jst.jsp.core.internal.taglib.TaglibHelper;
 import org.eclipse.jst.jsp.core.internal.taglib.TaglibHelperManager;
 import org.eclipse.jst.jsp.core.internal.taglib.TaglibVariable;
@@ -73,9 +74,8 @@
 import org.eclipse.jst.jsp.core.jspel.IJSPELTranslator;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.html.core.internal.contentmodel.JSP20Namespace;
-import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.FileBufferModelManager;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
-import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
@@ -96,58 +96,143 @@
 import com.ibm.icu.util.StringTokenizer;
 
 /**
- * Translates a JSP document into a HttpServlet. Keeps two way mapping from
+ * Translates a JSP document into a HttpServlet subclass. Keeps two way mapping from
  * Java translation to the original JSP source, which can be obtained through
  * getJava2JspRanges() and getJsp2JavaRanges().
  */
-public class JSPTranslator {
-
-	// the name of the element in the extension point
+public class JSPTranslator implements Externalizable {
+	/**
+	 * <p>This value should be incremented if any of the following methods change:
+	 * <ul>
+	 * <li>{@link #writeExternal(ObjectOutput)}</li>
+	 * <li>{@link #readExternal(ObjectInput)}</li>
+	 * <li>{@link #writeString(ObjectOutput, String)}</li>
+	 * <li>{@link #readString(ObjectInput)}</li>
+	 * <li>{@link #writeRanges(ObjectOutput, HashMap)}</li>
+	 * <li>{@link #readRanges(ObjectInput)}</li>
+	 * </ul>
+	 * 
+	 * This is because if any of these change then previously externalized {@link JSPTranslator}s
+	 * will no longer be able to be read by the new implementation.  This value is used by
+	 * the {@link Externalizable} API automatically to determine if the file being read is of the
+	 * correct version to be read by the current implementation of the {@link JSPTranslator}</p>
+	 * 
+	 * @see #writeExternal(ObjectOutput)
+	 * @see #readExternal(ObjectInput)
+	 * @see #writeString(ObjectOutput, String)
+	 * @see #readString(ObjectInput)
+	 * @see #writeRanges(ObjectOutput, HashMap)
+	 * @see #readRanges(ObjectInput)
+	 */
+	private static final long serialVersionUID = 2L;
+	
+	/** for debugging */
+	private static final boolean DEBUG = Boolean.valueOf(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspjavamapping")).booleanValue(); //$NON-NLS-1$
+	
+	/** handy plugin ID constant */
+	private static final String JSP_CORE_PLUGIN_ID = "org.eclipse.jst.jsp.core"; //$NON-NLS-1$
+	
+	// constants for reading extension point
+	/** Default EL Translator extension ID */
+	private static final String DEFAULT_JSP_EL_TRANSLATOR_ID = "org.eclipse.jst.jsp.defaultJSP20"; //$NON-NLS-1$
+	
+	/** the name of the element in the extension point */
 	private static final String EL_TRANSLATOR_EXTENSION_NAME = "elTranslator"; //$NON-NLS-1$
-
+	
+	/** the name of the property in the extension point */
 	private static final String ELTRANSLATOR_PROP_NAME = "ELTranslator"; //$NON-NLS-1$
 
-	// Default EL Translator
-	private static final String DEFAULT_JSP_EL_TRANSLATOR_ID = "org.eclipse.jst.jsp.defaultJSP20"; //$NON-NLS-1$
-
-	// handy plugin ID constant
-	private static final String JSP_CORE_PLUGIN_ID = "org.eclipse.jst.jsp.core"; //$NON-NLS-1$
-
-	// for debugging
-	private static final boolean DEBUG = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspjavamapping")); //$NON-NLS-1$  //$NON-NLS-2$
-	private static final boolean DEBUG_SAVE_OUTPUT = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jsptranslationstodisk")); //$NON-NLS-1$  //$NON-NLS-2$
-
-	private IJSPELTranslator fELTranslator = null;
-
+	
+	// these constants are commonly used strings during translation
+	/** end line characters */
 	public static final String ENDL = "\n"; //$NON-NLS-1$
-
-	String fClassHeader = null;
-	String fClassname = null;
-
-	String fImplicitImports = null;
-
-	String fServiceHeader = null;
-
-	private String fSessionVariableDeclaration = "javax.servlet.http.HttpSession session = null;" + ENDL; //$NON-NLS-1$
-	private String fFooter = "}}"; //$NON-NLS-1$
-	private String fException = "Throwable exception = null;"; //$NON-NLS-1$
-	public static final String EXPRESSION_PREFIX = "out.print(\"\"+"; //$NON-NLS-1$
+	
+	/** session variable declaration */
+	private static final String SESSION_VARIABLE_DECLARATION = "javax.servlet.http.HttpSession session = pageContext.getSession();" + ENDL; //$NON-NLS-1$
+	
+	/** footer text */
+	private static final String FOOTER = "}}"; //$NON-NLS-1$
+	
+	/** exception declaration */
+	private static final String EXCEPTION = "Throwable exception = null;"; //$NON-NLS-1$
+	
+	/** expression prefix */
+	public static final String EXPRESSION_PREFIX = "out.print("; //$NON-NLS-1$
+	
+	/** expression suffix */
 	public static final String EXPRESSION_SUFFIX = ");"; //$NON-NLS-1$
+	
+	/** try/catch start */
+	private static final String TRY_CATCH_START = ENDL + "try {" + ENDL; //$NON-NLS-1$
+	
+	/** try/catch end */
+	private static final String TRY_CATCH_END = " } catch (java.lang.Exception e) {} " + ENDL; //$NON-NLS-1$
+	
+	/** JSP tag name prefix */
+	static final String JSP_PREFIX = "jsp:"; //$NON-NLS-1$
+	
+	
+	// these constants are to keep track of what type of code is currently being translated
+	/** code in question is standard JSP */
+	protected final static int STANDARD_JSP = 0;
+	
+	/** code in question is embedded (JSP as an attribute or within comment tags) */
+	protected final static int EMBEDDED_JSP = 1;
+	
+	/** code in question is a JSP declaration */
+	protected final static int DECLARATION = 2;
+	
+	/** code in question is a JSP expression */
+	protected final static int EXPRESSION = 4;
+	
+	/** code in question is a JSP scriptlet */
+	protected final static int SCRIPTLET = 8;
+	
+	
+	// strings specific to this translation
+	/** translated class header */
+	String fClassHeader = null;
+	
+	/** translated class name */
+	String fClassname = null;
+	
+	/** translated class super class */
 	String fSuperclass = null;
 
-	private String fTryCatchStart = ENDL + "try {" + ENDL; //$NON-NLS-1$
-	private List fTranslationProblems = new ArrayList();
-	private String fTryCatchEnd = " } catch (java.lang.Exception e) {} " + ENDL; //$NON-NLS-1$
+	/** translated class imports */
+	String fImplicitImports = null;
 
+	/** translated class service header */
+	String fServiceHeader = null;
+	
+	/** translated user defined imports */
+	private StringBuffer fUserImports = new StringBuffer();
+	
+	//translation specific state
+	/** {@link IDOMModel} for the JSP file being translated */
+	IDOMModel fStructuredModel = null;
+	
+	/** {@link IStructuredDocument} for the JSP file being translated */
+	IStructuredDocument fStructuredDocument = null;
+	
+	/** the EL translator */
+	private IJSPELTranslator fELTranslator = null;
+	
+	/** reported translation problems */
+	private List fTranslationProblems = new ArrayList();
+	
 	/** fSourcePosition = position in JSP source */
 	private int fSourcePosition = -1;
+	
 	/** fRelativeOffest = offset in the buffer there the cursor is */
 	private int fRelativeOffset = -1;
+	
 	/** fCursorPosition = offset in the translated java document */
 	private int fCursorPosition = -1;
 
 	/** some page directive attributes */
-	private boolean fIsErrorPage, fCursorInExpression = false;
+	private boolean fIsErrorPage = false;
+	private boolean fCursorInExpression = false;
 	private boolean fIsInASession = true;
 
 	/** user java code in body of the service method */
@@ -157,36 +242,23 @@
 	/** user defined vars declared in the beginning of the class */
 	private StringBuffer fUserDeclarations = new StringBuffer();
 
-	/** user defined imports */
-	private StringBuffer fUserImports = new StringBuffer();
-
 	/**
 	 * A map of tag names to tag library variable information; used to store
 	 * the ones needed for AT_END variable support.
 	 */
 	private StackMap fTagToVariableMap = null;
+	private Stack fUseBeansStack = new Stack();
 
-	private StringBuffer fResult; // the final traslated java document
-	// string buffer
-	private StringBuffer fCursorOwner = null; // the buffer where the cursor
-	// is
+	/** the final translated java document */
+	private StringBuffer fResult;
+	
+	/** the buffer where the cursor is */
+	private StringBuffer fCursorOwner = null;
 
-	private IDOMModel fStructuredModel = null;
-	private IStructuredDocument fStructuredDocument = null;
 	private IStructuredDocumentRegion fCurrentNode;
-	private boolean fInCodeRegion = false; // flag for if cursor is in the
-	// current region being translated
-
-	/**
-	 * these constants are to keep track of whether the code in question is
-	 * embedded (JSP as an attribute or within comment tags) or is just
-	 * standard JSP code, or identifies if it's an expression
-	 */
-	protected final static int STANDARD_JSP = 0;
-	protected final static int EMBEDDED_JSP = 1;
-	protected final static int DECLARATION = 2;
-	protected final static int EXPRESSION = 4;
-	protected final static int SCRIPTLET = 8;
+	
+	/** flag for if the cursor is in the current regionb eing translated */
+	private boolean fInCodeRegion = false;
 
 	/** used to avoid infinite looping include files */
 	private Stack fIncludes = null;
@@ -239,19 +311,38 @@
 	 */
 	private StringBuffer fJspTextBuffer = new StringBuffer();
 
-
-	/**
-	 * List of EL problems to be translated
-	 */
-	private ArrayList fELProblems = new ArrayList();
-
-	/**
-	 * EL Translator ID
-	 */
+	/** EL Translator ID (pluggable) */
 	private String fELTranslatorID;
 
+	/**
+	 * <code>true</code> if code has been found, such as HTML tags, that is not translated
+	 * <code>false</code> otherwise.  Useful for deciding if a place holder needs to be
+	 * written to translation
+	 */
+	private boolean fFoundNonTranslatedCode;
+
+	/**
+	 * <code>true</code> if code has been translated for the current region,
+	 * <code>false</code> otherwise
+	 */
+	private boolean fCodeTranslated;
+
+	/**
+	 * A structure for holding a region collection marker and list of variable
+	 * information. The region can be used later for positioning validation
+	 * messages.
+	 */
+	static class RegionTags {
+		ITextRegionCollection region;
+		CustomTag tag;
+
+		RegionTags(ITextRegionCollection region, CustomTag tag) {
+			this.region = region;
+			this.tag = tag;
+		}
+	}
+
 	public JSPTranslator() {
-		super();
 		init();
 	}
 
@@ -374,7 +465,7 @@
 
 	/**
 	 * @param node
-	 * @return
+	 * @return the simple class name, not fully qualified
 	 */
 	private String createClassname(IDOMNode node) {
 		String classname = ""; //$NON-NLS-1$
@@ -496,7 +587,7 @@
 	/**
 	 * Reinitialize some fields
 	 */
-	private void reset() {
+	void reset() {
 
 		// reset progress monitor
 		if (fProgressMonitor != null)
@@ -508,6 +599,7 @@
 		fCursorPosition = -1;
 
 		fIsErrorPage = fCursorInExpression = false;
+		fIsInASession = true;
 
 		fUserCode = new StringBuffer();
 		fUserDeclarations = new StringBuffer();
@@ -540,8 +632,9 @@
 		fIncludedPaths.clear();
 
 		fJspTextBuffer = new StringBuffer();
-
-		fELProblems = new ArrayList();
+		
+		fFoundNonTranslatedCode = false;
+		fCodeTranslated = false;
 
 	}
 
@@ -551,14 +644,18 @@
 	 */
 	public final StringBuffer getEmptyTranslation() {
 		reset();
-		buildResult();
+		buildResult(true);
 		return getTranslation();
 	}
 
 	/**
-	 * put the final java document together
+	 * <p>put the final java document together</p>
+	 * 
+	 * @param updateRanges <code>true</code> if the ranges need to be updated as the result
+	 * is built, <code>false</code> if the ranges have already been updated.  This is useful
+	 * if building a result from a persisted {@link JSPTranslator}.
 	 */
-	private final void buildResult() {
+	private final void buildResult(boolean updateRanges) {
 		// to build the java document this is the order:
 		// 
 		// + default imports
@@ -571,11 +668,9 @@
 		// + user code
 		// + try/catch end
 		// + service method footer
-		fResult = new StringBuffer(fImplicitImports.length() + fUserImports.length() + fClassHeader.length() + fUserDeclarations.length() + fServiceHeader.length() + fTryCatchStart.length() // try/catch
-					// start
-					+ fUserCode.length() + fTryCatchEnd.length() // try/catch
-					// end
-					+ fFooter.length());
+		fResult = new StringBuffer(fImplicitImports.length() + fUserImports.length() + fClassHeader.length() +
+				fUserDeclarations.length() + fServiceHeader.length() + TRY_CATCH_START.length()
+				+ fUserCode.length() + TRY_CATCH_END.length() + FOOTER.length());
 
 		int javaOffset = 0;
 
@@ -583,7 +678,9 @@
 		javaOffset += fImplicitImports.length();
 
 		// updateRanges(fIndirectImports, javaOffset);
-		updateRanges(fImportRanges, javaOffset);
+		if(updateRanges) {
+			updateRanges(fImportRanges, javaOffset);
+		}
 		// user imports
 		append(fUserImports);
 		javaOffset += fUserImports.length();
@@ -594,12 +691,16 @@
 		fResult.append(fSuperclass + "{" + ENDL); //$NON-NLS-1$
 		javaOffset += fSuperclass.length() + 2;
 
-		updateRanges(fDeclarationRanges, javaOffset);
+		if(updateRanges) {
+			updateRanges(fDeclarationRanges, javaOffset);
+		}
 		// user declarations
 		append(fUserDeclarations);
 		javaOffset += fUserDeclarations.length();
 
-		updateRanges(fUserELRanges, javaOffset);
+		if(updateRanges) {
+			updateRanges(fUserELRanges, javaOffset);
+		}
 		append(fUserELExpressions);
 		javaOffset += fUserELExpressions.length();
 
@@ -607,32 +708,34 @@
 		javaOffset += fServiceHeader.length();
 		// session participant
 		if (fIsInASession) {
-			fResult.append(fSessionVariableDeclaration);
-			javaOffset += fSessionVariableDeclaration.length();
+			fResult.append(SESSION_VARIABLE_DECLARATION);
+			javaOffset += SESSION_VARIABLE_DECLARATION.length();
 		}
 		// error page
 		if (fIsErrorPage) {
-			fResult.append(fException);
-			javaOffset += fException.length();
+			fResult.append(EXCEPTION);
+			javaOffset += EXCEPTION.length();
 		}
 
 
-		fResult.append(fTryCatchStart);
-		javaOffset += fTryCatchStart.length();
+		fResult.append(TRY_CATCH_START);
+		javaOffset += TRY_CATCH_START.length();
 
-		updateRanges(fCodeRanges, javaOffset);
+		if(updateRanges) {
+			updateRanges(fCodeRanges, javaOffset);
+		}
 
 		// user code
 		append(fUserCode);
 		javaOffset += fUserCode.length();
 
 
-		fResult.append(fTryCatchEnd);
-		javaOffset += fTryCatchEnd.length();
+		fResult.append(TRY_CATCH_END);
+		javaOffset += TRY_CATCH_END.length();
 
 		// footer
-		fResult.append(fFooter);
-		javaOffset += fFooter.length();
+		fResult.append(FOOTER);
+		javaOffset += FOOTER.length();
 
 		fJava2JspRanges.putAll(fImportRanges);
 		fJava2JspRanges.putAll(fDeclarationRanges);
@@ -767,29 +870,6 @@
 			Logger.log(Logger.INFO_DEBUG, debugString.toString());
 		}
 
-		if (DEBUG_SAVE_OUTPUT) {
-			IProject project = getFile().getProject();
-			String shortenedClassname = StringUtils.replace(getFile().getName(), ".", "_");
-			String filename = shortenedClassname + ".java";
-			IPath path = project.getFullPath().append("src/" + filename);
-			try {
-				IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-				if (!file.exists()) {
-					file.create(new ByteArrayInputStream(new byte[0]), true, new NullProgressMonitor());
-				}
-				ITextFileBufferManager textFileBufferManager = FileBuffers.getTextFileBufferManager();
-				textFileBufferManager.connect(path, new NullProgressMonitor());
-				ITextFileBuffer javaOutputBuffer = textFileBufferManager.getTextFileBuffer(path);
-				javaOutputBuffer.getDocument().set(StringUtils.replace(fResult.toString(), getClassname(), shortenedClassname));
-				javaOutputBuffer.commit(new NullProgressMonitor(), true);
-				textFileBufferManager.disconnect(path, new NullProgressMonitor());
-			}
-			catch (Exception e) {
-				// this is just for debugging, ignore
-			}
-			System.out.println("Updated translation: " + path);
-		}
-
 		return fResult;
 	}
 
@@ -807,112 +887,206 @@
 		return fJspTextBuffer.toString();
 	}
 
-	/**
-	 * @deprecated
-	 * @param tagToAdd
-	 */
-	protected void addTaglibVariables(String tagToAdd) {
-		addTaglibVariables(tagToAdd, getCurrentNode());
-	}
-
+	
 	protected void addTaglibVariables(String tagToAdd, ITextRegionCollection customTag) {
+		addTaglibVariables(tagToAdd, customTag, -1);
+	}
+	/**
+	 * Add the server-side scripting variables used by this tag, along with
+	 * any scoping.
+	 * 
+	 * @param tagToAdd
+	 * @param customTag
+	 */
+	protected void addTaglibVariables(String tagToAdd, ITextRegionCollection customTag, int index) {
+		if (customTag.getFirstRegion().getType().equals(DOMRegionContext.XML_TAG_OPEN)) {
+			/*
+			 * Start tag
+			 */
+			addStartTagVariable(tagToAdd, customTag,index);
+		}
+		else if (customTag.getFirstRegion().getType().equals(DOMRegionContext.XML_END_TAG_OPEN)) {
+			/*
+			 * End tag
+			 */
+			addEndTagVariable(tagToAdd, customTag);
+		}
+	}
+	
+	private void addEndTagVariable(String tagToAdd, ITextRegionCollection customTag){
+		IFile f = getFile();
+		if (f == null || !f.exists())
+			return;
+		String decl = ""; //$NON-NLS-1$
+		RegionTags regionTag = (RegionTags) fTagToVariableMap.pop(tagToAdd);
+		if (regionTag != null) {
+			// even an empty array will indicate a need for a closing brace
+			TaglibVariable[] taglibVars = regionTag.tag.getTagVariables();
+			StringBuffer text = new StringBuffer();
+			if (regionTag.tag.isIterationTag())
+				doAfterBody(text, regionTag);
+			text.append("} // </"); //$NON-NLS-1$
+			text.append(tagToAdd);
+			text.append(">\n"); //$NON-NLS-1$
+			appendToBuffer(text.toString(), fUserCode, false, customTag); //$NON-NLS-1$
+			for (int i = 0; i < taglibVars.length; i++) {
+				if (taglibVars[i].getScope() == VariableInfo.AT_END) {
+					decl = taglibVars[i].getDeclarationString();
+					appendToBuffer(decl, fUserCode, false, customTag);
+				}
+			}
+		}
+		else {
+			/*
+			 * Since something should have been in the map because of a
+			 * start tag, its absence now means an unbalanced end tag.
+			 * Extras will be checked later to flag unbalanced start tags.
+			 */
+			IJSPProblem missingStartTag = createJSPProblem(IJSPProblem.StartCustomTagMissing, IJSPProblem.F_PROBLEM_ID_LITERAL, NLS.bind(JSPCoreMessages.JSPTranslator_4, tagToAdd), customTag.getStartOffset(), customTag.getEndOffset());
+			fTranslationProblems.add(missingStartTag);
+		}
+	}
+	private void addStartTagVariable(String tagToAdd,ITextRegionCollection customTag, int index){
 		IFile f = getFile();
 
 		if (f == null || !f.exists())
 			return;
-
 		TaglibHelper helper = TaglibHelperManager.getInstance().getTaglibHelper(f);
-		/*
-		 * Variables can declare as available when NESTED, AT_BEGIN, or
-		 * AT_END. For AT_END variables, store the entire list of variables in
-		 * the map field so it can be used on the end tag.
-		 */
 		String decl = ""; //$NON-NLS-1$
-		if (customTag.getFirstRegion().getType().equals(DOMRegionContext.XML_TAG_OPEN)) {
-			TaglibVariable[] taglibVars = helper.getTaglibVariables(tagToAdd, getStructuredDocument(), customTag);
-			fTranslationProblems.addAll(helper.getProblems(f.getFullPath()));
-			/*
-			 * These loops are duplicated intentionally to keep the nesting
-			 * scoped variables from interfering with the others
-			 */
-			for (int i = 0; i < taglibVars.length; i++) {
-				if (taglibVars[i].getScope() == VariableInfo.AT_BEGIN) {
-					decl = taglibVars[i].getDeclarationString();
-					appendToBuffer(decl, fUserCode, false, customTag);
-				}
-				if (taglibVars[i].getScope() == VariableInfo.AT_END) {
-					decl = taglibVars[i].getDeclarationString();
-					fTagToVariableMap.push(tagToAdd, taglibVars);
-				}
+		List problems = new ArrayList();
+		CustomTag tag = helper.getCustomTag(tagToAdd, getStructuredDocument(), customTag, problems);
+		TaglibVariable[] taglibVars = tag.getTagVariables();
+		fTranslationProblems.addAll(problems);
+		/*
+		 * Add AT_BEGIN variables
+		 */
+		for (int i = 0; i < taglibVars.length; i++) {
+			if (taglibVars[i].getScope() == VariableInfo.AT_BEGIN) {
+				decl = taglibVars[i].getDeclarationString();
+				appendToBuffer(decl, fUserCode, false, customTag);
 			}
-			for (int i = 0; i < taglibVars.length; i++) {
-				if (taglibVars[i].getScope() == VariableInfo.NESTED) {
-					decl = taglibVars[i].getDeclarationString();
-					appendToBuffer("{", fUserCode, false, customTag);
-					appendToBuffer(decl, fUserCode, false, customTag);
-					fTagToVariableMap.push(tagToAdd, taglibVars);
-				}
-			}
-			if (customTag.getLastRegion().getType().equals(DOMRegionContext.XML_EMPTY_TAG_CLOSE)) {
-				/*
-				 * Process NESTED variables backwards so the scopes "unroll"
-				 * correctly.
-				 */
-				for (int i = taglibVars.length; i > 0; i--) {
-					if (taglibVars[i - 1].getScope() == VariableInfo.NESTED) {
-						appendToBuffer("}", fUserCode, false, customTag);
-					}
-				}
-				/* Treat this as the end for empty tags */
-				for (int i = 0; i < taglibVars.length; i++) {
-					if (taglibVars[i].getScope() == VariableInfo.AT_END) {
-						decl = taglibVars[i].getDeclarationString();
-						appendToBuffer(decl, fUserCode, false, customTag);
-					}
-				}
+		}
+		boolean isEmptyTag = false;
+		if (index != -1)
+			isEmptyTag= isEmptyTag(customTag, index);
+		else
+			isEmptyTag= isEmptyTag(customTag);
+		
+		/*
+		 * Add a single  { to limit the scope of NESTED variables
+		 */
+		StringBuffer text = new StringBuffer();
+		if (!isEmptyTag && tag.isIterationTag() && tag.getTagClassName() != null) {
+			text.append("\nwhile(true) "); //$NON-NLS-1$
+		}
+		text.append("{ // <"); //$NON-NLS-1$
+		text.append(tagToAdd);
+		if (isEmptyTag)
+			text.append("/>\n"); //$NON-NLS-1$
+		else
+			text.append(">\n"); //$NON-NLS-1$
+
+		appendToBuffer(text.toString(), fUserCode, false, customTag); //$NON-NLS-1$
+
+		for (int i = 0; i < taglibVars.length; i++) {
+			if (taglibVars[i].getScope() == VariableInfo.NESTED) {
+				decl = taglibVars[i].getDeclarationString();
+				appendToBuffer(decl, fUserCode, false, customTag);
 			}
 		}
 		/*
-		 * Process NESTED variables for an end tag backwards so the scopes
-		 * "unroll" correctly.
+		 * For empty tags, add the corresponding } and AT_END variables immediately.  
 		 */
-		else if (customTag.getFirstRegion().getType().equals(DOMRegionContext.XML_END_TAG_OPEN)) {
-			TaglibVariable[] taglibVars = (TaglibVariable[]) fTagToVariableMap.pop(tagToAdd);
-			if (taglibVars != null) {
-				for (int i = taglibVars.length; i > 0; i--) {
-					if (taglibVars[i - 1].getScope() == VariableInfo.NESTED) {
-						appendToBuffer("}", fUserCode, false, customTag);
-					}
-				}
-				for (int i = 0; i < taglibVars.length; i++) {
-					if (taglibVars[i].getScope() == VariableInfo.AT_END) {
-						decl = taglibVars[i].getDeclarationString();
-						appendToBuffer(decl, fUserCode, false, customTag);
-					}
+		if (isEmptyTag) {
+			text = new StringBuffer();
+			text.append("} // <"); //$NON-NLS-1$
+			text.append(tagToAdd);
+			text.append("/>\n"); //$NON-NLS-1$
+			appendToBuffer(text.toString(), fUserCode, false, customTag); //$NON-NLS-1$
+			/* Treat this as the end for empty tags */
+			for (int i = 0; i < taglibVars.length; i++) {
+				if (taglibVars[i].getScope() == VariableInfo.AT_END) {
+					decl = taglibVars[i].getDeclarationString();
+					appendToBuffer(decl, fUserCode, false, customTag);
 				}
 			}
 		}
+		else {
+			/*
+			 * For non-empty tags, remember the variable information
+			 */
+			fTagToVariableMap.push(tagToAdd, new RegionTags(customTag, tag));
+		}
+		
+	}
+
+	private boolean isEmptyTag(ITextRegionCollection customTag, int index) {
+		String type = null;
+		// custom tag is embedded
+		ITextRegionList regions = customTag.getRegions();
+		ITextRegion nextRegion = regions.get(index);
+		int size = customTag.getNumberOfRegions() ;
+		type = nextRegion.getType();
+		while (index <= size && !(DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(type) || DOMRegionContext.XML_TAG_NAME.equals(type) || DOMRegionContext.XML_TAG_CLOSE.equals(type) )) {
+				nextRegion = regions.get(++index);
+				type = nextRegion.getType();
+		}
+		
+		return DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(type);
+	}
+	
+	private boolean isEmptyTag(ITextRegionCollection customTag) {
+		ITextRegion lastRegion = customTag.getLastRegion();
+		// custom tag is embedded
+		if (customTag instanceof ITextRegionContainer) {
+			ITextRegionList regions = customTag.getRegions();
+			int size = customTag.getNumberOfRegions() - 1;
+			while (size > 0 && !(DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(lastRegion.getType()) || DOMRegionContext.XML_TAG_NAME.equals(lastRegion.getType()) || DOMRegionContext.XML_TAG_CLOSE.equals(lastRegion.getType()) )) {
+				lastRegion = regions.get(--size);
+			}
+		}
+		
+		return DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(lastRegion.getType());
+	}
+
+	private void addCustomTaglibVariables(String tagToAdd, ITextRegionCollection customTag, ITextRegion prevRegion, int index) {
+		//Can't judge by first region as start and end tag are part of same ContextRegionContainer		
+		if (prevRegion != null && prevRegion.getType().equals(DOMRegionContext.XML_END_TAG_OPEN)) {
+			/*
+			 * End tag
+			 */
+			addEndTagVariable(tagToAdd, customTag);
+		}
+		else if (prevRegion != null && prevRegion.getType().equals(DOMRegionContext.XML_TAG_OPEN)) {
+			/*
+			 * Start tag
+			 */
+			addStartTagVariable(tagToAdd,customTag, index);
+		}
 	}
 
+	private void doAfterBody(StringBuffer buffer, RegionTags regionTag) {
+		buffer.append("\tif ( (new "); //$NON-NLS-1$
+		buffer.append(regionTag.tag.getTagClassName());
+		buffer.append("()).doAfterBody() != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)\n\t\tbreak;\n"); //$NON-NLS-1$
+	}
+
+	/**
+	 * @return the workspace file for this model, null otherwise
+	 */
 	private IFile getFile() {
 		IFile f = null;
-		IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(getStructuredDocument());
-		try {
-			if (sModel != null) {
-				Path path = new Path(sModel.getBaseLocation());
-				if (path.segmentCount() > 1) {
-					f = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-				}
-				if (f != null && f.isAccessible()) {
-					return f;
-				}
+		ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(getStructuredDocument());
+		if (buffer != null) {
+			IPath path = buffer.getLocation();
+			if (path.segmentCount() > 1) {
+				f = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
 			}
-			return null;
+			if (f != null && f.isAccessible()) {
+				return f;
+			}
 		}
-		finally {
-			if (sModel != null)
-				sModel.releaseFromRead();
-		}
+		return null;
 	}
 
 	/*
@@ -925,7 +1099,7 @@
 	}
 
 	/**
-	 * /* the main control loop for translating the document, driven by the
+	 * the main control loop for translating the document, driven by the
 	 * structuredDocument nodes
 	 */
 	public void translate() {
@@ -940,7 +1114,8 @@
 		setCurrentNode(fStructuredDocument.getFirstStructuredDocumentRegion());
 
 		while (getCurrentNode() != null && !isCanceled()) {
-
+			//no code has been translated for this region yet
+			fCodeTranslated = false;
 			// intercept HTML comment flat node
 			// also handles UNDEFINED (which is what CDATA comes in as)
 			// basically this part will handle any "embedded" JSP containers
@@ -951,18 +1126,68 @@
 				// iterate through each region in the flat node
 				translateRegionContainer(getCurrentNode(), STANDARD_JSP);
 			}
+			
+			//if no code was translated for this region then found "non translated code"
+			if(!fCodeTranslated) {
+				fFoundNonTranslatedCode = true;
+			}
+			
 			if (getCurrentNode() != null)
 				advanceNextNode();
 		}
+		
+		writePlaceHolderForNonTranslatedCode();
 
 		setCurrentNode(new ZeroStructuredDocumentRegion(fStructuredDocument, fStructuredDocument.getLength()));
 		translateCodas();
 
-		buildResult();
+		/*
+		 * Any contents left in the map indicate start tags that never had end
+		 * tags. While the '{' that is present without the matching '}' should
+		 * cause a Java translation fault, that's not particularly helpful to
+		 * a user who may only know how to use custom tags as tags. Ultimately
+		 * unbalanced custom tags should just be reported as unbalanced tags,
+		 * and unbalanced '{'/'}' only reported when the user actually
+		 * unbalanced them with scriptlets.
+		 */
+		Iterator regionAndTaglibVariables = fTagToVariableMap.values().iterator();
+		while (regionAndTaglibVariables.hasNext()) {
+			RegionTags regionTag = (RegionTags) regionAndTaglibVariables.next();
+			ITextRegionCollection extraStartRegion = regionTag.region;
+			IJSPProblem missingEndTag = createJSPProblem(IJSPProblem.EndCustomTagMissing, IJSPProblem.F_PROBLEM_ID_LITERAL, NLS.bind(JSPCoreMessages.JSPTranslator_5,regionTag.tag.getTagName()), extraStartRegion.getStartOffset(), extraStartRegion.getEndOffset());
+			fTranslationProblems.add(missingEndTag);
 
+			StringBuffer text = new StringBuffer();
+			// Account for iteration tags that have a missing end tag
+			if (regionTag.tag.isIterationTag())
+				doAfterBody(text, regionTag);
+			text.append("} // [</"); //$NON-NLS-1$
+			text.append(regionTag.tag.getTagName());
+			text.append(">]"); //$NON-NLS-1$
+			appendToBuffer(text.toString(), fUserCode, false, fStructuredDocument.getLastStructuredDocumentRegion());
+		}
 		fTagToVariableMap.clear();
+
+		/*
+		 * Now do the same for jsp:useBean tags, whose contents get their own
+		 * { & }
+		 */
+		while (!fUseBeansStack.isEmpty()) {
+			appendToBuffer("}", fUserCode, false, fStructuredDocument.getLastStructuredDocumentRegion()); //$NON-NLS-1$
+			ITextRegionCollection extraStartRegion = (ITextRegionCollection) fUseBeansStack.pop();
+			IJSPProblem missingEndTag = createJSPProblem(IJSPProblem.UseBeanEndTagMissing, IJSPProblem.F_PROBLEM_ID_LITERAL, NLS.bind(JSPCoreMessages.JSPTranslator_5,JSP11Namespace.ElementName.USEBEAN), extraStartRegion.getStartOffset(), extraStartRegion.getEndOffset());
+			fTranslationProblems.add(missingEndTag);
+		}
+
+		buildResult(true);
 	}
 
+ 	/**
+	 * Translates a region container (and XML JSP container, or <% JSP
+	 * container). This method should only be called in this class and for
+	 * containers in the primary structured document as all buffer appends
+	 * will be direct.
+	 */
 	protected void setDocumentContent(IDocument document, InputStream contentStream, String charset) {
 		Reader in = null;
 		try {
@@ -992,9 +1217,9 @@
 	}
 
 	protected void init() {
-		fClassHeader = "public class _JSPServlet extends "; //$NON-NLS-1$
 		fClassname = "_JSPServlet"; //$NON-NLS-1$
-
+		fClassHeader = "public class " + fClassname + " extends "; //$NON-NLS-1$ //$NON-NLS-2$
+		
 		fImplicitImports = "import javax.servlet.*;" + ENDL + //$NON-NLS-1$
 					"import javax.servlet.http.*;" + ENDL + //$NON-NLS-1$
 					"import javax.servlet.jsp.*;" + ENDL + ENDL; //$NON-NLS-1$
@@ -1002,11 +1227,11 @@
 		fServiceHeader = "public void _jspService(javax.servlet.http.HttpServletRequest request," + //$NON-NLS-1$
 					" javax.servlet.http.HttpServletResponse response)" + ENDL + //$NON-NLS-1$
 					"\t\tthrows java.io.IOException, javax.servlet.ServletException {" + ENDL + //$NON-NLS-1$
-					"javax.servlet.jsp.PageContext pageContext = null;" + ENDL + //$NON-NLS-1$
-					"javax.servlet.ServletContext application = null;" + ENDL + //$NON-NLS-1$
-					"javax.servlet.ServletConfig config = null;" + ENDL + //$NON-NLS-1$ 
-					"javax.servlet.jsp.JspWriter out = null;" + ENDL + //$NON-NLS-1$
-					"Object page = null;" + ENDL; //$NON-NLS-1$
+					"javax.servlet.jsp.PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, JspWriter.DEFAULT_BUFFER, true);" + ENDL + //$NON-NLS-1$
+					"javax.servlet.ServletContext application = pageContext.getServletContext();" + ENDL + //$NON-NLS-1$
+					"javax.servlet.ServletConfig config = pageContext.getServletConfig();" + ENDL + //$NON-NLS-1$ 
+					"javax.servlet.jsp.JspWriter out = pageContext.getOut();" + ENDL + //$NON-NLS-1$
+					"Object page = this;" + ENDL; //$NON-NLS-1$
 		fSuperclass = "javax.servlet.http.HttpServlet"; //$NON-NLS-1$
 	}
 
@@ -1052,20 +1277,14 @@
 
 		ITextRegionCollection containerRegion = container;
 
-		// custom tags need their own scope {}
-		handleScopingIfNecessary(containerRegion);
-
 		Iterator regions = containerRegion.getRegions().iterator();
 		ITextRegion region = null;
 		while (regions.hasNext()) {
-
 			region = (ITextRegion) regions.next();
-
 			String type = region.getType();
 
-			// content assist was not showing up in JSP inside a javascript
-			// region
-			if (type == DOMRegionContext.BLOCK_TEXT) {
+			// content assist was not showing up in JSP inside a javascript region
+			if (DOMRegionContext.BLOCK_TEXT == type) {
 				// check if it's nested jsp in a script tag...
 				if (region instanceof ITextRegionContainer) {
 					// pass in block text's container & iterator
@@ -1073,6 +1292,25 @@
 					translateJSPNode(region, regionIterator, type, EMBEDDED_JSP);
 				}
 				else {
+					//be sure to combine all of the text from the block region
+					StringBuffer fullText = new StringBuffer(containerRegion.getFullText(region));
+					while(regions.hasNext()) {
+						region = (ITextRegion)regions.next();
+						if (region instanceof ITextRegionContainer) {
+							// pass in block text's container & iterator
+							Iterator regionIterator = ((ITextRegionCollection) region).getRegions().iterator();
+							translateJSPNode(region, regionIterator, type, EMBEDDED_JSP);
+						}
+						
+						if(region.getType() == DOMRegionContext.BLOCK_TEXT) {
+							fullText.append(containerRegion.getFullText(region));
+						} else {
+							//update type for when we exit if statement for BLOCK_TEXT
+							type = region.getType();
+							break;
+						}
+					}
+					
 					/**
 					 * LIMITATION - Normally the script content within a
 					 * script tag is a single document region with a single
@@ -1096,7 +1334,7 @@
 					// PARTITIONING HAS
 					// SUPPORT FOR NESTED XML-JSP
 					// CMVC 241882
-					decodeScriptBlock(containerRegion.getFullText(region), containerRegion.getStartOffset());
+					decodeScriptBlock(fullText.toString(), containerRegion.getStartOffset());
 					// ////////////////////////////////////////////////////////////////////////////////
 				}
 			}
@@ -1113,97 +1351,16 @@
 			else if (type != null && (type == DOMRegionContext.XML_TAG_OPEN || type == DOMRegionContext.XML_END_TAG_OPEN)) {
 				translateXMLNode(containerRegion, regions);
 			}
-		}
-		// }
-	}
-
-	private void handleScopingIfNecessary(ITextRegionCollection containerRegion) {
-		/*
-		 * 199047 - Braces missing from translation of custom tags not
-		 * defining variables
-		 */
-
-		// code within a custom tag gets its own scope
-		// so if we encounter a start of a custom tag, we add '{'
-		// and for the end of a custom tag we add '}'
-		if (containerRegion.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN) {
-			// don't add '{' if it's a self closing tag
-			if (!isSelfClosingTag(containerRegion)) {
-				if (isCustomTag(containerRegion)) {
-					startScope();
-				}
+			else if(type != null && type == DOMRegionContext.XML_CONTENT && region instanceof ITextRegionContainer) {
+				//this case was put in to parse EL that is not in an attribute
+				translateXMLContent((ITextRegionContainer)region);
+			}
+			//the end tags of these regions are "translated" in a sense
+			else if(type == DOMJSPRegionContexts.JSP_DIRECTIVE_CLOSE ||
+					type == DOMJSPRegionContexts.JSP_CLOSE) {
+				this.fCodeTranslated = true;
 			}
 		}
-		else if (containerRegion.getFirstRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN) {
-			if (isCustomTag(containerRegion)) {
-				endScope();
-			}
-		}
-	}
-
-	private void startScope() {
-		// fScopeDepth++;
-		StringBuffer text = new StringBuffer();
-		// for(int i=0; i<fScopeDepth; i++) text.append(" "); //$NON-NLS-1$
-		text.append("{ // <"); //$NON-NLS-1$
-		text.append(getRegionName(fCurrentNode));
-		text.append(">\n"); //$NON-NLS-1$
-		appendToBuffer(text.toString(), fUserCode, false, fCurrentNode); //$NON-NLS-1$
-	}
-
-	private void endScope() {
-		StringBuffer text = new StringBuffer();
-		text.append("} // </"); //$NON-NLS-1$
-		text.append(getRegionName(fCurrentNode));
-		text.append(">\n"); //$NON-NLS-1$
-		appendToBuffer(text.toString(), fUserCode, false, fCurrentNode); //$NON-NLS-1$
-	}
-
-	private boolean isSelfClosingTag(ITextRegionCollection containerRegion) {
-
-		if (containerRegion == null)
-			return false;
-
-		ITextRegionList regions = containerRegion.getRegions();
-		ITextRegion r = regions.get(regions.size() - 1);
-		return r.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE;
-	}
-
-	private boolean isCustomTag(ITextRegionCollection containerRegion) {
-		String tagName = getRegionName(containerRegion);
-
-		if (tagName == null)
-			return false;
-
-		JSPSourceParser parser = (JSPSourceParser) fStructuredDocument.getParser();
-		int colonIndex = tagName.indexOf(":");
-		if (colonIndex > 0) {
-			String prefix = tagName.substring(0, colonIndex);
-			if (prefix.equals("jsp")) { //$NON-NLS-1$
-				return false;
-			}
-			TagMarker[] prefixes = (TagMarker[]) parser.getNestablePrefixes().toArray(new TagMarker[0]);
-			for (int i = 0; i < prefixes.length; i++) {
-				if (prefix.equals(prefixes[i].getTagName())) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	private String getRegionName(ITextRegionCollection containerRegion) {
-		ITextRegionList regions = containerRegion.getRegions();
-		ITextRegion nameRegion = null;
-		for (int i = 0; i < regions.size(); i++) {
-			ITextRegion r = regions.get(i);
-			if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
-				nameRegion = r;
-				break;
-			}
-		}
-		return nameRegion != null ? containerRegion.getText(nameRegion).trim() : null;
 	}
 
 	/*
@@ -1212,7 +1369,7 @@
 	 * jsp:scriptlet, jsp:expression, and jsp:declaration @param blockText
 	 * @return
 	 */
-	private void decodeScriptBlock(String blockText, int startOfBlock) {
+	void decodeScriptBlock(String blockText, int startOfBlock) {
 		XMLJSPRegionHelper helper = new XMLJSPRegionHelper(this, false);
 		helper.addBlockMarker(new BlockMarker("jsp:scriptlet", null, DOMJSPRegionContexts.JSP_CONTENT, false)); //$NON-NLS-1$
 		helper.addBlockMarker(new BlockMarker("jsp:expression", null, DOMJSPRegionContexts.JSP_CONTENT, false)); //$NON-NLS-1$
@@ -1265,6 +1422,43 @@
 	}
 
 	/**
+	 * This currently only detects EL content and translates it,
+	 * but if other cases arise later then they could be added in here
+	 * 
+	 * @param embeddedContainer the container that may contain EL
+	 */
+	protected void translateXMLContent(ITextRegionContainer embeddedContainer) {
+		ITextRegionList embeddedRegions = embeddedContainer.getRegions();
+		int length = embeddedRegions.size();
+		for (int i = 0; i < length; i++) {
+			ITextRegion delim = embeddedRegions.get(i);
+			String type = delim.getType();
+
+			// check next region to see if it's EL content
+			if (i + 1 < length) {
+				if((type == DOMJSPRegionContexts.JSP_EL_OPEN || type == DOMJSPRegionContexts.JSP_VBL_OPEN)) {
+					ITextRegion region = null;
+					
+					int start = delim.getEnd();
+					while (++i < length) {
+						region = embeddedRegions.get(i);
+						if (region == null || !isELType(region.getType()))
+							break;
+					}
+					fLastJSPType = EXPRESSION;
+					String elText = embeddedContainer.getFullText().substring(start, (region != null ? region.getStart() : embeddedContainer.getLength() - 1));
+					translateEL(elText, embeddedContainer.getText(delim), fCurrentNode,
+							embeddedContainer.getEndOffset(delim), elText.length());
+				}
+			}
+		}
+	}
+
+	private boolean isELType(String type) {
+		return DOMJSPRegionContexts.JSP_EL_CONTENT.equals(type) || DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(type) || DOMJSPRegionContexts.JSP_EL_DQUOTE.equals(type) || DOMJSPRegionContexts.JSP_VBL_DQUOTE.equals(type) || DOMJSPRegionContexts.JSP_EL_QUOTED_CONTENT.equals(type) || DOMJSPRegionContexts.JSP_VBL_QUOTED_CONTENT.equals(type) || DOMJSPRegionContexts.JSP_EL_SQUOTE.equals(type) || DOMJSPRegionContexts.JSP_VBL_SQUOTE.equals(type);
+	}
+
+	/**
 	 * translates the various XMLJSP type nodes
 	 * 
 	 * @param regions
@@ -1281,8 +1475,8 @@
 
 			{
 				String fullTagName = container.getText(r);
-				if (fullTagName.indexOf(':') > -1) {
-					addTaglibVariables(fullTagName, container); // it
+				if (fullTagName.indexOf(':') > -1 && !fullTagName.startsWith(JSP_PREFIX)) {
+					addTaglibVariables(fullTagName, container,-1); // it
 					// may
 					// be a
 					// custom
@@ -1383,7 +1577,7 @@
 					}
 				}
 				else {
-					checkAllAttributeValueContainers(regions);
+					checkAllAttributeValueContainers(container,regions);
 				}
 			}
 		}
@@ -1394,15 +1588,25 @@
 	 * 
 	 * @param regions
 	 */
-	private void checkAllAttributeValueContainers(Iterator regions) {
+	private void checkAllAttributeValueContainers(ITextRegionCollection container, Iterator regions) {
 		// tag name is not jsp
 		// handle embedded jsp attributes...
 		ITextRegion embedded = null;
 		// Iterator attrRegions = null;
 		// ITextRegion attrChunk = null;
+		ITextRegion prevRegion = null;
 		while (regions.hasNext()) {
 			embedded = (ITextRegion) regions.next();
-			if (embedded instanceof ITextRegionContainer) {
+			if (embedded.getType() == DOMRegionContext.XML_TAG_NAME || embedded.getType() == DOMJSPRegionContexts.JSP_DIRECTIVE_NAME)
+
+			{
+				String fullTagName = container.getText(embedded);
+				if (fullTagName.indexOf(':') > -1 && !fullTagName.startsWith(JSP_PREFIX)) {
+					if (prevRegion != null)
+					addCustomTaglibVariables(fullTagName, container,prevRegion,-1); // it may be a custom tag
+				}
+			}
+				else if (embedded instanceof ITextRegionContainer) {
 				// parse out container
 
 				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=130606
@@ -1430,6 +1634,7 @@
 				// }
 				// }
 			}
+			prevRegion = embedded;
 		}
 	}
 
@@ -1477,16 +1682,21 @@
 		int end = sdr.getEndOffset();
 		String sdrText = ""; //$NON-NLS-1$
 
-		// read structured document regions until
-		// </jsp:scriptlet> or EOF
+		StringBuffer regionText = new StringBuffer();
+		// read structured document regions until </jsp:scriptlet> or EOF
 		while (sdr != null && sdr.getType() != DOMRegionContext.XML_TAG_NAME) {
 
 			// setup for next region
-			start = sdr.getStartOffset();
+			if (regionText.length() == 0)
+				start = sdr.getStartOffset();
 			sdrText = sdr.getText();
 
 			if (sdr.getType() == DOMRegionContext.XML_CDATA_TEXT) {
-
+				// Clear out the buffer
+				if (regionText.length() > 0) {
+					writeToBuffer(type, regionText.toString(), start, end);
+					regionText = new StringBuffer();
+				}
 				// just to be safe, make sure CDATA start & end are there
 				if (sdrText.startsWith("<![CDATA[") && sdrText.endsWith("]]>")) { //$NON-NLS-1$ //$NON-NLS-2$
 
@@ -1497,14 +1707,15 @@
 				}
 			}
 			else {
-
 				// handle entity references
-				sdrText = EscapedTextUtil.getUnescapedText(sdrText);
+				regionText.append(EscapedTextUtil.getUnescapedText(sdrText));
 				end = sdr.getEndOffset();
-				writeToBuffer(type, sdrText, start, end);
 			}
 			sdr = sdr.getNext();
 		}
+
+		if (regionText.length() > 0)
+			writeToBuffer(type, regionText.toString(), start, end);
 		setCurrentNode(sdr);
 		setSourceReferencePoint();
 	}
@@ -1539,6 +1750,11 @@
 				// jsp...iterate
 				// regions...
 			}
+			else if (DOMRegionContext.XML_COMMENT_TEXT.equals(commentRegion.getType())) {
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=222215
+				// support custom tags hidden in a comment region
+				decodeScriptBlock(node.getFullText(commentRegion), node.getStartOffset(commentRegion));
+			}
 		}
 	}
 
@@ -1558,7 +1774,12 @@
 				translateEmbeddedJSPInBlock((ITextRegionCollection) region, regions);
 				// ensure the rest of this method won't be called
 			}
-			if (contentRegion != null) {
+			/* NOTE: the type here is of the node preceding the current node
+			 * thus must check to see if the current node is JSP close, if it is
+			 * then the JSP is something akin to <%%> and should not be translated
+			 * (Bug 189318)
+			 */
+			if (contentRegion != null && contentRegion.getType() != DOMJSPRegionContexts.JSP_CLOSE) {
 				if (type == DOMJSPRegionContexts.JSP_EXPRESSION_OPEN) {
 					translateExpression(contentRegion);
 				}
@@ -1581,7 +1802,8 @@
 	private void translateEL(String elText, String delim, IStructuredDocumentRegion currentNode, int contentStart, int contentLength) {
 		IJSPELTranslator translator = getELTranslator();
 		if (null != translator) {
-			translator.translateEL(elText, delim, currentNode, contentStart, contentLength, fUserELExpressions, fUserELRanges, fStructuredDocument);
+			List elProblems = translator.translateEL(elText, delim, currentNode, contentStart, contentLength, fUserELExpressions, fUserELRanges, fStructuredDocument);
+			fTranslationProblems.addAll(elProblems);
 		}
 	}
 
@@ -1675,18 +1897,30 @@
 		ITextRegion delim = null;
 		ITextRegion content = null;
 		String type = null;
+		String quotetype = null;
 		for (int i = 0; i < embeddedRegions.size(); i++) {
 
 			// possible delimiter, check later
 			delim = embeddedRegions.get(i);
 			type = delim.getType();
+			if (type == DOMRegionContext.XML_TAG_NAME ) {
+				String fullTagName = embeddedContainer.getText(delim);
+				if (fullTagName.indexOf(':') > -1 && !fullTagName.startsWith(JSP_PREFIX)) {
+					ITextRegion prevRegion =null;
+					if (i>0)
+						prevRegion = embeddedRegions.get(i-1);
+					addCustomTaglibVariables(fullTagName, embeddedContainer,prevRegion,i+1); // it may be a custom tag
+				}
+			}
+			if(type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE || type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE
+				|| type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_DQUOTE || type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)
+				quotetype = type;
 
 			// check next region to see if it's content
 			if (i + 1 < embeddedRegions.size()) {
 				String regionType = embeddedRegions.get(i + 1).getType();
 				if (regionType == DOMJSPRegionContexts.JSP_CONTENT || regionType == DOMJSPRegionContexts.JSP_EL_CONTENT)
 					content = embeddedRegions.get(i + 1);
-
 			}
 
 			if (content != null) {
@@ -1702,7 +1936,7 @@
 					fLastJSPType = EXPRESSION;
 					// translateExpressionString(embeddedContainer.getText(content),
 					// fCurrentNode, contentStart, content.getLength());
-					translateExpressionString(embeddedContainer.getText(content), embeddedContainer, contentStart, content.getLength(), false);
+					translateExpressionString(embeddedContainer.getText(content), embeddedContainer, contentStart, content.getLength(), quotetype);
 				}
 				else if (type == DOMJSPRegionContexts.JSP_SCRIPTLET_OPEN) {
 					fLastJSPType = SCRIPTLET;
@@ -1853,9 +2087,9 @@
 		if (varName != null) {
 			if (isFragment) {
 				// 2.0:JSP.8.5.2
-				varType = "javax.servlet.jsp.tagext.JspFragment";
+				varType = "javax.servlet.jsp.tagext.JspFragment"; //$NON-NLS-1$
 			}
-			String declaration = new TaglibVariable(varType, varName, "", description).getDeclarationString(true, TaglibVariable.M_PRIVATE);
+			String declaration = new TaglibVariable(varType, varName, "", description).getDeclarationString(true, TaglibVariable.M_PRIVATE); //$NON-NLS-1$
 			appendToBuffer(declaration, fUserDeclarations, false, fCurrentNode);
 		}
 	}
@@ -1928,7 +2162,7 @@
 			CMDocumentTracker tracker = null;
 			while (it.hasNext()) {
 				tracker = (CMDocumentTracker) it.next();
-				addBlockMarkers(prefix + ":", tracker.getDocument());
+				addBlockMarkers(prefix + ":", tracker.getDocument()); //$NON-NLS-1$
 			}
 		}
 	}
@@ -2030,7 +2264,7 @@
 		}
 		else if (attrName.equals("session")) //$NON-NLS-1$
 		{
-			fIsInASession = "true".equalsIgnoreCase(attrValue);
+			fIsInASession = Boolean.valueOf(attrValue).booleanValue();
 		}
 		else if (attrName.equals("buffer")) //$NON-NLS-1$
 		{
@@ -2046,7 +2280,7 @@
 		}
 		else if (attrName.equals("isErrorPage")) //$NON-NLS-1$
 		{
-			fIsErrorPage = "true".equalsIgnoreCase(attrValue);
+			fIsErrorPage = Boolean.valueOf(attrValue).booleanValue();
 		}
 	}
 
@@ -2091,8 +2325,46 @@
 	}
 
 	protected void translateExpressionString(String newText, ITextRegionCollection embeddedContainer, int jspPositionStart, int jspPositionLength, boolean isIndirect) {
-		appendToBuffer(EXPRESSION_PREFIX, fUserCode, false, embeddedContainer);
-		appendToBuffer(newText, fUserCode, true, embeddedContainer, jspPositionStart, jspPositionLength, isIndirect);
+		appendToBuffer(EXPRESSION_PREFIX, fUserCode, false, embeddedContainer, true);
+		appendToBuffer(newText, fUserCode, true, embeddedContainer, jspPositionStart, jspPositionLength, isIndirect, true);
+		appendToBuffer(EXPRESSION_SUFFIX, fUserCode, false, embeddedContainer);
+	}
+	
+	protected void translateExpressionString(String newText, ITextRegionCollection embeddedContainer, int jspPositionStart, int jspPositionLength, String quotetype) {
+		if(quotetype == null || quotetype == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE ||quotetype == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE ) {
+			translateExpressionString(newText, embeddedContainer, jspPositionStart, jspPositionLength, false);
+			return;
+		}
+
+		//-- This is a quoted attribute. We need to unquote as per the JSP spec: JSP 2.0 page 1-36
+		appendToBuffer(EXPRESSION_PREFIX, fUserCode, false, embeddedContainer, true);
+
+		int length = newText.length();
+		int runStart = 0;
+		int i = 0;
+		for ( ; i < length; i++) {
+			//-- collect a new run
+			char c = newText.charAt(i);
+			if (c == '\\') {
+				//-- Escaped value. Add the run, then unescape
+				int runLength = i-runStart;
+				if (runLength > 0) {
+					appendToBuffer(newText.substring(runStart, i), fUserCode, true, embeddedContainer, jspPositionStart, runLength, true, true);
+					jspPositionStart += runLength + 1;
+					jspPositionLength -= runLength + 1;
+				}
+				runStart = ++i;
+				if (i >= length) { // Escape but no data follows?!
+					//- error.
+					break;
+				}
+				c = newText.charAt(i);				// The escaped character, copied verbatim
+			}
+		}
+		//-- Copy last-run
+		int runLength = i - runStart;
+		if (runLength > 0)
+			appendToBuffer(newText.substring(runStart, i), fUserCode, true, embeddedContainer, jspPositionStart, runLength, true, false);
 		appendToBuffer(EXPRESSION_SUFFIX, fUserCode, false, embeddedContainer);
 	}
 
@@ -2117,8 +2389,8 @@
 	// <%= %>
 	protected void translateExpression(ITextRegionCollection region) {
 		String newText = getUnescapedRegionText(region, EXPRESSION);
-		appendToBuffer(EXPRESSION_PREFIX, fUserCode, false, region);
-		appendToBuffer(newText, fUserCode, true, fCurrentNode);
+		appendToBuffer(EXPRESSION_PREFIX, fUserCode, false, region, true);
+		appendToBuffer(newText, fUserCode, true, region, true);
 		appendToBuffer(EXPRESSION_SUFFIX, fUserCode, false, region);
 	}
 
@@ -2154,6 +2426,30 @@
 		}
 		appendToBuffer(newText, buffer, addToMap, jspReferenceRegion, start, length, false);
 	}
+	
+	/**
+	 * Append using a region, probably indirect mapping (eg. <%@page
+	 * include=""%>)
+	 * 
+	 * @param newText
+	 * @param buffer
+	 * @param addToMap
+	 * @param jspReferenceRegion
+	 * @param nonl
+	 */
+	private void appendToBuffer(String newText, StringBuffer buffer, boolean addToMap, ITextRegionCollection jspReferenceRegion, boolean nonl) {
+		int start = 0, length = 0;
+		if (jspReferenceRegion != null) {
+			start = jspReferenceRegion.getStartOffset();
+			length = jspReferenceRegion.getLength();
+		}
+		appendToBuffer(newText, buffer, addToMap, jspReferenceRegion, start, length, false, nonl);
+	}
+	
+	private void appendToBuffer(String newText, StringBuffer buffer, boolean addToMap, ITextRegionCollection jspReferenceRegion, int jspPositionStart, int jspPositionLength, boolean isIndirect) {
+		appendToBuffer(newText, buffer, addToMap, jspReferenceRegion, jspPositionStart, jspPositionLength, isIndirect, false);
+	}
+
 
 	/**
 	 * Adds newText to the buffer passed in, and adds to translation mapping
@@ -2165,7 +2461,7 @@
 	 * @param buffer
 	 * @param addToMap
 	 */
-	private void appendToBuffer(String newText, StringBuffer buffer, boolean addToMap, ITextRegionCollection jspReferenceRegion, int jspPositionStart, int jspPositionLength, boolean isIndirect) {
+	private void appendToBuffer(String newText, StringBuffer buffer, boolean addToMap, ITextRegionCollection jspReferenceRegion, int jspPositionStart, int jspPositionLength, boolean isIndirect, boolean nonl) {
 
 		int origNewTextLength = newText.length();
 
@@ -2174,9 +2470,15 @@
 			return;
 
 		// add a newline so translation looks cleaner
-		if (!newText.endsWith(ENDL))
+		if (! nonl && !newText.endsWith(ENDL))
 			newText += ENDL;
 
+		//dump any non translated code before writing translated code
+		writePlaceHolderForNonTranslatedCode();
+
+		//if appending to the buffer can assume something got translated
+		fCodeTranslated = true;
+
 		if (buffer == fUserCode) {
 			buffer.append(newText);
 			if (addToMap) {
@@ -2531,14 +2833,7 @@
 		// iterate XMLCONTENT and CDATA regions
 		// loop fCurrentNode until you hit </jsp:scriptlet> (or other closing
 		// tag name)
-		while (getCurrentNode() != null && getCurrentNode().getType() != DOMRegionContext.XML_TAG_NAME) // need
-		// to
-		// stop
-		// on
-		// the
-		// ending
-		// tag
-		// name...
+		while (getCurrentNode() != null && getCurrentNode().getType() != DOMRegionContext.XML_TAG_NAME && getCurrentNode().getType() != DOMJSPRegionContexts.JSP_CLOSE) // need to stop on the ending tag name...
 		{
 			start = getCurrentNode().getStartOffset();
 			end = getCurrentNode().getEndOffset();
@@ -2623,6 +2918,20 @@
 		String beanName = null;
 		ITextRegion beanNameRegion = null;
 
+		if (DOMRegionContext.XML_END_TAG_OPEN.equals(container.getFirstRegion().getType())) {
+			if (!fUseBeansStack.isEmpty()) {
+				fUseBeansStack.pop();
+				appendToBuffer("}", fUserCode, false, fCurrentNode); //$NON-NLS-1$ 
+			}
+			else {
+				// no useBean start tag being remembered
+				ITextRegionCollection extraEndRegion = container;
+				IJSPProblem missingStartTag = createJSPProblem(IJSPProblem.UseBeanStartTagMissing, IJSPProblem.F_PROBLEM_ID_LITERAL, NLS.bind(JSPCoreMessages.JSPTranslator_4,JSP11Namespace.ElementName.USEBEAN), extraEndRegion.getStartOffset(), extraEndRegion.getEndOffset());
+				fTranslationProblems.add(missingStartTag);
+			}
+			return;
+		}
+
 		Iterator regions = container.getRegions().iterator();
 		while (regions.hasNext() && (r = (ITextRegion) regions.next()) != null && (r.getType() != DOMRegionContext.XML_TAG_CLOSE || r.getType() != DOMRegionContext.XML_EMPTY_TAG_CLOSE)) {
 			attrName = attrValue = null;
@@ -2674,21 +2983,31 @@
 				Object problem = createJSPProblem(IJSPProblem.UseBeanAmbiguousType, IProblem.AmbiguousType, JSPCoreMessages.JSPTranslator_2, container.getStartOffset(nameRegion), container.getTextEndOffset(nameRegion) - 1);
 				fTranslationProblems.add(problem);
 			}
-			// Only have a class or a beanName at this point, and potentially
-			// a type
-			// has id w/ type and/or classname/beanName
+			/*
+			 * Only have a class or a beanName at this point, and potentially
+			 * a type has id w/ type and/or classname/beanName
+			 */
 			// Type id = new Classname/Beanname();
 			// or
 			// Type id = null; // if there is no classname or beanname
 			if ((type != null || className != null)) {
+				if (className != null)
+					className = decodeType(className);
+
 				if (type == null) {
 					type = className;
 					typeRegion = classnameRegion;
 				}
+				else
+					type = decodeType(type);
 
-				if (!isTypeFound(type)) {
-					Object problem = createJSPProblem(IJSPProblem.F_PROBLEM_ID_LITERAL, IProblem.UndefinedType, MessageFormat.format(JSPCoreMessages.JSPTranslator_1, new String[]{type}), container.getStartOffset(typeRegion), container.getTextEndOffset(typeRegion) - 1);
-					fTranslationProblems.add(problem);
+				/* Now check the types (multiple of generics may be involved) */
+				List errorTypeNames = new ArrayList(2);
+				if (!isTypeFound(type, errorTypeNames)) {
+					for (int i = 0; i < errorTypeNames.size(); i++) {
+						Object problem = createJSPProblem(IJSPProblem.F_PROBLEM_ID_LITERAL, IProblem.UndefinedType, MessageFormat.format(JSPCoreMessages.JSPTranslator_1, new String[]{errorTypeNames.get(i).toString()}), container.getStartOffset(typeRegion), container.getTextEndOffset(typeRegion) - 1);
+						fTranslationProblems.add(problem);
+					}
 				}
 				else {
 					String prefix = type + " " + id + " = "; //$NON-NLS-1$ //$NON-NLS-2$
@@ -2701,37 +3020,111 @@
 				}
 			}
 		}
+		/*
+		 * Add a brace and remember the start tag regardless of whether a
+		 * variable was correctly created
+		 */
+		if (!DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(container.getLastRegion().getType())) {
+			fUseBeansStack.push(container);
+			appendToBuffer("{", fUserCode, false, fCurrentNode); //$NON-NLS-1$ 
+		}
+	}
+
+	/**
+	 * Decodes type strings for XML-style JSPs
+	 * 
+	 * @param type the string to decode
+	 * @return the decoded string
+	 */
+	private String decodeType(String type) {
+		final int length = type.length();
+		final StringBuffer buffer = new StringBuffer(length);
+		for (int i = 0; i < length; i++) {
+			final char c = type.charAt(i);
+			if (c == '&') {
+				if (length > i + 3) {
+					final String code = type.substring(i + 1, i + 4);
+					final boolean isGt = "gt;".equals(code); //$NON-NLS-1$
+					if (isGt || "lt;".equals(code)) { //$NON-NLS-1$
+						i+=3;
+						buffer.append(isGt ? '>' : '<');
+						continue;
+					}
+				}
+			}
+			buffer.append(c);
+		}
+		return buffer.toString();
 	}
 
 	/**
 	 * @param type
 	 * @return
 	 */
-	private boolean isTypeFound(String typeName) {
-		IType type = null;
-		IProject project = getFile().getProject();
-		try {
-			IJavaProject p = JavaCore.create(project);
-			if (p.exists()) {
-				if (typeName.indexOf('<') > 0 && typeName.indexOf('>') > 0) {
-					StringTokenizer toker = new StringTokenizer(typeName);
-					String generic = toker.nextToken("<");
-					String element = toker.nextToken(">");
-					IType genericType = p.findType(generic);
-					IType elementType = p.findType(element);
-					return genericType!= null && genericType.exists() && elementType!= null && elementType.exists();
+	private boolean isTypeFound(String rawTypeValue, List errorTypeNames) {
+		IFile file = getFile();
+		if(file == null)
+			return true;
+		
+		IProject project = file.getProject();
+		IJavaProject p = JavaCore.create(project);
+		if (p.exists()) {
+			String types[] = new String[3];
+			if (rawTypeValue.indexOf('<') > 0) {
+				// JSR 14 : Generics are being used, parse them out
+				try {
+					StringTokenizer toker = new StringTokenizer(rawTypeValue);
+					// generic
+					types[0] = toker.nextToken("<"); //$NON-NLS-1$
+					// type 1 or key
+					types[1] = toker.nextToken(",>"); //$NON-NLS-1$
+					// type 2 or value
+					types[2] = toker.nextToken(",>"); //$NON-NLS-1$
 				}
-				type = p.findType(typeName);
-				return type != null && type.exists();
+				catch (NoSuchElementException e) {
+					// StringTokenizer failure with unsupported syntax
+				}
+			}
+			else {
+				types[0] = rawTypeValue;
+			}
+
+			for (int i = 0; i < types.length; i++) {
+				if (types[i] != null) {
+					// remove any array suffixes 
+					if (types[i].indexOf('[') > 0) {
+						types[i] = types[i].substring(0, types[i].indexOf('[')); //$NON-NLS-1$
+					}
+					// remove any "extends" prefixes (JSR 14)
+					if (types[i].indexOf("extends") > 0) { //$NON-NLS-1$
+						types[i] = StringUtils.strip(types[i].substring(types[i].indexOf("extends"))); //$NON-NLS-1$
+					}
+
+					addNameToListIfTypeNotFound(p, types[i], errorTypeNames);
+				}
+			}
+		}
+		return errorTypeNames.isEmpty();
+	}
+	
+	private void addNameToListIfTypeNotFound(IJavaProject p, String typeName, List collectedNamesNotFound) {
+		try {
+			if (typeName != null) {
+				IType type = p.findType(typeName);
+				if (type == null || !type.exists()) {
+					collectedNamesNotFound.add(typeName);
+				}
+				else {
+					IResource typeResource = type.getResource();
+					if(typeResource != null) {
+						
+					}
+				}
 			}
 		}
 		catch (JavaModelException e) {
 			// Not a Java Project
 		}
-		catch(NoSuchElementException e) {
-			// StringTokenizer failure with unsupported syntax
-		}
-		return true;
 	}
 
 	private boolean isValidJavaIdentifier(String id) {
@@ -2793,24 +3186,18 @@
 		return fCurrentNode;
 	}
 
-	public ArrayList getELProblems() {
-		return fELProblems;
-	}
-
 	public IStructuredDocument getStructuredDocument() {
 		return fStructuredDocument;
 	}
 
 	private IPath getModelPath() {
 		IPath path = null;
-		IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(getStructuredDocument());
-		try {
-			if (sModel != null)
-				path = new Path(sModel.getBaseLocation());
-		}
-		finally {
-			if (sModel != null)
-				sModel.releaseFromRead();
+		IStructuredDocument structuredDocument = getStructuredDocument();
+		if (structuredDocument != null) {
+			ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(structuredDocument);
+			if (buffer != null) {
+				path = buffer.getLocation();
+			}
 		}
 		return path;
 	}
@@ -2854,4 +3241,363 @@
 		}
 		fProcessIncludes = true;
 	}
+
+	/**
+	 * <p>Writes an empty expression to {@link #fUserCode} if previously
+	 * found non translated code</p>
+	 * <p>This should be done before appending any newly translated code.</p>
+	 */
+	private void writePlaceHolderForNonTranslatedCode() {
+		if(fFoundNonTranslatedCode) {
+			String text = ("{" + EXPRESSION_PREFIX + "\"\"" + EXPRESSION_SUFFIX + "}" + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					" //markup"+ ENDL); //$NON-NLS-1$
+			fUserCode.append(text);
+			fOffsetInUserCode += text.length();
+			fFoundNonTranslatedCode = false;
+		}
+	}
+
+	/**
+	 * <p><b>NOTE: </b>If the implementation of this method is changed be sure to update
+	 *  {@link #readExternal(ObjectInput)} and {@link #serialVersionUID}</p>
+	 *
+	 * @see #readExternal(ObjectInput)
+	 * @see #serialVersionUID
+	 * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput)
+	 */
+	public void writeExternal(ObjectOutput out) throws IOException {
+		writeString(out, this.fClassHeader);
+		writeString(out, this.fClassname);
+		writeString(out, this.fSuperclass);
+		writeString(out, this.fImplicitImports);
+		writeString(out, this.fServiceHeader);
+		writeBuffer(out, this.fUserImports);
+		out.writeInt(this.fSourcePosition);
+		out.writeInt(this.fRelativeOffset);
+		out.writeInt(this.fCursorPosition);
+		out.writeBoolean(this.fIsErrorPage);
+		out.writeBoolean(this.fCursorInExpression);
+		out.writeBoolean(this.fIsInASession);
+		writeBuffer(out, this.fUserCode);
+		writeBuffer(out, this.fUserELExpressions);
+		writeBuffer(out, this.fUserDeclarations);
+		writeBuffer(out, this.fCursorOwner);
+		out.writeBoolean(this.fInCodeRegion);
+		out.writeBoolean(this.fProcessIncludes);
+		out.writeInt(this.fOffsetInUserImports);
+		out.writeInt(this.fOffsetInUserDeclarations);
+		out.writeInt(this.fOffsetInUserCode);
+		
+		//write included paths
+		out.writeInt(this.fIncludedPaths.size());
+		Iterator iter = this.fIncludedPaths.iterator();
+		while(iter.hasNext()) {
+			writeString(out, (String)iter.next());
+		}
+		
+		writeRanges(out, this.fImportRanges);
+		writeRanges(out, this.fCodeRanges);
+		writeRanges(out, this.fDeclarationRanges);
+		writeRanges(out, this.fUseBeanRanges);
+		writeRanges(out, this.fUserELRanges);
+		writeRanges(out, this.fIndirectRanges);
+		writeString(out, this.fELTranslatorID);
+	}
+	
+	/**
+	 * <p><b>NOTE 1: </b>After reading in an externalized {@link JSPTranslator} the caller must
+	 * manually call {@link #postReadExternalSetup(IStructuredModel)} to finish setting up
+	 * the {@link JSPTranslator} for use.</p>
+	 * 
+	 * <p><b>NOTE 2: </b>If the implementation of this method is changed be sure to update
+	 * {@link #writeExternal(ObjectOutput)} and {@link #serialVersionUID}</p>
+	 * 
+	 * @see #writeExternal(ObjectOutput)
+	 * @see #serialVersionUID
+	 * @see java.io.Externalizable#readExternal(java.io.ObjectInput)
+	 */
+	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+		this.fClassHeader = readString(in);
+		this.fClassname = readString(in);
+		this.fSuperclass = readString(in);
+		this.fImplicitImports = readString(in);
+		this.fServiceHeader = readString(in);
+		this.fUserImports = new StringBuffer(readString(in));
+		this.fSourcePosition = in.readInt();
+		this.fRelativeOffset = in.readInt();
+		this.fCursorPosition = in.readInt();
+		this.fIsErrorPage = in.readBoolean();
+		this.fCursorInExpression = in.readBoolean();
+		this.fIsInASession = in.readBoolean();
+		this.fUserCode = new StringBuffer(readString(in));
+		this.fUserELExpressions = new StringBuffer(readString(in));
+		this.fUserDeclarations = new StringBuffer(readString(in));
+		this.fCursorOwner = new StringBuffer(readString(in));
+		this.fInCodeRegion = in.readBoolean();
+		this.fProcessIncludes = in.readBoolean();
+		this.fOffsetInUserImports = in.readInt();
+		this.fOffsetInUserDeclarations = in.readInt();
+		this.fOffsetInUserCode = in.readInt();
+		
+		//read included paths
+		int size = in.readInt();
+		this.fIncludedPaths = new HashSet(size);
+		for(int i = 0; i < size; ++i) {
+			this.fIncludedPaths.add(readString(in));
+		}
+		
+		this.fImportRanges = readRanges(in);
+		this.fCodeRanges = readRanges(in);
+		this.fDeclarationRanges = readRanges(in);
+		this.fUseBeanRanges = readRanges(in);
+		this.fUserELRanges = readRanges(in);
+		this.fIndirectRanges = readRanges(in);
+		this.fELTranslatorID = readString(in);
+		
+		//build result
+		this.buildResult(false);
+	}
+	
+	/**
+	 * <p>This does mandatory setup needed after a JSPTranslator is restored from
+	 * a persisted file</p>
+	 * 
+	 * @param jspModel {@link IStructuredModel} representing the JSP file that this
+	 * is a translator for
+	 */
+	protected void postReadExternalSetup(IStructuredModel jspModel) {
+		this.fStructuredDocument = jspModel.getStructuredDocument();
+		this.fJspTextBuffer = new StringBuffer(this.fStructuredDocument.get());
+		if(jspModel instanceof IDOMModel) {
+			this.fStructuredModel = (IDOMModel)jspModel;
+		}
+	}
+	
+	/**
+	 * <p>Writes a string to an {@link ObjectOutput} stream</p>
+	 * 
+	 * <p><b>NOTE: </b>If the implementation of this method is changed be sure to update
+	 * {@link #readString(ObjectInput)} and {@link #serialVersionUID}</p>
+	 * 
+	 * @param out {@link ObjectOutput} stream to write <code>s</code> too
+	 * @param s {@link String} to write to <code>out</code>
+	 * 
+	 * @throws IOException IO can throw exceptions
+	 * 
+	 * @see #readString(ObjectInput)
+	 */
+	private static void writeString(ObjectOutput out, String s) throws IOException {
+		if(s != null) {
+			out.writeInt(s.length());
+			out.writeChars(s);
+		} else {
+			out.writeInt(0);
+		}
+	}
+	
+	/**
+	 * <p>Reads a {@link String} written by {@link #writeString(ObjectOutput, String)} from
+	 * a {@link ObjectInput} stream.</p>
+	 * 
+	 * <p><b>NOTE: </b>If the implementation of this method is changed be sure to update
+	 * {@link #writeString(ObjectOutput, String)} and {@link #serialVersionUID}</p>
+	 * 
+	 * @param in {@link ObjectInput} stream to read the {@link String} from
+	 * @return {@link String} read from <code>in</code>
+	 * 
+	 * @throws IOException IO Can throw exceptions
+	 * 
+	 * @see #writeString(ObjectOutput, String)
+	 */
+	private static String readString(ObjectInput in) throws IOException {
+		int length = in.readInt();
+		char charArray[] = new char[length];
+		for(int i=0; i < length;i++){
+			charArray[i] = in.readChar();
+		}
+		return new String(charArray);
+	}
+	
+	/**
+	 * <p>Writes a {@link StringBuffer} to an {@link ObjectOutput} stream</p>
+	 * 
+	 * @param out {@link ObjectOutput} stream to write <code>s</code> too
+	 * @param s {@link String} to write to <code>out</code>
+	 * 
+	 * @throws IOException IO can throw exceptions
+	 * 
+	 * @see #readString(ObjectInput)
+	 */
+	private static void writeBuffer(ObjectOutput out, StringBuffer buff) throws IOException {
+		if(buff != null && buff.length() > 0) {
+			writeString(out, buff.toString());
+		} else {
+			writeString(out, null);
+		}
+	}
+	
+	/**
+	 * <p>Writes a {@link HashMap} of {@link Position}s to an {@link ObjectOutput} stream</p>
+	 * 
+	 * <p><b>NOTE: </b>If the implementation of this method is changed be sure to update
+	 * {@link #readRanges(ObjectInput)} and {@link #serialVersionUID}</p>
+	 * 
+	 * @param out {@link ObjectOutput} stream to write to
+	 * @param ranges {@link HashMap} of {@link Position}s to write to <code>out</code>
+	 * 
+	 * @throws IOException IO can throw exceptions
+	 * 
+	 * @see #readRanges(ObjectInput)
+	 */
+	private static void writeRanges(ObjectOutput out, HashMap ranges) throws IOException {
+		//this is a strange hack because Position is not designed to be used as keys in a Map, see Position doc
+		HashMap temp = new HashMap();
+		temp.putAll(ranges);
+		
+		Iterator iter = temp.keySet().iterator();
+		out.writeInt(ranges.size());
+		while(iter.hasNext()) {
+			Position javaPos = (Position)iter.next();
+			Position jspPos = (Position)temp.get(javaPos);
+			out.writeInt(javaPos.offset);
+			out.writeInt(javaPos.length);
+			out.writeBoolean(javaPos.isDeleted);
+			
+			if(jspPos != null) {
+				out.writeInt(jspPos.offset);
+				out.writeInt(jspPos.length);
+				out.writeBoolean(jspPos.isDeleted);
+			} else {
+				out.writeInt(-1);
+				out.writeInt(-1);
+			}
+		}
+	}
+	
+	/**
+	 * <p>Reads a {@link HashMap} of {@link Position}s from an {@link ObjectInput} stream that was written by
+	 * {@link #writeRanges(ObjectOutput, HashMap)}</p>
+	 * 
+	 * <p><b>NOTE: </b>If the implementation of this method is changed be sure to update
+	 * {@link #writeRanges(ObjectOutput, HashMap)} and {@link #serialVersionUID}</p>
+	 * 
+	 * @param in {@link ObjectInput} stream to read the {@link HashMap} of {@link Position}s from
+	 * @return {@link HashMap} of {@link Position}s read from <code>in</code>
+	 * 
+	 * @throws IOException IO can throw exceptions
+	 * 
+	 * @see #writeRanges(ObjectOutput, HashMap)
+	 */
+	private static HashMap readRanges(ObjectInput in) throws IOException {
+		int size = in.readInt();
+		HashMap ranges = new HashMap(size);
+		for(int i = 0; i < size; ++i) {
+			Position javaPos = new Position(in.readInt(), in.readInt());
+			if(in.readBoolean()) {
+				javaPos.delete();
+			}
+			
+			//if the jspPos was null for some reason then -1 was written for length and offset
+			Position jspPos = null;
+			int jspPosOffset = in.readInt();
+			int jspPosLength = in.readInt();
+			if(jspPosOffset != -1 && jspPosLength != -1) {
+				jspPos = new Position(jspPosOffset, jspPosLength);
+			}
+			
+			//only read a boolean if the jspPos was not null
+			if(jspPos != null && in.readBoolean()) {
+				jspPos.delete();
+			}
+			
+			ranges.put(javaPos, jspPos);
+		}
+		
+		return ranges;
+	}
+	
+	/**
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		boolean equal = false;
+		if(obj instanceof JSPTranslator) {
+			JSPTranslator other = (JSPTranslator)obj;
+			equal = this.fClassHeader.equals(other.fClassHeader) &&
+				this.fClassname.equals(other.fClassname) &&
+				this.fSuperclass.equals(other.fSuperclass) &&
+				this.fImplicitImports.equals(other.fImplicitImports) &&
+				this.fServiceHeader.equals(other.fServiceHeader) &&
+				buffersEqual(this.fUserImports, other.fUserImports) &&
+				this.fSourcePosition == other.fSourcePosition &&
+				this.fRelativeOffset == other.fRelativeOffset &&
+				this.fCursorPosition == other.fCursorPosition &&
+				this.fIsErrorPage == other.fIsErrorPage &&
+				this.fCursorInExpression == other.fCursorInExpression &&
+				this.fIsInASession == other.fIsInASession &&
+				buffersEqual(this.fUserCode, other.fUserCode) &&
+				buffersEqual(this.fUserELExpressions, other.fUserELExpressions) &&
+				buffersEqual(this.fUserDeclarations, other.fUserDeclarations) &&
+				buffersEqual(this.fCursorOwner, other.fCursorOwner) &&
+				this.fInCodeRegion == other.fInCodeRegion &&
+				this.fProcessIncludes == other.fProcessIncludes &&
+				this.fOffsetInUserImports == other.fOffsetInUserImports &&
+				this.fOffsetInUserDeclarations == other.fOffsetInUserDeclarations &&
+				this.fOffsetInUserCode == other.fOffsetInUserCode &&
+				rangesEqual(this.fImportRanges, other.fImportRanges) &&
+				rangesEqual(this.fCodeRanges, other.fCodeRanges) &&
+				rangesEqual(this.fDeclarationRanges, other.fDeclarationRanges) &&
+				rangesEqual(this.fUseBeanRanges, other.fUseBeanRanges) &&
+				rangesEqual(this.fUserELRanges, other.fUserELRanges) &&
+				rangesEqual(this.fIndirectRanges, other.fIndirectRanges) &&
+				(
+					(this.fELTranslatorID != null && other.fELTranslatorID != null) ||
+					(this.fELTranslatorID == null && other.fELTranslatorID != null && other.fELTranslatorID.length() == 0) ||
+					(this.fELTranslatorID != null && this.fELTranslatorID.length() == 0 && other.fELTranslatorID == null) ||
+					(this.fELTranslatorID.equals(other.fELTranslator))
+				);
+		}
+		return equal;
+	}
+	
+	/**
+	 * <p><code>null</code> is considered equivlent to an empty buffer</p>
+	 * 
+	 * @param buff1 can be <code>null</code>
+	 * @param buff2 can be <code>null</code>
+	 * @return <code>true</code> if the two given buffers are equal, <codee>false</code> otherwise
+	 */
+	private static boolean buffersEqual(StringBuffer buff1, StringBuffer buff2) {
+		return (buff1 == null && buff2 == null) ||
+			(buff1 != null && buff2!= null && buff1.toString().equals(buff2.toString())) ||
+			(buff1 == null && buff2 != null && buff2.length() == 0) ||
+			(buff1 != null && buff1.length() == 0 && buff2 == null);
+	}
+	
+	/**
+	 * @param ranges1
+	 * @param ranges2
+	 * @return <code>true</code> if the two maps of ranges contains the same key/value pares,
+	 * <code>false</code> otherwise
+	 */
+	private static boolean rangesEqual(HashMap ranges1, HashMap ranges2) {
+		//this is a strange hack because Position is not designed to be used as keys in a Map, see Position doc
+		HashMap temp = new HashMap();
+		temp.putAll(ranges1);
+		ranges1 = temp;
+		
+		boolean equal = false;
+		if(ranges1 != null && ranges2 != null) {
+			equal = true;
+			Iterator ranges1Keys = ranges1.keySet().iterator();
+			while(ranges1Keys.hasNext() && equal) {
+				Position key = (Position)ranges1Keys.next();
+				Position ranges1Value = (Position)ranges1.get(key);
+				Position ranges2Value = (Position)ranges2.get(key);
+				equal = ranges1Value.equals(ranges2Value);
+			}
+		}
+		
+		return equal;
+	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslatorPersister.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslatorPersister.java
new file mode 100644
index 0000000..d41723b
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslatorPersister.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsp.core.internal.java;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InvalidClassException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.zip.CRC32;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
+import org.eclipse.jst.jsp.core.internal.Logger;
+import org.eclipse.jst.jsp.core.internal.java.search.JSPIndexManager;
+import org.eclipse.jst.jsp.core.internal.modelhandler.ModelHandlerForJSP;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.FileBufferModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+
+/**
+ * <p>This is a static class used to persist JSP translations and retrieve the persisted
+ * translations.</p>
+ * 
+ * <p>It is not actually in charge of finding files to persist, rather it provides API
+ * for some other mechanism that tracks JSP files to call into to persist the translations.</p>
+ * 
+ * <p>This class can be deactivated through the <code>persistJSPTranslations</code> system property,
+ * a value of <code>true</code> means the persister is activated (which is the default), value of
+ * <code>false</code> means the persister is not activated.</p>
+ * 
+ * @see JSPIndexManager
+ */
+public class JSPTranslatorPersister{
+	/**
+	 * <code>true</code> if the persister is activated, <code>false</code>
+	 * otherwise.  This is determined by checking the system property
+	 * <code>persistJSPTranslations</code>, if no value supplied then
+	 * default is <code>true</code>
+	 */
+	public static final boolean ACTIVATED =
+		Boolean.valueOf(System.getProperty("persistJSPTranslations", "true")).booleanValue(); //$NON-NLS-1$ //$NON-NLS-2$
+	
+	/** the location where {@link JSPTranslator}s are externalized too for persistence purposes */
+	private static final IPath PERSIST_LOCATION = JSPCorePlugin.getDefault().getStateLocation().append("translators"); //$NON-NLS-1$
+	
+	/** used to calculate persisted translator file names */
+	private static final CRC32 CHECKSUM_CALC = new CRC32();
+	
+	/** lock to use while using the checksum */
+	private static final Object CHECKSUM_CALC_LOCK = new Object();
+	
+	/**
+	 * <p>Private constructor to prevent creating an instance of this class</p>
+	 */
+	private JSPTranslatorPersister() {
+	}
+	
+	/**
+	 * <p>Given the {@link IStructuredModel} of a JSP file attempts to retrieve the persisted
+	 * {@link JSPTranslator} for that model.</p>
+	 * <p><b>NOTE: </b><i>It is possible for there not to be a persisted translator</i></p>
+	 * 
+	 * @param model {@link IStructuredModel} to get the persisted {@link JSPTranslator} for
+	 * @return the persisted {@link JSPTranslator} for the given <code>model</code>, or
+	 * <code>null</code> if none could be found or an existing one could not be read
+	 */
+	public static JSPTranslator getPersistedTranslator(IStructuredModel model) {
+		String persistedTranslatorFilePath = getPersistedTranslatorFilePath(model.getBaseLocation());
+		File persistedTranslatorFile = new File(persistedTranslatorFilePath);
+		
+		//attempt to read in the externalized translator
+		JSPTranslator translator = null;
+		ObjectInputStream in = null;
+		try {
+			//get the persisted translator file if one exists
+			if(persistedTranslatorFile.exists()) {
+				long persistedTranslatorFileTimestamp = persistedTranslatorFile.lastModified();
+				long jspFileTimestamp = FileBufferModelManager.getInstance().getBuffer(
+						model.getStructuredDocument()).getModificationStamp();
+				
+				/* if the persisted translator timestamp is newer then the jsp file timestamp
+				 * then the translation has not become stale, otherwise it has so delete
+				 * it and don't use it */
+				if(persistedTranslatorFileTimestamp > jspFileTimestamp) {
+					FileInputStream fis = new FileInputStream(persistedTranslatorFile);
+					in = new ObjectInputStream(fis);
+					translator = (JSPTranslator)in.readObject();
+					
+					//do post read external setup
+					if(translator != null) {
+						translator.postReadExternalSetup(model);
+					}
+				} else {
+					persistedTranslatorFile.delete();
+				}
+			}
+		} catch(InvalidClassException e) {
+			/* this means that the externalized translator is for an older version
+			 * of the JSPTranslator, so delete it */
+			persistedTranslatorFile.delete();
+		}catch (IOException e) {
+			Logger.logException("Could not read externalized JSPTranslator at " + persistedTranslatorFilePath, e); //$NON-NLS-1$
+		} catch (ClassNotFoundException e) {
+			Logger.logException("Class of a serialized JSPTranslator cannot be found", e); //$NON-NLS-1$
+		} finally {
+			if(in != null) {
+				try {
+					in.close();
+				} catch (IOException e) {
+					Logger.logException("Could not close externalized JSPTranslator that was just read", e); //$NON-NLS-1$
+				}
+			}
+		}
+		
+		return translator;
+	}
+	
+	/**
+	 * @param resource JSP resource who's translation should be persisted
+	 */
+	public static void persistTranslation(IResource resource) {
+		if(ACTIVATED) {
+			IPath path = resource.getFullPath();
+			String filePath = getPersistedTranslatorFilePath(path.toString());
+			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+	
+			JSPTranslator translator = getJSPTranslator(file);
+			if(translator != null) {
+				persistTranslator(translator, filePath);
+			}
+		}
+	}
+	
+	/**
+	 * @param resource JSP resource who's translation should no longer be persisted
+	 */
+	public static void removePersistedTranslation(IResource resource) {
+		if(ACTIVATED) {
+			File file = getPersistedFile(resource.getFullPath());
+			file.delete();
+		}
+	}
+	
+	/**
+	 * @param resource JSP resource that has moved and thus its persisted translation should be updated
+	 * @param fromPath Path the JSP resource moved from
+	 */
+	public static void movePersistedTranslation(IResource resource, IPath fromPath) {
+		if(ACTIVATED) {
+			File from = getPersistedFile(fromPath);
+			File to = getPersistedFile(resource.getFullPath());
+	
+			from.renameTo(to);
+		}
+	}
+	
+	/**
+	 * <p>Given the path to a JSP file determines the path to its persisted {@link JSPTranslator}</p>
+	 * 
+	 * @param jspFilePath {@link IPath} to JSP file for which the path to its persisted {@link JSPTranslator}
+	 * should be determined
+	 * 
+	 * @return OS file path to the persisted {@link JSPTranslator} associated with the JSP file at
+	 * <code>jspFilePath</code>
+	 */
+	private static String getPersistedTranslatorFilePath(String jspFilePath) {
+		String persistedTranslatorFileName = "error.translator"; //$NON-NLS-1$
+		synchronized(CHECKSUM_CALC_LOCK){
+			try {
+				CHECKSUM_CALC.reset();
+				CHECKSUM_CALC.update(jspFilePath.getBytes("utf16")); //$NON-NLS-1$
+				persistedTranslatorFileName = Long.toString(CHECKSUM_CALC.getValue()) + ".translator"; //$NON-NLS-1$
+			} catch (UnsupportedEncodingException e) {
+				Logger.logException("Could not get utf16 encoded bytes to create checksum to store persisted file.", e); //$NON-NLS-1$
+			}
+		}
+		
+		IPath location = PERSIST_LOCATION;
+		
+		// ensure the folder exists on disk
+        File folder = new File(location.toOSString());
+		if (!folder.isDirectory()) {
+			try {
+				folder.mkdir();
+			}
+			catch (SecurityException e) {
+			}
+		}
+		
+		location = location.addTrailingSeparator();
+		location = location.append(persistedTranslatorFileName);
+		return location.toOSString();
+	}
+	
+	/**
+	 * <p>Gets the associated {@link JSPTranslator} for a specific JSP file.</p>
+	 * <p><b>NOTE: </b><i>This does not get the persisted translator but rather the
+	 * associated translator in memory</i></p>
+	 * 
+	 * @param jspFile {@link IFile} to the JSP file that the associated {@link JSPTranslator}
+	 * is needed for
+	 * @return {@link JSPTranslator} associated with the given <code>jspFilePath</code>, or
+	 * <code>null</code> if none can be found.
+	 */
+	private static JSPTranslator getJSPTranslator(IFile jspFile) {
+		IStructuredModel model = null;
+		JSPTranslator translator = null;
+		try {
+			model = StructuredModelManager.getModelManager().getModelForRead(jspFile);
+			if(model instanceof IDOMModel) {
+				IDOMDocument doc = ((IDOMModel)model).getDocument();
+				ModelHandlerForJSP.ensureTranslationAdapterFactory(model);
+				JSPTranslationAdapter adapter = (JSPTranslationAdapter)doc.getAdapterFor(IJSPTranslation.class);
+				
+				//don't want to persist a translator that has not already been requested
+				if(adapter != null && adapter.hasTranslation()) {
+					translator = adapter.getJSPTranslation().getTranslator();
+				}
+			}
+		} catch (IOException e) {
+			Logger.logException("Could not get translator for " + jspFile.getName() + //$NON-NLS-1$
+					" because could not read model for same.", e); //$NON-NLS-1$
+		} catch (CoreException e) {
+			Logger.logException("Could not get translator for " + jspFile.getName() + //$NON-NLS-1$
+					" because could not read model for same.", e); //$NON-NLS-1$
+		} finally {
+			if(model != null) {
+				model.releaseFromRead();
+			}
+		}
+		
+		return translator;
+	}
+	
+	/**
+	 * <p>Persists a {@link JSPTranslator} to disk for a specific JSP file</p>
+	 * 
+	 * @param translator {@link JSPTranslator} to persist to disk
+	 * @param jspFilePath {@link IPath} to the JSP file the given <code>translator</code> is for
+	 */
+	private static void persistTranslator(JSPTranslator translator, String filePath) {
+		try {
+			FileOutputStream fos = new FileOutputStream(filePath);
+			ObjectOutputStream out = new ObjectOutputStream(fos);
+			out.writeObject(translator);
+			out.close();
+		} catch (IOException e) {
+			Logger.logException("Was unable to externalize JSPTranslator " + translator + //$NON-NLS-1$
+					" to " + filePath, e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * @param path {@link IPath} to the JSP file that the persisted translator is needed for
+	 * @return The persisted translator {@link File} for the JSP file at the given path
+	 * or <code>null</code> if no persisted translator exists for the JSP file at the given path
+	 */
+	private static File getPersistedFile(IPath path) {
+		return new File(getPersistedTranslatorFilePath(path.toString()));
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/StackMap.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/StackMap.java
index ecd42a0..2412687 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/StackMap.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/StackMap.java
@@ -11,7 +11,10 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java;
 
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Stack;
 
@@ -121,4 +124,35 @@
 		}
 		return null;
 	}
+
+    /**
+	 * Returns the number of entries in this StackMap, the sum of the sizes of
+	 * every remembered stack.
+	 * 
+	 * @return the number of entries in this map.
+	 */
+	int size() {
+		int size = 0;
+		Iterator i = fInternalMap.values().iterator();
+		while (i.hasNext()) {
+			Collection c = (Collection) i.next();
+			size += c.size();
+		}
+		return size;
+	}
+
+	/**
+	 * Returns all of the values of this StackMap.
+	 * 
+	 * @return the values of every Stack within this StackMap.
+	 */
+	Collection values() {
+		Collection values = new LinkedList();
+		Iterator i = fInternalMap.values().iterator();
+		while (i.hasNext()) {
+			Collection c = (Collection) i.next();
+			values.addAll(c);
+		}
+		return values;
+	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/TagTranslationAdapterFactory.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/TagTranslationAdapterFactory.java
index a43e906..4807976 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/TagTranslationAdapterFactory.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/TagTranslationAdapterFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,17 +11,22 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java;
 
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
 
-public class TagTranslationAdapterFactory extends JSPTranslationAdapterFactory {
+public class TagTranslationAdapterFactory extends AbstractAdapterFactory {
 
+	// for debugging
+	static final boolean DEBUG = Boolean.valueOf(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jsptranslation")).booleanValue(); //$NON-NLS-1$;
+	
 	private TagTranslationAdapter fAdapter = null;
 
 	public TagTranslationAdapterFactory() {
-		super();
+		super(IJSPTranslation.class, true);
 	}
 
 	public INodeAdapterFactory copy() {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/XMLJSPRegionHelper.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/XMLJSPRegionHelper.java
index 0535b36..d281590 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/XMLJSPRegionHelper.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/XMLJSPRegionHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,23 +13,26 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jst.jsp.core.internal.Logger;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
+import org.eclipse.jst.jsp.core.internal.encoding.JSPDocumentLoader;
 import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
 import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.jst.jsp.core.internal.util.FileContentCache;
-import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory;
+import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
 import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
+import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerRegistry;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.sse.core.utils.StringUtils;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
@@ -86,13 +89,30 @@
 
 	public void reset(String textToParse, int start) {
 		fStartOfTextToParse = start;
-		getLocalParser().reset(textToParse);
 		fTextToParse = textToParse;
 	}
 
 	public void forceParse() {
-		getLocalParser().getDocumentRegions();
-		fLocalParser = null;
+		String contents = fTextToParse;
+
+		IStructuredDocument document = (IStructuredDocument) new JSPDocumentLoader().createNewStructuredDocument();
+		if(contents != null && document != null) {		
+			// from outer class
+			List blockMarkers = this.fTranslator.getBlockMarkers();
+			// this adds the current markers from the outer class list
+			// to this parser so parsing works correctly
+			for (int i = 0; i < blockMarkers.size(); i++) {
+				addBlockMarker((BlockMarker) blockMarkers.get(i));
+			}
+			reset(contents);
+	
+			document.set(contents);
+			IStructuredDocumentRegion cursor = document.getFirstStructuredDocumentRegion();
+			while(cursor != null) {
+				nodeParsed(cursor);
+				cursor = cursor.getNext();
+			}
+		}
 	}
 
 	/*
@@ -100,41 +120,51 @@
 	 * 
 	 * @param filename @return
 	 */
-	public boolean parse(String filePath) {
-		getLocalParser().removeStructuredDocumentRegionHandler(this);
-		// from outer class
-		List blockMarkers = this.fTranslator.getBlockMarkers();
-		IStructuredDocument document = StructuredDocumentFactory.getNewStructuredDocumentInstance(getLocalParser());
-		String contents = getContents(filePath);
-		if (contents == null)
-			return false;
-		// this adds the current markers from the outer class list
-		// to this parser so parsing works correctly
-		for (int i = 0; i < blockMarkers.size(); i++) {
-			addBlockMarker((BlockMarker) blockMarkers.get(i));
+	public boolean parse(String filePathString) {
+		boolean parsed = false;
+		IStructuredDocument document = null;
+		String contents = null;
+
+		IPath filePath = new Path(filePathString);
+		IFile f = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+		if (f == null || !f.isAccessible()) {
+			f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(filePath);
 		}
-		// RATLC01139770
-//		getLocalParser().getNestablePrefixes().addAll(((JSPSourceParser)fTranslator.getStructuredDocument().getParser()).getNestablePrefixes());
-		TLDCMDocumentManager documentManager = this.fTranslator.getTLDCMDocumentManager();
-		if (documentManager != null) {
-			List trackers = documentManager.getTaglibTrackers();
-			for (Iterator it = trackers.iterator(); it.hasNext();) {
-				TaglibTracker tracker = (TaglibTracker) it.next();
-				String prefix = tracker.getPrefix();
-				getLocalParser().getNestablePrefixes().add(new TagMarker(prefix));
+		if (f != null && f.isAccessible()) {
+			/*
+			 * using a real document allows us to pull out text in the
+			 * translator for dealing with TEI variables
+			 */
+			try {
+				IModelHandler handler = ModelHandlerRegistry.getInstance().getHandlerFor(f, false);
+				if (handler == null)
+					handler = ModelHandlerRegistry.getInstance().getHandlerForContentTypeId(ContentTypeIdForJSP.ContentTypeID_JSPFRAGMENT);
+				document = (IStructuredDocument) handler.getDocumentLoader().createNewStructuredDocument();
+				contents = FileContentCache.getInstance().getContents(f.getFullPath());
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
 			}
 		}
-
-		reset(contents);
-		// forceParse();
-		document.set(contents);
-		IStructuredDocumentRegion cursor = document.getFirstStructuredDocumentRegion();
-		while (cursor != null) {
-			nodeParsed(cursor);
-			cursor = cursor.getNext();
+		if (contents != null && document != null) {
+			// from outer class
+			List blockMarkers = this.fTranslator.getBlockMarkers();
+			// this adds the current markers from the outer class list
+			// to this parser so parsing works correctly
+			for (int i = 0; i < blockMarkers.size(); i++) {
+				addBlockMarker((BlockMarker) blockMarkers.get(i));
+			}
+			reset(contents);
+			// forces parse
+			document.set(contents);
+			IStructuredDocumentRegion cursor = document.getFirstStructuredDocumentRegion();
+			while (cursor != null) {
+				nodeParsed(cursor);
+				cursor = cursor.getNext();
+			}
+			parsed = true;
 		}
-		getLocalParser().addStructuredDocumentRegionHandler(this);
-		return true;
+		return parsed;
 	}
 
 
@@ -146,8 +176,6 @@
 	public void nodeParsed(IStructuredDocumentRegion sdRegion) {
 
 		try {
-
-			handleScopingIfNecessary(sdRegion);
 			if (isJSPEndRegion(sdRegion)) {
 				String nameStr = getRegionName(sdRegion);
 				if (isPossibleCustomTag(nameStr)) {
@@ -157,6 +185,9 @@
 				fTagname = null;
 			}
 			else if (isJSPStartRegion(sdRegion)) {
+				int illegalContent = hasIllegalContent(sdRegion);
+				if (illegalContent >= 0)
+					decodeRemainingRegions(sdRegion, illegalContent);
 				String nameStr = getRegionName(sdRegion);
 				if (sdRegion.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN) {
 					if (isPossibleCustomTag(nameStr)) {
@@ -174,7 +205,7 @@
 				// IS the opening tag
 
 				// handle include and directive
-				if (fTagname != null && sdRegion.getFirstRegion().getType() == DOMJSPRegionContexts.JSP_DIRECTIVE_OPEN) {
+				if (fTagname != null) {
 					processOtherRegions(sdRegion);
 				}
 
@@ -202,6 +233,24 @@
 			}
 			else {
 				fTagname = null;
+				/*
+				 * We may have been asked to decode a script block with an XML
+				 * comment in it (a common provision for browsers not
+				 * supporting client scripting). While
+				 * scriptlets/expressions/declarations will be identified as
+				 * part of the normal parsing process, the temporary document
+				 * used here will be parsed differently, respecting the
+				 * comment since it's not in a tag block region any more, and
+				 * the custom tags in the comment will not be found. Run those
+				 * comment text pieces through the translator on their own.
+				 */
+				ITextRegion first = sdRegion.getFirstRegion();
+				ITextRegion last = sdRegion.getLastRegion();
+
+				/* Decode everything between the comment delimiters at once */
+				if (DOMRegionContext.XML_COMMENT_OPEN.equals(first.getType()) && DOMRegionContext.XML_COMMENT_CLOSE.equals(last.getType())) {
+					fTranslator.decodeScriptBlock(sdRegion.getFullText().substring(first.getEnd(), last.getStart()), 0);
+				}
 			}
 			// this updates cursor position
 			checkCursorInRegion(sdRegion);
@@ -219,56 +268,27 @@
 		}
 	}
 
-
-	private void handleScopingIfNecessary(IStructuredDocumentRegion sdRegion) {
-		/* 199047 - Braces missing from translation of custom tags not defining variables */
-		// fix to make sure custom tag block have their own scope
-		// we add '{' for custom tag open and '}' for custom tag close
-		// in the translation
-		if (sdRegion.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN) {
-			if (!isSelfClosingTag(sdRegion)) {
-				String nameStr = getRegionName(sdRegion);
-				if (isPossibleCustomTag(nameStr)) {
-					startScope(nameStr);
-				}
-			}
-		}
-		else if (sdRegion.getFirstRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN) {
-			String nameStr = getRegionName(sdRegion);
-			if (isPossibleCustomTag(nameStr)) {
-				endScope(nameStr);
-			}
+	private void decodeRemainingRegions(IStructuredDocumentRegion sdRegion, int start) {
+		ITextRegionList regionList = sdRegion.getRegions();
+		if(regionList != null) {
+			ITextRegion region = regionList.get(start);
+			String text = sdRegion.getFullText();
+			if (text != null && region != null && region.getStart() <= text.length())
+				fTranslator.decodeScriptBlock(text.substring(region.getStart(), text.length()), 0);
 		}
 	}
 
-	private boolean isSelfClosingTag(ITextRegionCollection containerRegion) {
-
-		if (containerRegion == null)
-			return false;
-
-		ITextRegionList regions = containerRegion.getRegions();
-		ITextRegion r = regions.get(regions.size() - 1);
-		return r.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE;
-	}
-
-	private void startScope(String tagName) {
-		IStructuredDocumentRegion currentNode = fTranslator.getCurrentNode();
-		StringBuffer text = new StringBuffer();
-		text.append("{ // <"); //$NON-NLS-1$
-		text.append(tagName);
-		text.append(">\n"); //$NON-NLS-1$
-		this.fTranslator.translateScriptletString(text.toString(), currentNode, currentNode.getStartOffset(), currentNode.getLength(), fAppendAsIndirectSource); //$NON-NLS-1$
-
-	}
-
-	private void endScope(String tagName) {
-		IStructuredDocumentRegion currentNode = fTranslator.getCurrentNode();
-		StringBuffer text = new StringBuffer();
-		text.append("} // </"); //$NON-NLS-1$
-		text.append(tagName);
-		text.append(">\n"); //$NON-NLS-1$
-		this.fTranslator.translateScriptletString(text.toString(), currentNode, currentNode.getStartOffset(), currentNode.getLength(), fAppendAsIndirectSource); //$NON-NLS-1$
-
+	private int hasIllegalContent(IStructuredDocumentRegion sdRegion) {
+		ITextRegionList list = sdRegion.getRegions();
+		for (int i = 0; i < list.size(); i++) {
+			ITextRegion region = list.get(i);
+			String type = region.getType();
+			if (type == DOMRegionContext.UNDEFINED)
+				return i;
+			if (type == DOMRegionContext.XML_END_TAG_OPEN || type == DOMRegionContext.XML_EMPTY_TAG_CLOSE || type == DOMJSPRegionContexts.JSP_DIRECTIVE_CLOSE)
+				return -1;
+		}
+		return -1;
 	}
 
 	public void resetNodes() {
@@ -374,10 +394,6 @@
 			String fileLocation = getAttributeValue("file", sdRegion); //$NON-NLS-1$
 			this.fTranslator.handleIncludeFile(fileLocation);
 		}
-		else if (isPossibleCustomTag(fTagname)) {
-			// this custom tag may define variables
-			this.fTranslator.addTaglibVariables(fTagname);
-		}
 		else if (isTaglibDirective(fTagname)) {
 			// also add the ones created here to the parent document
 			String prefix = getAttributeValue("prefix", sdRegion); //$NON-NLS-1$
@@ -480,22 +496,23 @@
 	}
 
 	protected boolean isPossibleCustomTag(String tagName) {
-		int colonIndex = tagName.indexOf(":");
-		if (colonIndex > 0) {
-			String prefix = tagName.substring(0, colonIndex);
-			if (prefix.equals("jsp")) { //$NON-NLS-1$
-				return false;
-			}
-			if (prefix.length() > 0) {
-				TagMarker[] prefixes = (TagMarker[]) fLocalParser.getNestablePrefixes().toArray(new TagMarker[0]);
-				for (int i = 0; i < prefixes.length; i++) {
-					if (prefix.equals(prefixes[i].getTagName())) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
+//		int colonIndex = tagName.indexOf(":");
+//		if (colonIndex > 0) {
+//			String prefix = tagName.substring(0, colonIndex);
+//			if (prefix.equals("jsp")) { //$NON-NLS-1$
+//				return false;
+//			}
+//			if (prefix.length() > 0) {
+//				TagMarker[] prefixes = (TagMarker[]) fLocalParser.getNestablePrefixes().toArray(new TagMarker[0]);
+//				for (int i = 0; i < prefixes.length; i++) {
+//					if (prefix.equals(prefixes[i].getTagName())) {
+//						return true;
+//					}
+//				}
+//			}
+//		}
+//		return false;
+		return tagName.indexOf(':') > -1 && !tagName.startsWith(JSPTranslator.JSP_PREFIX);
 	}
 
 	protected boolean isTaglibDirective(String tagName) {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java
index ef40a9e..99a7bf9 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2006 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,8 +12,10 @@
 
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
+import java.util.List;
 import java.util.Map;
 
+import org.eclipse.jst.jsp.core.jspel.ELProblem;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
@@ -30,16 +32,25 @@
     public ELGenerator() {
     } // constructor
 	
-
     /**
      * Check the netuiel AST and set diagnostics as necessary.
-     * @param translator TODO
-     * @param jspReferenceRegion TODO
-     * @param contentStart 
-     * @param contentLength 
+     * 
+     * @param root
+     * @param currentNode
+     * @param result
+     * @param codeMap
+     * @param document
+     * @param jspReferenceRegion
+     * @param contentStart
+     * @param contentLength
+     * @return a {@link List} of {@link ELProblem}s reported by the {@link ELGeneratorVisitor} this {@link ELGenerator} uses
      */
-    public void generate(ASTExpression root, IStructuredDocumentRegion currentNode, StringBuffer result, Map codeMap, IStructuredDocument document, ITextRegionCollection jspReferenceRegion, int contentStart, int contentLength) {
+    public List generate(ASTExpression root, IStructuredDocumentRegion currentNode, StringBuffer result, Map codeMap, IStructuredDocument document, ITextRegionCollection jspReferenceRegion, int contentStart, int contentLength) {
 		ELGeneratorVisitor visitor = new ELGeneratorVisitor(result, currentNode, codeMap, document, jspReferenceRegion, contentStart);
+		visitor.startFunctionDefinition(root.getFirstToken().beginColumn - 1);
 		root.jjtAccept(visitor, null);
+		visitor.endFunctionDefinition(root.getLastToken().endColumn - 1);
+		
+		return visitor.getELProblems();
     }
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java
index d8cb3a2..f6ea3da 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ELGeneratorVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2006 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,17 +15,27 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jface.text.Position;
+import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentImpl;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDFunction;
+import org.eclipse.jst.jsp.core.jspel.ELProblem;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
@@ -36,7 +46,7 @@
 	
 	private static final String fExpressionHeader1 = "public String _elExpression"; //$NON-NLS-1$
 	private static final String fExpressionHeader2 = "()" + ENDL + //$NON-NLS-1$
-	"\t\tthrows java.io.IOException, javax.servlet.ServletException {" + ENDL + //$NON-NLS-1$
+	"\t\tthrows java.io.IOException, javax.servlet.ServletException, javax.servlet.jsp.JspException {" + ENDL + //$NON-NLS-1$
 	"javax.servlet.jsp.PageContext pageContext = null;" + ENDL + //$NON-NLS-1$
 	"java.util.Map param = null;" + ENDL + //$NON-NLS-1$
 	"java.util.Map paramValues = null;" + ENDL + //$NON-NLS-1$
@@ -48,7 +58,22 @@
 	"java.util.Map requestScope = null;" + ENDL + //$NON-NLS-1$
 	"java.util.Map sessionScope = null;" + ENDL + //$NON-NLS-1$
 	"java.util.Map applicationScope = null;" + ENDL + //$NON-NLS-1$
-	"return \"\"+"; //$NON-NLS-1$
+	"return \"\"+( "; //$NON-NLS-1$
+
+	private static final String fExpressionHeader2_param = "()" + ENDL + //$NON-NLS-1$
+	"\t\tthrows java.io.IOException, javax.servlet.ServletException, javax.servlet.jsp.JspException {" + ENDL + //$NON-NLS-1$
+	"javax.servlet.jsp.PageContext pageContext = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, String> param = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, String[]> paramValues = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, String> header = null;" + ENDL + //$NON-NLS-1$ 
+	"java.util.Map<String, String[]> headerValues = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, javax.servlet.http.Cookie> cookie = null;" + ENDL + //$NON-NLS-1$ 
+	"java.util.Map<String, String> initParam = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, Object> pageScope = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, Object> requestScope = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, Object> sessionScope = null;" + ENDL + //$NON-NLS-1$
+	"java.util.Map<String, Object> applicationScope = null;" + ENDL + //$NON-NLS-1$
+	"return \"\"+( "; //$NON-NLS-1$
 	
 	private static final String fJspImplicitObjects[] = { "pageContext" }; //$NON-NLS-1$
 	
@@ -67,7 +92,7 @@
 		}
 	}
 	
-	private static final String fFooter = " ;" + ENDL + "}" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$
+	private static final String fFooter = " );" + ENDL + "}" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$
 
 	private StringBuffer fResult;
 	private Map fCodeMap;
@@ -76,13 +101,19 @@
 	private IStructuredDocument fDocument = null;
 	private int fContentStart;
 	private static Map fOperatorMap;
-	
+	// start of the generated function definition, if any:
+	private int fGeneratedFunctionStart;
+
 	// this flag lets us know if we were unable to generate for some reason.  One possible reason is that the expression 
 	// contains a reference to a variable for which information is only available at runtime.
 	private boolean fCanGenerate = true;
 
 	private IStructuredDocumentRegion fCurrentNode;
 
+	private boolean fUseParameterizedTypes;
+
+	private List fELProblems;
+
 	/**
 	 * Tranlsation of XML-style operators to java
 	 */
@@ -116,6 +147,9 @@
 		fContentStart = contentStart;
 		fDocument = document;
 		fCurrentNode = currentNode;
+		fGeneratedFunctionStart = -1; //set when generating function definition
+		fUseParameterizedTypes = compilerSupportsParameterizedTypes();
+		fELProblems = new ArrayList();
 	}
 
 	/**
@@ -191,7 +225,10 @@
 				for(Iterator it = functions.iterator(); it.hasNext(); ) {
 					TLDFunction function = (TLDFunction)it.next();
 					if(function.getName().equals(functionName)) {
-						return function.getClassName() + "." + function.getName(); //$NON-NLS-1$
+						String javaFuncName = getFunctionNameFromSignature(function.getSignature());
+						if (javaFuncName == null)
+							javaFuncName = functionName;
+						return function.getClassName() + "." + javaFuncName; //$NON-NLS-1$
 					}
 				}
 			}
@@ -214,24 +251,63 @@
 	 * Handle top-level expression
 	 */
 	public Object visit(ASTExpression node, Object data) {
-		int start = node.getFirstToken().beginColumn - 1;
-		int end = node.lastToken.endColumn - 1;
-		append(fExpressionHeader1, start, start);
-		append(Integer.toString(getMethodCounter()), start, start);
-		append(fExpressionHeader2, start, start);
-		
-		Object retval = node.childrenAccept(this, data);
-
-		append(fFooter, end, end);
-		
-		// something is preventing good code generation so empty out the result and the map.
-		if(!fCanGenerate) {
-			fResult.delete(0, fResult.length());
-			fCodeMap.clear();			
-		}
-		return retval;
+		return node.childrenAccept(this, data);
 	}
 
+	public void startFunctionDefinition(int start) {
+		fGeneratedFunctionStart = fResult.length();
+		append(fExpressionHeader1, start, start);
+		append(Integer.toString(getMethodCounter()), start, start);
+		if (fUseParameterizedTypes)
+			append(fExpressionHeader2_param, start, start);
+		else
+			append(fExpressionHeader2, start, start);
+	}
+
+	public void endFunctionDefinition(int end) {
+		if (fGeneratedFunctionStart < 0) {
+			throw new IllegalStateException("Cannot end function definition because none has been started."); //$NON-NLS-1$
+		}
+		append(fFooter, end, end);
+
+		// something is preventing good code generation so empty out the result
+		// and the map.
+		if (!fCanGenerate) {
+			fResult.delete(fGeneratedFunctionStart, fResult.length());
+			fOffsetInUserCode = fResult.length();
+			// remove all fCodeMap entries for the removed code:
+			for (Iterator it = fCodeMap.entrySet().iterator(); it.hasNext();) {
+				Map.Entry entry = (Entry) it.next();
+				if (entry.getKey() instanceof Position) {
+					Position pos = (Position) entry.getKey();
+					if (pos.getOffset() >= fGeneratedFunctionStart) {
+						it.remove();
+					}
+				}
+			}
+		}
+		fGeneratedFunctionStart = -1;
+	}
+
+
+	private boolean compilerSupportsParameterizedTypes() {
+		if (fDocument != null) {
+			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+			IPath location = TaglibController.getLocation(fDocument);
+			if (location != null && location.segmentCount() > 0) {
+				IJavaProject project = JavaCore.create(root.getProject(location.segment(0)));
+				String compliance = project.getOption(JavaCore.COMPILER_SOURCE, true);
+				try {
+					return Float.parseFloat(compliance) >= 1.5;
+				}
+				catch (NumberFormatException e) {
+					return false;
+				}
+			}
+		}
+		return false;
+	}
+	
 	/**
 	 * Generically generate an operator node.
 	 * 
@@ -364,8 +440,9 @@
 			if(node.jjtGetChild(0) instanceof ASTValuePrefix && node.jjtGetChild(1) instanceof ASTValueSuffix) {
 				ASTValuePrefix prefix = (ASTValuePrefix) node.jjtGetChild(0);
 				ASTValueSuffix suffix = (ASTValueSuffix) node.jjtGetChild(1);
-				if(prefix.firstToken.image.equals("pageContext") && suffix.getPropertyNameToken().image.equals("request")) {
-					append("((HTTPServletRequest)");
+				//content assist can cause a null pointer here without the extra null check
+				if(prefix.firstToken.image.equals("pageContext") && suffix.getPropertyNameToken() != null && suffix.getPropertyNameToken().image.equals("request")) {
+					append("((HttpServletRequest)");
 				}
 			}
 		}
@@ -378,7 +455,7 @@
 	 */
 	public Object visit(ASTValuePrefix node, Object data) {
 		// this is a raw identifier.  May sure it's an implicit object.
-		// This is the primary plae where modification is needed to 
+		// This is the primary place where modification is needed to 
 		// support JSF backing beans.
 		if(null == node.children) {
 			if(isCompletingObject(node.firstToken.image)) {
@@ -426,7 +503,10 @@
 				append(")");
 			} 
 
-
+		} else if(node.getLastToken().image.equals(".") && node.getLastToken().next.image.equals("")) { //$NON-NLS-1$ //$NON-NLS-2$
+			//this allows for content assist in the case of something along the lines of "pageContext." and then ctl-space
+			append(node.firstToken);
+			append("get()", node.getLastToken().beginColumn, node.getLastToken().beginColumn); //$NON-NLS-1$
 		} else {
 			append(node.firstToken);
 		}
@@ -439,26 +519,143 @@
 	 */
 	public Object visit(ASTFunctionInvocation node, Object data) {
 		String functionTranslation = genFunction(node.getFullFunctionName());
-		if(null != functionTranslation)
-		{
-			append(functionTranslation + "(", node.getFirstToken()); //$NON-NLS-1$
-			for(int i = 0; i < node.children.length; i++) {
-				node.children[i].jjtAccept(this, data);
-				if( node.children.length - i > 1){
-					append(","); //$NON-NLS-1$
+		if(null != functionTranslation) {
+
+			//find the token representing the function name
+			Token jspFuncNameToken = getJSPFuncNameToken(node);
+			
+			/* if there is a dot in the function name then separate out the class path
+			 * from the function name and append.
+			 * else just append
+			 * in both cases use the jsp function name token as the mapped token
+			 */
+			int indexOfDot = functionTranslation.lastIndexOf('.');
+			if(indexOfDot != -1) {
+				String funcClass = functionTranslation.substring(0,indexOfDot+1);
+				String funcName = functionTranslation.substring(indexOfDot+1);
+				append(funcClass, jspFuncNameToken);
+				append(funcName, jspFuncNameToken);
+			} else {
+				append(functionTranslation, jspFuncNameToken);
+			}
+			
+			//append any parameters
+			append("(");
+			if(node.children != null) {
+				for(int i = 0; i < node.children.length; i++) {
+					node.children[i].jjtAccept(this, data);
+					if( node.children.length - i > 1){
+						append(","); //$NON-NLS-1$
+					}
 				}
 			}
 			append(")"); //$NON-NLS-1$
 		}
+		else {
+			//column offsets are 1 based not 0 based, thus subtract one
+			final int problemOffset = fContentStart + node.getFirstToken().beginColumn - 1;
+			final int problemLength = node.getLastToken().endColumn - 1;
+
+			//could not find function translation so report error
+			fELProblems.add(new ELProblem(new Position(problemOffset, problemLength), NLS.bind(JSPCoreMessages.JSPELTranslator_0, node.getFullFunctionName())));
+			
+			//error message to be injected into translation purely for debugging purposes
+			String errorMsg = "\"Could not find function translation for: " + node.getFullFunctionName() + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+			append(errorMsg);
+ 		}
 		return null;
 	}
 
 	/**
+	 * @return the {@link ELProblem}s found by this visitor
+	 */
+	public List getELProblems() {
+		return fELProblems;
+	}
+
+	/**
 	 * Literal
 	 */
 	public Object visit(ASTLiteral node, Object data) {
-		// TODO any further translation needed?
+		if (isSingleQuotedStringLiteral(node)) {
+			//replace the single quotes with double quotes quotes
+			//so java compiler will be happy
+			//(see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=104943)
+			String image = node.firstToken.image;
+			image = "\"" + image.substring(1, image.length()-1) + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+			node.firstToken.image = image;
+		}
+		
 		append(node.firstToken);
 		return null;
 	}
+	
+	/**
+	 * Indicates whether the given ASTLiteral is a single quoted string literal,
+	 * As opposed to a double quoted ASTLiteral
+	 * 
+	 * @param node the ASTLiteral to check to see if it is single quoted
+	 * 
+	 * @return true, if the given token is a single quoted string literal,
+	 * false otherwise
+	 */
+	private static boolean isSingleQuotedStringLiteral(ASTLiteral node) {
+		String content = node.firstToken.image;
+		return content.length() > 1 && content.startsWith("'") && content.endsWith("'"); //$NON-NLS-1$ // $NON-NLS-2$
+	}
+
+	/**
+	 * <p>Given a method signature parse out the method name and return it.
+	 * The method name in the signature is found by finding a word with
+	 * whitespace before it and a '<code>(</code>' after it.</p>
+	 * 
+	 * @param methodSignature the signature of the method to get the method name out of.
+	 * @return the method name from the given signature, or <code>null</code> if it
+	 * can not be found.
+	 */
+	private static String getFunctionNameFromSignature (String methodSignature) {
+		int length = methodSignature.length();
+		char c = 0;
+		int identifierStart = -1;
+		int whitespaceStart = -1;
+		// keep track of the index of the last identifier before the (
+		for (int i = 0; i < length; i++) {
+			c = methodSignature.charAt(i);
+			if (Character.isJavaIdentifierPart(c) && whitespaceStart >= identifierStart)
+				identifierStart = i;
+			else if (Character.isWhitespace(c))
+				whitespaceStart = i;
+			else if (c == '(') {
+				if (identifierStart >= 0) {
+					return methodSignature.substring(identifierStart, i).trim();
+				}
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * Returns the {@link Token} the represents the function name in
+	 * the {@link ASTFunctionInvocation}. This is designated as the
+	 * first token after the {@link Token} whose image is ":".
+	 * If such a token can not be found then the first token of the
+	 * {@link ASTFunctionInvocation} is returned.
+	 * 
+	 * @param funcInvo the {@link ASTFunctionInvocation} to find the function name {@link Token} in
+	 * @return the {@link Token} in the given {@link ASTFunctionInvocation} that represents the
+	 * function name, or if that can't be found the first {@link Token} in the {@link ASTFunctionInvocation}.
+	 */
+	private Token getJSPFuncNameToken(ASTFunctionInvocation funcInvo) {
+		Token funcNameToken = funcInvo.getFirstToken();
+		
+		Token temp = funcInvo.getFirstToken();
+		do {
+			if(temp.image.equals(":")) {
+				funcNameToken = temp.next;
+			}
+		} while(temp.next != null && funcNameToken == null);
+			
+		
+		return funcNameToken;
+	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JJTJSPELParserState.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JJTJSPELParserState.java
index 6e7436c..951a84b 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JJTJSPELParserState.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JJTJSPELParserState.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,23 +7,23 @@
  * 
  * Contributors:
  *     BEA Systems - initial implementation
- *     
+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping
+ *
  *******************************************************************************/
-/* Generated By:JJTree: Do not edit this line. JJTJSPELParserState.java */
-
+/* Generated By:JavaCC: Do not edit this line. JJTJSPELParserState.java Version 4.2 */
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
-class JJTJSPELParserState {
-  private java.util.Stack nodes;
-  private java.util.Stack marks;
+public class JJTJSPELParserState {
+  private java.util.List nodes;
+  private java.util.List marks;
 
-  private int sp;		// number of nodes on stack
-  private int mk;		// current mark
+  private int sp;        // number of nodes on stack
+  private int mk;        // current mark
   private boolean node_created;
 
-  JJTJSPELParserState() {
-    nodes = new java.util.Stack();
-    marks = new java.util.Stack();
+  public JJTJSPELParserState() {
+    nodes = new java.util.ArrayList();
+    marks = new java.util.ArrayList();
     sp = 0;
     mk = 0;
   }
@@ -31,62 +31,62 @@
   /* Determines whether the current node was actually closed and
      pushed.  This should only be called in the final user action of a
      node scope.  */
-  boolean nodeCreated() {
+  public boolean nodeCreated() {
     return node_created;
   }
 
   /* Call this to reinitialize the node stack.  It is called
      automatically by the parser's ReInit() method. */
-  void reset() {
-    nodes.removeAllElements();
-    marks.removeAllElements();
+  public void reset() {
+    nodes.clear();
+    marks.clear();
     sp = 0;
     mk = 0;
   }
 
   /* Returns the root node of the AST.  It only makes sense to call
      this after a successful parse. */
-  Node rootNode() {
-    return (Node)nodes.elementAt(0);
+  public Node rootNode() {
+    return (Node)nodes.get(0);
   }
 
   /* Pushes a node on to the stack. */
-  void pushNode(Node n) {
-    nodes.push(n);
+  public void pushNode(Node n) {
+    nodes.add(n);
     ++sp;
   }
 
   /* Returns the node on the top of the stack, and remove it from the
      stack.  */
-  Node popNode() {
+  public Node popNode() {
     if (--sp < mk) {
-      mk = ((Integer)marks.pop()).intValue();
+      mk = ((Integer)marks.remove(marks.size()-1)).intValue();
     }
-    return (Node)nodes.pop();
+    return (Node)nodes.remove(nodes.size()-1);
   }
 
   /* Returns the node currently on the top of the stack. */
-  Node peekNode() {
-    return (Node)nodes.peek();
+  public Node peekNode() {
+    return (Node)nodes.get(nodes.size()-1);
   }
 
   /* Returns the number of children on the stack in the current node
      scope. */
-  int nodeArity() {
+  public int nodeArity() {
     return sp - mk;
   }
 
 
-  void clearNodeScope(Node n) {
+  public void clearNodeScope(Node n) {
     while (sp > mk) {
       popNode();
     }
-    mk = ((Integer)marks.pop()).intValue();
+    mk = ((Integer)marks.remove(marks.size()-1)).intValue();
   }
 
 
-  void openNodeScope(Node n) {
-    marks.push(new Integer(mk));
+  public void openNodeScope(Node n) {
+    marks.add(new Integer(mk));
     mk = sp;
     n.jjtOpen();
   }
@@ -96,8 +96,8 @@
      children.  That number of nodes are popped from the stack and
      made the children of the definite node.  Then the definite node
      is pushed on to the stack. */
-  void closeNodeScope(Node n, int num) {
-    mk = ((Integer)marks.pop()).intValue();
+  public void closeNodeScope(Node n, int num) {
+    mk = ((Integer)marks.remove(marks.size()-1)).intValue();
     while (num-- > 0) {
       Node c = popNode();
       c.jjtSetParent(n);
@@ -111,24 +111,25 @@
 
   /* A conditional node is constructed if its condition is true.  All
      the nodes that have been pushed since the node was opened are
-     made children of the the conditional node, which is then pushed
+     made children of the conditional node, which is then pushed
      on to the stack.  If the condition is false the node is not
      constructed and they are left on the stack. */
-  void closeNodeScope(Node n, boolean condition) {
+  public void closeNodeScope(Node n, boolean condition) {
     if (condition) {
       int a = nodeArity();
-      mk = ((Integer)marks.pop()).intValue();
+      mk = ((Integer)marks.remove(marks.size()-1)).intValue();
       while (a-- > 0) {
-	Node c = popNode();
-	c.jjtSetParent(n);
-	n.jjtAddChild(c, a);
+        Node c = popNode();
+        c.jjtSetParent(n);
+        n.jjtAddChild(c, a);
       }
       n.jjtClose();
       pushNode(n);
       node_created = true;
     } else {
-      mk = ((Integer)marks.pop()).intValue();
+      mk = ((Integer)marks.remove(marks.size()-1)).intValue();
       node_created = false;
     }
   }
 }
+/* JavaCC - OriginalChecksum=cf01a3e21044e1fa20cdfdc7a552e885 (do not edit this line) */
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jj b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jj
index 0e383b4..499e8c6 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jj
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jj
@@ -1,5 +1,6 @@
-*******************************************************************************

- * Copyright (c) 2005 BEA Systems and others.

+/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. JSPEL.jj */

+/*@egen*//*******************************************************************************

+ * Copyright (c) 2005, 2010 BEA Systems and others.

  * All rights reserved. This program and the accompanying materials

  * are made available under the terms of the Eclipse Public License v1.0

  * which accompanies this distribution, and is available at

@@ -7,10 +8,10 @@
  * 

  * Contributors:

  *     BEA Systems - initial implementation

- *     

+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping

+ *

  *******************************************************************************/

-/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. JSPEL.jj */

-/*@egen*//* I know that haing some of these options on one line is rude but 

+/* I know that having some of these options on one line is rude but 

  * if we don't do that the line number reported from javacc are off

  * which, trust me, is far more annoying.  --tcarroll@bea.com

  */

@@ -76,8 +77,8 @@
   < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >

 |

   < STRING_LITERAL:

-      ("\"" ((~["\"","\\"]) | ("\\" ( ["\\","\""] )))* "\"") |

-      ("\'" ((~["\'","\\"]) | ("\\" ( ["\\","\'"] )))* "\'")

+      ("\"" ((~["\"","\\"]) | ("\\" ( ["\\","\"","\'"] )))* "\"") |

+      ("\'" ((~["\'","\\"]) | ("\\" ( ["\\","\'","\""] )))* "\'")

   >

 |

   < BADLY_ESCAPED_STRING_LITERAL:

@@ -177,12 +178,12 @@
 {/*@bgen(jjtree) Expression */

         try {

 /*@egen*/

-        (LOOKAHEAD("?") ChoiceExpression() | OrExpression())/*@bgen(jjtree)*/

-                                                             {

-                                                               jjtree.closeNodeScope(jjtn000, true);

-                                                               jjtc000 = false;

-                                                               jjtreeCloseNodeScope(jjtn000);

-                                                             }

+        (LOOKAHEAD(ChoiceExpression()) ChoiceExpression() | OrExpression())/*@bgen(jjtree)*/

+                                                                            {

+                                                                              jjtree.closeNodeScope(jjtn000, true);

+                                                                              jjtc000 = false;

+                                                                              jjtreeCloseNodeScope(jjtn000);

+                                                                            }

 /*@egen*/ { return jjtn000; }/*@bgen(jjtree)*/

         } catch (Throwable jjte000) {

           if (jjtc000) {

@@ -545,7 +546,7 @@
 {/*@bgen(jjtree) ValuePrefix */

     try {

 /*@egen*/

-    Literal() | (<LPAREN> Expression() <RPAREN>) | LOOKAHEAD(3) FunctionInvocation() | <IDENTIFIER>/*@bgen(jjtree)*/

+    Literal() | (<LPAREN> (Expression())? <RPAREN>) | LOOKAHEAD(3) FunctionInvocation() | <IDENTIFIER>/*@bgen(jjtree)*/

     } catch (Throwable jjte000) {

       if (jjtc000) {

         jjtree.clearNodeScope(jjtn000);

@@ -631,7 +632,7 @@
             else if(null != name)

                     jjtn000.setFullFunctionName(name.image);

         }

-        (<LPAREN> Expression() (<COMMA> Expression())* try  { (<RPAREN>) } catch (Exception e) {} )?/*@bgen(jjtree)*/

+        (<LPAREN> (Expression())? (<COMMA> Expression())* try  { (<RPAREN>) } catch (Exception e) {} )?/*@bgen(jjtree)*/

     } catch (Throwable jjte000) {

       if (jjtc000) {

         jjtree.clearNodeScope(jjtn000);

diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jjt b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jjt
index 9fd40d9..66d2c79 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jjt
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPEL.jjt
@@ -1,5 +1,5 @@
-*******************************************************************************

- * Copyright (c) 2005 BEA Systems and others.

+/*******************************************************************************

+ * Copyright (c) 2005, 2010 BEA Systems and others.

  * All rights reserved. This program and the accompanying materials

  * are made available under the terms of the Eclipse Public License v1.0

  * which accompanies this distribution, and is available at

@@ -7,7 +7,8 @@
  * 

  * Contributors:

  *     BEA Systems - initial implementation

- *     

+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping

+ *

  *******************************************************************************/

 /* I know that having some of these options on one line is rude but 

  * if we don't do that the line number reported from javacc are off

@@ -72,8 +73,8 @@
   < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >

 |

   < STRING_LITERAL:

-      ("\"" ((~["\"","\\"]) | ("\\" ( ["\\","\""] )))* "\"") |

-      ("\'" ((~["\'","\\"]) | ("\\" ( ["\\","\'"] )))* "\'")

+      ("\"" ((~["\"","\\"]) | ("\\" ( ["\\","\"","\'"] )))* "\"") |

+      ("\'" ((~["\'","\\"]) | ("\\" ( ["\\","\'","\""] )))* "\'")

   >

 |

   < BADLY_ESCAPED_STRING_LITERAL:

@@ -166,7 +167,7 @@
 

 ASTExpression Expression() : {}

 {

-        (LOOKAHEAD("?") ChoiceExpression() | OrExpression()) { return jjtThis; }

+        (LOOKAHEAD(ChoiceExpression()) ChoiceExpression() | OrExpression()) { return jjtThis; }

 }

 

 void OrExpression() #OrExpression(>1) : 

@@ -248,7 +249,7 @@
 

 void ValuePrefix() : {}

 {

-    Literal() | (<LPAREN> Expression() <RPAREN>) | LOOKAHEAD(3) FunctionInvocation() | <IDENTIFIER> 

+    Literal() | (<LPAREN> (Expression())? <RPAREN>) | LOOKAHEAD(3) FunctionInvocation() | <IDENTIFIER> 

 }

 

 void ValueSuffix() : 

@@ -272,7 +273,7 @@
             else if(null != name)

                     jjtThis.setFullFunctionName(name.image);

         }

-        (<LPAREN> Expression() (<COMMA> Expression())* try  { (<RPAREN>) } catch (Exception e) {} )?

+        (<LPAREN> (Expression())? (<COMMA> Expression())* try  { (<RPAREN>) } catch (Exception e) {} )?

 }

 

 void Literal() : {}

diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParser.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParser.java
index 5c01bae..9e3c2e7 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParser.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,7 +7,8 @@
  * 
  * Contributors:
  *     BEA Systems - initial implementation
- *     
+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping
+ *
  *******************************************************************************/
 /* Generated By:JJTree&JavaCC: Do not edit this line. JSPELParser.java */
 package org.eclipse.jst.jsp.core.internal.java.jspel;
@@ -65,10 +66,10 @@
           throw new ParseException();
         }
       }
-                                                               jjtree.closeNodeScope(jjtn000, true);
-                                                               jjtc000 = false;
-                                                               jjtreeCloseNodeScope(jjtn000);
-                                                               {if (true) return jjtn000;}
+                                                                              jjtree.closeNodeScope(jjtn000, true);
+                                                                              jjtc000 = false;
+                                                                              jjtreeCloseNodeScope(jjtn000);
+                                                                              {if (true) return jjtn000;}
     } catch (Throwable jjte000) {
           if (jjtc000) {
             jjtree.clearNodeScope(jjtn000);
@@ -105,7 +106,6 @@
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case OR1:
         case OR2:
-          
           break;
         default:
           jj_la1[1] = jj_gen;
@@ -161,7 +161,6 @@
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case AND1:
         case AND2:
-          
           break;
         default:
           jj_la1[3] = jj_gen;
@@ -219,7 +218,6 @@
         case EQ2:
         case NEQ1:
         case NEQ2:
-          
           break;
         default:
           jj_la1[5] = jj_gen;
@@ -287,7 +285,6 @@
         case LE2:
         case GE1:
         case GE2:
-          
           break;
         default:
           jj_la1[7] = jj_gen;
@@ -361,7 +358,6 @@
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case PLUS:
         case MINUS:
-          
           break;
         default:
           jj_la1[9] = jj_gen;
@@ -420,7 +416,6 @@
         case DIVIDE2:
         case MODULUS1:
         case MODULUS2:
-          
           break;
         default:
           jj_la1[11] = jj_gen;
@@ -588,7 +583,6 @@
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case DOT:
         case LBRACKET:
-          
           break;
         default:
           jj_la1[15] = jj_gen;
@@ -636,11 +630,28 @@
         break;
       case LPAREN:
         jj_consume_token(LPAREN);
-        Expression();
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case TRUE:
+        case FALSE:
+        case NULL:
+        case LPAREN:
+        case MINUS:
+        case NOT1:
+        case NOT2:
+        case EMPTY:
+        case IDENTIFIER:
+          Expression();
+          break;
+        default:
+          jj_la1[16] = jj_gen;
+        }
         jj_consume_token(RPAREN);
         break;
       default:
-        jj_la1[16] = jj_gen;
+        jj_la1[17] = jj_gen;
         if (jj_2_2(3)) {
           FunctionInvocation();
         } else {
@@ -649,7 +660,7 @@
             jj_consume_token(IDENTIFIER);
             break;
           default:
-            jj_la1[17] = jj_gen;
+            jj_la1[18] = jj_gen;
             jj_consume_token(-1);
             throw new ParseException();
           }
@@ -692,8 +703,7 @@
           t = jj_consume_token(IDENTIFIER);
           break;
         default:
-          jj_la1[18] = jj_gen;
-          
+          jj_la1[19] = jj_gen;
         }
                                       jjtree.closeNodeScope(jjtn000, true);
                                       jjtc000 = false;
@@ -706,7 +716,7 @@
         jj_consume_token(RBRACKET);
         break;
       default:
-        jj_la1[19] = jj_gen;
+        jj_la1[20] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -747,8 +757,7 @@
         name = jj_consume_token(IDENTIFIER);
         break;
       default:
-        jj_la1[20] = jj_gen;
-        
+        jj_la1[21] = jj_gen;
       }
             if(null != prefix && null != name)
                     jjtn000.setFullFunctionName(prefix.image + ":" + (null == name ? "" : name.image));
@@ -757,15 +766,31 @@
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case LPAREN:
         jj_consume_token(LPAREN);
-        Expression();
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case TRUE:
+        case FALSE:
+        case NULL:
+        case LPAREN:
+        case MINUS:
+        case NOT1:
+        case NOT2:
+        case EMPTY:
+        case IDENTIFIER:
+          Expression();
+          break;
+        default:
+          jj_la1[22] = jj_gen;
+        }
         label_8:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case COMMA:
-            
             break;
           default:
-            jj_la1[21] = jj_gen;
+            jj_la1[23] = jj_gen;
             break label_8;
           }
           jj_consume_token(COMMA);
@@ -778,8 +803,7 @@
         }
         break;
       default:
-        jj_la1[22] = jj_gen;
-        
+        jj_la1[24] = jj_gen;
       }
     } catch (Throwable jjte000) {
       if (jjtc000) {
@@ -830,7 +854,7 @@
         jj_consume_token(NULL);
         break;
       default:
-        jj_la1[23] = jj_gen;
+        jj_la1[25] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -856,89 +880,439 @@
     finally { jj_save(1, xla); }
   }
 
-  final private boolean jj_3R_10() {
-    if (jj_scan_token(LPAREN)) return true;
+  final private boolean jj_3_1() {
+    if (jj_3R_9()) return true;
     return false;
   }
 
-  final private boolean jj_3R_9() {
+  final private boolean jj_3R_11() {
+    if (jj_3R_13()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_14()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_34() {
+    if (jj_3R_37()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_38() {
+    if (jj_3R_9()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_37() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_38()) {
+    jj_scanpos = xsp;
+    if (jj_3R_39()) return true;
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_10() {
     if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_scan_token(COLON)) return true;
     Token xsp;
     xsp = jj_scanpos;
     if (jj_scan_token(47)) jj_scanpos = xsp;
     xsp = jj_scanpos;
-    if (jj_3R_10()) jj_scanpos = xsp;
+    if (jj_3R_12()) jj_scanpos = xsp;
+    return false;
+  }
+
+  final private boolean jj_3R_36() {
+    if (jj_scan_token(LBRACKET)) return true;
+    if (jj_3R_37()) return true;
+    if (jj_scan_token(RBRACKET)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_29() {
+    if (jj_3R_32()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_31() {
+    if (jj_scan_token(LPAREN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_34()) jj_scanpos = xsp;
+    if (jj_scan_token(RPAREN)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_32() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_35()) {
+    jj_scanpos = xsp;
+    if (jj_3R_36()) return true;
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_35() {
+    if (jj_scan_token(DOT)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(47)) jj_scanpos = xsp;
+    return false;
+  }
+
+  final private boolean jj_3R_28() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_30()) {
+    jj_scanpos = xsp;
+    if (jj_3R_31()) {
+    jj_scanpos = xsp;
+    if (jj_3_2()) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(47)) return true;
+    }
+    }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_30() {
+    if (jj_3R_33()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_27() {
+    if (jj_3R_28()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_29()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_26() {
+    if (jj_3R_27()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_23() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_25()) {
+    jj_scanpos = xsp;
+    if (jj_3R_26()) return true;
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_22() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(32)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(33)) return true;
+    }
+    if (jj_3R_21()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_25() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(39)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(40)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(33)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(45)) return true;
+    }
+    }
+    }
+    if (jj_3R_23()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_24() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(34)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(35)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(36)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(37)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(38)) return true;
+    }
+    }
+    }
+    }
+    if (jj_3R_23()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_9() {
+    if (jj_3R_11()) return true;
+    if (jj_scan_token(COND)) return true;
+    if (jj_3R_11()) return true;
+    if (jj_scan_token(COLON)) return true;
+    if (jj_3R_11()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_21() {
+    if (jj_3R_23()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_24()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_39() {
+    if (jj_3R_11()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_19() {
+    if (jj_3R_21()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_22()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_20() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(16)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(17)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(14)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(15)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(22)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(23)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(20)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(21)) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    if (jj_3R_19()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_16() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(41)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(42)) return true;
+    }
+    if (jj_3R_15()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_41() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_37()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_17() {
+    if (jj_3R_19()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_20()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
   final private boolean jj_3_2() {
-    if (jj_3R_9()) return true;
+    if (jj_3R_10()) return true;
     return false;
   }
 
-  final private boolean jj_3_1() {
-    if (jj_scan_token(COND)) return true;
+  final private boolean jj_3R_18() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(18)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(19)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(24)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(25)) return true;
+    }
+    }
+    }
+    if (jj_3R_17()) return true;
     return false;
   }
 
+  final private boolean jj_3R_15() {
+    if (jj_3R_17()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_18()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_14() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(43)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(44)) return true;
+    }
+    if (jj_3R_13()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_40() {
+    if (jj_3R_37()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_13() {
+    if (jj_3R_15()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_16()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_33() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(10)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(11)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(5)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(6)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(8)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(12)) return true;
+    }
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_12() {
+    if (jj_scan_token(LPAREN)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_40()) jj_scanpos = xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_41()) { jj_scanpos = xsp; break; }
+    }
+    if (jj_scan_token(RPAREN)) return true;
+    return false;
+  }
+
+  /** Generated Token Manager. */
   public JSPELParserTokenManager token_source;
   SimpleCharStream jj_input_stream;
-  public Token token, jj_nt;
+  /** Current token. */
+  public Token token;
+  /** Next token. */
+  public Token jj_nt;
   private int jj_ntk;
   private Token jj_scanpos, jj_lastpos;
   private int jj_la;
-  public boolean lookingAhead = false;
-//  private boolean jj_semLA;
   private int jj_gen;
-  final private int[] jj_la1 = new int[24];
+  final private int[] jj_la1 = new int[26];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static {
-      jj_la1_0();
-      jj_la1_1();
+      jj_la1_init_0();
+      jj_la1_init_1();
    }
-   private static void jj_la1_0() {
-      jj_la1_0 = new int[] {0x4001d60,0x0,0x0,0x0,0x0,0x30c0000,0x30c0000,0xf3c000,0xf3c000,0x0,0x0,0x0,0x0,0x0,0x4001d60,0x40002000,0x4001d60,0x0,0x0,0x40002000,0x0,0x10000000,0x4000000,0x1d60,};
+   private static void jj_la1_init_0() {
+      jj_la1_0 = new int[] {0x4001d60,0x0,0x0,0x0,0x0,0x30c0000,0x30c0000,0xf3c000,0xf3c000,0x0,0x0,0x0,0x0,0x0,0x4001d60,0x40002000,0x4001d60,0x4001d60,0x0,0x0,0x40002000,0x0,0x4001d60,0x10000000,0x4000000,0x1d60,};
    }
-   private static void jj_la1_1() {
-      jj_la1_1 = new int[] {0xa182,0x1800,0x1800,0x600,0x600,0x0,0x0,0x0,0x0,0x3,0x3,0x7c,0x7c,0x2182,0xa182,0x0,0x0,0x8000,0x8000,0x0,0x8000,0x0,0x0,0x0,};
+   private static void jj_la1_init_1() {
+      jj_la1_1 = new int[] {0xa182,0x1800,0x1800,0x600,0x600,0x0,0x0,0x0,0x0,0x3,0x3,0x7c,0x7c,0x2182,0xa182,0x0,0xa182,0x0,0x8000,0x8000,0x0,0x8000,0xa182,0x0,0x0,0x0,};
    }
   final private JJCalls[] jj_2_rtns = new JJCalls[2];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
+  /** Constructor with InputStream. */
   public JSPELParser(java.io.InputStream stream) {
-    jj_input_stream = new SimpleCharStream(stream, 1, 1);
+     this(stream, null);
+  }
+  /** Constructor with InputStream and supplied encoding */
+  public JSPELParser(java.io.InputStream stream, String encoding) {
+    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
     token_source = new JSPELParserTokenManager(jj_input_stream);
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 26; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
+  /** Reinitialise. */
   public void ReInit(java.io.InputStream stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
+     ReInit(stream, null);
+  }
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream stream, String encoding) {
+    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
     token_source.ReInit(jj_input_stream);
     token = new Token();
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 26; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
+  /** Constructor. */
   public JSPELParser(java.io.Reader stream) {
     jj_input_stream = new SimpleCharStream(stream, 1, 1);
     token_source = new JSPELParserTokenManager(jj_input_stream);
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 26; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
+  /** Reinitialise. */
   public void ReInit(java.io.Reader stream) {
     jj_input_stream.ReInit(stream, 1, 1);
     token_source.ReInit(jj_input_stream);
@@ -946,26 +1320,28 @@
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 26; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
+  /** Constructor with generated Token Manager. */
   public JSPELParser(JSPELParserTokenManager tm) {
     token_source = tm;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 26; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
+  /** Reinitialise. */
   public void ReInit(JSPELParserTokenManager tm) {
     token_source = tm;
     token = new Token();
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 26; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -1018,6 +1394,8 @@
     return false;
   }
 
+
+/** Get the next Token. */
   final public Token getNextToken() {
     if (token.next != null) token = token.next;
     else token = token.next = token_source.getNextToken();
@@ -1026,8 +1404,9 @@
     return token;
   }
 
+/** Get the specific Token. */
   final public Token getToken(int index) {
-    Token t = lookingAhead ? jj_scanpos : token;
+    Token t = token;
     for (int i = 0; i < index; i++) {
       if (t.next != null) t = t.next;
       else t = t.next = token_source.getNextToken();
@@ -1042,7 +1421,7 @@
       return (jj_ntk = jj_nt.kind);
   }
 
-  private java.util.Vector jj_expentries = new java.util.Vector();
+  private java.util.List jj_expentries = new java.util.ArrayList();
   private int[] jj_expentry;
   private int jj_kind = -1;
   private int[] jj_lasttokens = new int[100];
@@ -1057,36 +1436,31 @@
       for (int i = 0; i < jj_endpos; i++) {
         jj_expentry[i] = jj_lasttokens[i];
       }
-      boolean exists = false;
-      for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) {
-        int[] oldentry = (int[])(e.nextElement());
+      jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) {
+        int[] oldentry = (int[])(it.next());
         if (oldentry.length == jj_expentry.length) {
-          exists = true;
           for (int i = 0; i < jj_expentry.length; i++) {
             if (oldentry[i] != jj_expentry[i]) {
-              exists = false;
-              break;
+              continue jj_entries_loop;
             }
           }
-          if (exists) break;
+          jj_expentries.add(jj_expentry);
+          break jj_entries_loop;
         }
       }
-      if (!exists) jj_expentries.addElement(jj_expentry);
       if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
     }
   }
 
+  /** Generate ParseException. */
   public ParseException generateParseException() {
-    jj_expentries.removeAllElements();
+    jj_expentries.clear();
     boolean[] la1tokens = new boolean[51];
-    for (int i = 0; i < 51; i++) {
-      la1tokens[i] = false;
-    }
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 24; i++) {
+    for (int i = 0; i < 26; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -1102,7 +1476,7 @@
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
-        jj_expentries.addElement(jj_expentry);
+        jj_expentries.add(jj_expentry);
       }
     }
     jj_endpos = 0;
@@ -1110,20 +1484,23 @@
     jj_add_error_token(0, 0);
     int[][] exptokseq = new int[jj_expentries.size()][];
     for (int i = 0; i < jj_expentries.size(); i++) {
-      exptokseq[i] = (int[])jj_expentries.elementAt(i);
+      exptokseq[i] = (int[])jj_expentries.get(i);
     }
     return new ParseException(token, exptokseq, tokenImage);
   }
 
+  /** Enable tracing. */
   final public void enable_tracing() {
   }
 
+  /** Disable tracing. */
   final public void disable_tracing() {
   }
 
   final private void jj_rescan_token() {
     jj_rescan = true;
     for (int i = 0; i < 2; i++) {
+    try {
       JJCalls p = jj_2_rtns[i];
       do {
         if (p.gen > jj_gen) {
@@ -1135,6 +1512,7 @@
         }
         p = p.next;
       } while (p != null);
+      } catch(LookaheadSuccess ls) { }
     }
     jj_rescan = false;
   }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParserTokenManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParserTokenManager.java
index 50b04d0..4c727ea 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParserTokenManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELParserTokenManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2006 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,14 +7,19 @@
  * 
  * Contributors:
  *     BEA Systems - initial implementation
- *     
+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping
+ *
  *******************************************************************************/
 /* Generated By:JJTree&JavaCC: Do not edit this line. JSPELParserTokenManager.java */
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
+/** Token Manager. */
 public class JSPELParserTokenManager implements JSPELParserConstants
 {
+
+  /** Debug output. */
   public  java.io.PrintStream debugStream = System.out;
+  /** Set debug output. */
   public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
 private final int jjStopStringLiteralDfa_0(int pos, long active0)
 {
@@ -67,21 +72,13 @@
 {
    return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
 }
-private final int jjStopAtPos(int pos, int kind)
+private int jjStopAtPos(int pos, int kind)
 {
    jjmatchedKind = kind;
    jjmatchedPos = pos;
    return pos + 1;
 }
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
+private int jjMoveStringLiteralDfa0_0()
 {
    switch(curChar)
    {
@@ -150,7 +147,7 @@
          return jjMoveNfa_0(0, 0);
    }
 }
-private final int jjMoveStringLiteralDfa1_0(long active0)
+private int jjMoveStringLiteralDfa1_0(long active0)
 {
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
@@ -216,10 +213,10 @@
    }
    return jjStartNfa_0(0, active0);
 }
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0)
+private int jjMoveStringLiteralDfa2_0(long old0, long active0)
 {
    if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(0, old0); 
+      return jjStartNfa_0(0, old0);
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
       jjStopStringLiteralDfa_0(1, active0);
@@ -252,10 +249,10 @@
    }
    return jjStartNfa_0(1, active0);
 }
-private final int jjMoveStringLiteralDfa3_0(long old0, long active0)
+private int jjMoveStringLiteralDfa3_0(long old0, long active0)
 {
    if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(1, old0); 
+      return jjStartNfa_0(1, old0);
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
       jjStopStringLiteralDfa_0(2, active0);
@@ -280,10 +277,10 @@
    }
    return jjStartNfa_0(2, active0);
 }
-private final int jjMoveStringLiteralDfa4_0(long old0, long active0)
+private int jjMoveStringLiteralDfa4_0(long old0, long active0)
 {
    if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(2, old0); 
+      return jjStartNfa_0(2, old0);
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
       jjStopStringLiteralDfa_0(3, active0);
@@ -304,36 +301,14 @@
    }
    return jjStartNfa_0(3, active0);
 }
-private final void jjCheckNAdd(int state)
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
 {
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_0(state, pos + 1);
 }
-private final void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-//private final void jjCheckNAddStates(int start)
-//{
-//   jjCheckNAdd(jjnextStates[start]);
-//   jjCheckNAdd(jjnextStates[start + 1]);
-//}
 static final long[] jjbitVec0 = {
    0x1ff00000fffffffeL, 0xffffffffffffc000L, 0xffffffffL, 0x600000000000000L
 };
@@ -358,7 +333,7 @@
 static final long[] jjbitVec8 = {
    0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
 };
-private final int jjMoveNfa_0(int startState, int curPos)
+private int jjMoveNfa_0(int startState, int curPos)
 {
    int startsAt = 0;
    jjnewStateCnt = 35;
@@ -372,8 +347,7 @@
       if (curChar < 64)
       {
          long l = 1L << curChar;
-        // MatchLoop: 
-        	 do
+         do
          {
             switch(jjstateSet[--i])
             {
@@ -496,7 +470,7 @@
                      jjCheckNAddStates(15, 17);
                   break;
                case 22:
-                  if (curChar == 34)
+                  if ((0x8400000000L & l) != 0L)
                      jjCheckNAddStates(15, 17);
                   break;
                case 23:
@@ -520,7 +494,7 @@
                      jjCheckNAddStates(18, 20);
                   break;
                case 30:
-                  if (curChar == 39)
+                  if ((0x8400000000L & l) != 0L)
                      jjCheckNAddStates(18, 20);
                   break;
                case 31:
@@ -542,8 +516,7 @@
       else if (curChar < 128)
       {
          long l = 1L << (curChar & 077);
-         //MatchLoop: 
-        	 do
+         do
          {
             switch(jjstateSet[--i])
             {
@@ -623,8 +596,7 @@
          long l1 = 1L << (hiByte & 077);
          int i2 = (curChar & 0xff) >> 6;
          long l2 = 1L << (curChar & 077);
-         //MatchLoop: 
-        	 do
+         do
          {
             switch(jjstateSet[--i])
             {
@@ -692,7 +664,7 @@
          return ((jjbitVec5[i2] & l2) != 0L);
       case 61:
          return ((jjbitVec6[i2] & l2) != 0L);
-      default : 
+      default :
          if ((jjbitVec0[i1] & l1) != 0L)
             return true;
          return false;
@@ -704,12 +676,14 @@
    {
       case 0:
          return ((jjbitVec8[i2] & l2) != 0L);
-      default : 
+      default :
          if ((jjbitVec7[i1] & l1) != 0L)
             return true;
          return false;
    }
 }
+
+/** Token literal values. */
 public static final String[] jjstrLiteralImages = {
 "", null, null, null, null, null, null, null, null, null, "\164\162\165\145", 
 "\146\141\154\163\145", "\156\165\154\154", "\56", "\76", "\147\164", "\74", "\154\164", "\75\75", 
@@ -717,8 +691,10 @@
 "\51", "\54", "\72", "\133", "\135", "\53", "\55", "\52", "\57", "\144\151\166", 
 "\45", "\155\157\144", "\156\157\164", "\41", "\141\156\144", "\46\46", "\157\162", 
 "\174\174", "\145\155\160\164\171", "\77", null, null, null, null, };
+
+/** Lexer state names. */
 public static final String[] lexStateNames = {
-   "DEFAULT", 
+   "DEFAULT",
 };
 static final long[] jjtoToken = {
    0xffffffffff61L, 
@@ -730,17 +706,20 @@
 private final int[] jjrounds = new int[35];
 private final int[] jjstateSet = new int[70];
 protected char curChar;
-public JSPELParserTokenManager(SimpleCharStream stream)
-{
+/** Constructor. */
+public JSPELParserTokenManager(SimpleCharStream stream){
    if (SimpleCharStream.staticFlag)
       throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
    input_stream = stream;
 }
-public JSPELParserTokenManager(SimpleCharStream stream, int lexState)
-{
+
+/** Constructor. */
+public JSPELParserTokenManager(SimpleCharStream stream, int lexState){
    this(stream);
    SwitchTo(lexState);
 }
+
+/** Reinitialise parser. */
 public void ReInit(SimpleCharStream stream)
 {
    jjmatchedPos = jjnewStateCnt = 0;
@@ -748,18 +727,22 @@
    input_stream = stream;
    ReInitRounds();
 }
-private final void ReInitRounds()
+private void ReInitRounds()
 {
    int i;
    jjround = 0x80000001;
    for (i = 35; i-- > 0;)
       jjrounds[i] = 0x80000000;
 }
+
+/** Reinitialise parser. */
 public void ReInit(SimpleCharStream stream, int lexState)
 {
    ReInit(stream);
    SwitchTo(lexState);
 }
+
+/** Switch to specified lex state. */
 public void SwitchTo(int lexState)
 {
    if (lexState >= 1 || lexState < 0)
@@ -770,14 +753,25 @@
 
 protected Token jjFillToken()
 {
-   Token t = Token.newToken(jjmatchedKind);
-   t.kind = jjmatchedKind;
+   final Token t;
+   final String curTokenImage;
+   final int beginLine;
+   final int endLine;
+   final int beginColumn;
+   final int endColumn;
    String im = jjstrLiteralImages[jjmatchedKind];
-   t.image = (im == null) ? input_stream.GetImage() : im;
-   t.beginLine = input_stream.getBeginLine();
-   t.beginColumn = input_stream.getBeginColumn();
-   t.endLine = input_stream.getEndLine();
-   t.endColumn = input_stream.getEndColumn();
+   curTokenImage = (im == null) ? input_stream.GetImage() : im;
+   beginLine = input_stream.getBeginLine();
+   beginColumn = input_stream.getBeginColumn();
+   endLine = input_stream.getEndLine();
+   endColumn = input_stream.getEndColumn();
+   t = Token.newToken(jjmatchedKind, curTokenImage);
+
+   t.beginLine = beginLine;
+   t.endLine = endLine;
+   t.beginColumn = beginColumn;
+   t.endColumn = endColumn;
+
    return t;
 }
 
@@ -788,6 +782,7 @@
 int jjmatchedPos;
 int jjmatchedKind;
 
+/** Get the next Token. */
 public Token getNextToken() 
 {
   Token matchedToken;
@@ -795,13 +790,13 @@
 
   EOFLoop :
   for (;;)
-  {   
-   try   
-   {     
+  {
+   try
+   {
       curChar = input_stream.BeginToken();
-   }     
+   }
    catch(java.io.IOException e)
-   {        
+   {
       jjmatchedKind = 0;
       matchedToken = jjFillToken();
       return matchedToken;
@@ -852,4 +847,31 @@
   }
 }
 
+private void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java
index 745f9e6..c995a1a 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/JSPELTranslator.java
@@ -47,7 +47,8 @@
 			
 				ASTExpression expression = elParser.Expression();
 				ELGenerator gen = new ELGenerator();
-				gen.generate(expression, currentNode, fUserELExpressions, fUserELRanges, document, currentNode, contentStart, contentLength);
+				List generatorELProblems = gen.generate(expression, currentNode, fUserELExpressions, fUserELRanges, document, currentNode, contentStart, contentLength);
+				elProblems.addAll(generatorELProblems);
 			}
 		} catch (ParseException e) {
 			Token curTok = e.currentToken;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ParseException.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ParseException.java
index ecd5087..fbaa061 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ParseException.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/ParseException.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,9 +7,11 @@
  * 
  * Contributors:
  *     BEA Systems - initial implementation
- *     
+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping
+ *
  *******************************************************************************/
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 4.1 */
+/* JavaCCOptions:KEEP_LINE_COL=null */
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
 /**
@@ -24,29 +26,24 @@
 public class ParseException extends Exception {
 
   /**
-	 * Default <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
 
-/**
+  /**
    * This constructor is used by the method "generateParseException"
    * in the generated parser.  Calling this constructor generates
    * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.  The boolean
-   * flag "specialConstructor" is also set to true to indicate that
-   * this constructor was used to create this object.
-   * This constructor calls its super class with the empty string
-   * to force the "toString" method of parent class "Throwable" to
-   * print the error message in the form:
-   *     ParseException: <result of getMessage>
+   * "expectedTokenSequences", and "tokenImage" set.
    */
   public ParseException(Token currentTokenVal,
                         int[][] expectedTokenSequencesVal,
                         String[] tokenImageVal
                        )
   {
-    super("");
-    specialConstructor = true;
+    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
     currentToken = currentTokenVal;
     expectedTokenSequences = expectedTokenSequencesVal;
     tokenImage = tokenImageVal;
@@ -64,20 +61,13 @@
 
   public ParseException() {
     super();
-    specialConstructor = false;
   }
 
+  /** Constructor with message. */
   public ParseException(String message) {
     super(message);
-    specialConstructor = false;
   }
 
-  /**
-   * This variable determines which constructor was used to create
-   * this object and thereby affects the semantics of the
-   * "getMessage" method (see below).
-   */
-  protected boolean specialConstructor;
 
   /**
    * This is the last token that has been consumed successfully.  If
@@ -101,32 +91,29 @@
   public String[] tokenImage;
 
   /**
-   * This method has the standard behavior when this object has been
-   * created using the standard constructors.  Otherwise, it uses
-   * "currentToken" and "expectedTokenSequences" to generate a parse
+   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
    * error message and returns it.  If this object has been created
    * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser), then this method is called during the printing
-   * of the final stack trace, and hence the correct error message
+   * from the parser) the correct error message
    * gets displayed.
    */
-  public String getMessage() {
-    if (!specialConstructor) {
-      return super.getMessage();
-    }
-    String expected = "";
+  private static String initialise(Token currentToken,
+                           int[][] expectedTokenSequences,
+                           String[] tokenImage) {
+    String eol = System.getProperty("line.separator", "\n");
+    StringBuffer expected = new StringBuffer();
     int maxSize = 0;
     for (int i = 0; i < expectedTokenSequences.length; i++) {
       if (maxSize < expectedTokenSequences[i].length) {
         maxSize = expectedTokenSequences[i].length;
       }
       for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
       }
       if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected += "...";
+        expected.append("...");
       }
-      expected += eol + "    ";
+      expected.append(eol).append("    ");
     }
     String retval = "Encountered \"";
     Token tok = currentToken.next;
@@ -136,8 +123,11 @@
         retval += tokenImage[0];
         break;
       }
+      retval += " " + tokenImage[tok.kind];
+      retval += " \"";
       retval += add_escapes(tok.image);
-      tok = tok.next; 
+      retval += " \"";
+      tok = tok.next;
     }
     retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
     retval += "." + eol;
@@ -146,7 +136,7 @@
     } else {
       retval += "Was expecting one of:" + eol + "    ";
     }
-    retval += expected;
+    retval += expected.toString();
     return retval;
   }
 
@@ -154,13 +144,13 @@
    * The end of line string for this machine.
    */
   protected String eol = System.getProperty("line.separator", "\n");
- 
+
   /**
    * Used to convert raw characters to their escaped version
    * when these raw version cannot be used as part of an ASCII
    * string literal.
    */
-  protected String add_escapes(String str) {
+  static String add_escapes(String str) {
       StringBuffer retval = new StringBuffer();
       char ch;
       for (int i = 0; i < str.length(); i++) {
@@ -206,3 +196,4 @@
    }
 
 }
+/* JavaCC - OriginalChecksum=2450ea96e71c048c1be00d6aa17c7b52 (do not edit this line) */
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/SimpleCharStream.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/SimpleCharStream.java
index 8021b4b..657c505 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/SimpleCharStream.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/SimpleCharStream.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,9 +7,11 @@
  * 
  * Contributors:
  *     BEA Systems - initial implementation
- *     
+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping
+ *
  *******************************************************************************/
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 3.0 */
+/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.1 */
+/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
 /**
@@ -19,10 +21,12 @@
 
 public class SimpleCharStream
 {
+/** Whether parser is static. */
   public static final boolean staticFlag = false;
   int bufsize;
   int available;
   int tokenBegin;
+/** Position in buffer. */
   public int bufpos = -1;
   protected int bufline[];
   protected int bufcolumn[];
@@ -38,213 +42,224 @@
   protected char[] buffer;
   protected int maxNextCharInd = 0;
   protected int inBuf = 0;
+  protected int tabSize = 8;
+
+  protected void setTabSize(int i) { tabSize = i; }
+  protected int getTabSize(int i) { return tabSize; }
+
 
   protected void ExpandBuff(boolean wrapAround)
   {
-     char[] newbuffer = new char[bufsize + 2048];
-     int newbufline[] = new int[bufsize + 2048];
-     int newbufcolumn[] = new int[bufsize + 2048];
+    char[] newbuffer = new char[bufsize + 2048];
+    int newbufline[] = new int[bufsize + 2048];
+    int newbufcolumn[] = new int[bufsize + 2048];
 
-     try
-     {
-        if (wrapAround)
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           System.arraycopy(buffer, 0, newbuffer,
-                                             bufsize - tokenBegin, bufpos);
-           buffer = newbuffer;
+    try
+    {
+      if (wrapAround)
+      {
+        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
+        buffer = newbuffer;
 
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-           bufline = newbufline;
+        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+        bufline = newbufline;
 
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-           bufcolumn = newbufcolumn;
+        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+        bufcolumn = newbufcolumn;
 
-           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
-        }
-        else
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           buffer = newbuffer;
+        maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+      }
+      else
+      {
+        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+        buffer = newbuffer;
 
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           bufline = newbufline;
+        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+        bufline = newbufline;
 
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           bufcolumn = newbufcolumn;
+        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+        bufcolumn = newbufcolumn;
 
-           maxNextCharInd = (bufpos -= tokenBegin);
-        }
-     }
-     catch (Throwable t)
-     {
-        throw new Error(t.getMessage());
-     }
+        maxNextCharInd = (bufpos -= tokenBegin);
+      }
+    }
+    catch (Throwable t)
+    {
+      throw new Error(t.getMessage());
+    }
 
 
-     bufsize += 2048;
-     available = bufsize;
-     tokenBegin = 0;
+    bufsize += 2048;
+    available = bufsize;
+    tokenBegin = 0;
   }
 
   protected void FillBuff() throws java.io.IOException
   {
-     if (maxNextCharInd == available)
-     {
-        if (available == bufsize)
+    if (maxNextCharInd == available)
+    {
+      if (available == bufsize)
+      {
+        if (tokenBegin > 2048)
         {
-           if (tokenBegin > 2048)
-           {
-              bufpos = maxNextCharInd = 0;
-              available = tokenBegin;
-           }
-           else if (tokenBegin < 0)
-              bufpos = maxNextCharInd = 0;
-           else
-              ExpandBuff(false);
+          bufpos = maxNextCharInd = 0;
+          available = tokenBegin;
         }
-        else if (available > tokenBegin)
-           available = bufsize;
-        else if ((tokenBegin - available) < 2048)
-           ExpandBuff(true);
+        else if (tokenBegin < 0)
+          bufpos = maxNextCharInd = 0;
         else
-           available = tokenBegin;
-     }
+          ExpandBuff(false);
+      }
+      else if (available > tokenBegin)
+        available = bufsize;
+      else if ((tokenBegin - available) < 2048)
+        ExpandBuff(true);
+      else
+        available = tokenBegin;
+    }
 
-     int i;
-     try {
-        if ((i = inputStream.read(buffer, maxNextCharInd,
-                                    available - maxNextCharInd)) == -1)
-        {
-           inputStream.close();
-           throw new java.io.IOException();
-        }
-        else
-           maxNextCharInd += i;
-        return;
-     }
-     catch(java.io.IOException e) {
-        --bufpos;
-        backup(0);
-        if (tokenBegin == -1)
-           tokenBegin = bufpos;
-        throw e;
-     }
+    int i;
+    try {
+      if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
+      {
+        inputStream.close();
+        throw new java.io.IOException();
+      }
+      else
+        maxNextCharInd += i;
+      return;
+    }
+    catch(java.io.IOException e) {
+      --bufpos;
+      backup(0);
+      if (tokenBegin == -1)
+        tokenBegin = bufpos;
+      throw e;
+    }
   }
 
+/** Start. */
   public char BeginToken() throws java.io.IOException
   {
-     tokenBegin = -1;
-     char c = readChar();
-     tokenBegin = bufpos;
+    tokenBegin = -1;
+    char c = readChar();
+    tokenBegin = bufpos;
 
-     return c;
+    return c;
   }
 
   protected void UpdateLineColumn(char c)
   {
-     column++;
+    column++;
 
-     if (prevCharIsLF)
-     {
-        prevCharIsLF = false;
+    if (prevCharIsLF)
+    {
+      prevCharIsLF = false;
+      line += (column = 1);
+    }
+    else if (prevCharIsCR)
+    {
+      prevCharIsCR = false;
+      if (c == '\n')
+      {
+        prevCharIsLF = true;
+      }
+      else
         line += (column = 1);
-     }
-     else if (prevCharIsCR)
-     {
-        prevCharIsCR = false;
-        if (c == '\n')
-        {
-           prevCharIsLF = true;
-        }
-        else
-           line += (column = 1);
-     }
+    }
 
-     switch (c)
-     {
-        case '\r' :
-           prevCharIsCR = true;
-           break;
-        case '\n' :
-           prevCharIsLF = true;
-           break;
-        case '\t' :
-           column--;
-           column += (8 - (column & 07));
-           break;
-        default :
-           break;
-     }
+    switch (c)
+    {
+      case '\r' :
+        prevCharIsCR = true;
+        break;
+      case '\n' :
+        prevCharIsLF = true;
+        break;
+      case '\t' :
+        column--;
+        column += (tabSize - (column % tabSize));
+        break;
+      default :
+        break;
+    }
 
-     bufline[bufpos] = line;
-     bufcolumn[bufpos] = column;
+    bufline[bufpos] = line;
+    bufcolumn[bufpos] = column;
   }
 
+/** Read a character. */
   public char readChar() throws java.io.IOException
   {
-     if (inBuf > 0)
-     {
-        --inBuf;
+    if (inBuf > 0)
+    {
+      --inBuf;
 
-        if (++bufpos == bufsize)
-           bufpos = 0;
+      if (++bufpos == bufsize)
+        bufpos = 0;
 
-        return buffer[bufpos];
-     }
+      return buffer[bufpos];
+    }
 
-     if (++bufpos >= maxNextCharInd)
-        FillBuff();
+    if (++bufpos >= maxNextCharInd)
+      FillBuff();
 
-     char c = buffer[bufpos];
+    char c = buffer[bufpos];
 
-     UpdateLineColumn(c);
-     return (c);
+    UpdateLineColumn(c);
+    return c;
   }
 
   /**
-   * @deprecated 
+   * @deprecated
    * @see #getEndColumn
    */
 
   public int getColumn() {
-     return bufcolumn[bufpos];
+    return bufcolumn[bufpos];
   }
 
   /**
-   * @deprecated 
+   * @deprecated
    * @see #getEndLine
    */
 
   public int getLine() {
-     return bufline[bufpos];
+    return bufline[bufpos];
   }
 
+  /** Get token end column number. */
   public int getEndColumn() {
-     return bufcolumn[bufpos];
+    return bufcolumn[bufpos];
   }
 
+  /** Get token end line number. */
   public int getEndLine() {
      return bufline[bufpos];
   }
 
+  /** Get token beginning column number. */
   public int getBeginColumn() {
-     return bufcolumn[tokenBegin];
+    return bufcolumn[tokenBegin];
   }
 
+  /** Get token beginning line number. */
   public int getBeginLine() {
-     return bufline[tokenBegin];
+    return bufline[tokenBegin];
   }
 
+/** Backup a number of characters. */
   public void backup(int amount) {
 
     inBuf += amount;
     if ((bufpos -= amount) < 0)
-       bufpos += bufsize;
+      bufpos += bufsize;
   }
 
+  /** Constructor. */
   public SimpleCharStream(java.io.Reader dstream, int startline,
   int startcolumn, int buffersize)
   {
@@ -258,16 +273,20 @@
     bufcolumn = new int[buffersize];
   }
 
+  /** Constructor. */
   public SimpleCharStream(java.io.Reader dstream, int startline,
-                                                           int startcolumn)
+                          int startcolumn)
   {
-     this(dstream, startline, startcolumn, 4096);
+    this(dstream, startline, startcolumn, 4096);
   }
 
+  /** Constructor. */
   public SimpleCharStream(java.io.Reader dstream)
   {
-     this(dstream, 1, 1, 4096);
+    this(dstream, 1, 1, 4096);
   }
+
+  /** Reinitialise. */
   public void ReInit(java.io.Reader dstream, int startline,
   int startcolumn, int buffersize)
   {
@@ -287,78 +306,128 @@
     bufpos = -1;
   }
 
+  /** Reinitialise. */
   public void ReInit(java.io.Reader dstream, int startline,
-                                                           int startcolumn)
+                     int startcolumn)
   {
-     ReInit(dstream, startline, startcolumn, 4096);
+    ReInit(dstream, startline, startcolumn, 4096);
   }
 
+  /** Reinitialise. */
   public void ReInit(java.io.Reader dstream)
   {
-     ReInit(dstream, 1, 1, 4096);
+    ReInit(dstream, 1, 1, 4096);
   }
+  /** Constructor. */
+  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
+  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  /** Constructor. */
   public SimpleCharStream(java.io.InputStream dstream, int startline,
   int startcolumn, int buffersize)
   {
-     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+    this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
   }
 
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-                                                           int startcolumn)
+  /** Constructor. */
+  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn) throws java.io.UnsupportedEncodingException
   {
-     this(dstream, startline, startcolumn, 4096);
+    this(dstream, encoding, startline, startcolumn, 4096);
   }
 
+  /** Constructor. */
+  public SimpleCharStream(java.io.InputStream dstream, int startline,
+                          int startcolumn)
+  {
+    this(dstream, startline, startcolumn, 4096);
+  }
+
+  /** Constructor. */
+  public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+    this(dstream, encoding, 1, 1, 4096);
+  }
+
+  /** Constructor. */
   public SimpleCharStream(java.io.InputStream dstream)
   {
-     this(dstream, 1, 1, 4096);
+    this(dstream, 1, 1, 4096);
   }
 
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  /** Reinitialise. */
   public void ReInit(java.io.InputStream dstream, int startline,
                           int startcolumn, int buffersize)
   {
-     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
   }
 
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+    ReInit(dstream, encoding, 1, 1, 4096);
+  }
+
+  /** Reinitialise. */
   public void ReInit(java.io.InputStream dstream)
   {
-     ReInit(dstream, 1, 1, 4096);
+    ReInit(dstream, 1, 1, 4096);
   }
-  public void ReInit(java.io.InputStream dstream, int startline,
-                                                           int startcolumn)
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                     int startcolumn) throws java.io.UnsupportedEncodingException
   {
-     ReInit(dstream, startline, startcolumn, 4096);
+    ReInit(dstream, encoding, startline, startcolumn, 4096);
   }
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream dstream, int startline,
+                     int startcolumn)
+  {
+    ReInit(dstream, startline, startcolumn, 4096);
+  }
+  /** Get token literal value. */
   public String GetImage()
   {
-     if (bufpos >= tokenBegin)
-        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-     else
-        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
+    if (bufpos >= tokenBegin)
+      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+    else
+      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                            new String(buffer, 0, bufpos + 1);
   }
 
+  /** Get the suffix. */
   public char[] GetSuffix(int len)
   {
-     char[] ret = new char[len];
+    char[] ret = new char[len];
 
-     if ((bufpos + 1) >= len)
-        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-     else
-     {
-        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                          len - bufpos - 1);
-        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-     }
+    if ((bufpos + 1) >= len)
+      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+    else
+    {
+      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                                                        len - bufpos - 1);
+      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+    }
 
-     return ret;
+    return ret;
   }
 
+  /** Reset buffer when finished. */
   public void Done()
   {
-     buffer = null;
-     bufline = null;
-     bufcolumn = null;
+    buffer = null;
+    bufline = null;
+    bufcolumn = null;
   }
 
   /**
@@ -366,47 +435,47 @@
    */
   public void adjustBeginLineColumn(int newLine, int newCol)
   {
-     int start = tokenBegin;
-     int len;
+    int start = tokenBegin;
+    int len;
 
-     if (bufpos >= tokenBegin)
-     {
-        len = bufpos - tokenBegin + inBuf + 1;
-     }
-     else
-     {
-        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-     }
+    if (bufpos >= tokenBegin)
+    {
+      len = bufpos - tokenBegin + inBuf + 1;
+    }
+    else
+    {
+      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+    }
 
-     int i = 0, j = 0, k = 0;
-     int nextColDiff = 0, columnDiff = 0;
+    int i = 0, j = 0, k = 0;
+    int nextColDiff = 0, columnDiff = 0;
 
-     while (i < len &&
-            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-     {
-        bufline[j] = newLine;
-        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-        bufcolumn[j] = newCol + columnDiff;
-        columnDiff = nextColDiff;
-        i++;
-     } 
+    while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+    {
+      bufline[j] = newLine;
+      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+      bufcolumn[j] = newCol + columnDiff;
+      columnDiff = nextColDiff;
+      i++;
+    }
 
-     if (i < len)
-     {
-        bufline[j] = newLine++;
-        bufcolumn[j] = newCol + columnDiff;
+    if (i < len)
+    {
+      bufline[j] = newLine++;
+      bufcolumn[j] = newCol + columnDiff;
 
-        while (i++ < len)
-        {
-           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-              bufline[j] = newLine++;
-           else
-              bufline[j] = newLine;
-        }
-     }
+      while (i++ < len)
+      {
+        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+          bufline[j] = newLine++;
+        else
+          bufline[j] = newLine;
+      }
+    }
 
-     line = bufline[j];
-     column = bufcolumn[j];
+    line = bufline[j];
+    column = bufcolumn[j];
   }
 
 }
+/* JavaCC - OriginalChecksum=f319cd62855f4b29d5c4e9550c8852eb (do not edit this line) */
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/Token.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/Token.java
index 7159820..6bad947 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/Token.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/jspel/Token.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 BEA Systems and others.
+ * Copyright (c) 2005, 2010 BEA Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,16 +7,25 @@
  * 
  * Contributors:
  *     BEA Systems - initial implementation
- *     
+ *     IBM Corporation - Bug 318281 - EL validation error for quote escaping
+ *
  *******************************************************************************/
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 4.1 */
+/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 package org.eclipse.jst.jsp.core.internal.java.jspel;
 
 /**
  * Describes the input token stream.
  */
 
-public class Token {
+public class Token implements java.io.Serializable {
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
 
   /**
    * An integer that describes the kind of this token.  This numbering
@@ -25,12 +34,14 @@
    */
   public int kind;
 
-  /**
-   * beginLine and beginColumn describe the position of the first character
-   * of this token; endLine and endColumn describe the position of the
-   * last character of this token.
-   */
-  public int beginLine, beginColumn, endLine, endColumn;
+  /** The line number of the first character of this Token. */
+  public int beginLine;
+  /** The column number of the first character of this Token. */
+  public int beginColumn;
+  /** The line number of the last character of this Token. */
+  public int endLine;
+  /** The column number of the last character of this Token. */
+  public int endColumn;
 
   /**
    * The string image of the token.
@@ -62,11 +73,45 @@
   public Token specialToken;
 
   /**
+   * An optional attribute value of the Token.
+   * Tokens which are not used as syntactic sugar will often contain
+   * meaningful values that will be used later on by the compiler or
+   * interpreter. This attribute value is often different from the image.
+   * Any subclass of Token that actually wants to return a non-null value can
+   * override this method as appropriate.
+   */
+  public Object getValue() {
+    return null;
+  }
+
+  /**
+   * No-argument constructor
+   */
+  public Token() {}
+
+  /**
+   * Constructs a new token for the specified Image.
+   */
+  public Token(int kind)
+  {
+    this(kind, null);
+  }
+
+  /**
+   * Constructs a new token for the specified Image and Kind.
+   */
+  public Token(int kind, String image)
+  {
+    this.kind = kind;
+    this.image = image;
+  }
+
+  /**
    * Returns the image.
    */
   public String toString()
   {
-     return image;
+    return image;
   }
 
   /**
@@ -74,19 +119,25 @@
    * can create and return subclass objects based on the value of ofKind.
    * Simply add the cases to the switch for all those special cases.
    * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simlpy add something like :
+   * you want to create if ofKind is ID, simply add something like :
    *
-   *    case MyParserConstants.ID : return new IDToken();
+   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
    *
    * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use it in your lexical actions.
+   * variable to the appropriate type and use sit in your lexical actions.
    */
-  public static final Token newToken(int ofKind)
+  public static Token newToken(int ofKind, String image)
   {
-     switch(ofKind)
-     {
-       default : return new Token();
-     }
+    switch(ofKind)
+    {
+      default : return new Token(ofKind, image);
+    }
+  }
+
+  public static Token newToken(int ofKind)
+  {
+    return newToken(ofKind, null);
   }
 
 }
+/* JavaCC - OriginalChecksum=688686a2181e010445ea99e501e9cd07 (do not edit this line) */
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java
index 2bd3ffa..5313b20 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,30 +10,15 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java.search;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceProxy;
-import org.eclipse.core.resources.IResourceProxyVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
-import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 
 /**
- * Re-indexes the entire workspace.
- * Ensures the JSP Index is in a stable state before performing a search.
- * (like after a crash or if previous indexing was canceled)
- * 
- * @author pavery
+ * @deprecated - no longer used
  */
 public class IndexWorkspaceJob extends Job {
 
@@ -44,64 +29,6 @@
 		DEBUG= value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
 	}
 	
-	/**
-	 * Visitor that retrieves jsp project paths for all jsp files in the workspace,
-	 * and adds the files to be indexed as they are encountered
-	 */
-	private class JSPFileVisitor implements IResourceProxyVisitor {
-	    private List files = new ArrayList(); 
-		
-		// monitor from the Job
-		IProgressMonitor fInnerMonitor = null;
-		public JSPFileVisitor(IProgressMonitor monitor) {
-			this.fInnerMonitor = monitor;
-		}
-		
-		public boolean visit(IResourceProxy proxy) throws CoreException {
-			
-			// check job canceled
-			if (this.fInnerMonitor != null && this.fInnerMonitor.isCanceled()) {
-				setCanceledState();
-				return false;
-			}
-			
-			// check search support canceled
-			if(JSPSearchSupport.getInstance().isCanceled()) {
-				setCanceledState();
-				return false;
-			}
-			
-			if (proxy.getType() == IResource.FILE) {
-				
-				// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=3553
-				// check this before description
-				// check name before actually getting the file (less work)
-				if(getJspContentType().isAssociatedWith(proxy.getName())) {
-					IFile file = (IFile) proxy.requestResource();
-					if(file.exists()) {
-						
-						if(DEBUG)
-							System.out.println("(+) IndexWorkspaceJob adding file: " + file.getName()); //$NON-NLS-1$
-						// this call will check the ContentTypeDescription, so don't need to do it here.
-						//JSPSearchSupport.getInstance().addJspFile(file);
-						this.files.add(file);
-						this.fInnerMonitor.subTask(proxy.getName());
-						
-						// don't search deeper for files
-						return false;
-					}
-				}
-			}
-			return true;
-		}
-		
-		public final IFile[] getFiles() {
-		    return (IFile[])this.files.toArray(new IFile[this.files.size()]);
-		}
-	}
-	
-	private IContentType fContentTypeJSP = null;
-	
 	public IndexWorkspaceJob() {
 		// pa_TODO may want to say something like "Rebuilding JSP Index" to be more
 		// descriptive instead of "Updating JSP Index" since they are 2 different things
@@ -110,53 +37,13 @@
 		setSystem(true);
 	}
 
-	IContentType getJspContentType() {
-		if(this.fContentTypeJSP == null)
-			this.fContentTypeJSP = Platform.getContentTypeManager().getContentType(ContentTypeIdForJSP.ContentTypeID_JSP);
-		return this.fContentTypeJSP;
-	}
-	
 	/**
 	 * @see org eclipse.core.internal.jobs.InternalJob#run(org.eclipse.core.runtime.IProgressMonitor) 
 	 * for similar method
 	 */
 	protected IStatus run(IProgressMonitor monitor) {
-		
-		IStatus status = Status.OK_STATUS;
-		
-		if(monitor.isCanceled()) {
-			setCanceledState();
-			return Status.CANCEL_STATUS;
-		}
-		
-		if(DEBUG)
-			System.out.println(" ^ IndexWorkspaceJob started: "); //$NON-NLS-1$
-		
-		long start = System.currentTimeMillis();
-		
-		try {
-		    JSPFileVisitor visitor = new JSPFileVisitor(monitor);
-		    // collect all jsp files
-			ResourcesPlugin.getWorkspace().getRoot().accept(visitor, IResource.DEPTH_INFINITE);
-			// request indexing
-			// this is pretty much like faking an entire workspace resource delta
-			JSPIndexManager.getInstance().indexFiles(visitor.getFiles());
-		}
-		catch (CoreException e) {
-			if(DEBUG)
-				e.printStackTrace();
-		}
-		finally {
-			monitor.done();
-		}
-		long finish = System.currentTimeMillis();
-		if(DEBUG)
-			System.out.println(" ^ IndexWorkspaceJob finished\n   total time running: " + (finish - start)); //$NON-NLS-1$
-		
-		return status;
+		return Status.OK_STATUS;
 	}
 	
-	void setCanceledState() {
-		JSPIndexManager.getInstance().setIndexState(JSPIndexManager.S_CANCELED);
-	}
+	void setCanceledState() {}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
index cd976e5..be734a4 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,721 +7,158 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java.search;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.core.JavaModelManager;
-import org.eclipse.jdt.internal.core.index.Index;
-import org.eclipse.jdt.internal.core.search.indexing.IndexManager;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
 import org.eclipse.jst.jsp.core.internal.Logger;
+import org.eclipse.jst.jsp.core.internal.java.JSPTranslatorPersister;
 import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
+import org.eclipse.wst.sse.core.indexing.AbstractIndexManager;
 
 /**
- * Responsible for keeping the JSP index up to date.
+ * <p>Index manger used to update the JDT index with the Java translations
+ * of JSPs.</p>
  * 
- * @author pavery
+ * <p>Also keeps JSP persistence up to date</p>
+ * 
+ * <p>Any action that needs the JDT index to have all of the latest JSP changes processed
+ * should wait for this manger to report that it is consistent,
+ * {@link #waitForConsistent(org.eclipse.core.runtime.IProgressMonitor)}.  Such actions
+ * include but are not limited to searching and refactoring JSPs.</p>
  */
-public class JSPIndexManager {
-
-	// for debugging
-	// TODO move this to Logger, as we have in SSE
-	static final boolean DEBUG;
-	static {
-		String value = Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspindexmanager"); //$NON-NLS-1$
-		DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+public class JSPIndexManager extends AbstractIndexManager {
+	/** the singleton instance of the {@link JSPIndexManager} */
+	private static JSPIndexManager INSTANCE;
+	
+	/** the JSP {@link IContentType} */
+	private static final IContentType JSP_CONTENT_TYPE =
+		Platform.getContentTypeManager().getContentType(ContentTypeIdForJSP.ContentTypeID_JSP);
+	
+	/** the location to store state */
+	private IPath fWorkingLocation;
+	
+	/**
+	 * <p>Private singleton constructor</p>
+	 */
+	private JSPIndexManager() {
+		super(JSPCoreMessages.JSPIndexManager_0, JSPCoreMessages.JSPIndexManager_0,
+				JSPCoreMessages.Initializing, JSPCoreMessages.JSPIndexManager_2);
+	}
+	
+	/**
+	 * @return the singleton instance of the {@link JSPIndexManager}
+	 */
+	public static JSPIndexManager getDefault() {
+		return INSTANCE != null ? INSTANCE : (INSTANCE = new JSPIndexManager());
+	}
+	
+	/**
+	 * @deprecated - use {@link #getDefault()} 
+	 **/
+	public synchronized static JSPIndexManager getInstance() {
+		return getDefault();
+		
+	}
+	/**
+	 * @see indexer.internal.indexing.AbstractIndexManager#isResourceToIndex(int, java.lang.String)
+	 */
+	protected boolean isResourceToIndex(int type, IPath path) {
+		String name = path.lastSegment();
+		return 
+			type == IResource.PROJECT || 
+			(type == IResource.FOLDER && !name.equals("bin") && !name.startsWith(".")) || //$NON-NLS-1$ //$NON-NLS-2$
+			JSP_CONTENT_TYPE.isAssociatedWith(path.lastSegment());
 	}
 
-	private static final String PKEY_INDEX_STATE = "jspIndexState"; //$NON-NLS-1$
-
-	private IndexWorkspaceJob indexingJob = new IndexWorkspaceJob();
-
-
-
-	// TODO: consider enumeration for these int constants
-	// set to S_UPDATING once a resource change comes in
-	// set to S_STABLE if:
-	// - we know we aren't interested in the resource change
-	// - or the ProcessFilesJob completes
-	// set to S_CANCELED if an indexing job is canceled
-	// set to S_REBUILDING if re-indexing the entire workspace
-
-	// the int '0' is reserved for the default value if a preference is not
-	// there
-	/** index is reliable to use */
-	public static final int S_STABLE = 1;
-	/** index is being updated (from a resource delta) */
-	public static final int S_UPDATING = 2;
-	/** entire index is being rebuilt */
-	public static final int S_REBUILDING = 3;
 	/**
-	 * indexing job was canceled in the middle of it, index needs to be
-	 * rebuilt
+	 * @see indexer.internal.indexing.AbstractIndexManager#getWorkingLocation()
 	 */
-	public static final int S_CANCELED = 4;
+	protected IPath getWorkingLocation() {
+		if(this.fWorkingLocation == null) {
+			//create path to working area
+    		IPath workingLocation =
+    			JSPCorePlugin.getDefault().getStateLocation().append("jspsearch"); //$NON-NLS-1$
 
-	/** symbolic name for OSGI framework */
-	private final String OSGI_FRAMEWORK_ID = "org.eclipse.osgi"; //$NON-NLS-1$
+            // ensure that it exists on disk
+            File folder = new File(workingLocation.toOSString());
+    		if (!folder.isDirectory()) {
+    			try {
+    				folder.mkdir();
+    			}
+    			catch (SecurityException e) {
+    				Logger.logException(this.getName() +
+    						": Error while creating state location: " + folder + //$NON-NLS-1$
+    						" This renders the index manager irrevocably broken for this workspace session", //$NON-NLS-1$
+    						e);
+    			}
+    		}
+    		
+    		this.fWorkingLocation = workingLocation;
+    	}
+    	
+        return this.fWorkingLocation;
+	}
 
 	/**
-	 * Collects JSP files from a resource delta.
+	 * @see indexer.internal.indexing.AbstractIndexManager#performAction(byte, byte, org.eclipse.core.resources.IResource, org.eclipse.core.runtime.IPath)
 	 */
-	private class JSPResourceVisitor implements IResourceDeltaVisitor {
-		// using hash map ensures only one of each file
-		// must be reset before every use
-		private HashMap jspFiles = null;
-
-		public JSPResourceVisitor() {
-			this.jspFiles = new HashMap();
-		}
-
-		public boolean visit(IResourceDelta delta) throws CoreException {
-
-			// in case JSP search was canceled (eg. when closing the editor)
-			if (JSPSearchSupport.getInstance().isCanceled() || frameworkIsShuttingDown()) {
-				setCanceledState();
-				return false;
+	protected void performAction(byte source, byte action, IResource resource,
+			IPath movePath) {
+		
+		//inform the persister of the action unless it come from a full workspace scan
+		if(JSPTranslatorPersister.ACTIVATED && source != AbstractIndexManager.SOURCE_WORKSPACE_SCAN) {
+			switch(action) {
+				case AbstractIndexManager.ACTION_ADD: {
+					JSPTranslatorPersister.persistTranslation(resource);
+					break;
+				}
+				case AbstractIndexManager.ACTION_REMOVE: {
+					JSPTranslatorPersister.removePersistedTranslation(resource);
+					break;
+				}
+				case AbstractIndexManager.ACTION_ADD_MOVE_FROM: {
+					JSPTranslatorPersister.movePersistedTranslation(resource, movePath);
+					break;
+				}
+				case AbstractIndexManager.ACTION_REMOVE_MOVE_TO: {
+					//do nothing, taken care of by AbstractIndexManager.ACTION_ADD_MOVE_FROM
+					break;
+				}
 			}
-
+		}
+		
+		//add any new JSP files to the JDT index using the JSPSearchSupport
+		if(action == AbstractIndexManager.ACTION_ADD ||
+				action == AbstractIndexManager.ACTION_ADD_MOVE_FROM) {
+		
+			IFile file = (IFile)resource; //this assumption can be made because of #isResourceToIndex
+			JSPSearchSupport ss = JSPSearchSupport.getInstance();
 			try {
-				if (!isHiddenResource(delta.getFullPath())) {
-
-					int kind = delta.getKind();
-					boolean added = (kind & IResourceDelta.ADDED) == IResourceDelta.ADDED;
-					boolean isInterestingChange = false;
-					if ((kind & IResourceDelta.CHANGED) == IResourceDelta.CHANGED) {
-						int flags = delta.getFlags();
-						// ignore things like marker changes
-						isInterestingChange = (flags & IResourceDelta.CONTENT) == IResourceDelta.CONTENT || (flags & IResourceDelta.REPLACED) == IResourceDelta.REPLACED;
-					}
-					boolean removed = (kind & IResourceDelta.REMOVED) == IResourceDelta.REMOVED;
-					if (added || isInterestingChange) {
-
-						visitAdded(delta);
-					}
-					else if (removed) {
-						visitRemoved(delta);
+				IProject project = file.getProject();
+				if (project != null) {
+					IJavaProject jproject = JavaCore.create(project);
+					if (jproject.exists()) {
+						ss.addJspFile(file);
 					}
 				}
 			}
 			catch (Exception e) {
-				// need to set state here somehow, and reindex
-				// otherwise index will be unreliable
-				if (DEBUG)
-					Logger.logException("Delta analysis may not be complete", e); //$NON-NLS-1$
-			}
-			// if the delta has children, continue to add/remove files
-			return true;
-		}
-
-		private void visitRemoved(IResourceDelta delta) {
-			// handle cleanup
-			if (delta.getResource() != null) {
-				IResource r = delta.getResource();
-				if (r.getType() == IResource.FOLDER && r.exists()) {
-					deleteIndex((IFile) r);
-				}
-			}
-		}
-
-		private void visitAdded(IResourceDelta delta) {
-			// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=3553
-			// quick check if it's even JSP related to improve
-			// performance
-			// checking name from the delta before getting
-			// resource because it's lighter
-			String filename = delta.getFullPath().lastSegment();
-			if (filename != null && getJspContentType().isAssociatedWith(filename)) {
-				IResource r = delta.getResource();
-				if (r != null && r.exists() && r.getType() == IResource.FILE) {
-					this.jspFiles.put(r.getFullPath(), r);
-				}
-			}
-		}
-
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=93463
-		private boolean isHiddenResource(IPath p) {
-			String[] segments = p.segments();
-			for (int i = 0; i < segments.length; i++) {
-				if (segments[i].startsWith(".")) //$NON-NLS-1$
-					return true;
-			}
-			return false;
-		}
-
-		private void deleteIndex(IFile folder) {
-			// cleanup index
-			IndexManager im = JavaModelManager.getIndexManager();
-			IPath folderPath = folder.getFullPath();
-			IPath indexLocation = JSPSearchSupport.getInstance().computeIndexLocation(folderPath);
-			im.removeIndex(indexLocation);
-			// im.indexLocations.removeKey(folderPath);
-			// im.indexLocations.removeValue(indexLocation);
-			File f = indexLocation.toFile();
-			f.delete();
-		}
-
-		public IFile[] getFiles() {
-			return (IFile[]) this.jspFiles.values().toArray(new IFile[this.jspFiles.size()]);
-		}
-
-		public void reset() {
-			this.jspFiles.clear();
-		}
-	}
-
-	// end class JSPResourceVisitor
-
-	/**
-	 * schedules JSP files for indexing by Java core
-	 */
-	private class ProcessFilesJob extends Job {
-		List fileList = null;
-		// keep track of how many files we've indexed
-		int lastFileCursor = 0;
-
-		ProcessFilesJob(String taskName) {
-			super(taskName);
-			fileList = new ArrayList();
-		}
-
-		synchronized void process(IFile[] files) {
-			for (int i = 0; i < files.length; i++) {
-				fileList.add(files[i]);
-			}
-			if (DEBUG) {
-				System.out.println("JSPIndexManager queuing " + files.length + " files"); //$NON-NLS-2$ //$NON-NLS-1$
-			}
-		}
-
-		synchronized IFile[] getFiles() {
-			return (IFile[]) fileList.toArray(new IFile[fileList.size()]);
-		}
-
-		synchronized void clearFiles() {
-			fileList.clear();
-			lastFileCursor = 0;
-			//System.out.println("cleared files");
-		}
-
-		protected IStatus run(IProgressMonitor monitor) {
-			// System.out.println("indexer monitor" + monitor);
-			if (isCanceled(monitor) || frameworkIsShuttingDown()) {
-				setCanceledState();
-				return Status.CANCEL_STATUS;
-			}
-
-			long start = System.currentTimeMillis();
-
-			try {
-				IFile[] filesToBeProcessed = getFiles();
-
-				if (DEBUG) {
-					System.out.println("JSPIndexManager indexing " + filesToBeProcessed.length + " files"); //$NON-NLS-2$ //$NON-NLS-1$
-				}
-				// API indicates that monitor is never null
-				monitor.beginTask("", filesToBeProcessed.length); //$NON-NLS-1$
-				JSPSearchSupport ss = JSPSearchSupport.getInstance();
-				String processingNFiles = ""; //$NON-NLS-1$
-
-
-				for (;lastFileCursor < filesToBeProcessed.length; lastFileCursor++) {
-
-					if (isCanceled(monitor) || frameworkIsShuttingDown()) {
-						setCanceledState();
-						return Status.CANCEL_STATUS;
-					}
-					IFile file = filesToBeProcessed[lastFileCursor];
-					try {
-						IJavaProject project = JavaCore.create(file.getProject());
-						if (project.exists()) {
-							ss.addJspFile(file);
-							// JSP Indexer processing n files
-							processingNFiles = NLS.bind(JSPCoreMessages.JSPIndexManager_2, new String[]{Integer.toString((filesToBeProcessed.length - lastFileCursor))});
-							monitor.subTask(processingNFiles + " - " + file.getName()); //$NON-NLS-1$
-							monitor.worked(1);
-
-							if (DEBUG) {
-								System.out.println("JSPIndexManager Job added file: " + file.getName()); //$NON-NLS-1$
-							}
-						}
-					}
-					catch (Exception e) {
-						// RATLC00284776
-						// ISSUE: we probably shouldn't be catching EVERY
-						// exception, but
-						// the framework only allows to return IStatus in
-						// order to communicate
-						// that something went wrong, which means the loop
-						// won't complete, and we would hit the same problem
-						// the next time.
-						// 
-						// a possible solution is to keep track of the
-						// exceptions logged
-						// and only log a certain amt of the same one,
-						// otherwise skip it.
-						if (!frameworkIsShuttingDown()) {
-							String filename = file != null ? file.getFullPath().toString() : ""; //$NON-NLS-1$
-							Logger.logException("JSPIndexer problem indexing:" + filename, e); //$NON-NLS-1$
-						}
-					}
-				} // end for
-			}
-			finally {
-				// just in case something didn't follow API (monitor is null)
-				if (monitor != null)
-					monitor.done();
-			}
-
-			// successfully finished, clear files list
-			clearFiles();
-			
-			long finish = System.currentTimeMillis();
-			long diff = finish - start;
-			if (DEBUG) {
-				fTotalTime += diff;
-				System.out.println("============================================================================"); //$NON-NLS-1$
-				System.out.println("this time: " + diff + " cumulative time for resource changed: " + fTotalTime); //$NON-NLS-1$ //$NON-NLS-2$
-				System.out.println("============================================================================"); //$NON-NLS-1$
-			}
-			return Status.OK_STATUS;
-		}
-
-		private boolean isCanceled(IProgressMonitor runMonitor) {
-
-			boolean canceled = false;
-			// check specific monitor passed into run method (the progress
-			// group in this case)
-			// check main search support canceled
-			if (runMonitor != null && runMonitor.isCanceled())
-				canceled = true;
-			else if (JSPSearchSupport.getInstance().isCanceled()) {
-				canceled = true;
-				if (runMonitor != null) {
-					runMonitor.setCanceled(true);
-				}
-			}
-			return canceled;
-		}
-		
-	}
-
-	// end class ProcessFilesJob
-
-	private static JSPIndexManager fSingleton = null;
-	private boolean initialized;
-	private boolean initializing = true;
-
-	private IndexJobCoordinator indexJobCoordinator;
-	private IResourceChangeListener jspResourceChangeListener;
-
-	private JSPResourceVisitor fVisitor = null;
-	private IContentType fContentTypeJSP = null;
-
-	static long fTotalTime = 0;
-
-	// Job for processing resource delta
-	private ProcessFilesJob processFilesJob = null;
-
-	private JSPIndexManager() {
-		processFilesJob = new ProcessFilesJob(JSPCoreMessages.JSPIndexManager_0);
-		// only show in verbose mode
-		processFilesJob.setSystem(true);
-		processFilesJob.setPriority(Job.LONG);
-		processFilesJob.addJobChangeListener(new JobChangeAdapter() {
-			public void done(IJobChangeEvent event) {
-				super.done(event);
-				setStableState();
-			}
-		});
-	}
-
-	public synchronized static JSPIndexManager getInstance() {
-
-		if (fSingleton == null)
-			fSingleton = new JSPIndexManager();
-		return fSingleton;
-	}
-
-	public void initialize() {
-
-		JSPIndexManager singleInstance = getInstance();
-
-
-		if (!singleInstance.initialized) {
-			singleInstance.initialized = true;
-
-			singleInstance.indexJobCoordinator = new IndexJobCoordinator();
-			singleInstance.jspResourceChangeListener = new JSPResourceChangeListener();
-
-			// added as JobChange listener so JSPIndexManager can be smarter
-			// about when it runs
-			Platform.getJobManager().addJobChangeListener(singleInstance.indexJobCoordinator);
-
-			// add JSPIndexManager to keep JSP Index up to date
-			// listening for IResourceChangeEvent.PRE_DELETE and
-			// IResourceChangeEvent.POST_CHANGE
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(jspResourceChangeListener, IResourceChangeEvent.POST_CHANGE);
-
-			// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=5091
-			// makes sure IndexManager is aware of our indexes
-			saveIndexes();
-			singleInstance.initializing = false;
-
-		}
-
-	}
-	
-	synchronized void setIndexState(int state) {
-		if (DEBUG) {
-			System.out.println("JSPIndexManager setting index state to: " + state2String(state)); //$NON-NLS-1$
-		}
-		Plugin jspModelPlugin = JSPCorePlugin.getDefault();
-		jspModelPlugin.getPluginPreferences().setValue(PKEY_INDEX_STATE, state);
-		jspModelPlugin.savePluginPreferences();
-
-	}
-
-	private String state2String(int state) {
-		String s = "UNKNOWN"; //$NON-NLS-1$
-		switch (state) {
-			case (S_STABLE) :
-				s = "S_STABLE"; //$NON-NLS-1$
-				break;
-			case (S_UPDATING) :
-				s = "S_UPDATING"; //$NON-NLS-1$
-				break;
-			case (S_CANCELED) :
-				s = "S_CANCELED"; //$NON-NLS-1$
-				break;
-			case (S_REBUILDING) :
-				s = "S_REBUILDING"; //$NON-NLS-1$
-				break;
-		}
-		return s;
-	}
-
-	int getIndexState() {
-		return JSPCorePlugin.getDefault().getPluginPreferences().getInt(PKEY_INDEX_STATE);
-	}
-
-	void setUpdatingState() {
-		//if (getIndexState() != S_CANCELED)
-		setIndexState(S_UPDATING);
-	}
-
-	void setCanceledState() {
-		setIndexState(JSPIndexManager.S_CANCELED);
-	}
-
-	void setStableState() {
-		//if (getIndexState() != S_CANCELED)
-		setIndexState(S_STABLE);
-	}
-
-	void setRebuildingState() {
-		setIndexState(S_REBUILDING);
-	}
-
-	synchronized void rebuildIndexIfNeeded() {
-		if (getIndexState() != S_STABLE) {
-			rebuildIndex();
-		}
-	}
-
-	void rebuildIndex() {
-
-		if (DEBUG)
-			System.out.println("*** JSP Index unstable, requesting re-indexing"); //$NON-NLS-1$
-
-		getIndexingJob().addJobChangeListener(new JobChangeAdapter() {
-			public void aboutToRun(IJobChangeEvent event) {
-				super.aboutToRun(event);
-				setRebuildingState();
-			}
-
-			public void done(IJobChangeEvent event) {
-				super.done(event);
-				setStableState();
-				getIndexingJob().removeJobChangeListener(this);
-			}
-		});
-		// we're about to reindex everything anyway
-		getProcessFilesJob().clearFiles();
-		getIndexingJob().schedule();
-
-	}
-
-	/**
-	 * Creates and schedules a Job to process collected files. All JSP
-	 * indexing should be done through this method or processFiles(IFile file)
-	 * 
-	 * @param files
-	 */
-	final void indexFiles(IFile[] files) {
-		// don't use this rule
-		// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=4931
-		// processFiles.setRule(new IndexFileRule());
-		processFilesJob.process(files);
-	}
-
-
-	/**
-	 * Package protected for access by inner Job class in resourceChanged(...)
-	 * 
-	 * @return
-	 */
-	JSPResourceVisitor getVisitor() {
-
-		if (this.fVisitor == null) {
-			this.fVisitor = new JSPResourceVisitor();
-		}
-		return this.fVisitor;
-	}
-
-	// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=5091
-	// makes sure IndexManager is aware of our indexes
-	void saveIndexes() {
-		IndexManager indexManager = JavaModelManager.getIndexManager();
-		IPath jspModelWorkingLocation = JSPSearchSupport.getInstance().getModelJspPluginWorkingLocation();
-
-		File folder = new File(jspModelWorkingLocation.toOSString());
-		String[] files = folder.list();
-		String locay = ""; //$NON-NLS-1$
-		Index index = null;
-		try {
-			for (int i = 0; i < files.length; i++) {
-				if (files[i].toLowerCase().endsWith(".index")) { //$NON-NLS-1$
-					locay = jspModelWorkingLocation.toString() + "/" + files[i]; //$NON-NLS-1$
-					// reuse index file
-					index = new Index(locay, "Index for " + locay, true); //$NON-NLS-1$
-					indexManager.saveIndex(index);
-				}
-			}
-		}
-		catch (Exception e) {
-			// we should be shutting down, want to shut down quietly
-			if (DEBUG)
-				e.printStackTrace();
-		}
-	}
-
-	IContentType getJspContentType() {
-		if (this.fContentTypeJSP == null)
-			this.fContentTypeJSP = Platform.getContentTypeManager().getContentType(ContentTypeIdForJSP.ContentTypeID_JSP);
-		return this.fContentTypeJSP;
-	}
-
-	/**
-	 * A check to see if the OSGI framework is shutting down.
-	 * 
-	 * @return true if the System Bundle is stopped (ie. the framework is
-	 *         shutting down)
-	 */
-	boolean frameworkIsShuttingDown() {
-		// in the Framework class there's a note:
-		// set the state of the System Bundle to STOPPING.
-		// this must be done first according to section 4.19.2 from the OSGi
-		// R3 spec.
-		boolean shuttingDown = Platform.getBundle(OSGI_FRAMEWORK_ID).getState() == Bundle.STOPPING;
-		if (DEBUG && shuttingDown) {
-			System.out.println("JSPIndexManager: system is shutting down!"); //$NON-NLS-1$
-		}
-		return shuttingDown;
-	}
-
-
-	public void shutdown() {
-
-		// stop listening
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(jspResourceChangeListener);
-
-
-		// stop any searching
-		JSPSearchSupport.getInstance().setCanceled(true);
-
-		// stop listening to jobs
-		Platform.getJobManager().removeJobChangeListener(indexJobCoordinator);
-
-
-		int maxwait = 5000;
-		if (processFilesJob != null) {
-			processFilesJob.cancel();
-		}
-		// attempt to make sure this indexing job is litterally
-		// done before continuing, since we are shutting down
-		waitTillNotRunning(maxwait, processFilesJob);
-
-		if (indexingJob != null) {
-			indexingJob.cancel();
-		}
-		waitTillNotRunning(maxwait, processFilesJob);
-	}
-
-	private void waitTillNotRunning(int maxSeconds, Job job) {
-		int pauseTime = 10;
-		int maxtries = maxSeconds / pauseTime;
-		int count = 0;
-		while (count++ < maxtries && job.getState() == Job.RUNNING) {
-			try {
-				Thread.sleep(pauseTime);
-				// System.out.println("count: " + count + " max: " +
-				// maxtries);
-			}
-			catch (InterruptedException e) {
-				Logger.logException(e);
+				String filename = file != null ? file.getFullPath().toString() : ""; //$NON-NLS-1$
+				Logger.logException("JPSIndexManger: problem indexing:" + filename, e); //$NON-NLS-1$
 			}
 		}
 	}
-
-	private class IndexJobCoordinator extends JobChangeAdapter {
-		
-		public void aboutToRun(IJobChangeEvent event) {
-			Job jobToCoordinate = event.getJob();
-			if (isJobToAvoid(jobToCoordinate)) {
-				// job will be rescheduled when the job we
-				// are avoiding (eg. build) is done
-				getProcessFilesJob().cancel();
-				//System.out.println("cancel:" + jobToCoordinate.getName());
-			}
-		}
-
-		public void done(IJobChangeEvent event) {
-
-			Job jobToCoordinate = event.getJob();
-			if (isJobToAvoid(jobToCoordinate)) {
-				if (getProcessFilesJob().getFiles().length > 0) {
-					getProcessFilesJob().schedule(500);
-					//System.out.println("schedule:" + jobToCoordinate.getName());
-				}
-					
-
-			}
-		}
-
-		private boolean isJobToAvoid(Job jobToCoordinate) {
-			boolean result = false;
-			if (jobToCoordinate.belongsTo(ResourcesPlugin.FAMILY_AUTO_BUILD) || jobToCoordinate.belongsTo(ResourcesPlugin.FAMILY_MANUAL_BUILD) || jobToCoordinate.belongsTo(ResourcesPlugin.FAMILY_AUTO_REFRESH)) {
-				result = true;
-			}
-			return result;
-
-		}
-
-	}
-
-	private class JSPResourceChangeListener implements IResourceChangeListener {
-
-
-		/**
-		 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-		 */
-		public void resourceChanged(IResourceChangeEvent event) {
-
-			if (isInitializing())
-				return;
-
-			// ignore resource changes if already rebuilding
-			if (getIndexState() == S_REBUILDING)
-				return;
-			// previously canceled, needs entire index rebuild
-			if (getIndexState() == S_CANCELED) {
-				// rebuildIndex();
-				// just resume indexing
-				getProcessFilesJob().schedule(500);
-				//System.out.println("schedule: resource changed, previously canceled");
-				return;
-			}
-
-			IResourceDelta delta = event.getDelta();
-			if (delta != null) {
-				// only care about adds or changes right now...
-				int kind = delta.getKind();
-				boolean added = (kind & IResourceDelta.ADDED) == IResourceDelta.ADDED;
-				boolean changed = (kind & IResourceDelta.CHANGED) == IResourceDelta.CHANGED;
-				if (added || changed) {
-
-					// only analyze the full (starting at root) delta
-					// hierarchy
-					if (delta.getFullPath().toString().equals("/")) { //$NON-NLS-1$
-						try {
-							JSPResourceVisitor v = getVisitor();
-							// clear from last run
-							v.reset();
-							// count files, possibly do this in a job too...
-							// don't include PHANTOM resources
-							delta.accept(v, false);
-
-							// process files from this delta
-							IFile[] files = v.getFiles();
-							if (files.length > 0) {
-								/*
-								 * Job change listener should set back to
-								 * stable when finished
-								 */
-								setUpdatingState();
-								// processFiles(files);
-								indexFiles(files);
-							}
-						}
-						catch (CoreException e) {
-							// need to set state here somehow, and reindex
-							// otherwise index will be unreliable
-							if (DEBUG)
-								Logger.logException(e);
-						}
-						catch (Exception e) {
-							// need to set state here somehow, and reindex
-							// otherwise index will be unreliable
-							if (DEBUG)
-								Logger.logException(e);
-						}
-					}
-				}
-
-			}
-		}
-
-	}
-
-	IndexWorkspaceJob getIndexingJob() {
-		return indexingJob;
-	}
-
-	ProcessFilesJob getProcessFilesJob() {
-		return processFilesJob;
-	}
-
-	boolean isInitializing() {
-		return initializing;
-	}
-
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchDocument.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchDocument.java
index 78332d1..b78944f 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchDocument.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchDocument.java
@@ -44,14 +44,11 @@
  * those fields are lightweight since it's possible for many JSP search
  * documents to exist in memory at one time (eg. after importing a project
  * with a large number of JSP files)
- * 
- * @author pavery
  */
 public class JSPSearchDocument {
 
-	private String UNKNOWN_PATH = "**path unknown**"; //$NON-NLS-1$
-	private String fJSPPathString = UNKNOWN_PATH;
-	private String fCUPath = UNKNOWN_PATH;
+	private String fJSPPathString = null;
+	private String fCUPath = null;
 	private SearchParticipant fParticipant = null;
 	private long fLastModifiedStamp;
 	private char[] fCachedCharContents;
@@ -62,7 +59,7 @@
 	 * @throws CoreException
 	 */
 	public JSPSearchDocument(String filePath, SearchParticipant participant) {
-
+		//Assert.isNotNull(filePath, "Search support for JSP requires file paths"); //$NON-NLS-1$ 
 		this.fJSPPathString = filePath;
 		this.fParticipant = participant;
 	}
@@ -158,7 +155,7 @@
 	public String getPath() {
 	    // caching the path since it's expensive to get translation
 		// important that isDirty() check is second to cache modification stamp
-	    if(this.fCUPath == null || isDirty() || this.fCUPath == UNKNOWN_PATH) {
+	    if(this.fCUPath == null || isDirty()) {
 	        JSPTranslation trans = getJSPTranslation();
 	        if(trans != null) {
 	            this.fCUPath = trans.getJavaPath();
@@ -166,7 +163,7 @@
 	            fCachedCharContents = trans.getJavaText().toCharArray();
 	        }
 	    }
-		return fCUPath != null ? fCUPath : UNKNOWN_PATH;
+		return fCUPath;
 	}
 
 	public int getJspOffset(int javaOffset) {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java
index 398982a..7d1ed20 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -33,7 +33,6 @@
 import org.eclipse.jdt.core.search.SearchEngine;
 import org.eclipse.jdt.core.search.SearchPattern;
 import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jdt.internal.core.JavaModelManager;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
 import org.eclipse.jst.jsp.core.internal.Logger;
@@ -90,8 +89,6 @@
 
         int fMatchMode = SearchPattern.R_PATTERN_MATCH;
 
-        boolean fIsCaseSensitive = false;
-
         SearchRequestor fRequestor = null;
 
         IJavaElement fElement = null;
@@ -114,7 +111,6 @@
             this.fSearchFor = searchFor;
             this.fLimitTo = limitTo;
             this.fMatchMode = matchMode;
-            this.fIsCaseSensitive = isCaseSensitive;
             this.fRequestor = requestor;
         }
 
@@ -174,8 +170,6 @@
 
         int fMatchMode = SearchPattern.R_PATTERN_MATCH;
 
-        boolean fIsCaseSensitive = false;
-
         SearchRequestor fRequestor = null;
 
         IJavaElement fElement = null;
@@ -188,18 +182,6 @@
             this.fRequestor = requestor;
         }
 
-        // constructor w/ search text
-        public SearchRunnable(String searchText, IJavaSearchScope scope, int searchFor, int limitTo, int matchMode, boolean isCaseSensitive, SearchRequestor requestor) {
-
-            this.fSearchText = searchText;
-            this.fScope = scope;
-            this.fSearchFor = searchFor;
-            this.fLimitTo = limitTo;
-            this.fMatchMode = matchMode;
-            this.fIsCaseSensitive = isCaseSensitive;
-            this.fRequestor = requestor;
-        }
-
         public void run(IProgressMonitor monitor) throws CoreException {
 
             if (monitor != null && monitor.isCanceled())
@@ -332,10 +314,70 @@
      * @param requestor
      *            passed in to accept search matches (and do "something" with
      *            them)
+     * 
+     * @deprecated use {@link #search(String, IJavaSearchScope, int, int, int, boolean, SearchRequestor, IProgressMonitor)}
      */
     public void search(String searchText, IJavaSearchScope scope, int searchFor, int limitTo, int matchMode, boolean isCaseSensitive, SearchRequestor requestor) {
+    	this.search(searchText, scope, searchFor, limitTo, matchMode, isCaseSensitive,
+    			requestor, new NullProgressMonitor());
+    }
 
-        JSPIndexManager.getInstance().rebuildIndexIfNeeded();
+    /**
+     * Search for an IJavaElement, constrained by the given parameters. Runs in
+     * a background Job (results may still come in after this method call)
+     * 
+     * @param element
+     * @param scope
+     * @param requestor
+     * 
+     * @deprecated use {@link #search(IJavaElement, IJavaSearchScope, SearchRequestor, IProgressMonitor)}
+     */
+    public void search(IJavaElement element, IJavaSearchScope scope, SearchRequestor requestor) {
+    	this.search(element, scope, requestor, new NullProgressMonitor());
+    }
+
+    /**
+     * Search for an IJavaElement, constrained by the given parameters. Runs in
+     * an IWorkspace runnable (results will be reported by the end of this
+     * method)
+     * 
+     * @param element
+     * @param scope
+     * @param requestor
+     * 
+     * @deprecated should use {@link #search(IJavaElement, IJavaSearchScope, SearchRequestor, IProgressMonitor)}
+     * so that operation can be canceled
+     */
+    public void searchRunnable(IJavaElement element, IJavaSearchScope scope, SearchRequestor requestor) {
+    	this.searchRunnable(element, scope, requestor, new NullProgressMonitor());
+    }
+    
+    /**
+     * Perform a java search w/ the given parameters. Runs in a background Job
+     * (results may still come in after this method call)
+     * 
+     * @param searchText
+     *            the string of text to search on
+     * @param searchFor
+     *            IJavaSearchConstants.TYPE, METHOD, FIELD, PACKAGE, etc...
+     * @param limitTo
+     *            IJavaSearchConstants.DECLARATIONS,
+     *            IJavaSearchConstants.REFERENCES,
+     *            IJavaSearchConstants.IMPLEMENTORS, or
+     *            IJavaSearchConstants.ALL_OCCURRENCES
+     * @param matchMode
+     *            allow * wildcards or not
+     * @param isCaseSensitive
+     * @param requestor
+     *            passed in to accept search matches (and do "something" with
+     *            them)
+     */
+    public void search(String searchText, IJavaSearchScope scope, int searchFor, int
+    		limitTo, int matchMode, boolean isCaseSensitive, SearchRequestor requestor,
+    		IProgressMonitor monitor) {
+
+    	//wait for the index
+		JSPIndexManager.getDefault().waitForConsistent(monitor);
 
         SearchJob job = new SearchJob(searchText, scope, searchFor, limitTo, matchMode, isCaseSensitive, requestor);
         setCanceled(false);
@@ -355,10 +397,12 @@
      * @param scope
      * @param requestor
      */
-    public void search(IJavaElement element, IJavaSearchScope scope, SearchRequestor requestor) {
+    public void search(IJavaElement element, IJavaSearchScope scope, SearchRequestor requestor,
+    		IProgressMonitor monitor) {
 
-        JSPIndexManager.getInstance().rebuildIndexIfNeeded();
-
+    	//wait for the index
+		JSPIndexManager.getDefault().waitForConsistent(monitor);
+    	
         SearchJob job = new SearchJob(element, scope, requestor);
         setCanceled(false);
         job.setUser(true);
@@ -376,9 +420,11 @@
      * @param scope
      * @param requestor
      */
-    public void searchRunnable(IJavaElement element, IJavaSearchScope scope, SearchRequestor requestor) {
-
-        JSPIndexManager.getInstance().rebuildIndexIfNeeded();
+    public void searchRunnable(IJavaElement element, IJavaSearchScope scope,
+    		SearchRequestor requestor, IProgressMonitor monitor) {
+    	
+    	//wait for the index
+		JSPIndexManager.getDefault().waitForConsistent(monitor);
 
         SearchRunnable searchRunnable = new SearchRunnable(element, scope, requestor);
         try {
@@ -484,11 +530,6 @@
             // this is the only difference from
             // IndexManager#computeIndexLocation(...)
             indexLocation = getModelJspPluginWorkingLocation().append(fileName);
-
-            // pa_TODO need to add to java path too, so JDT search support knows
-            // there should be a non internal way to do this.
-            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=77564
-            JavaModelManager.getIndexManager().indexLocations.put(containerPath, indexLocation);
         //}
         return indexLocation;
     }
@@ -500,7 +541,7 @@
             return this.fJspPluginLocation;
 
         // Append the folder name "jspsearch" to keep the state location area cleaner
-        IPath stateLocation = JSPCorePlugin.getDefault().getStateLocation().append("jspsearch");
+        IPath stateLocation = JSPCorePlugin.getDefault().getStateLocation().append("jspsearch"); //$NON-NLS-1$
 
         // pa_TODO workaround for
         // https://bugs.eclipse.org/bugs/show_bug.cgi?id=62267
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/JSPModelLoader.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/JSPModelLoader.java
index a646956..23b90ab 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/JSPModelLoader.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/JSPModelLoader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -50,7 +50,6 @@
 import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
 import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory;
 import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
 import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
 import org.eclipse.wst.sse.core.internal.model.AbstractModelLoader;
 import org.eclipse.wst.sse.core.internal.modelhandler.EmbeddedTypeRegistry;
@@ -157,7 +156,7 @@
 		// least the
 		// default embeddeded content type handler
 		EmbeddedTypeHandler embeddedType = getJSPDefaultEmbeddedType(null);
-		embeddedType.initializeParser((JSPCapableParser) structuredDocument.getParser());
+		embeddedType.initializeParser(structuredDocument.getParser());
 		return structuredDocument;
 	}
 
@@ -350,7 +349,7 @@
 		// ((INodeNotifier)
 		// document).getExistingAdapter(ModelQueryAdapter.class);
 		oldEmbeddedContentType.uninitializeFactoryRegistry(model.getFactoryRegistry());
-		oldEmbeddedContentType.uninitializeParser((JSPCapableParser) structuredDocument.getParser());
+		oldEmbeddedContentType.uninitializeParser(structuredDocument.getParser());
 		// since 'document' is not recreated in this
 		// reinit path, we need to remove all adapters,
 		// except for the propagated adapters (including page
@@ -390,7 +389,7 @@
 			((DOMModelImpl) model).setModelParser(null);
 
 			newEmbeddedContentType.initializeFactoryRegistry(model.getFactoryRegistry());
-			newEmbeddedContentType.initializeParser((JSPCapableParser) structuredDocument.getParser());
+			newEmbeddedContentType.initializeParser(structuredDocument.getParser());
 
 			// partitioner setup is the responsibility of this loader
 			IDocumentPartitioner documentPartitioner = structuredDocument.getDocumentPartitioner();
@@ -442,13 +441,13 @@
 		// the old embedded type (during createModel), we need to unitialize
 		// parts of it, based on the old (or default) ones
 		oldEmbeddedContentType.uninitializeFactoryRegistry(model.getFactoryRegistry());
-		oldEmbeddedContentType.uninitializeParser((JSPCapableParser) structuredDocument.getParser());
+		oldEmbeddedContentType.uninitializeParser(structuredDocument.getParser());
 		// remember, embedded type factories are automatically cleared when
 		// embededType changed
 		pageDirectiveAdapter.setEmbeddedType(newEmbeddedContentType);
 		if (newEmbeddedContentType != null) {
 			newEmbeddedContentType.initializeFactoryRegistry(model.getFactoryRegistry());
-			newEmbeddedContentType.initializeParser((JSPCapableParser) structuredDocument.getParser());
+			newEmbeddedContentType.initializeParser(structuredDocument.getParser());
 		}
 		// adding language here, in this convienent central
 		// location, but some obvious renaming or refactoring
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/ModelHandlerForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/ModelHandlerForJSP.java
index b139f25..aa74637 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/ModelHandlerForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelhandler/ModelHandlerForJSP.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/JSPModelQueryExtension.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/JSPModelQueryExtension.java
new file mode 100644
index 0000000..0b00471
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/JSPModelQueryExtension.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsp.core.internal.modelquery;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.jsp.core.internal.contentmodel.JSPCMDocumentFactory;
+import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP20Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
+import org.eclipse.wst.html.core.internal.contentmodel.JSPCMDocument;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.extension.ModelQueryExtension;
+import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * An implementation of {@link ModelQueryExtension} for JSP tags in JSP documents
+ */
+public class JSPModelQueryExtension extends ModelQueryExtension {
+	
+	private static final String TAG_JSP_ROOT = "jsp:root";
+
+	/**
+	 * Originally taken from JSPContentAssistProcessor
+	 * 
+	 * @see org.eclipse.wst.xml.core.internal.contentmodel.modelquery.extension.ModelQueryExtension#getAvailableElementContent(org.w3c.dom.Element, java.lang.String, int)
+	 */
+	public CMNode[] getAvailableElementContent(Element parentElement,
+			String namespace, int includeOptions) {
+		
+		CMNode[] nodes = EMPTY_CMNODE_ARRAY;
+		ArrayList nodeList = new ArrayList();
+		
+		//only returns anything if looking for child nodes
+		if(((includeOptions & ModelQuery.INCLUDE_CHILD_NODES) != 0) && parentElement instanceof IDOMNode) {
+			IDOMNode node = (IDOMNode)parentElement;
+			// get position dependent CMDocuments and insert their tags as
+			// proposals
+			ModelQueryAdapter mqAdapter = null;
+			if (node.getNodeType() == Node.DOCUMENT_NODE) {
+				mqAdapter = (ModelQueryAdapter) node.getAdapterFor(ModelQueryAdapter.class);
+			} else {
+				mqAdapter = (ModelQueryAdapter) ((IDOMNode) node.getOwnerDocument()).getAdapterFor(ModelQueryAdapter.class);
+			}
+
+			if (mqAdapter != null) {
+				CMDocument doc = mqAdapter.getModelQuery().getCorrespondingCMDocument(node);
+				if (doc != null) {
+					CMDocument jcmdoc = getDefaultJSPCMDocument(node);
+					CMNamedNodeMap jspelements = jcmdoc.getElements();
+
+					/* For a built-in JSP action the content model is properly
+					 * set up, so don't just blindly add the rest--unless this
+					 * will be a direct child of the document
+					 */
+					if (jspelements != null && (!(doc instanceof JSPCMDocument) || node.getNodeType() == Node.DOCUMENT_NODE)) {
+						List rejectElements = new ArrayList();
+
+						// determine if the document is in XML form
+						Document domDoc = null;
+						if (node.getNodeType() == Node.DOCUMENT_NODE) {
+							domDoc = (Document) node;
+						} else {
+							domDoc = node.getOwnerDocument();
+						}
+
+						// Show XML tag forms of JSP markers if jsp:root is
+						// the document element OR it's HTML but
+						// isn't really in the text.
+						// If the document isn't strictly XML, pull out the
+						// XML tag forms it is xml format
+						rejectElements.add(JSP12Namespace.ElementName.SCRIPTLET);
+						rejectElements.add(JSP12Namespace.ElementName.EXPRESSION);
+						rejectElements.add(JSP12Namespace.ElementName.DECLARATION);
+						rejectElements.add(JSP12Namespace.ElementName.DIRECTIVE_INCLUDE);
+						rejectElements.add(JSP12Namespace.ElementName.DIRECTIVE_PAGE);
+						rejectElements.add(JSP12Namespace.ElementName.TEXT);
+						rejectElements.add(JSP12Namespace.ElementName.DIRECTIVE_TAGLIB);
+						rejectElements.add(JSP20Namespace.ElementName.DIRECTIVE_TAG);
+						rejectElements.add(JSP20Namespace.ElementName.DIRECTIVE_ATTRIBUTE);
+						rejectElements.add(JSP20Namespace.ElementName.DIRECTIVE_VARIABLE);
+						if (isXMLFormat(domDoc)) {
+							// jsp actions
+							rejectElements.add(JSP12Namespace.ElementName.FALLBACK);
+							rejectElements.add(JSP12Namespace.ElementName.USEBEAN);
+							rejectElements.add(JSP12Namespace.ElementName.GETPROPERTY);
+							rejectElements.add(JSP12Namespace.ElementName.SETPROPERTY);
+							rejectElements.add(JSP12Namespace.ElementName.INCLUDE);
+							rejectElements.add(JSP12Namespace.ElementName.FORWARD);
+							rejectElements.add(JSP12Namespace.ElementName.PLUGIN);
+							rejectElements.add(JSP12Namespace.ElementName.FALLBACK);
+							rejectElements.add(JSP12Namespace.ElementName.PARAM);
+							rejectElements.add(JSP12Namespace.ElementName.PARAMS);
+						}
+
+
+						// don't show jsp:root if a document element already
+						// exists
+						Element docElement = domDoc.getDocumentElement();
+						if (docElement != null &&((docElement.getNodeName().equals(TAG_JSP_ROOT)) ||
+								((((IDOMNode) docElement).getStartStructuredDocumentRegion() != null ||
+										((IDOMNode) docElement).getEndStructuredDocumentRegion() != null)))) {
+							
+							rejectElements.add(JSP12Namespace.ElementName.ROOT);
+						}
+
+						for (int j = 0; j < jspelements.getLength(); j++) {
+							CMElementDeclaration ed = (CMElementDeclaration) jspelements.item(j);
+							if (!rejectElements.contains(ed.getNodeName())) {
+								nodeList.add(ed);
+							}
+						}
+
+					}
+				}
+				// No cm document (such as for the Document (a non-Element) node itself)
+				else {
+					CMNamedNodeMap jspElements = getDefaultJSPCMDocument(node).getElements();
+					int length = jspElements.getLength();
+					for (int i = 0; i < length; i++) {
+						nodeList.add(jspElements.item(i));
+					}
+				}
+			}
+			
+			nodes = (CMNode[])nodeList.toArray(new CMNode[nodeList.size()]);
+		}
+		
+		return nodes;
+	}
+	
+	/**
+	 * <p>For JSP files and segments, this is just the JSP
+	 *         document, but when editing tag files and their fragments, it
+	 *         should be the tag document.</p>
+	 * 
+	 * <p>It may also vary based on the model being edited in the future.</p>
+	 * 
+	 * <p><b>NOTE:</b>Copied from JSPContentAssistProcessor</p>
+	 *
+	 * @return the default non-embedded CMDocument for the document being
+	 *         edited. 
+	 */
+	private CMDocument getDefaultJSPCMDocument(IDOMNode node) {
+		CMDocument jcmdoc = null; 
+		
+		// handle tag files here
+		String contentType = node.getModel().getContentTypeIdentifier();
+		if (ContentTypeIdForJSP.ContentTypeID_JSPTAG.equals(contentType)) {
+			jcmdoc =  JSPCMDocumentFactory.getCMDocument(CMDocType.TAG20_DOC_TYPE);
+		} else {
+			String modelPath = node.getModel().getBaseLocation();
+			if (modelPath != null && !IModelManager.UNMANAGED_MODEL.equals(modelPath)) {
+				float version = DeploymentDescriptorPropertyCache.getInstance().getJSPVersion(new Path(modelPath));
+				jcmdoc = JSPCMDocumentFactory.getCMDocument(version);
+			}
+			if (jcmdoc == null) {
+				jcmdoc = JSPCMDocumentFactory.getCMDocument();
+			}
+		}
+
+		return jcmdoc;
+	}
+	
+	/**
+	 * <p><b>NOTE:</b>Copied from JSPContentAssistProcessor</p>
+	 *
+	 * @param doc determine if this {@link Document} is in an XML format
+	 * @return is the given document in an XML format
+	 */
+	private boolean isXMLFormat(Document doc) {
+		boolean result = false;
+		if (doc != null) {
+			Element docElement = doc.getDocumentElement();
+			result = docElement != null &&
+				((docElement.getNodeName().equals(TAG_JSP_ROOT)) ||
+						((((IDOMNode) docElement).getStartStructuredDocumentRegion() == null &&
+								((IDOMNode) docElement).getEndStructuredDocumentRegion() == null)));
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForJSP.java
index 5149774..7d5c14c 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForJSP.java
@@ -131,7 +131,7 @@
 		return modelQueryAdapterImpl;
 	}
 
-	ModelQuery createModelQuery(IStructuredModel model, URIResolver resolver) {
+	protected ModelQuery createModelQuery(IStructuredModel model, URIResolver resolver) {
 		return new JSPModelQueryImpl(model, resolver);
 	}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForTag.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForTag.java
index 443c8eb..ec9abb7 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForTag.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/ModelQueryAdapterFactoryForTag.java
@@ -15,7 +15,6 @@
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.SimpleAssociationProvider;
 
 public class ModelQueryAdapterFactoryForTag extends ModelQueryAdapterFactoryForJSP {
@@ -31,7 +30,7 @@
 		return new ModelQueryAdapterFactoryForTag(getAdapterKey(), isShouldRegisterAdapter());
 	}
 
-	ModelQuery createModelQuery(IStructuredModel model, URIResolver resolver) {
-		return new ModelQueryImpl(new SimpleAssociationProvider(new TagModelQueryCMProvider()));
+	protected ModelQuery createModelQuery(IStructuredModel model, URIResolver resolver) {
+		return new TagModelQuery(new SimpleAssociationProvider(new TagModelQueryCMProvider()));
 	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TagModelQuery.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TagModelQuery.java
new file mode 100644
index 0000000..73ef1cc
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TagModelQuery.java
@@ -0,0 +1,155 @@
+/*******************************************************************************

+ * Copyright (c) 2009 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.jst.jsp.core.internal.modelquery;

+

+import java.util.List;

+

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.resources.ProjectScope;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.core.runtime.preferences.IEclipsePreferences;

+import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;

+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;

+import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;

+import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerUtility;

+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;

+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;

+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;

+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;

+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;

+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;

+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;

+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;

+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryAssociationProvider;

+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl;

+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;

+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;

+import org.eclipse.wst.xml.core.internal.ssemodelquery.MovableModelQuery;

+import org.w3c.dom.Element;

+import org.w3c.dom.Node;

+

+/**

+ * ModelQuery for JSP Tag files. Prioritizes the Tag content model and any

+ * loaded tag libraries in the model before falling back to the embedded model

+ * query, if one is found.

+ */

+public class TagModelQuery extends ModelQueryImpl implements ModelQuery, MovableModelQuery {

+	/**

+	 * The default mime-type for the embedded ModelQuery

+	 */

+	public static final String DEFAULT_MIMETYPE = "text/html";

+

+

+	/**

+	 * The prefix used with ProjectScope to find the (possibly user-set)

+	 * embedded mime-type on a .tag file.

+	 */

+	private static final String PREFERENCE_PREFIX = "embeddedMimeType/";

+

+	public static String createPreferenceKey(IPath fullPath) {

+		return PREFERENCE_PREFIX + fullPath.removeFirstSegments(1).toString();

+	}

+

+	private ModelQuery fEmbeddedModelQuery;

+

+	/**

+	 * @param modelQueryAssociationProvider

+	 */

+	public TagModelQuery(ModelQueryAssociationProvider modelQueryAssociationProvider) {

+		super(modelQueryAssociationProvider);

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.

+	 * ModelQueryImpl#getCMElementDeclaration(org.w3c.dom.Element)

+	 */

+	public CMElementDeclaration getCMElementDeclaration(Element element) {

+		CMElementDeclaration cmElementDeclaration = super.getCMElementDeclaration(element);

+		if (cmElementDeclaration == null) {

+			ModelQuery embeddedModelQuery = getEmbeddedModelQuery(element);

+			if (embeddedModelQuery != null) {

+				return embeddedModelQuery.getCMElementDeclaration(element);

+			}

+		}

+		return cmElementDeclaration;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.

+	 * ModelQueryImpl#getCorrespondingCMDocument(org.w3c.dom.Node)

+	 */

+	public CMDocument getCorrespondingCMDocument(Node node) {

+		CMDocument document = super.getCorrespondingCMDocument(node);

+		if (document == null) {

+			ModelQuery embeddedModelQuery = getEmbeddedModelQuery(node);

+			if (embeddedModelQuery != null) {

+				return embeddedModelQuery.getCorrespondingCMDocument(node);

+			}

+		}

+		return document;

+	}

+

+	private String getEmbeddedMimeType(Node node) {

+		String type = DEFAULT_MIMETYPE;

+		if (node instanceof IDOMNode) {

+			IStructuredModel model = ((IDOMNode) node).getModel();

+			String baseLocation = model.getBaseLocation();

+			if (!baseLocation.equals(IModelManager.UNMANAGED_MODEL)) {

+				IPath path = new Path(baseLocation);

+				if (path.segmentCount() > 1) {

+					IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0));

+					if (project.isAccessible()) {

+						String key = createPreferenceKey(path);

+						IEclipsePreferences preferences = new ProjectScope(project).getNode(JSPCorePlugin.getDefault().getBundle().getSymbolicName());

+						type = preferences.get(key, DEFAULT_MIMETYPE);

+					}

+				}

+			}

+		}

+		return type;

+	}

+

+	private ModelQuery getEmbeddedModelQuery(Node node) {

+		if (fEmbeddedModelQuery == null) {

+			String embeddedMimeType = getEmbeddedMimeType(node);

+			if (embeddedMimeType != null) {

+				EmbeddedTypeHandler embeddedContentTypeHandler = ModelHandlerUtility.getEmbeddedContentTypeFor(embeddedMimeType);

+				if (embeddedContentTypeHandler != null) {

+					List adapterFactories = embeddedContentTypeHandler.getAdapterFactories();

+					for (int i = 0; i < adapterFactories.size(); i++) {

+						INodeAdapterFactory factory = (INodeAdapterFactory) adapterFactories.get(i);

+						if (factory.isFactoryForType(ModelQueryAdapter.class)) {

+							INodeAdapter adapter = factory.adapt((INodeNotifier) node.getOwnerDocument());

+							if (adapter instanceof ModelQueryAdapter) {

+								fEmbeddedModelQuery = ((ModelQueryAdapter) adapter).getModelQuery();

+							}

+						}

+					}

+				}

+			}

+		}

+		return fEmbeddedModelQuery;

+	}

+

+	/* (non-Javadoc)

+	 * @see org.eclipse.wst.xml.core.internal.ssemodelquery.MovableModelQuery#setIdResolver(org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver)

+	 */

+	public void setIdResolver(URIResolver newURIResolver) {

+		fEmbeddedModelQuery = null;

+	}

+}

diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TagModelQueryCMProvider.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TagModelQueryCMProvider.java
index a411467..8620e8a 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TagModelQueryCMProvider.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TagModelQueryCMProvider.java
@@ -62,7 +62,7 @@
 				if (tldmgr != null) {
 					List documents = tldmgr.getCMDocumentTrackers(node.getPrefix(), xmlNode.getStartOffset());
 					// there shouldn't be more than one cmdocument returned
-					if (documents != null && documents.size() > 0)
+					if (documents != null && !documents.isEmpty())
 						result = (CMDocument) documents.get(0);
 				}
 			}
@@ -70,9 +70,10 @@
 		catch (Exception e) {
 			e.printStackTrace();
 		}
-		if (result == null) {
-			result = tagdoc;
-		}
+// 204990 - JSP/Web Page Editors: tag files do not support content assist on html element attributes
+//		if (result == null) {
+//			result = tagdoc;
+//		}
 		return result;
 	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TaglibModelQueryExtension.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TaglibModelQueryExtension.java
new file mode 100644
index 0000000..33e8c1d
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/modelquery/TaglibModelQueryExtension.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsp.core.internal.modelquery;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.extension.ModelQueryExtension;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.w3c.dom.Element;
+
+/**
+ * An implementation of {@link ModelQueryExtension} for tag libraries in JSP documents
+ */
+public class TaglibModelQueryExtension extends ModelQueryExtension {
+	
+	/**
+	 * @see org.eclipse.wst.xml.core.internal.contentmodel.modelquery.extension.ModelQueryExtension#getAvailableElementContent(org.w3c.dom.Element, java.lang.String, int)
+	 */
+	public CMNode[] getAvailableElementContent(Element parentElement,
+			String namespace, int includeOptions) {
+		
+		CMNode[] nodes = EMPTY_CMNODE_ARRAY;
+		ArrayList nodeList = new ArrayList();
+		
+		//only returns anything if looking for child nodes
+		if(((includeOptions & ModelQuery.INCLUDE_CHILD_NODES) != 0) && parentElement instanceof IDOMElement) {
+			//get the trackers
+			IDOMElement elem = (IDOMElement)parentElement;
+			IStructuredDocument structDoc = elem.getModel().getStructuredDocument();
+			TLDCMDocumentManager manager = TaglibController.getTLDCMDocumentManager(structDoc);
+
+			if(manager != null) {
+				List trackers = new ArrayList(manager.getTaglibTrackers());
+				
+				//for each tracker add each of its elements to the node list
+				for(int trackerIndex = 0; trackerIndex < trackers.size(); ++trackerIndex) {
+					CMNamedNodeMap elements = ((TaglibTracker)trackers.get(trackerIndex)).getElements();
+					for(int elementIndex = 0; elementIndex < elements.getLength(); ++elementIndex) {
+						nodeList.add(elements.item(elementIndex));
+					}
+				}
+				
+				nodes = (CMNode[])nodeList.toArray(new CMNode[nodeList.size()]);
+			}
+		}
+		
+		return nodes;
+	}
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java
index fcb0642..7c04388 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -44,9 +44,19 @@
 		// None of the superclass' cases were valid, so check for JSP cases
 		if (result == null) {
 			result = checkForJSP();
+			if (result == null)
+				result = checkForJSPEL();
 		}
 		return result;
 	}
+	
+	private StructuredDocumentEvent checkForJSPEL() {
+		StructuredDocumentEvent result = null;
+		result = checkForCriticalKey("${"); //$NON-NLS-1$
+		if (result == null) 
+			result = checkForCriticalKey("}"); //$NON-NLS-1$
+		return result;
+	}
 
 	/**
 	 * A change to a JSP tag can result in all being reparsed.
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java
index 280e3ff..44af4f7 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -360,6 +360,13 @@
 				if (currentNode.getLastRegion() != null && currentNode.getLastRegion().getType() == DOMRegionContext.UNDEFINED) {
 					currentNode.getLastRegion().adjustLength(region.getLength());
 					currentNode.adjustLength(region.getLength());
+
+					//if adding this region to a previous container then need to add this
+					//region to the container and update its start location
+					if(currentNode.getLastRegion() instanceof ITextRegionContainer) {
+						region.adjustStart(-currentNode.getLastRegion().getStart() - currentNode.getStart());
+						((ITextRegionContainer)currentNode.getLastRegion()).getRegions().add(region);
+					}
 				}
 				// previous wasn't undefined
 				else {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
index b424476..917fe31 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
@@ -1,7 +1,7 @@
-/* The following code was generated by JFlex 1.2.2 on 10/24/07 5:16 AM */
+/* The following code was generated by JFlex 1.2.2 on 5/2/11 2:19 PM */
 
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,6 +9,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - contributions for bug 150794
  *******************************************************************************/
 
 package org.eclipse.jst.jsp.core.internal.parser.internal;
@@ -35,8 +36,8 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 10/24/07 5:16 AM from the specification file
- * <tt>file:/D:/eclipse.wtp/workspace/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
+ * on 5/2/11 2:19 PM from the specification file
+ * <tt>file:/C:/dev/workspaces/helios/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
  */
 public class JSPTokenizer implements BlockTokenizer, DOMJSPRegionContexts {
 
@@ -44,26 +45,26 @@
   final public static int YYEOF = -1;
 
   /** lexical states */
-  final public static int ST_JSP_VBL_DQUOTES = 51;
-  final public static int ST_JSP_VBL_SQUOTES = 50;
-  final public static int ST_JSP_VBL_SQUOTES_END = 52;
+  final public static int ST_JSP_VBL_DQUOTES = 52;
+  final public static int ST_JSP_VBL_SQUOTES = 51;
+  final public static int ST_JSP_VBL_SQUOTES_END = 53;
   final public static int ST_XML_COMMENT_END = 4;
   final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE = 21;
-  final public static int ST_JSP_EL_SQUOTES_END = 45;
-  final public static int ST_JSP_EL_DQUOTES = 44;
-  final public static int ST_JSP_EL = 42;
+  final public static int ST_JSP_EL_SQUOTES_END = 46;
+  final public static int ST_JSP_EL_DQUOTES = 45;
+  final public static int ST_JSP_EL = 43;
   final public static int ST_BLOCK_TAG_SCAN = 36;
-  final public static int ST_JSP_EL_SQUOTES = 43;
+  final public static int ST_JSP_EL_SQUOTES = 44;
   final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
   final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;
   final public static int ST_DHTML_TAG_CLOSE = 15;
-  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 41;
+  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 42;
   final public static int ST_DHTML_EQUALS = 13;
   final public static int ST_XML_PI_ATTRIBUTE_VALUE = 10;
   final public static int ST_XML_ATTRIBUTE_VALUE = 25;
-  final public static int ST_JSP_VBL = 49;
-  final public static int ST_JSP_SQUOTED_VBL = 55;
-  final public static int ST_XML_ATTRIBUTE_VALUE_SQUOTED = 40;
+  final public static int ST_JSP_VBL = 50;
+  final public static int ST_JSP_SQUOTED_VBL = 56;
+  final public static int ST_XML_ATTRIBUTE_VALUE_SQUOTED = 41;
   final public static int ST_XML_ATTRIBUTE_NAME = 23;
   final public static int ST_XML_EQUALS = 24;
   final public static int YYINITIAL = 0;
@@ -73,8 +74,8 @@
   final public static int ST_XML_ELEMENT_DECLARATION = 32;
   final public static int ST_XML_DECLARATION_CLOSE = 27;
   final public static int ST_JSP_DIRECTIVE_EQUALS = 20;
-  final public static int ST_JSP_VBL_DQUOTES_END = 53;
-  final public static int ST_JSP_DQUOTED_EL = 47;
+  final public static int ST_JSP_VBL_DQUOTES_END = 54;
+  final public static int ST_JSP_DQUOTED_EL = 48;
   final public static int ST_XML_DOCTYPE_DECLARATION = 28;
   final public static int ST_CDATA_END = 2;
   final public static int ST_PI_WS = 6;
@@ -82,13 +83,13 @@
   final public static int ST_JSP_DIRECTIVE_NAME_WHITESPACE = 18;
   final public static int ST_XML_ELEMENT_DECLARATION_CONTENT = 33;
   final public static int ST_XML_ATTLIST_DECLARATION = 34;
-  final public static int ST_JSP_EL_DQUOTES_END = 46;
-  final public static int ST_JSP_SQUOTED_EL = 48;
+  final public static int ST_JSP_EL_DQUOTES_END = 47;
+  final public static int ST_JSP_SQUOTED_EL = 49;
   final public static int ST_JSP_COMMENT_END = 39;
   final public static int ST_XML_PI_EQUALS = 9;
   final public static int ST_XML_ATTLIST_DECLARATION_CONTENT = 35;
   final public static int ST_XML_DOCTYPE_ID_PUBLIC = 30;
-  final public static int ST_JSP_DQUOTED_VBL = 54;
+  final public static int ST_JSP_DQUOTED_VBL = 55;
   final public static int ST_DHTML_ATTRIBUTE_NAME = 12;
   final public static int ST_ABORT_EMBEDDED = 37;
   final public static int ST_XML_DOCTYPE_EXTERNAL_ID = 29;
@@ -101,80 +102,81 @@
   final public static int ST_XML_TAG_NAME = 22;
   final public static int ST_XML_PI_TAG_CLOSE = 11;
   final public static int ST_XML_COMMENT = 3;
+  final public static int ST_JSP_ATTRIBUTE_VALUE = 40;
 
   /** 
    * Translates characters to character classes
    */
   final private static String yycmap_packed = 
-    "\11\0\1\5\1\26\2\0\1\17\22\0\1\17\1\25\1\12\1\65"+
-    "\1\15\1\22\1\13\1\14\1\24\1\24\1\24\1\24\1\24\1\7"+
-    "\1\6\1\3\12\20\1\11\1\72\1\1\1\51\1\2\1\4\1\21"+
-    "\1\40\1\73\1\36\1\37\1\55\1\70\1\62\1\62\1\63\1\62"+
-    "\1\62\1\33\1\31\1\64\1\52\1\54\1\62\1\67\1\66\1\41"+
-    "\1\71\2\62\1\27\1\53\1\62\1\35\1\104\1\23\1\0\1\10"+
-    "\1\0\1\57\1\103\1\74\1\60\1\43\1\70\1\75\1\106\1\46"+
-    "\1\100\1\62\1\34\1\32\1\50\1\47\1\101\1\62\1\44\1\45"+
-    "\1\56\1\102\1\42\1\62\1\30\1\61\1\62\1\16\1\0\1\105"+
-    "\71\0\1\77\10\0\27\76\1\0\37\76\1\0\72\76\2\0\13\76"+
-    "\2\0\10\76\1\0\65\76\1\0\104\76\11\0\44\76\3\0\2\76"+
-    "\4\0\36\76\70\0\131\76\22\0\7\76\16\0\2\77\56\0\106\77"+
-    "\32\0\2\77\44\0\1\76\1\77\3\76\1\0\1\76\1\0\24\76"+
-    "\1\0\54\76\1\0\7\76\3\0\1\76\1\0\1\76\1\0\1\76"+
-    "\1\0\1\76\1\0\22\76\15\0\14\76\1\0\102\76\1\0\14\76"+
-    "\1\0\44\76\1\0\4\77\11\0\65\76\2\0\2\76\2\0\2\76"+
-    "\3\0\34\76\2\0\10\76\2\0\2\76\67\0\46\76\2\0\1\76"+
-    "\7\0\46\76\12\0\21\77\1\0\27\77\1\0\3\77\1\0\1\77"+
-    "\1\0\2\77\1\0\1\77\13\0\33\76\5\0\3\76\56\0\32\76"+
-    "\5\0\1\77\12\76\10\77\15\0\12\77\6\0\1\77\107\76\2\0"+
-    "\5\76\1\0\17\76\1\0\4\76\1\0\1\76\17\77\2\76\2\77"+
-    "\1\0\4\77\2\0\12\77\u0207\0\3\77\1\0\65\76\2\0\1\77"+
-    "\1\76\20\77\3\0\4\77\3\0\12\76\2\77\2\0\12\77\21\0"+
-    "\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0\7\76\1\0"+
-    "\1\76\3\0\4\76\2\0\1\77\1\0\7\77\2\0\2\77\2\0"+
-    "\3\77\11\0\1\77\4\0\2\76\1\0\3\76\2\77\2\0\12\77"+
-    "\2\76\20\0\1\77\2\0\6\76\4\0\2\76\2\0\26\76\1\0"+
-    "\7\76\1\0\2\76\1\0\2\76\1\0\2\76\2\0\1\77\1\0"+
-    "\5\77\4\0\2\77\2\0\3\77\13\0\4\76\1\0\1\76\7\0"+
-    "\12\77\2\77\3\76\14\0\3\77\1\0\7\76\1\0\1\76\1\0"+
-    "\3\76\1\0\26\76\1\0\7\76\1\0\2\76\1\0\5\76\2\0"+
-    "\1\77\1\76\10\77\1\0\3\77\1\0\3\77\22\0\1\76\5\0"+
-    "\12\77\21\0\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0"+
-    "\7\76\1\0\2\76\2\0\4\76\2\0\1\77\1\76\6\77\3\0"+
-    "\2\77\2\0\3\77\10\0\2\77\4\0\2\76\1\0\3\76\4\0"+
-    "\12\77\22\0\2\77\1\0\6\76\3\0\3\76\1\0\4\76\3\0"+
-    "\2\76\1\0\1\76\1\0\2\76\3\0\2\76\3\0\3\76\3\0"+
-    "\10\76\1\0\3\76\4\0\5\77\3\0\3\77\1\0\4\77\11\0"+
-    "\1\77\17\0\11\77\21\0\3\77\1\0\10\76\1\0\3\76\1\0"+
-    "\27\76\1\0\12\76\1\0\5\76\4\0\7\77\1\0\3\77\1\0"+
-    "\4\77\7\0\2\77\11\0\2\76\4\0\12\77\22\0\2\77\1\0"+
-    "\10\76\1\0\3\76\1\0\27\76\1\0\12\76\1\0\5\76\4\0"+
-    "\7\77\1\0\3\77\1\0\4\77\7\0\2\77\7\0\1\76\1\0"+
-    "\2\76\4\0\12\77\22\0\2\77\1\0\10\76\1\0\3\76\1\0"+
-    "\27\76\1\0\20\76\4\0\6\77\2\0\3\77\1\0\4\77\11\0"+
-    "\1\77\10\0\2\76\4\0\12\77\221\0\56\76\1\0\1\76\1\77"+
-    "\2\76\7\77\5\0\6\76\1\77\10\77\1\0\12\77\47\0\2\76"+
-    "\1\0\1\76\2\0\2\76\1\0\1\76\2\0\1\76\6\0\4\76"+
-    "\1\0\7\76\1\0\3\76\1\0\1\76\1\0\1\76\2\0\2\76"+
-    "\1\0\2\76\1\0\1\76\1\77\2\76\6\77\1\0\2\77\1\76"+
-    "\2\0\5\76\1\0\1\77\1\0\6\77\2\0\12\77\76\0\2\77"+
-    "\6\0\12\77\13\0\1\77\1\0\1\77\1\0\1\77\4\0\2\77"+
-    "\10\76\1\0\41\76\7\0\24\77\1\0\6\77\4\0\6\77\1\0"+
-    "\1\77\1\0\25\77\3\0\7\77\1\0\1\77\346\0\46\76\12\0"+
-    "\47\76\11\0\1\76\1\0\2\76\1\0\3\76\1\0\1\76\1\0"+
-    "\2\76\1\0\5\76\51\0\1\76\1\0\1\76\1\0\1\76\13\0"+
-    "\1\76\1\0\1\76\1\0\1\76\3\0\2\76\3\0\1\76\5\0"+
-    "\3\76\1\0\1\76\1\0\1\76\1\0\1\76\1\0\1\76\3\0"+
-    "\2\76\3\0\2\76\1\0\1\76\50\0\1\76\11\0\1\76\2\0"+
-    "\1\76\2\0\2\76\7\0\2\76\1\0\1\76\1\0\7\76\50\0"+
-    "\1\76\4\0\1\76\10\0\1\76\u0c06\0\234\76\4\0\132\76\6\0"+
-    "\26\76\2\0\6\76\2\0\46\76\2\0\6\76\2\0\10\76\1\0"+
-    "\1\76\1\0\1\76\1\0\1\76\1\0\37\76\2\0\65\76\1\0"+
-    "\7\76\1\0\1\76\3\0\3\76\1\0\7\76\3\0\4\76\2\0"+
-    "\6\76\4\0\15\76\5\0\3\76\1\0\7\76\323\0\15\77\4\0"+
-    "\1\77\104\0\1\76\3\0\2\76\2\0\1\76\121\0\3\76\u0e82\0"+
-    "\1\77\1\0\1\76\31\0\11\76\6\77\1\0\5\77\13\0\124\76"+
-    "\4\0\2\77\2\0\2\77\2\0\132\76\1\0\3\77\6\0\50\76"+
-    "\u1cd3\0\u51a6\76\u0c5a\0\u2ba4\76\134\0\u0800\0\u1ffe\0\2\0";
+    "\11\0\1\5\1\27\2\0\1\20\22\0\1\20\1\26\1\12\1\66"+
+    "\1\15\1\23\1\13\1\14\1\25\1\25\1\25\1\25\1\25\1\7"+
+    "\1\6\1\3\12\21\1\11\1\73\1\1\1\52\1\2\1\4\1\22"+
+    "\1\41\1\74\1\37\1\40\1\56\1\71\1\63\1\63\1\64\1\63"+
+    "\1\63\1\34\1\32\1\65\1\53\1\55\1\63\1\70\1\67\1\42"+
+    "\1\72\2\63\1\30\1\54\1\63\1\36\1\17\1\24\1\0\1\10"+
+    "\1\0\1\60\1\104\1\75\1\61\1\44\1\71\1\76\1\106\1\47"+
+    "\1\101\1\63\1\35\1\33\1\51\1\50\1\102\1\63\1\45\1\46"+
+    "\1\57\1\103\1\43\1\63\1\31\1\62\1\63\1\16\1\0\1\105"+
+    "\71\0\1\100\10\0\27\77\1\0\37\77\1\0\72\77\2\0\13\77"+
+    "\2\0\10\77\1\0\65\77\1\0\104\77\11\0\44\77\3\0\2\77"+
+    "\4\0\36\77\70\0\131\77\22\0\7\77\16\0\2\100\56\0\106\100"+
+    "\32\0\2\100\44\0\1\77\1\100\3\77\1\0\1\77\1\0\24\77"+
+    "\1\0\54\77\1\0\7\77\3\0\1\77\1\0\1\77\1\0\1\77"+
+    "\1\0\1\77\1\0\22\77\15\0\14\77\1\0\102\77\1\0\14\77"+
+    "\1\0\44\77\1\0\4\100\11\0\65\77\2\0\2\77\2\0\2\77"+
+    "\3\0\34\77\2\0\10\77\2\0\2\77\67\0\46\77\2\0\1\77"+
+    "\7\0\46\77\12\0\21\100\1\0\27\100\1\0\3\100\1\0\1\100"+
+    "\1\0\2\100\1\0\1\100\13\0\33\77\5\0\3\77\56\0\32\77"+
+    "\5\0\1\100\12\77\10\100\15\0\12\100\6\0\1\100\107\77\2\0"+
+    "\5\77\1\0\17\77\1\0\4\77\1\0\1\77\17\100\2\77\2\100"+
+    "\1\0\4\100\2\0\12\100\u0207\0\3\100\1\0\65\77\2\0\1\100"+
+    "\1\77\20\100\3\0\4\100\3\0\12\77\2\100\2\0\12\100\21\0"+
+    "\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0\7\77\1\0"+
+    "\1\77\3\0\4\77\2\0\1\100\1\0\7\100\2\0\2\100\2\0"+
+    "\3\100\11\0\1\100\4\0\2\77\1\0\3\77\2\100\2\0\12\100"+
+    "\2\77\20\0\1\100\2\0\6\77\4\0\2\77\2\0\26\77\1\0"+
+    "\7\77\1\0\2\77\1\0\2\77\1\0\2\77\2\0\1\100\1\0"+
+    "\5\100\4\0\2\100\2\0\3\100\13\0\4\77\1\0\1\77\7\0"+
+    "\12\100\2\100\3\77\14\0\3\100\1\0\7\77\1\0\1\77\1\0"+
+    "\3\77\1\0\26\77\1\0\7\77\1\0\2\77\1\0\5\77\2\0"+
+    "\1\100\1\77\10\100\1\0\3\100\1\0\3\100\22\0\1\77\5\0"+
+    "\12\100\21\0\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0"+
+    "\7\77\1\0\2\77\2\0\4\77\2\0\1\100\1\77\6\100\3\0"+
+    "\2\100\2\0\3\100\10\0\2\100\4\0\2\77\1\0\3\77\4\0"+
+    "\12\100\22\0\2\100\1\0\6\77\3\0\3\77\1\0\4\77\3\0"+
+    "\2\77\1\0\1\77\1\0\2\77\3\0\2\77\3\0\3\77\3\0"+
+    "\10\77\1\0\3\77\4\0\5\100\3\0\3\100\1\0\4\100\11\0"+
+    "\1\100\17\0\11\100\21\0\3\100\1\0\10\77\1\0\3\77\1\0"+
+    "\27\77\1\0\12\77\1\0\5\77\4\0\7\100\1\0\3\100\1\0"+
+    "\4\100\7\0\2\100\11\0\2\77\4\0\12\100\22\0\2\100\1\0"+
+    "\10\77\1\0\3\77\1\0\27\77\1\0\12\77\1\0\5\77\4\0"+
+    "\7\100\1\0\3\100\1\0\4\100\7\0\2\100\7\0\1\77\1\0"+
+    "\2\77\4\0\12\100\22\0\2\100\1\0\10\77\1\0\3\77\1\0"+
+    "\27\77\1\0\20\77\4\0\6\100\2\0\3\100\1\0\4\100\11\0"+
+    "\1\100\10\0\2\77\4\0\12\100\221\0\56\77\1\0\1\77\1\100"+
+    "\2\77\7\100\5\0\6\77\1\100\10\100\1\0\12\100\47\0\2\77"+
+    "\1\0\1\77\2\0\2\77\1\0\1\77\2\0\1\77\6\0\4\77"+
+    "\1\0\7\77\1\0\3\77\1\0\1\77\1\0\1\77\2\0\2\77"+
+    "\1\0\2\77\1\0\1\77\1\100\2\77\6\100\1\0\2\100\1\77"+
+    "\2\0\5\77\1\0\1\100\1\0\6\100\2\0\12\100\76\0\2\100"+
+    "\6\0\12\100\13\0\1\100\1\0\1\100\1\0\1\100\4\0\2\100"+
+    "\10\77\1\0\41\77\7\0\24\100\1\0\6\100\4\0\6\100\1\0"+
+    "\1\100\1\0\25\100\3\0\7\100\1\0\1\100\346\0\46\77\12\0"+
+    "\47\77\11\0\1\77\1\0\2\77\1\0\3\77\1\0\1\77\1\0"+
+    "\2\77\1\0\5\77\51\0\1\77\1\0\1\77\1\0\1\77\13\0"+
+    "\1\77\1\0\1\77\1\0\1\77\3\0\2\77\3\0\1\77\5\0"+
+    "\3\77\1\0\1\77\1\0\1\77\1\0\1\77\1\0\1\77\3\0"+
+    "\2\77\3\0\2\77\1\0\1\77\50\0\1\77\11\0\1\77\2\0"+
+    "\1\77\2\0\2\77\7\0\2\77\1\0\1\77\1\0\7\77\50\0"+
+    "\1\77\4\0\1\77\10\0\1\77\u0c06\0\234\77\4\0\132\77\6\0"+
+    "\26\77\2\0\6\77\2\0\46\77\2\0\6\77\2\0\10\77\1\0"+
+    "\1\77\1\0\1\77\1\0\1\77\1\0\37\77\2\0\65\77\1\0"+
+    "\7\77\1\0\1\77\3\0\3\77\1\0\7\77\3\0\4\77\2\0"+
+    "\6\77\4\0\15\77\5\0\3\77\1\0\7\77\323\0\15\100\4\0"+
+    "\1\100\104\0\1\77\3\0\2\77\2\0\1\77\121\0\3\77\u0e82\0"+
+    "\1\100\1\0\1\77\31\0\11\77\6\100\1\0\5\100\13\0\124\77"+
+    "\4\0\2\100\2\0\2\100\2\0\132\77\1\0\3\100\6\0\50\77"+
+    "\u1cd3\0\u51a6\77\u0c5a\0\u2ba4\77\134\0\u0800\0\u1ffe\0\2\0";
 
   /** 
    * Translates characters to character classes
@@ -191,585 +193,662 @@
      2130,  2201,  2272,  2343,  2414,  2485,  2556,  2627,  2698,  2769, 
      2840,  2911,  2982,  3053,  3124,  3195,  3266,  3337,  3408,  3479, 
      3550,  3621,  3692,  3763,  3834,  3905,  3976,  4047,  4118,  4189, 
-     4260,  4331,  4402,  4473,  4402,  4473,  4544,  4402,  4402,  4473, 
-     4615,  4686,  4757,  4828,  4899,  4970,  5041,  5112,  4402,  4473, 
-     5183,  5254,  5325,  4402,  5396,  5396,  5467,  5538,  5609,  5183, 
-     4402,  5680,  5751,  4402,  5822,  5893,  5964,  6035,  4402,  4473, 
-     6106,  6177,  6248,  6319,  6390,  6461,  4402,  6532,  6532,  6603, 
-     6674,  6745,  6816,  6887,  4402,  6958,  7029,  7100,  7171,  7242, 
-     7313,  4402,  7384,  7455,  7526,  7597,  7668,  7739,  7810,  7881, 
-     4402,  7952,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8449, 
-     8520,  8591,  8662,  8733,  8733,  8804,  8875,  8946,  9017,  9017, 
-     9088,  9159,  9230,  9301,  4402,  9372,  9372,  9443,  9514,  9585, 
-     9656,  4402,  4402,  4473,  4402,  4473,  9727,  9798,  9869,  9940, 
-     4402, 10011, 10082, 10153, 10224,  4402, 10295, 10366, 10437, 10508, 
-     4402,  4402, 10579,  4402, 10650, 10721, 10650, 10792, 10863, 10792, 
-     4402,  4402, 10934, 11005, 11076,  4402, 11147, 11218, 11289, 11360, 
-    11431,  4402,  4402, 11502,  4402, 11573, 11644, 11573, 11715, 11786, 
-    11715,  4402,  4402, 11857, 11928, 11999,  4402, 12070, 12141, 12212, 
-     4402,  4402, 12283, 12354, 12425, 12496, 12567,  4402, 12638, 12709, 
-    12780, 12851, 12922, 12993, 13064, 13135,  4402, 13206, 13277, 13348, 
-     4402,  4402,  5396,  5538,  4402, 13419,  5609, 13490,  5680,  5822, 
-     5893, 13561,  5964,  4402, 13632, 13703,  6035, 13774,  4402, 12354, 
-     4402,  6532,  6603,  4402, 13845,  6674, 13916,  4402, 13987, 14058, 
-     7384, 14129,  7597,  4402, 14200,  7668, 14271, 14342, 14413, 14484, 
-    14555, 14626,  8165,  4402, 14697, 14768,  8449,  8520,  4402, 14839, 
-    14910, 14981, 15052, 15123,  8662,  8449,  8733,  8804,  4402,  8875, 
-     8946,  8733,  9017,  9088,  4402, 15194, 15265, 15336, 15407, 15478, 
-    15549, 15620,  9372,  9443,  4402, 15691, 15762, 15833, 15904, 15975, 
-    16046, 16117, 16188, 16259,  4402,  4402,  4402, 16330,  4402,  4402, 
-    16401, 16472, 16543, 16614, 10650,  4402, 16685, 16756, 10792,  4402, 
-    16827, 16898, 16969, 17040, 17111, 17182, 17253, 17324, 17395, 11360, 
-    11573,  4402, 17466, 17537, 11715,  4402, 17608, 17679, 17750, 17821, 
-    17892, 17963, 18034, 18105, 18176,  4402,  4402,  4402, 18247, 18318, 
-    18389, 18460, 18531,  4402, 18602, 18673,  4402,  4402,  4402,  4402, 
-     4402,  4828, 18744, 18815, 18886, 18957, 19028, 19099, 19170, 19099, 
-    19241, 19312, 19241, 19383, 19454, 19525, 19596, 19667, 19738, 19809, 
-    19809, 19880, 19951, 19951, 20022,  9230,  9230,  9230, 20093, 20164, 
-    20235, 20235, 20306,  9585,  9585,  9585, 20377, 20448, 16543, 20519, 
-    10437, 10437, 10437, 20590, 20661, 10650, 10650, 10650, 20732, 20803, 
-    10792, 10792, 10792, 20874, 20945, 10934, 10934, 10934, 17111, 21016, 
-    21087, 11147, 11147, 11147, 17324, 21158, 21229, 11360, 11360, 11360, 
-    21300, 11573, 11573, 11573, 21371, 21442, 11715, 11715, 11715, 21513, 
-    21584, 11857, 11857, 11857, 17892, 21655, 21726, 12070, 12070, 12070, 
-    18105, 21797,  4402,  4402, 21868, 21939,  4402, 22010, 22081, 22152, 
-    22223,  7384,  4402,  4402, 22294, 22365, 22436, 22507, 22578, 15052, 
-    15407,  9230, 22649, 15904,  9585, 22720,  4402, 10437, 10650, 22791, 
-    10792, 22862, 10934, 22933,  4402, 11147, 23004, 11360, 11573, 23075, 
-    11715, 23146, 11857, 23217,  4402, 12070, 23288, 23359, 23430, 23501, 
-    23572, 23643, 23714, 23785, 23856, 23927, 23998, 24069, 24140, 24211, 
-    24282, 24353, 24424, 24495, 24566, 24637, 24708, 24779, 24850,  4828, 
-    24921, 24992, 25063, 25134, 25205,  4402,  4402, 25276, 25347, 25418, 
-    25489, 17111, 17324, 25560, 25631, 17892, 18105, 25702, 25773, 25844, 
-    25915,  4402,  4402,  4402, 25986, 26057, 26128, 26199, 26270, 26341, 
-    26412, 26483,  7100, 26554, 26625, 26696, 26767, 26838, 26909, 26980, 
-     4402, 27051, 27122,  9230,  9585, 10650, 10792, 11573, 11715, 27193, 
-    27264, 27335, 27406, 27477, 27548, 27619, 27690,  4828, 27761, 27832, 
-    27903, 27974, 28045, 28116, 28187, 28258, 28329, 28400, 28471, 28542, 
-    28613, 28684, 28755, 28826, 28897, 28968, 29039, 29110, 29181, 29252, 
-    29323, 29394, 29465, 29536, 29607, 29678, 29749, 29820, 29891, 29962, 
-    30033, 30104, 30175, 30246,  4402, 30317, 30388, 30459, 30530,  7100, 
-    30601, 30672, 30743, 30814, 30885, 30956, 31027, 31098, 31169, 31240, 
-    31311, 31382, 31453, 31524
+     4260,  4331,  4402,  4473,  4544,  4615,  4544,  4615,  4686,  4544, 
+     4544,  4615,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  5254, 
+     4544,  4615,  5325,  5396,  5467,  4544,  5538,  5538,  5609,  5680, 
+     5751,  5325,  4544,  5822,  5893,  4544,  5964,  6035,  6106,  6177, 
+     4544,  4615,  6248,  6319,  6390,  6461,  6532,  6603,  4544,  6674, 
+     6674,  6745,  6816,  6887,  6958,  7029,  4544,  7100,  7171,  7242, 
+     7313,  7384,  7455,  4544,  7526,  7597,  7668,  7739,  7810,  7881, 
+     7952,  8023,  4544,  8094,  8165,  8236,  8307,  8378,  8449,  8520, 
+     8591,  8591,  8662,  8733,  8804,  8875,  8875,  8946,  9017,  9088, 
+     9159,  9159,  9230,  9301,  9372,  9443,  4544,  9514,  9514,  9585, 
+     9656,  9727,  9798,  4544,  4544,  4615,  4544,  4615,  9869,  9940, 
+     7597, 10011, 10082, 10153, 10224, 10295, 10366, 10437, 10508,  4544, 
+    10579, 10650, 10721, 10792,  4544, 10863, 10934, 11005, 11076,  4544, 
+     4544, 11147,  4544, 11218, 11289,  4544, 11218, 11360, 11431,  4544, 
+    11360, 11502, 11573,  4544, 11644,  4544, 11715, 11786, 11857, 11928, 
+    11999,  4544,  4544, 12070,  4544, 12141, 12212,  4544, 12141, 12283, 
+    12354,  4544, 12283, 12425, 12496, 12567,  4544, 12638, 12709, 12780, 
+     4544,  4544, 12851, 12922, 12993, 13064, 13135, 13206, 13277, 13348, 
+    13419, 13490, 13561, 13632, 13703, 13774,  4544, 13845, 13916, 13987, 
+     4544,  4544,  5538,  5680,  4544, 14058, 14129,  5751, 14200, 14271, 
+     5822,  5964,  6035, 14342,  6106,  4544, 14413, 14484, 14555,  6177, 
+    14626, 14697,  4544, 12922,  4544,  6674,  6745,  4544, 14768, 14839, 
+     6816, 14910, 14981,  4544, 15052, 15123,  7526, 15194,  7739,  4544, 
+    15265, 15336,  7810, 15407, 15478, 15549, 15620, 15691, 15762, 15833, 
+     8307,  4544, 15904, 15975,  8591,  8662,  4544, 16046, 16117, 16188, 
+    16259, 16330, 16401, 16472,  8804,  8591,  8875,  8946,  4544,  9017, 
+     9088,  8875,  9159,  9230,  4544, 16543, 16614, 16685, 16756, 16827, 
+    16898, 16969, 17040, 17111,  9514,  9585,  4544, 17182, 17253, 17324, 
+    17395, 17466, 17537, 17608, 17679, 17750, 17821,  9940, 10082,  4544, 
+    17892, 17963, 10153, 18034, 18105, 18176, 18247,  4544, 18318,  4544, 
+     4544,  4544,  4544, 18389, 18460, 18531, 18602, 11218,  4544, 18673, 
+    18744, 11360,  4544, 18815, 18886, 18957, 19028, 19099, 19170, 19241, 
+    19312, 19383, 11928, 12141,  4544, 19454, 19525, 12283,  4544, 19596, 
+    19667, 19738, 19809, 19880, 19951, 20022, 20093, 20164,  4544,  4544, 
+     4544, 20235, 20306, 20377, 20448, 20519,  4544, 20590, 20661, 20732, 
+     4544,  4544,  4544,  4544, 20803,  4544,  4544,  4970, 20874, 20945, 
+    21016, 21087, 21158, 21229, 21300, 21371, 21442, 21513, 21584, 21655, 
+    21726, 21797, 21868, 21939, 22010, 21939, 22081, 22152, 22081, 22223, 
+    22294, 22365, 22436, 22507, 22578, 22649, 22720, 22720, 22791, 22862, 
+    22933, 23004, 23004, 23075, 23146,  9372,  9372,  9372, 23217, 23288, 
+    23359, 23430, 23430, 23501, 23572,  9727,  9727,  9727, 23643, 23714, 
+    10082, 23785, 10153, 23856, 23927, 23927, 23998, 23998, 18531, 24069, 
+    11005, 11005, 11005, 24140, 24211, 11218, 11218, 11218, 24282, 24353, 
+    11360, 11360, 11360, 24424, 24495, 11502, 11502, 11502, 19099, 24566, 
+    24637, 11715, 11715, 11715, 19312, 24708, 24779, 11928, 11928, 11928, 
+    24850, 12141, 12141, 12141, 24921, 24992, 12283, 12283, 12283, 25063, 
+    25134, 12425, 12425, 12425, 19880, 25205, 25276, 12638, 12638, 12638, 
+    20093, 25347,  4544,  4544, 25418, 25489,  4544, 25560, 25631, 25702, 
+    25773, 25844, 25915,  7526,  4544,  4544, 25986, 26057, 26128, 26199, 
+    26270, 16330, 16827,  9372, 26341, 17466,  9727, 26412,  4544,  9940, 
+    11005, 11218, 26483, 11360, 26554, 11502, 26625,  4544, 11715, 26696, 
+    11928, 12141, 26767, 12283, 26838, 12425, 26909,  4544, 12638, 26980, 
+    27051, 27122, 27193, 27264, 27335, 27406, 27477, 27548, 27619, 27690, 
+    27761, 27832, 27903, 27974, 28045, 28116, 28187, 28258, 28329, 28400, 
+    28471, 28542,  4970, 28613, 28684, 28755, 28826, 28897,  4544,  4544, 
+    28968, 29039, 29110, 29181, 19099, 19312, 29252, 29323, 19880, 20093, 
+    29394, 29465, 29536, 29607,  4544,  4544,  4544, 29678, 29749, 29820, 
+    29891, 29962, 30033, 30104, 30175,  7242, 30246, 30317, 30388, 30459, 
+    30530, 30601, 30672,  4544, 30743, 30814,  9372,  9727, 11218, 11360, 
+    12141, 12283, 30885, 30956, 31027, 31098, 31169, 31240, 31311, 31382, 
+     4970, 31453, 31524, 31595, 31666, 31737, 31808, 31879, 31950, 32021, 
+    32092, 32163, 32234, 32305, 32376, 32447, 32518, 32589, 32660, 32731, 
+    32802, 32873, 32944, 33015, 33086, 33157, 33228, 33299, 33370, 33441, 
+    33512, 33583, 33654, 33725, 33796, 33867, 33938,  4544, 34009, 34080, 
+    34151, 34222,  7242, 34293, 34364, 34435, 34506, 34577, 34648, 34719, 
+    34790, 34861, 34932, 35003, 35074, 35145, 35216
   };
 
   /** 
    * The packed transition table of the DFA
    */
   final private static String yy_packed = 
-    "\1\71\1\72\11\71\1\73\1\71\1\74\4\71\1\75"+
-    "\42\71\1\76\21\71\1\77\1\100\105\77\1\101\1\102"+
-    "\21\101\1\103\2\101\1\104\60\101\1\105\1\106\105\105"+
-    "\1\101\1\102\5\101\1\107\16\101\1\104\61\101\1\102"+
-    "\2\101\1\110\1\111\2\101\2\112\5\101\1\111\6\101"+
-    "\1\111\1\113\1\114\4\112\1\101\10\112\1\115\2\112"+
-    "\1\101\11\112\1\115\1\112\1\101\4\112\1\101\4\112"+
-    "\1\101\4\112\2\101\1\112\1\101\1\102\2\101\1\110"+
-    "\1\116\11\101\1\116\6\101\1\116\60\101\1\117\1\120"+
-    "\2\117\1\121\21\117\1\104\60\117\1\101\1\102\2\101"+
-    "\1\122\1\111\2\101\2\123\5\101\1\111\6\101\1\111"+
-    "\6\123\1\101\13\123\1\101\13\123\1\101\4\123\1\101"+
-    "\4\123\1\101\4\123\2\101\1\123\1\101\1\102\2\101"+
-    "\1\122\1\111\2\101\2\123\5\101\1\111\6\101\1\111"+
-    "\6\123\1\101\13\123\1\124\13\123\1\101\4\123\1\101"+
-    "\4\123\1\101\4\123\2\101\1\123\1\125\1\102\1\101"+
-    "\1\126\1\127\1\111\4\125\1\130\1\125\1\131\2\125"+
-    "\1\111\6\125\1\111\60\125\1\101\1\102\2\101\1\132"+
-    "\21\101\1\104\61\101\1\102\1\133\1\134\1\101\1\111"+
-    "\2\101\2\135\5\101\1\111\6\101\1\111\6\135\1\101"+
-    "\13\135\1\101\13\135\1\101\4\135\1\101\4\135\1\101"+
-    "\4\135\2\101\1\135\1\101\1\102\1\133\1\134\1\101"+
-    "\1\111\2\101\2\135\5\101\1\111\6\101\1\111\6\135"+
-    "\1\101\13\135\1\136\13\135\1\101\4\135\1\101\4\135"+
-    "\1\101\4\135\2\101\1\135\1\137\1\102\1\133\1\140"+
-    "\1\137\1\111\4\137\1\141\1\137\1\142\2\137\1\111"+
-    "\6\137\1\111\60\137\1\101\1\102\3\101\1\111\11\101"+
-    "\1\111\6\101\1\111\60\101\1\143\1\144\20\143\1\145"+
-    "\64\143\1\101\1\146\3\101\1\111\2\101\2\147\5\101"+
-    "\1\111\2\101\1\150\3\101\1\111\6\147\1\101\13\147"+
-    "\1\101\13\147\1\101\4\147\1\101\4\147\1\101\4\147"+
-    "\2\101\1\147\1\101\1\146\3\101\1\151\11\101\1\151"+
-    "\2\101\1\150\3\101\1\151\61\101\1\146\3\101\1\111"+
-    "\2\101\2\152\5\101\1\111\2\101\1\150\3\101\1\111"+
-    "\6\152\1\101\13\152\1\101\13\152\1\101\4\152\1\101"+
-    "\4\152\1\101\4\152\2\101\1\152\1\101\1\146\3\101"+
-    "\1\111\2\101\2\152\5\101\1\111\2\101\1\150\3\101"+
-    "\1\111\6\152\1\101\13\152\1\153\13\152\1\101\4\152"+
-    "\1\101\4\152\1\101\4\152\2\101\1\152\1\154\1\146"+
-    "\1\101\1\155\1\154\1\111\4\154\1\156\1\154\1\157"+
-    "\2\154\1\111\2\154\1\160\3\154\1\111\60\154\1\161"+
-    "\1\162\1\163\1\164\4\161\2\165\15\161\6\166\1\161"+
-    "\13\166\1\161\13\166\1\161\4\166\1\161\4\166\1\161"+
-    "\1\167\3\166\2\161\1\166\1\101\1\170\1\163\1\164"+
-    "\1\101\1\111\2\101\2\171\5\101\1\111\6\101\1\111"+
-    "\6\171\1\101\13\171\1\101\13\171\1\101\4\171\1\101"+
-    "\4\171\1\101\4\171\2\101\1\171\1\101\1\170\1\163"+
-    "\1\164\1\101\1\111\2\101\2\171\5\101\1\111\6\101"+
-    "\1\111\6\171\1\101\13\171\1\172\13\171\1\101\4\171"+
-    "\1\101\4\171\1\101\4\171\2\101\1\171\1\173\1\174"+
-    "\1\163\1\175\1\173\1\111\4\173\1\176\1\173\1\177"+
-    "\1\200\1\173\1\111\6\173\1\111\36\173\1\201\21\173"+
-    "\1\101\1\202\1\203\2\101\1\111\11\101\1\111\6\101"+
-    "\1\111\10\101\1\204\1\205\2\101\1\206\11\101\1\206"+
-    "\1\101\1\205\1\204\27\101\1\102\1\203\2\101\1\111"+
-    "\11\101\1\111\6\101\1\111\6\101\1\207\52\101\1\102"+
-    "\1\203\2\101\1\111\2\101\2\210\5\101\1\111\6\101"+
-    "\1\111\6\210\1\207\13\210\1\101\13\210\1\101\4\210"+
-    "\1\101\4\210\1\101\4\210\2\101\1\210\1\101\1\102"+
-    "\1\203\2\101\1\111\11\101\1\111\6\101\1\111\6\101"+
-    "\1\207\7\101\1\211\6\101\1\212\11\101\1\211\12\101"+
-    "\1\212\5\101\1\213\1\102\1\203\1\214\1\213\1\111"+
-    "\4\213\1\215\1\213\1\216\2\213\1\111\6\213\1\111"+
-    "\6\213\1\217\51\213\1\220\1\102\1\203\1\221\1\220"+
-    "\1\111\4\220\1\222\1\220\1\223\2\220\1\111\6\220"+
-    "\1\111\6\220\1\224\51\220\1\225\1\102\1\203\1\226"+
-    "\1\225\1\111\4\225\1\227\1\225\1\230\2\225\1\111"+
-    "\6\225\1\111\60\225\1\231\1\232\1\233\104\231\1\234"+
-    "\1\102\1\203\1\235\1\234\1\111\4\234\1\236\1\234"+
-    "\1\237\2\234\1\111\6\234\1\111\60\234\1\240\1\241"+
-    "\1\242\104\240\1\243\1\244\105\243\1\101\1\102\24\101"+
-    "\1\104\60\101\1\245\1\246\105\245\1\101\1\102\5\101"+
-    "\1\247\16\101\1\104\60\101\1\250\1\251\3\250\1\252"+
-    "\6\250\1\253\1\254\1\250\1\252\6\250\1\252\36\250"+
-    "\1\255\21\250\1\256\1\251\3\256\1\257\4\256\1\260"+
-    "\2\256\1\261\1\256\1\257\6\256\1\257\36\256\1\262"+
-    "\21\256\1\263\1\264\10\263\1\265\1\263\1\266\1\267"+
-    "\67\263\1\270\1\263\1\271\1\272\12\271\1\101\11\271"+
-    "\1\273\60\271\1\274\1\275\10\274\1\101\13\274\1\276"+
-    "\60\274\1\101\1\102\12\101\1\277\11\101\1\104\61\101"+
-    "\1\102\10\101\1\300\13\101\1\104\60\101\1\301\1\302"+
-    "\10\301\1\260\71\301\1\303\1\304\1\301\1\305\1\306"+
-    "\12\305\1\253\67\305\1\307\1\304\1\305\1\310\1\311"+
-    "\10\310\1\312\1\310\1\313\50\310\1\314\17\310\1\315"+
-    "\1\310\1\316\1\317\12\316\1\101\11\316\1\320\60\316"+
-    "\1\321\1\322\10\321\1\101\13\321\1\323\60\321\1\101"+
-    "\1\102\12\101\1\324\11\101\1\104\61\101\1\102\10\101"+
-    "\1\325\13\101\1\104\60\101\1\326\1\327\10\326\1\260"+
-    "\71\326\1\330\1\331\1\326\1\332\1\333\12\332\1\253"+
-    "\67\332\1\334\1\331\1\332\1\71\1\0\11\71\1\0"+
-    "\1\71\1\0\4\71\1\0\42\71\1\0\21\71\3\0"+
-    "\1\335\1\336\15\0\1\337\2\0\1\340\66\0\1\341"+
-    "\2\0\2\342\5\0\1\341\6\0\1\341\6\342\1\0"+
-    "\13\342\1\0\13\342\1\343\4\342\1\0\4\342\1\0"+
-    "\4\342\2\0\1\342\1\344\1\0\11\344\1\0\1\344"+
-    "\1\345\1\346\3\344\1\0\64\344\5\0\1\341\2\0"+
-    "\2\347\5\0\1\341\6\0\1\341\6\347\1\0\13\347"+
-    "\1\0\13\347\1\0\4\347\1\0\4\347\1\0\4\347"+
-    "\2\0\1\347\1\344\1\0\11\344\1\0\2\344\1\350"+
-    "\3\344\1\0\42\344\1\351\21\344\131\0\1\337\2\0"+
-    "\1\352\104\0\1\353\72\0\1\354\101\0\1\355\111\0"+
-    "\1\111\11\0\1\111\6\0\1\111\66\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\13\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\112\6\0"+
-    "\1\112\6\0\2\112\2\356\2\112\1\0\13\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\112\6\0\1\112\6\0\2\112\1\356\1\357\2\112"+
-    "\1\0\13\112\1\0\13\112\1\0\4\112\1\0\11\112"+
-    "\2\0\1\112\6\0\4\112\6\0\1\112\6\0\2\112"+
-    "\2\360\2\112\1\0\13\112\1\0\13\112\1\0\4\112"+
-    "\1\0\11\112\2\0\1\112\5\0\1\116\11\0\1\116"+
-    "\6\0\1\116\62\0\1\361\106\0\1\362\112\0\4\123"+
-    "\6\0\1\123\6\0\6\123\1\0\13\123\1\0\13\123"+
-    "\1\0\4\123\1\0\11\123\2\0\1\123\1\125\2\0"+
-    "\1\363\1\125\1\0\4\125\1\0\1\125\1\0\2\125"+
-    "\1\0\6\125\1\0\61\125\1\0\1\362\1\363\1\125"+
-    "\1\0\4\125\1\0\1\125\1\0\2\125\1\0\6\125"+
-    "\1\0\60\125\1\364\1\0\10\364\1\365\2\364\1\366"+
-    "\47\364\1\366\21\364\1\367\1\0\12\367\1\365\1\370"+
-    "\47\367\1\370\21\367\2\0\1\133\1\371\111\0\4\135"+
-    "\6\0\1\135\6\0\6\135\1\0\13\135\1\0\13\135"+
-    "\1\0\4\135\1\0\11\135\2\0\1\135\1\137\2\0"+
-    "\1\372\1\137\1\0\4\137\1\0\1\137\1\0\2\137"+
-    "\1\0\6\137\1\0\61\137\1\0\1\133\1\373\1\137"+
-    "\1\0\4\137\1\0\1\137\1\0\2\137\1\0\6\137"+
-    "\1\0\60\137\1\141\1\0\1\374\1\375\1\141\1\374"+
-    "\4\141\1\376\1\141\1\374\1\377\1\141\1\374\6\141"+
-    "\1\374\36\141\1\377\21\141\1\142\1\0\1\u0100\1\u0101"+
-    "\1\142\1\u0100\4\142\1\u0100\1\142\1\376\1\u0102\1\142"+
-    "\1\u0100\6\142\1\u0100\36\142\1\u0102\21\142\2\0\1\u0103"+
-    "\126\0\1\337\2\0\1\u0104\67\0\4\147\6\0\1\147"+
-    "\6\0\6\147\1\0\13\147\1\0\13\147\1\0\4\147"+
-    "\1\0\11\147\2\0\1\147\2\0\1\u0105\111\0\1\151"+
-    "\11\0\1\151\6\0\1\151\66\0\4\152\6\0\1\152"+
-    "\6\0\6\152\1\0\13\152\1\0\13\152\1\0\4\152"+
-    "\1\0\11\152\2\0\1\152\1\154\2\0\1\u0106\1\154"+
-    "\1\0\4\154\1\0\1\154\1\0\2\154\1\0\6\154"+
-    "\1\0\60\154\1\u0107\1\0\10\u0107\1\u0108\2\u0107\1\u0109"+
-    "\47\u0107\1\u0109\21\u0107\1\u010a\1\0\12\u010a\1\u0108\1\u010b"+
-    "\47\u010a\1\u010b\21\u010a\1\154\1\0\1\u0105\1\u0106\1\154"+
-    "\1\0\4\154\1\0\1\154\1\0\2\154\1\0\6\154"+
-    "\1\0\60\154\1\161\3\0\23\161\6\0\1\161\13\0"+
-    "\1\161\13\0\1\161\4\0\1\161\4\0\1\161\4\0"+
-    "\2\161\4\0\1\335\16\0\1\337\2\0\1\340\63\0"+
-    "\1\u010c\104\0\1\161\3\0\2\161\4\165\6\161\1\165"+
-    "\6\161\6\166\1\161\13\166\1\161\13\166\1\161\4\166"+
-    "\1\161\4\166\1\165\4\166\2\161\1\166\6\0\4\166"+
-    "\6\0\1\166\6\0\6\166\1\0\13\166\1\0\13\166"+
-    "\1\0\4\166\1\0\11\166\2\0\1\166\6\0\4\166"+
-    "\6\0\1\166\6\0\6\166\1\0\7\166\1\u010d\3\166"+
-    "\1\0\13\166\1\0\4\166\1\0\11\166\2\0\1\166"+
-    "\3\0\1\335\4\0\2\u010e\10\0\1\337\2\0\1\340"+
-    "\1\0\6\u010e\1\0\13\u010e\1\0\13\u010e\1\0\4\u010e"+
-    "\1\0\4\u010e\1\0\4\u010e\2\0\1\u010e\6\0\4\171"+
-    "\6\0\1\171\6\0\6\171\1\0\13\171\1\0\13\171"+
-    "\1\0\4\171\1\0\11\171\2\0\1\171\1\173\2\0"+
-    "\1\u010f\1\173\1\0\4\173\1\0\1\173\1\0\2\173"+
-    "\1\0\6\173\1\0\60\173\3\0\1\335\4\0\2\u0110"+
-    "\10\0\1\337\2\0\1\340\1\0\6\u0110\1\0\13\u0110"+
-    "\1\0\13\u0110\1\0\4\u0110\1\0\4\u0110\1\0\4\u0110"+
-    "\2\0\1\u0110\1\173\1\0\1\u010c\1\u010f\1\173\1\0"+
-    "\4\173\1\0\1\173\1\0\2\173\1\0\6\173\1\0"+
-    "\60\173\1\u0111\1\0\10\u0111\1\u0112\2\u0111\1\u0113\47\u0111"+
-    "\1\u0113\21\u0111\1\u0114\1\0\12\u0114\1\u0112\1\u0115\47\u0114"+
-    "\1\u0115\21\u0114\1\173\2\0\1\u010f\1\173\1\0\4\173"+
-    "\1\0\1\173\1\0\1\173\1\u0116\1\0\6\173\1\0"+
-    "\61\173\2\0\1\u010f\1\173\1\0\4\173\1\0\1\173"+
-    "\1\0\1\173\1\u0117\1\0\6\173\1\0\60\173\3\0"+
-    "\1\335\16\0\1\337\2\0\1\u0104\130\0\1\u0118\2\0"+
-    "\1\u0118\75\0\1\u0119\14\0\1\u0119\63\0\2\u011a\52\0"+
-    "\23\u011b\1\u011c\63\u011b\6\0\4\210\6\0\1\210\6\0"+
-    "\6\210\1\0\13\210\1\0\13\210\1\0\4\210\1\0"+
-    "\11\210\2\0\1\210\53\0\1\u011d\5\0\1\u011d\116\0"+
-    "\1\u011e\10\0\1\u011e\4\0\1\213\2\0\1\u011f\1\213"+
-    "\1\0\4\213\1\0\1\213\1\0\2\213\1\0\6\213"+
-    "\1\0\60\213\1\u0120\1\0\10\u0120\1\u0121\2\u0120\1\u0122"+
-    "\47\u0120\1\u0122\21\u0120\1\u0123\1\0\1\u0123\2\u0124\1\u0123"+
-    "\4\u0124\2\u0123\1\u0125\1\u0126\1\u0123\4\u0124\1\u0123\11\u0124"+
-    "\1\u0123\27\u0124\1\u0126\10\u0124\2\u0123\4\u0124\2\u0123\1\u0124"+
-    "\1\217\2\u011b\1\u0127\1\217\1\u011b\4\217\1\u011b\1\217"+
-    "\1\u011b\2\217\1\u011b\3\217\1\u0128\2\217\1\u011b\60\217"+
-    "\1\220\2\0\1\u0129\1\220\1\0\4\220\1\0\1\220"+
-    "\1\0\2\220\1\0\6\220\1\0\60\220\12\u012a\1\u012b"+
-    "\74\u012a\14\u012c\1\u012b\72\u012c\1\224\2\u011b\1\u012d\1\224"+
-    "\1\u011b\4\224\1\u011b\1\224\1\u011b\2\224\1\u011b\3\224"+
-    "\1\u012e\2\224\1\u011b\60\224\1\225\2\0\1\u012f\1\225"+
-    "\1\0\4\225\1\0\1\225\1\0\2\225\1\0\6\225"+
-    "\1\0\60\225\1\u0130\1\0\10\u0130\1\u0131\2\u0130\1\u0132"+
-    "\47\u0130\1\u0132\21\u0130\1\u0133\1\0\1\u0133\2\u0134\1\u0133"+
-    "\4\u0134\2\u0133\1\u0135\1\u0136\1\u0133\4\u0134\1\u0133\11\u0134"+
-    "\1\u0133\27\u0134\1\u0136\10\u0134\2\u0133\4\u0134\2\u0133\1\u0134"+
-    "\2\231\1\0\106\231\1\0\17\231\1\u0137\2\231\1\u0138"+
-    "\61\231\1\234\2\0\1\u0139\1\234\1\0\4\234\1\0"+
-    "\1\234\1\0\2\234\1\0\6\234\1\0\60\234\1\u013a"+
-    "\1\0\10\u013a\1\u013b\2\u013a\1\u013c\47\u013a\1\u013c\21\u013a"+
-    "\1\u013d\1\0\1\u013d\2\u013e\1\u013d\4\u013e\2\u013d\1\u013f"+
-    "\1\u0140\1\u013d\4\u013e\1\u013d\11\u013e\1\u013d\27\u013e\1\u0140"+
-    "\10\u013e\2\u013d\4\u013e\2\u013d\1\u013e\2\240\1\0\106\240"+
-    "\1\0\17\240\1\u0141\2\240\1\u0142\61\240\7\0\1\u0143"+
-    "\77\0\1\250\1\0\12\250\1\0\1\u0144\47\250\1\u0144"+
-    "\21\250\3\0\1\u0145\16\0\1\337\2\0\1\352\61\0"+
-    "\1\250\1\0\3\250\1\252\6\250\1\0\1\u0144\1\250"+
-    "\1\252\6\250\1\252\36\250\1\u0144\37\250\1\u0146\106\250"+
-    "\1\u0147\70\250\1\256\1\0\10\256\1\0\2\256\1\u0148"+
-    "\47\256\1\u0148\22\256\1\0\3\256\1\257\4\256\1\0"+
-    "\2\256\1\u0148\1\256\1\257\6\256\1\257\36\256\1\u0148"+
-    "\37\256\1\u0149\106\256\1\u014a\70\256\12\263\1\0\1\263"+
-    "\1\0\1\u014b\67\263\1\0\13\263\1\0\1\263\1\0"+
-    "\1\u014b\4\263\1\u014c\62\263\1\0\13\263\1\0\1\263"+
-    "\1\0\1\263\1\u014d\66\263\1\u014e\1\263\14\u014f\1\u0150"+
-    "\106\u014f\1\u0150\5\u014f\1\u0151\2\u014f\1\u0152\61\u014f\12\u0153"+
-    "\1\u0154\106\u0153\1\u0154\7\u0153\1\u0155\2\u0153\1\u0156\61\u0153"+
-    "\12\301\1\0\71\301\1\u0157\1\0\13\301\1\0\7\301"+
-    "\1\u0158\61\301\1\u0157\1\0\13\301\1\u0159\74\301\14\305"+
-    "\1\0\67\305\1\u015a\1\0\15\305\1\0\5\305\1\u015b"+
-    "\61\305\1\u015a\1\0\15\305\1\u015c\72\305\12\310\1\0"+
-    "\1\310\1\0\70\310\1\0\13\310\1\0\1\310\1\0"+
-    "\5\310\1\u015d\62\310\1\0\13\310\1\0\1\310\1\0"+
-    "\1\310\1\u015e\66\310\1\0\1\310\14\u015f\1\u0160\106\u015f"+
-    "\1\u0160\5\u015f\1\u0161\2\u015f\1\u0162\61\u015f\12\u0163\1\u0164"+
-    "\106\u0163\1\u0164\7\u0163\1\u0165\2\u0163\1\u0166\61\u0163\12\326"+
-    "\1\0\71\326\1\u0167\1\0\13\326\1\0\7\326\1\u0168"+
-    "\61\326\1\u0167\1\0\13\326\1\u0169\74\326\14\332\1\0"+
-    "\67\332\1\u016a\1\0\15\332\1\0\5\332\1\u016b\61\332"+
-    "\1\u016a\1\0\15\332\1\u016c\72\332\7\0\1\u016d\11\0"+
-    "\1\u016e\3\0\1\u016f\23\0\1\u0170\44\0\1\u0171\25\0"+
-    "\1\u0172\56\0\1\341\2\0\2\u0173\5\0\1\341\6\0"+
-    "\1\341\6\u0173\1\0\13\u0173\1\0\13\u0173\1\0\4\u0173"+
-    "\1\0\4\u0173\1\0\4\u0173\2\0\1\u0173\1\u0174\1\0"+
-    "\3\u0174\1\u0175\4\342\1\u0174\1\0\3\u0174\1\u0175\1\342"+
-    "\1\u0174\1\0\3\u0174\1\u0175\6\342\1\u0174\13\342\1\u0174"+
-    "\13\342\1\u0174\4\342\1\u0176\11\342\2\u0174\1\342\20\0"+
-    "\1\u0177\7\0\1\u0178\73\0\1\345\71\0\105\346\1\u0179"+
-    "\1\346\1\u0174\1\0\3\u0174\1\u0175\4\347\1\u0174\1\0"+
-    "\3\u0174\1\u0175\1\347\1\u0174\1\0\3\u0174\1\u0175\6\347"+
-    "\1\u0174\13\347\1\u0174\13\347\1\u0174\4\347\1\u017a\11\347"+
-    "\2\u0174\1\347\105\350\1\u017b\1\350\65\0\1\351\56\0"+
-    "\1\u0172\53\0\1\u017c\106\0\1\u017d\112\0\4\112\6\0"+
-    "\1\112\6\0\4\112\2\u017e\1\0\13\112\1\0\13\112"+
-    "\1\0\4\112\1\0\11\112\2\0\1\112\6\0\4\112"+
-    "\6\0\1\112\6\0\4\112\1\u017e\1\u017f\1\0\13\112"+
-    "\1\0\13\112\1\0\4\112\1\0\11\112\2\0\1\112"+
-    "\6\0\4\112\6\0\1\112\6\0\6\112\1\0\13\112"+
-    "\1\0\2\112\1\u0180\10\112\1\0\4\112\1\0\6\112"+
-    "\1\u0180\2\112\2\0\1\112\12\364\1\365\3\364\1\0"+
-    "\70\364\14\367\1\365\1\367\1\0\70\367\1\374\1\0"+
-    "\10\374\1\376\2\374\1\u0181\47\374\1\u0181\21\374\1\141"+
-    "\2\374\1\375\1\141\1\374\4\141\1\376\1\141\1\374"+
-    "\1\141\1\137\1\374\6\141\1\374\60\141\1\u0100\1\0"+
-    "\12\u0100\1\376\1\u0182\47\u0100\1\u0182\21\u0100\1\142\2\u0100"+
-    "\1\u0101\1\142\1\u0100\4\142\1\u0100\1\142\1\376\1\142"+
-    "\1\137\1\u0100\6\142\1\u0100\60\142\12\u0107\1\u0108\3\u0107"+
-    "\1\0\70\u0107\14\u010a\1\u0108\1\u010a\1\0\70\u010a\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\6\166\1\u0183\2\166\2\0"+
-    "\1\166\6\0\4\u010e\6\0\1\u010e\6\0\6\u010e\1\0"+
-    "\13\u010e\1\0\13\u010e\1\0\4\u010e\1\0\11\u010e\2\0"+
-    "\1\u010e\6\0\4\u0110\6\0\1\u0110\6\0\6\u0110\1\0"+
-    "\13\u0110\1\0\13\u0110\1\0\4\u0110\1\0\11\u0110\2\0"+
-    "\1\u0110\12\u0111\1\u0112\3\u0111\1\0\70\u0111\14\u0114\1\u0112"+
-    "\1\u0114\1\0\70\u0114\1\u0184\2\u0185\1\u0186\1\u0184\1\u0185"+
-    "\4\u0184\1\u0185\1\u0184\1\u0185\2\u0184\1\u0185\6\u0184\1\u0185"+
-    "\56\u0184\1\173\1\u0184\1\u0187\2\u0188\1\u0189\1\u0187\1\u0188"+
-    "\4\u0187\1\u0188\1\u0187\1\u0188\2\u0187\1\u0188\6\u0187\1\u0188"+
-    "\56\u0187\1\173\1\u0187\36\0\1\u018a\35\0\1\u018a\53\0"+
-    "\1\u018b\14\0\1\u018b\73\0\1\u018c\11\0\1\u018c\76\0"+
-    "\1\u018d\20\0\1\u018d\113\0\1\u018e\7\0\1\u018e\3\0"+
-    "\12\u0120\1\u0121\3\u0120\1\0\70\u0120\1\u0123\1\0\12\u0123"+
-    "\1\u0121\1\u018f\47\u0123\1\u018f\22\u0123\1\0\12\u0123\1\u0190"+
-    "\1\u018f\47\u0123\1\u018f\21\u0123\14\0\1\u0191\72\0\14\u0123"+
-    "\1\u0190\1\u0123\1\0\70\u0123\12\u0130\1\u0131\3\u0130\1\0"+
-    "\70\u0130\1\u0133\1\0\12\u0133\1\u0131\1\u0192\47\u0133\1\u0192"+
-    "\22\u0133\1\0\12\u0133\1\u0193\1\u0192\47\u0133\1\u0192\21\u0133"+
-    "\14\0\1\u0194\72\0\14\u0133\1\u0193\1\u0133\1\0\70\u0133"+
-    "\2\231\1\0\4\231\1\u0195\11\231\1\u0196\3\231\1\u0197"+
-    "\23\231\1\u0198\37\231\1\0\32\231\1\u0199\51\231\12\u013a"+
-    "\1\u013b\3\u013a\1\0\70\u013a\1\u013d\1\0\12\u013d\1\u013b"+
-    "\1\u019a\47\u013d\1\u019a\22\u013d\1\0\12\u013d\1\u019b\1\u019a"+
-    "\47\u013d\1\u019a\21\u013d\14\0\1\u019c\72\0\14\u013d\1\u019b"+
-    "\1\u013d\1\0\70\u013d\2\240\1\0\4\240\1\u019d\11\240"+
-    "\1\u019e\3\240\1\u019f\23\240\1\u01a0\37\240\1\0\32\240"+
-    "\1\u01a1\51\240\22\0\1\u01a2\64\0\16\250\1\0\70\250"+
-    "\16\256\1\0\70\256\12\263\1\0\1\263\1\0\1\263"+
-    "\1\u01a3\66\263\1\u014e\10\263\1\u01a4\2\263\1\0\1\263"+
-    "\1\0\1\u014b\3\263\1\u01a5\3\263\1\u01a6\23\263\1\u01a7"+
-    "\33\263\1\0\1\263\12\u01a3\1\0\1\u01a3\1\0\70\u01a3"+
-    "\1\0\1\u01a3\12\u014e\1\0\1\u014e\1\0\1\u01a8\67\u014e"+
-    "\1\0\1\u014e\7\u014f\1\u01a9\4\u014f\1\u0150\4\u014f\1\u01aa"+
-    "\3\u014f\1\u01ab\23\u014f\1\u01ac\51\u014f\1\u0150\20\u014f\1\u01ad"+
-    "\51\u014f\7\u0153\1\u01ae\2\u0153\1\u0154\6\u0153\1\u01af\3\u0153"+
-    "\1\u01b0\23\u0153\1\u01b1\47\u0153\1\u0154\22\u0153\1\u01b2\51\u0153"+
-    "\12\301\1\0\103\301\1\u01b3\2\301\1\0\6\301\1\u01b4"+
-    "\3\301\1\u01b5\23\301\1\u01b6\32\301\1\u0157\1\0\1\301"+
-    "\104\u01b7\1\u01b8\2\u01b7\14\305\1\0\101\305\1\u01b9\4\305"+
-    "\1\0\4\305\1\u01ba\3\305\1\u01bb\23\305\1\u01bc\32\305"+
-    "\1\u015a\1\0\1\305\104\u01bd\1\u01be\2\u01bd\7\310\1\u01bf"+
-    "\2\310\1\0\1\310\1\0\4\310\1\u01c0\3\310\1\u01c1"+
-    "\23\310\1\u01c2\33\310\1\0\1\310\7\u015f\1\u01c3\4\u015f"+
-    "\1\u0160\4\u015f\1\u01c4\3\u015f\1\u01c5\23\u015f\1\u01c6\51\u015f"+
-    "\1\u0160\20\u015f\1\u01c7\51\u015f\7\u0163\1\u01c8\2\u0163\1\u0164"+
-    "\6\u0163\1\u01c9\3\u0163\1\u01ca\23\u0163\1\u01cb\47\u0163\1\u0164"+
-    "\22\u0163\1\u01cc\51\u0163\12\326\1\0\103\326\1\u01cd\2\326"+
-    "\1\0\6\326\1\u01ce\3\326\1\u01cf\23\326\1\u01d0\32\326"+
-    "\1\u0167\1\0\1\326\104\u01d1\1\u01d2\2\u01d1\14\332\1\0"+
-    "\101\332\1\u01d3\4\332\1\0\4\332\1\u01d4\3\332\1\u01d5"+
-    "\23\332\1\u01d6\32\332\1\u016a\1\0\1\332\104\u01d7\1\u01d8"+
-    "\2\u01d7\7\0\1\u01d9\106\0\1\u01da\135\0\1\u01db\50\0"+
-    "\1\u0173\1\0\11\u0173\1\0\6\u0173\1\0\64\u0173\1\u0174"+
-    "\1\0\11\u0174\1\0\6\u0174\1\0\47\u0174\1\0\15\u0174"+
-    "\1\0\3\u0174\1\u0175\5\u0174\1\0\3\u0174\1\u0175\2\u0174"+
-    "\1\0\3\u0174\1\u0175\43\u0174\1\u01dc\14\u0174\20\0\1\u0177"+
-    "\51\0\1\u01dd\34\0\1\u01de\15\0\3\u01de\2\0\1\u01de"+
-    "\11\0\1\u01de\1\0\2\u01de\7\0\1\u01de\2\0\2\u01de"+
-    "\6\0\1\u01de\11\0\1\112\1\u01df\2\112\6\0\1\112"+
-    "\6\0\6\112\1\0\13\112\1\0\13\112\1\0\4\112"+
-    "\1\0\11\112\2\0\1\112\6\0\4\112\6\0\1\112"+
-    "\6\0\6\112\1\0\11\112\1\u01e0\1\112\1\0\1\u01e0"+
-    "\12\112\1\0\4\112\1\0\11\112\2\0\1\112\12\374"+
-    "\1\376\3\374\1\0\70\374\14\u0100\1\376\1\u0100\1\0"+
-    "\70\u0100\6\0\3\166\1\u01e1\6\0\1\166\6\0\6\166"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\1\u0184\2\u0185\1\u0186\1\u0184\1\u0185\4\u0184"+
-    "\1\u0185\1\u0184\1\u0185\2\u0184\1\u0185\6\u0184\1\u0185\56\u0184"+
-    "\1\u01e2\1\u0184\105\u0185\1\u01e3\1\u0185\1\u0187\2\u0188\1\u0189"+
-    "\1\u0187\1\u0188\4\u0187\1\u0188\1\u0187\1\u0188\2\u0187\1\u0188"+
-    "\6\u0187\1\u0188\56\u0187\1\u01e2\1\u0187\105\u0188\1\u01e4\1\u0188"+
-    "\41\0\1\u01e5\14\0\1\u01e5\63\0\2\u01e6\103\0\2\u01e7"+
-    "\115\0\1\u01e8\14\0\1\u01e8\63\0\2\u01e9\52\0\14\u0123"+
-    "\1\u0121\1\u0123\1\0\70\u0123\3\0\2\u01ea\1\0\4\u01ea"+
-    "\2\0\1\u0125\1\u01ea\1\0\4\u01ea\1\0\11\u01ea\1\0"+
-    "\40\u01ea\2\0\4\u01ea\2\0\1\u01ea\14\u0133\1\u0131\1\u0133"+
-    "\1\0\70\u0133\3\0\2\u01eb\1\0\4\u01eb\2\0\1\u0135"+
-    "\1\u01eb\1\0\4\u01eb\1\0\11\u01eb\1\0\40\u01eb\2\0"+
-    "\4\u01eb\2\0\1\u01eb\2\231\1\0\4\231\1\u01ec\101\231"+
-    "\1\0\33\231\1\u01ed\50\231\14\u013d\1\u013b\1\u013d\1\0"+
-    "\70\u013d\3\0\2\u01ee\1\0\4\u01ee\2\0\1\u013f\1\u01ee"+
-    "\1\0\4\u01ee\1\0\11\u01ee\1\0\40\u01ee\2\0\4\u01ee"+
-    "\2\0\1\u01ee\2\240\1\0\4\240\1\u01ef\101\240\1\0"+
-    "\33\240\1\u01f0\50\240\2\0\1\u01f1\104\0\7\263\1\u01f2"+
-    "\2\263\1\0\1\263\1\0\1\u014b\67\263\1\0\1\263"+
-    "\12\u014e\1\0\1\u014e\1\0\1\u014e\1\0\70\u014e\7\u014f"+
-    "\1\u01f3\4\u014f\1\u0150\106\u014f\1\u0150\21\u014f\1\u01f4\50\u014f"+
-    "\7\u0153\1\u01f5\2\u0153\1\u0154\106\u0153\1\u0154\23\u0153\1\u01f6"+
-    "\50\u0153\7\301\1\u01f7\2\301\1\0\71\301\1\u0157\1\0"+
-    "\1\301\12\u01f8\1\u01f9\72\u01f8\1\0\1\u01f8\7\305\1\u01fa"+
-    "\4\305\1\0\67\305\1\u015a\1\0\1\305\14\u01fb\1\u01f9"+
-    "\70\u01fb\1\0\1\u01fb\7\310\1\u01fc\2\310\1\0\1\310"+
-    "\1\0\70\310\1\0\1\310\7\u015f\1\u01fd\4\u015f\1\u0160"+
-    "\106\u015f\1\u0160\21\u015f\1\u01fe\50\u015f\7\u0163\1\u01ff\2\u0163"+
-    "\1\u0164\106\u0163\1\u0164\23\u0163\1\u0200\50\u0163\7\326\1\u0201"+
-    "\2\326\1\0\71\326\1\u0167\1\0\1\326\12\u0202\1\u0203"+
-    "\72\u0202\1\0\1\u0202\7\332\1\u0204\4\332\1\0\67\332"+
-    "\1\u016a\1\0\1\332\14\u0205\1\u0203\70\u0205\1\0\1\u0205"+
-    "\37\0\1\u0206\141\0\1\u01dc\34\0\1\u01de\15\0\3\u01de"+
-    "\2\0\1\u01de\11\0\1\u01de\1\0\2\u01de\7\0\1\u01de"+
-    "\1\0\1\u01dd\2\u01de\6\0\1\u01de\11\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\7\112\1\u0207\3\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\112\6\0\1\112\6\0\6\112\1\0\6\112\1\u0208"+
-    "\4\112\1\0\13\112\1\0\1\112\1\u0208\2\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u0209\4\166\1\0\6\166\1\u020a"+
-    "\4\166\1\0\4\166\1\0\11\166\2\0\1\166\53\0"+
-    "\1\u020b\5\0\1\u020b\73\0\1\u020c\14\0\1\u020c\66\0"+
-    "\1\u020d\11\0\1\u020d\74\0\1\u020e\11\0\1\u020e\77\0"+
-    "\1\u020f\14\0\1\u020f\23\0\2\231\1\0\34\231\1\u0210"+
-    "\47\231\2\240\1\0\34\240\1\u0211\47\240\14\u014f\1\u0150"+
-    "\22\u014f\1\u0212\47\u014f\12\u0153\1\u0154\24\u0153\1\u0213\47\u0153"+
-    "\12\u01f8\1\u01b7\71\u01f8\1\u0214\1\u01b7\1\u01f8\14\u01fb\1\u01bd"+
-    "\67\u01fb\1\u0215\1\u01bd\1\u01fb\14\u015f\1\u0160\22\u015f\1\u0216"+
-    "\47\u015f\12\u0163\1\u0164\24\u0163\1\u0217\47\u0163\12\u0202\1\u01d1"+
-    "\71\u0202\1\u0218\1\u01d1\1\u0202\14\u0205\1\u01d7\67\u0205\1\u0219"+
-    "\1\u01d7\1\u0205\40\0\1\u021a\54\0\4\112\6\0\1\112"+
-    "\6\0\6\112\1\0\13\112\1\0\4\112\1\u021b\6\112"+
-    "\1\0\4\112\1\0\11\112\2\0\1\112\6\0\4\112"+
-    "\6\0\1\112\6\0\6\112\1\0\3\112\1\u021c\7\112"+
-    "\1\0\4\112\1\u021c\6\112\1\0\4\112\1\0\11\112"+
-    "\2\0\1\112\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\11\166\1\u021d\1\166\1\0\13\166\1\0\4\166"+
-    "\1\0\11\166\2\0\1\166\6\0\4\166\6\0\1\166"+
-    "\6\0\6\166\1\0\10\166\1\u021e\2\166\1\0\13\166"+
-    "\1\0\4\166\1\0\11\166\2\0\1\166\54\0\1\u021f"+
-    "\24\0\1\u021f\52\0\1\u0220\20\0\1\u0220\70\0\1\u0221"+
-    "\13\0\1\u0221\53\0\2\u0222\112\0\1\u0223\35\0\1\u0223"+
-    "\12\0\2\231\1\0\35\231\1\u0224\46\231\2\240\1\0"+
-    "\35\240\1\u0225\46\240\14\u014f\1\u0150\23\u014f\1\u0226\46\u014f"+
-    "\12\u0153\1\u0154\25\u0153\1\u0227\46\u0153\12\u01f8\1\u0228\71\u01f8"+
-    "\1\u0214\1\u01b7\1\u01f8\14\u01fb\1\u0229\67\u01fb\1\u0215\1\u01bd"+
-    "\1\u01fb\14\u015f\1\u0160\23\u015f\1\u022a\46\u015f\12\u0163\1\u0164"+
-    "\25\u0163\1\u022b\46\u0163\12\u0202\1\u022c\71\u0202\1\u0218\1\u01d1"+
-    "\1\u0202\14\u0205\1\u022d\67\u0205\1\u0219\1\u01d7\1\u0205\41\0"+
-    "\1\u022e\53\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\13\112\1\0\7\112\1\u022f\3\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\11\166\1\u0230\1\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\6\166\1\u0231\4\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\43\0"+
-    "\1\u0232\11\0\1\u0232\72\0\1\u0233\14\0\1\u0233\71\0"+
-    "\1\u0234\14\0\1\u0234\30\0\2\231\1\0\36\231\1\u0235"+
-    "\45\231\2\240\1\0\36\240\1\u0236\45\240\14\u014f\1\u0150"+
-    "\24\u014f\1\u0237\45\u014f\12\u0153\1\u0154\26\u0153\1\u0238\45\u0153"+
-    "\14\u015f\1\u0160\24\u015f\1\u0239\45\u015f\12\u0163\1\u0164\26\u0163"+
-    "\1\u023a\45\u0163\40\0\1\u023b\54\0\4\112\6\0\1\112"+
-    "\6\0\5\112\1\u023c\1\0\13\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u023d"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\5\166\1\u023e"+
-    "\5\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\2\231\1\0\35\231\1\u023f\46\231\2\240\1\0"+
-    "\35\240\1\u0240\46\240\14\u014f\1\u0150\23\u014f\1\u0241\46\u014f"+
-    "\12\u0153\1\u0154\25\u0153\1\u0242\46\u0153\14\u015f\1\u0160\23\u015f"+
-    "\1\u0243\46\u015f\12\u0163\1\u0164\25\u0163\1\u0244\46\u0163\35\0"+
-    "\1\u0245\57\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\5\112\1\u0246\5\112\1\0\13\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\1\166\1\u0247\7\166\2\0\1\166\2\231\1\0\32\231"+
-    "\1\u0248\51\231\2\240\1\0\32\240\1\u0249\51\240\14\u014f"+
-    "\1\u0150\20\u014f\1\u024a\51\u014f\12\u0153\1\u0154\22\u0153\1\u024b"+
-    "\51\u0153\14\u015f\1\u0160\20\u015f\1\u024c\51\u015f\12\u0163\1\u0164"+
-    "\22\u0163\1\u024d\51\u0163\6\0\4\112\6\0\1\112\6\0"+
-    "\6\112\1\0\7\112\1\u024e\3\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u024f"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\112\6\0\1\112\6\0\6\112\1\0\13\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\u0250\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\10\166\1\u0251"+
-    "\2\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\5\112\1\u0252\5\112\1\0\13\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\4\166\1\u0253\6\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\5\112\1\u0254\5\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\5\166\1\u0255"+
-    "\5\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\13\112\1\0\4\112\1\u0256\6\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\u0257\4\u0258\6\u0257\1\u0258\5\u0257"+
-    "\1\0\6\u0258\1\u0257\13\u0258\1\u0257\13\u0258\1\u0257\4\u0258"+
-    "\1\u0257\11\u0258\2\u0257\1\u0258\42\0\1\u0259\3\0\1\u025a"+
-    "\7\0\1\u025b\1\u025c\21\0\1\u025d\13\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\4\166\1\u025e\3\166\1\u025f"+
-    "\2\166\1\0\4\166\1\u0260\1\u0261\5\166\1\0\4\166"+
-    "\1\0\6\166\1\u0262\2\166\2\0\1\166\57\0\1\u0263"+
-    "\77\0\1\u0264\115\0\1\u0265\105\0\1\u0266\107\0\1\u0267"+
-    "\35\0\4\166\6\0\1\166\6\0\6\166\1\0\13\166"+
-    "\1\0\5\166\1\u0268\5\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\12\166\1\u0269\1\0\13\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\5\166\1\u026a\5\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u026b"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\5\166\1\u026c\5\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\44\0\1\u026d\136\0\1\u026e\107\0\1\u026f\67\0"+
-    "\1\u0270\125\0\1\u0271\17\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u0272\4\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\13\166\1\0"+
-    "\4\166\1\0\1\166\1\u0273\7\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\2\166\1\u0274\6\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\4\166\1\u0275\6\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\2\166\1\u0276\6\166\2\0\1\166\46\0\1\u0277\74\0"+
-    "\1\u0278\106\0\1\u0279\116\0\1\u027a\105\0\1\u027b\51\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\10\166\1\u027c"+
-    "\2\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\5\166\1\u027d"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\5\166"+
-    "\1\u027e\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u027f\4\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\5\166\1\u0280\5\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\57\0"+
-    "\1\u0281\131\0\1\u0282\52\0\1\u0283\106\0\1\u0284\46\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\5\166\1\u0285\5\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\7\166\1\u0286"+
-    "\1\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\10\166\1\u0287\2\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\10\166\1\u0288\2\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\103\0"+
-    "\1\u0289\63\0\1\u0271\131\0\1\u027b\106\0\1\u028a\11\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\10\166\1\u028b\2\0\1\166"+
-    "\6\0\4\166\6\0\1\166\6\0\6\166\1\0\13\166"+
-    "\1\0\6\166\1\u0276\4\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\10\166"+
-    "\1\u0280\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\10\166\1\u028c\2\0\1\166\34\0\1\u0271\154\0\1\u028d"+
-    "\12\0\4\166\6\0\1\166\6\0\5\166\1\u0276\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\7\166\1\u028e"+
-    "\1\166\2\0\1\166\56\0\1\u0271\36\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u0276"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166";
+    "\1\72\1\73\11\72\1\74\1\72\1\75\1\72\1\76"+
+    "\3\72\1\77\42\72\1\100\20\72\1\101\1\102\105\101"+
+    "\1\103\1\104\22\103\1\105\2\103\1\106\57\103\1\107"+
+    "\1\110\105\107\1\103\1\104\5\103\1\111\17\103\1\106"+
+    "\60\103\1\104\2\103\1\112\1\113\2\103\2\114\6\103"+
+    "\1\113\6\103\1\113\1\115\1\116\4\114\1\103\10\114"+
+    "\1\117\2\114\1\103\11\114\1\117\1\114\1\103\4\114"+
+    "\1\103\4\114\1\103\4\114\1\103\1\114\1\103\1\104"+
+    "\2\103\1\112\1\120\12\103\1\120\6\103\1\120\57\103"+
+    "\1\121\1\122\2\121\1\123\22\121\1\106\57\121\1\103"+
+    "\1\104\2\103\1\124\1\113\2\103\2\125\6\103\1\113"+
+    "\6\103\1\113\6\125\1\103\13\125\1\103\13\125\1\103"+
+    "\4\125\1\103\4\125\1\103\4\125\1\103\1\125\1\103"+
+    "\1\104\2\103\1\124\1\113\2\103\2\125\6\103\1\113"+
+    "\6\103\1\113\6\125\1\103\13\125\1\126\13\125\1\103"+
+    "\4\125\1\103\4\125\1\103\4\125\1\103\1\125\1\127"+
+    "\1\104\1\103\1\130\1\131\1\113\4\127\1\132\1\127"+
+    "\1\133\3\127\1\113\6\127\1\113\57\127\1\103\1\104"+
+    "\2\103\1\134\22\103\1\106\60\103\1\104\1\135\1\136"+
+    "\1\103\1\113\2\103\2\137\6\103\1\113\6\103\1\113"+
+    "\6\137\1\103\13\137\1\103\13\137\1\103\4\137\1\103"+
+    "\4\137\1\103\4\137\1\103\1\137\1\103\1\104\1\135"+
+    "\1\136\1\103\1\113\2\103\2\137\6\103\1\113\6\103"+
+    "\1\113\6\137\1\103\13\137\1\140\13\137\1\103\4\137"+
+    "\1\103\4\137\1\103\4\137\1\103\1\137\1\141\1\104"+
+    "\1\135\1\142\1\141\1\113\4\141\1\143\1\141\1\144"+
+    "\3\141\1\113\6\141\1\113\57\141\1\103\1\104\3\103"+
+    "\1\113\12\103\1\113\6\103\1\113\57\103\1\145\1\146"+
+    "\21\145\1\147\63\145\1\103\1\150\3\103\1\113\2\103"+
+    "\2\151\6\103\1\113\2\103\1\152\3\103\1\113\6\151"+
+    "\1\103\13\151\1\103\13\151\1\103\4\151\1\103\4\151"+
+    "\1\103\4\151\1\103\1\151\1\103\1\150\3\103\1\153"+
+    "\12\103\1\153\2\103\1\152\3\103\1\153\60\103\1\150"+
+    "\3\103\1\113\2\103\2\154\6\103\1\113\2\103\1\152"+
+    "\3\103\1\113\6\154\1\103\13\154\1\103\13\154\1\103"+
+    "\4\154\1\103\4\154\1\103\4\154\1\103\1\154\1\103"+
+    "\1\150\3\103\1\113\2\103\2\154\6\103\1\113\2\103"+
+    "\1\152\3\103\1\113\6\154\1\103\13\154\1\155\13\154"+
+    "\1\103\4\154\1\103\4\154\1\103\4\154\1\103\1\154"+
+    "\1\156\1\150\1\103\1\157\1\156\1\113\4\156\1\160"+
+    "\1\156\1\161\3\156\1\113\2\156\1\162\3\156\1\113"+
+    "\57\156\1\163\1\164\1\165\1\166\4\163\2\167\16\163"+
+    "\6\170\1\163\13\170\1\163\13\170\1\163\4\170\1\163"+
+    "\4\170\1\163\1\171\3\170\1\163\1\170\1\103\1\172"+
+    "\1\165\1\166\1\103\1\113\2\103\2\173\6\103\1\113"+
+    "\6\103\1\113\6\173\1\103\13\173\1\103\13\173\1\103"+
+    "\4\173\1\103\4\173\1\103\4\173\1\103\1\173\1\103"+
+    "\1\172\1\165\1\166\1\103\1\113\2\103\2\173\6\103"+
+    "\1\113\6\103\1\113\6\173\1\103\13\173\1\174\13\173"+
+    "\1\103\4\173\1\103\4\173\1\103\4\173\1\103\1\173"+
+    "\1\175\1\176\1\165\1\177\1\175\1\113\4\175\1\200"+
+    "\1\175\1\201\1\202\2\175\1\113\6\175\1\113\36\175"+
+    "\1\203\20\175\1\103\1\204\1\205\2\103\1\113\12\103"+
+    "\1\113\6\103\1\113\10\103\1\206\1\207\2\103\1\210"+
+    "\11\103\1\210\1\103\1\207\1\206\26\103\1\104\1\205"+
+    "\2\103\1\113\12\103\1\113\6\103\1\113\6\103\1\211"+
+    "\51\103\1\104\1\205\2\103\1\113\2\103\2\212\6\103"+
+    "\1\113\6\103\1\113\6\212\1\211\13\212\1\103\13\212"+
+    "\1\103\4\212\1\103\4\212\1\103\4\212\1\103\1\212"+
+    "\1\103\1\104\1\205\2\103\1\113\12\103\1\113\6\103"+
+    "\1\113\6\103\1\211\7\103\1\213\6\103\1\214\11\103"+
+    "\1\213\12\103\1\214\4\103\1\215\1\104\1\205\1\216"+
+    "\1\215\1\113\4\215\1\217\1\215\1\220\3\215\1\113"+
+    "\6\215\1\113\6\215\1\221\50\215\1\222\1\104\1\205"+
+    "\1\223\1\222\1\113\4\222\1\224\1\222\1\225\3\222"+
+    "\1\113\6\222\1\113\6\222\1\226\50\222\1\227\1\104"+
+    "\1\205\1\230\1\227\1\113\4\227\1\231\1\227\1\232"+
+    "\3\227\1\113\6\227\1\113\57\227\1\233\1\234\1\235"+
+    "\104\233\1\236\1\104\1\205\1\237\1\236\1\113\4\236"+
+    "\1\240\1\236\1\241\3\236\1\113\6\236\1\113\57\236"+
+    "\1\242\1\243\1\244\104\242\1\245\1\246\105\245\1\103"+
+    "\1\104\25\103\1\106\57\103\1\247\1\250\105\247\1\103"+
+    "\1\104\5\103\1\251\17\103\1\106\57\103\1\252\1\253"+
+    "\1\165\1\254\1\252\1\113\4\252\1\255\1\252\1\256"+
+    "\1\257\2\252\1\113\6\252\1\113\36\252\1\260\20\252"+
+    "\1\261\1\262\3\261\1\263\6\261\1\264\1\265\2\261"+
+    "\1\263\6\261\1\263\36\261\1\266\20\261\1\267\1\262"+
+    "\3\267\1\270\4\267\1\271\2\267\1\272\2\267\1\270"+
+    "\6\267\1\270\36\267\1\273\20\267\1\274\1\275\10\274"+
+    "\1\276\1\274\1\277\1\300\67\274\1\301\1\274\1\302"+
+    "\1\303\12\302\1\304\12\302\1\305\57\302\1\306\1\307"+
+    "\10\306\1\310\14\306\1\311\57\306\1\103\1\104\12\103"+
+    "\1\304\12\103\1\106\60\103\1\104\10\103\1\310\14\103"+
+    "\1\106\57\103\1\312\1\313\10\312\1\314\4\312\1\315"+
+    "\65\312\1\316\1\312\1\317\1\320\12\317\1\264\2\317"+
+    "\1\321\65\317\1\316\1\317\1\322\1\323\10\322\1\324"+
+    "\1\322\1\325\51\322\1\326\16\322\1\327\1\322\1\330"+
+    "\1\331\12\330\1\332\12\330\1\333\57\330\1\334\1\335"+
+    "\10\334\1\336\14\334\1\337\57\334\1\103\1\104\12\103"+
+    "\1\332\12\103\1\106\60\103\1\104\10\103\1\336\14\103"+
+    "\1\106\57\103\1\340\1\341\10\340\1\314\4\340\1\342"+
+    "\65\340\1\343\1\340\1\344\1\345\12\344\1\264\2\344"+
+    "\1\346\65\344\1\343\1\344\1\72\1\0\11\72\1\0"+
+    "\1\72\1\0\5\72\1\0\42\72\1\0\20\72\3\0"+
+    "\1\347\1\350\16\0\1\351\2\0\1\352\65\0\1\353"+
+    "\2\0\2\354\6\0\1\353\6\0\1\353\6\354\1\0"+
+    "\13\354\1\0\13\354\1\355\4\354\1\0\4\354\1\0"+
+    "\4\354\1\0\1\354\1\72\1\0\11\72\1\0\1\72"+
+    "\1\356\1\357\4\72\1\0\64\72\1\0\11\72\1\0"+
+    "\1\72\1\360\5\72\1\0\42\72\1\360\20\72\5\0"+
+    "\1\353\2\0\2\361\6\0\1\353\6\0\1\353\6\361"+
+    "\1\0\13\361\1\0\13\361\1\0\4\361\1\0\4\361"+
+    "\1\0\4\361\1\0\1\361\1\72\1\0\11\72\1\0"+
+    "\2\72\1\362\4\72\1\0\42\72\1\363\20\72\132\0"+
+    "\1\351\2\0\1\364\104\0\1\365\71\0\1\366\101\0"+
+    "\1\367\111\0\1\113\12\0\1\113\6\0\1\113\65\0"+
+    "\4\114\7\0\1\114\6\0\6\114\1\0\13\114\1\0"+
+    "\13\114\1\0\4\114\1\0\11\114\1\0\1\114\6\0"+
+    "\4\114\7\0\1\114\6\0\2\114\2\370\2\114\1\0"+
+    "\13\114\1\0\13\114\1\0\4\114\1\0\11\114\1\0"+
+    "\1\114\6\0\4\114\7\0\1\114\6\0\2\114\1\370"+
+    "\1\371\2\114\1\0\13\114\1\0\13\114\1\0\4\114"+
+    "\1\0\11\114\1\0\1\114\6\0\4\114\7\0\1\114"+
+    "\6\0\2\114\2\372\2\114\1\0\13\114\1\0\13\114"+
+    "\1\0\4\114\1\0\11\114\1\0\1\114\5\0\1\120"+
+    "\12\0\1\120\6\0\1\120\61\0\1\373\106\0\1\374"+
+    "\112\0\4\125\7\0\1\125\6\0\6\125\1\0\13\125"+
+    "\1\0\13\125\1\0\4\125\1\0\11\125\1\0\1\125"+
+    "\1\127\2\0\1\375\1\127\1\0\4\127\1\0\1\127"+
+    "\1\0\3\127\1\0\6\127\1\0\60\127\1\0\1\374"+
+    "\1\375\1\127\1\0\4\127\1\0\1\127\1\0\3\127"+
+    "\1\0\6\127\1\0\57\127\1\376\1\0\10\376\1\377"+
+    "\2\376\1\u0100\1\376\1\u0101\46\376\1\u0100\20\376\1\u0102"+
+    "\1\0\12\u0102\1\377\1\u0103\1\u0102\1\u0104\46\u0102\1\u0103"+
+    "\20\u0102\2\0\1\135\1\u0105\111\0\4\137\7\0\1\137"+
+    "\6\0\6\137\1\0\13\137\1\0\13\137\1\0\4\137"+
+    "\1\0\11\137\1\0\1\137\1\141\2\0\1\u0106\1\141"+
+    "\1\0\4\141\1\0\1\141\1\0\3\141\1\0\6\141"+
+    "\1\0\60\141\1\0\1\135\1\u0107\1\141\1\0\4\141"+
+    "\1\0\1\141\1\0\3\141\1\0\6\141\1\0\57\141"+
+    "\1\143\1\0\1\u0108\1\u0109\1\143\1\u0108\4\143\1\u010a"+
+    "\1\143\1\u0108\1\u010b\1\143\1\u010c\1\u0108\6\143\1\u0108"+
+    "\36\143\1\u010b\20\143\1\144\1\0\1\u010d\1\u010e\1\144"+
+    "\1\u010d\4\144\1\u010d\1\144\1\u010a\1\u010f\1\144\1\u0110"+
+    "\1\u010d\6\144\1\u010d\36\144\1\u010f\20\144\2\0\1\u0111"+
+    "\127\0\1\351\2\0\1\u0112\66\0\4\151\7\0\1\151"+
+    "\6\0\6\151\1\0\13\151\1\0\13\151\1\0\4\151"+
+    "\1\0\11\151\1\0\1\151\2\0\1\u0113\111\0\1\153"+
+    "\12\0\1\153\6\0\1\153\65\0\4\154\7\0\1\154"+
+    "\6\0\6\154\1\0\13\154\1\0\13\154\1\0\4\154"+
+    "\1\0\11\154\1\0\1\154\1\156\2\0\1\u0114\1\156"+
+    "\1\0\4\156\1\0\1\156\1\0\3\156\1\0\6\156"+
+    "\1\0\57\156\1\u0115\1\0\10\u0115\1\u0116\2\u0115\1\u0117"+
+    "\1\u0115\1\u0118\46\u0115\1\u0117\20\u0115\1\u0119\1\0\12\u0119"+
+    "\1\u0116\1\u011a\1\u0119\1\u011b\46\u0119\1\u011a\20\u0119\1\156"+
+    "\1\0\1\u0113\1\u0114\1\156\1\0\4\156\1\0\1\156"+
+    "\1\0\3\156\1\0\6\156\1\0\57\156\1\163\3\0"+
+    "\24\163\6\0\1\163\13\0\1\163\13\0\1\163\4\0"+
+    "\1\163\4\0\1\163\4\0\1\163\4\0\1\347\17\0"+
+    "\1\351\2\0\1\352\62\0\1\u011c\104\0\1\163\3\0"+
+    "\2\163\4\167\7\163\1\167\6\163\6\170\1\163\13\170"+
+    "\1\163\13\170\1\163\4\170\1\163\4\170\1\167\4\170"+
+    "\1\163\1\170\6\0\4\170\7\0\1\170\6\0\6\170"+
+    "\1\0\13\170\1\0\13\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\6\0\4\170\7\0\1\170\6\0\6\170"+
+    "\1\0\7\170\1\u011d\3\170\1\0\13\170\1\0\4\170"+
+    "\1\0\11\170\1\0\1\170\3\0\1\347\4\0\2\u011e"+
+    "\11\0\1\351\2\0\1\352\1\0\6\u011e\1\0\13\u011e"+
+    "\1\0\13\u011e\1\0\4\u011e\1\0\4\u011e\1\0\4\u011e"+
+    "\1\0\1\u011e\6\0\4\173\7\0\1\173\6\0\6\173"+
+    "\1\0\13\173\1\0\13\173\1\0\4\173\1\0\11\173"+
+    "\1\0\1\173\1\175\2\0\1\u011f\1\175\1\0\4\175"+
+    "\1\0\1\175\1\0\3\175\1\0\6\175\1\0\57\175"+
+    "\3\0\1\347\4\0\2\u0120\11\0\1\351\2\0\1\352"+
+    "\1\0\6\u0120\1\0\13\u0120\1\0\13\u0120\1\0\4\u0120"+
+    "\1\0\4\u0120\1\0\4\u0120\1\0\1\u0120\1\175\1\0"+
+    "\1\u011c\1\u011f\1\175\1\0\4\175\1\0\1\175\1\0"+
+    "\3\175\1\0\6\175\1\0\57\175\1\u0121\1\0\10\u0121"+
+    "\1\u0122\2\u0121\1\u0123\1\u0121\1\u0124\46\u0121\1\u0123\20\u0121"+
+    "\1\u0125\1\0\12\u0125\1\u0122\1\u0126\1\u0125\1\u0127\46\u0125"+
+    "\1\u0126\20\u0125\1\175\2\0\1\u011f\1\175\1\0\4\175"+
+    "\1\0\1\175\1\0\1\175\1\u0128\1\175\1\0\6\175"+
+    "\1\0\60\175\2\0\1\u011f\1\175\1\0\4\175\1\0"+
+    "\1\175\1\0\1\175\1\u0129\1\175\1\0\6\175\1\0"+
+    "\57\175\3\0\1\347\17\0\1\351\2\0\1\u0112\130\0"+
+    "\1\u012a\2\0\1\u012a\75\0\1\u012b\14\0\1\u012b\63\0"+
+    "\2\u012c\51\0\24\u012d\1\u012e\62\u012d\6\0\4\212\7\0"+
+    "\1\212\6\0\6\212\1\0\13\212\1\0\13\212\1\0"+
+    "\4\212\1\0\11\212\1\0\1\212\54\0\1\u012f\5\0"+
+    "\1\u012f\116\0\1\u0130\10\0\1\u0130\3\0\1\215\2\0"+
+    "\1\u0131\1\215\1\0\4\215\1\0\1\215\1\0\3\215"+
+    "\1\0\6\215\1\0\57\215\1\u0132\1\0\10\u0132\1\u0133"+
+    "\2\u0132\1\u0134\1\u0132\1\u0135\46\u0132\1\u0134\20\u0132\1\u0136"+
+    "\1\0\1\u0136\2\u0137\1\u0136\4\u0137\2\u0136\1\u0138\1\u0139"+
+    "\1\u0136\1\u013a\4\u0137\1\u0136\11\u0137\1\u0136\27\u0137\1\u0139"+
+    "\10\u0137\2\u0136\4\u0137\1\u0136\1\u0137\1\221\2\u012d\1\u013b"+
+    "\1\221\1\u012d\4\221\1\u012d\1\221\1\u012d\3\221\1\u012d"+
+    "\3\221\1\u013c\2\221\1\u012d\57\221\1\222\2\0\1\u013d"+
+    "\1\222\1\0\4\222\1\0\1\222\1\0\3\222\1\0"+
+    "\6\222\1\0\57\222\12\u013e\1\u013f\74\u013e\14\u0140\1\u013f"+
+    "\72\u0140\1\226\2\u012d\1\u0141\1\226\1\u012d\4\226\1\u012d"+
+    "\1\226\1\u012d\3\226\1\u012d\3\226\1\u0142\2\226\1\u012d"+
+    "\57\226\1\227\2\0\1\u0143\1\227\1\0\4\227\1\0"+
+    "\1\227\1\0\3\227\1\0\6\227\1\0\57\227\1\u0144"+
+    "\1\0\10\u0144\1\u0145\2\u0144\1\u0146\1\u0144\1\u0147\46\u0144"+
+    "\1\u0146\20\u0144\1\u0148\1\0\1\u0148\2\u0149\1\u0148\4\u0149"+
+    "\2\u0148\1\u014a\1\u014b\1\u0148\1\u014c\4\u0149\1\u0148\11\u0149"+
+    "\1\u0148\27\u0149\1\u014b\10\u0149\2\u0148\4\u0149\1\u0148\1\u0149"+
+    "\2\233\1\0\106\233\1\0\20\233\1\u014d\2\233\1\u014e"+
+    "\60\233\1\236\2\0\1\u014f\1\236\1\0\4\236\1\0"+
+    "\1\236\1\0\3\236\1\0\6\236\1\0\57\236\1\u0150"+
+    "\1\0\10\u0150\1\u0151\2\u0150\1\u0152\1\u0150\1\u0153\46\u0150"+
+    "\1\u0152\20\u0150\1\u0154\1\0\1\u0154\2\u0155\1\u0154\4\u0155"+
+    "\2\u0154\1\u0156\1\u0157\1\u0154\1\u0158\4\u0155\1\u0154\11\u0155"+
+    "\1\u0154\27\u0155\1\u0157\10\u0155\2\u0154\4\u0155\1\u0154\1\u0155"+
+    "\2\242\1\0\106\242\1\0\20\242\1\u0159\2\242\1\u015a"+
+    "\60\242\7\0\1\u015b\77\0\1\252\2\0\1\u015c\1\252"+
+    "\1\0\4\252\1\0\1\252\1\0\3\252\1\0\6\252"+
+    "\1\0\60\252\1\0\1\u011c\1\u015c\1\252\1\0\4\252"+
+    "\1\0\1\252\1\0\3\252\1\0\6\252\1\0\57\252"+
+    "\1\u015d\1\0\10\u015d\1\u015e\2\u015d\1\u015f\1\u015d\1\u0160"+
+    "\46\u015d\1\u015f\20\u015d\1\u0161\1\0\12\u0161\1\u015e\1\u0162"+
+    "\1\u0161\1\u0163\46\u0161\1\u0162\20\u0161\1\252\2\0\1\u015c"+
+    "\1\252\1\0\4\252\1\0\1\252\1\0\1\252\1\u0164"+
+    "\1\252\1\0\6\252\1\0\60\252\2\0\1\u015c\1\252"+
+    "\1\0\4\252\1\0\1\252\1\0\1\252\1\u0165\1\252"+
+    "\1\0\6\252\1\0\57\252\1\261\1\0\12\261\2\0"+
+    "\50\261\1\0\20\261\3\0\1\u0166\17\0\1\351\2\0"+
+    "\1\364\60\0\1\261\1\0\3\261\1\263\6\261\2\0"+
+    "\2\261\1\263\6\261\1\263\36\261\1\0\20\261\5\0"+
+    "\1\u0167\10\0\1\u0168\1\0\1\u0167\6\0\1\u0167\64\0"+
+    "\1\u0167\10\0\1\u0169\1\0\1\u0167\6\0\1\u0167\57\0"+
+    "\1\267\1\0\10\267\1\0\2\267\1\0\50\267\1\0"+
+    "\21\267\1\0\3\267\1\270\4\267\1\0\2\267\1\0"+
+    "\2\267\1\270\6\267\1\270\36\267\1\0\20\267\5\0"+
+    "\1\u0167\10\0\1\u016a\1\0\1\u0167\6\0\1\u0167\64\0"+
+    "\1\u0167\10\0\1\u016b\1\0\1\u0167\6\0\1\u0167\57\0"+
+    "\12\274\1\0\1\274\1\0\1\u016c\67\274\1\0\13\274"+
+    "\1\0\1\274\1\0\1\u016c\5\274\1\u016d\61\274\1\0"+
+    "\13\274\1\0\1\274\1\0\1\274\1\u016e\66\274\1\u016f"+
+    "\1\274\14\u0170\1\u0171\106\u0170\1\u0171\6\u0170\1\u0172\2\u0170"+
+    "\1\u0173\60\u0170\12\u0174\1\u0175\106\u0174\1\u0175\10\u0174\1\u0176"+
+    "\2\u0174\1\u0177\60\u0174\12\312\1\0\4\312\1\u0178\65\312"+
+    "\1\0\13\312\1\0\4\312\1\u0178\3\312\1\u0179\61\312"+
+    "\1\0\13\312\1\u017a\74\312\14\317\1\0\2\317\1\u017b"+
+    "\65\317\1\0\15\317\1\0\2\317\1\u017b\3\317\1\u017c"+
+    "\61\317\1\0\15\317\1\u017d\72\317\12\322\1\0\1\322"+
+    "\1\0\70\322\1\0\13\322\1\0\1\322\1\0\6\322"+
+    "\1\u017e\61\322\1\0\13\322\1\0\1\322\1\0\1\322"+
+    "\1\u017f\66\322\1\0\1\322\14\u0180\1\u0181\106\u0180\1\u0181"+
+    "\6\u0180\1\u0182\2\u0180\1\u0183\60\u0180\12\u0184\1\u0185\106\u0184"+
+    "\1\u0185\10\u0184\1\u0186\2\u0184\1\u0187\60\u0184\12\340\1\0"+
+    "\4\340\1\u0188\65\340\1\0\13\340\1\0\4\340\1\u0188"+
+    "\3\340\1\u0189\61\340\1\0\13\340\1\u018a\74\340\14\344"+
+    "\1\0\2\344\1\u018b\65\344\1\0\15\344\1\0\2\344"+
+    "\1\u018b\3\344\1\u018c\61\344\1\0\15\344\1\u018d\72\344"+
+    "\7\0\1\u018e\12\0\1\u018f\3\0\1\u0190\23\0\1\u0191"+
+    "\43\0\1\u0192\26\0\1\u0193\55\0\1\353\2\0\2\u0194"+
+    "\6\0\1\353\6\0\1\353\6\u0194\1\0\13\u0194\1\0"+
+    "\13\u0194\1\0\4\u0194\1\0\4\u0194\1\0\4\u0194\1\0"+
+    "\1\u0194\1\u0195\1\0\3\u0195\1\u0196\4\354\1\u0195\1\0"+
+    "\4\u0195\1\u0196\1\354\1\u0195\1\0\3\u0195\1\u0196\6\354"+
+    "\1\u0195\13\354\1\u0195\13\354\1\u0195\4\354\1\u0197\11\354"+
+    "\1\u0195\1\354\21\0\1\u0198\7\0\1\u0199\55\0\1\72"+
+    "\1\0\11\72\1\0\1\72\1\u019a\5\72\1\0\42\72"+
+    "\1\0\20\72\105\357\1\u019b\1\357\16\0\1\u019c\70\0"+
+    "\1\u0195\1\0\3\u0195\1\u0196\4\361\1\u0195\1\0\4\u0195"+
+    "\1\u0196\1\361\1\u0195\1\0\3\u0195\1\u0196\6\361\1\u0195"+
+    "\13\361\1\u0195\13\361\1\u0195\4\361\1\u019d\11\361\1\u0195"+
+    "\1\361\105\362\1\u019e\1\362\1\72\1\0\11\72\1\0"+
+    "\1\72\1\0\5\72\1\0\42\72\1\u019f\20\72\36\0"+
+    "\1\u0193\52\0\1\u01a0\106\0\1\u01a1\112\0\4\114\7\0"+
+    "\1\114\6\0\4\114\2\u01a2\1\0\13\114\1\0\13\114"+
+    "\1\0\4\114\1\0\11\114\1\0\1\114\6\0\4\114"+
+    "\7\0\1\114\6\0\4\114\1\u01a2\1\u01a3\1\0\13\114"+
+    "\1\0\13\114\1\0\4\114\1\0\11\114\1\0\1\114"+
+    "\6\0\4\114\7\0\1\114\6\0\6\114\1\0\13\114"+
+    "\1\0\2\114\1\u01a4\10\114\1\0\4\114\1\0\6\114"+
+    "\1\u01a4\2\114\1\0\1\114\12\376\1\377\3\376\1\0"+
+    "\71\376\1\0\10\376\1\377\2\376\1\u01a5\1\376\1\u0101"+
+    "\46\376\1\u01a5\20\376\14\u0102\1\377\1\u0102\1\0\71\u0102"+
+    "\1\0\12\u0102\1\377\1\u01a6\1\u0102\1\u0104\46\u0102\1\u01a6"+
+    "\20\u0102\1\u0108\1\0\10\u0108\1\u010a\2\u0108\1\u01a7\1\u0108"+
+    "\1\u01a8\46\u0108\1\u01a7\20\u0108\1\143\2\u0108\1\u0109\1\143"+
+    "\1\u0108\4\143\1\u010a\1\143\1\u0108\1\143\1\141\1\143"+
+    "\1\u0108\6\143\1\u0108\60\143\1\0\1\u0108\1\u0109\1\143"+
+    "\1\u0108\4\143\1\u010a\1\143\1\u0108\1\u01a9\1\143\1\u010c"+
+    "\1\u0108\6\143\1\u0108\36\143\1\u01a9\20\143\1\u010d\1\0"+
+    "\12\u010d\1\u010a\1\u01aa\1\u010d\1\u01ab\46\u010d\1\u01aa\20\u010d"+
+    "\1\144\2\u010d\1\u010e\1\144\1\u010d\4\144\1\u010d\1\144"+
+    "\1\u010a\1\144\1\141\1\144\1\u010d\6\144\1\u010d\60\144"+
+    "\1\0\1\u010d\1\u010e\1\144\1\u010d\4\144\1\u010d\1\144"+
+    "\1\u010a\1\u01ac\1\144\1\u0110\1\u010d\6\144\1\u010d\36\144"+
+    "\1\u01ac\20\144\12\u0115\1\u0116\3\u0115\1\0\71\u0115\1\0"+
+    "\10\u0115\1\u0116\2\u0115\1\u01ad\1\u0115\1\u0118\46\u0115\1\u01ad"+
+    "\20\u0115\14\u0119\1\u0116\1\u0119\1\0\71\u0119\1\0\12\u0119"+
+    "\1\u0116\1\u01ae\1\u0119\1\u011b\46\u0119\1\u01ae\20\u0119\6\0"+
+    "\4\170\7\0\1\170\6\0\6\170\1\0\13\170\1\0"+
+    "\13\170\1\0\4\170\1\0\6\170\1\u01af\2\170\1\0"+
+    "\1\170\6\0\4\u011e\7\0\1\u011e\6\0\6\u011e\1\0"+
+    "\13\u011e\1\0\13\u011e\1\0\4\u011e\1\0\11\u011e\1\0"+
+    "\1\u011e\6\0\4\u0120\7\0\1\u0120\6\0\6\u0120\1\0"+
+    "\13\u0120\1\0\13\u0120\1\0\4\u0120\1\0\11\u0120\1\0"+
+    "\1\u0120\12\u0121\1\u0122\3\u0121\1\0\71\u0121\1\0\10\u0121"+
+    "\1\u0122\2\u0121\1\u01b0\1\u0121\1\u0124\46\u0121\1\u01b0\20\u0121"+
+    "\14\u0125\1\u0122\1\u0125\1\0\71\u0125\1\0\12\u0125\1\u0122"+
+    "\1\u01b1\1\u0125\1\u0127\46\u0125\1\u01b1\20\u0125\1\u01b2\2\u01b3"+
+    "\1\u01b4\1\u01b2\1\u01b3\4\u01b2\1\u01b3\1\u01b2\1\u01b3\3\u01b2"+
+    "\1\u01b3\6\u01b2\1\u01b3\55\u01b2\1\175\1\u01b2\1\u01b5\2\u01b6"+
+    "\1\u01b7\1\u01b5\1\u01b6\4\u01b5\1\u01b6\1\u01b5\1\u01b6\3\u01b5"+
+    "\1\u01b6\6\u01b5\1\u01b6\55\u01b5\1\175\1\u01b5\37\0\1\u01b8"+
+    "\35\0\1\u01b8\53\0\1\u01b9\14\0\1\u01b9\73\0\1\u01ba"+
+    "\11\0\1\u01ba\76\0\1\u01bb\20\0\1\u01bb\113\0\1\u01bc"+
+    "\7\0\1\u01bc\2\0\12\u0132\1\u0133\3\u0132\1\0\71\u0132"+
+    "\1\0\10\u0132\1\u0133\2\u0132\1\u01bd\1\u0132\1\u0135\46\u0132"+
+    "\1\u01bd\20\u0132\1\u0136\1\0\12\u0136\1\u0133\1\u01be\1\u0136"+
+    "\1\u013a\46\u0136\1\u01be\21\u0136\1\0\12\u0136\1\u01bf\1\u01be"+
+    "\1\u0136\1\u013a\46\u0136\1\u01be\20\u0136\14\0\1\u01c0\72\0"+
+    "\14\u0136\1\u01bf\1\u0136\1\0\71\u0136\1\0\12\u0136\1\u0133"+
+    "\1\u01c1\1\u0136\1\u013a\46\u0136\1\u01c1\20\u0136\12\u0144\1\u0145"+
+    "\3\u0144\1\0\71\u0144\1\0\10\u0144\1\u0145\2\u0144\1\u01c2"+
+    "\1\u0144\1\u0147\46\u0144\1\u01c2\20\u0144\1\u0148\1\0\12\u0148"+
+    "\1\u0145\1\u01c3\1\u0148\1\u014c\46\u0148\1\u01c3\21\u0148\1\0"+
+    "\12\u0148\1\u01c4\1\u01c3\1\u0148\1\u014c\46\u0148\1\u01c3\20\u0148"+
+    "\14\0\1\u01c5\72\0\14\u0148\1\u01c4\1\u0148\1\0\71\u0148"+
+    "\1\0\12\u0148\1\u0145\1\u01c6\1\u0148\1\u014c\46\u0148\1\u01c6"+
+    "\20\u0148\2\233\1\0\4\233\1\u01c7\12\233\1\u01c8\3\233"+
+    "\1\u01c9\23\233\1\u01ca\36\233\1\0\33\233\1\u01cb\50\233"+
+    "\12\u0150\1\u0151\3\u0150\1\0\71\u0150\1\0\10\u0150\1\u0151"+
+    "\2\u0150\1\u01cc\1\u0150\1\u0153\46\u0150\1\u01cc\20\u0150\1\u0154"+
+    "\1\0\12\u0154\1\u0151\1\u01cd\1\u0154\1\u0158\46\u0154\1\u01cd"+
+    "\21\u0154\1\0\12\u0154\1\u01ce\1\u01cd\1\u0154\1\u0158\46\u0154"+
+    "\1\u01cd\20\u0154\14\0\1\u01cf\72\0\14\u0154\1\u01ce\1\u0154"+
+    "\1\0\71\u0154\1\0\12\u0154\1\u0151\1\u01d0\1\u0154\1\u0158"+
+    "\46\u0154\1\u01d0\20\u0154\2\242\1\0\4\242\1\u01d1\12\242"+
+    "\1\u01d2\3\242\1\u01d3\23\242\1\u01d4\36\242\1\0\33\242"+
+    "\1\u01d5\50\242\23\0\1\u01d6\63\0\12\u015d\1\u015e\3\u015d"+
+    "\1\0\71\u015d\1\0\10\u015d\1\u01d7\2\u015d\1\u01d8\1\u015d"+
+    "\1\u0160\46\u015d\1\u01d8\20\u015d\14\u0161\1\u015e\1\u0161\1\0"+
+    "\71\u0161\1\0\12\u0161\1\u01d9\1\u01da\1\u0161\1\u0163\46\u0161"+
+    "\1\u01da\20\u0161\1\u01db\2\u01b3\1\u01dc\1\u01db\1\u01b3\4\u01db"+
+    "\1\u01b3\1\u01db\1\u01b3\3\u01db\1\u01b3\6\u01db\1\u01b3\55\u01db"+
+    "\1\252\1\u01db\1\u01dd\2\u01b6\1\u01de\1\u01dd\1\u01b6\4\u01dd"+
+    "\1\u01b6\1\u01dd\1\u01b6\3\u01dd\1\u01b6\6\u01dd\1\u01b6\55\u01dd"+
+    "\1\252\1\u01dd\5\0\1\u0167\12\0\1\u0167\6\0\1\u0167"+
+    "\57\0\12\274\1\0\1\274\1\0\1\274\1\u01df\66\274"+
+    "\1\u016f\10\274\1\u01e0\2\274\1\0\1\274\1\0\1\u016c"+
+    "\4\274\1\u01e1\3\274\1\u01e2\23\274\1\u01e3\32\274\1\0"+
+    "\1\274\12\u01df\1\0\1\u01df\1\0\70\u01df\1\0\1\u01df"+
+    "\12\u016f\1\0\1\u016f\1\0\1\u01e4\67\u016f\1\0\1\u016f"+
+    "\7\u0170\1\u01e5\4\u0170\1\u0171\5\u0170\1\u01e6\3\u0170\1\u01e7"+
+    "\23\u0170\1\u01e8\50\u0170\1\u0171\21\u0170\1\u01e9\50\u0170\7\u0174"+
+    "\1\u01ea\2\u0174\1\u0175\7\u0174\1\u01eb\3\u0174\1\u01ec\23\u0174"+
+    "\1\u01ed\46\u0174\1\u0175\23\u0174\1\u01ee\50\u0174\12\312\1\0"+
+    "\103\312\1\u01ef\2\312\1\0\4\312\1\u0178\2\312\1\u01f0"+
+    "\3\312\1\u01f1\23\312\1\u01f2\32\312\1\0\1\312\17\u01f3"+
+    "\1\u01f4\67\u01f3\14\317\1\0\101\317\1\u01f5\4\317\1\0"+
+    "\2\317\1\u017b\2\317\1\u01f6\3\317\1\u01f7\23\317\1\u01f8"+
+    "\32\317\1\0\1\317\17\u01f9\1\u01fa\67\u01f9\7\322\1\u01fb"+
+    "\2\322\1\0\1\322\1\0\5\322\1\u01fc\3\322\1\u01fd"+
+    "\23\322\1\u01fe\32\322\1\0\1\322\7\u0180\1\u01ff\4\u0180"+
+    "\1\u0181\5\u0180\1\u0200\3\u0180\1\u0201\23\u0180\1\u0202\50\u0180"+
+    "\1\u0181\21\u0180\1\u0203\50\u0180\7\u0184\1\u0204\2\u0184\1\u0185"+
+    "\7\u0184\1\u0205\3\u0184\1\u0206\23\u0184\1\u0207\46\u0184\1\u0185"+
+    "\23\u0184\1\u0208\50\u0184\12\340\1\0\103\340\1\u0209\2\340"+
+    "\1\0\4\340\1\u0188\2\340\1\u020a\3\340\1\u020b\23\340"+
+    "\1\u020c\32\340\1\0\1\340\17\u020d\1\u020e\67\u020d\14\344"+
+    "\1\0\101\344\1\u020f\4\344\1\0\2\344\1\u018b\2\344"+
+    "\1\u0210\3\344\1\u0211\23\344\1\u0212\32\344\1\0\1\344"+
+    "\17\u0213\1\u0214\67\u0213\7\0\1\u0215\106\0\1\u0216\136\0"+
+    "\1\u0217\47\0\1\u0194\1\0\11\u0194\1\0\7\u0194\1\0"+
+    "\63\u0194\1\u0195\1\0\11\u0195\1\0\7\u0195\1\0\47\u0195"+
+    "\1\0\14\u0195\1\0\3\u0195\1\u0196\5\u0195\1\0\4\u0195"+
+    "\1\u0196\2\u0195\1\0\3\u0195\1\u0196\43\u0195\1\u0218\13\u0195"+
+    "\21\0\1\u0198\51\0\1\u0219\34\0\1\u021a\15\0\3\u021a"+
+    "\2\0\1\u021a\11\0\1\u021a\1\0\2\u021a\7\0\1\u021a"+
+    "\2\0\2\u021a\6\0\1\u021a\17\0\1\u019a\157\0\1\u019f"+
+    "\26\0\1\114\1\u021b\2\114\7\0\1\114\6\0\6\114"+
+    "\1\0\13\114\1\0\13\114\1\0\4\114\1\0\11\114"+
+    "\1\0\1\114\6\0\4\114\7\0\1\114\6\0\6\114"+
+    "\1\0\11\114\1\u021c\1\114\1\0\1\u021c\12\114\1\0"+
+    "\4\114\1\0\11\114\1\0\1\114\12\376\1\377\74\376"+
+    "\14\u0102\1\377\72\u0102\12\u0108\1\u010a\3\u0108\1\0\71\u0108"+
+    "\1\0\10\u0108\1\u010a\2\u0108\1\u021d\1\u0108\1\u01a8\46\u0108"+
+    "\1\u021d\20\u0108\1\143\2\u0108\1\u0109\1\143\1\u0108\4\143"+
+    "\1\u010a\1\143\1\u0108\3\143\1\u0108\6\143\1\u0108\57\143"+
+    "\14\u010d\1\u010a\1\u010d\1\0\71\u010d\1\0\12\u010d\1\u010a"+
+    "\1\u021e\1\u010d\1\u01ab\46\u010d\1\u021e\20\u010d\1\144\2\u010d"+
+    "\1\u010e\1\144\1\u010d\4\144\1\u010d\1\144\1\u010a\3\144"+
+    "\1\u010d\6\144\1\u010d\57\144\12\u0115\1\u0116\74\u0115\14\u0119"+
+    "\1\u0116\72\u0119\6\0\3\170\1\u021f\7\0\1\170\6\0"+
+    "\6\170\1\0\13\170\1\0\13\170\1\0\4\170\1\0"+
+    "\11\170\1\0\1\170\12\u0121\1\u0122\74\u0121\14\u0125\1\u0122"+
+    "\72\u0125\1\u01b2\2\u01b3\1\u01b4\1\u01b2\1\u01b3\4\u01b2\1\u01b3"+
+    "\1\u01b2\1\u01b3\3\u01b2\1\u01b3\6\u01b2\1\u01b3\55\u01b2\1\u0220"+
+    "\1\u01b2\105\u01b3\1\u0221\1\u01b3\1\u01b5\2\u01b6\1\u01b7\1\u01b5"+
+    "\1\u01b6\4\u01b5\1\u01b6\1\u01b5\1\u01b6\3\u01b5\1\u01b6\6\u01b5"+
+    "\1\u01b6\55\u01b5\1\u0220\1\u01b5\105\u01b6\1\u0222\1\u01b6\42\0"+
+    "\1\u0223\14\0\1\u0223\63\0\2\u0224\103\0\2\u0225\115\0"+
+    "\1\u0226\14\0\1\u0226\63\0\2\u0227\51\0\12\u0132\1\u0133"+
+    "\74\u0132\14\u0136\1\u0133\1\u0136\1\0\70\u0136\3\0\2\u0228"+
+    "\1\0\4\u0228\2\0\1\u0138\1\u0228\2\0\4\u0228\1\0"+
+    "\11\u0228\1\0\40\u0228\2\0\4\u0228\1\0\1\u0228\14\u0136"+
+    "\1\u0133\72\u0136\12\u0144\1\u0145\74\u0144\14\u0148\1\u0145\1\u0148"+
+    "\1\0\70\u0148\3\0\2\u0229\1\0\4\u0229\2\0\1\u014a"+
+    "\1\u0229\2\0\4\u0229\1\0\11\u0229\1\0\40\u0229\2\0"+
+    "\4\u0229\1\0\1\u0229\14\u0148\1\u0145\72\u0148\2\233\1\0"+
+    "\4\233\1\u022a\101\233\1\0\34\233\1\u022b\47\233\12\u0150"+
+    "\1\u0151\74\u0150\14\u0154\1\u0151\1\u0154\1\0\70\u0154\3\0"+
+    "\2\u022c\1\0\4\u022c\2\0\1\u0156\1\u022c\2\0\4\u022c"+
+    "\1\0\11\u022c\1\0\40\u022c\2\0\4\u022c\1\0\1\u022c"+
+    "\14\u0154\1\u0151\72\u0154\2\242\1\0\4\242\1\u022d\101\242"+
+    "\1\0\34\242\1\u022e\47\242\2\0\1\u022f\104\0\12\u015d"+
+    "\1\u015e\74\u015d\14\u0161\1\u015e\72\u0161\1\u01db\2\u01b3\1\u01dc"+
+    "\1\u01db\1\u01b3\4\u01db\1\u01b3\1\u01db\1\u01b3\3\u01db\1\u01b3"+
+    "\6\u01db\1\u01b3\55\u01db\1\u0230\1\u01db\1\u01dd\2\u01b6\1\u01de"+
+    "\1\u01dd\1\u01b6\4\u01dd\1\u01b6\1\u01dd\1\u01b6\3\u01dd\1\u01b6"+
+    "\6\u01dd\1\u01b6\55\u01dd\1\u0230\1\u01dd\7\274\1\u0231\2\274"+
+    "\1\0\1\274\1\0\1\u016c\67\274\1\0\1\274\12\u016f"+
+    "\1\0\1\u016f\1\0\1\u016f\1\0\70\u016f\7\u0170\1\u0232"+
+    "\4\u0170\1\u0171\106\u0170\1\u0171\22\u0170\1\u0233\47\u0170\7\u0174"+
+    "\1\u0234\2\u0174\1\u0175\106\u0174\1\u0175\24\u0174\1\u0235\47\u0174"+
+    "\7\312\1\u0236\2\312\1\0\4\312\1\u0178\65\312\1\0"+
+    "\1\312\12\u0237\1\u0238\72\u0237\1\0\1\u0237\7\317\1\u0239"+
+    "\4\317\1\0\2\317\1\u017b\65\317\1\0\1\317\14\u023a"+
+    "\1\u0238\70\u023a\1\0\1\u023a\7\322\1\u023b\2\322\1\0"+
+    "\1\322\1\0\70\322\1\0\1\322\7\u0180\1\u023c\4\u0180"+
+    "\1\u0181\106\u0180\1\u0181\22\u0180\1\u023d\47\u0180\7\u0184\1\u023e"+
+    "\2\u0184\1\u0185\106\u0184\1\u0185\24\u0184\1\u023f\47\u0184\7\340"+
+    "\1\u0240\2\340\1\0\4\340\1\u0188\65\340\1\0\1\340"+
+    "\12\u0241\1\u0242\72\u0241\1\0\1\u0241\7\344\1\u0243\4\344"+
+    "\1\0\2\344\1\u018b\65\344\1\0\1\344\14\u0244\1\u0242"+
+    "\70\u0244\1\0\1\u0244\40\0\1\u0245\141\0\1\u0218\34\0"+
+    "\1\u021a\15\0\3\u021a\2\0\1\u021a\11\0\1\u021a\1\0"+
+    "\2\u021a\7\0\1\u021a\1\0\1\u0219\2\u021a\6\0\1\u021a"+
+    "\10\0\4\114\7\0\1\114\6\0\6\114\1\0\7\114"+
+    "\1\u0246\3\114\1\0\13\114\1\0\4\114\1\0\11\114"+
+    "\1\0\1\114\6\0\4\114\7\0\1\114\6\0\6\114"+
+    "\1\0\6\114\1\u0247\4\114\1\0\13\114\1\0\1\114"+
+    "\1\u0247\2\114\1\0\11\114\1\0\1\114\12\u0108\1\u010a"+
+    "\74\u0108\14\u010d\1\u010a\72\u010d\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\6\170\1\u0248\4\170\1\0\6\170"+
+    "\1\u0249\4\170\1\0\4\170\1\0\11\170\1\0\1\170"+
+    "\54\0\1\u024a\5\0\1\u024a\73\0\1\u024b\14\0\1\u024b"+
+    "\66\0\1\u024c\11\0\1\u024c\74\0\1\u024d\11\0\1\u024d"+
+    "\77\0\1\u024e\14\0\1\u024e\22\0\2\233\1\0\35\233"+
+    "\1\u024f\46\233\2\242\1\0\35\242\1\u0250\46\242\14\u0170"+
+    "\1\u0171\23\u0170\1\u0251\46\u0170\12\u0174\1\u0175\25\u0174\1\u0252"+
+    "\46\u0174\12\u0237\1\u01f3\4\u0237\1\u0253\65\u0237\1\u01f3\1\u0237"+
+    "\14\u023a\1\u01f9\2\u023a\1\u0254\65\u023a\1\u01f9\1\u023a\14\u0180"+
+    "\1\u0181\23\u0180\1\u0255\46\u0180\12\u0184\1\u0185\25\u0184\1\u0256"+
+    "\46\u0184\12\u0241\1\u020d\4\u0241\1\u0257\65\u0241\1\u020d\1\u0241"+
+    "\14\u0244\1\u0213\2\u0244\1\u0258\65\u0244\1\u0213\1\u0244\41\0"+
+    "\1\u0259\53\0\4\114\7\0\1\114\6\0\6\114\1\0"+
+    "\13\114\1\0\4\114\1\u025a\6\114\1\0\4\114\1\0"+
+    "\11\114\1\0\1\114\6\0\4\114\7\0\1\114\6\0"+
+    "\6\114\1\0\3\114\1\u025b\7\114\1\0\4\114\1\u025b"+
+    "\6\114\1\0\4\114\1\0\11\114\1\0\1\114\6\0"+
+    "\4\170\7\0\1\170\6\0\6\170\1\0\11\170\1\u025c"+
+    "\1\170\1\0\13\170\1\0\4\170\1\0\11\170\1\0"+
+    "\1\170\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
+    "\10\170\1\u025d\2\170\1\0\13\170\1\0\4\170\1\0"+
+    "\11\170\1\0\1\170\55\0\1\u025e\24\0\1\u025e\52\0"+
+    "\1\u025f\20\0\1\u025f\70\0\1\u0260\13\0\1\u0260\53\0"+
+    "\2\u0261\112\0\1\u0262\35\0\1\u0262\11\0\2\233\1\0"+
+    "\36\233\1\u0263\45\233\2\242\1\0\36\242\1\u0264\45\242"+
+    "\14\u0170\1\u0171\24\u0170\1\u0265\45\u0170\12\u0174\1\u0175\26\u0174"+
+    "\1\u0266\45\u0174\12\u0237\1\u0267\4\u0237\1\u0253\65\u0237\1\u01f3"+
+    "\1\u0237\14\u023a\1\u0268\2\u023a\1\u0254\65\u023a\1\u01f9\1\u023a"+
+    "\14\u0180\1\u0181\24\u0180\1\u0269\45\u0180\12\u0184\1\u0185\26\u0184"+
+    "\1\u026a\45\u0184\12\u0241\1\u026b\4\u0241\1\u0257\65\u0241\1\u020d"+
+    "\1\u0241\14\u0244\1\u026c\2\u0244\1\u0258\65\u0244\1\u0213\1\u0244"+
+    "\42\0\1\u026d\52\0\4\114\7\0\1\114\6\0\6\114"+
+    "\1\0\13\114\1\0\7\114\1\u026e\3\114\1\0\4\114"+
+    "\1\0\11\114\1\0\1\114\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\11\170\1\u026f\1\170\1\0\13\170"+
+    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\6\170\1\u0270\4\170"+
+    "\1\0\13\170\1\0\4\170\1\0\11\170\1\0\1\170"+
+    "\44\0\1\u0271\11\0\1\u0271\72\0\1\u0272\14\0\1\u0272"+
+    "\71\0\1\u0273\14\0\1\u0273\27\0\2\233\1\0\37\233"+
+    "\1\u0274\44\233\2\242\1\0\37\242\1\u0275\44\242\14\u0170"+
+    "\1\u0171\25\u0170\1\u0276\44\u0170\12\u0174\1\u0175\27\u0174\1\u0277"+
+    "\44\u0174\14\u0180\1\u0181\25\u0180\1\u0278\44\u0180\12\u0184\1\u0185"+
+    "\27\u0184\1\u0279\44\u0184\41\0\1\u027a\53\0\4\114\7\0"+
+    "\1\114\6\0\5\114\1\u027b\1\0\13\114\1\0\13\114"+
+    "\1\0\4\114\1\0\11\114\1\0\1\114\6\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\4\170"+
+    "\1\u027c\6\170\1\0\4\170\1\0\11\170\1\0\1\170"+
+    "\6\0\4\170\7\0\1\170\6\0\6\170\1\0\5\170"+
+    "\1\u027d\5\170\1\0\13\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\2\233\1\0\36\233\1\u027e\45\233\2\242"+
+    "\1\0\36\242\1\u027f\45\242\14\u0170\1\u0171\24\u0170\1\u0280"+
+    "\45\u0170\12\u0174\1\u0175\26\u0174\1\u0281\45\u0174\14\u0180\1\u0181"+
+    "\24\u0180\1\u0282\45\u0180\12\u0184\1\u0185\26\u0184\1\u0283\45\u0184"+
+    "\36\0\1\u0284\56\0\4\114\7\0\1\114\6\0\6\114"+
+    "\1\0\5\114\1\u0285\5\114\1\0\13\114\1\0\4\114"+
+    "\1\0\11\114\1\0\1\114\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\13\170\1\0\13\170\1\0\4\170"+
+    "\1\0\1\170\1\u0286\7\170\1\0\1\170\2\233\1\0"+
+    "\33\233\1\u0287\50\233\2\242\1\0\33\242\1\u0288\50\242"+
+    "\14\u0170\1\u0171\21\u0170\1\u0289\50\u0170\12\u0174\1\u0175\23\u0174"+
+    "\1\u028a\50\u0174\14\u0180\1\u0181\21\u0180\1\u028b\50\u0180\12\u0184"+
+    "\1\u0185\23\u0184\1\u028c\50\u0184\6\0\4\114\7\0\1\114"+
+    "\6\0\6\114\1\0\7\114\1\u028d\3\114\1\0\13\114"+
+    "\1\0\4\114\1\0\11\114\1\0\1\114\6\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\4\170"+
+    "\1\u028e\6\170\1\0\4\170\1\0\11\170\1\0\1\170"+
+    "\6\0\4\114\7\0\1\114\6\0\6\114\1\0\13\114"+
+    "\1\0\13\114\1\0\4\114\1\0\11\114\1\0\1\u028f"+
+    "\6\0\4\170\7\0\1\170\6\0\6\170\1\0\10\170"+
+    "\1\u0290\2\170\1\0\13\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\6\0\4\114\7\0\1\114\6\0\6\114"+
+    "\1\0\5\114\1\u0291\5\114\1\0\13\114\1\0\4\114"+
+    "\1\0\11\114\1\0\1\114\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\4\170\1\u0292\6\170\1\0\13\170"+
+    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\114"+
+    "\7\0\1\114\6\0\6\114\1\0\5\114\1\u0293\5\114"+
+    "\1\0\13\114\1\0\4\114\1\0\11\114\1\0\1\114"+
+    "\6\0\4\170\7\0\1\170\6\0\6\170\1\0\5\170"+
+    "\1\u0294\5\170\1\0\13\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\6\0\4\114\7\0\1\114\6\0\6\114"+
+    "\1\0\13\114\1\0\4\114\1\u0295\6\114\1\0\4\114"+
+    "\1\0\11\114\1\0\1\114\6\u0296\4\u0297\7\u0296\1\u0297"+
+    "\5\u0296\1\0\6\u0297\1\u0296\13\u0297\1\u0296\13\u0297\1\u0296"+
+    "\4\u0297\1\u0296\11\u0297\1\u0296\1\u0297\43\0\1\u0298\3\0"+
+    "\1\u0299\7\0\1\u029a\1\u029b\21\0\1\u029c\12\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\4\170\1\u029d\3\170"+
+    "\1\u029e\2\170\1\0\4\170\1\u029f\1\u02a0\5\170\1\0"+
+    "\4\170\1\0\6\170\1\u02a1\2\170\1\0\1\170\60\0"+
+    "\1\u02a2\77\0\1\u02a3\115\0\1\u02a4\105\0\1\u02a5\107\0"+
+    "\1\u02a6\34\0\4\170\7\0\1\170\6\0\6\170\1\0"+
+    "\13\170\1\0\5\170\1\u02a7\5\170\1\0\4\170\1\0"+
+    "\11\170\1\0\1\170\6\0\4\170\7\0\1\170\6\0"+
+    "\6\170\1\0\12\170\1\u02a8\1\0\13\170\1\0\4\170"+
+    "\1\0\11\170\1\0\1\170\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\13\170\1\0\5\170\1\u02a9\5\170"+
+    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\4\170"+
+    "\1\u02aa\6\170\1\0\4\170\1\0\11\170\1\0\1\170"+
+    "\6\0\4\170\7\0\1\170\6\0\6\170\1\0\13\170"+
+    "\1\0\5\170\1\u02ab\5\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\45\0\1\u02ac\136\0\1\u02ad\107\0\1\u02ae"+
+    "\67\0\1\u02af\125\0\1\u02b0\16\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\6\170\1\u02b1\4\170\1\0\13\170"+
+    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\13\170"+
+    "\1\0\4\170\1\0\1\170\1\u02b2\7\170\1\0\1\170"+
+    "\6\0\4\170\7\0\1\170\6\0\6\170\1\0\13\170"+
+    "\1\0\13\170\1\0\4\170\1\0\2\170\1\u02b3\6\170"+
+    "\1\0\1\170\6\0\4\170\7\0\1\170\6\0\6\170"+
+    "\1\0\13\170\1\0\4\170\1\u02b4\6\170\1\0\4\170"+
+    "\1\0\11\170\1\0\1\170\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\13\170\1\0\13\170\1\0\4\170"+
+    "\1\0\2\170\1\u02b5\6\170\1\0\1\170\47\0\1\u02b6"+
+    "\74\0\1\u02b7\106\0\1\u02b8\116\0\1\u02b9\105\0\1\u02ba"+
+    "\50\0\4\170\7\0\1\170\6\0\6\170\1\0\10\170"+
+    "\1\u02bb\2\170\1\0\13\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\6\0\4\170\7\0\1\170\6\0\5\170"+
+    "\1\u02bc\1\0\13\170\1\0\13\170\1\0\4\170\1\0"+
+    "\11\170\1\0\1\170\6\0\4\170\7\0\1\170\6\0"+
+    "\5\170\1\u02bd\1\0\13\170\1\0\13\170\1\0\4\170"+
+    "\1\0\11\170\1\0\1\170\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\6\170\1\u02be\4\170\1\0\13\170"+
+    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\5\170\1\u02bf\5\170"+
+    "\1\0\13\170\1\0\4\170\1\0\11\170\1\0\1\170"+
+    "\60\0\1\u02c0\131\0\1\u02c1\52\0\1\u02c2\106\0\1\u02c3"+
+    "\45\0\4\170\7\0\1\170\6\0\6\170\1\0\13\170"+
+    "\1\0\5\170\1\u02c4\5\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\6\0\4\170\7\0\1\170\6\0\6\170"+
+    "\1\0\13\170\1\0\13\170\1\0\4\170\1\0\7\170"+
+    "\1\u02c5\1\170\1\0\1\170\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\10\170\1\u02c6\2\170\1\0\13\170"+
+    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\10\170\1\u02c7\2\170"+
+    "\1\0\13\170\1\0\4\170\1\0\11\170\1\0\1\170"+
+    "\104\0\1\u02c8\63\0\1\u02b0\131\0\1\u02ba\106\0\1\u02c9"+
+    "\10\0\4\170\7\0\1\170\6\0\6\170\1\0\13\170"+
+    "\1\0\13\170\1\0\4\170\1\0\10\170\1\u02ca\1\0"+
+    "\1\170\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
+    "\13\170\1\0\6\170\1\u02b5\4\170\1\0\4\170\1\0"+
+    "\11\170\1\0\1\170\6\0\4\170\7\0\1\170\6\0"+
+    "\6\170\1\0\13\170\1\0\13\170\1\0\4\170\1\0"+
+    "\10\170\1\u02bf\1\0\1\170\6\0\4\170\7\0\1\170"+
+    "\6\0\6\170\1\0\13\170\1\0\13\170\1\0\4\170"+
+    "\1\0\10\170\1\u02cb\1\0\1\170\35\0\1\u02b0\154\0"+
+    "\1\u02cc\11\0\4\170\7\0\1\170\6\0\5\170\1\u02b5"+
+    "\1\0\13\170\1\0\13\170\1\0\4\170\1\0\11\170"+
+    "\1\0\1\170\6\0\4\170\7\0\1\170\6\0\6\170"+
+    "\1\0\13\170\1\0\13\170\1\0\4\170\1\0\7\170"+
+    "\1\u02cd\1\170\1\0\1\170\57\0\1\u02b0\35\0\4\170"+
+    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\4\170"+
+    "\1\u02b5\6\170\1\0\4\170\1\0\11\170\1\0\1\170";
 
   /** 
    * The transition table of the DFA
@@ -797,45 +876,49 @@
   private final static byte YY_ATTRIBUTE[] = {
      1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1, 
      0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0,  0,  0, 
-     0,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  9,  1, 
-     9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1, 
-     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
-     1,  9,  9,  1,  9,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9, 
-     1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  3,  3,  3,  3,  9,  9, 
-     1,  1,  1,  9,  1,  1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  3, 
-     3,  3,  3,  9,  9,  1,  1,  1,  9,  1,  1,  1,  9,  9,  1,  1, 
-     0,  1,  0,  9,  1,  2,  1,  2,  1,  0,  0,  0,  9,  1,  1,  1, 
-     9,  9,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  0, 
-     0,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  9,  1,  1,  0,  1, 
-     0,  9,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9,  0,  0,  0,  0, 
-     9,  0,  0,  0,  1,  0,  0,  1,  0,  0,  9,  0,  0,  1,  0,  0, 
-     9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  9,  0,  0,  0,  1,  0, 
-     1,  1,  0,  0,  9,  9,  9,  0,  9,  9,  1,  1,  1,  1,  2, 13, 
-     3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  1,  1,  2, 13, 
-     3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  0,  9,  9,  9, 
-     0,  0,  1,  1,  1,  9,  0,  0, 13,  9, 13,  9,  9,  1,  1,  1, 
-     0,  0,  1,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0,  0,  1, 
-     0,  0,  1,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1, 
-     1,  0,  1,  1,  1,  1,  1,  0,  2,  3,  3,  3,  2,  2,  3,  3, 
-     3,  2,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1, 
-     1,  1,  2,  3,  3,  3,  2,  2,  3,  3,  3,  2,  1,  1,  1,  1, 
-     0,  0,  1,  1,  1,  1,  0,  0,  9,  9,  0,  1,  9,  0,  1,  1, 
-     1,  5, 13, 13,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  1,  1, 
-     9,  1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  1,  3,  2,  3,  2, 
-     1,  0,  9,  1,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  1, 
-     1,  2,  2,  0,  0,  2,  2,  0,  0,  0,  1,  1,  1,  1,  0,  0, 
-     0,  9,  9,  1,  1,  2,  2,  1,  1,  2,  2,  1,  1,  0,  1,  1, 
-     1,  9,  9,  9,  1,  1,  2,  2,  2,  2,  0,  1,  1,  1,  1,  1, 
-     2,  2,  2,  2,  9,  1,  1,  1,  1,  3,  3,  3,  3,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  0,  1,  0,  0,  0,  0,  0,  1,  1,  1, 
-     1,  1,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  1,  0, 
-     0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  9,  1,  1,  1,  1,  1, 
-     0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1,  0,  1
+     1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0, 
+     0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1, 
+     9,  1,  9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
+     9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9, 
+     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1, 
+     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
+     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1, 
+     1,  1,  1,  9,  9,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
+     1,  1,  1,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9,  9,  1, 
+     9,  3,  3,  9,  3,  3,  3,  9,  3,  1,  1,  9,  1,  9,  1,  1, 
+     1,  1,  1,  9,  9,  1,  9,  3,  3,  9,  3,  3,  3,  9,  3,  1, 
+     1,  1,  9,  1,  1,  1,  9,  9,  1,  1,  0,  1,  0,  1,  2,  0, 
+     1,  2,  1,  0,  0,  0,  9,  1,  1,  1,  9,  9,  0,  0,  9,  0, 
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  1,  0,  0,  1,  1, 
+     9,  0,  9,  0,  0,  9,  0,  0,  0,  0,  0,  9,  1,  1,  0,  1, 
+     0,  9,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9,  0,  0, 
+     0,  0,  9,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  9,  0, 
+     0,  1,  0,  0,  9,  0,  0,  0,  0,  1,  0,  0,  1,  1,  0,  0, 
+     9,  0,  0,  0,  0,  1,  0,  0,  1,  1,  0,  0,  0,  9,  0,  0, 
+     0,  0,  0,  1,  1,  9,  1,  9,  9,  9,  9,  1,  1,  1,  1,  2, 
+    13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  1,  1,  2, 
+    13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  0,  9,  9, 
+     9,  0,  0,  1,  1,  1,  9,  0,  0,  1, 13,  9,  9, 13,  1,  9, 
+     9,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0,  1,  0,  0,  1,  0, 
+     0,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0,  0,  0,  1,  0, 
+     0,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0,  0,  1,  0,  0, 
+     1,  1,  1,  1,  1,  0,  1,  0,  1,  0,  3,  2,  3,  2,  1,  1, 
+     1,  1,  1,  0,  2,  3,  3,  3,  2,  2,  3,  3,  3,  2,  1,  1, 
+     1,  1,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  2,  3, 
+     3,  3,  2,  2,  3,  3,  3,  2,  1,  1,  1,  1,  0,  0,  1,  1, 
+     1,  1,  0,  0,  9,  9,  0,  1,  9,  0,  1,  1,  0,  0,  1,  5, 
+    13, 13,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  1,  1,  9,  5, 
+     1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  1,  3,  2,  3,  2,  1, 
+     0,  9,  1,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  1,  1, 
+     2,  2,  0,  0,  2,  2,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0, 
+     9,  9,  1,  1,  2,  2,  1,  1,  2,  2,  1,  1,  0,  1,  1,  1, 
+     9,  9,  9,  1,  1,  2,  2,  2,  2,  0,  1,  1,  1,  1,  1,  2, 
+     2,  2,  2,  9,  1,  1,  1,  1,  3,  3,  3,  3,  1,  1,  1,  1, 
+     1,  1,  1,  1,  1,  0,  1,  0,  0,  0,  0,  0,  1,  1,  1,  1, 
+     1,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  1,  0,  0, 
+     1,  1,  1,  1,  1,  0,  0,  0,  0,  9,  1,  1,  1,  1,  1,  0, 
+     0,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1,  0,  1
   };
 
   /** the input device */
@@ -868,7 +951,7 @@
   private int yy_endRead;
 
   /** number of newlines encountered up to the start of the matched text */
-  private int yyline;
+  // private int yyline;
 
   /** the number of characters up to the start of the matched text */
   private int yychar;
@@ -898,7 +981,8 @@
 	private String fBufferedContext = null;
 	private int fBufferedStart = 1;
 	private int fBufferedLength = 0;
-	private ContextRegionContainer fBufferedEmbeddedContainer = null;
+	private ITextRegion fBufferedEmbeddedContainer = null;
+	private ITextRegion fProxyUnknownRegion = null;
 	private String f_context = null;
 
 	// state stack for handling embedded regions
@@ -908,9 +992,11 @@
 	// a "hint" as to what state to enter once an embedded region has
 	//   been completed
 	private int fEmbeddedPostState = YYINITIAL;
+	
 	// the container used to create embedded regions
 	private ContextRegionContainer fEmbeddedContainer = null;
 	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";
+	private static final String PROXY_UNKNOWN_CONTEXT = "PROXY_UNKNOWN_CONTEXT";
 
 	private String context = null;
 	private int start = 0;
@@ -944,6 +1030,15 @@
 
 	private JSPParserRegionFactory fRegionFactory = new JSPParserRegionFactory();
 
+	// Is the embedded tag a JSP tag
+	private boolean fEmbeddedTag = false;
+	// Is the non-embedded tag a JSP tag
+	private boolean fContainerTag = false;
+	// Is the tokenizer in a non-embedded tag (between < and >)
+	private boolean fInTagContainer = false;
+	// Is the tokenizer in an embedded tag (between < and >)
+	private boolean fInTagEmbedded = false;
+
 	/**
 	 * user method 
 	 */
@@ -1047,6 +1142,7 @@
 			// TODO: parent region needs to be set .... but not sure where to get it from 
 			//		fEmbeddedContainer.setParent(parentRegion);
 		}
+		int initialLength = fEmbeddedContainer.getRegions().size();
 		containerStart = fEmbeddedContainer.getStart();
 		while (notFinished) {
 			// add the region to the container
@@ -1069,6 +1165,9 @@
 				// determine if a block tag scan is necessary
 				if (internalContext == XML_TAG_NAME) {
 					internalTagName = yytext();
+					if (endTagName != null && endTagName.length() == 0){
+						endTagName = internalTagName;
+					}
 					if(!isNestable(internalTagName)) {
 						internalTagName = null;
 						// snagged a tag name we shouldn't have
@@ -1123,18 +1222,18 @@
 				Logger.logException(f);
 			}
 			boolean isEndingType = yystate() == ST_ABORT_EMBEDDED;
+			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
 			if(!isEndingType) {
 				// check for ending context
 				if (endTagName == null) {
 					for (int i = 0; i < endTypes.length; i++) {
-						isEndingType = isEndingType || (internalContext == endTypes[i]);
+						isEndingType = isEndingType || (internalContext == endTypes[i]) || (embeddedList.size() - initialLength) >= 2 && (embeddedList.get(embeddedList.size()-1)).getType() == endTypes[i];
 					}
 				}
 				else {
 					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);
 				}
 			}
-			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
 			notFinished = notFinished && ((!isEndingType) && !isEOF() && (endTagName != null || internalContext != UNDEFINED) && !(internalContext == PROXY_CONTEXT && (embeddedList.get(embeddedList.size()-1)).getType() == UNDEFINED));
 		}
 		// finish adding the last context
@@ -1268,215 +1367,221 @@
  */
 private final String doScan(String searchString, boolean requireTailSeparator, boolean allowJSP, boolean allowCDATA, String searchContext, int exitState, int immediateFallbackState) throws IOException {
 	boolean stillSearching = true;
-	// Disable further block (probably)
-	fIsBlockingEnabled = false;
-	int searchStringLength = searchString.length();
-	int n = 0;
-	char lastCheckChar;
-	int i;
-	boolean same = false;
-	// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE
-	boolean checkJSPs = allowJSP && !fForbidJSP;
-	boolean checkedForJSPsOnce = !checkJSPs;
-	boolean checkedJSPsAtStartOnce = false;
-	
-	while (stillSearching) {
-		n = 0;
-		// Ensure that enough data from the input exists to compare against the search String.
-		n = yy_advance();
-		while(n != YYEOF && yy_currentPos < searchStringLength)
+	boolean wasBlockingEnabled = fIsBlockingEnabled;
+	try {
+		// Disable further block (probably)
+		fIsBlockingEnabled = false;
+		int searchStringLength = searchString.length();
+		int n = 0;
+		char lastCheckChar;
+		int i;
+		boolean same = false;
+		// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE
+		boolean checkJSPs = allowJSP && !fForbidJSP;
+		boolean checkedForJSPsOnce = !checkJSPs;
+		boolean checkedJSPsAtStartOnce = false;
+		
+		while (stillSearching) {
+			n = 0;
+			// Ensure that enough data from the input exists to compare against the search String.
 			n = yy_advance();
-//		c = (char) n;
-		// If the input was too short or we've exhausted the input, stop immediately.
-		if (n == YYEOF && checkedForJSPsOnce) {
-			stillSearching = false;
-		}
-		else {
-			/**
-			 * Look for starting JSPs "<%"
-			 */
-			checkedForJSPsOnce = true;
-			// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs
-			// ---
-			// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
-			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
-			if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
-				yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-			// 2) yy_currentPos - jspstarter.length : There's not searchStringLength of input available; check for a JSP 2 spots back in what we could read
-			// ---
-			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
-			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
-			// spill over the end of the buffer while checking.
-			else if(checkJSPs && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
-					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-			// 3) yy_currentPos..(yy_currentPos+jspStartlength-1) : Check at the start of the block one time
-			// ---
-			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
-			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
-			else if(checkJSPs && !checkedJSPsAtStartOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
-					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
-				checkedJSPsAtStartOnce = true;
-				fLastInternalBlockStart = yy_markedPos = yy_startRead;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-
-
-			/**
-			 * Look for starting CDATA "<![CDATA["
-			 */
-			// 1) yy_currentPos - searchStringLength: There's at least searchStringLength of input available; once that's read, check for CDATA
-			// ---
-			// Look for a CDATA beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
-			// Ensure that we've not encountered a complete block (<[!CDATA[]]>) that was *shorter* than the closeTagString and
-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
-/*			if(checkCDATA && yy_currentPos > searchStringLength && yy_currentPos + searchStringLength < yy_buffer.length && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
-				charsMatch(cdataStarter, yy_buffer, 0, yy_currentPos - searchStringLength)) {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				// go to a state where CDATA can be found
-				if (fEmbeddedContainer == null) {
-					fEmbeddedContainer = new ContextRegionContainer();
-					fEmbeddedContainer.setType(searchContext);
-					fEmbeddedContainer.setStart(yychar);
-				}
-				ITextRegion newToken = fRegionFactory.createToken(searchContext, yychar, yylength(), yylength());
-				fEmbeddedContainer.getRegions().add(newToken);
-				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
-				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
-				yybegin(YYINITIAL);
-				String context = primGetNextToken();
-				if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {
-					assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);
-				}
-				yybegin(resumeState);
-				return searchContext;
-			}
-*//*
-			// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read
-			// ---
-			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
-			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
-			// spill over the end of the buffer while checking.
-			else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
-					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-			// 3) yy_currentPos : Check at the start of the block one time
-			// ---
-			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
-			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
-			else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
-					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
-				checkedForCDATAOnce = true;
-				fLastInternalBlockStart = yy_markedPos = yy_startRead;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-*/
-			// Check the characters in the target versus the last targetLength characters read from the buffer
-			// and see if it matches
-			if (n == YYEOF) {
+			while(n != YYEOF && yy_currentPos < searchStringLength)
+				n = yy_advance();
+	//		c = (char) n;
+			// If the input was too short or we've exhausted the input, stop immediately.
+			if (n == YYEOF && checkedForJSPsOnce) {
 				stillSearching = false;
 			}
 			else {
-				same = true;
-				// safety check for array accesses
-				if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
-					for(i = 0; i < searchStringLength; i++) {
-						if(same && fIsCaseSensitiveBlocking)
-							same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
-						else if(same && !fIsCaseSensitiveBlocking)
-							same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
+				/**
+				 * Look for starting JSPs "<%"
+				 */
+				checkedForJSPsOnce = true;
+				// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs
+				// ---
+				// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
+				// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
+				// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
+				if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
+					yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {
+					fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
+					yy_currentPos = yy_markedPos + 1;
+					int resumeState = yystate();
+					yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
+					if(yy_markedPos == yy_startRead) {
+						String jspContext = primGetNextToken();
+						yybegin(resumeState);
+						return jspContext;
+					}
+					return searchContext;
+				}
+				// 2) yy_currentPos - jspstarter.length : There's not searchStringLength of input available; check for a JSP 2 spots back in what we could read
+				// ---
+				// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
+				// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
+				// spill over the end of the buffer while checking.
+				else if(checkJSPs && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
+						yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
+					fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
+					yy_currentPos = yy_markedPos + 1;
+					int resumeState = yystate();
+					yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
+					if(yy_markedPos == yy_startRead) {
+						String jspContext = primGetNextToken();
+						yybegin(resumeState);
+						return jspContext;
+					}
+					return searchContext;
+				}
+				// 3) yy_currentPos..(yy_currentPos+jspStartlength-1) : Check at the start of the block one time
+				// ---
+				// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
+				// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
+				else if(checkJSPs && !checkedJSPsAtStartOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
+						yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
+					checkedJSPsAtStartOnce = true;
+					fLastInternalBlockStart = yy_markedPos = yy_startRead;
+					yy_currentPos = yy_markedPos + 1;
+					int resumeState = yystate();
+					yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
+					if(yy_markedPos == yy_startRead) {
+						String jspContext = primGetNextToken();
+						yybegin(resumeState);
+						return jspContext;
+					}
+					return searchContext;
+				}
+	
+	
+				/**
+				 * Look for starting CDATA "<![CDATA["
+				 */
+				// 1) yy_currentPos - searchStringLength: There's at least searchStringLength of input available; once that's read, check for CDATA
+				// ---
+				// Look for a CDATA beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
+				// Ensure that we've not encountered a complete block (<[!CDATA[]]>) that was *shorter* than the closeTagString and
+				// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
+	/*			if(checkCDATA && yy_currentPos > searchStringLength && yy_currentPos + searchStringLength < yy_buffer.length && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
+					charsMatch(cdataStarter, yy_buffer, 0, yy_currentPos - searchStringLength)) {
+					fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
+					yy_currentPos = yy_markedPos + 1;
+					int resumeState = yystate();
+					// go to a state where CDATA can be found
+					if (fEmbeddedContainer == null) {
+						fEmbeddedContainer = new ContextRegionContainer();
+						fEmbeddedContainer.setType(searchContext);
+						fEmbeddedContainer.setStart(yychar);
+					}
+					ITextRegion newToken = fRegionFactory.createToken(searchContext, yychar, yylength(), yylength());
+					fEmbeddedContainer.getRegions().add(newToken);
+					fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
+					fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
+					yybegin(YYINITIAL);
+					String context = primGetNextToken();
+					if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {
+						assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);
+					}
+					yybegin(resumeState);
+					return searchContext;
+				}
+	*//*
+				// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read
+				// ---
+				// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
+				// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
+				// spill over the end of the buffer while checking.
+				else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
+						yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
+					fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
+					yy_currentPos = yy_markedPos + 1;
+					int resumeState = yystate();
+					yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
+					if(yy_markedPos == yy_startRead) {
+						String jspContext = primGetNextToken();
+						yybegin(resumeState);
+						return jspContext;
+					}
+					return searchContext;
+				}
+				// 3) yy_currentPos : Check at the start of the block one time
+				// ---
+				// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
+				// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
+				else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
+						yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
+					checkedForCDATAOnce = true;
+					fLastInternalBlockStart = yy_markedPos = yy_startRead;
+					yy_currentPos = yy_markedPos + 1;
+					int resumeState = yystate();
+					yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
+					if(yy_markedPos == yy_startRead) {
+						String jspContext = primGetNextToken();
+						yybegin(resumeState);
+						return jspContext;
+					}
+					return searchContext;
+				}
+	*/
+				// Check the characters in the target versus the last targetLength characters read from the buffer
+				// and see if it matches
+				if (n == YYEOF) {
+					stillSearching = false;
+				}
+				else {
+					same = true;
+					// safety check for array accesses
+					if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
+						for(i = 0; i < searchStringLength && same; i++) {
+							if(fIsCaseSensitiveBlocking)
+								same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
+							else
+								same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
+						}
+					}
+					// safety check failed; no match is possible right now
+					else {
+						same = false;
 					}
 				}
-				// safety check failed; no match is possible right now
+				if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
+					// Additional check for close tags to ensure that targetString="</script" doesn't match
+					// "</scriptS"
+					lastCheckChar = yy_buffer[yy_currentPos];
+					// Succeed on "</script>" and "</script "
+					if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
+						stillSearching = false;
+				}
 				else {
-					same = false;
+					stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
 				}
 			}
-			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
-				// Additional check for close tags to ensure that targetString="</script" doesn't match
-				// "</scriptS"
-				lastCheckChar = yy_buffer[yy_currentPos];
-				// Succeed on "</script>" and "</script "
-				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
-					stillSearching = false;
-			}
-			else {
-				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
+		}
+		if (n != YYEOF || same) {
+			// We've stopped short of the end or definitely found a match
+			yy_markedPos = yy_currentPos - searchStringLength;
+			yy_currentPos = yy_markedPos + 1;
+			// If the searchString occurs at the very beginning of what would have
+			// been a Block, resume scanning normally immediately
+			if (yy_markedPos == yy_startRead) {
+				yybegin(immediateFallbackState);
+				return primGetNextToken();
 			}
 		}
-	}
-	if (n != YYEOF || same) {
-		// We've stopped short of the end or definitely found a match
-		yy_markedPos = yy_currentPos - searchStringLength;
-		yy_currentPos = yy_markedPos + 1;
-		// If the searchString occurs at the very beginning of what would have
+		else {
+			// We ran through the rest of the input
+			yy_markedPos = yy_currentPos;
+			yy_currentPos++;
+		}
+		yybegin(exitState);
+		// If the ending occurs at the very beginning of what would have
 		// been a Block, resume scanning normally immediately
-		if (yy_markedPos == yy_startRead) {
-			yybegin(immediateFallbackState);
+		if(yy_markedPos == yy_startRead)
 			return primGetNextToken();
-		}
+		return searchContext;
 	}
-	else {
-		// We ran through the rest of the input
-		yy_markedPos = yy_currentPos;
-		yy_currentPos++;
+	finally {
+		fIsBlockingEnabled = wasBlockingEnabled;
 	}
-	yybegin(exitState);
-	// If the ending occurs at the very beginning of what would have
-	// been a Block, resume scanning normally immediately
-	if(yy_markedPos == yy_startRead)
-		return primGetNextToken();
-	return searchContext;
 }
 /**
  * user method 
@@ -1548,6 +1653,8 @@
 			fIsBlockingEnabled = true;
 		} else if (f_context == XML_END_TAG_OPEN) {
 			fIsBlockingEnabled = false;
+		} else if (f_context == PROXY_UNKNOWN_CONTEXT) {
+			fBufferedEmbeddedContainer = fProxyUnknownRegion;
 		}
 		fBufferedContext = f_context;
 		fBufferedStart = yychar;
@@ -1643,7 +1750,7 @@
 		yy_endRead = 0;
 	
 		/* number of newlines encountered up to the start of the matched text */
-		yyline = 0;
+		//yyline = 0;
 	
 		/* the number of characters up to the start of the matched text */
 		yychar = 0;
@@ -1711,6 +1818,11 @@
 		//  context as usual.
 		return doScan("--%>", false, false, true, JSP_COMMENT_TEXT, ST_JSP_COMMENT_END, ST_JSP_COMMENT_END);
 	}
+	
+	/* user method */
+	private boolean isJspTag() {
+		return (fContainerTag && fEmbeddedContainer != null) || (fContainerTag && fInTagContainer) || (fEmbeddedTag && fInTagEmbedded);
+	}
 
 
   /**
@@ -1740,10 +1852,10 @@
    * @return         the unpacked transition table
    */
   private static int [] yy_unpack(String packed) {
-    int [] trans = new int[31595];
+    int [] trans = new int[35287];
     int i = 0;  /* index in packed string  */
     int j = 0;  /* index in unpacked array */
-    while (i < 8206) {
+    while (i < 9344) {
       int count = packed.charAt(i++);
       int value = packed.charAt(i++);
       value--;
@@ -2012,31 +2124,6 @@
 
       yychar+= yylength();
 
-      boolean yy_counted = false;
-      for (yy_currentPos = yy_startRead; yy_currentPos < yy_markedPos;
-                                                      yy_currentPos++) {
-        switch (yy_buffer[yy_currentPos]) {
-        case '\r':
-          yyline++;
-          yy_counted = true;
-          break;
-        case '\n':
-          if (yy_counted)
-            yy_counted = false;
-          else {
-            yyline++;
-          }
-          break;
-        default:
-          yy_counted = false;
-        }
-      }
-
-      if (yy_counted) {
-        if ( yy_advance() == '\n' ) yyline--;
-        if ( !yy_atEOF ) yy_currentPos--;
-      }
-
       yy_action = -1;
 
       yy_currentPos = yy_startRead = yy_markedPos;
@@ -2075,10 +2162,48 @@
 
       switch (yy_action) {    
 
-        case 622: 
-        case 627: 
-        case 634: 
-        case 639: 
+        case 124: 
+        case 129: 
+        case 130: 
+        case 289: 
+        case 295: 
+        case 296: 
+        case 433: 
+        case 436: 
+        case 543: 
+          {  /* only allow for non-JSP tags for this does not obey JSP quoting rules */
+	if(Debug.debugTokenizer)
+		dump("attr value");//$NON-NLS-1$
+	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
+	fEmbeddedPostState = ST_XML_EQUALS;
+        yybegin(ST_XML_ATTRIBUTE_NAME);
+        return XML_TAG_ATTRIBUTE_VALUE;
+ }
+        case 718: break;
+        case 169: 
+        case 174: 
+        case 175: 
+        case 349: 
+        case 355: 
+        case 356: 
+        case 470: 
+        case 472: 
+        case 474: 
+        case 476: 
+        case 559: 
+          {  /* JSP attribute values have escape semantics */
+	if(Debug.debugTokenizer)
+		dump("jsp attr value");//$NON-NLS-1$
+	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
+	fEmbeddedPostState = ST_XML_EQUALS;
+	yybegin(ST_XML_ATTRIBUTE_NAME);
+	return XML_TAG_ATTRIBUTE_VALUE;
+ }
+        case 719: break;
+        case 685: 
+        case 690: 
+        case 697: 
+        case 702: 
           { 
 	if(Debug.debugTokenizer)
 		dump("jsp directive tag name");//$NON-NLS-1$
@@ -2087,8 +2212,8 @@
         yybegin(ST_XML_ATTRIBUTE_NAME);
         return JSP_DIRECTIVE_NAME;
  }
-        case 655: break;
-        case 597: 
+        case 720: break;
+        case 660: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XSL processing instruction target");//$NON-NLS-1$
@@ -2096,14 +2221,14 @@
         yybegin(ST_XML_PI_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 656: break;
-        case 580: 
-        case 583: 
-        case 584: 
-        case 585: 
-        case 586: 
-        case 587: 
-        case 588: 
+        case 721: break;
+        case 643: 
+        case 646: 
+        case 647: 
+        case 648: 
+        case 649: 
+        case 650: 
+        case 651: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nCDATA start");//$NON-NLS-1$
@@ -2111,8 +2236,8 @@
 	yybegin(ST_CDATA_TEXT);
 	return XML_CDATA_OPEN;
  }
-        case 657: break;
-        case 572: 
+        case 722: break;
+        case 635: 
           { 
 	if(Debug.debugTokenizer)
 		dump("jsp:root tag name");//$NON-NLS-1$
@@ -2121,32 +2246,32 @@
         yybegin(ST_XML_ATTRIBUTE_NAME);
         return JSP_ROOT_TAG_NAME;
  }
-        case 658: break;
-        case 563: 
+        case 723: break;
+        case 626: 
           { 
 	if(Debug.debugTokenizer)
 		dump("element");//$NON-NLS-1$
 	yybegin(ST_XML_ELEMENT_DECLARATION);
 	return XML_ELEMENT_DECLARATION;
  }
-        case 659: break;
-        case 562: 
+        case 724: break;
+        case 625: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist");//$NON-NLS-1$
 	yybegin(ST_XML_ATTLIST_DECLARATION);
 	return XML_ATTLIST_DECLARATION;
  }
-        case 660: break;
-        case 561: 
+        case 725: break;
+        case 624: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype");//$NON-NLS-1$
 	yybegin(ST_XML_DOCTYPE_DECLARATION);
 	return XML_DOCTYPE_DECLARATION;
  }
-        case 661: break;
-        case 546: 
+        case 726: break;
+        case 609: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype external id");//$NON-NLS-1$
@@ -2154,8 +2279,8 @@
 	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
 	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
  }
-        case 662: break;
-        case 545: 
+        case 727: break;
+        case 608: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype external id");//$NON-NLS-1$
@@ -2163,8 +2288,8 @@
 	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
 	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
  }
-        case 663: break;
-        case 539: 
+        case 728: break;
+        case 602: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction target");//$NON-NLS-1$
@@ -2173,33 +2298,33 @@
         yybegin(ST_DHTML_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 664: break;
-        case 514: 
-        case 555: 
-        case 556: 
+        case 729: break;
+        case 577: 
+        case 618: 
+        case 619: 
           { 
 	return JSP_VBL_QUOTED_CONTENT;
  }
-        case 665: break;
-        case 504: 
-        case 551: 
-        case 552: 
+        case 730: break;
+        case 567: 
+        case 614: 
+        case 615: 
           { 
 	return JSP_EL_QUOTED_CONTENT;
  }
-        case 666: break;
-        case 496: 
+        case 731: break;
+        case 558: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nJSP comment close");//$NON-NLS-1$
 	yybegin(YYINITIAL);
 	return JSP_COMMENT_CLOSE;
  }
-        case 667: break;
-        case 483: 
+        case 732: break;
+        case 545: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
@@ -2217,11 +2342,11 @@
 	fEmbeddedPostState = ST_XML_EQUALS;
 	return PROXY_CONTEXT;
  }
-        case 668: break;
-        case 482: 
+        case 733: break;
+        case 544: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
@@ -2239,15 +2364,15 @@
 	fEmbeddedPostState = ST_XML_EQUALS;
 	return PROXY_CONTEXT;
  }
-        case 669: break;
-        case 476: 
+        case 734: break;
+        case 536: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nCharRef");//$NON-NLS-1$
 	return XML_CHAR_REFERENCE;
  }
-        case 670: break;
-        case 473: 
+        case 735: break;
+        case 533: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\ncomment start");//$NON-NLS-1$
@@ -2256,20 +2381,20 @@
 	yybegin(ST_XML_COMMENT);
 	return XML_COMMENT_OPEN;
  }
-        case 671: break;
-        case 472: 
-        case 491: 
-        case 494: 
-        case 497: 
-        case 498: 
-        case 500: 
-        case 502: 
-        case 505: 
-        case 507: 
-        case 508: 
-        case 510: 
-        case 512: 
-        case 515: 
+        case 736: break;
+        case 532: 
+        case 553: 
+        case 556: 
+        case 560: 
+        case 561: 
+        case 563: 
+        case 565: 
+        case 568: 
+        case 570: 
+        case 571: 
+        case 573: 
+        case 575: 
+        case 578: 
           { 
 	/* JSP comment begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2311,7 +2436,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspCommentStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP comment start");//$NON-NLS-1$
@@ -2348,12 +2473,16 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+		}
 		return PROXY_CONTEXT;
 	}
  }
-        case 672: break;
-        case 381: 
-        case 382: 
+        case 737: break;
+        case 417: 
+        case 418: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction target");//$NON-NLS-1$
@@ -2362,8 +2491,8 @@
         yybegin(ST_XML_PI_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 673: break;
-        case 380: 
+        case 738: break;
+        case 416: 
           { 
 	if(Debug.debugTokenizer)
 		dump("comment end");//$NON-NLS-1$
@@ -2371,16 +2500,16 @@
 	yybegin(YYINITIAL);
 	return XML_COMMENT_CLOSE;
  }
-        case 674: break;
-        case 379: 
+        case 739: break;
+        case 415: 
           { 
 	if(Debug.debugTokenizer)
 		dump("CDATA end");//$NON-NLS-1$
 	yybegin(fStateStack.pop());
 	return XML_CDATA_CLOSE;
  }
-        case 675: break;
-        case 378: 
+        case 740: break;
+        case 413: 
           { 
 	yybegin(ST_JSP_VBL);
 	if(yylength() > 2)
@@ -2393,15 +2522,15 @@
 	yybegin(YYINITIAL);
 	return PROXY_CONTEXT;
  }
-        case 676: break;
-        case 377: 
+        case 741: break;
+        case 412: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nPEReference");//$NON-NLS-1$
 	return XML_PE_REFERENCE;
  }
-        case 677: break;
-        case 376: 
+        case 742: break;
+        case 410: 
           { 
 	yybegin(ST_JSP_EL);
 	if(yylength() > 2)
@@ -2414,27 +2543,27 @@
 	yybegin(YYINITIAL);
 	return PROXY_CONTEXT;
  }
-        case 678: break;
-        case 373: 
+        case 743: break;
+        case 406: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nEntityRef");//$NON-NLS-1$
 	return XML_ENTITY_REFERENCE;
  }
-        case 679: break;
-        case 367: 
-        case 407: 
-        case 415: 
-        case 422: 
-        case 427: 
-        case 432: 
-        case 437: 
-        case 443: 
-        case 449: 
-        case 453: 
-        case 458: 
-        case 463: 
-        case 469: 
+        case 744: break;
+        case 400: 
+        case 457: 
+        case 467: 
+        case 482: 
+        case 487: 
+        case 492: 
+        case 497: 
+        case 503: 
+        case 509: 
+        case 513: 
+        case 518: 
+        case 523: 
+        case 529: 
           { 
 	/* JSP expression begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2470,7 +2599,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspExpressionStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP expression start");//$NON-NLS-1$
@@ -2501,23 +2630,28 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+		}
+		
 		return PROXY_CONTEXT;
 	}
  }
-        case 680: break;
-        case 366: 
-        case 406: 
-        case 414: 
-        case 421: 
-        case 426: 
-        case 431: 
-        case 436: 
-        case 442: 
-        case 448: 
-        case 452: 
-        case 457: 
-        case 462: 
-        case 468: 
+        case 745: break;
+        case 399: 
+        case 456: 
+        case 466: 
+        case 481: 
+        case 486: 
+        case 491: 
+        case 496: 
+        case 502: 
+        case 508: 
+        case 512: 
+        case 517: 
+        case 522: 
+        case 528: 
           { 
 	/* JSP declaration begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2553,7 +2687,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDeclarationStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP declaration start");//$NON-NLS-1$
@@ -2584,23 +2718,27 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+		}
 		return PROXY_CONTEXT;
 	}
  }
-        case 681: break;
-        case 365: 
-        case 405: 
-        case 413: 
-        case 420: 
-        case 425: 
-        case 430: 
-        case 435: 
-        case 441: 
-        case 447: 
-        case 451: 
-        case 456: 
-        case 461: 
-        case 467: 
+        case 746: break;
+        case 398: 
+        case 455: 
+        case 465: 
+        case 480: 
+        case 485: 
+        case 490: 
+        case 495: 
+        case 501: 
+        case 507: 
+        case 511: 
+        case 516: 
+        case 521: 
+        case 527: 
           { 
 	/* JSP directive begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2636,7 +2774,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDirectiveStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP declaration start");//$NON-NLS-1$
@@ -2670,60 +2808,60 @@
 		return PROXY_CONTEXT;
 	}
  }
-        case 682: break;
-        case 355: 
+        case 747: break;
+        case 388: 
           { 
 	yybegin(ST_JSP_VBL_DQUOTES_END);
 	return JSP_VBL_QUOTED_CONTENT;
  }
-        case 683: break;
-        case 351: 
+        case 748: break;
+        case 384: 
           { 
 	yybegin(ST_JSP_VBL_SQUOTES_END);
 	return JSP_VBL_QUOTED_CONTENT;
  }
-        case 684: break;
-        case 349: 
+        case 749: break;
+        case 382: 
           { 
 	fELlevel++;
 	if(fELlevel == 1) {
 		return JSP_VBL_OPEN;
 	}
  }
-        case 685: break;
-        case 339: 
+        case 750: break;
+        case 372: 
           { 
 	yybegin(ST_JSP_EL_DQUOTES_END);
 	return JSP_EL_QUOTED_CONTENT;
  }
-        case 686: break;
-        case 335: 
+        case 751: break;
+        case 368: 
           { 
 	yybegin(ST_JSP_EL_SQUOTES_END);
 	return JSP_EL_QUOTED_CONTENT;
  }
-        case 687: break;
-        case 333: 
+        case 752: break;
+        case 366: 
           { 
 	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
 	return JSP_EL_CONTENT;
  }
-        case 688: break;
-        case 332: 
+        case 753: break;
+        case 365: 
           { 
 	fELlevel++;
 	if(fELlevel == 1) {
 		return JSP_EL_OPEN;
 	}
  }
-        case 689: break;
-        case 329: 
+        case 754: break;
+        case 362: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_DQUOTED_VBL);
-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
+	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});
 	// abort early when an unescaped double quote is found in the VBL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2732,14 +2870,14 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 690: break;
-        case 328: 
+        case 755: break;
+        case 361: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_DQUOTED_EL);
-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
+	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});
 	// abort early when an unescaped double quote is found in the EL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2748,14 +2886,14 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 691: break;
-        case 326: 
+        case 756: break;
+        case 360: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_SQUOTED_VBL);
-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
+	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});
 	// abort early when an unescaped single quote is found in the VBL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2764,14 +2902,14 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 692: break;
-        case 325: 
+        case 757: break;
+        case 359: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_SQUOTED_EL);
-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
+	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});
 	// abort early when an unescaped single quote is found in the EL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2780,11 +2918,11 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 693: break;
-        case 324: 
+        case 758: break;
+        case 357: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", genericEndTagOpen");//$NON-NLS-1$
 	}
 	int incomingState = yystate();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
@@ -2797,15 +2935,15 @@
         yybegin(incomingState);
 	return PROXY_CONTEXT;
  }
-        case 694: break;
-        case 283: 
-        case 295: 
+        case 759: break;
         case 301: 
+        case 315: 
+        case 321: 
           { 
 	return XML_DOCTYPE_INTERNAL_SUBSET;
  }
-        case 695: break;
-        case 271: 
+        case 760: break;
+        case 287: 
           { 
 	String tagName = yytext().substring(1);
 	// pushback to just after the opening bracket
@@ -2814,7 +2952,7 @@
 	 * If this tag can not be nested or we're already searching for an
 	 * attribute name, equals, or value, return immediately.
 	 */
-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
+	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
 		yybegin(ST_XML_TAG_NAME);
 		return XML_TAG_OPEN;
 	}
@@ -2830,8 +2968,8 @@
 	yybegin(ST_XML_ATTRIBUTE_NAME);
 	return PROXY_CONTEXT;
  }
-        case 696: break;
-        case 269: 
+        case 761: break;
+        case 285: 
           { 
 	String tagName = yytext().substring(1);
 	// pushback to just after the opening bracket
@@ -2840,7 +2978,7 @@
 	 * If this tag can not be nested or we're already searching for an
 	 * attribute name, equals, or value, return immediately.
 	 */
-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
+	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
 		yybegin(ST_XML_TAG_NAME);
 		return XML_TAG_OPEN;
 	}
@@ -2856,20 +2994,53 @@
 	yybegin(ST_XML_EQUALS);
 	return PROXY_CONTEXT;
  }
-        case 697: break;
-        case 267: 
+        case 762: break;
+        case 283: 
           { 
         yybegin(YYINITIAL);
 	fEmbeddedHint = UNDEFINED;
 	if(Debug.debugTokenizer)
 		dump("empty tag close");//$NON-NLS-1$
-        return XML_EMPTY_TAG_CLOSE;
+
+	if (fEmbeddedContainer != null)
+		fInTagEmbedded = false;
+	else
+		fInTagContainer = false;
+
+	return XML_EMPTY_TAG_CLOSE;
  }
-        case 698: break;
-        case 125: 
+        case 763: break;
+        case 274: 
           { 
+	if(Debug.debugTokenizer)
+		dump("JSP end");//$NON-NLS-1$
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		if(fStateStack.peek()!=YYINITIAL)
+			System.out.println("end embedded region");//$NON-NLS-1$
+	}
+	yybegin(fStateStack.pop());
+	return JSP_DIRECTIVE_CLOSE;
+ }
+        case 764: break;
+        case 272: 
+          { 
+	if(Debug.debugTokenizer)
+		dump("JSP end");//$NON-NLS-1$
+	if (Debug.debugTokenizer) {
+		if(fStateStack.peek()!=YYINITIAL)
+			System.out.println("end embedded region");//$NON-NLS-1$
+	}
+	yybegin(fStateStack.pop());
+	return JSP_CLOSE;
+ }
+        case 765: break;
+        case 127: 
+        case 172: 
+          { 
+	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_DQUOTE : JSP_TAG_ATTRIBUTE_VALUE_DQUOTE;
+
+	if (Debug.debugTokenizer) {
+		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
@@ -2877,18 +3048,22 @@
 	fStateStack.push(yystate());
 	if(Debug.debugTokenizer)
 		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$
-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_DQUOTE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE);
+	assembleEmbeddedContainer(type, type);
 	fStateStack.pop();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
 	fEmbeddedPostState = ST_XML_EQUALS;
 	yybegin(ST_XML_ATTRIBUTE_NAME);
+	if (fEmbeddedContainer.getLastRegion().getType() == UNDEFINED) {
+		fProxyUnknownRegion = fRegionFactory.createToken(XML_TAG_ATTRIBUTE_VALUE, fEmbeddedContainer.getStart(), fEmbeddedContainer.getTextLength(), fEmbeddedContainer.getLength());
+		return PROXY_UNKNOWN_CONTEXT;
+	}
 	return PROXY_CONTEXT;
  }
-        case 699: break;
-        case 123: 
+        case 766: break;
+        case 125: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", unquoted genericTagOpen");//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
@@ -2903,36 +3078,18 @@
 	fEmbeddedPostState = ST_XML_EQUALS;
 	return PROXY_CONTEXT;
  }
-        case 700: break;
-        case 122: 
-        case 127: 
-        case 128: 
-        case 273: 
-        case 277: 
-        case 278: 
-        case 387: 
-        case 390: 
-        case 481: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr value");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 701: break;
-        case 121: 
+        case 767: break;
+        case 123: 
           { 
 	if(Debug.debugTokenizer)
 		dump("equals");//$NON-NLS-1$
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_XML_ATTRIBUTE_VALUE);
+        yybegin(isJspTag() ? ST_JSP_ATTRIBUTE_VALUE : ST_XML_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 702: break;
-        case 120: 
+        case 768: break;
+        case 122: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attr name");//$NON-NLS-1$
@@ -2941,61 +3098,71 @@
         yybegin(ST_XML_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 703: break;
-        case 116: 
-        case 117: 
+        case 769: break;
         case 118: 
-        case 268: 
-        case 386: 
-        case 480: 
-        case 520: 
-        case 521: 
-        case 540: 
-        case 541: 
-        case 559: 
-        case 560: 
-        case 573: 
-        case 582: 
-        case 590: 
-        case 592: 
-        case 594: 
-        case 596: 
-        case 599: 
-        case 605: 
-        case 606: 
-        case 607: 
-        case 608: 
-        case 609: 
-        case 615: 
-        case 616: 
-        case 617: 
-        case 618: 
-        case 619: 
-        case 625: 
-        case 626: 
-        case 628: 
-        case 629: 
-        case 635: 
+        case 119: 
+        case 120: 
+        case 284: 
+        case 430: 
+        case 542: 
+        case 583: 
+        case 584: 
+        case 603: 
+        case 604: 
+        case 622: 
+        case 623: 
         case 636: 
-        case 637: 
-        case 638: 
-        case 644: 
         case 645: 
-        case 646: 
-        case 647: 
-        case 650: 
-        case 651: 
         case 653: 
+        case 655: 
+        case 657: 
+        case 659: 
+        case 662: 
+        case 668: 
+        case 669: 
+        case 670: 
+        case 671: 
+        case 672: 
+        case 678: 
+        case 679: 
+        case 680: 
+        case 681: 
+        case 682: 
+        case 688: 
+        case 689: 
+        case 691: 
+        case 692: 
+        case 698: 
+        case 699: 
+        case 700: 
+        case 701: 
+        case 707: 
+        case 708: 
+        case 709: 
+        case 710: 
+        case 713: 
+        case 714: 
+        case 716: 
           { 
 	if(Debug.debugTokenizer)
 		dump("tag name");//$NON-NLS-1$
+    String tagname = yytext();
+    boolean jspTag = tagname.indexOf(':') != -1;
+	if (fEmbeddedContainer != null) {
+    	fEmbeddedTag = jspTag;
+		fInTagEmbedded = true;
+    }
+	else {
+		fContainerTag = jspTag;
+		fInTagContainer = true;
+	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
 	fEmbeddedPostState = ST_XML_EQUALS;
         yybegin(ST_XML_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 704: break;
-        case 114: 
+        case 770: break;
+        case 116: 
           { 
 	if(Debug.debugTokenizer)
 		dump("tag close");//$NON-NLS-1$
@@ -3007,58 +3174,68 @@
 	}
 	else
         	yybegin(YYINITIAL);
-        return XML_TAG_CLOSE;
+
+	if (fEmbeddedContainer != null)
+		fInTagEmbedded = false;
+	else
+		fInTagContainer = false;
+
+	return XML_TAG_CLOSE;
  }
-        case 705: break;
-        case 107: 
-        case 111: 
-        case 263: 
+        case 771: break;
+        case 109: 
+        case 113: 
+        case 277: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attr value");//$NON-NLS-1$
         yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
         return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 706: break;
-        case 106: 
+        case 772: break;
+        case 108: 
           { 
 	if(Debug.debugTokenizer)
 		dump("equals");//$NON-NLS-1$
         yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 707: break;
-        case 105: 
+        case 773: break;
+        case 107: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attr name");//$NON-NLS-1$
         yybegin(ST_JSP_DIRECTIVE_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 708: break;
-        case 102: 
+        case 774: break;
+        case 104: 
           { 
 	if(Debug.debugTokenizer)
 		dump("JSP directive name");//$NON-NLS-1$
 	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
 	return JSP_DIRECTIVE_NAME;
  }
-        case 709: break;
-        case 98: 
-        case 99: 
+        case 775: break;
         case 100: 
+        case 101: 
+        case 102: 
           { 
 	if(Debug.debugTokenizer)
 		dump("JSP code content");//$NON-NLS-1$
 	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
  }
-        case 710: break;
-        case 94: 
+        case 776: break;
         case 96: 
-        case 97: 
-        case 253: 
-        case 254: 
-        case 257: 
+        case 98: 
+        case 99: 
+        case 265: 
+        case 266: 
+        case 267: 
+        case 270: 
+        case 271: 
+        case 424: 
+        case 427: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
@@ -3067,8 +3244,8 @@
         yybegin(ST_DHTML_ATTRIBUTE_NAME);
         return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 711: break;
-        case 93: 
+        case 777: break;
+        case 95: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction '='");//$NON-NLS-1$
@@ -3077,16 +3254,16 @@
         yybegin(ST_DHTML_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 712: break;
-        case 92: 
+        case 778: break;
+        case 94: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
         yybegin(ST_DHTML_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 713: break;
-        case 90: 
+        case 779: break;
+        case 92: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction end");//$NON-NLS-1$
@@ -3094,10 +3271,10 @@
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 714: break;
-        case 84: 
+        case 780: break;
         case 86: 
-        case 244: 
+        case 88: 
+        case 254: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction attribute value");//$NON-NLS-1$
@@ -3106,8 +3283,8 @@
         yybegin(ST_XML_PI_ATTRIBUTE_NAME);
         return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 715: break;
-        case 83: 
+        case 781: break;
+        case 85: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction '='");//$NON-NLS-1$
@@ -3116,100 +3293,107 @@
         yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 716: break;
-        case 49: 
-        case 199: 
-        case 200: 
-        case 203: 
+        case 782: break;
+        case 50: 
+        case 209: 
+        case 210: 
         case 213: 
-        case 214: 
-        case 217: 
-        case 218: 
-        case 360: 
-        case 363: 
-        case 446: 
-        case 460: 
-        case 466: 
+        case 223: 
+        case 224: 
+        case 227: 
+        case 228: 
+        case 393: 
+        case 396: 
+        case 506: 
+        case 520: 
+        case 526: 
           { 
 	return JSP_VBL_CONTENT;
  }
-        case 717: break;
-        case 42: 
-        case 178: 
-        case 179: 
-        case 182: 
-        case 192: 
-        case 193: 
-        case 196: 
-        case 197: 
-        case 330: 
-        case 344: 
-        case 347: 
-        case 418: 
-        case 419: 
-        case 434: 
-        case 440: 
+        case 783: break;
+        case 43: 
+        case 187: 
+        case 188: 
+        case 191: 
+        case 201: 
+        case 202: 
+        case 206: 
+        case 207: 
+        case 363: 
+        case 377: 
+        case 380: 
+        case 478: 
+        case 479: 
+        case 494: 
+        case 500: 
           { 
 	return JSP_EL_CONTENT;
  }
-        case 718: break;
+        case 784: break;
         case 35: 
-        case 159: 
-        case 160: 
-        case 321: 
-        case 412: 
-        case 416: 
-        case 495: 
-        case 528: 
-        case 548: 
-        case 565: 
-        case 575: 
+        case 161: 
+        case 162: 
+        case 345: 
+        case 464: 
+        case 468: 
+        case 557: 
+        case 591: 
+        case 611: 
+        case 628: 
+        case 638: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist contentspec");//$NON-NLS-1$
 	return XML_ATTLIST_DECL_CONTENT;
  }
-        case 719: break;
+        case 785: break;
         case 33: 
-        case 152: 
-        case 153: 
-        case 311: 
-        case 404: 
-        case 408: 
-        case 492: 
-        case 527: 
-        case 547: 
-        case 564: 
-        case 574: 
+        case 154: 
+        case 155: 
+        case 333: 
+        case 454: 
+        case 458: 
+        case 554: 
+        case 590: 
+        case 610: 
+        case 627: 
+        case 637: 
           { 
 	if(Debug.debugTokenizer)
 		dump("elementdecl contentspec");//$NON-NLS-1$
 	return XML_ELEMENT_DECL_CONTENT;
  }
-        case 720: break;
+        case 786: break;
         case 22: 
-        case 112: 
+        case 114: 
           { 
 	if(Debug.debugTokenizer)
 		dump("inappropriate tag name");//$NON-NLS-1$
 	if(!fStateStack.empty() && (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED||fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED)) {
 		yybegin(ST_ABORT_EMBEDDED);
+		char c = yy_buffer[yy_markedPos - 1];
+		if (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED && c == '\"') {
+			return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
+		}		
+		if (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED && c == '\'') {
+			return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
+		}
 		yypushback(yylength()-1);
 		return XML_TAG_ATTRIBUTE_VALUE;
 	}
 	yybegin(YYINITIAL);
         return XML_CONTENT;
  }
-        case 721: break;
+        case 787: break;
         case 18: 
-        case 104: 
+        case 106: 
           { 
 	if(Debug.debugTokenizer)
 		dump("white space");//$NON-NLS-1$
 	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
 	return WHITE_SPACE;
  }
-        case 722: break;
+        case 788: break;
         case 5: 
         case 8: 
         case 9: 
@@ -3235,112 +3419,122 @@
         case 34: 
         case 40: 
         case 41: 
-        case 72: 
-        case 169: 
-        case 174: 
+        case 42: 
+        case 74: 
+        case 178: 
+        case 183: 
           { 
 	if(Debug.debugTokenizer)
 		dump("white space");//$NON-NLS-1$
         return WHITE_SPACE;
  }
-        case 723: break;
+        case 789: break;
         case 0: 
-        case 56: 
-        case 59: 
+        case 57: 
+        case 60: 
         case 61: 
-        case 225: 
-        case 227: 
-        case 228: 
-        case 230: 
-        case 232: 
-        case 370: 
-        case 371: 
-        case 372: 
-        case 475: 
+        case 63: 
+        case 235: 
+        case 237: 
+        case 240: 
+        case 242: 
+        case 403: 
+        case 404: 
+        case 405: 
+        case 409: 
+        case 411: 
+        case 414: 
+        case 535: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nXML content");//$NON-NLS-1$
 	return XML_CONTENT;
  }
-        case 724: break;
-        case 57: 
-        case 101: 
-        case 113: 
-        case 119: 
-        case 129: 
+        case 790: break;
+        case 58: 
+        case 103: 
+        case 115: 
+        case 121: 
+        case 131: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nstart tag open");//$NON-NLS-1$
+	if (!fStateStack.empty() && fStateStack.peek()== ST_XML_COMMENT){
+		fStateStack.pop();
+		fEmbeddedHint = XML_COMMENT_TEXT;
+		yybegin(ST_XML_TAG_NAME);
+		String tagName = "";
+		assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
+		return PROXY_CONTEXT;
+	}
 	fEmbeddedHint = XML_TAG_NAME;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
         yybegin(ST_XML_TAG_NAME);
         return XML_TAG_OPEN;
  }
-        case 725: break;
-        case 58: 
-        case 60: 
-        case 64: 
-        case 65: 
+        case 791: break;
+        case 59: 
+        case 62: 
         case 66: 
-        case 70: 
-        case 71: 
-        case 81: 
-        case 85: 
+        case 67: 
+        case 68: 
+        case 72: 
+        case 73: 
+        case 83: 
         case 87: 
-        case 88: 
         case 89: 
+        case 90: 
         case 91: 
-        case 95: 
-        case 103: 
-        case 108: 
-        case 109: 
+        case 93: 
+        case 97: 
+        case 105: 
         case 110: 
-        case 115: 
-        case 124: 
-        case 131: 
-        case 132: 
+        case 111: 
+        case 112: 
+        case 117: 
+        case 126: 
         case 133: 
         case 134: 
+        case 135: 
         case 136: 
-        case 137: 
+        case 138: 
         case 139: 
-        case 140: 
         case 141: 
-        case 144: 
-        case 145: 
+        case 142: 
+        case 143: 
         case 146: 
-        case 149: 
-        case 150: 
+        case 147: 
+        case 148: 
         case 151: 
-        case 156: 
-        case 157: 
+        case 152: 
+        case 153: 
         case 158: 
-        case 166: 
+        case 159: 
+        case 160: 
+        case 168: 
+        case 170: 
         case 171: 
-        case 172: 
-        case 176: 
-        case 177: 
-        case 184: 
-        case 185: 
-        case 187: 
-        case 188: 
+        case 193: 
         case 194: 
+        case 197: 
         case 198: 
-        case 205: 
-        case 206: 
+        case 204: 
         case 208: 
-        case 209: 
         case 215: 
+        case 216: 
         case 219: 
+        case 220: 
+        case 225: 
+        case 229: 
           { 
 	if (Debug.debugTokenizer)
 		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
 			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
 	return UNDEFINED;
  }
-        case 726: break;
-        case 62: 
-        case 63: 
+        case 792: break;
+        case 64: 
+        case 65: 
           { 
 	if(Debug.debugTokenizer)
 		dump("CDATA text");//$NON-NLS-1$
@@ -3351,46 +3545,46 @@
 		yybegin(ST_CDATA_END);
 	return returnedContext;
  }
-        case 727: break;
-        case 67: 
-        case 186: 
-        case 189: 
-        case 207: 
-        case 210: 
+        case 793: break;
+        case 69: 
+        case 196: 
+        case 200: 
+        case 218: 
+        case 222: 
           { 
 	if(Debug.debugTokenizer)
 		dump("LINE FEED");//$NON-NLS-1$
 	return WHITE_SPACE;
  }
-        case 728: break;
-        case 68: 
-        case 69: 
+        case 794: break;
+        case 70: 
+        case 71: 
           { 
 	if(Debug.debugTokenizer)
 		dump("comment content");//$NON-NLS-1$
 	return scanXMLCommentText();
  }
-        case 729: break;
-        case 73: 
-        case 74: 
+        case 795: break;
         case 75: 
         case 76: 
-        case 237: 
-        case 238: 
-        case 239: 
-        case 383: 
-        case 478: 
-        case 479: 
-        case 518: 
-        case 519: 
+        case 77: 
+        case 78: 
+        case 247: 
+        case 248: 
+        case 249: 
+        case 419: 
         case 538: 
-        case 558: 
-        case 571: 
+        case 539: 
         case 581: 
-        case 589: 
-        case 591: 
-        case 593: 
-        case 595: 
+        case 582: 
+        case 601: 
+        case 621: 
+        case 634: 
+        case 644: 
+        case 652: 
+        case 654: 
+        case 656: 
+        case 658: 
           { 
 	if(Debug.debugTokenizer)
 		dump("processing instruction target");//$NON-NLS-1$
@@ -3398,33 +3592,35 @@
         yybegin(ST_PI_WS);
         return XML_TAG_NAME;
  }
-        case 730: break;
-        case 77: 
+        case 796: break;
+        case 79: 
           { 
         yybegin(ST_PI_CONTENT);
         return WHITE_SPACE;
  }
-        case 731: break;
-        case 78: 
-        case 79: 
+        case 797: break;
         case 80: 
+        case 81: 
+        case 82: 
           { 
 		// block scan until close is found
 	return doScan("?>", false, false, false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
  }
-        case 732: break;
-        case 82: 
+        case 798: break;
+        case 84: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction attribute name");//$NON-NLS-1$
         yybegin(ST_XML_PI_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 733: break;
-        case 126: 
+        case 799: break;
+        case 128: 
+        case 173: 
           { 
+	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_SQUOTE : JSP_TAG_ATTRIBUTE_VALUE_SQUOTE;
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
@@ -3432,15 +3628,19 @@
 	fStateStack.push(yystate());
 	if(Debug.debugTokenizer)
 		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$
-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_SQUOTE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE);
+	assembleEmbeddedContainer(type, type);
 	fStateStack.pop();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
 	fEmbeddedPostState = ST_XML_EQUALS;
         yybegin(ST_XML_ATTRIBUTE_NAME);
+    if (fEmbeddedContainer.getLastRegion().getType() == UNDEFINED) {
+		fProxyUnknownRegion = fRegionFactory.createToken(XML_TAG_ATTRIBUTE_VALUE, fEmbeddedContainer.getStart(), fEmbeddedContainer.getTextLength(), fEmbeddedContainer.getLength());
+		return PROXY_UNKNOWN_CONTEXT;
+	}
 	return PROXY_CONTEXT;
  }
-        case 734: break;
-        case 130: 
+        case 800: break;
+        case 132: 
           { 
 	if(Debug.debugTokenizer)
 		dump("declaration end");//$NON-NLS-1$
@@ -3451,20 +3651,20 @@
 	yybegin(fStateStack.pop());
 	return XML_DECLARATION_CLOSE;
  }
-        case 735: break;
-        case 135: 
+        case 801: break;
+        case 137: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype type");//$NON-NLS-1$
 	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
 	return XML_DOCTYPE_NAME;
  }
-        case 736: break;
-        case 138: 
-        case 142: 
-        case 288: 
-        case 292: 
-        case 399: 
+        case 802: break;
+        case 140: 
+        case 144: 
+        case 306: 
+        case 311: 
+        case 446: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype public reference");//$NON-NLS-1$
@@ -3473,10 +3673,10 @@
 	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
 	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
  }
-        case 737: break;
-        case 143: 
-        case 147: 
-        case 298: 
+        case 803: break;
+        case 145: 
+        case 149: 
+        case 318: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype system reference");//$NON-NLS-1$
@@ -3485,11 +3685,11 @@
 	yybegin(ST_XML_DECLARATION_CLOSE);
 	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
  }
-        case 738: break;
-        case 148: 
-        case 304: 
-        case 308: 
-        case 402: 
+        case 804: break;
+        case 150: 
+        case 324: 
+        case 329: 
+        case 451: 
           { 
 	if(Debug.debugTokenizer)
 		dump("elementdecl name");//$NON-NLS-1$
@@ -3498,8 +3698,8 @@
 	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
 	return XML_ELEMENT_DECL_NAME;
  }
-        case 739: break;
-        case 154: 
+        case 805: break;
+        case 156: 
           { 
 	if(Debug.debugTokenizer)
 		dump("elementdecl close");//$NON-NLS-1$
@@ -3510,11 +3710,11 @@
 	yybegin(fStateStack.pop());
 	return XML_DECLARATION_CLOSE;
  }
-        case 740: break;
-        case 155: 
-        case 314: 
-        case 318: 
-        case 410: 
+        case 806: break;
+        case 157: 
+        case 336: 
+        case 341: 
+        case 461: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist name");//$NON-NLS-1$
@@ -3523,8 +3723,8 @@
 	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
 	return XML_ATTLIST_DECL_NAME;
  }
-        case 741: break;
-        case 161: 
+        case 807: break;
+        case 163: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist close");//$NON-NLS-1$
@@ -3535,25 +3735,30 @@
 	yybegin(fStateStack.pop());
 	return XML_DECLARATION_CLOSE;
  }
-        case 742: break;
-        case 164: 
-        case 165: 
+        case 808: break;
+        case 166: 
+        case 167: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nJSP comment text");//$NON-NLS-1$
 	return scanJSPCommentText();
  }
-        case 743: break;
-        case 167: 
-        case 173: 
+        case 809: break;
+        case 176: 
+        case 180: 
+        case 181: 
+        case 182: 
+        case 185: 
+        case 186: 
+        case 358: 
           { 
 	return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 744: break;
-        case 168: 
+        case 810: break;
+        case 177: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", genericTagOpen");//$NON-NLS-1$
 	}
 	int incomingState = yystate();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
@@ -3566,30 +3771,30 @@
         yybegin(incomingState);
 	return PROXY_CONTEXT;
  }
-        case 745: break;
-        case 170: 
+        case 811: break;
+        case 179: 
           { 
-	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
+	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
  }
-        case 746: break;
-        case 175: 
+        case 812: break;
+        case 184: 
           { 
-	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
+	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
  }
-        case 747: break;
-        case 180: 
+        case 813: break;
+        case 189: 
           { 
 	yybegin(ST_JSP_EL_DQUOTES);
 	return JSP_EL_DQUOTE;
  }
-        case 748: break;
-        case 181: 
+        case 814: break;
+        case 190: 
           { 
 	yybegin(ST_JSP_EL_SQUOTES);
 	return JSP_EL_SQUOTE;
  }
-        case 749: break;
-        case 183: 
+        case 815: break;
+        case 192: 
           { 
 	fELlevel--;
 	if(fELlevel == 0) {
@@ -3598,37 +3803,42 @@
 	}
 	return JSP_EL_CONTENT;
  }
-        case 750: break;
-        case 190: 
+        case 816: break;
+        case 195: 
           { 
 	yybegin(ST_JSP_EL);
 	return JSP_EL_SQUOTE;
  }
-        case 751: break;
-        case 191: 
+        case 817: break;
+        case 199: 
           { 
 	yybegin(ST_JSP_EL);
 	return JSP_EL_DQUOTE;
  }
-        case 752: break;
-        case 195: 
+        case 818: break;
+        case 203: 
+          { 
+	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
+ }
+        case 819: break;
+        case 205: 
           { 
 	return JSP_EL_CLOSE;
  }
-        case 753: break;
-        case 201: 
+        case 820: break;
+        case 211: 
           { 
 	yybegin(ST_JSP_VBL_DQUOTES);
 	return JSP_VBL_DQUOTE;
  }
-        case 754: break;
-        case 202: 
+        case 821: break;
+        case 212: 
           { 
 	yybegin(ST_JSP_VBL_SQUOTES);
 	return JSP_VBL_SQUOTE;
  }
-        case 755: break;
-        case 204: 
+        case 822: break;
+        case 214: 
           { 
 	fELlevel--;
 	if(fELlevel == 0) {
@@ -3637,25 +3847,25 @@
 	}
 	return JSP_VBL_CONTENT;
  }
-        case 756: break;
-        case 211: 
+        case 823: break;
+        case 217: 
           { 
 	yybegin(ST_JSP_VBL);
 	return JSP_VBL_SQUOTE;
  }
-        case 757: break;
-        case 212: 
+        case 824: break;
+        case 221: 
           { 
 	yybegin(ST_JSP_VBL);
 	return JSP_VBL_DQUOTE;
  }
-        case 758: break;
-        case 216: 
+        case 825: break;
+        case 226: 
           { 
 	return JSP_VBL_CLOSE;
  }
-        case 759: break;
-        case 220: 
+        case 826: break;
+        case 230: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nend tag open");//$NON-NLS-1$
@@ -3664,28 +3874,28 @@
         yybegin(ST_XML_TAG_NAME);
         return XML_END_TAG_OPEN;
  }
-        case 760: break;
-        case 221: 
+        case 827: break;
+        case 231: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nprocessing instruction start");//$NON-NLS-1$
 	yybegin(ST_PI);
         return XML_PI_OPEN;
  }
-        case 761: break;
-        case 222: 
-        case 310: 
-        case 320: 
-        case 331: 
-        case 336: 
-        case 340: 
-        case 343: 
-        case 346: 
-        case 348: 
-        case 352: 
-        case 356: 
-        case 359: 
-        case 362: 
+        case 828: break;
+        case 232: 
+        case 332: 
+        case 344: 
+        case 364: 
+        case 369: 
+        case 373: 
+        case 376: 
+        case 379: 
+        case 381: 
+        case 385: 
+        case 389: 
+        case 392: 
+        case 395: 
           { 
 	/* JSP scriptlet begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -3721,7 +3931,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspScriptletStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP scriptlet start");//$NON-NLS-1$
@@ -3752,11 +3962,16 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+        else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+            fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+            fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+        }
+		
 		return PROXY_CONTEXT;
 	}
  }
-        case 762: break;
-        case 223: 
+        case 829: break;
+        case 233: 
           { 
 	fStateStack.push(yystate());
 	if(Debug.debugTokenizer)
@@ -3764,8 +3979,8 @@
         yybegin(ST_XML_DECLARATION);
 	return XML_DECLARATION_OPEN;
  }
-        case 763: break;
-        case 236: 
+        case 830: break;
+        case 246: 
           { 
 	if(Debug.debugTokenizer)
 		dump("processing instruction end");//$NON-NLS-1$
@@ -3773,16 +3988,16 @@
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 764: break;
-        case 240: 
+        case 831: break;
+        case 250: 
           { 
 		// ended with nothing inside
 		fEmbeddedHint = UNDEFINED;
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 765: break;
-        case 241: 
+        case 832: break;
+        case 251: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction end");//$NON-NLS-1$
@@ -3790,37 +4005,13 @@
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 766: break;
-        case 258: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return JSP_CLOSE;
- }
-        case 767: break;
-        case 260: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return JSP_DIRECTIVE_CLOSE;
- }
-        case 768: break;
-        case 162: 
-        case 163: 
+        case 833: break;
+        case 164: 
+        case 165: 
           { 
 		return doBlockTagScan();
 	 }
-        case 769: break;
+        case 834: break;
         default: 
           if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
             yy_atEOF = true;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceInitializer.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceInitializer.java
index 09edd42..508773b 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceInitializer.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceInitializer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -64,6 +64,7 @@
 		node.putInt(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_MISSING_REQUIRED_ATTRIBUTE, ValidationMessage.ERROR);
 		node.putInt(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_UNKNOWN_ATTRIBUTE, ValidationMessage.WARNING);
 		node.putInt(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_NON_EMPTY_INLINE_TAG, ValidationMessage.WARNING);
+		node.putInt(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_UNEXPECTED_RTEXPRVALUE, ValidationMessage.WARNING);
 
 		node.putInt(JSPCorePreferenceNames.VALIDATION_TRANSLATION_TEI_VALIDATION_MESSAGE, ValidationMessage.ERROR);
 		node.putInt(JSPCorePreferenceNames.VALIDATION_TRANSLATION_TEI_CLASS_NOT_FOUND, ValidationMessage.WARNING);
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceNames.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceNames.java
index 651dbe8..1f8f2b0 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceNames.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/preferences/JSPCorePreferenceNames.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -69,6 +69,7 @@
 
 	public static final String VALIDATION_ACTIONS_SEVERITY_MISSING_REQUIRED_ATTRIBUTE = "validation.actions-missing-required-attribute";
 	public static final String VALIDATION_ACTIONS_SEVERITY_UNKNOWN_ATTRIBUTE = "validation.actions-unknown-attribute";
+	public static final String VALIDATION_ACTIONS_SEVERITY_UNEXPECTED_RTEXPRVALUE = "validation.actions-unexpected-rtexprvalue";
 	public static final String VALIDATION_ACTIONS_SEVERITY_NON_EMPTY_INLINE_TAG = "validation.actions-non-empty-inline-tag";
 	
 	public static final String VALIDATION_TRANSLATION_TEI_VALIDATION_MESSAGE = "validation.translation-tei-message";
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP21Namespace.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP21Namespace.java
new file mode 100644
index 0000000..bbb5d9d
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP21Namespace.java
@@ -0,0 +1,14 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsp.core.internal.provisional;
+
+public interface JSP21Namespace extends org.eclipse.wst.html.core.internal.contentmodel.JSP21Namespace {
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java
index 2e3c581..3387e1f 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Frits Jalvingh - contributions for bug 150794
  *     
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.regions;
@@ -50,7 +51,13 @@
 	public static final String JSP_VBL_OPEN = "JSP_VBL_OPEN"; //$NON-NLS-1$
 	public static final String JSP_VBL_QUOTED_CONTENT = "JSP_VBL_QUOTED_CONTENT"; //$NON-NLS-1$
 	public static final String JSP_VBL_SQUOTE = "JSP_VBL_SQUOTE"; //$NON-NLS-1$
-	public static final String XML_TAG_ATTRIBUTE_VALUE_DQUOTE = "XML_TAG_ATTRIBUTE_VALUE_DQUOTE"; //$NON-NLS-1$
 
+	/** Non-taglib XML tag, needing single escape unquoting for embedded expressions */
+	public static final String XML_TAG_ATTRIBUTE_VALUE_DQUOTE = "XML_TAG_ATTRIBUTE_VALUE_DQUOTE"; //$NON-NLS-1$
 	public static final String XML_TAG_ATTRIBUTE_VALUE_SQUOTE = "XML_TAG_ATTRIBUTE_VALUE_SQUOTE"; //$NON-NLS-1$
+
+	/** Taglib tag attribute with double quote, needing 'double escaping' */
+	public static final String JSP_TAG_ATTRIBUTE_VALUE_DQUOTE = "JSP_TAG_ATTRIBUTE_VALUE_DQUOTE"; //$NON-NLS-1$
+	/** Taglib tag attribute with single quote, needing 'double escaping' */
+	public static final String JSP_TAG_ATTRIBUTE_VALUE_SQUOTE = "JSP_TAG_ATTRIBUTE_VALUE_SQUOTE"; //$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/BuildPathClassLoader.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/BuildPathClassLoader.java
new file mode 100644
index 0000000..7b5443f
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/BuildPathClassLoader.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsp.core.internal.taglib;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.jsp.core.internal.Logger;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+
+/**
+ * Custom ClassLoader backed by a Java Project.
+ */
+public class BuildPathClassLoader extends ClassLoader {
+	private static final boolean DEBUG = Boolean.valueOf(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/taglibclassloader")).booleanValue(); //$NON-NLS-1$
+	private IJavaProject fProject;
+
+	public BuildPathClassLoader(ClassLoader parent, IJavaProject project) {
+		super(parent);
+		fProject = project;
+	}
+
+	/**
+	 * Closes the given file with "extreme prejudice".
+	 * 
+	 * @param file the zip file to be closed
+	 */
+	public void closeJarFile(ZipFile file) {
+		if (file == null)
+			return;
+		try {
+			file.close();
+		}
+		catch (IOException ioe) {
+			// no cleanup can be done
+			Logger.logException("JarUtilities: Could not close file " + file.getName(), ioe); //$NON-NLS-1$
+		}
+	}
+
+	/*
+	 * This may pose a runtime performance problem as it opens the containing
+	 * .jar file for each class, but this is countered by no longer leaving
+	 * file handles open nor having to directly interact the build path at
+	 * all. If it is a problem, the TaglibHelper should control some
+	 * "batching" whereby we leave the JarFiles open until directed to close
+	 * them at the end of TaglibHelper.addTEIVariables(...).
+	 * 
+	 * @see java.lang.ClassLoader#findClass(java.lang.String)
+	 */
+	protected Class findClass(String className) throws ClassNotFoundException {
+		if (DEBUG)
+			System.out.println("finding: [" + className + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+		try {
+			IType type = fProject.findType(className);
+			int offset = -1;
+			if (type == null && (offset = className.indexOf('$')) != -1) {
+				// Internal classes from source files must be referenced by . instead of $
+				String cls = className.substring(0, offset) + className.substring(offset).replace('$', '.');
+				type = fProject.findType(cls);
+			}
+			if (type != null) {
+				IPath path = null;
+				IResource resource = type.getResource();
+
+				if (resource != null)
+					path = resource.getLocation();
+				if (path == null)
+					path = type.getPath();
+
+				// needs to be compiled before we can load it
+				if ("class".equalsIgnoreCase(path.getFileExtension())) {
+					IFile file = null;
+
+					if (resource != null && resource.getType() == IResource.FILE)
+						file = (IFile) resource;
+					else
+						file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+
+					if (file != null && file.isAccessible()) {
+						byte[] bytes = loadBytes(file);
+						return defineClass(className, bytes, 0, bytes.length);
+					}
+				}
+				// Look up the class file based on the output location of the java project
+				else if ("java".equalsIgnoreCase(path.getFileExtension()) && resource != null) { //$NON-NLS-1$
+					if (resource.getProject() != null) {
+						IJavaProject jProject = JavaCore.create(resource.getProject());
+						String outputClass = StringUtils.replace(type.getFullyQualifiedName(), ".", "/").concat(".class"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						IPath classPath = jProject.getOutputLocation().append(outputClass);
+						IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(classPath);
+						if (file != null && file.isAccessible()) {
+							byte[] bytes = loadBytes(file);
+							return defineClass(className, bytes, 0, bytes.length);
+						}
+					}
+				}
+				else if ("jar".equalsIgnoreCase(path.getFileExtension())) {
+					String expectedFileName = StringUtils.replace(className, ".", "/").concat(".class"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					byte[] bytes = getCachedInputStream(path.toOSString(), expectedFileName);
+					return defineClass(className, bytes, 0, bytes.length);
+				}
+			}
+		}
+		catch (JavaModelException e) {
+			Logger.logException(e);
+		}
+		return super.findClass(className);
+	}
+
+	/**
+	 * Get the entry from the jarfile
+	 * @param jarFilename the string path of the jarfile
+	 * @param entryName the fully-qualified entry
+	 * @return the bytes for the entry within the jarfile or a byte array of size 0
+	 */
+	private byte[] getCachedInputStream(String jarFilename, String entryName) {
+		ByteArrayOutputStream buffer = null;
+
+		File testFile = new File(jarFilename);
+		if (!testFile.exists())
+			return null;
+
+		ZipFile jarfile = null;
+		try {
+			jarfile = new ZipFile(jarFilename);
+			
+			if (jarfile != null) {
+				ZipEntry zentry = jarfile.getEntry(entryName);
+				if (zentry != null) {
+					InputStream entryInputStream = null;
+					try {
+						entryInputStream = jarfile.getInputStream(zentry);
+					}
+					catch (IOException ioExc) {
+						Logger.logException("JarUtilities: " + jarFilename, ioExc); //$NON-NLS-1$
+					}
+
+					if (entryInputStream != null) {
+						int c;
+						if (zentry.getSize() > 0) {
+							buffer = new ByteArrayOutputStream((int) zentry.getSize());
+						}
+						else {
+							buffer = new ByteArrayOutputStream();
+						}
+						// array dim restriction?
+						byte bytes[] = new byte[2048];
+						try {
+							while ((c = entryInputStream.read(bytes)) >= 0) {
+								buffer.write(bytes, 0, c);
+							}
+						}
+						catch (IOException ioe) {
+							// no cleanup can be done
+						}
+						finally {
+							try {
+								entryInputStream.close();
+							}
+							catch (IOException e) {
+							}
+						}
+					}
+				}
+			}
+		}
+		catch (IOException ioExc) {
+			Logger.logException("JarUtilities: " + jarFilename, ioExc); //$NON-NLS-1$
+		}
+		finally {
+			closeJarFile(jarfile);
+		}
+
+		if (buffer != null) {
+			return buffer.toByteArray();
+		}
+		return new byte[0];
+	}
+
+	/**
+	 * @param file
+	 * @return
+	 */
+	private byte[] loadBytes(IFile file) {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		InputStream in = null;
+		try {
+			in = file.getContents();
+			byte[] buffer = new byte[4096];
+			int read = 0;
+			while ((read = in.read(buffer)) != -1) {
+				out.write(buffer, 0, read);
+			}
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+		catch (IOException e) {
+			Logger.logException(e);
+		}
+		finally {
+			try {
+				if (in != null)
+					in.close();
+			}
+			catch (IOException e) {
+			}
+		}
+		return out.toByteArray();
+	}
+
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/CustomTag.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/CustomTag.java
new file mode 100644
index 0000000..0186713
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/CustomTag.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsp.core.internal.taglib;
+
+/**
+ * Contains information about a custom tag including the tag name (with prefix),
+ * the class that defines the functionality of the tag, TEI class, any scripting variables associated with the
+ * TEI class, and if the class is an iteration tag
+ *
+ */
+public class CustomTag {
+
+	private final String fTagName;
+	private final String fClassName;
+	private final String fTeiClassName;
+	private final boolean fIsIterationTag;
+	private final TaglibVariable[] fVariables;
+
+	public CustomTag(String tagName, String className, String teiClassName, TaglibVariable[] tagVariables, boolean isIterationTag) {
+		fTagName = tagName;
+		fClassName = className;
+		fTeiClassName = teiClassName;
+		fVariables = tagVariables;
+		fIsIterationTag = isIterationTag;
+	}
+
+	/**
+	 * Returns the name of the tag with its prefix
+	 * @return the tag name including prefix
+	 */
+	public String getTagName() {
+		return fTagName;
+	}
+
+	/**
+	 * Returns the name of the implementation class for the tag
+	 * @return the name of the implementation class for the tag
+	 */
+	public String getTagClassName() {
+		return fClassName;
+	}
+
+	/**
+	 * Returns the name of the TagExtraInfo class for the tag
+	 * @return the name of the TagExtraInfo class for the tag
+	 */
+	public String getTeiClassName() {
+		return fTeiClassName;
+	}
+
+	/**
+	 * Returns an array of scripting variables associated with the TagExtraInfo class
+	 * @return an array of scripting variables associated with the TagExtraInfo class
+	 */
+	public TaglibVariable[] getTagVariables() {
+		return fVariables;
+	}
+
+	/**
+	 * Identifies if the tag implements the IterationTag interface
+	 * @return true if the tag implements the IterationTag interface; false otherwise
+	 */
+	public boolean isIterationTag() {
+		return fIsIterationTag;
+	}
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibClassLoader.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibClassLoader.java
index b8706cd..0dc3948 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibClassLoader.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibClassLoader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2005, 2008 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,363 +11,81 @@
 package org.eclipse.jst.jsp.core.internal.taglib;
 
 
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
 
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.jst.jsp.core.internal.Logger;
 
-
-
 /**
  * Custom classloader which allows you to add source directories (folders
  * containing .class files) and jars to the classpath.
- * 
- * @author pavery
  */
-public class TaglibClassLoader extends ClassLoader {
-
+public class TaglibClassLoader extends URLClassLoader {
 	// for debugging
-	private static final boolean DEBUG;
-	static {
-		String value = Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/taglibclassloader"); //$NON-NLS-1$
-		DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
-	}
+	private static final boolean DEBUG = Boolean.valueOf(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/taglibclassloader")).booleanValue(); //$NON-NLS-1$
 
-	private List jarsList = new ArrayList();
-	private List dirsList = new ArrayList();
-	private List usedJars = new ArrayList();
-	private List usedDirs = new ArrayList();
-
-	private Map failedClasses = new HashMap(); // CL: added to optimize
-													// failed loading
-
-	// private List loadedClassFilenames = new ArrayList();
+	private static final String FILE = "file:/";
+	private static final String RESOURCE = "platform:/resource/";
 
 	public TaglibClassLoader(ClassLoader parentLoader) {
-		super(parentLoader);
-	}
-
-	/**
-	 * Adds a new jar to classpath.
-	 * 
-	 * @param filename -
-	 *            full path to the jar file
-	 */
-	public void addJar(String filename) {
-		if (DEBUG)
-			System.out.println("trying to add: [" + filename + "] to classpath"); //$NON-NLS-1$ //$NON-NLS-2$
-		// don't add the same entry twice, or search times will get even worse
-		if (!jarsList.contains(filename)) {
-			jarsList.add(filename);
-			failedClasses = new HashMap();
-			if (DEBUG)
-				System.out.println(" + [" + filename + "] added to classpath"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * Removes a jar from the classpath.
-	 * 
-	 * @param filename -
-	 *            full path to the jar file
-	 */
-	public void removeJar(String filename) {
-		jarsList.remove(filename);
-		failedClasses = new HashMap();
-		if (DEBUG)
-			System.out.println("removed: [" + filename + "] from classpath"); //$NON-NLS-1$ //$NON-NLS-2$
+		super(new URL[0], parentLoader);
 	}
 
 	public void addDirectory(String dirPath) {
-		if (!dirsList.contains(dirPath)) {
-			dirsList.add(dirPath);
-			failedClasses = new HashMap();
-			if (DEBUG)
-				System.out.println("added: [" + dirPath + "] to classpath"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
+		addJavaFile(dirPath + "/"); //$NON-NLS-1$
 	}
 
-	/**
-	 * Removes a directory from the classpath.
-	 * 
-	 * @param dirPath -
-	 *            full path of the directory
-	 */
-	public void removeDirectory(String dirPath) {
-		dirsList.remove(dirPath);
-		failedClasses = new HashMap();
-		if (DEBUG)
-			System.out.println("removed: [" + dirPath + "] from classpath"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Returns the list of JARs on this loader's classpath that contain
-	 * classes that have been loaded.
-	 * 
-	 * @return List - the list of JARs
-	 */
-	public List getJarsInUse() {
-		return usedJars;
-	}
-
-	/**
-	 * Returns a list of directories on this loader's classpath that contain
-	 * classes that have been loaded.
-	 * 
-	 * @return List - the list of directories (fully-qualified filename
-	 *         Strings)
-	 */
-	public List getDirectoriesInUse() {
-		return usedDirs;
-	}
-	
-	Map getFailures() {
-		return failedClasses;
-	}
-
-	/**
-	 * Returns a list of filenames for loose classes that have been loaded out
-	 * of directories.
-	 * 
-	 * @return List - the list of class filenames
-	 */
-	// public List getClassFilenamesFromDirectories() {
-	// return loadedClassFilenames;
-	// }
-	/**
-	 * Searches for the given class name on the defined classpath -
-	 * directories are checked before JARs.
-	 * 
-	 * @param className -
-	 *            the name of the class to find
-	 * @return Class - the loaded class
-	 * @throws ClassNotFoundException
-	 */
-	protected synchronized Class findClass(String className) throws ClassNotFoundException {
-		Class oldClass = findLoadedClass(className);
-		if (oldClass != null) {
-			if (DEBUG)
-				System.out.println(">> TaglibClassLoader " + this + " returning existing class: " + className); //$NON-NLS-1$ //$NON-NLS-2$
-			return oldClass;
-		}
-		if (failedClasses.containsKey(className)) {
-			if (DEBUG)
-				System.out.println(">> TaglibClassLoader " + this + " known missing class: " + className); //$NON-NLS-1$ //$NON-NLS-2$
-			throw new ClassNotFoundException();
-		}
-
-		if (DEBUG)
-			System.out.println(">> TaglibClassLoader " + this + " finding class: " + className); //$NON-NLS-1$ //$NON-NLS-2$
-
-		Class newClass = null;
-		JarFile jarfile = null;
-		JarEntry entry = null;
-
-		// get the correct name of the actual .class file to search for
-		String fileName = calculateClassFilename(className);
-		InputStream stream = null;
+	public void addFile(IPath filePath) {
 		try {
-			// first try searching the classpath directories
-			Iterator dirs = dirsList.iterator();
-			File f;
-			String dirName;
-			String fileToFind = ""; //$NON-NLS-1$
-			while (dirs.hasNext()) {
-				dirName = (String) dirs.next();
-				fileToFind = dirName + "/" + fileName; //$NON-NLS-1$
-
-				f = new File(fileToFind);
-				if (f.exists()) {
-					stream = new FileInputStream(f);
-					usedDirs.add(dirName);
-					// loadedClassFilenames.add(fileToFind);
-					if (DEBUG)
-						System.out.println(">> added file from dir: " + dirName + "/" + fileName); //$NON-NLS-1$ //$NON-NLS-2$
-					break;
-
-				}
-			}
-
-			if (stream != null) {
-				// found a class from a directory
-				ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
-				byte[] buffer = new byte[2048];
-				while (stream.available() > 0) {
-					int amountRead = stream.read(buffer);
-					if(amountRead > 0) {
-						byteStream.write(buffer, 0, amountRead);
-					}
-				}
-
-				byte[] byteArray = byteStream.toByteArray();
-				try {
-					if (DEBUG)
-						System.out.println(">> defining newClass:" + className); //$NON-NLS-1$
-					newClass = defineClass(className, byteArray, 0, byteArray.length);
-					resolveClass(newClass);
-				}
-				catch (Throwable t) {
-					Logger.logException("Error loading TEI class " + className, t);
-
-					// j9 can give ClassCircularityError
-					// parent should already have the class then
-					// try parent loader
-					try {
-						Class c = getParent().loadClass(className);
-						if (DEBUG)
-							System.out.println(">> loaded: " + className + " with: " + getParent()); //$NON-NLS-1$ //$NON-NLS-2$
-						return c;
-					}
-					catch (ClassNotFoundException cnf) {
-						if (DEBUG)
-							cnf.printStackTrace();
-					}
-				}
-				stream.close();
-			}
-
-			if (stream == null) {
-				// still haven't found the class, so now try searching the
-				// jars
-				// search each of the jars until we find an entry matching the
-				// classname
-				Iterator jars = jarsList.iterator();
-				String jarName;
-				while (jars.hasNext()) {
-					jarName = (String) jars.next();
-
-					// make sure the file exists or "new JarFile()" will throw
-					// an exception
-					f = new File(jarName);
-					if (!f.exists()) {
-						continue;
-					}
-					try {
-						jarfile = new JarFile(jarName);
-					}
-					catch (IOException e) {
-						if (DEBUG)
-							Logger.logException("bad jar file", e); //$NON-NLS-1$
-					}
-					if (jarfile == null) {
-						continue;
-					}
-
-					entry = jarfile.getJarEntry(fileName);
-
-					if (DEBUG)
-						System.out.println("looking for filename: " + fileName + " in: " + jarfile.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-					if (entry != null) {
-						if (DEBUG)
-							System.out.println("found the entry: " + entry + " for filename: " + fileName); //$NON-NLS-1$ //$NON-NLS-2$
-						// found the class
-						if (!usedJars.contains(jarName)) {
-							// add the jar to the list of in-use jars
-							usedJars.add(jarName);
-						}
-						break;
-					}
-					jarfile.close();
-				}
-
-				if (entry != null) {
-					// we've found an entry for the desired class
-					stream = jarfile.getInputStream(entry);
-					ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
-					long byteLength = entry.getSize();
-					long totalBytesRead = 0;
-					int bytesRead;
-					byte[] byteBuffer = new byte[10000];
-					while (totalBytesRead < byteLength) {
-						bytesRead = stream.read(byteBuffer);
-						if (bytesRead == -1) {
-							break;
-						}
-						totalBytesRead = totalBytesRead + bytesRead;
-						byteStream.write(byteBuffer, 0, bytesRead);
-					}
-
-					byte[] byteArray = byteStream.toByteArray();
-					try {
-						if (DEBUG)
-							System.out.println(">> defining newClass:" + className); //$NON-NLS-1$
-						// define the class from the byte array
-						newClass = defineClass(className, byteArray, 0, byteArray.length);
-						resolveClass(newClass);
-					}
-					catch (Throwable t) {
-						Logger.logException("Error loading TEI class " + className, t);
-						// j9 can give ClassCircularityError
-						// parent should already have the class then
-
-						// try parent
-						try {
-							Class c = getParent().loadClass(className);
-							if (DEBUG)
-								System.out.println(">> loaded: " + className + " with: " + getParent()); //$NON-NLS-1$ //$NON-NLS-2$
-							return c;
-						}
-						catch (ClassNotFoundException cnf) {
-							if (DEBUG)
-								cnf.printStackTrace();
-							failedClasses.put(className, cnf);
-						}
-					}
-					stream.close();
-					jarfile.close();
-				}
-			}
-		}
-		catch (Throwable t) {
-			failedClasses.put(className, t);
-			return null;
-		}
-		finally {
-			try {
-				if (stream != null) {
-					stream.close();
-				}
-				if (jarfile != null) {
-					jarfile.close();
-				}
-			}
-			catch (IOException ioe) {
-				// ioe.printStackTrace();
-				// just trying to close down anyway - ignore
-			}
-		}
-
-		if (newClass != null) {
+			URL url = new URL(RESOURCE + filePath.toString()); //$NON-NLS-1$
+			super.addURL(url);
 			if (DEBUG)
-				System.out.println(">> loaded: " + newClass + " with: " + this); //$NON-NLS-1$ //$NON-NLS-2$
-			return newClass;
+				System.out.println("added: [" + url + "] to classpath"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
-
-//		failedClasses.add(className);
-		throw new ClassNotFoundException();
+		catch (MalformedURLException e) {
+			Logger.logException(filePath.toString(), e);
+		}
 	}
 
-	/**
-	 * Replaces '.' in the classname with '/' and appends '.class' if needed.
-	 * 
-	 * @return String - the properly-formed class name
-	 */
-	private String calculateClassFilename(String name) {
-		StringBuffer buffer = new StringBuffer(name.replace('.', '/'));
-		if (!name.endsWith(".class")) { //$NON-NLS-1$
-			buffer.append(".class"); //$NON-NLS-1$
+	public void addFolder(IPath folderPath) {
+		try {
+			URL url = new URL(RESOURCE + folderPath.toString() + "/"); //$NON-NLS-1$
+			super.addURL(url);
+			if (DEBUG)
+				System.out.println("added: [" + url + "] to classpath"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
-		return buffer.toString();
+		catch (MalformedURLException e) {
+			Logger.logException(folderPath.toString(), e);
+		}
+	}
+
+	public void addJar(String filename) {
+		addJavaFile(filename);
+	}
+
+	void addJavaFile(String filename) {
+		try {
+			URL url = new URL(FILE + filename);
+			super.addURL(url);
+			if (DEBUG)
+				System.out.println("added: [" + url + "] to classpath"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		catch (MalformedURLException e) {
+			Logger.logException(filename, e);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.net.URLClassLoader#findClass(java.lang.String)
+	 */
+	protected Class findClass(String className) throws ClassNotFoundException {
+		if (DEBUG)
+			System.out.println("finding: [" + className + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+		return super.findClass(className);
 	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelper.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelper.java
index fe85bf7..d4eee32 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelper.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,9 +11,8 @@
 package org.eclipse.jst.jsp.core.internal.taglib;
 
 
-import java.io.File;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
@@ -22,28 +21,24 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.jsp.tagext.FunctionInfo;
 import javax.servlet.jsp.tagext.TagAttributeInfo;
 import javax.servlet.jsp.tagext.TagData;
 import javax.servlet.jsp.tagext.TagExtraInfo;
+import javax.servlet.jsp.tagext.TagFileInfo;
 import javax.servlet.jsp.tagext.TagInfo;
 import javax.servlet.jsp.tagext.TagLibraryInfo;
 import javax.servlet.jsp.tagext.ValidationMessage;
 import javax.servlet.jsp.tagext.VariableInfo;
 
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.Logger;
@@ -51,15 +46,19 @@
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDAttributeDeclaration;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDVariable;
 import org.eclipse.jst.jsp.core.internal.java.IJSPProblem;
+import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.NotImplementedException;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.AbstractMemoryListener;
 import org.eclipse.wst.sse.core.utils.StringUtils;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
@@ -68,16 +67,18 @@
 import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
 import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
 import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.osgi.service.event.Event;
 
 import com.ibm.icu.text.MessageFormat;
 
 /**
  * This class helps find TaglibVariables in a JSP file.
- * 
- * @author pavery
  */
 public class TaglibHelper {
 
+	private static final String ITERATION_QUALIFIER = "javax.servlet.jsp.tagext"; //$NON-NLS-1$
+	private static final String ITERATION_NAME = "IterationTag"; //$NON-NLS-1$
+	
 	// for debugging
 	private static final boolean DEBUG;
 	static {
@@ -86,21 +87,211 @@
 	}
 
 	private IProject fProject = null;
-	private TaglibClassLoader fLoader = null;
+	private ClassLoader fLoader = null;
 
-	private Set fProjectEntries = null;
-	private Map fTranslationProblems = null;
-	private Set fContainerEntries = null;
 	private IJavaProject fJavaProject;
+	
+	/**
+	 * A cache of class names that the class loader could not find.
+	 * Because the TaglibHelper is destroyed and recreated whenever
+	 * the classpath changes this cache will not become stale
+	 */
+	private Set fNotFoundClasses = null;
+
+	private Map fClassMap = null;
+
+	/**
+	 * Used to keep the {@link #fNotFoundClasses} cache clean when memory is low
+	 */
+	private MemoryListener fMemoryListener;
 
 	public TaglibHelper(IProject project) {
+		super();
 		setProject(project);
-		fProjectEntries = new HashSet();
-		fContainerEntries = new HashSet();
-		fTranslationProblems = new HashMap();
+		fMemoryListener = new MemoryListener();
+		fMemoryListener.connect();
+		fNotFoundClasses = new HashSet();
+		fClassMap = Collections.synchronizedMap(new HashMap());
 	}
 
 	/**
+	 * Checks that <code>type</code> implements an IterationTag
+	 * 
+	 * @param type
+	 * @return true if <code>type</code> implements IterationTag
+	 * @throws JavaModelException
+	 * @throws ClassNotFoundException thrown when the <code>type</code> is null
+	 */
+	private boolean isIterationTag(IType type) throws JavaModelException, ClassNotFoundException {
+		if (type == null) {
+			throw new ClassNotFoundException();
+		}
+		synchronized (fClassMap) {
+			if (fClassMap.containsKey(type.getFullyQualifiedName()))
+				return ((Boolean) fClassMap.get(type.getFullyQualifiedName())).booleanValue();
+		}
+
+		String signature;
+		String qualifier;
+		String name;
+		String[] interfaces = type.getSuperInterfaceTypeSignatures();
+		boolean isIteration = false;
+		// Check any super interfaces for the iteration tag
+		for (int i = 0; i < interfaces.length; i++) {
+			// For source files, the interface may need to be resolved
+			String erasureSig = Signature.getTypeErasure(interfaces[i]);
+			qualifier = Signature.getSignatureQualifier(erasureSig);
+			name = Signature.getSignatureSimpleName(erasureSig);
+			// Interface type is unresolved
+			if (erasureSig.charAt(0) == Signature.C_UNRESOLVED) {
+				String[][] types = type.resolveType(getQualifiedType(qualifier, name));
+				// Type was resolved
+				if (types != null && types.length > 0) {
+					isIteration = handleInterface(type, types[0][0], types[0][1]);
+				}
+			}
+			else {
+				isIteration = handleInterface(type, qualifier, name);
+			}
+			if (isIteration)
+				return true;
+		}
+
+		signature = type.getSuperclassTypeSignature();
+		if (signature != null) {
+			String erasureSig = Signature.getTypeErasure(signature);
+			qualifier = Signature.getSignatureQualifier(erasureSig);
+			name = Signature.getSignatureSimpleName(erasureSig);
+			// superclass was unresolved
+			if (erasureSig.charAt(0) == Signature.C_UNRESOLVED) {
+				String[][] types = type.resolveType(getQualifiedType(qualifier, name));
+				// Type was resolved
+				if (types != null && types.length > 0) {
+					isIteration = isIterationTag(fJavaProject.findType(types[0][0], types[0][1]));
+				}
+			}
+			else {
+				isIteration = isIterationTag(fJavaProject.findType(qualifier, name));
+			}
+		}
+		fClassMap.put(type.getFullyQualifiedName(), Boolean.valueOf(isIteration));
+		return isIteration;
+	}
+
+	private boolean handleInterface(IType type, String qualifier, String name) throws JavaModelException, ClassNotFoundException {
+		boolean isIteration = false;
+		// Qualified interface is an iteration tag
+		if (ITERATION_QUALIFIER.equals(qualifier) && ITERATION_NAME.equals(name))
+			isIteration = true;
+		// Check ancestors of this interface
+		else
+			isIteration = isIterationTag(fJavaProject.findType(qualifier, name));
+
+		fClassMap.put(type.getFullyQualifiedName(), Boolean.valueOf(isIteration));
+		return isIteration;
+	}
+
+	private String getQualifiedType(String qualifier, String name) {
+		StringBuffer qual = new StringBuffer(qualifier);
+		if (qual.length() > 0)
+			qual.append('.');
+		qual.append(name);
+		return qual.toString();
+	}
+
+	private boolean isIterationTag(TLDElementDeclaration elementDecl, IStructuredDocument document, ITextRegionCollection customTag, List problems) {
+		String className = elementDecl.getTagclass();
+		if (className == null || className.length() == 0 || fProject == null || fNotFoundClasses.contains(className))
+			return false;
+
+		try {
+			synchronized (fClassMap) {
+				if (fClassMap.containsKey(className))
+					return ((Boolean) fClassMap.get(className)).booleanValue();
+			}
+			return isIterationTag(fJavaProject.findType(className));
+		} catch (ClassNotFoundException e) {
+			//the class could not be found so add it to the cache
+			fNotFoundClasses.add(className);
+
+			Object createdProblem = createJSPProblem(document, customTag, IJSPProblem.TagClassNotFound, JSPCoreMessages.TaglibHelper_3, className, true);
+			if (createdProblem != null)
+				problems.add(createdProblem);
+			if (DEBUG)
+				Logger.logException(className, e);
+		} catch (JavaModelException e) {
+			if (DEBUG)
+				Logger.logException(className, e);
+		} catch (Exception e) {
+			// this is 3rd party code, need to catch all errors
+			if (DEBUG)
+				Logger.logException(className, e);
+		} catch (Error e) {
+			// this is 3rd party code, need to catch all errors
+			if (DEBUG)
+				Logger.logException(className, e);
+		}
+
+		return false;
+	}
+
+	public CustomTag getCustomTag(String tagToAdd, IStructuredDocument structuredDoc, ITextRegionCollection customTag, List problems) {
+		List results = new ArrayList();
+		boolean isIterationTag = false;
+		String tagClass = null;
+		String teiClass = null;
+		if (problems == null)
+			problems = new ArrayList();
+		ModelQuery mq = getModelQuery(structuredDoc);
+		if (mq != null) {
+			TLDCMDocumentManager mgr = TaglibController.getTLDCMDocumentManager(structuredDoc);
+
+			if (mgr != null) {
+
+				List trackers = mgr.getCMDocumentTrackers(-1);
+				Iterator taglibs = trackers.iterator();
+	
+				CMDocument doc = null;
+				CMNamedNodeMap elements = null;
+				while (taglibs.hasNext()) {
+					doc = (CMDocument) taglibs.next();
+					CMNode node = null;
+					if ((elements = doc.getElements()) != null && (node = elements.getNamedItem(tagToAdd)) != null && node.getNodeType() == CMNode.ELEMENT_DECLARATION) {
+	
+						if (node instanceof CMNodeWrapper) {
+							node = ((CMNodeWrapper) node).getOriginNode();
+						}
+						TLDElementDeclaration tldElementDecl = (TLDElementDeclaration) node;
+
+						tagClass = tldElementDecl.getTagclass();
+						teiClass = tldElementDecl.getTeiclass();
+						isIterationTag = isIterationTag(tldElementDecl, structuredDoc, customTag, problems);
+						/*
+						 * Although clearly not the right place to add validation
+						 * design-wise, this is the first time we have the
+						 * necessary information to validate the tag class.
+						 */
+						validateTagClass(structuredDoc, customTag, tldElementDecl, problems);
+	
+						// 1.2+ taglib style
+						addVariables(results, node, customTag);
+	
+						// for 1.1 need more info from taglib tracker
+						if (doc instanceof TaglibTracker) {
+							String uri = ((TaglibTracker) doc).getURI();
+							String prefix = ((TaglibTracker) doc).getPrefix();
+							// only for 1.1 taglibs
+							addTEIVariables(structuredDoc, customTag, results, tldElementDecl, prefix, uri, problems);
+						}
+						break;
+					}
+				}
+			}
+		}
+
+		return new CustomTag(tagToAdd, tagClass, teiClass, (TaglibVariable[]) results.toArray(new TaglibVariable[results.size()]), isIterationTag);
+	}
+	/**
 	 * @param tagToAdd
 	 *            is the name of the tag whose variables we want
 	 * @param structuredDoc
@@ -108,11 +299,13 @@
 	 * @param customTag
 	 *            is the IStructuredDocumentRegion opening tag for the custom
 	 *            tag
+	 * @param problems problems that are generated while creating variables are added to this collection
 	 */
-	public TaglibVariable[] getTaglibVariables(String tagToAdd, IStructuredDocument structuredDoc, ITextRegionCollection customTag) {
+	public TaglibVariable[] getTaglibVariables(String tagToAdd, IStructuredDocument structuredDoc, ITextRegionCollection customTag, List problems) {
 
 		List results = new ArrayList();
-		List problems = new ArrayList();
+		if (problems == null)
+			problems = new ArrayList();
 		ModelQuery mq = getModelQuery(structuredDoc);
 		if (mq != null) {
 			TLDCMDocumentManager mgr = TaglibController.getTLDCMDocumentManager(structuredDoc);
@@ -165,11 +358,6 @@
 			}
 		}
 
-		IPath location = TaglibController.getLocation(structuredDoc);
-		if (location != null) {
-			fTranslationProblems.put(location, problems);
-		}
-
 		return (TaglibVariable[]) results.toArray(new TaglibVariable[results.size()]);
 	}
 
@@ -181,7 +369,6 @@
 	 * @param node
 	 */
 	private void addVariables(List results, CMNode node, ITextRegionCollection customTag) {
-
 		List list = ((TLDElementDeclaration) node).getVariables();
 		Iterator it = list.iterator();
 		while (it.hasNext()) {
@@ -214,7 +401,7 @@
 			}
 			if (varName != null) {
 				String varClass = "java.lang.String"; // the default
-														// class...//$NON-NLS-1$
+				// class...//$NON-NLS-1$
 				if (var.getVariableClass() != null) {
 					varClass = var.getVariableClass();
 				}
@@ -240,10 +427,10 @@
 	 */
 	private void addTEIVariables(IStructuredDocument document, ITextRegionCollection customTag, List results, TLDElementDeclaration decl, String prefix, String uri, List problems) {
 		String teiClassname = decl.getTeiclass();
-		if (teiClassname == null || teiClassname.length() == 0 || fJavaProject == null)
+		if (teiClassname == null || teiClassname.length() == 0 || fJavaProject == null || fNotFoundClasses.contains(teiClassname))
 			return;
 
-		TaglibClassLoader loader = getClassloader();
+		ClassLoader loader = getClassloader();
 
 		Class teiClass = null;
 		try {
@@ -295,6 +482,9 @@
 			}
 		}
 		catch (ClassNotFoundException e) {
+			//the class could not be found so add it to the cache
+			fNotFoundClasses.add(teiClassname);
+
 			Object createdProblem = createJSPProblem(document, customTag, IJSPProblem.TEIClassNotFound, JSPCoreMessages.TaglibHelper_0, teiClassname, true);
 			if (createdProblem != null) {
 				problems.add(createdProblem);
@@ -332,6 +522,10 @@
 		}
 		catch (Error e) {
 			// this is 3rd party code, need to catch all errors
+			Object createdProblem = createJSPProblem(document, customTag, IJSPProblem.TEIClassNotInstantiated, JSPCoreMessages.TaglibHelper_1, teiClassname, true);
+			if (createdProblem != null) {
+				problems.add(createdProblem);
+			}
 			if (DEBUG)
 				logException(teiClassname, e);
 		}
@@ -450,7 +644,7 @@
 
 		final int end;
 		if (customTag.getNumberOfRegions() > 3) {
-			end = customTag.getTextEndOffset(customTag.getRegions().get(customTag.getNumberOfRegions() - 2));
+			end = customTag.getTextEndOffset(customTag.getRegions().get(customTag.getNumberOfRegions() - 2)) - 1;
 		}
 		else if (customTag.getNumberOfRegions() > 1) {
 			end = customTag.getTextEndOffset(customTag.getRegions().get(1)) - 1;
@@ -527,13 +721,9 @@
 	 * @return the TagInfo for the TLDELementDeclaration if the declaration is
 	 *         valid, otherwise null
 	 */
-	private TagInfo getTagInfo(TLDElementDeclaration decl, TagExtraInfo tei, String prefix, String uri) {
+	private TagInfo getTagInfo(final TLDElementDeclaration decl, TagExtraInfo tei, String prefix, String uri) {
 
-		TagLibraryInfo libInfo = new TagLibraryInfo(prefix, uri) { /*
-																	 * dummy
-																	 * impl
-																	 */
-		};
+		TagLibraryInfo libInfo = new TagLibraryInfoImpl(prefix, uri, decl);
 
 		CMNamedNodeMap attrs = decl.getAttributes();
 		TagAttributeInfo[] attrInfos = new TagAttributeInfo[attrs.getLength()];
@@ -583,23 +773,32 @@
 		ITextRegion r = null;
 		String attrName = ""; //$NON-NLS-1$
 		String attrValue = ""; //$NON-NLS-1$
-		for (int i = 2; i < regions.size(); i++) {
+		final int size = regions.size();
+		for (int i = 2; i < size; i++) {
 			r = regions.get(i);
 			// check if attr name
 			if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
 				attrName = customTag.getText(r);
 				// check equals is next region
-				if (regions.size() > ++i) {
+				if (size > ++i) {
 					r = regions.get(i);
-					if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS && regions.size() > ++i) {
+					if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS && size > ++i) {
 						// get attr value
 						r = regions.get(i);
-						if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+						final String type = r.getType();
+						if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
 							// attributes in our document have quotes, so we
 							// need to strip them
 							attrValue = StringUtils.stripQuotes(customTag.getText(r));
 							tagDataTable.put(attrName, attrValue);
 						}
+						else if (type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_DQUOTE || type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_SQUOTE) {
+							final StringBuffer buffer = new StringBuffer();
+							while (size > ++i && (r = regions.get(i)).getType() != type) {
+								buffer.append(customTag.getText(r));
+							}
+							tagDataTable.put(attrName, buffer.toString());
+						}
 					}
 				}
 			}
@@ -610,220 +809,14 @@
 		return tagDataTable;
 	}
 
-	private TaglibClassLoader getClassloader() {
+	private ClassLoader getClassloader() {
 		if (fLoader == null) {
-			fLoader = new TaglibClassLoader(this.getClass().getClassLoader());
-			fProjectEntries.clear();
-			fContainerEntries.clear();
-			addClasspathEntriesForProject(getProject(), fLoader);
+			fLoader = new BuildPathClassLoader(this.getClass().getClassLoader(), fJavaProject);
 		}
 		return fLoader;
 	}
 
 	/**
-	 * @param loader
-	 */
-	private void addClasspathEntriesForProject(IProject p, TaglibClassLoader loader) {
-
-		// avoid infinite recursion and closed project
-		if (!p.isAccessible() || fProjectEntries.contains(p.getFullPath().toString()))
-			return;
-		fProjectEntries.add(p.getFullPath().toString());
-
-		// add things on classpath that we are interested in
-		try {
-			if (p.hasNature(JavaCore.NATURE_ID)) {
-
-				IJavaProject project = JavaCore.create(p);
-
-				try {
-					IClasspathEntry[] entries = project.getRawClasspath();
-					addDefaultDirEntry(loader, project);
-					addClasspathEntries(loader, project, entries);
-				}
-				catch (JavaModelException e) {
-					Logger.logException(e);
-				}
-			}
-		}
-		catch (CoreException e) {
-			Logger.logException(e);
-		}
-	}
-
-	private void addClasspathEntries(TaglibClassLoader loader, IJavaProject project, IClasspathEntry[] entries) throws JavaModelException {
-		IClasspathEntry entry;
-		for (int i = 0; i < entries.length; i++) {
-
-			entry = entries[i];
-			if (DEBUG)
-				System.out.println("current entry is: " + entry); //$NON-NLS-1$
-
-			switch (entry.getEntryKind()) {
-				case IClasspathEntry.CPE_SOURCE :
-					addSourceEntry(loader, entry);
-					break;
-				case IClasspathEntry.CPE_LIBRARY :
-					addLibraryEntry(loader, entry.getPath());
-					break;
-				case IClasspathEntry.CPE_PROJECT :
-					addProjectEntry(loader, entry);
-					break;
-				case IClasspathEntry.CPE_VARIABLE :
-					addVariableEntry(loader, entry);
-					break;
-				case IClasspathEntry.CPE_CONTAINER :
-					addContainerEntry(loader, project, entry);
-					break;
-			}
-		}
-	}
-
-	/**
-	 * @param loader
-	 * @param entry
-	 */
-	private void addVariableEntry(TaglibClassLoader loader, IClasspathEntry entry) {
-		if (DEBUG)
-			System.out.println(" -> adding variable entry: [" + entry + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		// variable should either be a project or a library entry
-
-		// BUG 169431
-		String variableName = entry.getPath().toString();
-		IPath variablePath = JavaCore.getResolvedVariablePath(entry.getPath());
-		variablePath = JavaCore.getClasspathVariable(variableName);
-
-		// RATLC01076854
-		// variable paths may not exist
-		// in that case null will be returned
-		if (variablePath != null) {
-			if (variablePath.segments().length == 1) {
-				IProject varProj = ResourcesPlugin.getWorkspace().getRoot().getProject(variablePath.toString());
-				if (varProj != null && varProj.exists()) {
-					addClasspathEntriesForProject(varProj, loader);
-					return;
-				}
-			}
-			addLibraryEntry(loader, variablePath);
-		}
-	}
-
-	/**
-	 * @param loader
-	 * @param project
-	 * @param entry
-	 * @throws JavaModelException
-	 */
-	private void addContainerEntry(TaglibClassLoader loader, IJavaProject project, IClasspathEntry entry) throws JavaModelException {
-
-		IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), project);
-		if (container != null) {
-			// avoid infinite recursion
-			if (!fContainerEntries.contains(container.getPath().toString())) {
-				fContainerEntries.add(container.getPath().toString());
-
-				IClasspathEntry[] cpes = container.getClasspathEntries();
-				// recursive call here
-				addClasspathEntries(loader, project, cpes);
-			}
-		}
-	}
-
-	/**
-	 * @param loader
-	 * @param entry
-	 */
-	private void addProjectEntry(TaglibClassLoader loader, IClasspathEntry entry) {
-
-		if (DEBUG)
-			System.out.println(" -> project entry: [" + entry + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		IPath path = entry.getPath();
-		IProject referenceProject = ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0));
-		if (referenceProject != null && referenceProject.isAccessible()) {
-			addClasspathEntriesForProject(referenceProject, loader);
-		}
-	}
-
-	/**
-	 * @param loader
-	 * @param project
-	 * @param projectLocation
-	 * @throws JavaModelException
-	 */
-	private void addDefaultDirEntry(TaglibClassLoader loader, IJavaProject project) throws JavaModelException {
-		// add default bin directory for the project
-		IPath outputPath = project.getOutputLocation();
-		String outputLocation = null;
-		if (!outputPath.toFile().exists()) {
-			if (outputPath.segmentCount() > 1) {
-				IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(outputPath);
-				if (folder.getLocation() != null) {
-					outputLocation = folder.getLocation().toString();
-				}
-			}
-			else {
-				IProject iproject = ResourcesPlugin.getWorkspace().getRoot().getProject(outputPath.segment(0));
-				if (iproject.getLocation() != null) {
-					outputLocation = iproject.getLocation().toString();
-				}
-			}
-		}
-		else {
-			outputLocation = outputPath.toString();
-		}
-		loader.addDirectory(outputLocation);
-	}
-
-	/**
-	 * @param loader
-	 * @param entry
-	 */
-	private void addLibraryEntry(TaglibClassLoader loader, IPath libPath) {
-		String jarPathString = libPath.toString();
-		File file = new File(libPath.toOSString());
-
-		// if not absolute path, it's workspace relative
-		if (!file.exists() && libPath.segmentCount() > 1) {
-			IFile jarFile = ResourcesPlugin.getWorkspace().getRoot().getFile(libPath);
-			if (jarFile.isAccessible() && jarFile.getLocation() != null) {
-				jarPathString = jarFile.getLocation().toString();
-			}
-		}
-
-		if (jarPathString != null) {
-			if (jarPathString.endsWith(".jar")) { //$NON-NLS-1$ 
-				loader.addJar(jarPathString);
-			}
-			else if (file.isDirectory()) {
-				/*
-				 * unlikely, the UI prevents adding folder variables to the
-				 * classpath - it's actually a folder containing binaries
-				 */
-				loader.addDirectory(jarPathString);
-			}
-		}
-	}
-
-	/**
-	 * @param loader
-	 * @param entry
-	 */
-	private void addSourceEntry(TaglibClassLoader loader, IClasspathEntry entry) {
-		// add bin directory for specific entry if it has
-		// one
-		IPath outputLocation = entry.getOutputLocation();
-		if (outputLocation != null && outputLocation.segmentCount() > 1) {
-			IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(outputLocation);
-			if (folder != null && folder.isAccessible()) {
-				outputLocation = folder.getLocation();
-				loader.addDirectory(outputLocation.toString());
-			}
-		}
-	}
-
-	/**
 	 * @return Returns the fModelQuery.
 	 */
 	public ModelQuery getModelQuery(IDocument doc) {
@@ -861,25 +854,17 @@
 		}
 	}
 
-	/**
-	 * @param path
-	 * @return
-	 */
-	public Collection getProblems(IPath path) {
-		return (Collection) fTranslationProblems.remove(path);
-	}
-
 	private void validateTagClass(IStructuredDocument document, ITextRegionCollection customTag, TLDElementDeclaration decl, List problems) {
 		// skip if from a tag file
-		if (TLDElementDeclaration.SOURCE_TAG_FILE.equals(decl.getProperty(TLDElementDeclaration.TAG_SOURCE))) {
+		if (TLDElementDeclaration.SOURCE_TAG_FILE.equals(decl.getProperty(TLDElementDeclaration.TAG_SOURCE)) || fJavaProject == null) {
 			return;
 		}
 
 		String tagClassname = decl.getTagclass();
-		IType tagClass = null;
-		if (tagClassname != null && tagClassname.length() > 0 && fJavaProject != null) {
+		Object tagClass = null;
+		if (tagClassname != null && tagClassname.length() > 0 && fJavaProject.exists()) {
 			try {
-				tagClass = fJavaProject.findType(tagClassname, new NullProgressMonitor());
+				tagClass = fJavaProject.findType(tagClassname);
 			}
 			catch (JavaModelException e) {
 				Logger.logException(e);
@@ -892,4 +877,141 @@
 			}
 		}
 	}
+
+	/**
+	 * 
+	 */
+	public void dispose() {
+		fLoader = null;
+		fJavaProject = null;
+		fProject = null;
+		fNotFoundClasses = null;
+		fClassMap = null;
+		fMemoryListener.disconnect();
+		fMemoryListener = null;
+	}
+
+	public void invalidateClass(String className) {
+		fClassMap.remove(className);
+	}
+
+	/**
+	 * <p>A {@link AbstractMemoryListener} that clears the {@link #fNotFoundClasses} cache
+	 * whenever specific memory events are received.</p>
+	 * 
+	 * <p>Events:
+	 * <ul>
+	 * <li>{@link AbstractMemoryListener#SEV_NORMAL}</li>
+	 * <li>{@link AbstractMemoryListener#SEV_SERIOUS}</li>
+	 * <li>{@link AbstractMemoryListener#SEV_CRITICAL}</li>
+	 * </ul>
+	 * </p>
+	 */
+	private class MemoryListener extends AbstractMemoryListener {
+		/**
+		 * <p>Constructor causes this listener to listen for specific memory events.</p>
+		 * <p>Events:
+		 * <ul>
+		 * <li>{@link AbstractMemoryListener#SEV_NORMAL}</li>
+		 * <li>{@link AbstractMemoryListener#SEV_SERIOUS}</li>
+		 * <li>{@link AbstractMemoryListener#SEV_CRITICAL}</li>
+		 * </ul>
+		 * </p>
+		 */
+		MemoryListener() {
+			super(new String[] { SEV_NORMAL, SEV_SERIOUS, SEV_CRITICAL });
+		}
+
+		/**
+		 * On any memory event we handle clear out the project descriptions
+		 * 
+		 * @see org.eclipse.jst.jsp.core.internal.util.AbstractMemoryListener#handleMemoryEvent(org.osgi.service.event.Event)
+		 */
+		protected void handleMemoryEvent(Event event) {
+			/* if running low on memory then this cache can be cleared
+			 * and rebuilt at the expense of processing time
+			 */
+			fNotFoundClasses.clear();
+			fClassMap.clear();
+		}
+
+	}
+
+	class TagLibraryInfoImpl extends TagLibraryInfo {
+		TLDElementDeclaration decl;
+
+		TagLibraryInfoImpl(String prefix, String uri, TLDElementDeclaration decl){
+			super(prefix, uri);
+			this.decl = decl;
+		}
+
+		public String getURI() {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return super.getURI();
+		}
+
+		public String getPrefixString() {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return super.getPrefixString();
+		}
+
+		public String getShortName() {
+			return ((TLDDocument)decl.getOwnerDocument()).getShortname();
+		}
+
+		public String getReliableURN() {
+			return ((TLDDocument)decl.getOwnerDocument()).getUri();
+		}
+
+		public String getInfoString() {
+			return ((TLDDocument)decl.getOwnerDocument()).getInfo();
+		}
+
+		public String getRequiredVersion() {
+			return ((TLDDocument)decl.getOwnerDocument()).getJspversion();
+		}
+
+		public TagInfo[] getTags() {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return super.getTags();
+		}
+
+		public TagFileInfo[] getTagFiles() {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return super.getTagFiles();
+		}
+
+		public TagInfo getTag(String shortname) {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return super.getTag(shortname);
+		}
+
+		public TagFileInfo getTagFile(String shortname) {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return super.getTagFile(shortname);
+		}
+
+		public FunctionInfo[] getFunctions() {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return super.getFunctions();
+		}
+
+		public FunctionInfo getFunction(String name) {
+			new NotImplementedException(name).printStackTrace();
+			return super.getFunction(name);
+		}
+
+		public TagLibraryInfo[] getTagLibraryInfos()  {
+			if (Platform.inDebugMode())
+				new NotImplementedException().printStackTrace();
+			return new TagLibraryInfo[] { this };
+		}
+	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperCache.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperCache.java
index acf1e30..8c5eadf 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperCache.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperCache.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -129,9 +129,10 @@
         }
         if(fHelpers.size() > MAX_SIZE) {
             // one too many, remove last
-            Object removed = fHelpers.remove(fHelpers.size()-1);
+        	Entry removed = (Entry) fHelpers.remove(fHelpers.size()-1);
+        	removed.getHelper().dispose();
             if(DEBUG) {
-            	Logger.log(Logger.INFO, "(-) TaglibHelperCache removed: " + removed); //$NON-NLS-1$
+            	Logger.log(Logger.INFO, "(-) TaglibHelperCache removed: " + removed.getProjectName()); //$NON-NLS-1$
                 printCacheContents();
             }
         }
@@ -144,6 +145,7 @@
         while(it.hasNext()) {
             entry = (Entry)it.next();
             if(entry.getProjectName().equals(projectName)) {
+            	entry.getHelper().dispose();
                 fHelpers.remove(entry);
                 if(DEBUG) { 
                     Logger.log(Logger.INFO, "(-) TaglibHelperCache removed: " + entry); //$NON-NLS-1$
@@ -153,7 +155,22 @@
             }
         }
     }
-    
+
+    public final synchronized void invalidate(String projectName, String className) {
+    	Entry entry = null;
+        Iterator it = fHelpers.iterator();
+        while(it.hasNext()) {
+            entry = (Entry)it.next();
+            if(entry.getProjectName().equals(projectName)) {
+            	entry.getHelper().invalidateClass(className);
+                if(DEBUG) { 
+                    Logger.log(Logger.INFO, "(-) TaglibHelperCache invalidated: " + className); //$NON-NLS-1$
+                    printCacheContents();
+                }
+                break;
+            }
+        }
+    }
     private void printCacheContents() {
         StringBuffer debugString = new StringBuffer();
         debugString.append("\n-----------------------------------------------------------"); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperManager.java
index 8409581..c0b26e0 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibHelperManager.java
@@ -19,6 +19,7 @@
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaElementDelta;
 import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
 
 /**
  * Manages creation and caching (ordered MRU) of TaglibHelpers.
@@ -59,20 +60,35 @@
      * Update classpath for appropriate loader.
      * @see org.eclipse.jdt.core.IElementChangedListener#elementChanged(org.eclipse.jdt.core.ElementChangedEvent)
      */
-    public void elementChanged(ElementChangedEvent event) {
+	public void elementChanged(ElementChangedEvent event) {
+		// handle classpath changes
+		IJavaElementDelta delta = event.getDelta();
+		if (delta.getElement().getElementType() == IJavaElement.JAVA_MODEL) {
+			IJavaElementDelta[] changed = delta.getChangedChildren();
+			for (int i = 0; i < changed.length; i++) {
+				if ((changed[i].getFlags() & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0 || (changed[i].getFlags() & IJavaElementDelta.F_REORDER) != 0 || (changed[i].getFlags() & IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED) != 0 || (changed[i].getFlags() & IJavaElementDelta.F_PRIMARY_RESOURCE) != 0) {
+					IJavaElement proj = changed[i].getElement();
+					handleClasspathChange(changed, i, proj);
+				}
+			}
+		}
+		else if (delta.getElement().getElementType() == IJavaElement.COMPILATION_UNIT) {
+			IJavaElementDelta[] changed = delta.getChangedChildren();
+			for (int i = 0; i < changed.length; i++) {
+				if ((changed[i].getFlags() & IJavaElementDelta.F_SUPER_TYPES) != 0) {
+					IJavaElement element = changed[i].getElement();
+					handleSuperTypeChange(element);
+				}
+			}
+		}
+	}
 
-        // handle classpath changes
-        IJavaElementDelta delta = event.getDelta();
-        if(delta.getElement().getElementType() == IJavaElement.JAVA_MODEL) {
-            IJavaElementDelta[] changed = delta.getChangedChildren();
-            for (int i = 0; i < changed.length; i++) {
-                if ((changed[i].getFlags() & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0 || (changed[i].getFlags() & IJavaElementDelta.F_REORDER) != 0 || (changed[i].getFlags() & IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED) != 0) {
-                    IJavaElement proj = changed[i].getElement();
-                    handleClasspathChange(changed, i, proj);
-                }
-            }
-        }
-    }
+	private void handleSuperTypeChange(IJavaElement element) {
+		IJavaProject project = element.getJavaProject();
+		if (element instanceof IType) {
+			fCache.invalidate(project.getProject().getName(), ((IType) element).getFullyQualifiedName());
+		}
+	}
     
     /**
      * @param changed
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibVariable.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibVariable.java
index d73bbbc..ab91ce9 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibVariable.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/taglib/TaglibVariable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -115,18 +115,18 @@
 		 */
 		if (includeDoc && getDescription() != null) {
 			if (style == M_PRIVATE) {
-				declaration = "/** " + ENDL + StringUtils.replace(getDescription(), "*/", "*\\/") + ENDL + " */ " + ENDL + "private " + getVarClass() + " " + getVarName() + " = null;" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  //$NON-NLS-5$
+				declaration = "/** " + ENDL + StringUtils.replace(getDescription(), "*/", "*\\/") + ENDL + " */ " + ENDL + "private " + getVarClass() + " " + getVarName() + " = (" + getVarClass() + ") pageContext.getAttribute(\"" + getVarName() + "\");" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
 			}
 			else {
-				declaration = "/** " + ENDL + StringUtils.replace(getDescription(), "*/", "*\\/") + ENDL + " */ " + ENDL + getVarClass() + " " + getVarName() + " = null;" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  //$NON-NLS-5$
+				declaration = "/** " + ENDL + StringUtils.replace(getDescription(), "*/", "*\\/") + ENDL + " */ " + ENDL + getVarClass() + " " + getVarName() + " = (" + getVarClass() + ") pageContext.getAttribute(\"" + getVarName() + "\");" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
 			}
 		}
 		else {
 			if (style == M_PRIVATE) {
-				declaration = "private " + getVarClass() + " " + getVarName() + " = null;" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				declaration = "private " + getVarClass() + " " + getVarName() + " = (" + getVarClass() + ") pageContext.getAttribute(\"" + getVarName() + "\");" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
 			}
 			else {
-				declaration = getVarClass() + " " + getVarName() + " = null;" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$
+				declaration = getVarClass() + " " + getVarName() + " = (" + getVarClass() + ") pageContext.getAttribute(\"" + getVarName() + "\");" + ENDL; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 			}
 		}
 		return declaration;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java
index 5974322..836557c 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -33,6 +33,7 @@
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.text.rules.IStructuredTypedRegion;
 import org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner;
 import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
 import org.eclipse.wst.xml.core.internal.text.rules.StructuredTextPartitionerForXML;
@@ -243,6 +244,8 @@
 			result = IJSPPartitions.JSP_DEFAULT_EL;
 		else if (region_type == DOMJSPRegionContexts.JSP_VBL_OPEN || region_type == DOMJSPRegionContexts.JSP_VBL_CONTENT || region_type == DOMJSPRegionContexts.JSP_VBL_CLOSE || region_type == DOMJSPRegionContexts.JSP_VBL_DQUOTE || region_type == DOMJSPRegionContexts.JSP_VBL_SQUOTE || region_type == DOMJSPRegionContexts.JSP_VBL_QUOTED_CONTENT)
 			result = IJSPPartitions.JSP_DEFAULT_EL2;
+		else if (region_type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE || region_type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE)
+			result = IJSPPartitions.JSP_DEFAULT;
 		else if (region_type == DOMRegionContext.XML_CDATA_TEXT) {
 			// BUG131463: possibly between <jsp:scriptlet>, <jsp:expression>,
 			// <jsp:declaration>
@@ -261,6 +264,15 @@
 			else
 				result = getDefaultPartitionType();
 		}
+//		else if (region_type == DOMRegionContext.BLOCK_TEXT) {
+			// possibly between <jsp:scriptlet>, <jsp:expression>,
+			// <jsp:declaration>
+//			IStructuredDocumentRegion sdRegion = this.fStructuredDocument.getRegionAtCharacterOffset(offset);
+//			if (isJspJavaActionName(getParentName(sdRegion)))
+//				result = getPartitionTypeForDocumentLanguage();
+//			else
+//				result = getDefaultPartitionType();
+//		}
 		else {
 			result = getEmbeddedPartitioner().getPartitionType(region, offset);
 		}
@@ -332,10 +344,9 @@
 				setInternalPartition(offset, containedChildRegion.getLength(), IJSPPartitions.JSP_DIRECTIVE);
 				return true;
 			}
-			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=113346
-			if (fEnableJSPActionPartitions && isAction(sdRegion, offset) && !(containedChildRegion instanceof ITextRegionContainer)) {
-				// if (fEnableJSPActionPartitions && isAction(sdRegion,
-				// offset)) {
+			
+			//if is a JSP custom tag but not a JSP_EL region
+			if (fEnableJSPActionPartitions && !isELRegion(containedChildRegion) && isAction(sdRegion, offset) && !(containedChildRegion instanceof ITextRegionContainer) ) {
 				setInternalPartition(offset, containedChildRegion.getLength(), IJSPPartitions.JSP_DIRECTIVE);
 				return true;
 			}
@@ -392,7 +403,8 @@
 		// but hopefully this will be less garbage than before (especially for
 		// HTML, XML,
 		// naturally!)
-		internalReusedTempInstance = getEmbeddedPartitioner().createPartition(offset, length, type);
+		IStructuredTypedRegion region = getEmbeddedPartitioner().createPartition(offset, length, type);
+		super.setInternalPartition(region.getOffset(), region.getLength(), region.getType());
 
 	}
 
@@ -405,5 +417,54 @@
 	public void setLanguage(String language) {
 		this.fLanguage = language;
 	}
+	
+	/**
+	 * @param region decide if this region is an EL region
+	 * @return <code>true</code> if the given <code>region</code> is a EL region,
+	 * <code>false</code> otherwise.
+	 */
+	private boolean isELRegion(ITextRegion region) {
+		String type = region.getType();
+		return
+			type == DOMJSPRegionContexts.JSP_EL_CLOSE ||
+			type == DOMJSPRegionContexts.JSP_EL_CONTENT ||
+			type == DOMJSPRegionContexts.JSP_EL_DQUOTE ||
+			type == DOMJSPRegionContexts.JSP_EL_OPEN ||
+			type == DOMJSPRegionContexts.JSP_EL_QUOTED_CONTENT ||
+			type == DOMJSPRegionContexts.JSP_EL_SQUOTE ||
+			type == DOMJSPRegionContexts.JSP_VBL_CLOSE ||
+			type == DOMJSPRegionContexts.JSP_VBL_CONTENT ||
+			type == DOMJSPRegionContexts.JSP_VBL_DQUOTE ||
+			type == DOMJSPRegionContexts.JSP_VBL_OPEN ||
+			type == DOMJSPRegionContexts.JSP_VBL_QUOTED_CONTENT ||
+			type == DOMJSPRegionContexts.JSP_VBL_SQUOTE;
+	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner#doParserSpecificCheck(int, boolean, org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion, org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion, org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion, org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion)
+	 */
+	protected boolean doParserSpecificCheck(int offset, boolean partitionFound, IStructuredDocumentRegion sdRegion, IStructuredDocumentRegion previousStructuredDocumentRegion, ITextRegion next, ITextRegion previousStart) {
+		if (previousStart != null && previousStart.getType() == DOMRegionContext.XML_TAG_OPEN && next.getType() == DOMRegionContext.XML_END_TAG_OPEN) {
+			ITextRegion previousName = previousStructuredDocumentRegion.getRegionAtCharacterOffset(previousStructuredDocumentRegion.getEndOffset(previousStart));
+			ITextRegion nextName = sdRegion.getRegionAtCharacterOffset(sdRegion.getEndOffset(next));
+			if (previousName != null && nextName != null && previousName.getType() == DOMRegionContext.XML_TAG_NAME && nextName.getType() == DOMRegionContext.XML_TAG_NAME) {
+				setInternalPartition(offset, 0, getPartitionTypeBetween(previousStructuredDocumentRegion, sdRegion));
+				partitionFound = true;
+			}
+		}
+		return partitionFound;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner#getParserSpecificPreviousRegion(org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion)
+	 */
+	protected IStructuredDocumentRegion getParserSpecificPreviousRegion(IStructuredDocumentRegion currentRegion) {
+		if (currentRegion == null)
+			return null;
+		do {
+			currentRegion = currentRegion.getPrevious();
+		} while (currentRegion != null && currentRegion.getType().equals(DOMRegionContext.BLOCK_TEXT));
+
+		return currentRegion;
+	}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java
index 3607088..2c9c28c 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java
@@ -18,8 +18,6 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.ref.Reference;
-import java.lang.ref.SoftReference;
 import java.net.URL;
 import java.net.URLConnection;
 
@@ -141,20 +139,13 @@
 		return document;
 	}
 
-	ThreadLocal fDocumentBuilder = new ThreadLocal();
+	DocumentBuilder fDocumentBuilder = null;
 	
 	private DocumentBuilder getDocumentBuilder() {
-		DocumentBuilder db = null;
-
-		Reference builderReference = (Reference) fDocumentBuilder.get();
-		if (builderReference != null) {
-			db = (DocumentBuilder) builderReference.get();
+		if (fDocumentBuilder == null) {
+			fDocumentBuilder = CommonXML.getDocumentBuilder(isValidating());
 		}
-		if (db == null) {
-			db = CommonXML.getDocumentBuilder(isValidating());
-			fDocumentBuilder.set(new SoftReference(db));
-		}
-		return db;
+		return fDocumentBuilder;
 	}
 
 	private DOMImplementation getDomImplementation() {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java
index 775d9b1..33b8c64 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -36,6 +36,8 @@
 	private static final String WEB_INF = "WEB-INF"; //$NON-NLS-1$
 	private static final IPath WEB_INF_PATH = new Path(WEB_INF);
 
+	static final float DEFAULT_SERVLET_VERSION = 3f;
+
 	/**
 	 * @param project
 	 * @return the computed IPath to the "root" of the web contents, either from facet knowledge or hueristics, or null if one can not be determined
@@ -69,7 +71,7 @@
 	 */
 	public static float getDynamicWebProjectVersion(IProject project) {
 		// In the absence of any facet information, assume the highest level
-		float version = 2.5f;
+		float version = DEFAULT_SERVLET_VERSION;
 		try {
 			version = FacetModuleCoreSupportDelegate.getDynamicWebProjectVersion(project);
 		}
@@ -99,6 +101,12 @@
 		return path;
 	}
 
+	/**
+	 * @param path -
+	 *            the full path to a resource within the workspace
+	 * @return - the runtime path of the resource if one exists, null
+	 *         otherwise
+	 */
 	public static IPath getRuntimePath(IPath path) {
 		IPath result = null;
 		try {
@@ -224,6 +232,4 @@
 
 		return basePath.uptoSegment(1);
 	}
-
-
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java
index 2b7e288..56b748d 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse License v1.0
  * which accompanies this distribution, and is available at
@@ -10,8 +10,10 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.util;
 
+import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -21,6 +23,7 @@
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
 import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
 import org.eclipse.wst.common.project.facet.core.IProjectFacet;
@@ -43,7 +46,6 @@
 	 * @see org.eclipse.wst.common.componentcore.internal.util.IModuleConstants.JST_WEB_MODULE
 	 */
 	private final static String JST_WEB_MODULE = "jst.web"; //$NON-NLS-1$
-
 	/**
 	 * @param project
 	 * @return -1 if the project does not have the JST Web facet, the version
@@ -52,10 +54,10 @@
 	 */
 	static float getDynamicWebProjectVersion(IProject project) {
 		if (project == null)
-			return 2.5f;
+			return FacetModuleCoreSupport.DEFAULT_SERVLET_VERSION;
 
 		// In the absence of any facet information, assume the highest level
-		float version = 2.5f;
+		float version = FacetModuleCoreSupport.DEFAULT_SERVLET_VERSION;
 		try {
 			IFacetedProject faceted = ProjectFacetsManager.create(project);
 			if (faceted != null && ProjectFacetsManager.isProjectFacetDefined(JST_WEB_MODULE)) {
@@ -157,25 +159,40 @@
 			return null;
 
 		if (basePath.segmentCount() > 1) {
-			IFile baseFile = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath);
-			IVirtualResource[] virtualResources = ComponentCore.createResources(baseFile);
-			for (int i = 0; i < virtualResources.length; i++) {
-				IPath baseRuntimePath = virtualResources[i].getRuntimePath();
-				IPath referenceRuntimePath = null;
-				if (reference.startsWith(SLASH)) {
-					referenceRuntimePath = new Path(reference);
-				}
-				else {
-					referenceRuntimePath = baseRuntimePath.removeLastSegments(1).append(reference);
-				}
-				IVirtualFile virtualFile = ComponentCore.createFile(project, referenceRuntimePath);
-				if (virtualFile != null && virtualFile.exists()) {
-					IFile[] underlyingFiles = virtualFile.getUnderlyingFiles();
-					for (int j = 0; j < underlyingFiles.length; j++) {
-						if (underlyingFiles[j].getProject().equals(project) && underlyingFiles[j].exists()) {
-							return underlyingFiles[j].getFullPath();
-						}
+			IResource baseResource = ResourcesPlugin.getWorkspace().getRoot().findMember(basePath);
+			if (baseResource != null) {
+				IVirtualResource[] virtualResources = ComponentCore.createResources(baseResource);
+				for (int i = 0; i < virtualResources.length; i++) {
+					IPath referenceRuntimePath = null;
+					if (reference.startsWith(SLASH)) {
+						referenceRuntimePath = new Path(reference);
+					}
+					else {
+						IPath baseRuntimePath = virtualResources[i].getRuntimePath();
+						referenceRuntimePath = baseRuntimePath.removeLastSegments(1).append(reference);
+					}
+					
+					IVirtualFile virtualFile = ComponentCore.createFile(project, referenceRuntimePath);
+					if (virtualFile != null && virtualFile.exists()) {
+						IFile[] underlyingFiles = virtualFile.getUnderlyingFiles();
+						for (int j = 0; j < underlyingFiles.length; j++) {
+							if (underlyingFiles[j].getProject().equals(project) && underlyingFiles[j].isAccessible()) {
+								return underlyingFiles[j].getFullPath();
+							}
 
+						}
+					}
+					else {
+						// http://bugs.eclipse.org/338751 
+						IVirtualFolder virtualFolder = ComponentCore.createFolder(project, referenceRuntimePath);
+						if (virtualFolder != null && virtualFolder.exists()) {
+							IContainer[] underlyingFolders = virtualFolder.getUnderlyingFolders();
+							for (int j = 0; j < underlyingFolders.length; j++) {
+								if (underlyingFolders[j].getProject().equals(project) && underlyingFolders[j].isAccessible()) {
+									return underlyingFolders[j].getFullPath();
+								}
+							}
+						}
 					}
 				}
 			}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FileContentCache.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FileContentCache.java
index e6243ad..5a2de58 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FileContentCache.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FileContentCache.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -34,6 +34,7 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.jface.text.IDocument;
 import org.eclipse.jst.jsp.core.internal.Logger;
 import org.eclipse.wst.sse.core.internal.util.Debug;
 
@@ -90,7 +91,7 @@
 					// will try to cleanup in finally
 				}
 				catch (CoreException e) {
-					Logger.logException(e);
+					// out of sync
 				}
 				finally {
 					if (contents != null) {
@@ -126,9 +127,12 @@
 				IFile f = getFile(filePath);
 				if (f != null && f.isAccessible()) {
 					String charset = detectCharset(f);
+					if (charset == null) {
+						charset = ResourcesPlugin.getEncoding();
+					}
 					is = f.getContents();
 					Reader reader = new InputStreamReader(is, charset);
-					char[] readBuffer = new char[2048];
+					char[] readBuffer = new char[8092];
 					int n = reader.read(readBuffer);
 					while (n > 0) {
 						s.append(readBuffer, 0, n);
@@ -136,10 +140,12 @@
 					}
 				}
 			}
+			catch (CoreException e) {
+				// out of sync
+			}
 			catch (Exception e) {
 				if (Debug.debugStructuredDocument) {
 					Logger.logException(e);
-					e.printStackTrace();
 				}
 			}
 			finally {
@@ -194,11 +200,13 @@
 	}
 
 	private void cleanup() {
-		Iterator iterator = fContentMap.entrySet().iterator();
-		while (iterator.hasNext()) {
-			Map.Entry entry = (Map.Entry) iterator.next();
-			if (entry.getValue() != null && ((Reference) entry.getValue()).get() == null) {
-				iterator.remove();
+		synchronized (fContentMap) {
+			Iterator iterator = fContentMap.entrySet().iterator();
+			while (iterator.hasNext()) {
+				Map.Entry entry = (Map.Entry) iterator.next();
+				if (entry.getValue() != null && ((Reference) entry.getValue()).get() == null) {
+					iterator.remove();
+				}
 			}
 		}
 	}
@@ -206,6 +214,16 @@
 	public String getContents(IPath filePath) {
 		if (DEBUG)
 			System.out.println("getContents:" + filePath);
+		
+		// use an text file buffer if one is already open
+		ITextFileBuffer existingBuffer = FileBuffers.getTextFileBufferManager().getTextFileBuffer(filePath, LocationKind.IFILE);
+		if (existingBuffer != null) {
+			IDocument document = existingBuffer.getDocument();
+			if (document != null) {
+				return document.get();
+			}
+		}
+		
 		CacheEntry entry = null;
 		Object o = fContentMap.get(filePath);
 		if (o instanceof Reference) {
@@ -215,7 +233,9 @@
 			if (DEBUG && entry != null && entry.isStale())
 				System.out.println("stale contents:" + filePath);
 			entry = new CacheEntry(filePath);
-			fContentMap.put(filePath, new SoftReference(entry));
+			synchronized (fContentMap) {
+				fContentMap.put(filePath, new SoftReference(entry));
+			}
 		}
 		cleanup();
 		return entry.contents;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/FragmentValidationTools.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/FragmentValidationTools.java
new file mode 100644
index 0000000..83a95ab
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/FragmentValidationTools.java
@@ -0,0 +1,57 @@
+/*******************************************************************************

+ * Copyright (c) 2008 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.jst.jsp.core.internal.validation;

+

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.resources.ProjectScope;

+import org.eclipse.core.runtime.preferences.IEclipsePreferences;

+import org.eclipse.core.runtime.preferences.InstanceScope;

+import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;

+import org.eclipse.jst.jsp.core.internal.preferences.JSPCorePreferenceNames;

+

+

+/**

+ * Utility class for reading fragment validation preferences/properties.

+ * JSPFContentProperties does not respect the project override preference.

+ * 

+ */

+class FragmentValidationTools {

+	/**

+	 * @param resource

+	 * @return whether to perform validation on a fragment, returning the

+	 *         project-specific preference only of project-specific values are

+	 *         enabled

+	 */

+	static boolean shouldValidateFragment(IResource resource) {

+		String qualifier = JSPCorePlugin.getDefault().getBundle().getSymbolicName();

+

+		IProject project = null;

+		if (resource.getType() == IResource.PROJECT) {

+			project = (IProject) resource;

+		}

+		else {

+			project = resource.getProject();

+		}

+		if (project != null) {

+			IEclipsePreferences node = new ProjectScope(project).getNode(qualifier);

+			// first, check whether project specific settings are to be used

+			boolean useProjectSettings = node.getBoolean(JSPCorePreferenceNames.VALIDATION_USE_PROJECT_SETTINGS, false);

+			if (useProjectSettings) {

+				// only if so, return that value

+				return node.getBoolean(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, true);

+			}

+			// if not, return the workspace value

+		}

+		return new InstanceScope().getNode(qualifier).getBoolean(JSPCorePreferenceNames.VALIDATE_FRAGMENTS, true);

+	}

+}

diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPActionValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPActionValidator.java
index 51f0c3d..5185fbc 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPActionValidator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPActionValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
+ * Copyright (c) 2008, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,6 +16,7 @@
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.preferences.DefaultScope;
 import org.eclipse.core.runtime.preferences.IPreferencesService;
@@ -29,6 +30,13 @@
 import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP11TLDNames;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDAttributeDeclaration;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
+import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache;
+import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache.PropertyGroup;
+import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapter;
+import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapterImpl;
 import org.eclipse.jst.jsp.core.internal.preferences.JSPCorePreferenceNames;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.osgi.util.NLS;
@@ -51,8 +59,10 @@
 import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
 import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
 import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
 import org.w3c.dom.Attr;
@@ -76,8 +86,10 @@
 	private int fSeverityMissingRequiredAttribute = IMessage.HIGH_SEVERITY;
 	private int fSeverityNonEmptyInlineTag = IMessage.NORMAL_SEVERITY;
 	private int fSeverityUnknownAttribute = IMessage.NORMAL_SEVERITY;
+	private int fSeverityUnexpectedRuntimeExpression = IMessage.NORMAL_SEVERITY;
 
 	private HashSet fTaglibPrefixes = new HashSet();
+	private boolean fIsELIgnored = false;
 
 	public JSPActionValidator() {
 		this.fMessageOriginator = this;
@@ -102,6 +114,48 @@
 		}
 	}
 
+	/**
+	 * Checks an attribute for runtime expressions
+	 * @param a The attribute to check for runtime expressions
+	 * @return true if the attribute contains a runtime expression, false otherwise
+	 */
+	private boolean checkRuntimeValue(IDOMAttr a) {
+		ITextRegion value = a.getValueRegion();
+		if (value instanceof ITextRegionContainer) {
+			Iterator it = ((ITextRegionContainer) value).getRegions().iterator();
+			while (it.hasNext()) {
+				String type = ((ITextRegion) it.next()).getType();
+				if (type == DOMJSPRegionContexts.JSP_EL_OPEN)
+					return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Determines if EL should be ignored. Checks
+	 * <ol>
+	 *  <li>JSP version</li>
+	 * 	<li>Page directive isELIgnored</li>
+	 *  <li>Deployment descriptor's el-ignored</li>
+	 * </ol>
+	 * @return true if EL should be ignored, false otherwise. If the JSP version is < 2.0, EL is ignored by default
+	 */
+	private boolean isElIgnored(IPath path, IStructuredModel model) {
+		if (DeploymentDescriptorPropertyCache.getInstance().getJSPVersion(path) < 2.0f)
+			return true;
+		String directiveIsELIgnored = ((PageDirectiveAdapterImpl)(((IDOMModel) model).getDocument().getAdapterFor(PageDirectiveAdapter.class))).getElIgnored();
+		// isELIgnored directive found
+		if (directiveIsELIgnored != null)
+			return Boolean.valueOf(directiveIsELIgnored).booleanValue();
+		// Check the deployment descriptor for el-ignored
+		PropertyGroup[] groups = DeploymentDescriptorPropertyCache.getInstance().getPropertyGroups(path);
+		if (groups.length > 0)
+			return groups[0].isELignored();
+		// JSP version >= 2.0 defaults to evaluating EL
+		return false;
+	}
+
 	private void checkRequiredAttributes(IDOMElement element, CMNamedNodeMap attrMap, IReporter reporter, IFile file, IStructuredDocument document, IStructuredDocumentRegion documentRegion) {
 		Iterator it = attrMap.iterator();
 		CMAttributeDeclaration attr = null;
@@ -147,7 +201,7 @@
 				 * Get the name attribute of jsp:attribute and compare its
 				 * value to the required attribute name
 				 */
-				if (neededAttrName.equals(childElement.getAttribute("name"))) {//$NON-NLS-1$
+				if (childElement.hasAttribute("name") && neededAttrName.equals(childElement.getAttribute("name"))) {//$NON-NLS-1$ //$NON-NLS-2$
 					return true;
 				}
 			}
@@ -155,37 +209,73 @@
 		return false;
 	}
 
-	private boolean checkUnknownAttributes(IDOMElement element, CMNamedNodeMap cmAttrs, IReporter reporter, IFile file, IStructuredDocument document, IStructuredDocumentRegion documentRegion) {
+	private boolean checkUnknownAttributes(IDOMElement element, CMElementDeclaration elementDecl, CMNamedNodeMap cmAttrs, IReporter reporter, IFile file, IStructuredDocument document, IStructuredDocumentRegion documentRegion) {
 		boolean foundjspattribute = false;
+		boolean dynamicAttributesAllowed = false;
+		CMElementDeclaration decl = elementDecl;
+		if (decl instanceof CMNodeWrapper)
+			decl = (CMElementDeclaration) ((CMNodeWrapper) decl).getOriginNode();
+		if (decl instanceof TLDElementDeclaration) {
+			String dynamicAttributes = ((TLDElementDeclaration) decl).getDynamicAttributes();
+			dynamicAttributesAllowed = dynamicAttributes != null ? Boolean.valueOf(dynamicAttributes).booleanValue() : false;
+		}
 
 		NamedNodeMap attrs = element.getAttributes();
 		for (int i = 0; i < attrs.getLength(); i++) {
 			Attr a = (Attr) attrs.item(i);
 			CMAttributeDeclaration adec = (CMAttributeDeclaration) cmAttrs.getNamedItem(a.getName());
 			if (adec == null) {
-				// No attr declaration was found. That is, the attr name is
-				// undefined.
-				// but not regard it as undefined name if it includes JSP
+				/*
+				 * No attr declaration was found. That is, the attr name is
+				 * undefined. Disregard it includes JSP structure or this
+				 * element supports dynamic attributes
+				 */
 				if (!hasJSPRegion(((IDOMNode) a).getNameRegion()) && fSeverityUnknownAttribute != ValidationMessage.IGNORE) {
-					String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_6, a.getName());
-					LocalizedMessage message = new LocalizedMessage(fSeverityUnknownAttribute, msgText, file);
-					int start = ((IDOMAttr) a).getNameRegionStartOffset();
-					int length = ((IDOMAttr) a).getNameRegionEndOffset() - start;
-					int lineNo = document.getLineOfOffset(start);
-					message.setLineNo(lineNo);
-					message.setOffset(start);
-					message.setLength(length);
+					if (!dynamicAttributesAllowed) {
+						String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_6, a.getName());
+						LocalizedMessage message = new LocalizedMessage(fSeverityUnknownAttribute, msgText, file);
+						int start = ((IDOMAttr) a).getNameRegionStartOffset();
+						int length = ((IDOMAttr) a).getNameRegionEndOffset() - start;
+						int lineNo = document.getLineOfOffset(start);
+						message.setLineNo(lineNo);
+						message.setOffset(start);
+						message.setLength(length);
 
-					reporter.addMessage(fMessageOriginator, message);
+						reporter.addMessage(fMessageOriginator, message);
+					}
 				}
 				else {
 					foundjspattribute = true;
 				}
 			}
+			else {
+				if (fSeverityUnexpectedRuntimeExpression != ValidationMessage.IGNORE && adec instanceof TLDAttributeDeclaration) {
+					// The attribute cannot have a runtime evaluation of an expression
+					if (!isTrue(((TLDAttributeDeclaration) adec).getRtexprvalue())) {
+						IDOMAttr attr = (IDOMAttr) a;
+						if(checkRuntimeValue(attr) && !fIsELIgnored) {
+							String msg = NLS.bind(JSPCoreMessages.JSPActionValidator_1, a.getName());
+							LocalizedMessage message = new LocalizedMessage(fSeverityUnexpectedRuntimeExpression, msg, file);
+							ITextRegion region = attr.getValueRegion();
+							int start = attr.getValueRegionStartOffset();
+							int length = region != null ? region.getTextLength() : 0;
+							int lineNo = document.getLineOfOffset(start);
+							message.setLineNo(lineNo);
+							message.setOffset(start);
+							message.setLength(length);
+							reporter.addMessage(fMessageOriginator, message);
+						}
+					}
+				}
+			}
 		}
 		return foundjspattribute;
 	}
 
+	private boolean isTrue(String value) {
+		return JSP11TLDNames.TRUE.equalsIgnoreCase(value) || JSP11TLDNames.YES.equalsIgnoreCase(value);
+	}
+
 	public void cleanup(IReporter reporter) {
 		super.cleanup(reporter);
 		fTaglibPrefixes.clear();
@@ -238,6 +328,8 @@
 				List trackers = manager.getTaglibTrackers();
 				for (Iterator it = trackers.iterator(); it.hasNext();) {
 					TaglibTracker tracker = (TaglibTracker) it.next();
+					if (tracker.getElements().getLength() == 0)
+						continue;
 					String prefix = tracker.getPrefix();
 					fTaglibPrefixes.add(prefix);
 				}
@@ -283,6 +375,7 @@
 		fSeverityMissingRequiredAttribute = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_MISSING_REQUIRED_ATTRIBUTE);
 		fSeverityNonEmptyInlineTag = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_NON_EMPTY_INLINE_TAG);
 		fSeverityUnknownAttribute = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_UNKNOWN_ATTRIBUTE);
+		fSeverityUnexpectedRuntimeExpression = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_ACTIONS_SEVERITY_UNEXPECTED_RTEXPRVALUE);
 	}
 
 	void performValidation(IFile f, IReporter reporter, IStructuredModel model) {
@@ -295,6 +388,7 @@
 		loadPreferences(f);
 		IStructuredDocument sDoc = model.getStructuredDocument();
 
+		fIsELIgnored = isElIgnored(f.getFullPath(), model);
 		// iterate all document regions
 		IStructuredDocumentRegion region = sDoc.getRegionAtCharacterOffset(validateRegion.getOffset());
 		while (region != null && !reporter.isCancelled() && (region.getStartOffset() <= (validateRegion.getOffset() + validateRegion.getLength()))) {
@@ -328,9 +422,9 @@
 			if (query != null) {
 				CMElementDeclaration cmElement = query.getCMElementDeclaration(element);
 				if (cmElement != null) {
-					CMNamedNodeMap cmAttributes = cmElement.getAttributes();
+					CMNamedNodeMap cmAttributes = null;
 
-					CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(cmAttributes);
+					CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl();
 					List nodes = query.getAvailableContent(element, cmElement, ModelQuery.INCLUDE_ATTRIBUTES);
 					for (int k = 0; k < nodes.size(); k++) {
 						CMNode cmnode = (CMNode) nodes.get(k);
@@ -340,7 +434,7 @@
 					}
 					cmAttributes = allAttributes;
 
-					boolean foundjspattribute = checkUnknownAttributes(element, cmAttributes, reporter, file, model.getStructuredDocument(), documentRegion);
+					boolean foundjspattribute = checkUnknownAttributes(element, cmElement, cmAttributes, reporter, file, model.getStructuredDocument(), documentRegion);
 					// required attributes could be hidden in jsp regions in
 					// tags, so if jsp regions were detected, do not check for
 					// missing required attributes
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPBatchValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPBatchValidator.java
index d4dde9f..42c287b 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPBatchValidator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPBatchValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
+ * Copyright (c) 2006, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,6 +16,8 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
@@ -29,6 +31,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
@@ -43,7 +46,8 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.Logger;
-import org.eclipse.jst.jsp.core.internal.contentproperties.JSPFContentProperties;
+import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache;
+import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache.PropertyGroup;
 import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.sse.core.StructuredModelManager;
@@ -109,6 +113,11 @@
 	private static final String PLUGIN_ID_JSP_CORE = "org.eclipse.jst.jsp.core"; //$NON-NLS-1$
 
 	/**
+	 * List of IResources that the currently validating file depends upon
+	 */
+	private Collection fDependsOn;
+
+	/**
 	 * Gets current validation project configuration based on current project
 	 * (which is based on current document)
 	 * 
@@ -168,6 +177,11 @@
 
 	private JSPActionValidator fJSPActionValidator = new JSPActionValidator(this);
 
+	void addDependsOn(IResource resource) {
+		if(resource != null) {
+			fDependsOn.add(resource);
+		}
+	}
 
 	public void cleanup(IReporter reporter) {
 		fJSPDirectiveValidator.cleanup(reporter);
@@ -243,7 +257,7 @@
 		// quick check to see if this is possibly a jsp fragment
 		if (getJSPFContentType().isAssociatedWith(file.getName())) {
 			// get preference for validate jsp fragments
-			boolean shouldValidateFragments = Boolean.valueOf(JSPFContentProperties.getProperty(JSPFContentProperties.VALIDATE_FRAGMENTS, file, true)).booleanValue();
+			boolean shouldValidateFragments = FragmentValidationTools.shouldValidateFragment(file);
 			/*
 			 * if jsp fragments should not be validated, check if file is
 			 * really jsp fragment
@@ -472,11 +486,41 @@
 	public ValidationResult validate(final IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
 		if (resource.getType() != IResource.FILE)
 			return null;
-		ValidationResult result = new ValidationResult();
+		final ValidationResult result = new ValidationResult();
 		final IReporter reporter = result.getReporter(monitor);
+		
+		if(result.getDependsOn() != null) {
+			fDependsOn = new HashSet(Arrays.asList(result.getDependsOn()));
+		}
+		else {
+			fDependsOn = new HashSet();
+		}
+		
+		// add web.xml as a dependency
+		addDependsOn(DeploymentDescriptorPropertyCache.getInstance().getWebXML(resource.getFullPath()));
+
+		// List relevant JSP 2.0 preludes/codas as dependencies
+		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+		PropertyGroup[] propertyGroups = DeploymentDescriptorPropertyCache.getInstance().getPropertyGroups(resource.getFullPath());
+		for (int j = 0; j < propertyGroups.length; j++) {
+			IPath[] preludes = propertyGroups[j].getIncludePrelude();
+			for (int i = 0; i < preludes.length; i++) {
+				addDependsOn(workspaceRoot.getFile(preludes[i]));
+			}
+			IPath[] codas = propertyGroups[j].getIncludeCoda();
+			for (int i = 0; i < codas.length; i++) {
+				addDependsOn(workspaceRoot.getFile(codas[i]));
+			}
+		}
+		
 		IWorkspaceRunnable validationRunnable = new IWorkspaceRunnable() {
 			public void run(IProgressMonitor monitor) throws CoreException {
-				validateFile((IFile) resource, reporter);
+				if (fragmentCheck((IFile) resource)) {
+					validateFile((IFile) resource, reporter);
+				}
+				IResource[] resources = (IResource[]) fDependsOn.toArray(new IResource[fDependsOn.size()]);
+				result.setDependsOn(resources);
+				fDependsOn.clear();
 			}
 		};
 		Job currentJob = Job.getJobManager().currentJob();
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPContentValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPContentValidator.java
index fd9a126..2c13d19 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPContentValidator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPContentValidator.java
@@ -11,26 +11,91 @@
 package org.eclipse.jst.jsp.core.internal.validation;
 
 import java.io.IOException;
+import java.io.InputStream;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.jst.jsp.core.internal.Logger;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeConstants;
 import org.eclipse.wst.html.core.internal.validate.HTMLValidationAdapterFactory;
 import org.eclipse.wst.sse.core.StructuredModelManager;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.sse.core.internal.validate.ValidationAdapter;
+import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.ValidationState;
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;
+import org.w3c.dom.Element;
 
 /**
  * This validator validates the contents of the content type of the JSP, like
  * the HTML regions in a JSP with content type="text/html"
  */
 public class JSPContentValidator extends JSPValidator {
+	private static final String HTTP_JAVA_SUN_COM_JSP_PAGE = "http://java.sun.com/JSP/Page"; //$NON-NLS-1$
+	private static final String XMLNS = "xmlns"; //$NON-NLS-1$
+	private static final String XMLNS_JSP = "xmlns:jsp"; //$NON-NLS-1$
+	private IContentType fJSPFContentType = null;
+
+
+	/**
+	 * Checks if file is a jsp fragment or not. If so, check if the fragment
+	 * should be validated or not.
+	 * 
+	 * @param file
+	 *            Assumes shouldValidate was already called on file so it
+	 *            should not be null and does exist
+	 * @return false if file is a fragment and it should not be validated,
+	 *         true otherwise
+	 */
+	private boolean fragmentCheck(IFile file) {
+		boolean shouldValidate = true;
+		// quick check to see if this is possibly a jsp fragment
+		if (getJSPFContentType().isAssociatedWith(file.getName())) {
+			// get preference for validate jsp fragments
+			boolean shouldValidateFragments = FragmentValidationTools.shouldValidateFragment(file);
+			/*
+			 * if jsp fragments should not be validated, check if file is
+			 * really jsp fragment
+			 */
+			if (!shouldValidateFragments) {
+				boolean isFragment = isFragment(file);
+				shouldValidate = !isFragment;
+			}
+		}
+		return shouldValidate;
+	}
+
+	/**
+	 * Returns JSP fragment content type
+	 * 
+	 * @return jspf content type
+	 */
+	private IContentType getJSPFContentType() {
+		if (fJSPFContentType == null) {
+			fJSPFContentType = Platform.getContentTypeManager().getContentType(ContentTypeIdForJSP.ContentTypeID_JSPFRAGMENT);
+		}
+		return fJSPFContentType;
+	}
+
+	/*
+	 * Copied from HTMLValidator
+	 */
+	private HTMLValidationReporter getReporter(IReporter reporter, IFile file, IDOMModel model) {
+		return new HTMLValidationReporter(this, reporter, file, model);
+	}
+
 	/*
 	 * Copied from HTMLValidator
 	 */
@@ -41,13 +106,81 @@
 		return adapter.hasFeature(HTMLDocumentTypeConstants.HTML);
 	}
 
-	/*
-	 * Copied from HTMLValidator
+	/**
+	 * Determines if file is jsp fragment or not (does a deep, indepth check,
+	 * looking into contents of file)
+	 * 
+	 * @param file
+	 *            assumes file is not null and exists
+	 * @return true if file is jsp fragment, false otherwise
 	 */
-	private HTMLValidationReporter getReporter(IReporter reporter, IFile file, IDOMModel model) {
-		return new HTMLValidationReporter(this, reporter, file, model);
+	private boolean isFragment(IFile file) {
+		boolean isFragment = false;
+		InputStream is = null;
+		try {
+			IContentDescription contentDescription = file.getContentDescription();
+			// it can be null
+			if (contentDescription == null) {
+				is = file.getContents();
+				contentDescription = Platform.getContentTypeManager().getDescriptionFor(is, file.getName(), new QualifiedName[]{IContentDescription.CHARSET});
+			}
+			if (contentDescription != null) {
+				String fileCtId = contentDescription.getContentType().getId();
+				isFragment = (fileCtId != null && ContentTypeIdForJSP.ContentTypeID_JSPFRAGMENT.equals(fileCtId));
+			}
+		}
+		catch (IOException e) {
+			// ignore, assume it's invalid JSP
+		}
+		catch (CoreException e) {
+			// ignore, assume it's invalid JSP
+		}
+		finally {
+			/*
+			 * must close input stream in case others need it
+			 * (IFile.getContents() requirement as well)
+			 */
+			if (is != null)
+				try {
+					is.close();
+				}
+				catch (Exception e) {
+					// not sure how to recover at this point
+				}
+		}
+		return isFragment;
 	}
 
+	private boolean isXMLJSP(IDOMDocument document) {
+		Element root = document.getDocumentElement();
+		return root != null && (root.hasAttribute(XMLNS_JSP) || HTTP_JAVA_SUN_COM_JSP_PAGE.equals(root.getAttribute(XMLNS)));
+	}
+
+	private void validate(IFile file, int kind, ValidationState state, IProgressMonitor monitor, IDOMModel model, IReporter reporter) {
+		IDOMDocument document = model.getDocument();
+		if (document == null)
+			return; // error
+
+		boolean isXMLJSP = isXMLJSP(document);
+		boolean hasHTMLFeature = hasHTMLFeature(document);
+
+		if (hasHTMLFeature && !isXMLJSP) {
+			INodeAdapterFactory factory = HTMLValidationAdapterFactory.getInstance();
+			ValidationAdapter adapter = (ValidationAdapter) factory.adapt(document);
+			if (adapter != null) {
+				HTMLValidationReporter rep = getReporter(reporter, file, model);
+				rep.clear();
+				adapter.setReporter(rep);
+				adapter.validate(document);
+			}
+		}
+		if (!hasHTMLFeature && isXMLJSP) {
+			Validator xmlValidator = new Validator();
+			xmlValidator.validate(file, kind, state, monitor);
+		}
+	}
+
+
 	/*
 	 * Mostly copied from HTMLValidator
 	 */
@@ -60,7 +193,9 @@
 
 		// This validator currently only handles validating HTML content in
 		// JSP
-		if (hasHTMLFeature(document)) {
+		boolean hasXMLFeature = isXMLJSP(document);
+		boolean hasHTMLFeature = hasHTMLFeature(document);
+		if (hasHTMLFeature && !hasXMLFeature) {
 			INodeAdapterFactory factory = HTMLValidationAdapterFactory.getInstance();
 			ValidationAdapter adapter = (ValidationAdapter) factory.adapt(document);
 			if (adapter == null)
@@ -73,13 +208,46 @@
 		}
 	}
 
+	public ValidationResult validate(final IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
+		if (resource.getType() != IResource.FILE)
+			return null;
+
+		ValidationResult result = new ValidationResult();
+		final IReporter reporter = result.getReporter(monitor);
+
+		if (fragmentCheck((IFile) resource)) {
+			IStructuredModel model = null;
+			try {
+				model = StructuredModelManager.getModelManager().getModelForRead((IFile) resource);
+				if (!reporter.isCancelled() && model instanceof IDOMModel) {
+					reporter.removeAllMessages(this, resource);
+					validate((IFile) resource, kind, state, monitor, (IDOMModel) model, reporter);
+				}
+			}
+			catch (IOException e) {
+				Logger.logException(e);
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+			finally {
+				if (model != null)
+					model.releaseFromRead();
+			}
+		}
+
+		return result;
+	}
+
 	protected void validateFile(IFile f, IReporter reporter) {
 		IStructuredModel model = null;
 		try {
-			model = StructuredModelManager.getModelManager().getModelForRead(f);
-			if (!reporter.isCancelled() && model instanceof IDOMModel) {
-				reporter.removeAllMessages(this, f);
-				validate(reporter, f, (IDOMModel) model);
+			if (fragmentCheck(f)) {
+				model = StructuredModelManager.getModelManager().getModelForRead(f);
+				if (!reporter.isCancelled() && model instanceof IDOMModel) {
+					reporter.removeAllMessages(this, f);
+					validate(reporter, f, (IDOMModel) model);
+				}
 			}
 		}
 		catch (IOException e) {
@@ -93,4 +261,5 @@
 				model.releaseFromRead();
 		}
 	}
+
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPDirectiveValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPDirectiveValidator.java
index 687e966..a1c9367 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPDirectiveValidator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPDirectiveValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,14 +14,20 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.preferences.DefaultScope;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
@@ -35,11 +41,16 @@
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
 import org.eclipse.jst.jsp.core.internal.Logger;
+import org.eclipse.jst.jsp.core.internal.contenttype.DeploymentDescriptorPropertyCache;
 import org.eclipse.jst.jsp.core.internal.preferences.JSPCorePreferenceNames;
 import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.jst.jsp.core.internal.util.FacetModuleCoreSupport;
+import org.eclipse.jst.jsp.core.taglib.IJarRecord;
+import org.eclipse.jst.jsp.core.taglib.ITLDRecord;
+import org.eclipse.jst.jsp.core.taglib.ITagDirRecord;
 import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
+import org.eclipse.jst.jsp.core.taglib.IURLRecord;
 import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.html.core.internal.contentmodel.JSP20Namespace;
@@ -49,11 +60,15 @@
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.internal.text.IRegionComparible;
 import org.eclipse.wst.sse.core.internal.validate.ValidationMessage;
 import org.eclipse.wst.sse.core.utils.StringUtils;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
 
 import com.ibm.icu.text.Collator;
 
@@ -105,13 +120,25 @@
 		this.fMessageOriginator = validator;
 	}
 
+	/**
+	 * Record that the currently validating resource depends on the given
+	 * file. Only possible during batch (not source) validation.
+	 * 
+	 * @param file
+	 */
+	void addDependsOn(IResource file) {
+		if (fMessageOriginator instanceof JSPBatchValidator) {
+			((JSPBatchValidator) fMessageOriginator).addDependsOn(file);
+		}
+	}
+
 	public void cleanup(IReporter reporter) {
 		super.cleanup(reporter);
 		fTaglibPrefixesInUse.clear();
 		fPrefixValueRegionToDocumentRegionMap.clear();
 	}
 
-	private void collectTaglibPrefix(IStructuredDocumentRegion documentRegion, ITextRegion valueRegion, String taglibPrefix) {
+	private void collectTaglibPrefix(ITextRegionCollection documentRegion, ITextRegion valueRegion, String taglibPrefix) {
 		fPrefixValueRegionToDocumentRegionMap.put(valueRegion, documentRegion);
 
 		Object o = fTaglibPrefixesInUse.get(taglibPrefix);
@@ -201,6 +228,10 @@
 		fPrefixValueRegionToDocumentRegionMap.clear();
 		fTaglibPrefixesInUse.clear();
 
+		IRegionComparible comparer = null;
+		if (sDoc instanceof IRegionComparible)
+			comparer = (IRegionComparible) sDoc;
+		
 		// iterate all document regions
 		IStructuredDocumentRegion region = sDoc.getFirstStructuredDocumentRegion();
 		while (region != null && !reporter.isCancelled()) {
@@ -208,6 +239,28 @@
 			if (region.getType() == DOMJSPRegionContexts.JSP_DIRECTIVE_NAME) {
 				processDirective(reporter, f, sDoc, region);
 			}
+			//To check directives inside script tag.
+			else if (region.getType() == DOMRegionContext.BLOCK_TEXT) {
+				Iterator it = region.getRegions().iterator();
+				while (it.hasNext()) {
+					Object blockRegion = it.next();
+					if (blockRegion instanceof ITextRegionCollection) {
+						processDirective(reporter, f, sDoc, (ITextRegionCollection)blockRegion);
+					}
+				}
+			}
+			// requires tag name, attribute, equals, and value
+			else if (comparer != null && region.getNumberOfRegions() > 4) {
+				ITextRegion nameRegion = region.getRegions().get(1);
+				if (comparer.regionMatches(region.getStartOffset(nameRegion), nameRegion.getTextLength(), "jsp:include")) { //$NON-NLS-1$
+					processInclude(reporter, f, sDoc, region, JSP11Namespace.ATTR_NAME_PAGE);
+				}
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=295950
+				else if (comparer.regionMatches(region.getStartOffset(nameRegion), 14, "jsp:directive.")) { //$NON-NLS-1$
+					processDirective(reporter, f, sDoc, region);
+				}
+
+			}
 			region = region.getNext();
 		}
 
@@ -221,68 +274,75 @@
 		unloadPreferences();
 	}
 
-	private void processDirective(IReporter reporter, IFile file, IStructuredDocument sDoc, IStructuredDocumentRegion documentRegion) {
+	private void processDirective(IReporter reporter, IFile file, IStructuredDocument sDoc, ITextRegionCollection documentRegion) {
 		String directiveName = getDirectiveName(documentRegion);
-		// we only care about taglib directive
-		if (directiveName.equals("taglib")) { //$NON-NLS-1$
+
+		if (directiveName.endsWith("taglib")) { //$NON-NLS-1$
 			processTaglibDirective(reporter, file, sDoc, documentRegion);
 		}
-		else if (directiveName.equals("include")) { //$NON-NLS-1$
-			processIncludeDirective(reporter, file, sDoc, documentRegion);
+		else if (directiveName.equals("jsp:include")) { //$NON-NLS-1$
+			processInclude(reporter, file, sDoc, documentRegion, JSP11Namespace.ATTR_NAME_PAGE);
 		}
-		else if (directiveName.equals("page")) { //$NON-NLS-1$
+		else if (directiveName.endsWith("include")) { //$NON-NLS-1$
+			processInclude(reporter, file, sDoc, documentRegion, JSP11Namespace.ATTR_NAME_FILE);
+		}
+		else if (directiveName.endsWith("page")) { //$NON-NLS-1$
 			processPageDirective(reporter, file, sDoc, documentRegion);
 		}
 	}
 
-	private void processIncludeDirective(IReporter reporter, IFile file, IStructuredDocument sDoc, IStructuredDocumentRegion documentRegion) {
-		ITextRegion fileValueRegion = getAttributeValueRegion(documentRegion, JSP11Namespace.ATTR_NAME_FILE);
-		if (fileValueRegion != null) {
+	private void processInclude(IReporter reporter, IFile file, IStructuredDocument sDoc, ITextRegionCollection documentRegion, String attrName) {
+		ITextRegion fileValueRegion = getAttributeValueRegion(documentRegion, attrName);
+		// There is a file and it isn't a nested region which could contain a JSP expression
+		if (fileValueRegion != null && !hasNestedRegion(fileValueRegion)) {
 			// file specified
 			String fileValue = documentRegion.getText(fileValueRegion);
 			fileValue = StringUtils.stripQuotes(fileValue);
 
 			if (fileValue.length() == 0 && fSeverityIncludeFileNotSpecified != ValidationMessage.IGNORE) {
 				// file value is specified but empty
-				String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_3, JSP11Namespace.ATTR_NAME_FILE);
+				String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_3, attrName);
 				LocalizedMessage message = new LocalizedMessage(fSeverityIncludeFileNotSpecified, msgText, file);
 				int start = documentRegion.getStartOffset(fileValueRegion);
 				int length = fileValueRegion.getTextLength();
 				int lineNo = sDoc.getLineOfOffset(start);
-				message.setLineNo(lineNo);
+				message.setLineNo(lineNo + 1);
 				message.setOffset(start);
 				message.setLength(length);
 
 				reporter.addMessage(fMessageOriginator, message);
 			}
-			else if (fSeverityIncludeFileMissing != ValidationMessage.IGNORE) {
+			else if (DeploymentDescriptorPropertyCache.getInstance().getURLMapping(file.getFullPath(), fileValue) == null) {
 				IPath testPath = FacetModuleCoreSupport.resolve(file.getFullPath(), fileValue);
 				if (testPath.segmentCount() > 1) {
 					IFile testFile = file.getWorkspace().getRoot().getFile(testPath);
+					addDependsOn(testFile);
 					if (!testFile.isAccessible()) {
-						// File not found
-						String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_4, new String[]{fileValue, testPath.toString()});
-						LocalizedMessage message = new LocalizedMessage(fSeverityIncludeFileMissing, msgText, file);
-						int start = documentRegion.getStartOffset(fileValueRegion);
-						int length = fileValueRegion.getTextLength();
-						int lineNo = sDoc.getLineOfOffset(start);
-						message.setLineNo(lineNo);
-						message.setOffset(start);
-						message.setLength(length);
+						if (fSeverityIncludeFileMissing != ValidationMessage.IGNORE) {
+							// File not found
+							String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_4, new String[]{fileValue, testPath.toString()});
+							LocalizedMessage message = new LocalizedMessage(fSeverityIncludeFileMissing, msgText, file);
+							int start = documentRegion.getStartOffset(fileValueRegion);
+							int length = fileValueRegion.getTextLength();
+							int lineNo = sDoc.getLineOfOffset(start);
+							message.setLineNo(lineNo + 1);
+							message.setOffset(start);
+							message.setLength(length);
 
-						reporter.addMessage(fMessageOriginator, message);
+							reporter.addMessage(fMessageOriginator, message);
+						}
 					}
 				}
 			}
 		}
-		else if (fSeverityIncludeFileNotSpecified != ValidationMessage.IGNORE) {
+		else if (fileValueRegion == null && fSeverityIncludeFileNotSpecified != ValidationMessage.IGNORE) {
 			// file is not specified at all
-			String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_3, JSP11Namespace.ATTR_NAME_FILE);
+			String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_3, attrName);
 			LocalizedMessage message = new LocalizedMessage(fSeverityIncludeFileNotSpecified, msgText, file);
 			int start = documentRegion.getStartOffset();
 			int length = documentRegion.getTextLength();
 			int lineNo = sDoc.getLineOfOffset(start);
-			message.setLineNo(lineNo);
+			message.setLineNo(lineNo + 1);
 			message.setOffset(start);
 			message.setLength(length);
 
@@ -296,7 +356,7 @@
 	 * @param doc
 	 * @param documentRegion
 	 */
-	private void processPageDirective(IReporter reporter, IFile file, IStructuredDocument doc, IStructuredDocumentRegion documentRegion) {
+	private void processPageDirective(IReporter reporter, IFile file, IStructuredDocument doc, ITextRegionCollection documentRegion) {
 		ITextRegion superclassValueRegion = getAttributeValueRegion(documentRegion, JSP11Namespace.ATTR_NAME_EXTENDS);
 		if (superclassValueRegion != null) {
 			// file specified
@@ -314,13 +374,13 @@
 			}
 
 			if (superClass == null && fSeveritySuperClassNotFound != ValidationMessage.IGNORE) {
-				// file value is specified but empty
+				// superclass not found
 				String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_8, superclassName);
 				LocalizedMessage message = new LocalizedMessage(fSeveritySuperClassNotFound, msgText, file);
 				int start = documentRegion.getStartOffset(superclassValueRegion);
 				int length = superclassValueRegion.getTextLength();
 				int lineNo = doc.getLineOfOffset(start);
-				message.setLineNo(lineNo);
+				message.setLineNo(lineNo + 1);
 				message.setOffset(start);
 				message.setLength(length);
 
@@ -329,7 +389,7 @@
 		}
 	}
 
-	private void processTaglibDirective(IReporter reporter, IFile file, IStructuredDocument sDoc, IStructuredDocumentRegion documentRegion) {
+	private void processTaglibDirective(IReporter reporter, IFile file, IStructuredDocument sDoc, ITextRegionCollection documentRegion) {
 		ITextRegion prefixValueRegion = null;
 		ITextRegion uriValueRegion = getAttributeValueRegion(documentRegion, JSP11Namespace.ATTR_NAME_URI);
 		ITextRegion tagdirValueRegion = getAttributeValueRegion(documentRegion, JSP20Namespace.ATTR_NAME_TAGDIR);
@@ -340,19 +400,98 @@
 			if (file != null) {
 				uri = StringUtils.stripQuotes(uri);
 				if (uri.length() > 0) {
-					ITaglibRecord tld = TaglibIndex.resolve(file.getFullPath().toString(), uri, false);
-					if (tld == null && fSeverityTaglibUnresolvableURI != ValidationMessage.IGNORE) {
+					ITaglibRecord reference = TaglibIndex.resolve(file.getFullPath().toString(), uri, false);
+					if (reference != null) {
+						switch (reference.getRecordType()) {
+							case (ITaglibRecord.TLD) : {
+								ITLDRecord record = (ITLDRecord) reference;
+								IResource tldfile = ResourcesPlugin.getWorkspace().getRoot().getFile(record.getPath());
+								addDependsOn(tldfile);
+							}
+								break;
+							case (ITaglibRecord.JAR) : {
+								IJarRecord record = (IJarRecord) reference;
+								IFile[] foundFilesForLocation = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(record.getLocation());
+								for (int i = 0; i < foundFilesForLocation.length; i++) {
+									addDependsOn(foundFilesForLocation[i]);
+								}
+							}
+								break;
+							case (ITaglibRecord.TAGDIR) : {
+								ITagDirRecord record = (ITagDirRecord) reference;
+								IPath path = record.getPath();
+								IResource found = ResourcesPlugin.getWorkspace().getRoot().findMember(path, false);
+
+								try {
+									found.accept(new IResourceVisitor() {
+										public boolean visit(IResource resource) throws CoreException {
+											if (resource.getType() == IResource.FILE) {
+												addDependsOn(resource);
+											}
+											return true;
+										}
+									});
+								}
+								catch (CoreException e) {
+									Logger.logException(e);
+								}
+							}
+								break;
+							case (ITaglibRecord.URL) : {
+								IURLRecord record = (IURLRecord) reference;
+								String baseLocation = record.getBaseLocation();
+								if (baseLocation != null && baseLocation.indexOf("://") < 0) {
+									IResource found = ResourcesPlugin.getWorkspace().getRoot().findMember(baseLocation, false);
+									if (found != null) {
+										try {
+											found.accept(new IResourceVisitor() {
+												public boolean visit(IResource resource) throws CoreException {
+													if (resource.getType() == IResource.FILE) {
+														addDependsOn(resource);
+													}
+													return true;
+												}
+											});
+										}
+										catch (CoreException e) {
+											Logger.logException(e);
+										}
+									}
+									else {
+										IFile externalJar = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(baseLocation));
+										if (externalJar != null) {
+											addDependsOn(externalJar);
+										}
+									}
+								}
+							}
+								break;
+						}
+					}
+					if (reference == null && fSeverityTaglibUnresolvableURI != ValidationMessage.IGNORE) {
 						// URI specified but does not resolve
-						String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_1, uri);
+						String msgText = null;
+						// provide better messages for typical "http:*" URIs
+						if (uri.startsWith("http:") && DeploymentDescriptorPropertyCache.getInstance().getJSPVersion(file.getFullPath()) < 1.2) { //$NON-NLS-1$
+							if (FacetModuleCoreSupport.isDynamicWebProject(file.getProject())) {
+								msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_9, uri);
+							}
+							else {
+								msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_10, uri);
+							}
+						}
+						else {
+							msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_1, uri);
+						}
 						LocalizedMessage message = new LocalizedMessage(fSeverityTaglibUnresolvableURI, msgText, file);
 						int start = documentRegion.getStartOffset(uriValueRegion);
 						int length = uriValueRegion.getTextLength();
 						int lineNo = sDoc.getLineOfOffset(start);
-						message.setLineNo(lineNo);
+						message.setLineNo(lineNo + 1);
 						message.setOffset(start);
 						message.setLength(length);
 
-						message.setAttribute("PROBLEM_ID", new Integer(611));
+						message.setAttribute("PROBLEM_ID", new Integer(611)); //$NON-NLS-1$
 
 						reporter.addMessage(fMessageOriginator, message);
 					}
@@ -364,7 +503,7 @@
 					int start = documentRegion.getStartOffset(uriValueRegion);
 					int length = uriValueRegion.getTextLength();
 					int lineNo = sDoc.getLineOfOffset(start);
-					message.setLineNo(lineNo);
+					message.setLineNo(lineNo + 1);
 					message.setOffset(start);
 					message.setLength(length);
 
@@ -385,7 +524,7 @@
 					int start = documentRegion.getStartOffset(tagdirValueRegion);
 					int length = tagdirValueRegion.getTextLength();
 					int lineNo = sDoc.getLineOfOffset(start);
-					message.setLineNo(lineNo);
+					message.setLineNo(lineNo + 1);
 					message.setOffset(start);
 					message.setLength(length);
 
@@ -393,12 +532,12 @@
 				}
 				else if (TaglibIndex.resolve(file.getFullPath().toString(), tagdir, false) == null && fSeverityTagdirUnresolvableURI != ValidationMessage.IGNORE) {
 					// URI specified but does not resolve
-					String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_1, tagdir);
+					String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_11, tagdir);
 					LocalizedMessage message = new LocalizedMessage(fSeverityTaglibUnresolvableURI, msgText, file);
 					int start = documentRegion.getStartOffset(tagdirValueRegion);
 					int length = tagdirValueRegion.getTextLength();
 					int lineNo = sDoc.getLineOfOffset(start);
-					message.setLineNo(lineNo);
+					message.setLineNo(lineNo + 1);
 					message.setOffset(start);
 					message.setLength(length);
 
@@ -413,7 +552,7 @@
 			int start = documentRegion.getStartOffset();
 			int length = documentRegion.getTextLength();
 			int lineNo = sDoc.getLineOfOffset(start);
-			message.setLineNo(lineNo);
+			message.setLineNo(lineNo + 1);
 			message.setOffset(start);
 			message.setLength(length);
 
@@ -436,7 +575,7 @@
 				int start = documentRegion.getStartOffset(prefixValueRegion);
 				int length = prefixValueRegion.getTextLength();
 				int lineNo = sDoc.getLineOfOffset(start);
-				message.setLineNo(lineNo);
+				message.setLineNo(lineNo + 1);
 				message.setOffset(start);
 				message.setLength(length);
 
@@ -449,7 +588,7 @@
 				int start = documentRegion.getStartOffset(prefixValueRegion);
 				int length = prefixValueRegion.getTextLength();
 				int lineNo = sDoc.getLineOfOffset(start);
-				message.setLineNo(lineNo);
+				message.setLineNo(lineNo + 1);
 				message.setOffset(start);
 				message.setLength(length);
 
@@ -463,7 +602,7 @@
 			int start = documentRegion.getStartOffset();
 			int length = documentRegion.getTextLength();
 			int lineNo = sDoc.getLineOfOffset(start);
-			message.setLineNo(lineNo);
+			message.setLineNo(lineNo + 1);
 			message.setOffset(start);
 			message.setLength(length);
 
@@ -489,7 +628,7 @@
 				List valueRegions = (List) o;
 				String uri = null;
 				for (int regionNumber = 0; regionNumber < valueRegions.size(); regionNumber++) {
-					IStructuredDocumentRegion documentRegion = (IStructuredDocumentRegion) fPrefixValueRegionToDocumentRegionMap.get(valueRegions.get(regionNumber));
+					ITextRegionCollection documentRegion = (ITextRegionCollection) fPrefixValueRegionToDocumentRegionMap.get(valueRegions.get(regionNumber));
 					ITextRegion uriValueRegion = getAttributeValueRegion(documentRegion, JSP11Namespace.ATTR_NAME_URI);
 					if (uriValueRegion == null) {
 						uriValueRegion = getAttributeValueRegion(documentRegion, JSP20Namespace.ATTR_NAME_TAGDIR);
@@ -507,24 +646,26 @@
 					}
 				}
 
-				String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_2, prefixes[prefixNumber]); //$NON-NLS-2$ //$NON-NLS-1$
+				if (severity != ValidationMessage.IGNORE) {
+					String msgText = NLS.bind(JSPCoreMessages.JSPDirectiveValidator_2, prefixes[prefixNumber]); //$NON-NLS-2$ //$NON-NLS-1$
 
-				// Report an error in all directives using this prefix
-				for (int regionNumber = 0; regionNumber < valueRegions.size(); regionNumber++) {
+					// Report an error in all directives using this prefix
+					for (int regionNumber = 0; regionNumber < valueRegions.size(); regionNumber++) {
 
-					ITextRegion valueRegion = (ITextRegion) valueRegions.get(regionNumber);
-					IStructuredDocumentRegion documentRegion = (IStructuredDocumentRegion) fPrefixValueRegionToDocumentRegionMap.get(valueRegion);
-					LocalizedMessage message = (file == null ? new LocalizedMessage(severity, msgText) : new LocalizedMessage(severity, msgText, file));
+						ITextRegion valueRegion = (ITextRegion) valueRegions.get(regionNumber);
+						ITextRegionCollection documentRegion = (ITextRegionCollection) fPrefixValueRegionToDocumentRegionMap.get(valueRegion);
+						LocalizedMessage message = (file == null ? new LocalizedMessage(severity, msgText) : new LocalizedMessage(severity, msgText, file));
 
-					// if there's a message, there was an error found
-					int start = documentRegion.getStartOffset(valueRegion);
-					int length = valueRegion.getTextLength();
-					int lineNo = document.getLineOfOffset(start);
-					message.setLineNo(lineNo);
-					message.setOffset(start);
-					message.setLength(length);
+						// if there's a message, there was an error found
+						int start = documentRegion.getStartOffset(valueRegion);
+						int length = valueRegion.getTextLength();
+						int lineNo = document.getLineOfOffset(start);
+						message.setLineNo(lineNo + 1);
+						message.setOffset(start);
+						message.setLength(length);
 
-					reporter.addMessage(fMessageOriginator, message);
+						reporter.addMessage(fMessageOriginator, message);
+					}
 				}
 			}
 		}
@@ -553,6 +694,14 @@
 		fPreferencesService = null;
 		fScopes = null;
 	}
+	
+	/**
+	 * True if container has nested regions, meaning container is probably too
+	 * complicated (like JSP expressions or EL) to validate with this validator.
+	 */
+	private boolean hasNestedRegion(ITextRegion container) {
+		return (container instanceof ITextRegionContainer && ((ITextRegionContainer) container).getRegions() != null);
+	}
 
 	/**
 	 * batch validation call
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPELValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPELValidator.java
index 8fb17de..cf84532 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPELValidator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPELValidator.java
@@ -46,7 +46,8 @@
 public class JSPELValidator extends JSPValidator {
 	private static final boolean DEBUG = Boolean.valueOf(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspvalidator")).booleanValue(); //$NON-NLS-1$		
 	private static final String PREFERENCE_NODE_QUALIFIER = JSPCorePlugin.getDefault().getBundle().getSymbolicName();
-
+	private static final int MAX_REGIONS = 1000;
+	
 	private IValidator fMessageOriginator;
 
 	public JSPELValidator() {
@@ -137,12 +138,55 @@
 				Iterator childRegions = parentRegion.getRegions().iterator();
 				while (childRegions.hasNext() && !reporter.isCancelled()) {
 					ITextRegion childRegion = (ITextRegion) childRegions.next();
-					if (childRegion.getType() == DOMJSPRegionContexts.JSP_EL_CONTENT)
-						validateXMLNode(parentRegion, childRegion, reporter, file);
+					/* [136795] Validate everything in the EL container, not just JSP_EL_CONTENT */
+					if (childRegion.getType() == DOMJSPRegionContexts.JSP_EL_OPEN)
+						validateELContent(parentRegion, childRegion, childRegions, reporter, file);
 				}
 			}
 		}
 	}
+	
+	protected void validateELContent(ITextRegionCollection container, ITextRegion elOpenRegion, Iterator elRegions, IReporter reporter, IFile file) {
+		int contentStart = elOpenRegion.getEnd();
+		int contentDocStart = container.getEndOffset(elOpenRegion);
+		int contentLength = container.getLength();
+		int regionCount = 0;
+		ITextRegion elRegion = null;
+		/* Find the EL closing region, otherwise the last region will be used to calculate the EL content text */
+		while (elRegions != null && elRegions.hasNext() && (regionCount++ < MAX_REGIONS)) {
+			elRegion = (ITextRegion) elRegions.next();
+			if (elRegion.getType() == DOMJSPRegionContexts.JSP_EL_CLOSE)
+				break;
+		}
+		
+		String elText = container.getFullText().substring(contentStart, (elRegion != null) ? elRegion.getStart() : (contentLength - 1));
+		JSPELParser elParser = JSPELParser.createParser(elText);
+		try {
+			elParser.Expression();
+		}
+		catch (ParseException e) {
+			int sev = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_EL_SYNTAX);
+			if (sev != ValidationMessage.IGNORE) {
+				Token curTok = e.currentToken;
+				int problemStartOffset = contentDocStart + curTok.beginColumn;
+				Message message = new LocalizedMessage(sev, JSPCoreMessages.JSPEL_Syntax);
+				message.setOffset(problemStartOffset);
+				message.setLength(curTok.endColumn - curTok.beginColumn + 1);
+				message.setTargetObject(file);
+				reporter.addMessage(fMessageOriginator, message);
+			}
+		}
+		catch (TokenMgrError te) {
+			int sev = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_EL_LEXER);
+			if (sev != ValidationMessage.IGNORE) {
+				Message message = new LocalizedMessage(IMessage.NORMAL_SEVERITY, JSPCoreMessages.JSPEL_Token);
+				message.setOffset(contentDocStart);
+				message.setLength(contentLength);
+				message.setTargetObject(file);
+				reporter.addMessage(fMessageOriginator, message);
+			}
+		}
+	}
 
 	protected void validateXMLNode(ITextRegionCollection container, ITextRegion region, IReporter reporter, IFile file) {
 		String elText = container.getText(region);
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPJavaValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPJavaValidator.java
index b01860f..9bd15ab 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPJavaValidator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPJavaValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
+ * Copyright (c) 2006, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,6 +15,8 @@
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ProjectScope;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Platform;
@@ -51,9 +53,13 @@
 	private static final boolean DEBUG = Boolean.valueOf(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspvalidator")).booleanValue(); //$NON-NLS-1$
 	private IValidator fMessageOriginator;
 
-	private IPreferencesService fPreferencesService = null;
+	private IPreferencesService fPreferencesService = Platform.getPreferencesService();
 	private static final String PREFERENCE_NODE_QUALIFIER = JSPCorePlugin.getDefault().getBundle().getSymbolicName();
 	private IScopeContext[] fScopes = null;
+	
+	private static final boolean UPDATE_JAVA_TASKS = true;
+	private static final String JAVA_TASK_MARKER_TYPE = "org.eclipse.jdt.core.task"; //$NON-NLS-1$
+	private static final String[] DEPEND_ONs = new String[]{".classpath", ".project", ".settings/org.eclipse.jdt.core.prefs", ".settings/org.eclipse.jst.jsp.core.prefs", ".settings/org.eclipse.wst.common.project.facet.core.xml", ".settings/org.eclipse.wst.common.component"};
 
 	public JSPJavaValidator() {
 		this.fMessageOriginator = this;
@@ -159,33 +165,42 @@
 			sourceEnd = translation.getJspOffset(problem.getSourceEnd());
 			switch (problem.getID()) {
 				case IProblem.LocalVariableIsNeverUsed : {
-					sev = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_LOCAL_VARIABLE_NEVER_USED);
+					sev = getSourceSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_LOCAL_VARIABLE_NEVER_USED, sourceStart, sourceEnd);
 				}
 					break;
 				case IProblem.NullLocalVariableReference : {
-					sev = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_NULL_LOCAL_VARIABLE_REFERENCE);
+					sev = getSourceSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_NULL_LOCAL_VARIABLE_REFERENCE, sourceStart, sourceEnd);
 				}
 					break;
 				case IProblem.ArgumentIsNeverUsed : {
-					sev = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_ARGUMENT_IS_NEVER_USED);
+					sev = getSourceSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_ARGUMENT_IS_NEVER_USED, sourceStart, sourceEnd);
 				}
 					break;
 				case IProblem.PotentialNullLocalVariableReference : {
-					sev = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_POTENTIAL_NULL_LOCAL_VARIABLE_REFERENCE);
+					sev = getSourceSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_POTENTIAL_NULL_LOCAL_VARIABLE_REFERENCE, sourceStart, sourceEnd);
 				}
 					break;
 				case IProblem.UnusedImport : {
-					sev = getMessageSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_UNUSED_IMPORT);
+					sev = getSourceSeverity(JSPCorePreferenceNames.VALIDATION_JAVA_UNUSED_IMPORT, sourceStart, sourceEnd);
 				}
 					break;
+				case IProblem.UnusedPrivateField:
+				case IProblem.MissingSerialVersion : {
+					// JSP files don't get serialized...right?
+					sev = ValidationMessage.IGNORE;
+				}
+				break;
 
 				default : {
 					if (problem.isError()) {
 						sev = IMessage.HIGH_SEVERITY;
 					}
-					else {
+					else if (problem.isWarning()) {
 						sev = IMessage.NORMAL_SEVERITY;
 					}
+					else {
+						sev = IMessage.LOW_SEVERITY;
+					}
 				}
 					if (sev == ValidationMessage.IGNORE) {
 						return null;
@@ -224,6 +239,11 @@
 			return null;
 		}
 
+		final boolean isIndirect = translation.isIndirect(problem.getSourceStart());
+		if (isIndirect && !FragmentValidationTools.shouldValidateFragment(f)) {
+			return null;
+		}
+
 		// line number for marker starts @ 1
 		// line number from document starts @ 0
 		int lineNo = structuredDoc.getLineOfOffset(sourceStart) + 1;
@@ -232,18 +252,29 @@
 
 		m.setLineNo(lineNo);
 		m.setOffset(sourceStart);
-		m.setLength(sourceEnd - sourceStart + 1);
+		m.setLength((sourceEnd >= sourceStart) ? (sourceEnd - sourceStart + 1) : 0);
 
 		// need additional adjustment for problems from
 		// indirect (included) files
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=119633
-		if (translation.isIndirect(problem.getSourceStart())) {
+		if (isIndirect) {
 			adjustIndirectPosition(m, translation);
 		}
 
 		return m;
 	}
 
+	/**
+	 * Provides the severity for the given message key only when it's within the source range of the JSP (i.e., not boilerplate code).
+	 * @param key the key to get the severity of
+	 * @param start start within the JSP source
+	 * @param end end wtihin the JSP source
+	 * @return The message severity for the key if it is part of the JSP's source. IGNORE if it's boilerplate code.
+	 */
+	private int getSourceSeverity(String key, int start, int end) {
+		return (start >= 0 && end >= 0 ) ? getMessageSeverity(key) : ValidationMessage.IGNORE;
+	}
+
 	int getMessageSeverity(String key) {
 		int sev = fPreferencesService.getInt(PREFERENCE_NODE_QUALIFIER, key, IMessage.NORMAL_SEVERITY, fScopes);
 		switch (sev) {
@@ -262,7 +293,6 @@
 	private void loadPreferences(IFile file) {
 		fScopes = new IScopeContext[]{new InstanceScope(), new DefaultScope()};
 
-		fPreferencesService = Platform.getPreferencesService();
 		if (file != null && file.isAccessible()) {
 			ProjectScope projectScope = new ProjectScope(file.getProject());
 			if (projectScope.getNode(PREFERENCE_NODE_QUALIFIER).getBoolean(JSPCorePreferenceNames.VALIDATION_USE_PROJECT_SETTINGS, false)) {
@@ -272,6 +302,9 @@
 	}
 
 	void performValidation(IFile f, IReporter reporter, IStructuredModel model) {
+		for (int i = 0; i < DEPEND_ONs.length; i++) {
+			addDependsOn(f.getProject().getFile(DEPEND_ONs[i]));	
+		}
 		if (model instanceof IDOMModel) {
 			IDOMModel domModel = (IDOMModel) model;
 			ModelHandlerForJSP.ensureTranslationAdapterFactory(domModel);
@@ -283,16 +316,71 @@
 			if (!reporter.isCancelled()) {
 				loadPreferences(f);
 
+				// only update task markers if the model is the same as what's on disk
+				boolean updateJavaTasks = UPDATE_JAVA_TASKS && !domModel.isDirty() && f != null && f.isAccessible();
+				if (updateJavaTasks) {
+					// remove old Java task markers
+					try {
+						IMarker[] foundMarkers = f.findMarkers(JAVA_TASK_MARKER_TYPE, true, IResource.DEPTH_ONE);
+						for (int i = 0; i < foundMarkers.length; i++) {
+							foundMarkers[i].delete();
+						}
+					}
+					catch (CoreException e) {
+						Logger.logException(e);
+					}
+				}
+
 				translation.setProblemCollectingActive(true);
 				translation.reconcileCompilationUnit();
 				List problems = translation.getProblems();
 				// add new messages
 				for (int i = 0; i < problems.size() && !reporter.isCancelled(); i++) {
 					IProblem problem = (IProblem) problems.get(i);
-					if (problem.getID() != IProblem.Task) {
-						IMessage m = createMessageFromProblem(problem, f, translation, domModel.getStructuredDocument());
-						if (m != null)
+					/*
+					 * Possible error in problem collection; EL translation is
+					 * extensible, so we must be paranoid about this.
+					 */
+					if (problem == null)
+						continue;
+					IMessage m = createMessageFromProblem(problem, f, translation, domModel.getStructuredDocument());
+					if (m != null) {
+						if (problem.getID() == IProblem.Task) {
+							if (updateJavaTasks) {
+								// add new Java task marker
+								try {
+									IMarker task = f.createMarker(JAVA_TASK_MARKER_TYPE);
+									task.setAttribute(IMarker.LINE_NUMBER, new Integer(m.getLineNumber()));
+									task.setAttribute(IMarker.CHAR_START, new Integer(m.getOffset()));
+									task.setAttribute(IMarker.CHAR_END, new Integer(m.getOffset() + m.getLength()));
+									task.setAttribute(IMarker.MESSAGE, m.getText());
+									task.setAttribute(IMarker.USER_EDITABLE, Boolean.FALSE);
+
+									switch (m.getSeverity()) {
+										case IMessage.HIGH_SEVERITY: {
+											task.setAttribute(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_HIGH));
+											task.setAttribute(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
+										}
+											break;
+										case IMessage.LOW_SEVERITY : {
+											task.setAttribute(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_LOW));
+											task.setAttribute(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
+										}
+											break;
+										default : {
+											task.setAttribute(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_NORMAL));
+											task.setAttribute(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_WARNING));
+										}
+									}
+								}
+								catch (CoreException e) {
+									Logger.logException(e);
+								}
+							}
+						}
+						else {
 							reporter.addMessage(fMessageOriginator, m);
+						}
 					}
 				}
 			}
@@ -301,7 +389,6 @@
 	}
 
 	private void unloadPreferences() {
-		fPreferencesService = null;
 		fScopes = null;
 	}
 
@@ -321,6 +408,9 @@
 			// get jsp model, get tranlsation
 			model = StructuredModelManager.getModelManager().getModelForRead(f);
 			if (!reporter.isCancelled() && model != null) {
+				for (int i = 0; i < DEPEND_ONs.length; i++) {
+					addDependsOn(f.getProject().getFile(DEPEND_ONs[i]));	
+				}
 				// get jsp model, get translation
 				if (model instanceof IDOMModel) {
 					reporter.removeAllMessages(fMessageOriginator, f);
@@ -339,4 +429,17 @@
 				model.releaseFromRead();
 		}
 	}
+
+	/**
+	 * Record that the currently validating resource depends on the given
+	 * file. Only possible during batch (not source) validation.
+	 * 
+	 * @param file
+	 */
+	private void addDependsOn(IFile file) {
+		if (fMessageOriginator instanceof JSPBatchValidator) {
+			((JSPBatchValidator) fMessageOriginator).addDependsOn(file);
+		}
+	}
+
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPValidator.java
index 1ecbf45..a6b20c1 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPValidator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/JSPValidator.java
@@ -37,8 +37,8 @@
 import org.eclipse.jst.jsp.core.internal.contentproperties.JSPFContentProperties;
 import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.validation.AbstractValidator;
 import org.eclipse.wst.validation.ValidationResult;
@@ -252,16 +252,16 @@
 
 	/**
 	 * 
-	 * @param sdr
+	 * @param collection
 	 * @return the jsp directive name
 	 */
-	protected String getDirectiveName(IStructuredDocumentRegion sdr) {
+	protected String getDirectiveName(ITextRegionCollection collection) {
 		String name = ""; //$NON-NLS-1$
-		ITextRegionList subRegions = sdr.getRegions();
+		ITextRegionList subRegions = collection.getRegions();
 		for (int j = 0; j < subRegions.size(); j++) {
 			ITextRegion subRegion = subRegions.get(j);
 			if (subRegion.getType() == DOMJSPRegionContexts.JSP_DIRECTIVE_NAME) {
-				name = sdr.getText(subRegion);
+				name = collection.getText(subRegion);
 				break;
 			}
 		}
@@ -275,7 +275,7 @@
 	 * @return the ITextRegion for the attribute value of the given attribute
 	 *         name, case sensitive, null if no matching attribute is found
 	 */
-	protected ITextRegion getAttributeValueRegion(IStructuredDocumentRegion sdr, String attrName) {
+	protected ITextRegion getAttributeValueRegion(ITextRegionCollection sdr, String attrName) {
 		ITextRegion valueRegion = null;
 		ITextRegionList subRegions = sdr.getRegions();
 		for (int i = 0; i < subRegions.size(); i++) {
@@ -294,7 +294,7 @@
 		return valueRegion;
 	}
 
-	protected String getAttributeValue(IStructuredDocumentRegion sdr, String attrName) {
+	protected String getAttributeValue(ITextRegionCollection sdr, String attrName) {
 		ITextRegion r = getAttributeValueRegion(sdr, attrName);
 		if (r != null)
 			return sdr.getText(r).trim();
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/TLDValidator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/TLDValidator.java
new file mode 100644
index 0000000..ae70a60
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/validation/TLDValidator.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.jsp.core.internal.validation;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.jsp.core.internal.Assert;
+import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
+import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
+import org.eclipse.jst.jsp.core.internal.Logger;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP11TLDNames;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP12TLDNames;
+import org.eclipse.jst.jsp.core.internal.preferences.JSPCorePreferenceNames;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.validate.ValidationMessage;
+import org.eclipse.wst.validation.AbstractValidator;
+import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.ValidationState;
+import org.eclipse.wst.validation.ValidatorMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A miniature validator for .tld files. Checks for valid class names.
+ */
+public class TLDValidator extends AbstractValidator {
+	private static final String MARKER_TYPE = "org.eclipse.jst.jsp.core.validationMarker"; //$NON-NLS-1$
+	private static final String PREFERENCE_NODE_QUALIFIER = JSPCorePlugin.getDefault().getBundle().getSymbolicName();
+
+	private IPreferencesService fPreferencesService = Platform.getPreferencesService();
+
+	private static final String[] classElementNames = new String[]{JSP11TLDNames.TAGCLASS, JSP12TLDNames.TAG_CLASS, JSP11TLDNames.TEICLASS, JSP12TLDNames.TEI_CLASS, JSP12TLDNames.VALIDATOR_CLASS, JSP12TLDNames.VARIABLE_CLASS, JSP12TLDNames.LISTENER_CLASS};
+	private static final String[] missingClassMessages = new String[]{JSPCoreMessages.TaglibHelper_3, JSPCoreMessages.TaglibHelper_3, JSPCoreMessages.TaglibHelper_0, JSPCoreMessages.TaglibHelper_0, JSPCoreMessages.TLDValidator_MissingValidator, JSPCoreMessages.TLDValidator_MissingVariable, JSPCoreMessages.TLDValidator_MissingListener};
+	private static final String[] missingClassSeverityPreferenceKeys = new String[]{JSPCorePreferenceNames.VALIDATION_TRANSLATION_TAG_HANDLER_CLASS_NOT_FOUND, JSPCorePreferenceNames.VALIDATION_TRANSLATION_TAG_HANDLER_CLASS_NOT_FOUND, JSPCorePreferenceNames.VALIDATION_TRANSLATION_TEI_CLASS_NOT_FOUND, JSPCorePreferenceNames.VALIDATION_TRANSLATION_TEI_CLASS_NOT_FOUND, JSPCorePreferenceNames.VALIDATION_TRANSLATION_TAG_HANDLER_CLASS_NOT_FOUND, JSPCorePreferenceNames.VALIDATION_TRANSLATION_TAG_HANDLER_CLASS_NOT_FOUND, JSPCorePreferenceNames.VALIDATION_TRANSLATION_TAG_HANDLER_CLASS_NOT_FOUND};
+
+	public TLDValidator() {
+		super();
+
+		Assert.isTrue(classElementNames.length == missingClassMessages.length, "mismanaged arrays"); //$NON-NLS-1$
+		Assert.isTrue(classElementNames.length == missingClassSeverityPreferenceKeys.length, "mismanaged arrays"); //$NON-NLS-1$
+		Assert.isTrue(missingClassMessages.length == missingClassSeverityPreferenceKeys.length, "mismanaged arrays"); //$NON-NLS-1$
+	}
+
+	private Map checkClass(IJavaProject javaProject, Node classSpecifier, IScopeContext[] preferenceScopes, String preferenceKey, String errorMessage) {
+		String className = getTextContents(classSpecifier);
+		if (className != null && className.length() > 2) {
+			IType type = null;
+			try {
+				type = javaProject.findType(className);
+			}
+			catch (JavaModelException e) {
+				return null;
+			}
+
+			if (type == null || !type.exists()) {
+				Object severity = getMessageSeverity(preferenceScopes, preferenceKey);
+				if (severity == null)
+					return null;
+
+				IDOMNode classElement = (IDOMNode) classSpecifier;
+				Map markerValues = new HashMap();
+				markerValues.put(IMarker.SEVERITY, severity);
+				int start = classElement.getStartOffset();
+				if (classElement.getStartStructuredDocumentRegion() != null && classElement.getEndStructuredDocumentRegion() != null)
+					start = classElement.getStartStructuredDocumentRegion().getEndOffset();
+				markerValues.put(IMarker.CHAR_START, new Integer(start));
+				int end = classElement.getEndOffset();
+				if (classElement.getStartStructuredDocumentRegion() != null && classElement.getEndStructuredDocumentRegion() != null)
+					end = classElement.getEndStructuredDocumentRegion().getStartOffset();
+				markerValues.put(IMarker.CHAR_END, new Integer(end));
+				int line = classElement.getStructuredDocument().getLineOfOffset(start);
+				markerValues.put(IMarker.LINE_NUMBER, new Integer(line + 1));
+				markerValues.put(IMarker.MESSAGE, NLS.bind(errorMessage, (errorMessage.indexOf("{1}") >= 0) ? new String[]{getTagName(classSpecifier), className} : new String[]{className})); //$NON-NLS-1$
+				return markerValues;
+			}
+		}
+		return null;
+	}
+
+	private Map[] detectProblems(IJavaProject javaProject, IFile tld, IScopeContext[] preferenceScopes) throws CoreException {
+		List problems = new ArrayList();
+
+		IStructuredModel m = null;
+		try {
+			m = StructuredModelManager.getModelManager().getModelForRead(tld);
+			if (m != null && m instanceof IDOMModel) {
+				IDOMDocument document = ((IDOMModel) m).getDocument();
+
+				for (int i = 0; i < classElementNames.length; i++) {
+					NodeList classes = document.getElementsByTagName(classElementNames[i]);
+					for (int j = 0; j < classes.getLength(); j++) {
+						Map problem = checkClass(javaProject, classes.item(j), preferenceScopes, missingClassSeverityPreferenceKeys[i], missingClassMessages[i]);
+						if (problem != null)
+							problems.add(problem);
+					}
+				}
+
+			}
+		}
+		catch (IOException e) {
+			Logger.logException(e);
+		}
+		finally {
+			if (m != null)
+				m.releaseFromRead();
+		}
+
+		return (Map[]) problems.toArray(new Map[problems.size()]);
+	}
+
+	Integer getMessageSeverity(IScopeContext[] preferenceScopes, String key) {
+		int sev = fPreferencesService.getInt(PREFERENCE_NODE_QUALIFIER, key, IMessage.NORMAL_SEVERITY, preferenceScopes);
+		switch (sev) {
+			case ValidationMessage.ERROR :
+				return new Integer(IMarker.SEVERITY_ERROR);
+			case ValidationMessage.WARNING :
+				return new Integer(IMarker.SEVERITY_WARNING);
+			case ValidationMessage.INFORMATION :
+				return new Integer(IMarker.SEVERITY_INFO);
+			case ValidationMessage.IGNORE :
+				return null;
+		}
+		return new Integer(IMarker.SEVERITY_WARNING);
+	}
+
+	private String getTagName(Node classSpecifier) {
+		Node tagElement = classSpecifier.getParentNode();
+		Node child = tagElement.getFirstChild();
+		while (child != null) {
+			if (child.getNodeType() == Node.ELEMENT_NODE) {
+				String name = child.getNodeName();
+				if (JSP11TLDNames.NAME.equals(name))
+					return getTextContents(child);
+			}
+			child = child.getNextSibling();
+		}
+		return "";
+	}
+
+	private String getTextContents(Node parent) {
+		NodeList children = parent.getChildNodes();
+		if (children.getLength() == 1) {
+			return children.item(0).getNodeValue().trim();
+		}
+		StringBuffer s = new StringBuffer();
+		Node child = parent.getFirstChild();
+		while (child != null) {
+			s.append(child.getNodeValue().trim());
+			child = child.getNextSibling();
+		}
+		return s.toString().trim();
+	}
+
+	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
+		if (resource.getType() != IResource.FILE)
+			return null;
+		ValidationResult result = new ValidationResult();
+
+		IFile tld = (IFile) resource;
+		if (tld.isAccessible()) {
+			try {
+				final IJavaProject javaProject = JavaCore.create(tld.getProject());
+				if (javaProject.exists()) {
+					IScopeContext[] scopes = new IScopeContext[]{new InstanceScope(), new DefaultScope()};
+					ProjectScope projectScope = new ProjectScope(tld.getProject());
+					if (projectScope.getNode(PREFERENCE_NODE_QUALIFIER).getBoolean(JSPCorePreferenceNames.VALIDATION_USE_PROJECT_SETTINGS, false)) {
+						scopes = new IScopeContext[]{projectScope, new InstanceScope(), new DefaultScope()};
+					}
+					Map[] problems = detectProblems(javaProject, tld, scopes);
+					for (int i = 0; i < problems.length; i++) {
+						ValidatorMessage message = ValidatorMessage.create(problems[i].get(IMarker.MESSAGE).toString(), resource);
+						message.setType(MARKER_TYPE);
+						message.setAttributes(problems[i]);
+						result.add(message);
+					}
+				}
+			}
+			catch (Exception e) {
+				Logger.logException(e);
+			}
+		}
+
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java
index cb548c0..ef95d18 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/jspel/ELProblem.java
@@ -13,22 +13,78 @@
 package org.eclipse.jst.jsp.core.jspel;
 
 import org.eclipse.jface.text.Position;
+import org.eclipse.jst.jsp.core.internal.java.IJSPProblem;
 
-public class ELProblem {
+/**
+ * All ELProblems are currently assumed to be errors.
+ */
+public class ELProblem implements IJSPProblem {
 	private Position fPos;
 	private String fMessage;
-	
+	private int fId = IJSPProblem.ELProblem;
+
+	/**
+	 * @param pos should be relative to the JSP document the error is to be reported on
+	 * @param message
+	 */
 	public ELProblem(Position pos, String message)	{
 		fPos = pos;
 		fMessage = message;
 	}
+
+	public ELProblem(Position pos, String message, int id)	{
+		fPos = pos;
+		fMessage = message;
+		fId = id;
+	}
 	
 	public String getMessage() {
 		return fMessage;
 	}
 	
-
 	public Position getPosition() {
 		return fPos;
 	}
+
+	public String[] getArguments() {
+		return null;
+	}
+
+	public int getID() {
+		return fId;
+	}
+	
+	public int getEID() {
+		return fId;
+	}
+
+	public char[] getOriginatingFileName() {
+		return null;
+	}
+
+	public int getSourceEnd() {
+		return fPos.getOffset() + fPos.getLength();
+	}
+
+	public int getSourceLineNumber() {
+		return 0;
+	}
+
+	public int getSourceStart() {
+		return fPos.getOffset();
+	}
+
+	public boolean isError() {
+		return true;
+	}
+
+	public boolean isWarning() {
+		return false;
+	}
+
+	public void setSourceEnd(int sourceEnd) {}
+
+	public void setSourceLineNumber(int lineNumber) {}
+
+	public void setSourceStart(int sourceStart) {}
 }
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexDelta.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexDelta.java
index 14b3bb8..c1a611b 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexDelta.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexDelta.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,7 +16,7 @@
 /**
  * Describes changes to the known records within the TaglibIndex.
  * <p>
- * This interface is not intended to be implemented by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
  * </p>
  * 
  * @since 1.2
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexListener.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexListener.java
index b81027e..e4e404c 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexListener.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibIndexListener.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,11 +13,6 @@
 
 /**
  * A listener for changes in the index's records.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 1.2
  */
 public interface ITaglibIndexListener {
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibRecordEvent.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibRecordEvent.java
index c1d17ca..b316511 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibRecordEvent.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ITaglibRecordEvent.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,7 +17,7 @@
  * Describes changes to the known records within the TaglibIndex.
  * 
  * <p>
- * This interface is not intended to be implemented by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
  * </p>
  */
 public interface ITaglibRecordEvent {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
index 306829a..79c2261 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -25,7 +25,6 @@
 import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLConnection;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Enumeration;
@@ -40,6 +39,7 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipException;
 import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
 
 import org.eclipse.core.filebuffers.FileBuffers;
 import org.eclipse.core.resources.IContainer;
@@ -55,8 +55,11 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.ILock;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jdt.core.IClasspathContainer;
@@ -92,7 +95,73 @@
 import com.ibm.icu.text.Collator;
 import com.ibm.icu.util.StringTokenizer;
 
+/**
+ * Contains the tag library information for a single project.
+ * 
+ *  * <p>
+ * This class is neither intended to be instantiated nor accessed by clients.
+ * </p>
+ *
+ */
 class ProjectDescription {
+	class BuildPathJob extends Job {
+		public BuildPathJob() {
+			super("Updating Tag Library Index");
+			setSystem(true);
+			setUser(false);
+		}
+
+		protected IStatus run(IProgressMonitor monitor) {
+			try {
+				LOCK.acquire();
+
+				PackageFragmentRootDelta[] removes = (PackageFragmentRootDelta[]) fPackageFragmentRootsRemoved.values().toArray(new PackageFragmentRootDelta[fPackageFragmentRootsRemoved.size()]);
+				for (int i = 0; i < removes.length; i++) {
+					handleElementChanged(removes[i].elementPath, removes[i].deltaKind, removes[i].isExported);
+				}
+				fPackageFragmentRootsRemoved.clear();
+				if (monitor.isCanceled())
+					return Status.OK_STATUS;
+				
+				PackageFragmentRootDelta[] changes = (PackageFragmentRootDelta[]) fPackageFragmentRootsChanged.values().toArray(new PackageFragmentRootDelta[fPackageFragmentRootsChanged.size()]);
+				for (int i = 0; i < changes.length; i++) {
+					handleElementChanged(changes[i].elementPath, changes[i].deltaKind, changes[i].isExported);
+				}
+				fPackageFragmentRootsChanged.clear();
+				if (monitor.isCanceled())
+					return Status.OK_STATUS;
+				
+				PackageFragmentRootDelta[] adds = (PackageFragmentRootDelta[]) fPackageFragmentRootsAdded.values().toArray(new PackageFragmentRootDelta[fPackageFragmentRootsAdded.size()]);
+				for (int i = 0; i < adds.length; i++) {
+					handleElementChanged(adds[i].elementPath, adds[i].deltaKind, adds[i].isExported);
+				}
+				fPackageFragmentRootsAdded.clear();
+			}
+			finally {
+				LOCK.release();
+			}
+			TaglibIndex.getInstance().fireCurrentDelta(BuildPathJob.this);
+			return Status.OK_STATUS;
+		}
+	}
+	
+	class PackageFragmentRootDelta {
+		PackageFragmentRootDelta(IPath path, int kind, boolean exported) {
+			super();
+			elementPath = path;
+			deltaKind = kind;
+			isExported = exported;
+		}
+
+		/*
+			IJavaElementDelta.F_ADDED_TO_CLASSPATH
+			IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED
+			IJavaElementDelta.F_REMOVED_FROM_CLASSPATH
+		*/ 
+		int deltaKind;
+		IPath elementPath;
+		boolean isExported;
+	}
 
 	class DeltaVisitor implements IResourceDeltaVisitor {
 		public boolean visit(IResourceDelta delta) throws CoreException {
@@ -168,8 +237,9 @@
 
 		boolean isExported = true;
 		boolean isMappedInWebXML;
+		boolean isConsistent = false;
 		IPath location;
-		List urlRecords;
+		Collection urlRecords;
 
 		public boolean equals(Object obj) {
 			if (!(obj instanceof JarRecord))
@@ -210,7 +280,7 @@
 			return info.uri;
 		}
 
-		public List getURLRecords() {
+		public Collection getURLRecords() {
 			return urlRecords;
 		}
 
@@ -219,8 +289,8 @@
 			s.append(location);
 			if (urlRecords.size() > 0) {
 				s.append('\n');//$NON-NLS-1$ 
-				for (int i = 0; i < urlRecords.size(); i++) {
-					s.append(urlRecords.get(i));
+				for (Iterator it = urlRecords.iterator(); it.hasNext();) {
+					s.append(it.next());
 					s.append('\n');//$NON-NLS-1$ 
 				}
 			}
@@ -291,7 +361,7 @@
 		public boolean equals(Object obj) {
 			if (!(obj instanceof TaglibInfo))
 				return false;
-			return ((TaglibInfo) obj).jspVersion == jspVersion && ((TaglibInfo) obj).description.equals(description) && ((TaglibInfo) obj).largeIcon.equals(largeIcon) && ((TaglibInfo) obj).shortName.equals(shortName) && ((TaglibInfo) obj).smallIcon.equals(smallIcon) && ((TaglibInfo) obj).tlibVersion.equals(tlibVersion) && ((TaglibInfo) obj).uri.equals(uri);
+			return ((TaglibInfo) obj).jspVersion.equals(jspVersion) && ((TaglibInfo) obj).description.equals(description) && ((TaglibInfo) obj).largeIcon.equals(largeIcon) && ((TaglibInfo) obj).shortName.equals(shortName) && ((TaglibInfo) obj).smallIcon.equals(smallIcon) && ((TaglibInfo) obj).tlibVersion.equals(tlibVersion) && ((TaglibInfo) obj).uri.equals(uri);
 		}
 
 		public String getDescription() {
@@ -327,7 +397,7 @@
 		}
 
 		public String toString() {
-			return "TaglibInfo|" + shortName + "|" + tlibVersion + "|" + smallIcon + "|" + largeIcon + "|" + jspVersion + "|" + uri + "|" + description; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
+			return "TaglibInfo|" + uri + "|" + shortName + "|" + tlibVersion + "|" + smallIcon + "|" + largeIcon + "|" + jspVersion + "|" + description; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
 		}
 	}
 
@@ -389,6 +459,10 @@
 			return ((URLRecord) obj).baseLocation.equals(baseLocation) && ((URLRecord) obj).url.equals(url) && ((URLRecord) obj).info.equals(info);
 		}
 
+		public int hashCode() {
+			return baseLocation.hashCode() + url.hashCode() + (isExported ? 1 : 0);
+		}
+
 		public String getBaseLocation() {
 			return baseLocation;
 		}
@@ -515,11 +589,11 @@
 	private static final String BUILDPATH_DIRTY = "BUILDPATH_DIRTY"; //$NON-NLS-1$
 	private static final String BUILDPATH_ENTRIES = "BUILDPATH_ENTRIES"; //$NON-NLS-1$
 	private static final String BUILDPATH_PROJECT = "BUILDPATH_PROJECT"; //$NON-NLS-1$
-	private static final String SAVE_FORMAT_VERSION = "Tag Library Index 1.0.3"; //$NON-NLS-1$
+	private static final String SAVE_FORMAT_VERSION = "Tag Library Index 1.1.0"; //$NON-NLS-1$
 	private static final String WEB_INF = "WEB-INF"; //$NON-NLS-1$
 	private static final IPath WEB_INF_PATH = new Path(WEB_INF);
 	private static final String WEB_XML = "web.xml"; //$NON-NLS-1$
-
+	private static final char[] TLD = { 't', 'T', 'l', 'L', 'd', 'D'} ;
 	/**
 	 * Notes that the build path information is stale. Some operations can now
 	 * be skipped until a resolve/getAvailable call is made.
@@ -566,18 +640,29 @@
 
 	private String fSaveStateFilename;
 
+	/**
+	 * String->ITaglibRecord
+	 */
 	Hashtable fTagDirReferences;
 
 	Hashtable fTLDReferences;
 
 	IResourceDeltaVisitor fVisitor;
 	Hashtable fWebXMLReferences;
+	
+	private Map fPackageFragmentRootsAdded = new HashMap();
+	private Map fPackageFragmentRootsChanged = new HashMap();
+	private Map fPackageFragmentRootsRemoved = new HashMap();
 
 	ILock LOCK = Job.getJobManager().newLock();
 
 	private long time0;
 	
 	private TaglibSorter fTaglibSorter = new TaglibSorter();
+	private BuildPathJob fBuildPathJob = new BuildPathJob();
+
+	/** Shared JAR records between projects */
+	private static final Map fJarRecords = new Hashtable();
 
 	ProjectDescription(IProject project, String saveStateFile) {
 		super();
@@ -660,7 +745,7 @@
 					Iterator implicitRecords = rootReferences[j].values().iterator();
 					while (implicitRecords.hasNext()) {
 						ITaglibRecord record = (ITaglibRecord) implicitRecords.next();
-						if (record.getRecordType() == ITaglibRecord.TLD && ((ITLDRecord) record).getURI() != null) {
+						if (record.getRecordType() == ITaglibRecord.TLD && ((ITLDRecord) record).getURI() != null && ((ITLDRecord) record).getURI().length() > 0) {
 							references.put(((ITLDRecord) record).getURI(), record);
 						}
 					}
@@ -723,6 +808,7 @@
 			}
 			catch (MalformedURLException e) {
 				// not worth reporting
+				Logger.log(Logger.ERROR_DEBUG, null, e);
 			}
 			if (fileLocation != null) {
 				JarRecord jarRecord = createJARRecord(fileLocation);
@@ -746,6 +832,7 @@
 								contents.close();
 							}
 							catch (IOException e) {
+								Logger.log(Logger.ERROR_DEBUG, null, e);
 							}
 						}
 					}
@@ -761,42 +848,18 @@
 		// The rest are URLs into a plug-in...somewhere
 		else {
 			URL url = null;
-			ByteArrayInputStream cachedContents = null;
 			InputStream tldStream = null;
 			try {
 				url = new URL(urlString);
-				URLConnection connection = url.openConnection();
-				connection.setDefaultUseCaches(false);
-				tldStream = connection.getInputStream();
+				tldStream = JarUtilities.getInputStream(url);
 			}
 			catch (Exception e1) {
 				Logger.logException("Exception reading TLD contributed to the XML Catalog", e1);
 			}
 
 			if (tldStream != null) {
-				int c;
-				ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-				// array dim restriction?
-				byte bytes[] = new byte[2048];
-				try {
-					while ((c = tldStream.read(bytes)) >= 0) {
-						buffer.write(bytes, 0, c);
-					}
-					cachedContents = new ByteArrayInputStream(buffer.toByteArray());
-				}
-				catch (IOException ioe) {
-					// no cleanup can be done
-				}
-				finally {
-					try {
-						tldStream.close();
-					}
-					catch (IOException e) {
-					}
-				}
-
 				URLRecord urlRecord = null;
-				TaglibInfo info = extractInfo(urlString, cachedContents);
+				TaglibInfo info = extractInfo(urlString, tldStream);
 				if (info != null) {
 					/*
 					 * the record's reported URI should match the catalog
@@ -809,9 +872,10 @@
 					urlRecord.url = url; //$NON-NLS-1$ //$NON-NLS-2$
 				}
 				try {
-					cachedContents.close();
+					tldStream.close();
 				}
 				catch (IOException e) {
+					Logger.log(Logger.ERROR_DEBUG, null, e);
 				}
 				record = urlRecord;
 			}
@@ -836,11 +900,17 @@
 	}
 
 	private JarRecord createJARRecord(String fileLocation) {
-		JarRecord record = new JarRecord();
-		record.info = new TaglibInfo();
-		record.location = new Path(fileLocation);
-		record.urlRecords = new ArrayList(0);
-		return record;
+		synchronized (fJarRecords) {
+			JarRecord record = (JarRecord) fJarRecords.get(fileLocation);
+			if (record == null) {
+				record = new JarRecord();
+				record.info = new TaglibInfo();
+				record.location = new Path(fileLocation);
+				record.urlRecords = new HashSet(0);
+				fJarRecords.put(fileLocation, record);
+			}
+			return record;
+		}
 	}
 
 	/**
@@ -904,7 +974,7 @@
 		InputStream contents = null;
 		try {
 			if (tld.isAccessible()) {
-				contents = ((IFile) tld).getContents(true);
+				contents = ((IFile) tld).getContents();
 				String basePath = tld.getFullPath().toString();
 				TaglibInfo info = extractInfo(basePath, contents);
 				if (info != null) {
@@ -913,7 +983,7 @@
 			}
 		}
 		catch (CoreException e) {
-			Logger.logException(e);
+			// out of sync
 		}
 		finally {
 			try {
@@ -923,40 +993,63 @@
 			}
 			catch (IOException e) {
 				// ignore
+				Logger.log(Logger.ERROR_DEBUG, null, e);
 			}
 		}
 		return record;
 	}
 
 	private void ensureUpTodate() {
-		try {
-			LOCK.acquire();
-
-			if (!fBuildPathIsDirty) {
+		IClasspathEntry[] entries = null;
+			try {
+				/*
+				 * If the Java nature isn't present (or something else is
+				 * wrong), don't check the build path.
+				 */
+				IJavaProject jproject = JavaCore.create(fProject);
+				if (jproject != null && jproject.exists()) {
+					entries = jproject.getResolvedClasspath(true);
+				}
+			}
+			catch (JavaModelException e) {
+				Logger.logException(e);
+			}
+		if (entries != null) {
+			try {
+				LOCK.acquire();
 				/*
 				 * Double-check that the number of build path entries has not
 				 * changed. This should cover most cases such as when a
 				 * library is added into or removed from a container.
 				 */
-				try {
-					IJavaProject jproject = JavaCore.create(fProject);
-					if (jproject != null && jproject.exists()) {
-						IClasspathEntry[] entries = jproject.getResolvedClasspath(true);
-						fBuildPathIsDirty = (fBuildPathEntryCount != entries.length);
+				fBuildPathIsDirty = fBuildPathIsDirty || (fBuildPathEntryCount != entries.length);
+
+				if (fBuildPathIsDirty) {
+					indexClasspath(entries);
+					fBuildPathIsDirty = false;
+				}
+				else {
+					PackageFragmentRootDelta[] removes = (PackageFragmentRootDelta[]) fPackageFragmentRootsRemoved.values().toArray(new PackageFragmentRootDelta[fPackageFragmentRootsRemoved.size()]);
+					for (int i = 0; i < removes.length; i++) {
+						handleElementChanged(removes[i].elementPath, removes[i].deltaKind, removes[i].isExported);
 					}
-				}
-				catch (JavaModelException e) {
-					Logger.logException(e);
+					PackageFragmentRootDelta[] changes = (PackageFragmentRootDelta[]) fPackageFragmentRootsChanged.values().toArray(new PackageFragmentRootDelta[fPackageFragmentRootsChanged.size()]);
+					for (int i = 0; i < changes.length; i++) {
+						handleElementChanged(changes[i].elementPath, changes[i].deltaKind, changes[i].isExported);
+					}
+					PackageFragmentRootDelta[] adds = (PackageFragmentRootDelta[]) fPackageFragmentRootsAdded.values().toArray(new PackageFragmentRootDelta[fPackageFragmentRootsAdded.size()]);
+					for (int i = 0; i < adds.length; i++) {
+						handleElementChanged(adds[i].elementPath, adds[i].deltaKind, adds[i].isExported);
+					}
+					fPackageFragmentRootsRemoved.clear();
+					fPackageFragmentRootsChanged.clear();
+					fPackageFragmentRootsAdded.clear();
 				}
 			}
-			if (fBuildPathIsDirty) {
-				indexClasspath();
-				fBuildPathIsDirty = false;
+			finally {
+				LOCK.release();
 			}
 		}
-		finally {
-			LOCK.release();
-		}
 	}
 
 	private TaglibInfo extractInfo(String basePath, InputStream tldContents) {
@@ -1013,7 +1106,7 @@
 			LOCK.acquire();
 
 			Collection implicitReferences = new HashSet(getImplicitReferences(path.toString()).values());
-			records = new ArrayList(fTLDReferences.size() + fTagDirReferences.size() + fJARReferences.size() + fWebXMLReferences.size());
+			records = new HashSet(fTLDReferences.size() + fTagDirReferences.size() + fJARReferences.size() + fWebXMLReferences.size());
 			records.addAll(fTLDReferences.values());
 			if (jspVersion >= 1.1) {
 				records.addAll(_getJSP11AndWebXMLJarReferences(fJARReferences.values()));
@@ -1027,10 +1120,19 @@
 				projectsProcessed.add(fProject);
 				addBuildPathReferences(buildPathReferences, projectsProcessed, false);
 				records.addAll(buildPathReferences.values());
+				
+				if(path.segmentCount() > 1) {
+					records.addAll(new HashSet(getImplicitReferences(fProject.getFullPath().toString()).values()));
+				}
 			}
 			if (jspVersion >= 2.0) {
 				records.addAll(fTagDirReferences.values());
 			}
+			
+			IPath localWebXML = new Path(getLocalRoot(path.toString())).append("/WEB-INF/web.xml"); //$NON-NLS-1$ 
+			WebXMLRecord webxmlRecord = (WebXMLRecord) fWebXMLReferences.get(localWebXML.toString());
+			if(webxmlRecord != null)
+				records.addAll(webxmlRecord.getTLDRecords());
 
 			records.addAll(getCatalogRecords());
 		}
@@ -1074,12 +1176,14 @@
 					}
 					catch (IOException ioe) {
 						// no cleanup can be done
+						Logger.log(Logger.ERROR_DEBUG, null, ioe);
 					}
 					finally {
 						try {
 							entryInputStream.close();
 						}
 						catch (IOException e) {
+							Logger.log(Logger.ERROR_DEBUG, null, e);
 						}
 					}
 				}
@@ -1210,7 +1314,9 @@
 	private String getTextContents(Node parent) {
 		NodeList children = parent.getChildNodes();
 		if (children.getLength() == 1) {
-			return children.item(0).getNodeValue().trim();
+			Node child = children.item(0);
+			if (child.getNodeValue() != null)
+				return child.getNodeValue().trim();
 		}
 		StringBuffer s = new StringBuffer();
 		Node child = parent.getFirstChild();
@@ -1224,7 +1330,7 @@
 					s.append(reference.trim());
 				}
 			}
-			else {
+			else if (child.getNodeValue() != null) {
 				s.append(child.getNodeValue().trim());
 			}
 			child = child.getNextSibling();
@@ -1242,6 +1348,16 @@
 		return fVisitor;
 	}
 
+	void handleElementChanged(IPath libraryPath, int deltaKind, boolean exported) {
+		IFile file = libraryPath.segmentCount() > 1 ? ResourcesPlugin.getWorkspace().getRoot().getFile(libraryPath) : null;
+		String libraryLocation = null;
+		if (file != null && file.isAccessible() && file.getLocation() != null)
+			libraryLocation = file.getLocation().toString();
+		else
+			libraryLocation = libraryPath.toString();
+		updateClasspathLibrary(libraryLocation, deltaKind, exported);
+	}
+	
 	void handleElementChanged(IJavaElementDelta delta) {
 		if (fBuildPathIsDirty) {
 			return;
@@ -1249,6 +1365,12 @@
 
 		// Logger.log(Logger.INFO_DEBUG, "IJavaElementDelta: " + delta);
 		IJavaElement element = delta.getElement();
+		if (element.getElementType() == IJavaElement.JAVA_PROJECT) {
+			IJavaElementDelta[] affectedChildren = delta.getAffectedChildren();
+			for (int i = 0; i < affectedChildren.length; i++) {
+				handleElementChanged(affectedChildren[i]);
+			}
+		}
 		if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT_ROOT && ((IPackageFragmentRoot) element).isArchive()) {
 			time0 = System.currentTimeMillis();
 			if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT_ROOT && ((IPackageFragmentRoot) element).isExternal()) {
@@ -1256,7 +1378,16 @@
 			String libLocation = null;
 			int taglibRecordEventKind = -1;
 			if ((delta.getFlags() & IJavaElementDelta.F_ADDED_TO_CLASSPATH) > 0 || (delta.getFlags() & IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED) > 0 || (delta.getFlags() & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) > 0) {
-				taglibRecordEventKind = ITaglibIndexDelta.ADDED;
+				taglibRecordEventKind = ITaglibIndexDelta.CHANGED;
+				if ((delta.getFlags() & IJavaElementDelta.F_ADDED_TO_CLASSPATH) > 0) {
+					taglibRecordEventKind = ITaglibIndexDelta.ADDED;
+				}
+				else if ((delta.getFlags() & IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED) > 0) {
+					taglibRecordEventKind = ITaglibIndexDelta.CHANGED;
+				}
+				else if ((delta.getFlags() & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) > 0) {
+					taglibRecordEventKind = ITaglibIndexDelta.REMOVED;
+				}
 				IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(element.getPath());
 				if (file.isAccessible() && file.getLocation() != null)
 					libLocation = file.getLocation().toString();
@@ -1278,7 +1409,7 @@
 					}
 				}
 				catch (JavaModelException e) {
-					Logger.logException("Problem handling build path entry for " + element.getPath(), e); //$NON-NLS-1$
+					// IPackageFragmentRoot not part of the build path
 				}
 				if ((delta.getFlags() & IJavaElementDelta.F_ADDED_TO_CLASSPATH) > 0) {
 					fBuildPathEntryCount++;
@@ -1312,6 +1443,9 @@
 			Logger.log(Logger.INFO, "indexed " + fProject.getName() + " contents in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 	}
 
+	/**
+	 * @deprecated
+	 */
 	void indexClasspath() {
 		if (_debugIndexTime)
 			time0 = System.currentTimeMillis();
@@ -1337,6 +1471,22 @@
 			Logger.log(Logger.INFO, "indexed " + fProject.getName() + " classpath in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 	}
 
+	void indexClasspath(IClasspathEntry[] entries) {
+		if (_debugIndexTime)
+			time0 = System.currentTimeMillis();
+		fClasspathProjects.clear();
+		fClasspathReferences.clear();
+		fClasspathJars.clear();
+
+		fBuildPathEntryCount = entries.length;
+		for (int i = 0; i < entries.length; i++) {
+			indexClasspath(entries[i]);
+		}
+
+		if (_debugIndexTime)
+			Logger.log(Logger.INFO, "indexed " + fProject.getName() + " classpath in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	}
+
 	/**
 	 * @param entry
 	 */
@@ -1366,9 +1516,21 @@
 						 * table that will e returned to
 						 * getAvailableTaglibRecords().
 						 */
-						IFile libFile = ResourcesPlugin.getWorkspace().getRoot().getFile(libPath);
-						if (libFile != null && libFile.exists()) {
-							updateClasspathLibrary(libFile.getLocation().toString(), ITaglibIndexDelta.ADDED, entry.isExported());
+						IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(libPath);
+						if (resource != null && resource.isAccessible()) {
+							if (resource.getType() == IResource.FILE) {
+								if (resource.getLocation() != null) {
+									updateClasspathLibrary(resource.getLocation().toString(), ITaglibIndexDelta.ADDED, entry.isExported());
+								}
+							}
+							else if (resource.getType() == IResource.FOLDER) {
+								try {
+									resource.accept(new Indexer(), 0);
+								}
+								catch (CoreException e) {
+									Logger.logException(e);
+								}
+							}
 						}
 					}
 				}
@@ -1385,7 +1547,19 @@
 				}
 			}
 				break;
-			case IClasspathEntry.CPE_SOURCE :
+			case IClasspathEntry.CPE_SOURCE : {
+				IPath path = entry.getPath();
+				try {
+					IResource sourceFolder = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
+					// could be a bad .classpath file
+					if(sourceFolder != null) {
+						sourceFolder.accept(new Indexer(), 0);
+					}
+				}
+				catch (CoreException e) {
+					Logger.logException(e);
+				}
+			}
 				break;
 			case IClasspathEntry.CPE_VARIABLE : {
 				IPath libPath = JavaCore.getResolvedVariablePath(entry.getPath());
@@ -1422,7 +1596,7 @@
 	 */
 
 	/**
-	 * @param javaProject
+	 * @deprecated
 	 */
 	private void indexClasspath(IJavaProject javaProject) {
 		if (javaProject == null)
@@ -1442,6 +1616,61 @@
 			}
 		}
 	}
+	
+	void queueElementChanged(IJavaElementDelta delta) {
+		try {
+			LOCK.acquire();
+			IJavaElement element = delta.getElement();
+			if (element.getElementType() == IJavaElement.JAVA_PROJECT) {
+				IJavaElementDelta[] affectedChildren = delta.getAffectedChildren();
+				for (int i = 0; i < affectedChildren.length; i++) {
+					queueElementChanged(affectedChildren[i]);
+				}
+			}
+			if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT_ROOT && ((IPackageFragmentRoot) element).isArchive()) {
+				IPath path = element.getPath();
+				boolean fragmentisExported = true;
+				try {
+					IClasspathEntry rawClasspathEntry = ((IPackageFragmentRoot) element).getRawClasspathEntry();
+					/*
+					 * null may also be returned for deletions depending on
+					 * resource/build path notification order. If it's null,
+					 * it's been deleted and whether it's exported won't
+					 * really matter
+					 */
+					if (rawClasspathEntry != null) {
+						fragmentisExported = rawClasspathEntry.isExported();
+					}
+				}
+				catch (JavaModelException e) {
+					// IPackageFragmentRoot not part of the build path
+				}
+				String key = path.toString();
+				if ((delta.getFlags() & IJavaElementDelta.F_ADDED_TO_CLASSPATH) > 0) {
+					fPackageFragmentRootsAdded.put(key, new PackageFragmentRootDelta(path, ITaglibIndexDelta.ADDED, fragmentisExported));
+					fPackageFragmentRootsChanged.remove(key);
+					fPackageFragmentRootsRemoved.remove(key);
+					fBuildPathEntryCount++;
+				}
+				else if ((delta.getFlags() & IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED) > 0) {
+					fPackageFragmentRootsChanged.put(key, new PackageFragmentRootDelta(path, ITaglibIndexDelta.CHANGED, fragmentisExported));
+				}
+				else if ((delta.getFlags() & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) > 0) {
+					fPackageFragmentRootsAdded.remove(key);
+					fPackageFragmentRootsChanged.remove(key);
+					fPackageFragmentRootsRemoved.put(key, new PackageFragmentRootDelta(path, ITaglibIndexDelta.REMOVED, fragmentisExported));
+					fBuildPathEntryCount--;
+				}
+			}
+		}
+		finally {
+			LOCK.release();
+		}
+
+		fBuildPathJob.cancel();
+		fBuildPathJob.schedule(2000);
+	}
+
 
 	private String readTextofChild(Node node, String childName) {
 		NodeList children = node.getChildNodes();
@@ -1514,6 +1743,15 @@
 			}
 		}
 	}
+	
+	private boolean requestedRefresh() {
+		boolean requested = false;
+		String[] commandLineArgs = Platform.getCommandLineArgs();
+		for (int i = 0; i < commandLineArgs.length; i++) {
+			requested = requested || "-refresh".equals(commandLineArgs[i]); //$NON-NLS-1$ 
+		}
+		return requested;
+	}
 
 	/**
 	 * @param basePath
@@ -1529,47 +1767,70 @@
 			float jspVersion = DeploymentDescriptorPropertyCache.getInstance().getJSPVersion(new Path(basePath));
 
 			/**
-			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=196177 Support
-			 * resolution in flexible projects
+			 * http://bugs.eclipse.org/196177 - Support resolution in flexible
+			 * projects
 			 */
 			IPath resourcePath = FacetModuleCoreSupport.resolve(new Path(basePath), reference);
 			if (resourcePath.segmentCount() > 1) {
-				if (resourcePath.toString().toLowerCase(Locale.US).endsWith(".tld")) { //$NON-NLS-1$ 
+				String fileExtension = resourcePath.getFileExtension();
+				if (fileExtension != null && fileExtension.toLowerCase(Locale.US).equals("tld")) { //$NON-NLS-1$ 
 					IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(resourcePath);
 					if (file.isAccessible()) {
 						path = resourcePath.toString();
 					}
 				}
-				else if (resourcePath.toString().toLowerCase(Locale.US).endsWith(".jar")) { //$NON-NLS-1$ 
+				else if (fileExtension != null && fileExtension.toLowerCase(Locale.US).equals("jar")) { //$NON-NLS-1$ 
 					IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(resourcePath);
 					if (file.isAccessible()) {
 						path = resourcePath.toString();
 					}
 				}
+				else {
+					IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(resourcePath);
+					if (folder.isAccessible()) {
+						path = resourcePath.toString();
+					}
+				}
 			}
 
 			LOCK.acquire();
 
+			String localRoot = getLocalRoot(basePath);
 			/**
 			 * Workaround for problem in URIHelper; uris starting with '/' are
 			 * returned as-is.
 			 */
 			if (path == null) {
 				if (reference.startsWith("/")) { //$NON-NLS-1$
-					path = getLocalRoot(basePath) + reference;
+					path = localRoot + reference;
 				}
 				else {
-					path = URIHelper.normalize(reference, basePath, getLocalRoot(basePath));
+					path = URIHelper.normalize(reference, basePath, localRoot);
 				}
 			}
 
-			// order dictated by JSP spec 2.0 section 7.2.3
-			record = (ITaglibRecord) fJARReferences.get(path);
-
-			// only if 1.1 TLD was found
-			if (jspVersion < 1.1 || (record instanceof JarRecord && !((JarRecord) record).has11TLD)) {
-				record = null;
+			IPath localWebXML = new Path(localRoot).append("/WEB-INF/web.xml"); //$NON-NLS-1$ 
+			WebXMLRecord webxmlRecord = (WebXMLRecord) fWebXMLReferences.get(localWebXML.toString());
+			if (webxmlRecord != null) {
+				for (int i = 0; i < webxmlRecord.tldRecords.size(); i++) {
+					ITaglibRecord record2 = (ITaglibRecord) webxmlRecord.tldRecords.get(i);
+					ITaglibDescriptor descriptor = record2.getDescriptor();
+					if (reference.equals(descriptor.getURI())) {
+						record = record2;
+					}
+				}
 			}
+
+			if (record == null) {
+				// order dictated by JSP spec 2.0 section 7.2.3
+				record = (ITaglibRecord) fJARReferences.get(path);
+
+				// only if 1.1 TLD was found
+				if (jspVersion < 1.1 || (record instanceof JarRecord && !((JarRecord) record).has11TLD)) {
+					record = null;
+				}
+			}
+			
 			if (record == null) {
 				record = (ITaglibRecord) fTLDReferences.get(path);
 			}
@@ -1597,7 +1858,7 @@
 				addBuildPathReferences(buildPathReferences, projectsProcessed, false);
 				record = (ITaglibRecord) buildPathReferences.get(reference);
 			}
-
+			
 			// Check the XML Catalog
 			if (record == null) {
 				ICatalog catalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
@@ -1623,12 +1884,12 @@
 					}
 				}
 			}
-
+			
 			/*
 			 * If no records were found and no local-root applies, check ALL
 			 * of the web.xml files as a fallback
 			 */
-			if (record == null && fProject.getFullPath().toString().equals(getLocalRoot(basePath))) {
+			if (record == null && fProject.getFullPath().toString().equals(localRoot)) {
 				WebXMLRecord[] webxmls = (WebXMLRecord[]) fWebXMLReferences.values().toArray(new WebXMLRecord[0]);
 				for (int i = 0; i < webxmls.length; i++) {
 					if (record != null)
@@ -1641,6 +1902,18 @@
 					}
 				}
 			}
+			/*
+			 * If no records were found, check the implicit references on the project itself as a fallback
+			 */
+			if (record == null && jspVersion >= 1.2) {
+				Object[] records = (Object[]) getImplicitReferences(fProject.getFullPath().toString()).get(reference);
+				if (records != null && records.length > 0) {
+					if (records.length > 1)
+						records = fTaglibSorter.sort(records);
+					record =  (ITaglibRecord) records[records.length - 1];
+				}
+			}
+
 		}
 		finally {
 			LOCK.release();
@@ -1662,7 +1935,7 @@
 			// ================ test reload time ========================
 			boolean restored = false;
 			File savedState = new File(fSaveStateFilename);
-			if (savedState.exists()) {
+			if (savedState.exists() && !requestedRefresh()) {
 				Reader reader = null;
 				try {
 					time0 = System.currentTimeMillis();
@@ -1741,6 +2014,7 @@
 													contents.close();
 												}
 												catch (IOException e) {
+													Logger.log(Logger.ERROR_DEBUG, null, e);
 												}
 											}
 										}
@@ -1748,8 +2022,7 @@
 										fClasspathJars.put(libraryLocation, libraryRecord);
 									}
 									else if ("URL".equalsIgnoreCase(tokenType) && libraryRecord != null) { //$NON-NLS-1$
-										// relies on a previously declared JAR
-										// record
+										// relies on a previously declared JAR record
 										boolean exported = Boolean.valueOf(toker.nextToken()).booleanValue();
 										// make the rest the URL
 										String urlString = toker.nextToken();
@@ -1759,53 +2032,27 @@
 										urlString = urlString.trim();
 										// Append a URLrecord
 										URLRecord urlRecord = new URLRecord();
-										urlRecord.url = new URL(urlString); //$NON-NLS-1$ //$NON-NLS-2$
+										urlRecord.url = new URL(urlString);
 										urlRecord.isExported = exported;
 										urlRecord.baseLocation = libraryRecord.location.toString();
-										libraryRecord.urlRecords.add(urlRecord);
 
-										ByteArrayInputStream cachedContents = null;
-										InputStream tldStream = null;
-										try {
-											URLConnection connection = urlRecord.url.openConnection();
-											connection.setDefaultUseCaches(false);
-											tldStream = connection.getInputStream();
-										}
-										catch (IOException e1) {
-											Logger.logException(e1);
-										}
-
-										int c;
-										ByteArrayOutputStream byteArrayOutput = new ByteArrayOutputStream();
-										// array dim restriction?
-										byte bytes[] = new byte[2048];
-										try {
-											while ((c = tldStream.read(bytes)) >= 0) {
-												byteArrayOutput.write(bytes, 0, c);
+										InputStream tldStream = JarUtilities.getInputStream(urlRecord.url);
+										if(tldStream != null) {
+											TaglibInfo info = extractInfo(urlRecord.url.toString(), tldStream);
+											if (info != null) {
+												urlRecord.info = info;
 											}
-											cachedContents = new ByteArrayInputStream(byteArrayOutput.toByteArray());
-										}
-										catch (IOException ioe) {
-											// no cleanup can be done
-										}
-										finally {
+											libraryRecord.urlRecords.add(urlRecord);
 											try {
 												tldStream.close();
 											}
 											catch (IOException e) {
+												Logger.log(Logger.ERROR_DEBUG, null, e);
+											}
+											if (urlRecord.getURI() != null && urlRecord.getURI().length() > 0) {
+												fClasspathReferences.put(urlRecord.getURI(), urlRecord);
 											}
 										}
-
-										TaglibInfo info = extractInfo(urlRecord.url.toString(), cachedContents);
-										if (info != null) {
-											urlRecord.info = info;
-										}
-										try {
-											cachedContents.close();
-										}
-										catch (IOException e) {
-										}
-										fClasspathReferences.put(urlRecord.getURI(), urlRecord);
 									}
 									else if (BUILDPATH_PROJECT.equalsIgnoreCase(tokenType)) {
 										String projectName = toker.nextToken();
@@ -1832,7 +2079,7 @@
 							restored = true;
 						}
 						else {
-							Logger.log(Logger.INFO, "Tag Library Index: different cache format found, was \"" + lineText + "\", supports \"" + SAVE_FORMAT_VERSION + "\", reindexing build path"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+							Logger.log(Logger.INFO_DEBUG, "Tag Library Index: different cache format found, was \"" + lineText + "\", supports \"" + SAVE_FORMAT_VERSION + "\", reindexing build path"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 						}
 					}
 					if (_debugIndexTime)
@@ -1849,6 +2096,7 @@
 							reader.close();
 						}
 						catch (IOException e) {
+							Logger.log(Logger.ERROR_DEBUG, null, e);
 						}
 					}
 				}
@@ -1874,7 +2122,7 @@
 
 		/**
 		 * <pre>
-		 *                     		 1.0.1
+		 *                     		 1.1.0
 		 *                     		 Save classpath information (| is field delimiter)
 		 *                     		 Jars are saved as &quot;JAR:&quot;+ has11TLD + jar path 
 		 *                     		 URLRecords as &quot;URL:&quot;+URL
@@ -1920,6 +2168,7 @@
 			}
 		}
 		catch (IOException e) {
+			Logger.log(Logger.ERROR_DEBUG, null, e);
 		}
 		finally {
 			try {
@@ -1928,6 +2177,7 @@
 				}
 			}
 			catch (Exception e) {
+				Logger.log(Logger.ERROR_DEBUG, null, e);
 			}
 		}
 
@@ -1945,6 +2195,9 @@
 		JarRecord libraryRecord = null;
 		if (deltaKind == ITaglibIndexDelta.REMOVED || deltaKind == ITaglibIndexDelta.CHANGED) {
 			libraryRecord = (JarRecord) fClasspathJars.remove(libraryLocation);
+			synchronized (fJarRecords) {
+				fJarRecords.remove(libraryLocation);
+			}
 			if (libraryRecord != null) {
 				IURLRecord[] urlRecords = (IURLRecord[]) libraryRecord.urlRecords.toArray(new IURLRecord[0]);
 				for (int i = 0; i < urlRecords.length; i++) {
@@ -1956,61 +2209,88 @@
 			}
 		}
 		if (deltaKind == ITaglibIndexDelta.ADDED || deltaKind == ITaglibIndexDelta.CHANGED) {
+			// XXX: runs on folders as well?!
 			libraryRecord = createJARRecord(libraryLocation);
-			libraryRecord.isExported = isExported;
-			fClasspathJars.put(libraryLocation, libraryRecord);
-
-			ZipFile jarfile = null;
-			try {
-				jarfile = new ZipFile(libraryLocation);
-				Enumeration entries = jarfile.entries();
-				while (entries.hasMoreElements()) {
-					ZipEntry z = (ZipEntry) entries.nextElement();
-					if (!z.isDirectory()) {
-						if (z.getName().toLowerCase(Locale.US).endsWith(".tld")) { //$NON-NLS-1$
-							if (z.getName().equals(JarUtilities.JSP11_TAGLIB)) {
-								libraryRecord.has11TLD = true;
-							}
-							InputStream contents = getCachedInputStream(jarfile, z);
-							if (contents != null) {
-								TaglibInfo info = extractInfo(libraryLocation, contents);
-
-								if (info != null && info.uri != null && info.uri.length() > 0) {
-									URLRecord urlRecord = new URLRecord();
-									urlRecord.info = info;
-									urlRecord.baseLocation = libraryLocation;
+			synchronized (libraryRecord) {
+				if (libraryRecord.isConsistent) {
+					// Library loaded by another Project Description, initialize our references from the existing
+					fClasspathJars.put(libraryLocation, libraryRecord);
+					Iterator records = libraryRecord.urlRecords.iterator();
+					while (records.hasNext()) {
+						URLRecord record = (URLRecord)records.next();
+						int urlDeltaKind = ITaglibIndexDelta.ADDED;
+						if (fClasspathReferences.containsKey(record.getURI())) {
+							urlDeltaKind = ITaglibIndexDelta.CHANGED;
+						}
+						fClasspathReferences.put(record.getURI(), record);
+						TaglibIndex.getInstance().addDelta(new TaglibIndexDelta(fProject, record, urlDeltaKind));
+						fClasspathReferences.put(record.info.uri, record);
+					}
+					return;
+				}
+				libraryRecord.isExported = isExported;
+				fClasspathJars.put(libraryLocation, libraryRecord);
+	
+				ZipFile jarfile = null;
+				try {
+					jarfile = new ZipFile(libraryLocation);
+					Enumeration entries = jarfile.entries();
+					while (entries.hasMoreElements()) {
+						ZipEntry z = (ZipEntry) entries.nextElement();
+						if (!z.isDirectory()) {
+							if (isTLD(z.getName())) {
+								if (z.getName().equals(JarUtilities.JSP11_TAGLIB)) {
+									libraryRecord.has11TLD = true;
+								}
+								InputStream contents = getCachedInputStream(jarfile, z);
+								if (contents != null) {
+									TaglibInfo info = extractInfo(libraryLocation, contents);
+	
+									if (info != null && info.uri != null && info.uri.length() > 0) {
+										URLRecord urlRecord = new URLRecord();
+										urlRecord.info = info;
+										urlRecord.baseLocation = libraryLocation;
+										try {
+											urlRecord.isExported = isExported;
+											urlRecord.url = new URL("jar:file:" + libraryLocation + "!/" + z.getName()); //$NON-NLS-1$ //$NON-NLS-2$
+											libraryRecord.urlRecords.add(urlRecord);
+											int urlDeltaKind = ITaglibIndexDelta.ADDED;
+											if (fClasspathReferences.containsKey(urlRecord.getURI())) {
+												// TODO: not minimized enough
+												urlDeltaKind = ITaglibIndexDelta.CHANGED;
+											}
+											fClasspathReferences.put(urlRecord.getURI(), urlRecord);
+											TaglibIndex.getInstance().addDelta(new TaglibIndexDelta(fProject, urlRecord, urlDeltaKind));
+											fClasspathReferences.put(info.uri, urlRecord);
+											if (_debugIndexCreation)
+												Logger.log(Logger.INFO, "created record for " + urlRecord.getURI() + "@" + urlRecord.getURL()); //$NON-NLS-1$ //$NON-NLS-2$
+										}
+										catch (MalformedURLException e) {
+											// don't record this URI
+											Logger.logException(e);
+										}
+									}
 									try {
-										urlRecord.isExported = isExported;
-										urlRecord.url = new URL("jar:file:" + libraryLocation + "!/" + z.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-										libraryRecord.urlRecords.add(urlRecord);
-										TaglibIndex.getInstance().addDelta(new TaglibIndexDelta(fProject, urlRecord, deltaKind));
-										fClasspathReferences.put(urlRecord.getURI(), urlRecord);
-										if (_debugIndexCreation)
-											Logger.log(Logger.INFO, "created record for " + urlRecord.getURI() + "@" + urlRecord.getURL()); //$NON-NLS-1$ //$NON-NLS-2$
+										contents.close();
 									}
-									catch (MalformedURLException e) {
-										// don't record this URI
-										Logger.logException(e);
+									catch (IOException e) {
+										Logger.log(Logger.ERROR_DEBUG, null, e);
 									}
 								}
-								try {
-									contents.close();
-								}
-								catch (IOException e) {
-								}
 							}
 						}
 					}
 				}
-			}
-			catch (ZipException zExc) {
-				Logger.log(Logger.WARNING, "Taglib Index ZipException: " + libraryLocation + " " + zExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			catch (IOException ioExc) {
-				Logger.log(Logger.WARNING, "Taglib Index IOException: " + libraryLocation + " " + ioExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			finally {
-				closeJarFile(jarfile);
+				catch (ZipException zExc) {
+					Logger.log(Logger.WARNING, "Taglib Index ZipException: " + libraryLocation + " " + zExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+				catch (IOException ioExc) {
+					Logger.log(Logger.WARNING, "Taglib Index IOException: " + libraryLocation + " " + ioExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+				finally {
+					closeJarFile(jarfile);
+				}
+				libraryRecord.isConsistent = true;
 			}
 		}
 		if (libraryRecord != null) {
@@ -2018,6 +2298,25 @@
 		}
 	}
 
+	private boolean isTLD(String name) {
+		if (name == null)
+			return false;
+
+		final int length = name.length();
+
+		if (length < 4)
+			return false;
+		if (name.charAt(length - 4) != '.')
+			return false;
+
+		for (int i = length - 3, j = 0; i < length; i++, j++) {
+			final char c = name.charAt(i);
+			if (c != TLD[2*j] && c != TLD[2*j + 1])
+				return false;
+		}
+		return true;
+	}
+
 	void updateJAR(IResource jar, int deltaKind) {
 		if (_debugIndexCreation)
 			Logger.log(Logger.INFO, "creating records for JAR " + jar.getFullPath()); //$NON-NLS-1$
@@ -2027,51 +2326,60 @@
 			jarLocationString = jar.getLocation().toString();
 		else
 			jarLocationString = jar.getLocationURI().toString();
-		String[] entries = JarUtilities.getEntryNames(jar);
 		JarRecord jarRecord = createJARRecord(jar);
 		fJARReferences.put(jar.getFullPath().toString(), jarRecord);
-		for (int i = 0; i < entries.length; i++) {
-			if (entries[i].endsWith(".tld")) { //$NON-NLS-1$
-				if (entries[i].equals(JarUtilities.JSP11_TAGLIB)) {
-					jarRecord.has11TLD = true;
-				}
-				InputStream contents = JarUtilities.getInputStream(jar, entries[i]);
-				if (contents != null) {
-					TaglibInfo info = extractInfo(jarLocationString, contents);
-
-					if (info != null && info.uri != null && info.uri.length() > 0) {
-						URLRecord record = new URLRecord();
-						record.info = info;
-						record.baseLocation = jarLocationString;
-						try {
-							record.url = new URL("jar:file:" + jarLocationString + "!/" + entries[i]); //$NON-NLS-1$ //$NON-NLS-2$
-							jarRecord.urlRecords.add(record);
-
-							int taglibDeltaKind = ITaglibIndexDelta.ADDED;
-							Hashtable table = getImplicitReferences(jar.getFullPath().toString());
-							if (table != null && table.get(record.getURI()) != null) {
-								taglibDeltaKind = ITaglibIndexDelta.CHANGED;
+		ZipInputStream zip = getZipInputStream(jar);
+		if(zip != null) {
+			try {
+				ZipEntry entry;
+				while ((entry = zip.getNextEntry()) != null) {
+					if (isTLD(entry.getName())) { //$NON-NLS-1$
+						if (entry.getName().equals(JarUtilities.JSP11_TAGLIB)) {
+							jarRecord.has11TLD = true;
+						}
+						InputStream contents = copyZipEntry(zip);
+						if (contents != null) {
+							TaglibInfo info = extractInfo(jarLocationString, contents);
+		
+							if (info != null && info.uri != null && info.uri.length() > 0) {
+								URLRecord record = new URLRecord();
+								record.info = info;
+								record.baseLocation = jarLocationString;
+								try {
+									record.url = new URL("jar:file:" + jarLocationString + "!/" + entry.getName()); //$NON-NLS-1$ //$NON-NLS-2$
+									jarRecord.urlRecords.add(record);
+		
+									int taglibDeltaKind = ITaglibIndexDelta.ADDED;
+									Hashtable table = getImplicitReferences(jar.getFullPath().toString());
+									if (table != null && table.get(record.getURI()) != null) {
+										taglibDeltaKind = ITaglibIndexDelta.CHANGED;
+									}
+		
+									getImplicitReferences(jar.getFullPath().toString()).put(info.uri, record);
+									TaglibIndex.getInstance().addDelta(new TaglibIndexDelta(fProject, record, taglibDeltaKind));
+									if (_debugIndexCreation)
+										Logger.log(Logger.INFO, "created record for " + record.getURI() + "@" + record.getURL()); //$NON-NLS-1$ //$NON-NLS-2$
+								}
+								catch (MalformedURLException e) {
+									// don't record this URI
+									Logger.logException(e);
+								}
 							}
-
-							getImplicitReferences(jar.getFullPath().toString()).put(record.getURI(), record);
-							TaglibIndex.getInstance().addDelta(new TaglibIndexDelta(fProject, record, taglibDeltaKind));
-							if (_debugIndexCreation)
-								Logger.log(Logger.INFO, "created record for " + record.getURI() + "@" + record.getURL()); //$NON-NLS-1$ //$NON-NLS-2$
+							try {
+								contents.close();
+							}
+							catch (IOException e) {
+								Logger.log(Logger.ERROR_DEBUG, null, e);
+							}
 						}
-						catch (MalformedURLException e) {
-							// don't record this URI
-							Logger.logException(e);
+						else {
+							Logger.log(Logger.ERROR_DEBUG, getClass().getName() + "could not read resource " + jar.getFullPath()); //$NON-NLS-1$
 						}
 					}
-					try {
-						contents.close();
-					}
-					catch (IOException e) {
-					}
 				}
-				else {
-					Logger.log(Logger.ERROR_DEBUG, getClass().getName() + "could not read resource " + jar.getFullPath()); //$NON-NLS-1$
-				}
+			} catch (IOException e) { }
+			finally {
+				closeInputStream(zip);
 			}
 		}
 		if (jarRecord.has11TLD) {
@@ -2079,6 +2387,58 @@
 		}
 	}
 
+	private InputStream copyZipEntry(ZipInputStream stream) {
+		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+		InputStream copy = null;
+
+		if (stream != null) {
+			int c;
+			// array dim restriction?
+			byte bytes[] = new byte[2048];
+			try {
+				while ((c = stream.read(bytes)) >= 0) {
+					buffer.write(bytes, 0, c);
+				}
+				copy = new ByteArrayInputStream(buffer.toByteArray());
+				closeZipEntry(stream);
+			}
+			catch (IOException ioe) {
+				// no cleanup can be done
+			}
+		}
+		return copy;
+	}
+
+	private ZipInputStream getZipInputStream(IResource jar) {
+		if (jar == null || jar.getType() != IResource.FILE || !jar.isAccessible())
+			return null;
+
+		try {
+			InputStream zipStream = ((IFile) jar).getContents();
+			return new ZipInputStream(zipStream);
+		} catch (CoreException e) { }
+		return null;
+	}
+
+	private void closeInputStream(InputStream stream) {
+		if (stream != null) {
+			try {
+				stream.close();
+			} catch (IOException e) { }
+		}
+			
+	}
+
+	private void closeZipEntry(ZipInputStream zis) {
+		if (zis != null) {
+			try {
+				zis.closeEntry();
+			} catch (IOException e) {
+				System.out.println("Error");
+			}
+		}
+			
+	}
 
 	void updateTag(IResource resource, int kind) {
 		TagDirRecord record = (TagDirRecord) fTagDirReferences.get(resource.getParent().getFullPath().toString());
@@ -2121,12 +2481,17 @@
 		}
 	}
 
+	/**
+	 * 
+	 * @param tld
+	 * @param deltaKind
+	 */
 	void updateTLD(IResource tld, int deltaKind) {
 		if (_debugIndexCreation)
 			Logger.log(Logger.INFO, "creating record for " + tld.getFullPath()); //$NON-NLS-1$
 		TLDRecord record = createTLDRecord(tld);
 		fTLDReferences.put(tld.getFullPath().toString(), record);
-		if (record.getURI() != null) {
+		if (record.getURI() != null && record.getURI().length() > 0) {
 			getImplicitReferences(tld.getFullPath().toString()).put(record.getURI(), record);
 		}
 		TaglibIndex.getInstance().addDelta(new TaglibIndexDelta(fProject, record, deltaKind));
@@ -2138,7 +2503,7 @@
 		InputStream webxmlContents = null;
 		Document document = null;
 		try {
-			webxmlContents = ((IFile) webxml).getContents(true);
+			webxmlContents = ((IFile) webxml).getContents(false);
 			DocumentProvider provider = new DocumentProvider();
 			provider.setInputStream(webxmlContents);
 			provider.setValidating(false);
@@ -2156,6 +2521,7 @@
 				}
 				catch (IOException e1) {
 					// ignore
+					Logger.log(Logger.ERROR_DEBUG, null, e1);
 				}
 		}
 		if (document == null)
@@ -2169,11 +2535,11 @@
 		NodeList taglibs = document.getElementsByTagName(JSP12TLDNames.TAGLIB);
 		for (int iTaglib = 0; iTaglib < taglibs.getLength(); iTaglib++) {
 			String taglibUri = readTextofChild(taglibs.item(iTaglib), "taglib-uri").trim(); //$NON-NLS-1$
-			// specified location is relative to root of the webapp
+			// specified location is relative to root of the web-app
 			String taglibLocation = readTextofChild(taglibs.item(iTaglib), "taglib-location").trim(); //$NON-NLS-1$
 			IPath path = null;
 			if (taglibLocation.startsWith("/")) { //$NON-NLS-1$
-				path = new Path(getLocalRoot(webxml.getFullPath().toString()) + taglibLocation);
+				path = FacetModuleCoreSupport.resolve(new Path(webxml.getFullPath().toString()), taglibLocation);
 			}
 			else {
 				path = new Path(URIHelper.normalize(taglibLocation, webxml.getFullPath().toString(), getLocalRoot(webxml.getFullPath().toString())));
@@ -2202,6 +2568,7 @@
 											contents.close();
 										}
 										catch (IOException e) {
+											Logger.log(Logger.ERROR_DEBUG, null, e);
 										}
 									}
 								}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java
index 4836346..29b280b 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -46,7 +46,9 @@
 import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
 import org.eclipse.jst.jsp.core.internal.Logger;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
+import org.eclipse.wst.sse.core.internal.util.AbstractMemoryListener;
 import org.osgi.framework.Bundle;
+import org.osgi.service.event.Event;
 
 /**
  * A non-extendable index manager for taglibs similar to the previous J2EE
@@ -97,7 +99,7 @@
 			else if (element.getElementType() == IJavaElement.JAVA_PROJECT) {
 				if ((delta.getFlags() & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0) {
 					IJavaElement proj = element;
-					handleClasspathChange((IJavaProject) proj, forceUpdate);
+					handleClasspathChange((IJavaProject) proj, delta, forceUpdate);
 				}
 				else {
 					IJavaElementDelta[] deltas = delta.getAffectedChildren();
@@ -116,7 +118,7 @@
 								// removing the index file ensures that we
 								// don't get stale data if the project is
 								// reopened
-								removeIndex(proj.getProject());
+								removeIndexFile(proj.getProject());
 							}
 						}
 					}
@@ -158,7 +160,7 @@
 			}
 		}
 
-		private void handleClasspathChange(IJavaProject project, boolean forceUpdate) {
+		private void handleClasspathChange(IJavaProject project, IJavaElementDelta delta, boolean forceUpdate) {
 			if (frameworkIsShuttingDown())
 				return;
 
@@ -179,7 +181,7 @@
 					}
 					if (description != null && !frameworkIsShuttingDown()) {
 						projectsIndexed.add(resource);
-						description.setBuildPathIsDirty();
+						description.queueElementChanged(delta);
 					}
 				}
 			}
@@ -289,8 +291,6 @@
 									}
 								}
 								for (int i = 0; i < projects.length; i++) {
-									if (deltas[i].getKind() == IResourceDelta.CHANGED && (deltas[i].getFlags() == IResourceDelta.ENCODING || deltas[i].getFlags() == IResourceDelta.MARKERS))
-										continue;
 									try {
 										if (deltas[i] != null && deltas[i].getKind() != IResourceDelta.REMOVED && projects[i].isAccessible()) {
 											ProjectDescription description = getDescription(projects[i]);
@@ -331,6 +331,42 @@
 		}
 	}
 
+	/**
+	 * <p>A {@link AbstractMemoryListener} that clears the {@link ProjectDescription} cache
+	 * whenever specific memory events are received.</p>
+	 * 
+	 * <p>Events:
+	 * <ul>
+	 * <li>{@link AbstractMemoryListener#SEV_SERIOUS}</li>
+	 * <li>{@link AbstractMemoryListener#SEV_CRITICAL}</li>
+	 * </ul>
+	 * </p>
+	 */
+	private class MemoryListener extends AbstractMemoryListener {
+		/**
+		 * <p>Constructor causes this listener to listen for specific memory events.</p>
+		 * <p>Events:
+		 * <ul>
+		 * <li>{@link AbstractMemoryListener#SEV_SERIOUS}</li>
+		 * <li>{@link AbstractMemoryListener#SEV_CRITICAL}</li>
+		 * </ul>
+		 * </p>
+		 */
+		MemoryListener() {
+			super(new String[] { SEV_SERIOUS, SEV_CRITICAL });
+		}
+		
+		/**
+		 * On any memory event we handle clear out the project descriptions
+		 * 
+		 * @see org.eclipse.jst.jsp.core.internal.util.AbstractMemoryListener#handleMemoryEvent(org.osgi.service.event.Event)
+		 */
+		protected void handleMemoryEvent(Event event) {
+			clearProjectDescriptions();
+		}
+		
+	}
+	
 	static final boolean _debugChangeListener = false;
 
 	static boolean _debugEvents = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.jst.jsp.core/taglib/events")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -349,7 +385,7 @@
 	private static final String DIRTY = "DIRTY";
 	static boolean ENABLED = false;
 
-	static ILock LOCK = Job.getJobManager().newLock();
+	static final ILock LOCK = Job.getJobManager().newLock();
 
 	/**
 	 * NOT API.
@@ -413,6 +449,7 @@
 	 * Finds all of the visible ITaglibRecords for the given path in the
 	 * workspace. Taglib mappings from web.xml files are only visible to paths
 	 * within the web.xml's corresponding web content folder.
+	 * This method will almost certainly require a workspace lock to complete.
 	 * 
 	 * @param fullPath -
 	 *            a path within the workspace
@@ -476,16 +513,17 @@
 
 	/**
 	 * Finds a matching ITaglibRecord given the reference. Typically the
-	 * result will have to be cast to a subiinterface of ITaglibRecord.
+	 * result will have to be cast to a subinterface of ITaglibRecord. This
+	 * method will almost certainly require a workspace lock to complete.
 	 * 
-	 * @param basePath -
-	 *            the workspace-relative path for IResources, full filesystem
-	 *            path otherwise
-	 * @param reference -
-	 *            the URI to lookup, for example the uri value from a taglib
+	 * @param basePath
+	 *            - the workspace-relative path for IResources, full
+	 *            filesystem path otherwise
+	 * @param reference
+	 *            - the URI to lookup, for example the uri value from a taglib
 	 *            directive
-	 * @param crossProjects -
-	 *            whether to search across projects (currently ignored)
+	 * @param crossProjects
+	 *            - whether to search across projects (currently ignored)
 	 * 
 	 * @return a visible ITaglibRecord or null if the reference points to no
 	 *         known tag library descriptor
@@ -537,8 +575,8 @@
 	public static void shutdown() {
 		try {
 			LOCK.acquire();
-			if (_instance.isInitialized()) {
-				_instance.stop();
+			if (getInstance().isInitialized()) {
+				getInstance().stop();
 			}
 		}
 		finally {
@@ -573,6 +611,11 @@
 	private ResourceChangeListener fResourceChangeListener;
 
 	private ITaglibIndexListener[] fTaglibIndexListeners = null;
+	
+	/**
+	 * Used to keep the {@link ProjectDescription} cache clean when memory is low
+	 */
+	private MemoryListener fMemoryListener;
 
 	/** symbolic name for OSGI framework */
 	private final static String OSGI_FRAMEWORK_ID = "org.eclipse.osgi"; //$NON-NLS-1$
@@ -592,6 +635,7 @@
 			 * while we were waiting for the lock
 			 */
 			if (!isInitialized()) {
+				getWorkingLocation();
 				/*
 				 * Only consider a crash if a value exists and is DIRTY (not a
 				 * new workspace)
@@ -604,9 +648,13 @@
 				fProjectDescriptions = new Hashtable();
 				fResourceChangeListener = new ResourceChangeListener();
 				fClasspathChangeListener = new ClasspathChangeListener();
+				fMemoryListener = new MemoryListener();
+
 				if (ENABLED) {
 					ResourcesPlugin.getWorkspace().addResourceChangeListener(fResourceChangeListener, IResourceChangeEvent.POST_CHANGE);
 					JavaCore.addElementChangedListener(fClasspathChangeListener);
+					//register the memory listener
+					fMemoryListener.connect();
 				}
 				setIntialized(true);
 			}
@@ -621,7 +669,7 @@
 	 * 
 	 * @param delta
 	 */
-	void addDelta(ITaglibIndexDelta delta) {
+	synchronized void addDelta(ITaglibIndexDelta delta) {
 		ensureDelta(delta.getProject()).addChildDelta(delta);
 	}
 
@@ -629,7 +677,7 @@
 	 * Based on org.eclipse.jdt.internal.core.search.indexing.IndexManager
 	 * 
 	 * @param containerPath
-	 * @return
+	 * @return the index file location for the given workspace path
 	 */
 	String computeIndexLocation(IPath containerPath) {
 		String fileName = computeIndexName(containerPath);
@@ -649,9 +697,12 @@
 
 	/**
 	 * @param project
-	 * @return
+	 * @return the ProjectDescription representing the given project
 	 */
 	ProjectDescription createDescription(IProject project) {
+		if (fProjectDescriptions == null)
+			return null;
+
 		ProjectDescription description = null;
 		try {
 			LOCK.acquire();
@@ -856,7 +907,7 @@
 	/**
 	 * Removes index file for the given project.
 	 */
-	private void removeIndex(IProject project) {
+	void removeIndexFile(IProject project) {
 		File indexFile = new File(computeIndexLocation(project.getFullPath()));
 		if (indexFile.exists()) {
 			indexFile.delete();
@@ -873,15 +924,7 @@
 	 *            indexes
 	 */
 	private void removeIndexes(boolean staleOnly) {
-		String osPath = getTaglibIndexStateLocation().toOSString();
-		File folder = new File(osPath);
-		if (!folder.isDirectory()) {
-			try {
-				folder.mkdir();
-			}
-			catch (SecurityException e) {
-			}
-		}
+		File folder = getWorkingLocation();
 
 		// remove any extraneous index files
 		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
@@ -912,8 +955,12 @@
 
 	private void stop() {
 		if (isInitialized()) {
+			setIntialized(false);
+
 			ResourcesPlugin.getWorkspace().removeResourceChangeListener(fResourceChangeListener);
 			JavaCore.removeElementChangedListener(fClasspathChangeListener);
+			//unregister the memory listener
+			fMemoryListener.disconnect();
 
 			/*
 			 * Clearing the existing saved states helps prune dead data from
@@ -921,6 +968,39 @@
 			 */
 			removeIndexes(true);
 
+			clearProjectDescriptions();
+
+			setState(CLEAN);
+			fProjectDescriptions = null;
+			fResourceChangeListener = null;
+			fClasspathChangeListener = null;
+			fMemoryListener = null;
+		}
+	}
+
+	/**
+	 * Get the working location for the taglib index
+	 * @return The File representing the taglib index's working location
+	 */
+	private File getWorkingLocation() {
+		File folder = new File(getTaglibIndexStateLocation().toOSString());
+		if (!folder.isDirectory()) {
+			try {
+				folder.mkdir();
+			}
+			catch (SecurityException e) {
+			}
+		}
+		return folder;
+	}
+
+	/**
+	 * Have all of the ProjectDescriptions write their information to disk and
+	 * then clear our map of them
+	 */
+	void clearProjectDescriptions() {
+		try {
+			LOCK.acquire();
 			Iterator i = fProjectDescriptions.values().iterator();
 			while (i.hasNext()) {
 				ProjectDescription description = (ProjectDescription) i.next();
@@ -928,12 +1008,8 @@
 			}
 
 			fProjectDescriptions.clear();
-
-			setState(CLEAN);
-			fProjectDescriptions = null;
-			fResourceChangeListener = null;
-			fClasspathChangeListener = null;
-			setIntialized(false);
+		} finally {
+			LOCK.release();
 		}
 	}
 
diff --git a/bundles/org.eclipse.wst.html.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.html.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..287cb52
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/META-INF/MANIFEST.MF
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.wst.html.core; singleton:=true
+Bundle-Version: 1.1.406.qualifier
+Bundle-Activator: org.eclipse.wst.html.core.internal.HTMLCorePlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.wst.html.core.internal;x-internal:=true,
+ org.eclipse.wst.html.core.internal.cleanup;x-internal:=true,
+ org.eclipse.wst.html.core.internal.commentelement.handlers;x-internal:=true,
+ org.eclipse.wst.html.core.internal.contentmodel;x-internal:=true,
+ org.eclipse.wst.html.core.internal.contentmodel.chtml;x-internal:=true,
+ org.eclipse.wst.html.core.internal.contentmodel.ssi;x-internal:=true,
+ org.eclipse.wst.html.core.internal.contentproperties;x-internal:=true,
+ org.eclipse.wst.html.core.internal.contenttype;x-internal:=true,
+ org.eclipse.wst.html.core.internal.document;x-internal:=true,
+ org.eclipse.wst.html.core.internal.encoding;x-internal:=true,
+ org.eclipse.wst.html.core.internal.format;x-internal:=true,
+ org.eclipse.wst.html.core.internal.htmlcss;x-internal:=true,
+ org.eclipse.wst.html.core.internal.modelhandler;x-internal:=true,
+ org.eclipse.wst.html.core.internal.modelquery;x-internal:=true,
+ org.eclipse.wst.html.core.internal.preferences;x-internal:=true,
+ org.eclipse.wst.html.core.internal.provisional;x-internal:=true,
+ org.eclipse.wst.html.core.internal.provisional.contenttype;x-internal:=true,
+ org.eclipse.wst.html.core.internal.provisional.text;x-internal:=true,
+ org.eclipse.wst.html.core.internal.text;x-internal:=true,
+ org.eclipse.wst.html.core.internal.validate;x-internal:=true,
+ org.eclipse.wst.html.core.text
+Import-Package: com.ibm.icu.util; version="3.8"
+Require-Bundle: org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.common.uriresolver;bundle-version="[1.1.301,1.2.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.wst.css.core;bundle-version="[1.1.400,1.2.0)",
+ org.eclipse.core.filebuffers;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.2.0,2.0.0)";resolution:=optional
+Bundle-ActivationPolicy: lazy;exclude:="org.eclipse.wst.html.core.internal.contenttype,org.eclipse.wst.html.core.internal.provisional.contenttype"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.html.core/build.properties b/bundles/org.eclipse.wst.html.core/build.properties
index 7ea2b7e..5c655fd 100644
--- a/bundles/org.eclipse.wst.html.core/build.properties
+++ b/bundles/org.eclipse.wst.html.core/build.properties
@@ -18,6 +18,5 @@
 bin.excludes = bin/**,\
                @dot/**,\
                temp.folder/**
-src.includes = component.xml,\
-               build.properties
+src.includes = component.xml
 source.. = src/
diff --git a/bundles/org.eclipse.wst.html.core/plugin.properties b/bundles/org.eclipse.wst.html.core/plugin.properties
index 7ba2487..14b6fdc 100644
--- a/bundles/org.eclipse.wst.html.core/plugin.properties
+++ b/bundles/org.eclipse.wst.html.core/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2004, 2008 IBM Corporation and others.
+# Copyright (c) 2004, 2010 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 ###############################################################################
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 pluginName=Structured Source HTML Model
 Structured_HTML_Document_Factory_Extension.name=Structured HTML Document Factory Extension
 HTML_Content_Type_Extension_Element.name=HTML
diff --git a/bundles/org.eclipse.wst.html.core/plugin.xml b/bundles/org.eclipse.wst.html.core/plugin.xml
index 0bd5628..6c0bae8 100644
--- a/bundles/org.eclipse.wst.html.core/plugin.xml
+++ b/bundles/org.eclipse.wst.html.core/plugin.xml
@@ -121,7 +121,7 @@
 		</annotationFile>
 	</extension>
 
-	<extension point="org.eclipse.core.runtime.contentTypes">
+	<extension point="org.eclipse.core.contenttype.contentTypes">
 		<content-type
 			file-extensions="html,htm,xhtml,htpl,wml,shtml,shtm"
 			priority="high"
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCoreMessages.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCoreMessages.java
index 92f6df1..f2f93b1 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCoreMessages.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCoreMessages.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -50,6 +50,9 @@
 	public static String _ERROR_Attribute_value___0___not_closed__1;
 	public static String HTMLContentPropertiesManager_Updating;
 	public static String HTMLContentPropertiesManager_Problems_Updating;
+	public static String _ERROR_Resource_not_found_0;
+	public static String Obsolete_attribute_name___ERROR_;
+	public static String Obsolete_tag___ERROR_;
 
 	static {
 		// load message values from bundle file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCorePluginResources.properties b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCorePluginResources.properties
index 7cb04b6..7301451 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCorePluginResources.properties
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/HTMLCorePluginResources.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2004, 2006 IBM Corporation and others.
+# Copyright (c) 2004, 2010 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -40,3 +40,6 @@
 #
 HTMLContentPropertiesManager_Updating=Updating Web Content Settings
 HTMLContentPropertiesManager_Problems_Updating=Problem saving Web Content Settings for {0}
+_ERROR_Resource_not_found_0=Resource not found: {0}
+Obsolete_attribute_name___ERROR_=Attribute ({0}) is obsolete. Its use is discouraged in HTML5 documents.
+Obsolete_tag___ERROR_=Element ({0}) is obsolete. Its use is discouraged in HTML5 documents.
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/CSSTextNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/CSSTextNodeCleanupHandler.java
index 05675c6..7a2b246 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/CSSTextNodeCleanupHandler.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/CSSTextNodeCleanupHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -37,7 +37,9 @@
 		IStructuredDocument structuredDocument = model.getStructuredDocument();
 		if (structuredDocument == null)
 			return node;
-
+		if ( !getCleanupPreferences().getFormatSource())
+			return node;
+		
 		String content = getCSSContent(node);
 		if (content == null)
 			return node;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java
index 11af74b..9f37d31 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     David Carver (Intalion) - Cleanup Repeated Conditional check in isXMLType method
  *******************************************************************************/
 package org.eclipse.wst.html.core.internal.cleanup;
 
@@ -33,6 +34,7 @@
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.sse.core.utils.StringUtils;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
@@ -52,6 +54,7 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 // nakamori_TODO: check and remove CSS formatting
 
@@ -105,10 +108,12 @@
 		// there are any
 		// insertMissingTags() will return the new missing start tag if one is
 		// missing
+		// then compress any empty element tags
 		// applyTagNameCase() will return the renamed node.
 		// The renamed/new node will be saved and returned to caller when all
 		// cleanup is done.
 		renamedNode = insertMissingTags(renamedNode);
+		renamedNode = compressEmptyElementTag(renamedNode);
 		renamedNode = insertRequiredAttrs(renamedNode);
 		renamedNode = applyTagNameCase(renamedNode);
 		applyAttrNameCase(renamedNode);
@@ -170,6 +175,8 @@
 
 		for (int i = 0; i < attributesLength; i++) {
 			IDOMNode eachAttr = (IDOMNode) attributes.item(i);
+			if (hasNestedRegion(eachAttr.getNameRegion()))
+				continue;
 			String oldAttrName = eachAttr.getNodeName();
 			String newAttrName = oldAttrName;
 			/*
@@ -195,6 +202,19 @@
 		}
 	}
 
+	/**
+	 * True if container has nested regions, meaning container is probably too
+	 * complicated (like JSP regions) to validate with this validator.
+	 */
+	private boolean hasNestedRegion(ITextRegion container) {
+		if (!(container instanceof ITextRegionContainer))
+			return false;
+		ITextRegionList regions = ((ITextRegionContainer) container).getRegions();
+		if (regions == null)
+			return false;
+		return true;
+	}
+
 	protected IDOMNode applyTagNameCase(IDOMNode node) {
 		IDOMElement element = (IDOMElement) node;
 		if (element.isCommentTag())
@@ -506,7 +526,7 @@
 	protected boolean isXMLType(IDOMModel structuredModel) {
 		boolean result = false;
 
-		if (structuredModel != null && structuredModel != null) {
+		if (structuredModel != null) {
 			IDOMDocument document = structuredModel.getDocument();
 
 			if (document != null)
@@ -692,4 +712,51 @@
 
 		return result;
 	}
+
+	/**
+	 * <p>Compress empty element tags if the prefence is set to do so</p>
+	 * 
+	 * @copyof org.eclipse.wst.xml.core.internal.cleanup.ElementNodeCleanupHandler#compressEmptyElementTag
+	 * 
+	 * @param node the {@link IDOMNode} to possible compress
+	 * @return the compressed node if the given node should be compressed, else the node as it was given
+	 */
+	private IDOMNode compressEmptyElementTag(IDOMNode node) {
+		boolean compressEmptyElementTags = getCleanupPreferences().getCompressEmptyElementTags();
+		IDOMNode newNode = node;
+
+		IStructuredDocumentRegion startTagStructuredDocumentRegion = newNode.getFirstStructuredDocumentRegion();
+		IStructuredDocumentRegion endTagStructuredDocumentRegion = newNode.getLastStructuredDocumentRegion();
+
+		//only compress tags if they are empty
+		if ((compressEmptyElementTags && startTagStructuredDocumentRegion != endTagStructuredDocumentRegion &&
+				startTagStructuredDocumentRegion != null)) {
+
+			//only compress end tags if its XHTML or not a container
+			if(isXMLTag((IDOMElement)newNode) || !newNode.isContainer()) {
+				ITextRegionList regions = startTagStructuredDocumentRegion.getRegions();
+				ITextRegion lastRegion = regions.get(regions.size() - 1);
+				// format children and end tag if not empty element tag
+				if (lastRegion.getType() != DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+					NodeList childNodes = newNode.getChildNodes();
+					if (childNodes == null || childNodes.getLength() == 0 || (childNodes.getLength() == 1 && (childNodes.item(0)).getNodeType() == Node.TEXT_NODE && ((childNodes.item(0)).getNodeValue().trim().length() == 0))) {
+						IDOMModel structuredModel = newNode.getModel();
+						IStructuredDocument structuredDocument = structuredModel.getStructuredDocument();
+
+						int startTagStartOffset = newNode.getStartOffset();
+						int offset = endTagStructuredDocumentRegion.getStart();
+						int length = endTagStructuredDocumentRegion.getLength();
+						structuredDocument.replaceText(structuredDocument, offset, length, ""); //$NON-NLS-1$
+						newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); // save
+
+						offset = startTagStructuredDocumentRegion.getStart() + lastRegion.getStart();
+						structuredDocument.replaceText(structuredDocument, offset, 0, "/"); //$NON-NLS-1$
+						newNode = (IDOMNode) structuredModel.getIndexedRegion(startTagStartOffset); // save
+					}
+				}
+			}
+		}
+
+		return newNode;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java
index ab2a71c..fa77f0e 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -23,10 +23,10 @@
 /**
  * Factory for attribute declarations.
  */
-final class AttributeCollection extends CMNamedNodeMapImpl implements HTML40Namespace {
+class AttributeCollection extends CMNamedNodeMapImpl implements HTML40Namespace {
 
 	/** bodycolors. */
-	private static final String[] BODYCOLORS = {ATTR_NAME_BGCOLOR, ATTR_NAME_TEXT, ATTR_NAME_LINK, ATTR_NAME_VLINK, HTML40Namespace.ATTR_NAME_ALINK};
+	private static final String[] BODYCOLORS = {ATTR_NAME_BGCOLOR, ATTR_NAME_TEXT, ATTR_NAME_LINK, ATTR_NAME_VLINK, ATTR_NAME_ALINK};
 	/** coreattrs. */
 	private static final String[] CORE = {ATTR_NAME_ID, ATTR_NAME_CLASS, ATTR_NAME_STYLE, ATTR_NAME_TITLE};
 	/** events. */
@@ -49,7 +49,7 @@
 	 * @param attrName
 	 *            java.lang.String
 	 */
-	private HTMLAttrDeclImpl create(String attrName) {
+	protected HTMLAttrDeclImpl create(String attrName) {
 		HTMLAttrDeclImpl attr = null;
 		HTMLCMDataTypeImpl atype = null;
 
@@ -1209,7 +1209,7 @@
 		atype.setEnumValues(values);
 
 		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
-		declarations.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+		declarations.putNamedItem(ATTR_NAME_ALIGN, attr);
 
 		// the rest.
 		Iterator names = Arrays.asList(CELLHALIGN).iterator();
@@ -1221,9 +1221,9 @@
 	 * (top|middle|bottom|baseline) #IMPLIED)
 	 */
 	public void getCellvalign(CMNamedNodeMapImpl declarations) {
-		HTMLAttributeDeclaration dec = getDeclaration(HTML40Namespace.ATTR_NAME_VALIGN);
+		HTMLAttributeDeclaration dec = getDeclaration(ATTR_NAME_VALIGN);
 		if (dec != null)
-			declarations.putNamedItem(HTML40Namespace.ATTR_NAME_VALIGN, dec);
+			declarations.putNamedItem(ATTR_NAME_VALIGN, dec);
 	}
 
 	/**
@@ -1282,4 +1282,410 @@
 		Iterator names = Arrays.asList(I18N).iterator();
 		getDeclarations(declarations, names);
 	}
+	
+	/**
+	 * create declarations.
+	 */
+	public void createAttributeDeclarations(String elementName, CMNamedNodeMapImpl attributes) {
+		 /* (type %InputType; TEXT) ... should be defined locally.
+		 * (name CDATA #IMPLIED)
+		 * (value CDATA #IMPLIED)
+		 * (checked (checked) #IMPLIED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (readonly (readonly) #IMPLIED)
+		 * (size CDATA #IMPLIED) ... should be defined locally.
+		 * (maxlength NUMBER #IMPLIED)
+		 * (src %URI; #IMPLIED)
+		 * (alt CDATA #IMPLIED) ... should be defined locally.
+		 * (usemap %URI; #IMPLIED)
+		 * (ismap (ismap) #IMPLIED)
+		 * (tabindex NUMBER #IMPLIED)
+		 * (accesskey %Character; #IMPLIED)
+		 * (onfocus %Script; #IMPLIED)
+		 * (onblur %Script; #IMPLIED)
+		 * (onselect %Script; #IMPLIED)
+		 * (onchange %Script; #IMPLIED)
+		 * (accept %ContentTypes; #IMPLIED)
+		 * (align %IAlign; #IMPLIED) ... should be defined locally.
+		 * (istyle CDATA #IMPLIED)
+		 * <<D215684
+		 * (width CDATA; #IMPLIED)
+		 * (height CDATA; #IMPLIED)
+		 * (border CDATA; #IMPLIED)
+		 * D215684
+		 */
+		if (elementName.equals(HTML40Namespace.ElementName.INPUT)){
+			HTMLCMDataTypeImpl atype = null;
+			HTMLAttrDeclImpl attr = null;
+			// (type %InputType; TEXT) ... should be defined locally.
+			// NOTE: %InputType is ENUM;
+			// (text | password | checkbox | radio | submit | reset |
+			//  file | hidden | image | button)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_TEXT, ATTR_VALUE_PASSWORD, ATTR_VALUE_CHECKBOX, ATTR_VALUE_RADIO, ATTR_VALUE_SUBMIT, ATTR_VALUE_RESET, ATTR_VALUE_FILE, ATTR_VALUE_HIDDEN, ATTR_VALUE_IMAGE, ATTR_VALUE_BUTTON};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_TEXT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+
+			// (size CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SIZE, attr);
+
+			// (alt CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ALT, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_ALT, attr);
+
+			// (align %IAlign; #IMPLIED) ... should be defined locally.
+			attr = AttributeCollection.createAlignForImage();
+			attributes.putNamedItem(ATTR_NAME_ALIGN, attr);
+
+			// the rest.
+			String[] names = {ATTR_NAME_NAME, ATTR_NAME_VALUE, ATTR_NAME_CHECKED, ATTR_NAME_DISABLED, ATTR_NAME_READONLY, ATTR_NAME_SIZE, ATTR_NAME_MAXLENGTH, ATTR_NAME_SRC, ATTR_NAME_ALT, ATTR_NAME_USEMAP, ATTR_NAME_ISMAP, ATTR_NAME_TABINDEX, ATTR_NAME_ACCESSKEY, ATTR_NAME_ONFOCUS, ATTR_NAME_ONBLUR, ATTR_NAME_ONSELECT, ATTR_NAME_ONCHANGE, ATTR_NAME_ACCEPT, ATTR_NAME_ALIGN, ATTR_NAME_ISTYLE,
+			//<<D215684
+						ATTR_NAME_WIDTH, ATTR_NAME_HEIGHT, ATTR_NAME_BORDER
+			//<D215684
+			};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		}
+		 /* (charset %Charset; #IMPLIED)
+		 * (href %URI; #IMPLIED)
+		 * (hreflang %LanguageCode; #IMPLIED)
+		 * (type %ContentType; #IMPLIED): should be defined locally.
+		 * (rel %LinkTypes; #IMPLIED)
+		 * (rev %LinkTypes; #IMPLIED)
+		 * (media %MediaDesc; #IMPLIED)
+		 * (target %FrameTarget; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.LINK)){
+			String[] names = {ATTR_NAME_CHARSET, ATTR_NAME_HREF, ATTR_NAME_HREFLANG, ATTR_NAME_REL, ATTR_NAME_REV, ATTR_NAME_MEDIA, ATTR_NAME_TARGET};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// (type %ContentType; #IMPLIED)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+		
+		}
+		/* (charset %Charset; #IMPLIED)
+		 * (type %ContentType; #IMPLIED)
+		 * (name CDATA #IMPLIED)
+		 * (href %URI; #IMPLIED)
+		 * (hreflang %LanguageCode; #IMPLIED)
+		 * (target %FrameTarget; #IMPLIED)
+		 * (rel %LinkTypes; #IMPLIED)
+		 * (rev %LinkTypes; #IMPLIED)
+		 * (accesskey %Character; #IMPLIED)
+		 * (directkey %Character; #IMPLIED)
+		 * (shape %Shape; rect)
+		 * (coords %Coords; #IMPLIED)
+		 * (tabindex NUMBER #IMPLIED)
+		 * (onfocus %Script; #IMPLIED)
+		 * (onblur %Script; #IMPLIED) 
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.A)){
+			String[] names = {ATTR_NAME_CHARSET, ATTR_NAME_TYPE, ATTR_NAME_NAME, ATTR_NAME_HREF, ATTR_NAME_HREFLANG, ATTR_NAME_TARGET, ATTR_NAME_REL, ATTR_NAME_REV, ATTR_NAME_ACCESSKEY, ATTR_NAME_DIRECTKEY, ATTR_NAME_SHAPE, ATTR_NAME_COORDS, ATTR_NAME_TABINDEX, ATTR_NAME_ONFOCUS, ATTR_NAME_ONBLUR};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		
+		}
+		/*
+		 * (shape %Shape; rect)
+		 * (coords %Coords; #IMPLIED)
+		 * (href %URI; #IMPLIED)
+		 * (target %FrameTarget; #IMPLIED)
+		 * (nohref (nohref) #IMPLIED)
+		 * (alt %Text; #REQUIRED)
+		 * (tabindex NUMBER #IMPLIED)
+		 * (accesskey %Character; #IMPLIED)
+		 * (onfocus %Script; #IMPLIED)
+		 * (onblur %Script; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.AREA)){
+			String[] names = {ATTR_NAME_SHAPE, ATTR_NAME_COORDS, ATTR_NAME_HREF, ATTR_NAME_TARGET, ATTR_NAME_NOHREF, ATTR_NAME_ALT, ATTR_NAME_TABINDEX, ATTR_NAME_ACCESSKEY, ATTR_NAME_ONFOCUS, ATTR_NAME_ONBLUR};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		}
+		/*
+		 *  %i18n;
+		 * (http-equiv NAME #IMPLIED)
+		 * (name NAME #IMPLIED) ... should be defined locally.
+		 * (content CDATA #REQUIRED)
+		 * (scheme CDATA #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.META)){
+			// %i18n;
+			getI18n(attributes);
+
+			// (name NAME #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_NAME, attr);
+
+			String[] names = {ATTR_NAME_HTTP_EQUIV, ATTR_NAME_CONTENT, ATTR_NAME_SCHEME};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		}
+		/*
+		 * (src %URI; #REQUIRED): should be defined locally.
+		 * (alt %Text; #REQUIRED)
+		 * (longdesc %URI; #IMPLIED)
+		 * (name CDATA #IMPLIED)
+		 * (height %Length; #IMPLIED)
+		 * (width %Length; #IMPLIED)
+		 * (usemap %URI; #IMPLIED)
+		 * (ismap (ismap) #IMPLIED)
+		 * (align %IAlign; #IMPLIED): should be defined locally.
+		 * (border %Pixels; #IMPLIED)
+		 * (hspace %Pixels; #IMPLIED)
+		 * (vspace %Pixels; #IMPLIED)
+		 * (mapfile %URI; #IMPLIED)
+	 
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.IMG)){
+			// (src %URI; #REQUIRED): should be defined locally.
+			HTMLCMDataTypeImpl atype = null;
+			HTMLAttrDeclImpl attr = null;
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_SRC, attr);
+
+			String[] names = {ATTR_NAME_ALT, ATTR_NAME_LONGDESC, ATTR_NAME_NAME, ATTR_NAME_HEIGHT, ATTR_NAME_WIDTH, ATTR_NAME_USEMAP, ATTR_NAME_ISMAP, ATTR_NAME_BORDER, ATTR_NAME_HSPACE, ATTR_NAME_VSPACE, ATTR_NAME_MAPFILE};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// align (local); should be defined locally.
+			attr = AttributeCollection.createAlignForImage();
+			attributes.putNamedItem(ATTR_NAME_ALIGN, attr);
+		
+		}
+		/*
+		 * (id ID #IMPLIED)
+		 * (name CDATA #REQUIRED) ... should be defined locally.
+		 * (value CDATA #IMPLIED)
+		 * (valuetype (DATA|REF|OBJECT) DATA)
+		 * (type %ContentType; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.PARAM)){
+			String[] names = {ATTR_NAME_ID, ATTR_NAME_VALUE, ATTR_NAME_VALUETYPE, ATTR_NAME_TYPE};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// (name CDATA #REQUIRED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_NAME, attr);
+		}
+		/*
+		 * %reserved; ... empty
+		 * (name CDATA #IMPLIED)
+		 * (rows NUMBER #REQUIRED)
+		 * (cols NUMBER #REQUIRED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (readonly (readonly) #IMPLIED)
+		 * (tabindex NUMBER #IMPLIED)
+		 * (accesskey %Character; #IMPLIED)
+		 * (onfocus %Script; #IMPLIED)
+		 * (onblur %Script; #IMPLIED)
+		 * (onselect %Script; #IMPLIED)
+		 * (onchange %Script; #IMPLIED)
+		 * (istyle CDATA #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.TEXTAREA)){
+			String[] names = {ATTR_NAME_NAME, ATTR_NAME_ROWS, ATTR_NAME_COLS, ATTR_NAME_DISABLED, ATTR_NAME_READONLY, ATTR_NAME_TABINDEX, ATTR_NAME_ACCESSKEY, ATTR_NAME_ONFOCUS, ATTR_NAME_ONBLUR, ATTR_NAME_ONSELECT, ATTR_NAME_ONCHANGE, ATTR_NAME_ISTYLE};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		}
+		/*
+		 * (charset %Charset; #IMPLIED)
+		 * (type %ContentType; #REQUIRED) ... should be defined locally.
+		 * (language CDATA #IMPLIED)
+		 * (src %URI; #IMPLIED)
+		 * (defer (defer) #IMPLIED)
+		 * (event CDATA #IMPLIED)
+		 * (for %URI; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.SCRIPT)){
+			String[] names = {ATTR_NAME_CHARSET, ATTR_NAME_LANGUAGE, ATTR_NAME_SRC, ATTR_NAME_DEFER, ATTR_NAME_EVENT, ATTR_NAME_FOR};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// (type %ContentType; #REQUIRED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/javascript"); //$NON-NLS-1$
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+		
+		}
+		/*
+		 *  %i18n;
+		 * (type %ContentType; #REQUIRED) ... should be defined locally.
+		 * (media %MediaDesc; #IMPLIED)
+		 * (title %Text; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.STYLE)){
+			// %i18n;
+			getI18n(attributes);
+
+			String[] names = {ATTR_NAME_MEDIA, ATTR_NAME_TITLE};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			// (type %ContentType; #REQUIRED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/css"); //$NON-NLS-1$
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+		
+		}
+		/*
+		 * %reserved;
+		 * (name CDATA #IMPLIED)
+		 * (size NUMBER #IMPLIED) ... should be defined locally.
+		 * (multiple (multiple) #IMPLIED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (tabindex NUMBER #IMPLIED)
+		 * (onfocus %Script; #IMPLIED)
+		 * (onblur %Script; #IMPLIED)
+		 * (onchange %Script; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.SELECT)){
+			// (size NUMBER #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SIZE, attr);
+
+			String[] names = {ATTR_NAME_NAME, ATTR_NAME_MULTIPLE, ATTR_NAME_DISABLED, ATTR_NAME_TABINDEX, ATTR_NAME_ONFOCUS, ATTR_NAME_ONBLUR, ATTR_NAME_ONCHANGE};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		
+		}
+		/*
+		 * 	(type %LIStyle; #IMPLIED) ... should be defined locally.
+		 * (value NUMBER #IMPLIED) ... should be defined locally.
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.LI)){
+			// (type %LIStyle; #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LI_STYLE);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+
+			// (value NUMBER #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_VALUE, attr);
+		
+		}
+		/*
+		 * (type %OLStyle; #IMPLIED) ... should be defined locally.
+		 * (compact (compact) #IMPLIED)
+		 * (start NUMBER #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.OL)){
+			// (type %OLStyle; #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.OL_STYLE);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+
+			// the rest.
+			String[] names = {ATTR_NAME_COMPACT, ATTR_NAME_START};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		
+		}
+		/**
+		 * %coreattrs;
+		 * (longdesc %URI; #IMPLIED)
+		 * (name CDATA #IMPLIED)
+		 * (src %URI; #IMPLIED)
+		 * (frameborder (1|0) 1)
+		 * (marginwidth %Pixels; #IMPLIED)
+		 * (marginheight %Pixels; #IMPLIED)
+		 * (scrolling (yes|no|auto) auto)
+		 * (align %IAlign; #IMPLIED) ... should be defined locally.
+		 * (height %Length; #IMPLIED)
+		 * (width %Length; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.IFRAME)){
+			// %coreattrs;
+			getCore(attributes);
+
+			String[] names = {ATTR_NAME_LONGDESC, ATTR_NAME_NAME, ATTR_NAME_SRC, ATTR_NAME_FRAMEBORDER, ATTR_NAME_MARGINWIDTH, ATTR_NAME_MARGINHEIGHT, ATTR_NAME_SCROLLING, ATTR_NAME_HEIGHT, ATTR_NAME_WIDTH};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// align
+			HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage();
+			if (attr != null)
+				attributes.putNamedItem(ATTR_NAME_ALIGN, attr);
+		
+		}
+		/*
+		 * %i18n attrs
+		 * %version
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.HTML)){
+			// %i18n;
+			getI18n(attributes);
+			// version
+			HTMLAttributeDeclaration adec = getDeclaration(ATTR_NAME_VERSION);
+			if (adec != null)
+				attributes.putNamedItem(ATTR_NAME_VERSION, adec);
+		
+		}
+		/*
+		 * (compact (compact) #IMPLIED)
+	 	 */
+		else if (elementName.equals(HTML40Namespace.ElementName.MENU)){
+			String[] names = {ATTR_NAME_COMPACT};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		
+		}
+		/*
+		 * %reserved; ... empty.
+		 * (name CDATA #IMPLIED)
+		 * (value CDATA #IMPLIED)
+		 * (type (button|submit|reset) submit) ... should be defined locally.
+		 * (disabled (disabled) #IMPLIED)
+		 * (tabindex NUMBER #IMPLIED)
+		 * (accesskey %Character; #IMPLIED)
+		 * (onfocus %Script; #IMPLIED)
+		 * (onblur %Script; #IMPLIED)
+	 	 */
+		else if (elementName.equals(HTML40Namespace.ElementName.BUTTON)){
+			String[] names = {ATTR_NAME_NAME, ATTR_NAME_VALUE, ATTR_NAME_DISABLED, ATTR_NAME_TABINDEX, ATTR_NAME_ACCESSKEY, ATTR_NAME_ONFOCUS, ATTR_NAME_ONBLUR};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// (type (button|submit|reset) submit) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_BUTTON, ATTR_VALUE_SUBMIT, ATTR_VALUE_RESET};
+			atype.setEnumValues(values);
+
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+		
+		}
+		/*
+		 * %reserved;
+		 * (summary %Text; #IMPLIED)
+		 * (width %Length; #IMPLIED)
+		 * (border %Pixels; #IMPLIED)
+		 * (frame %TFrame; #IMPLIED)
+		 * (rules %TRules; #IMPLIED)
+		 * (cellspacing %Length; #IMPLIED)
+		 * (cellpadding %Length; #IMPLIED)
+		 * (align %TAlign; #IMPLIED)
+		 * (bgcolor %Color; #IMPLIED)
+		 * (datapagesize CDATA #IMPLIED)
+		 * (height %Pixels; #IMPLIED)
+		 * (background %URI; #IMPLIED)
+		 * (bordercolor %Color #IMPLIED) ... D205514
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.TABLE)){
+			// %reserved;
+			// ... %reserved; is empty in the current DTD.
+
+			String[] names = {ATTR_NAME_SUMMARY, ATTR_NAME_WIDTH, ATTR_NAME_BORDER, ATTR_NAME_FRAME, ATTR_NAME_RULES, ATTR_NAME_CELLSPACING, ATTR_NAME_CELLPADDING, ATTR_NAME_BGCOLOR, ATTR_NAME_DATAPAGESIZE, ATTR_NAME_HEIGHT, ATTR_NAME_BACKGROUND, ATTR_NAME_BORDERCOLOR // D205514
+			};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// align (local)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] alignValues = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT};
+			atype.setEnumValues(alignValues);
+			HTMLAttrDeclImpl adec = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_ALIGN, adec);
+			
+		}
+	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java
index 9a38d53..51d693d 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -28,6 +28,8 @@
 	public final static String CTYPE_COLUMN_GROUP = "CTYPE_COLUMN_GROUP";//$NON-NLS-1$
 	/** for DL. */
 	public final static String CTYPE_DEFINITION_LIST = "CTYPE_DEFINITION_LIST";//$NON-NLS-1$
+	/** for DETAILS */
+	public final static String CTYPE_DETAILS_CONTAINER = "CTYPE_DETAILS_CONTAINER";//$NON-NLS-1$
 	/** for EMBED. */
 	public final static String CTYPE_EMBED = "CTYPE_EMBED";//$NON-NLS-1$
 	/** empty content. No ComplexTypeDefinition instance should be created. */
@@ -64,7 +66,17 @@
 	public final static String CTYPE_TCELL_CONTAINER = "CTYPE_TCELL_CONTAINER";//$NON-NLS-1$
 	/** table record container. (TR)+ */
 	public final static String CTYPE_TR_CONTAINER = "CTYPE_TR_CONTAINER";//$NON-NLS-1$
-
+	/** heading group container. (H1|h2|H3|H4|H5|H6)+ */
+	public final static String CTYPE_HEADING_CONTAINER = "CTYPE_HGROUP_CONTAINER"; //$NON-NLS-1$
+	/** media content. (AUDIO|VIDEO) */
+	public final static String CTYPE_MEDIA_ELEMENT = "CTYPE_MEDIA";//$NON-NLS-1$
+	/** for DATALIST. */
+	public final static String CTYPE_DATALIST = "CTYPE_DATALIST";//$NON-NLS-1$
+	/** for FIGURE. */
+	public final static String CTYPE_FIGURE = "CTYPE_FIGURE";//$NON-NLS-1$
+	/** for RUBY. */
+	public final static String CTYPE_RUBY = "CTYPE_RUBY";//$NON-NLS-1$
+	
 	/**
 	 * ComplexTypeDefinitionFactory constructor comment.
 	 */
@@ -81,8 +93,17 @@
 	 * @param elementCollection ElementCollection
 	 */
 	public ComplexTypeDefinition createTypeDefinition(String definitionName, ElementCollection elementCollection) {
+		ComplexTypeDefinition[] defs = null;
 		if (definitions.containsKey(definitionName)) {
-			return (ComplexTypeDefinition) definitions.get(definitionName);
+			defs =  (ComplexTypeDefinition[]) definitions.get(definitionName);
+			for (int i = 0; i < defs.length; i++) {
+				if (defs[i].collection == elementCollection)
+					return defs[i];
+			}
+		}
+		else {
+			// initialize a new definition
+			defs = new ComplexTypeDefinition[0];
 		}
 
 		ComplexTypeDefinition def = null;
@@ -94,10 +115,17 @@
 			def = new CtdColumnGroup(elementCollection);
 
 		}
+		else if (definitionName == CTYPE_DATALIST) {
+			def = new CtdDatalist(elementCollection);
+
+		}
 		else if (definitionName == CTYPE_DEFINITION_LIST) {
 			def = new CtdDl(elementCollection);
 
 		}
+		else if (definitionName == CTYPE_DETAILS_CONTAINER) {
+			def = new CtdDetails(elementCollection);
+		}
 		else if (definitionName == CTYPE_EMBED) {
 			def = new CtdEmbed(elementCollection);
 
@@ -106,6 +134,10 @@
 			def = new CtdFieldset(elementCollection);
 
 		}
+		else if (definitionName == CTYPE_FIGURE) {
+			def = new CtdFigure(elementCollection);
+
+		}
 		else if (definitionName == CTYPE_FLOW_CONTAINER) {
 			def = new CtdFlowContainer(elementCollection);
 
@@ -118,6 +150,9 @@
 			def = new CtdHead(elementCollection);
 
 		}
+		else if (definitionName == CTYPE_HEADING_CONTAINER) {
+			def = new CtdHeadingContainer(elementCollection);
+		}
 		else if (definitionName == CTYPE_HTML) {
 			def = new CtdHtml(elementCollection);
 
@@ -134,6 +169,10 @@
 			def = new CtdMap(elementCollection);
 
 		}
+		else if (definitionName == CTYPE_MEDIA_ELEMENT) {
+			def = new CtdMediaElement(elementCollection);
+			
+		}
 		else if (definitionName == CTYPE_NOFRAMES_CONTENT) {
 			def = new CtdNoframesContent(elementCollection);
 
@@ -146,6 +185,10 @@
 			def = new CtdParamContainer(elementCollection);
 
 		}
+		else if (definitionName == CTYPE_RUBY) {
+			def = new CtdRuby(elementCollection);
+
+		}
 		else if (definitionName == CTYPE_SELECT) {
 			def = new CtdSelect(elementCollection);
 
@@ -167,7 +210,11 @@
 		}
 		if (def == null)
 			return null; // fail to create.
-		definitions.put(definitionName, def);
+		ComplexTypeDefinition[] temp = defs;
+		defs = new ComplexTypeDefinition[defs.length + 1];
+		System.arraycopy(temp, 0, defs, 0, temp.length);
+		defs[temp.length] = def;
+		definitions.put(definitionName, defs);
 		return def;
 	}
 
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDatalist.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDatalist.java
new file mode 100644
index 0000000..457debf
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDatalist.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for DATALIST.
+ */
+final class CtdDatalist extends ComplexTypeDefinition {
+
+	/**
+	 * @param elementCollection ElementCollection
+	 */
+	public CtdDatalist(ElementCollection elementCollection) {
+		super(elementCollection);
+		primaryCandidateName = HTML40Namespace.ElementName.OPTION;
+	}
+
+	/**
+	 * (OPTION)+.
+	 */
+	protected void createContent() {
+		if (content != null)
+			return; // already created.
+		if (collection == null)
+			return;
+
+	
+		content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+		// OPTION
+		CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.OPTION);
+		if (dec != null)
+			content.appendChild(dec);
+	}
+
+	/**
+	 * (OPTION)+.
+	 * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+	 * those are defined in CMElementDeclaration.
+	 */
+	public int getContentType() {
+		return CMElementDeclaration.ELEMENT;
+	}
+
+	/**
+	 * @return java.lang.String
+	 */
+	public String getTypeName() {
+		return ComplexTypeDefinitionFactory.CTYPE_DATALIST;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDetails.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDetails.java
new file mode 100644
index 0000000..914d5db
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDetails.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public class CtdDetails extends ComplexTypeDefinition {
+
+	public CtdDetails(ElementCollection elementCollection) {
+		super(elementCollection);
+		primaryCandidateName = HTML50Namespace.ElementName.SUMMARY;
+	}
+
+	protected void createContent() {
+		if (content != null)
+			return; // already created.
+		if (collection == null)
+			return;
+
+		content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+		// summary
+		CMNode dec = collection.getNamedItem(HTML50Namespace.ElementName.SUMMARY);
+		if (dec != null)
+			content.appendChild(dec);
+
+		CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+		content.appendChild(group);
+		collection.getFlow(group);
+	}
+
+	public int getContentType() {
+		return CMElementDeclaration.ELEMENT;
+	}
+
+	public String getTypeName() {
+		return ComplexTypeDefinitionFactory.CTYPE_DETAILS_CONTAINER;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFigure.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFigure.java
new file mode 100644
index 0000000..165054f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFigure.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for FIGURE.
+ */
+final class CtdFigure extends ComplexTypeDefinition {
+
+	/**
+	 * @param elementCollection ElementCollection
+	 */
+	public CtdFigure(ElementCollection elementCollection) {
+		super(elementCollection);
+		primaryCandidateName = HTML50Namespace.ElementName.FIGCAPTION;
+	}
+
+	/**
+	 * (FIGCAPTION)+.
+	 */
+	protected void createContent() {
+		if (content != null)
+			return; // already created.
+		if (collection == null)
+			return;
+
+		// ( | )+
+		content = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+		
+		CMGroupImpl group1 = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+		if (group1 != null){
+			content.appendChild(group1);
+		}
+		// FIGCAPTION, FLOW
+		CMNode dec = collection.getNamedItem(HTML50Namespace.ElementName.FIGCAPTION);
+		if (dec != null)
+			group1.appendChild(dec);
+		CMGroupImpl flowgroup = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+		group1.appendChild(flowgroup);
+		collection.getFlow(flowgroup);
+		
+		CMGroupImpl group2 = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+		if (group2 != null){
+			content.appendChild(group2);
+		}
+		// FLOW , FIGCAPTION
+		CMGroupImpl flowgroup2 = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+		group2.appendChild(flowgroup2);
+		collection.getFlow(flowgroup2);
+		CMNode dec1 = collection.getNamedItem(HTML50Namespace.ElementName.FIGCAPTION);
+		if (dec1 != null)
+			group2.appendChild(dec1);
+		//FLOW
+		CMGroupImpl group3 = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+		if (group3 != null){
+			content.appendChild(group3);
+			
+		}
+		collection.getFlow(group3);
+
+	}
+
+	/**
+	 * (FIGCAPTION)+.
+	 * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+	 * those are defined in CMElementDeclaration.
+	 */
+	public int getContentType() {
+		return CMElementDeclaration.ELEMENT;
+	}
+
+	/**
+	 * @return java.lang.String
+	 */
+	public String getTypeName() {
+		return ComplexTypeDefinitionFactory.CTYPE_FIGURE;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHeadingContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHeadingContainer.java
new file mode 100644
index 0000000..e7fdba7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHeadingContainer.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+
+public class CtdHeadingContainer extends ComplexTypeDefinition {
+
+	/**
+	 * @param elementCollection ElementCollection
+	 */
+	public CtdHeadingContainer(ElementCollection elementCollection) {
+		super(elementCollection);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.ComplexTypeDefinition#createContent()
+	 */
+	protected void createContent() {
+		if (content != null)
+			return; // already created.
+		if (collection == null)
+			return;
+		// ( )*
+		content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+		// H1|H2|H3|H4|H5|H6
+		 collection.getHeading(content);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.ComplexTypeDefinition#getContentType()
+	 */
+	public int getContentType() {
+		return CMElementDeclaration.ELEMENT;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.ComplexTypeDefinition#getTypeName()
+	 */
+	public String getTypeName() {
+		return ComplexTypeDefinitionFactory.CTYPE_HEADING_CONTAINER;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java
index d2396fc..ca7295b 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,6 +15,7 @@
 import java.util.Arrays;
 
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
@@ -319,6 +320,53 @@
 	    edec = collection.getNamedItem(HTML40Namespace.ElementName.STRONG);
 		if (edec != null)
 			content.appendChild(edec);
+		edec = collection.getNamedItem(HTML50Namespace.ElementName.ARTICLE);
+		if (edec != null)
+			content.appendChild(edec);
+
+	    edec = collection.getNamedItem(HTML50Namespace.ElementName.ASIDE);
+		if (edec != null)
+			content.appendChild(edec);
+		edec = collection.getNamedItem(HTML50Namespace.ElementName.NAV);
+		if (edec != null)
+			content.appendChild(edec);
+
+	    edec = collection.getNamedItem(HTML50Namespace.ElementName.SECTION);
+		if (edec != null)
+			content.appendChild(edec);
+		edec = collection.getNamedItem(HTML50Namespace.ElementName.AUDIO);
+		if (edec != null)
+			content.appendChild(edec);
+
+	    edec = collection.getNamedItem(HTML50Namespace.ElementName.VIDEO);
+		if (edec != null)
+			content.appendChild(edec);
+		edec = collection.getNamedItem(HTML50Namespace.ElementName.CANVAS);
+		if (edec != null)
+			content.appendChild(edec);
+
+	    edec = collection.getNamedItem(HTML50Namespace.ElementName.COMMAND);
+		if (edec != null)
+			content.appendChild(edec);
+		
+	    edec = collection.getNamedItem(HTML50Namespace.ElementName.HEADER);
+		if (edec != null)
+			content.appendChild(edec);
+		
+	    edec = collection.getNamedItem(HTML50Namespace.ElementName.FOOTER);
+		if (edec != null)
+			content.appendChild(edec);
+		
+	    edec = collection.getNamedItem(HTML50Namespace.ElementName.MARK);
+		if (edec != null)
+			content.appendChild(edec);
+		
+		edec = collection.getNamedItem(HTML50Namespace.ElementName.FIGURE);
+		if (edec != null)
+			content.appendChild(edec);
+		edec = collection.getNamedItem(HTML50Namespace.ElementName.RUBY);
+		if (edec != null)
+			content.appendChild(edec);
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMediaElement.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMediaElement.java
new file mode 100644
index 0000000..95cb598
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMediaElement.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+
+public class CtdMediaElement extends ComplexTypeDefinition {
+
+	/**
+	 * @param elementCollection ElementCollection
+	 */
+	public CtdMediaElement(ElementCollection elementCollection) {
+		super(elementCollection);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.ComplexTypeDefinition#createContent()
+	 */
+	protected void createContent() {
+		if (content != null)
+			return; // already created.
+		if (collection == null)
+			return;
+		// ( )*
+		content = new CMGroupImpl(CMGroup.SEQUENCE,0, 1);
+		//source
+		CMNode source = collection.getNamedItem(HTML50Namespace.ElementName.SOURCE);
+		if (source != null)
+			content.appendChild(source);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.ComplexTypeDefinition#getContentType()
+	 */
+	public int getContentType() {
+		return CMElementDeclaration.ELEMENT;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.ComplexTypeDefinition#getTypeName()
+	 */
+	public String getTypeName() {
+		return ComplexTypeDefinitionFactory.CTYPE_MEDIA_ELEMENT;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java
index 4732191..4eb45b4 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -49,6 +49,7 @@
 		if (flows == null)
 			return;
 		collection.getInline(flows);
+		collection.getBlock(flows);
 		content.appendChild(flows);
 	}
 
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdRuby.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdRuby.java
new file mode 100644
index 0000000..9ec37d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdRuby.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for RUBY.
+ */
+final class CtdRuby extends ComplexTypeDefinition {
+
+	/**
+	 * @param elementCollection ElementCollection
+	 */
+	public CtdRuby(ElementCollection elementCollection) {
+		super(elementCollection);
+		primaryCandidateName = HTML50Namespace.ElementName.RT;
+	}
+
+	/**
+	 * (RT)+.
+	 */
+	protected void createContent() {
+		if (content != null)
+			return; // already created.
+		if (collection == null)
+			return;
+
+	
+		content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+		
+		CMGroupImpl phraseGroup = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+		if (phraseGroup == null)
+			return;
+		content.appendChild(phraseGroup);
+		collection.getPhrase(phraseGroup);
+		
+		CMGroupImpl rtrpgroup = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+		if (rtrpgroup == null)
+			return;
+		content.appendChild(rtrpgroup);
+		
+		//RT
+		CMNode dec = collection.getNamedItem(HTML50Namespace.ElementName.RT);
+		if (dec != null)
+			rtrpgroup.appendChild(dec);
+		
+		CMGroupImpl rpgroup = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+		if (rpgroup == null)
+			return;
+		rtrpgroup.appendChild(rpgroup);
+		
+		// RP
+		dec = collection.getNamedItem(HTML50Namespace.ElementName.RP);
+		if (dec != null)
+			rpgroup.appendChild(dec);
+		// RT
+		dec = collection.getNamedItem(HTML50Namespace.ElementName.RT);
+		if (dec != null)
+			rpgroup.appendChild(dec);
+		dec = collection.getNamedItem(HTML50Namespace.ElementName.RP);
+		if (dec != null)
+			rpgroup.appendChild(dec);
+	}
+
+	/**
+	 * (RT)+.
+	 * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+	 * those are defined in CMElementDeclaration.
+	 */
+	public int getContentType() {
+		return CMElementDeclaration.ELEMENT;
+	}
+
+	/**
+	 * @return java.lang.String
+	 */
+	public String getTypeName() {
+		return ComplexTypeDefinitionFactory.CTYPE_RUBY;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java
index 8349964..92ddfdf 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -22,11 +22,11 @@
 /**
  * Factory for element declarations.
  */
-final class ElementCollection extends DeclCollection implements org.eclipse.wst.html.core.internal.provisional.HTML40Namespace.ElementName {
+class ElementCollection extends DeclCollection implements org.eclipse.wst.html.core.internal.provisional.HTML40Namespace.ElementName {
 
 
 	// Element IDs
-	private static class Ids {
+	protected static class Ids {
 		public static final int ID_A = 0;
 		public static final int ID_ABBR = 1;
 		public static final int ID_ACRONYM = 2;
@@ -183,123 +183,18 @@
 	private static final String[] LIST = {UL, OL, DIR, MENU};
 	/** %preformatted;. PRE */
 	private static final String[] PREFORMATTED = {PRE};
-	private AttributeCollection attributeCollection = null;
+	protected AttributeCollection attributeCollection = null;
 	private static String[] fNames = null;
 
-	static {
-		fNames = new String[Ids.getNumOfIds()];
-		fNames[Ids.ID_A] = A;
-		fNames[Ids.ID_ABBR] = ABBR;
-		fNames[Ids.ID_ACRONYM] = ACRONYM;
-		fNames[Ids.ID_ADDRESS] = ADDRESS;
-		fNames[Ids.ID_APPLET] = APPLET;
-		fNames[Ids.ID_AREA] = AREA;
-		fNames[Ids.ID_B] = B;
-		fNames[Ids.ID_BASE] = BASE;
-		fNames[Ids.ID_BASEFONT] = BASEFONT;
-		fNames[Ids.ID_BDO] = BDO;
-		fNames[Ids.ID_BIG] = BIG;
-		fNames[Ids.ID_BLINK] = BLINK;
-		fNames[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE;
-		fNames[Ids.ID_BODY] = BODY;
-		fNames[Ids.ID_BR] = BR;
-		fNames[Ids.ID_BUTTON] = BUTTON;
-		fNames[Ids.ID_CAPTION] = CAPTION;
-		fNames[Ids.ID_CENTER] = CENTER;
-		fNames[Ids.ID_CITE] = CITE;
-		fNames[Ids.ID_CODE] = CODE;
-		fNames[Ids.ID_COL] = COL;
-		fNames[Ids.ID_COLGROUP] = COLGROUP;
-		fNames[Ids.ID_DD] = DD;
-		fNames[Ids.ID_DEL] = DEL;
-		fNames[Ids.ID_DFN] = DFN;
-		fNames[Ids.ID_DIR] = DIR;
-		fNames[Ids.ID_DIV] = DIV;
-		fNames[Ids.ID_DL] = DL;
-		fNames[Ids.ID_DT] = DT;
-		fNames[Ids.ID_EM] = EM;
-		fNames[Ids.ID_EMBED] = EMBED;
-		fNames[Ids.ID_FIELDSET] = FIELDSET;
-		fNames[Ids.ID_FONT] = FONT;
-		fNames[Ids.ID_FORM] = FORM;
-		fNames[Ids.ID_FRAME] = FRAME;
-		fNames[Ids.ID_FRAMESET] = FRAMESET;
-		fNames[Ids.ID_H1] = H1;
-		fNames[Ids.ID_H2] = H2;
-		fNames[Ids.ID_H3] = H3;
-		fNames[Ids.ID_H4] = H4;
-		fNames[Ids.ID_H5] = H5;
-		fNames[Ids.ID_H6] = H6;
-		fNames[Ids.ID_HEAD] = HEAD;
-		fNames[Ids.ID_HR] = HR;
-		fNames[Ids.ID_HTML] = HTML;
-		fNames[Ids.ID_I] = I;
-		fNames[Ids.ID_IFRAME] = IFRAME;
-		fNames[Ids.ID_IMG] = IMG;
-		fNames[Ids.ID_INPUT] = INPUT;
-		fNames[Ids.ID_INS] = INS;
-		fNames[Ids.ID_ISINDEX] = ISINDEX;
-		fNames[Ids.ID_KBD] = KBD;
-		fNames[Ids.ID_LABEL] = LABEL;
-		fNames[Ids.ID_LEGEND] = LEGEND;
-		fNames[Ids.ID_LI] = LI;
-		fNames[Ids.ID_LINK] = LINK;
-		fNames[Ids.ID_MAP] = MAP;
-		fNames[Ids.ID_MENU] = MENU;
-		fNames[Ids.ID_META] = META;
-		fNames[Ids.ID_NOEMBED] = NOEMBED;
-		fNames[Ids.ID_NOFRAMES] = NOFRAMES;
-		fNames[Ids.ID_NOSCRIPT] = NOSCRIPT;
-		fNames[Ids.ID_OBJECT] = OBJECT;
-		fNames[Ids.ID_OL] = OL;
-		fNames[Ids.ID_OPTGROUP] = OPTGROUP;
-		fNames[Ids.ID_OPTION] = OPTION;
-		fNames[Ids.ID_P] = P;
-		fNames[Ids.ID_PARAM] = PARAM;
-		fNames[Ids.ID_PRE] = PRE;
-		fNames[Ids.ID_Q] = Q;
-		fNames[Ids.ID_S] = S;
-		fNames[Ids.ID_SAMP] = SAMP;
-		fNames[Ids.ID_SCRIPT] = SCRIPT;
-		fNames[Ids.ID_SELECT] = SELECT;
-		fNames[Ids.ID_SMALL] = SMALL;
-		fNames[Ids.ID_SPAN] = SPAN;
-		fNames[Ids.ID_STRIKE] = STRIKE;
-		fNames[Ids.ID_STRONG] = STRONG;
-		fNames[Ids.ID_STYLE] = STYLE;
-		fNames[Ids.ID_SUB] = SUB;
-		fNames[Ids.ID_SUP] = SUP;
-		fNames[Ids.ID_TABLE] = TABLE;
-		fNames[Ids.ID_TBODY] = TBODY;
-		fNames[Ids.ID_TD] = TD;
-		fNames[Ids.ID_TEXTAREA] = TEXTAREA;
-		fNames[Ids.ID_TFOOT] = TFOOT;
-		fNames[Ids.ID_TH] = TH;
-		fNames[Ids.ID_THEAD] = THEAD;
-		fNames[Ids.ID_TITLE] = TITLE;
-		fNames[Ids.ID_TR] = TR;
-		fNames[Ids.ID_TT] = TT;
-		fNames[Ids.ID_U] = U;
-		fNames[Ids.ID_UL] = UL;
-		fNames[Ids.ID_VAR] = VAR;
-		fNames[Ids.ID_MARQUEE] = MARQUEE;
-		fNames[Ids.ID_SSI_CONFIG] = SSI_CONFIG;
-		fNames[Ids.ID_SSI_ECHO] = SSI_ECHO;
-		fNames[Ids.ID_SSI_EXEC] = SSI_EXEC;
-		fNames[Ids.ID_SSI_FSIZE] = SSI_FSIZE;
-		fNames[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD;
-		fNames[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE;
-		fNames[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV;
-		fNames[Ids.ID_SSI_SET] = SSI_SET;
-		fNames[Ids.ID_BGSOUND] = BGSOUND;
-		fNames[Ids.ID_NOBR] = NOBR;
-		fNames[Ids.ID_WBR] = WBR;
-	}
-
 	/**
 	 */
 	public ElementCollection(AttributeCollection collection) {
-		super(fNames, TOLERANT_CASE);
+		super(getNames(), TOLERANT_CASE);
+		attributeCollection = collection;
+	}
+
+	public ElementCollection(String[] names, AttributeCollection collection) {
+		super(names, TOLERANT_CASE);
 		attributeCollection = collection;
 	}
 
@@ -747,7 +642,7 @@
 		return attributeCollection;
 	}
 
-	public final Collection getNamesOfBlock() {
+	public Collection getNamesOfBlock() {
 		// P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR,
 		// TABLE, FIELDSET, ADDRESS
 		String[] blockMisc = {P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR, TABLE, FIELDSET, ADDRESS};
@@ -781,7 +676,7 @@
 	 * into a <code>CMGroupImpl</code> instance.
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getFlow(CMGroupImpl group) {
+	public void getFlow(CMGroupImpl group) {
 		if (group == null)
 			return;
 		getBlock(group);
@@ -793,7 +688,7 @@
 	 * instance.<br>
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getFontstyle(CMGroupImpl group) {
+	public void getFontstyle(CMGroupImpl group) {
 		if (group == null)
 			return;
 		getDeclarations(group, Arrays.asList(FONTSTYLE).iterator());
@@ -804,7 +699,7 @@
 	 * instance.<br>
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getFormctrl(CMGroupImpl group) {
+	public void getFormctrl(CMGroupImpl group) {
 		if (group == null)
 			return;
 		getDeclarations(group, Arrays.asList(FORMCTL).iterator());
@@ -814,7 +709,7 @@
 	 * %heading;.
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getHeading(CMGroupImpl group) {
+	public void getHeading(CMGroupImpl group) {
 		if (group == null)
 			return;
 
@@ -826,7 +721,7 @@
 	 * into a <code>CMGroupImpl</code> instance.
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getInline(CMGroupImpl group) {
+	public void getInline(CMGroupImpl group) {
 		if (group == null)
 			return;
 		getFontstyle(group);
@@ -839,7 +734,7 @@
 	 * %list;.
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getList(CMGroupImpl group) {
+	public void getList(CMGroupImpl group) {
 		if (group == null)
 			return;
 
@@ -851,7 +746,7 @@
 	 * instance.<br>
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getPhrase(CMGroupImpl group) {
+	public void getPhrase(CMGroupImpl group) {
 		if (group == null)
 			return;
 		getDeclarations(group, Arrays.asList(PHRASE).iterator());
@@ -861,7 +756,7 @@
 	 * %preformatted;
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getPreformatted(CMGroupImpl group) {
+	public void getPreformatted(CMGroupImpl group) {
 		if (group == null)
 			return;
 
@@ -873,9 +768,122 @@
 	 * instance.<br>
 	 * @param group CMGroupImpl Return values.
 	 */
-	public final void getSpecial(CMGroupImpl group) {
+	public void getSpecial(CMGroupImpl group) {
 		if (group == null)
 			return;
 		getDeclarations(group, Arrays.asList(SPECIAL).iterator());
 	}
+
+	private static String[] getNames() {
+		if (fNames == null) {
+			fNames = new String[Ids.getNumOfIds()];
+			fNames[Ids.ID_A] = A;
+			fNames[Ids.ID_ABBR] = ABBR;
+			fNames[Ids.ID_ACRONYM] = ACRONYM;
+			fNames[Ids.ID_ADDRESS] = ADDRESS;
+			fNames[Ids.ID_APPLET] = APPLET;
+			fNames[Ids.ID_AREA] = AREA;
+			fNames[Ids.ID_B] = B;
+			fNames[Ids.ID_BASE] = BASE;
+			fNames[Ids.ID_BASEFONT] = BASEFONT;
+			fNames[Ids.ID_BDO] = BDO;
+			fNames[Ids.ID_BIG] = BIG;
+			fNames[Ids.ID_BLINK] = BLINK;
+			fNames[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE;
+			fNames[Ids.ID_BODY] = BODY;
+			fNames[Ids.ID_BR] = BR;
+			fNames[Ids.ID_BUTTON] = BUTTON;
+			fNames[Ids.ID_CAPTION] = CAPTION;
+			fNames[Ids.ID_CENTER] = CENTER;
+			fNames[Ids.ID_CITE] = CITE;
+			fNames[Ids.ID_CODE] = CODE;
+			fNames[Ids.ID_COL] = COL;
+			fNames[Ids.ID_COLGROUP] = COLGROUP;
+			fNames[Ids.ID_DD] = DD;
+			fNames[Ids.ID_DEL] = DEL;
+			fNames[Ids.ID_DFN] = DFN;
+			fNames[Ids.ID_DIR] = DIR;
+			fNames[Ids.ID_DIV] = DIV;
+			fNames[Ids.ID_DL] = DL;
+			fNames[Ids.ID_DT] = DT;
+			fNames[Ids.ID_EM] = EM;
+			fNames[Ids.ID_EMBED] = EMBED;
+			fNames[Ids.ID_FIELDSET] = FIELDSET;
+			fNames[Ids.ID_FONT] = FONT;
+			fNames[Ids.ID_FORM] = FORM;
+			fNames[Ids.ID_FRAME] = FRAME;
+			fNames[Ids.ID_FRAMESET] = FRAMESET;
+			fNames[Ids.ID_H1] = H1;
+			fNames[Ids.ID_H2] = H2;
+			fNames[Ids.ID_H3] = H3;
+			fNames[Ids.ID_H4] = H4;
+			fNames[Ids.ID_H5] = H5;
+			fNames[Ids.ID_H6] = H6;
+			fNames[Ids.ID_HEAD] = HEAD;
+			fNames[Ids.ID_HR] = HR;
+			fNames[Ids.ID_HTML] = HTML;
+			fNames[Ids.ID_I] = I;
+			fNames[Ids.ID_IFRAME] = IFRAME;
+			fNames[Ids.ID_IMG] = IMG;
+			fNames[Ids.ID_INPUT] = INPUT;
+			fNames[Ids.ID_INS] = INS;
+			fNames[Ids.ID_ISINDEX] = ISINDEX;
+			fNames[Ids.ID_KBD] = KBD;
+			fNames[Ids.ID_LABEL] = LABEL;
+			fNames[Ids.ID_LEGEND] = LEGEND;
+			fNames[Ids.ID_LI] = LI;
+			fNames[Ids.ID_LINK] = LINK;
+			fNames[Ids.ID_MAP] = MAP;
+			fNames[Ids.ID_MENU] = MENU;
+			fNames[Ids.ID_META] = META;
+			fNames[Ids.ID_NOEMBED] = NOEMBED;
+			fNames[Ids.ID_NOFRAMES] = NOFRAMES;
+			fNames[Ids.ID_NOSCRIPT] = NOSCRIPT;
+			fNames[Ids.ID_OBJECT] = OBJECT;
+			fNames[Ids.ID_OL] = OL;
+			fNames[Ids.ID_OPTGROUP] = OPTGROUP;
+			fNames[Ids.ID_OPTION] = OPTION;
+			fNames[Ids.ID_P] = P;
+			fNames[Ids.ID_PARAM] = PARAM;
+			fNames[Ids.ID_PRE] = PRE;
+			fNames[Ids.ID_Q] = Q;
+			fNames[Ids.ID_S] = S;
+			fNames[Ids.ID_SAMP] = SAMP;
+			fNames[Ids.ID_SCRIPT] = SCRIPT;
+			fNames[Ids.ID_SELECT] = SELECT;
+			fNames[Ids.ID_SMALL] = SMALL;
+			fNames[Ids.ID_SPAN] = SPAN;
+			fNames[Ids.ID_STRIKE] = STRIKE;
+			fNames[Ids.ID_STRONG] = STRONG;
+			fNames[Ids.ID_STYLE] = STYLE;
+			fNames[Ids.ID_SUB] = SUB;
+			fNames[Ids.ID_SUP] = SUP;
+			fNames[Ids.ID_TABLE] = TABLE;
+			fNames[Ids.ID_TBODY] = TBODY;
+			fNames[Ids.ID_TD] = TD;
+			fNames[Ids.ID_TEXTAREA] = TEXTAREA;
+			fNames[Ids.ID_TFOOT] = TFOOT;
+			fNames[Ids.ID_TH] = TH;
+			fNames[Ids.ID_THEAD] = THEAD;
+			fNames[Ids.ID_TITLE] = TITLE;
+			fNames[Ids.ID_TR] = TR;
+			fNames[Ids.ID_TT] = TT;
+			fNames[Ids.ID_U] = U;
+			fNames[Ids.ID_UL] = UL;
+			fNames[Ids.ID_VAR] = VAR;
+			fNames[Ids.ID_MARQUEE] = MARQUEE;
+			fNames[Ids.ID_SSI_CONFIG] = SSI_CONFIG;
+			fNames[Ids.ID_SSI_ECHO] = SSI_ECHO;
+			fNames[Ids.ID_SSI_EXEC] = SSI_EXEC;
+			fNames[Ids.ID_SSI_FSIZE] = SSI_FSIZE;
+			fNames[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD;
+			fNames[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE;
+			fNames[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV;
+			fNames[Ids.ID_SSI_SET] = SSI_SET;
+			fNames[Ids.ID_BGSOUND] = BGSOUND;
+			fNames[Ids.ID_NOBR] = NOBR;
+			fNames[Ids.ID_WBR] = WBR;
+		}
+		return fNames;
+	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/H5CMDocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/H5CMDocImpl.java
new file mode 100644
index 0000000..e16c9dd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/H5CMDocImpl.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * CMDocument implementation for the HTML.
+ */
+class H5CMDocImpl extends CMNodeImpl implements HTMLCMDocument {
+
+	/** Namespace for all names of elements, entities and attributes. */
+	private CMNamespaceImpl namespace = null;
+	private HTML5ElementCollection elements = null;
+	private EntityCollection entities = null;
+	private AttributeCollection attributes = null;
+
+	/**
+	 */
+	public H5CMDocImpl(String docTypeName, CMNamespaceImpl targetNamespace) {
+		super(docTypeName);
+		namespace = targetNamespace;
+		
+		attributes = new HTML5AttributeCollection();
+		elements = new HTML5ElementCollection(attributes);
+		entities = new EntityCollection();
+	}
+
+	AttributeCollection getAttributes() {
+		return attributes;
+	}
+
+	public HTMLElementDeclaration getElementDeclaration(String elementName) {
+		if (elements == null)
+			return null;
+		return (HTMLElementDeclaration) elements.getNamedItem(elementName);
+	}
+
+	/**
+	 * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+	 */
+	public CMNamedNodeMap getElements() {
+		return elements;
+	}
+
+	/**
+	 * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+	 */
+	public CMNamedNodeMap getEntities() {
+		return entities;
+	}
+
+	public HTMLEntityDeclaration getEntityDeclaration(String entityName) {
+		if (entities == null)
+			return null;
+		return (HTMLEntityDeclaration) entities.getNamedItem(entityName);
+	}
+
+	/**
+	 * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+	 */
+	public CMNamespace getNamespace() {
+		return namespace;
+	}
+
+	/**
+	 * @see CMNode
+	 */
+	public int getNodeType() {
+		return CMNode.DOCUMENT;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTML5AttributeCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTML5AttributeCollection.java
new file mode 100644
index 0000000..d086aa6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTML5AttributeCollection.java
@@ -0,0 +1,1326 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+public class HTML5AttributeCollection extends AttributeCollection implements HTML50Namespace {
+	/** html5 core attribs */
+	private static final String[] CORE = {ATTR_NAME_ACCESSKEY, ATTR_NAME_CLASS, ATTR_NAME_CONTENT_EDITABLE, ATTR_NAME_CONTEXT_MENU, ATTR_NAME_DIR, ATTR_NAME_DRAGGABLE, ATTR_NAME_HIDDEN, ATTR_NAME_ID, ATTR_NAME_LANG, ATTR_NAME_SPELLCHECK,ATTR_NAME_STYLE, ATTR_NAME_TABINDEX, ATTR_NAME_TITLE};
+	/** events for HTML5. */
+	private static final String[] EVENTS = {ATTR_NAME_ONABORT, ATTR_NAME_ONBLUR, ATTR_NAME_ONCAN_PLAY, ATTR_NAME_ONCAN_PLAY_THROUGH, ATTR_NAME_ONCHANGE, ATTR_NAME_ONCLICK, ATTR_NAME_ONCONTEXT_MENU, ATTR_NAME_ONDBLCLICK, ATTR_NAME_ONDRAG, ATTR_NAME_ONDRAG_END, ATTR_NAME_ONDRAG_ENTER, ATTR_NAME_ONDRAG_LEAVE, 
+		ATTR_NAME_ONDRAG_OVER, ATTR_NAME_ONDRAG_START, ATTR_NAME_ONDROP, ATTR_NAME_ONDURATION_CHANGE, ATTR_NAME_ONEMPTIED, ATTR_NAME_ONENDED, ATTR_NAME_ONERROR, ATTR_NAME_ONFOCUS, ATTR_NAME_ONFORM_CHANGE, ATTR_NAME_ONFORM_INPUT, ATTR_NAME_ONINVALID,ATTR_NAME_ONKEYPRESS, ATTR_NAME_ONKEYDOWN, ATTR_NAME_ONKEYUP, 
+		ATTR_NAME_ONLOAD, ATTR_NAME_ONLOAD_START, ATTR_NAME_ONLOADED_DATA, ATTR_NAME_ONLOADED_METADATA, ATTR_NAME_ONMOUSEDOWN, ATTR_NAME_ONMOUSEUP, ATTR_NAME_ONMOUSEOVER, ATTR_NAME_ONMOUSEMOVE, ATTR_NAME_ONMOUSEOUT, ATTR_NAME_ONMOUSE_WHEEL, ATTR_NAME_ONPAUSE, ATTR_NAME_ONPLAY, ATTR_NAME_ONPLAYING, ATTR_NAME_ONPROGRESS,
+		ATTR_NAME_ONRATE_CHANGE, ATTR_NAME_ONREADY_STATE_CHANGE, ATTR_NAME_ONSCROLL, ATTR_NAME_ONSEEKED, ATTR_NAME_ONSEEKING, ATTR_NAME_ONSELECT, ATTR_NAME_ONSHOW, ATTR_NAME_ONSTALLED, ATTR_NAME_ONSUBMIT, ATTR_NAME_ONSUSPEND, ATTR_NAME_ONTIME_UPDATE, ATTR_NAME_ONVOLUME_UPDATE, ATTR_NAME_ONWAITING};
+
+	protected HTMLAttrDeclImpl create(String attrName) {
+		HTMLAttrDeclImpl attr = null;
+		HTMLCMDataTypeImpl atype = null;
+		if (attrName.equalsIgnoreCase(ATTR_NAME_AUTOFOCUS)) {
+			// (disabled (disabled) #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			// boolean attribute must have the same value as its name.
+			String[] values = {ATTR_NAME_AUTOFOCUS};
+			atype.setEnumValues(values);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOFOCUS, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_CONTENT_EDITABLE)) {
+			// (contenteditable (EMPTY|TRUE|FALSE|INHERIT) TRUE)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_EMPTY, ATTR_VALUE_TRUE, ATTR_VALUE_FALSE, ATTR_VALUE_INHERIT};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_TRUE);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_CONTENT_EDITABLE, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_CHALLENGE)) {
+			// (challenge CDATA; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_CHALLENGE, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_CONTEXT_MENU)) {
+			// (contextmenu, CDATA, IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_CONTEXT_MENU, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_DRAGGABLE)) {
+			// (draggable (TRUE|FALSE|AUTO) TRUE)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE, ATTR_VALUE_AUTO};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_FALSE);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_DRAGGABLE, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_FORM)) {
+			// (form CDATA; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORM, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_KEYTYPE)) {
+			// (keytype CDATA; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_KEYTYPE, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_LOW)) {
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_LOW, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_HIGH)) {
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_HIGH, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_OPTIMUM)) {
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_OPTIMUM, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_MIN)) {
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MIN, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_MAX)) {
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MAX, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_OPEN)) {
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			atype.setEnumValues(new String[] { ATTR_NAME_OPEN });
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_OPEN, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_PUBDATE)) {
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			atype.setEnumValues(new String[] { ATTR_NAME_PUBDATE });
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_PUBDATE, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_SPELLCHECK)) {
+			// (spellcheck (EMPTY|TRUE|FALSE) TRUE)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_EMPTY, ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_FALSE);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SPELLCHECK, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONABORT)) {
+			// (onabort %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONABORT, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCAN_PLAY)) {
+			// (oncanplay %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCAN_PLAY, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCAN_PLAY_THROUGH)) {
+			// (oncanplaythrough %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCAN_PLAY_THROUGH, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCHANGE)) {
+			// (onchange %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCHANGE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCONTEXT_MENU)) {
+			// (onacontextmenu %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCONTEXT_MENU, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDRAG)) {
+			// (onadrag %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDRAG, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDRAG_END)) {
+			// (ondragend %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDRAG_END, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDRAG_ENTER)) {
+			// (ondragenter %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDRAG_ENTER, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDRAG_LEAVE)) {
+			// (ondragleave %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDRAG_LEAVE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDRAG_OVER)) {
+			// (ondragover %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDRAG_OVER, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDRAG_START)) {
+			// (ondragstart %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDRAG_START, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDROP)) {
+			// (ondrop %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDROP, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDURATION_CHANGE)) {
+			// (ondurationchange %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDURATION_CHANGE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONEMPTIED)) {
+			// (onemptied %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONEMPTIED, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONENDED)) {
+			// (onended %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONENDED, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONERROR)) {
+			// (onerror %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONERROR, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONFOCUS)) {
+			// (onfocus %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONFOCUS, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONFORM_CHANGE)) {
+			// (onformchange %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONFORM_CHANGE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONFORM_INPUT)) {
+			// (onforminput %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONFORM_INPUT, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONINPUT)) {
+			// (oninput %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONINPUT, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONINVALID)) {
+			// (oninvalid %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONINVALID, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONLOAD)) {
+			// (onload %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONLOAD, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONLOAD_START)) {
+			// (onloadstart %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONLOAD_START, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONLOADED_DATA)) {
+			// (onloadeddata %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONLOADED_DATA, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONLOADED_METADATA)) {
+			// (onloadedmetadata %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONLOADED_METADATA, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSE_WHEEL)) {
+			// (onmousewheel %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSE_WHEEL, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONPLAY)) {
+			// (onplay %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONPLAY, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONPLAYING)) {
+			// (onplaying %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONPLAYING, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONPAUSE)) {
+			// (onpause %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONPAUSE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONPROGRESS)) {
+			// (onprogress %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONPROGRESS, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONRATE_CHANGE)) {
+			// (onratechange %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONRATE_CHANGE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONREADY_STATE_CHANGE)) {
+			// (onreadystatechange %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONREADY_STATE_CHANGE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSCROLL)) {
+			// (onscroll %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSCROLL, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSEEKED)) {
+			// (onseeked %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSEEKED, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSEEKING)) {
+			// (onseeking %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSEEKING, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSELECT)) {
+			// (onselect %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSELECT, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSHOW)) {
+			// (onshow %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSHOW, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSTALLED)) {
+			// (onstalled %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSTALLED, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSUBMIT)) {
+			// (onsubmit %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSUBMIT, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSUSPEND)) {
+			// (onsuspend %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSUSPEND, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONTIME_UPDATE)) {
+			// (ontimeupdate %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONTIME_UPDATE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONVOLUME_UPDATE)) {
+			// (onvolumeupdate %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONVOLUME_UPDATE, atype, CMAttributeDeclaration.OPTIONAL);
+
+		}
+		else if (attrName.equalsIgnoreCase(ATTR_NAME_ONWAITING)) {
+			// (onwaiting %Script; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ONWAITING, atype, CMAttributeDeclaration.OPTIONAL);
+		}
+		else {
+			attr = super.create(attrName);
+		}
+		return attr;
+	}
+
+	public void getAttrs(CMNamedNodeMapImpl declarations) {
+		// %coreattrs;
+		getCore(declarations);
+		// %events;
+		getEvents(declarations);
+	}
+
+	public void getCore(CMNamedNodeMapImpl declarations) {
+		Iterator names = Arrays.asList(CORE).iterator();
+		getDeclarations(declarations, names);
+	}
+
+	public void getEvents(CMNamedNodeMapImpl declarations) {
+		Iterator names = Arrays.asList(EVENTS).iterator();
+		getDeclarations(declarations, names);
+	}
+	
+	public void createAttributeDeclarations(String elementName, CMNamedNodeMapImpl attributes) {
+		/* (type %InputType; TEXT) ... should be defined locally.
+		 * (name CDATA #IMPLIED)
+		 * (value CDATA #IMPLIED)
+		 * (checked (checked) #IMPLIED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (readonly (readonly) #IMPLIED)
+		 * (size CDATA #IMPLIED) ... should be defined locally.
+		 * (maxlength NUMBER #IMPLIED)
+		 * (src %URI; #IMPLIED)
+		 * (alt CDATA #IMPLIED) ... should be defined locally.
+		 * (accept %ContentTypes; #IMPLIED)
+		 * (width CDATA; #IMPLIED)
+		 * (height CDATA; #IMPLIED)
+		 * (autocomplete Boolean; #IMPLIED)
+		 * (autofocus Boolean; #IMPLIED)
+		 * (form CDATA; #IMPLIED)
+		 * (formaction)
+		 * (formenctype)
+		 * (formmethod)
+		 * (formnovalidate)
+		 * (formtarget)
+		 * (list)
+		 * (max)
+		 * (min)
+		 * (multiple)
+		 * (pattern)
+		 * (placeholder CDATA #IMPLIED)
+		 * (required)
+		 * (step)
+		 * discouraged tags :- 
+		 * (usemap %URI; #IMPLIED)
+		 * (ismap (ismap) #IMPLIED)
+		 */
+		if (elementName.equals(HTML40Namespace.ElementName.INPUT)){
+			HTMLCMDataTypeImpl atype = null;
+			HTMLAttrDeclImpl attr = null;
+			// (type %InputType; TEXT) ... should be defined locally.
+			// NOTE: %InputType is ENUM;
+			// (text | password | checkbox | radio | submit | reset |
+			//  file | hidden | image | button
+			//  color| date | time | datetime | datetime-local | month | week| email| 
+			//  number | range | search | tel)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_TEXT, ATTR_VALUE_PASSWORD, ATTR_VALUE_CHECKBOX, ATTR_VALUE_RADIO, ATTR_VALUE_SUBMIT, ATTR_VALUE_RESET, ATTR_VALUE_FILE, ATTR_VALUE_HIDDEN, ATTR_VALUE_IMAGE, ATTR_VALUE_BUTTON,
+					 ATTR_VALUE_COLOR, ATTR_VALUE_DATE, ATTR_VALUE_DATETIME, ATTR_VALUE_DATETIME_LOCAL, ATTR_VALUE_EMAIL, ATTR_VALUE_MONTH, ATTR_VALUE_NUMBER_STRING, ATTR_VALUE_RANGE, ATTR_VALUE_SEARCH, ATTR_VALUE_TEL, ATTR_VALUE_TIME};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_TEXT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+
+			// (size CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SIZE, attr);
+
+			// (alt CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ALT, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_ALT, attr);
+			
+			
+			// (type %autocomeplete; ) ... should be defined locally.
+			// NOTE: %autocomeplete is ENUM;
+			// (on | off)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] autoCompleteValues = {ATTR_VALUE_ON, ATTR_VALUE_OFF};
+			atype.setEnumValues(autoCompleteValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOCOMPLETE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_AUTOCOMPLETE, attr);
+
+			
+			// (form CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORM, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORM, attr);
+			
+			
+			// (formaction URI #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMACTION, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMACTION, attr);
+
+			
+			// (type %formmethod; GET) ... should be defined locally.
+			// NOTE: %formmethod is ENUM;
+			// (GET|POST|PUT|DELETE)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] formMethodValues = {ATTR_VALUE_GET, ATTR_VALUE_POST, ATTR_VALUE_PUT, ATTR_VALUE_DELETE};
+			atype.setEnumValues(formMethodValues);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_GET);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMMETHOD, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMMETHOD, attr);
+
+			// (type %formenctype; GET) ... should be defined locally.
+			// NOTE: %formenctype is ENUM;
+			// (application/x-www-form-urlencoded| multipart/form-data| text/plain)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] formEncTypeValues = {ATTR_VALUE_WWW_FORM_URLENCODED, ATTR_VALUE_FORM_DATA, ATTR_VALUE_PLAIN};
+			atype.setEnumValues(formEncTypeValues);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_WWW_FORM_URLENCODED);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMENCTYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMENCTYPE, attr);
+
+			// (formtarget BROWSEING CONTEXT #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.BROWSING_CONTEXT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMTARGET, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMTARGET, attr);
+			
+			// (formtnovalidate  #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			// boolean attribute must have the same value as its name.
+			String[] formNoValidateValues = {ATTR_NAME_FORMNOVALIDATE};
+			atype.setEnumValues(formNoValidateValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMNOVALIDATE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMNOVALIDATE, attr);
+
+		
+			// (list ID #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.ID);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_LIST, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_LIST, attr);
+
+			// (min CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MIN, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_MIN, attr);
+
+			// (max CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MAX, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_MAX, attr);
+
+			// (maxlength NUMBER #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MAXLENGTH, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_MAXLENGTH, attr);
+
+			// (multiple  #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			// boolean attribute must have the same value as its name.
+			String[] multipleValues = {ATTR_NAME_MULTIPLE};
+			atype.setEnumValues(multipleValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MULTIPLE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_MULTIPLE, attr);
+
+		
+			// (step CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_STEP, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_STEP, attr);
+
+			// (placeholder CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_PLACEHOLDER, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_PLACEHOLDER, attr);
+
+			// (pattern CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_PATTERN, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_PATTERN, attr);
+
+			// (required  #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			// boolean attribute must have the same value as its name.
+			String[] requiredValues = {ATTR_NAME_REQUIRED};
+			atype.setEnumValues(requiredValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_REQUIRED, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_REQUIRED, attr);
+
+			String[] names = {ATTR_NAME_NAME, ATTR_NAME_VALUE, ATTR_NAME_CHECKED, ATTR_NAME_DISABLED, ATTR_NAME_READONLY, ATTR_NAME_SIZE, ATTR_NAME_MAXLENGTH, ATTR_NAME_SRC, ATTR_NAME_ALT, ATTR_NAME_ACCEPT, //<<D215684
+						ATTR_NAME_WIDTH, ATTR_NAME_HEIGHT,			//<D215684
+				//html5
+						ATTR_NAME_AUTOFOCUS
+			};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			//discouraged
+			// (ismap (ismap) #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] ismapValues = {ATTR_NAME_ISMAP};
+			atype.setEnumValues(ismapValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ISMAP, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_ISMAP, attr);
+			
+			// (usemap %URI; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_USEMAP, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_USEMAP, attr);
+
+			
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		}
+		/* (href %URI; #IMPLIED)
+		 * (hreflang %LanguageCode; #IMPLIED)
+		 * (type %ContentType; #IMPLIED): should be defined locally.
+		 * (rel %LinkTypes; #IMPLIED)
+		 * (media %MediaDesc; #IMPLIED)
+		 * // discouraged
+		 * (charset %Charset; #IMPLIED)
+		 * (rev %LinkTypes; #IMPLIED)
+		 * (target %FrameTarget; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.LINK)){
+			String[] names = { ATTR_NAME_TYPE, ATTR_NAME_HREF, ATTR_NAME_HREFLANG, ATTR_NAME_REL,  ATTR_NAME_MEDIA};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// (sizes %Pixels; #IMPLIED)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZES, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SIZES, attr);
+			
+			//discouraged
+			// (charset %Charset; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARSET);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_CHARSET, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_CHARSET, attr);
+			
+			// (rev %LinkTypes; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LINK_TYPES);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_REV, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_REV, attr);
+			
+			// (target %FrameTarget; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.FRAME_TARGET);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_TARGET, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_TARGET, attr);
+			
+		}
+		/* (type %ContentType; #IMPLIED)
+		 * (href %URI; #IMPLIED)
+		 * (hreflang %LanguageCode; #IMPLIED)
+		 * (target %FrameTarget; #IMPLIED)
+		 * (rel %LinkTypes; #IMPLIED)
+		 * (media %media_desc; #IMPLIED
+		 * //discouraged
+		 * (charset %Charset; #IMPLIED)
+		 * (name CDATA #IMPLIED)
+		 * (rev %LinkTypes; #IMPLIED)
+		 * (directkey %Character; #IMPLIED)
+		 * (shape %Shape; rect)
+		 * (coords %Coords; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.A)){
+			String[] names = { ATTR_NAME_MEDIA, ATTR_NAME_TYPE, ATTR_NAME_HREF, ATTR_NAME_HREFLANG, ATTR_NAME_REL, ATTR_NAME_TARGET};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			
+			
+			//discouraged
+			// (charset %Charset; #IMPLIED)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARSET);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_CHARSET, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_CHARSET, attr);
+			
+			// (rev %LinkTypes; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LINK_TYPES);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_REV, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_REV, attr);
+			
+			// (directkey %Character; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARACTER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_DIRECTKEY, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_DIRECTKEY, attr);
+			
+			// (shape %Shape; rect): %Shape; is (rect|circle|poly|default).
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_RECT, ATTR_VALUE_CIRCLE, ATTR_VALUE_POLY, ATTR_VALUE_DEFAULT};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_RECT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SHAPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_SHAPE, attr);
+			
+			// (coords %Coords; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COORDS);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_COORDS, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_COORDS, attr);
+			
+			// (name CDATA #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_NAME, attr);
+	
+		}
+		/*
+		 * (shape %Shape; rect)
+		 * (coords %Coords; #IMPLIED)
+		 * (href %URI; #IMPLIED)
+		 * (target %FrameTarget; #IMPLIED)
+		 * (alt %Text; #REQUIRED)
+		 * (media %media_desc; #IMPLIED)
+		 * (rel %LinkTypes; #IMPLIED)
+		 * (type %ContentType; #IMPLIED)
+		 * //disocuraged
+		 * (nohref (nohref) #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.AREA)){
+			// (media %MediaDesc; #IMPLIED)
+			String[] names = {ATTR_NAME_TYPE, ATTR_NAME_MEDIA, ATTR_NAME_SHAPE, ATTR_NAME_COORDS, ATTR_NAME_HREF, ATTR_NAME_HREFLANG, ATTR_NAME_TARGET, ATTR_NAME_ALT, ATTR_NAME_REL};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			
+			// (nohref (nohref) #IMPLIED)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_NAME_NOHREF};
+			atype.setEnumValues(values);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_NOHREF, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_NOHREF, attr);
+		
+		}
+		/*
+		 *  %globalattrs;
+		 * (http-equiv NAME #IMPLIED)
+		 * (name NAME #IMPLIED) ... should be defined locally.
+		 * (content CDATA #REQUIRED)
+		 * (charset %Charset; #IMPLIED)
+		 *  //discouraged
+		 * (scheme CDATA #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.META)){
+			// globalattrs;
+			getAttrs(attributes);
+
+			// (name NAME #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_NAME, attr);
+
+			// (content CDATA #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_CONTENT, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_CONTENT, attr);
+			
+			String[] names = {ATTR_NAME_HTTP_EQUIV, ATTR_NAME_CHARSET};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			
+			// discouraged
+			// (scheme CDATA #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SCHEME, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_SCHEME, attr);
+			
+		}
+		/*
+		 * (src %URI; #REQUIRED): should be defined locally.
+		 * (alt %Text; #REQUIRED)
+		 * (usemap %URI; #IMPLIED)
+		 * (ismap (ismap) #IMPLIED)
+		 *  // discouraged
+		 * (longdesc %URI; #IMPLIED)
+		 * (name CDATA #IMPLIED)
+		 * (height %Length; #IMPLIED)
+		 * (width %Length; #IMPLIED)
+		 * (align %IAlign; #IMPLIED): should be defined locally.
+		 * (border %Pixels; #IMPLIED)
+		 * (hspace %Pixels; #IMPLIED)
+		 * (vspace %Pixels; #IMPLIED)
+		 * (mapfile %URI; #IMPLIED)
+	 
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.IMG)){
+			// (src %URI; #REQUIRED): should be defined locally.
+			HTMLCMDataTypeImpl atype = null;
+			HTMLAttrDeclImpl attr = null;
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_SRC, attr);
+
+			String[] names = {ATTR_NAME_ALT, ATTR_NAME_LONGDESC, ATTR_NAME_NAME, ATTR_NAME_HEIGHT, ATTR_NAME_WIDTH, ATTR_NAME_USEMAP, ATTR_NAME_ISMAP, ATTR_NAME_BORDER, ATTR_NAME_HSPACE, ATTR_NAME_VSPACE, ATTR_NAME_MAPFILE};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// align (local); should be defined locally.
+			attr = AttributeCollection.createAlignForImage();
+			attributes.putNamedItem(ATTR_NAME_ALIGN, attr);
+		
+		}
+		/*
+		 * (name CDATA #REQUIRED) ... should be defined locally.
+		 * (value CDATA #IMPLIED)
+		 * global attributes
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.PARAM)){
+			
+			// (name CDATA #REQUIRED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_NAME, attr);
+			
+			// (value CDATA #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_VALUE, attr);
+			
+			// gloabl attrs
+			getAttrs(attributes);
+		}
+		/*
+		 * (autofocus Boolean; #IMPLIED)
+		 * (form CDATA; #IMPLIED)
+		 * (placeholder CDATA #IMPLIED)
+		 * (name CDATA #IMPLIED)
+		 * (rows NUMBER #REQUIRED)
+		 * (cols NUMBER #REQUIRED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (readonly (readonly) #IMPLIED)
+		 * (maxlength NUMBER; #IMPLIED)
+		 * (wrap ENUM; #IMPLIED)
+		 *  //discouraged
+		 * (istyle CDATA #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.TEXTAREA)){
+			String[] names = {ATTR_NAME_MAXLENGTH, ATTR_NAME_FORM, ATTR_NAME_AUTOFOCUS, ATTR_NAME_NAME, ATTR_NAME_ROWS, ATTR_NAME_COLS, ATTR_NAME_DISABLED, ATTR_NAME_READONLY};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			
+			// (placeholder CDATA #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_PLACEHOLDER, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_PLACEHOLDER, attr);
+			
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_SOFT, ATTR_VALUE_HARD};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_SOFT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_WRAP, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_WRAP, attr);
+			
+			// discouraged
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ISTYLE, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_ISTYLE, attr);
+		}
+		/*
+		 * (charset %Charset; #IMPLIED)
+		 * (type %ContentType; #REQUIRED) ... should be defined locally.
+		 * (asynch boolean #IMPLIED)
+		 * (src %URI; #IMPLIED)
+		 * (defer (defer) #IMPLIED)
+		 *  // discouraged
+		 * (language CDATA #IMPLIED)
+		 * (event CDATA #IMPLIED)
+		 * (for %URI; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.SCRIPT)){
+			String[] names = {ATTR_NAME_CHARSET,  ATTR_NAME_SRC, ATTR_NAME_DEFER};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// (type %ContentType; #REQUIRED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/javascript"); //$NON-NLS-1$
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+			
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_NAME_ASYNC};
+			atype.setEnumValues(values);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_ASYNC, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_ASYNC, attr);
+			
+			
+			// discouraged
+			// (language %CDATA; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_LANGUAGE, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_LANGUAGE, attr);
+			
+			// (event CDATA #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_EVENT, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_EVENT, attr);
+			
+			// (for %URI; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FOR, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_FOR, attr);
+		
+		}
+		/*
+		 *  %attrs;
+		 * (type %ContentType; #REQUIRED) ... should be defined locally.
+		 * (media %MediaDesc; #IMPLIED)
+		 * (scoped boolean; #implied)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.STYLE)){
+			// %i18n;
+			getAttrs(attributes);
+
+			String[] names = {ATTR_NAME_MEDIA};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			// (type %ContentType; #REQUIRED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/css"); //$NON-NLS-1$
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+			
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_NAME_SCOPED};
+			atype.setEnumValues(values);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SCOPED, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SCOPED, attr);
+		}
+		/*
+		 * %reserved;
+		 * (name CDATA #IMPLIED)
+		 * (size NUMBER #IMPLIED) ... should be defined locally.
+		 * (multiple (multiple) #IMPLIED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (autofocus Boolean; #IMPLIED)
+		 * (form CDATA; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.SELECT)){
+			// (size NUMBER #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SIZE, attr);
+
+			String[] names = {ATTR_NAME_FORM, ATTR_NAME_AUTOFOCUS,ATTR_NAME_NAME, ATTR_NAME_MULTIPLE, ATTR_NAME_DISABLED, ATTR_NAME_TABINDEX, ATTR_NAME_ONFOCUS, ATTR_NAME_ONBLUR, ATTR_NAME_ONCHANGE};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+		
+		}
+		/*
+		 * (value NUMBER #IMPLIED) ... should be defined locally.
+		 *  //discouraged
+		 *  (type %LIStyle; #IMPLIED) ... should be defined locally.
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.LI)){
+			// (type %LIStyle; #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LI_STYLE);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+
+			// (value NUMBER #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_VALUE, attr);
+		
+		}
+		/*
+		 * (start NUMBER #IMPLIED)
+		 * (reversed BOOLEAN; IMPLIED)
+		 *   //discouraged
+		 * (type %OLStyle; #IMPLIED) ... should be defined locally.
+		 * (compact (compact) #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.OL)){
+
+			String[] names = { ATTR_NAME_START};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_NAME_REVERSED};
+			atype.setEnumValues(values);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_REVERSED, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_REVERSED, attr);
+			
+			//discouraged 
+			// (type %OLStyle; #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.OL_STYLE);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+			
+			// (compact (compact) #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] compactValues = {ATTR_NAME_COMPACT};
+			atype.setEnumValues(compactValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_COMPACT, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_COMPACT, attr);
+		}
+		/**
+		 * %attrs;
+		 * (src %URI; #IMPLIED)
+		 * (srcdoc %CONTENT_TYPE; #IMPLIED)
+		 * (seamless BOOLEAN; #IMPLIED)
+		 * (sandbox CDATA; #IMPLED)
+		 * (height %Length; #IMPLIED)
+		 * (width %Length; #IMPLIED)
+		 * (name CDATA #IMPLIED)
+		 * //discouraged
+		 * (longdesc %URI; #IMPLIED)
+		 * (frameborder (1|0) 1)
+		 * (marginwidth %Pixels; #IMPLIED)
+		 * (marginheight %Pixels; #IMPLIED)
+		 * (scrolling (yes|no|auto) auto)
+		 * (align %IAlign; #IMPLIED) ... should be defined locally.
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.IFRAME)){
+			// %attrs;
+			getAttrs(attributes);
+			
+			//srcdoc
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_SRCDOC, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SRCDOC, attr);
+
+			// (seamless (seamless) #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] compactValues = {ATTR_NAME_SEAMLESS};
+			atype.setEnumValues(compactValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SEAMLESS, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SEAMLESS, attr);
+		
+			//sandbox
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SANDBOX, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_SANDBOX, attr);
+			
+			
+			String[] names = { ATTR_NAME_NAME, ATTR_NAME_SRC, ATTR_NAME_HEIGHT, ATTR_NAME_WIDTH};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			//discouraged
+			// (marginwidth %Pixels; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MARGINWIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_MARGINWIDTH, attr);
+			
+			// (marginheight %Pixels; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_MARGINHEIGHT, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_MARGINHEIGHT, attr);
+			
+			// (scrolling (yes|no|auto) auto)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_YES, ATTR_VALUE_NO, ATTR_VALUE_AUTO};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_AUTO);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_SCROLLING, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_SCROLLING, attr);
+
+			// (frameborder (1|0) 1)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] frameValues = {ATTR_VALUE_1, ATTR_VALUE_0};
+			atype.setEnumValues(frameValues);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAMEBORDER, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_FRAMEBORDER, attr);
+			
+			// (longdesc %URI; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_LONGDESC, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_LONGDESC, attr);
+			
+			
+			// align
+			attr = AttributeCollection.createAlignForImage();
+			if (attr != null)
+				attr.obsolete(true);
+				attributes.putNamedItem(ATTR_NAME_ALIGN, attr);
+		}
+		/*
+		 * (%attrs)
+		 * (manisfest %URI; #IMPLIED)
+		 * (xmlns %URI; #IMPLIED)
+		 * //discouraged
+		 * (version CDATA #FIXED '%HTML.Version;)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.HTML)){
+			// %attrs;
+			getAttrs(attributes);
+			// (manisfest %URI; #IMPLIED)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_MANIFEST, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_MANIFEST, attr);
+			
+			// (version CDATA #FIXED '%HTML.Version;)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_FIXED, ATTR_VALUE_VERSION_TRANSITIONAL);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_VERSION, atype, CMAttributeDeclaration.FIXED);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_VERSION, attr);
+			
+			// (xmlns CDATA #FIXED '%xmlns;)
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_XMLNS, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_XMLNS, attr);
+		}
+		/*
+		 * (type enum; (context | toolbar | list))
+		 * (label %Text; #IMPLIED)
+		 *  //discouraged
+		 * (compact (compact) #IMPLIED)
+	 	 */
+		else if (elementName.equals(HTML40Namespace.ElementName.MENU)){
+			// (type %menuType; list) ... should be defined locally is ENUM.
+			//  (context | toolbar | list)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_CONTEXT, ATTR_VALUE_TOOLBAR, ATTR_VALUE_LIST};
+			atype.setEnumValues(values);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_LIST);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+
+			// (label %Text; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_LABEL, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_LABEL, attr);
+
+			// (compact (compact) #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] compactValues = {ATTR_NAME_COMPACT};
+			atype.setEnumValues(compactValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_COMPACT, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_COMPACT, attr);
+		}
+		/*
+		 * (type %button; TEXT) ... should be defined locally.
+		 * (name CDATA #IMPLIED)
+		 * (value CDATA #IMPLIED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (autofocus Boolean; #IMPLIED)
+		 * (form CDATA; #IMPLIED)
+		 * (formaction)
+		 * (formenctype)
+		 * (formmethod)
+		 * (formnovalidate)
+		 * (formtarget)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.BUTTON)){
+			// (type (button|submit|reset) submit) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_BUTTON, ATTR_VALUE_SUBMIT, ATTR_VALUE_RESET};
+			atype.setEnumValues(values);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_TYPE, attr);
+			
+
+			String[] names = {ATTR_NAME_NAME, ATTR_NAME_VALUE, ATTR_NAME_DISABLED,
+				//html5
+						ATTR_NAME_AUTOFOCUS
+			};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+			
+			// (form CDATA #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORM, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORM, attr);
+			
+			
+			// (formaction URI #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMACTION, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMACTION, attr);
+
+			
+			// (type %formmethod; GET) ... should be defined locally.
+			// NOTE: %formmethod is ENUM;
+			// (GET|POST|PUT|DELETE)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] formMethodValues = {ATTR_VALUE_GET, ATTR_VALUE_POST, ATTR_VALUE_PUT, ATTR_VALUE_DELETE};
+			atype.setEnumValues(formMethodValues);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_GET);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMMETHOD, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMMETHOD, attr);
+
+			// (type %formenctype; GET) ... should be defined locally.
+			// NOTE: %formenctype is ENUM;
+			// (application/x-www-form-urlencoded| multipart/form-data| text/plain)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] formEncTypeValues = {ATTR_VALUE_WWW_FORM_URLENCODED, ATTR_VALUE_FORM_DATA, ATTR_VALUE_PLAIN};
+			atype.setEnumValues(formEncTypeValues);
+			atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_WWW_FORM_URLENCODED);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMENCTYPE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMENCTYPE, attr);
+
+			// (formtarget BROWSEING CONTEXT #IMPLIED) ... should be defined locally.
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.BROWSING_CONTEXT);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMTARGET, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMTARGET, attr);
+			
+			// (formtnovalidate  #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			// boolean attribute must have the same value as its name.
+			String[] formNoValidateValues = {ATTR_NAME_FORMNOVALIDATE};
+			atype.setEnumValues(formNoValidateValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FORMNOVALIDATE, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORMNOVALIDATE, attr);
+
+		}
+		/*
+		 * (name CDATA #IMPLIED)
+		 * (disabled (disabled) #IMPLIED)
+		 * (form CDATA; #IMPLIED)
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.FIELDSET)){
+			// (form CDATA #IMPLIED) ... should be defined locally.
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_FORM, atype, CMAttributeDeclaration.OPTIONAL);
+			attributes.putNamedItem(ATTR_NAME_FORM, attr);
+			
+			String[] names = {ATTR_NAME_NAME, ATTR_NAME_DISABLED };
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+				
+		}
+		/*
+		 * (summary %Text; #IMPLIED)
+		 *  //discouraged
+		 * %reserved;
+		 * (width %Length; #IMPLIED)
+		 * (border %Pixels; #IMPLIED)
+		 * (frame %TFrame; #IMPLIED)
+		 * (rules %TRules; #IMPLIED)
+		 * (cellspacing %Length; #IMPLIED)
+		 * (cellpadding %Length; #IMPLIED)
+		 * (align %TAlign; #IMPLIED)
+		 * (bgcolor %Color; #IMPLIED)
+		 * (datapagesize CDATA #IMPLIED)
+		 * (height %Pixels; #IMPLIED)
+		 * (background %URI; #IMPLIED)
+		 * (bordercolor %Color #IMPLIED) ... D205514
+		 */
+		else if (elementName.equals(HTML40Namespace.ElementName.TABLE)){
+			// %reserved;
+			// ... %reserved; is empty in the current DTD.
+
+			String[] names = {ATTR_NAME_SUMMARY};
+			getDeclarations(attributes, Arrays.asList(names).iterator());
+
+			// align (local)
+			HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] alignValues = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT};
+			atype.setEnumValues(alignValues);
+			HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_ALIGN, attr);
+			
+			// (width %Length; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_WIDTH, attr);
+			
+			// (border %Pixels; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDER, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_BORDER, attr);
+			
+			// (frame %TFrame; #IMPLIED)
+			// %TFrame; is
+			// (void|above|below|hsides|lhs|rhs|vsides|box|border).
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] values = {ATTR_VALUE_VOID, ATTR_VALUE_ABOVE, ATTR_VALUE_BELOW, ATTR_VALUE_HSIDES, ATTR_VALUE_LHS, ATTR_VALUE_RHS, ATTR_VALUE_VSIDES, ATTR_VALUE_BOX, ATTR_VALUE_BORDER};
+			atype.setEnumValues(values);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAME, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_FRAME, attr);
+			
+			// (rules %TRules; #IMPLIED)
+			// %TRules; is (none | groups | rows | cols | all).
+			atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+			String[] ruleValues = {ATTR_VALUE_NONE, ATTR_VALUE_GROUPS, ATTR_VALUE_ROWS, ATTR_VALUE_COLS, ATTR_VALUE_ALL};
+			atype.setEnumValues(ruleValues);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_RULES, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_RULES, attr);
+			
+			// (cellspacing %Length; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_CELLSPACING, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_CELLSPACING, attr);
+			
+			// (cellpadding %Length; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_CELLPADDING, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_CELLPADDING, attr);
+			
+			// (bgcolor %Color; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_BGCOLOR, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_BGCOLOR, attr);
+			
+			// (datapagesize CDATA #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_DATAPAGESIZE, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_DATAPAGESIZE, attr);
+			
+			// (height %Length; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_HEIGHT, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_HEIGHT, attr);
+			
+			// (background %URI; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_BACKGROUND, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_BACKGROUND, attr);
+			
+			// (bordercolor, %Color; #IMPLIED)
+			atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+			attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDERCOLOR, atype, CMAttributeDeclaration.OPTIONAL);
+			attr.obsolete(true);
+			attributes.putNamedItem(ATTR_NAME_BORDERCOLOR, attr);
+			
+			
+		}
+	}
+	
+	public static String[] getGlobalAttributeList(){
+		return CORE;
+	}
+	
+	public static String[] getGlobalEventList(){
+		return EVENTS;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTML5ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTML5ElementCollection.java
new file mode 100644
index 0000000..9e2d4b8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTML5ElementCollection.java
@@ -0,0 +1,577 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Factory for element declarations.
+ */
+class HTML5ElementCollection extends ElementCollection implements org.eclipse.wst.html.core.internal.provisional.HTML50Namespace.ElementName {
+
+
+	// Element IDs
+	private static class Ids50 extends Ids {
+		// <<D205513
+		
+		public static final int ID_ARTICLE =106;
+		public static final int ID_ASIDE =107;
+		public static final int ID_AUDIO =108;
+		public static final int ID_CANVAS =109;
+		public static final int ID_COMMAND =110;
+		public static final int ID_DATALIST =111;
+		public static final int ID_DETAILS = 112;
+		public static final int ID_FIGURE =113;
+		public static final int ID_FIGCAPTION = 114;
+		public static final int ID_FOOTER =115;
+		public static final int ID_HEADER = 116;
+		public static final int ID_HGROUP =117;
+		public static final int ID_KEYGEN =118;
+		public static final int ID_MARK =119;
+		public static final int ID_MATH =120;
+		public static final int ID_METER =121;
+		public static final int ID_NAV =122;
+		public static final int ID_OUTPUT =123;
+		public static final int ID_PROGRESS =124;
+		public static final int ID_RP = 125;
+		public static final int ID_RT = 126;
+		public static final int ID_RUBY =127;
+		public static final int ID_SECTION =128;
+		public static final int ID_SOURCE = 129;
+		public static final int ID_SUMMARY = 130;
+		public static final int ID_SVG =131;
+		public static final int ID_TIME =132;
+		public static final int ID_VIDEO =133;
+
+		// D205513
+
+		public static int getNumOfIds() {
+			if (numofids != -1)
+				return numofids;
+
+			// NOTE: If the reflection is too slow, this method should
+			// just return the literal value, like 105.
+			// -- 5/25/2001
+			Class clazz = Ids50.class;
+			Field[] fields = clazz.getFields();
+			numofids = 0;
+			for (int i = 0; i < fields.length; i++) {
+				String name = fields[i].getName();
+				if (name.startsWith("ID_"))//$NON-NLS-1$
+					numofids++;
+			}
+			return numofids;
+		}
+
+		// chache the result of the reflection.
+		private static int numofids = -1;
+	}
+
+	/** %fontstyle;. TT | I | B | U | S | STRIKE | BIG | SMALL | BLINK */
+	private static final String[] FONTSTYLE = {TT, I, B, U, S, STRIKE, BIG, SMALL, BLINK};
+	/** %formctl;. INPUT | SELECT | TEXTAREA | LABEL | BUTTON */
+	private static final String[] FORMCTL = {INPUT, SELECT, TEXTAREA, LABEL, BUTTON, DATALIST};
+	/** %phrase;.
+	 * EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM | MARK
+	 */	private static final String[] PHRASE = {KEYGEN, EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, ACRONYM, MARK};
+	/** %special;.
+	 * A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+	 * MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | EMBED | MARQUEE |
+	 * D2W | SUBMIT
+	 * WBR | NOBR | BGSOUND
+	 */
+	private static final String[] SPECIAL = {A, IMG, APPLET, OBJECT, FONT, BASEFONT, BR, WBR, // D205513
+				SCRIPT, MAP, Q, SUB, SUP, SPAN, BDO, IFRAME, EMBED, BGSOUND, // D205513
+				MARQUEE, NOBR, // D205513
+				OUTPUT, TIME, METER, PROGRESS,
+				COMMAND
+	};
+	/** %heading;. H[1-6] */
+	private static final String[] HEADING = {H1, H2, H3, H4, H5, H6};
+	/** %list;. UL | OL | DIR | MENU */
+	private static final String[] LIST = {UL, OL, DIR, MENU};
+	/** %preformatted;. PRE */
+	private static final String[] PREFORMATTED = {PRE};
+	/** %sectioning;. ARTICLE | ASIDE | NAV | SECTION */
+	private static final String[] SECTIONING = { ARTICLE, ASIDE, NAV, SECTION };
+
+	/** %embedded;. AUDIO|CANVAS|EMBED|IFRAME|IMG|MATH|OBJECT|SVG|VIDEO */
+	private static final String[] EMBEDDED = { AUDIO, CANVAS, EMBED, IFRAME, IMG, MATH, OBJECT, SVG, VIDEO};
+
+    private static String[] fNames = null;
+
+	/**
+	 */
+	public HTML5ElementCollection(AttributeCollection collection) {
+		super(getNames(), collection);
+		attributeCollection = collection;
+	}
+
+	/**
+	 * Actually creates HTMLElementDeclaration instance.
+	 * @return HTMLElementDeclaration
+	 */
+	protected CMNode create(String elementName) {
+		CMNode edec = null;
+
+		if (elementName.equalsIgnoreCase(ACRONYM)) {
+			edec = new HedPhrase(ACRONYM, this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(APPLET)) {
+			edec = new HedAPPLET(this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(ARTICLE)) {
+			edec = new HedSectioning(ARTICLE, this);
+
+		}
+		else if (elementName.equalsIgnoreCase(ASIDE)) {
+			edec = new HedSectioning(ASIDE, this);
+
+		}
+		else if (elementName.equalsIgnoreCase(AUDIO)) {
+			edec = new HedMediaElement(AUDIO, this);
+
+		}
+		else if (elementName.equalsIgnoreCase(BASEFONT)) {
+			edec = new HedBASEFONT(this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(BIG)) {
+			edec = new HedFontStyle(BIG, this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(CANVAS)) {
+			edec = new HedCANVAS(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(CENTER)) {
+			edec = new HedCENTER(this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(COMMAND)) {
+			edec = new HedCOMMAND(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(DATALIST)) {
+			edec = new HedDATALIST(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(DETAILS)) {
+			edec = new HedDETAILS(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(DIR)) {
+			edec = new HedMENU(DIR, this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(FIGCAPTION)) {
+			edec = new HedFIGCAPTION(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(FIGURE)) {
+			edec = new HedFIGURE(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(FOOTER)) {
+			edec = new HedHEADER(HTML50Namespace.ElementName.FOOTER ,this);
+
+		}
+		else if (elementName.equalsIgnoreCase(FRAME)) {
+			edec = new HedFRAME(this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(FRAMESET)) {
+			edec = new HedFRAMESET(this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(HEADER)) {
+			edec = new HedHEADER(HTML50Namespace.ElementName.HEADER ,this);
+		}
+		else if (elementName.equalsIgnoreCase(HGROUP)) {
+			edec = new HedHGROUP(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(ISINDEX)) {
+			edec = new HedISINDEX(this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(KEYGEN)) {
+			edec = new HedKEYGEN(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(MARK)) {
+			edec = new HedPhrase(HTML50Namespace.ElementName.MARK,this);
+
+		}
+		else if (elementName.equalsIgnoreCase(MATH)) {
+			edec = new HedMath(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(METER)) {
+			edec = new HedMETER(this);
+		}
+		else if (elementName.equalsIgnoreCase(NAV)) {
+			edec = new HedSectioning(NAV, this);
+		}
+		else if (elementName.equalsIgnoreCase(NOFRAMES)) {
+			edec = new HedNOFRAMES(this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(OUTPUT)) {
+			edec = new HedOUTPUT(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(PROGRESS)) {
+			edec = new HedPROGRESS(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(RP)) {
+			edec = new HedRP(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(RT)) {
+			edec = new HedRT(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(RUBY)) {
+			edec = new HedRUBY(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(S)) {
+			edec = new HedFontStyle(S, this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(SECTION)) {
+			edec = new HedSectioning(SECTION, this);
+
+		}
+		else if (elementName.equalsIgnoreCase(SOURCE)) {
+			edec = new HedSOURCE(this);
+
+		}
+		else if (elementName.equalsIgnoreCase(STRIKE)) {
+			edec = new HedFontStyle(STRIKE, this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(SUMMARY)) {
+			edec = new HedSUMMARY(this);
+		}
+		else if (elementName.equalsIgnoreCase(SVG)) {
+			edec = new HedSVG(this);
+		}
+		else if (elementName.equalsIgnoreCase(TIME)) {
+			edec = new HedTIME(this);
+		}
+		else if (elementName.equalsIgnoreCase(TT)) {
+			edec = new HedFontStyle(TT, this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(U)) {
+			edec = new HedFontStyle(U, this);
+			((HTMLElemDeclImpl) edec).obsolete(true);
+		}
+		else if (elementName.equalsIgnoreCase(VIDEO)) {
+			edec = new HedVIDEO(this);
+
+		}
+		// unknown
+		else {
+			// NOTE: We don't define the UNKNOWN element declaration.
+			// <code>null</code> for a declaration is a sign of
+			// the target element is unknown.
+			// -- 3/9/2001
+			edec = super.create(elementName);
+		}
+		return edec;
+	}
+
+	public AttributeCollection getAttributeCollection() {
+		return attributeCollection;
+	}
+
+	public final Collection getNamesOfBlock() {
+		// P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR,
+		// TABLE, FIELDSET, ADDRESS, RUBY, FIGURE
+		String[] blockMisc = {HEADER, FOOTER, HGROUP, P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR, TABLE, FIELDSET, ADDRESS, RUBY, FIGURE};
+		Vector names = new Vector(Arrays.asList(blockMisc));
+		// %heading;
+		names.addAll(Arrays.asList(HEADING));
+		// %list;
+		names.addAll(Arrays.asList(LIST));
+		// %preformatted;
+		names.addAll(Arrays.asList(PREFORMATTED));
+
+		
+		return names;
+	}
+
+	
+	public final void getSectioning(CMGroupImpl group) {
+		if (group == null)
+			return;
+		getDeclarations(group, Arrays.asList(SECTIONING).iterator());
+	}
+	
+	public void getEmbedded(CMGroupImpl group) {
+		if (group == null)
+			return;
+		getDeclarations(group, Arrays.asList(EMBEDDED).iterator());
+	}
+
+	public void getFlow(CMGroupImpl group) {
+		if (group == null)
+			return;
+		super.getFlow(group);
+		getSectioning(group);
+		CMNode node = getNamedItem(DETAILS);
+		if (node != null) {
+			group.appendChild(node);
+		}
+	}
+
+	public void getInline(CMGroupImpl group) {
+		if (group == null)
+			return;
+		super.getInline(group);
+		getEmbedded(group);
+	}
+
+	/**
+	 * Create element declarations and store them into a <code>CMGroupImpl</code>
+	 * instance.<br>
+	 * @param group CMGroupImpl Return values.
+	 */
+	public final void getFontstyle(CMGroupImpl group) {
+		if (group == null)
+			return;
+		getDeclarations(group, Arrays.asList(FONTSTYLE).iterator());
+	}
+
+	/**
+	 * Create element declarations and store them into a <code>CMGroupImpl</code>
+	 * instance.<br>
+	 * @param group CMGroupImpl Return values.
+	 */
+	public final void getFormctrl(CMGroupImpl group) {
+		if (group == null)
+			return;
+		getDeclarations(group, Arrays.asList(FORMCTL).iterator());
+	}
+
+	/**
+	 * %heading;.
+	 * @param group CMGroupImpl Return values.
+	 */
+	public final void getHeading(CMGroupImpl group) {
+		if (group == null)
+			return;
+
+		getDeclarations(group, Arrays.asList(HEADING).iterator());
+	}
+
+	
+
+	/**
+	 * %list;.
+	 * @param group CMGroupImpl Return values.
+	 */
+	public final void getList(CMGroupImpl group) {
+		if (group == null)
+			return;
+
+		getDeclarations(group, Arrays.asList(LIST).iterator());
+	}
+
+	/**
+	 * Create element declarations and store them into a <code>CMGroupImpl</code>
+	 * instance.<br>
+	 * @param group CMGroupImpl Return values.
+	 */
+	public final void getPhrase(CMGroupImpl group) {
+		if (group == null)
+			return;
+		getDeclarations(group, Arrays.asList(PHRASE).iterator());
+	}
+
+	/**
+	 * %preformatted;
+	 * @param group CMGroupImpl Return values.
+	 */
+	public final void getPreformatted(CMGroupImpl group) {
+		if (group == null)
+			return;
+
+		getDeclarations(group, Arrays.asList(PREFORMATTED).iterator());
+	}
+
+	/**
+	 * Create element declarations and store them into a <code>CMGroupImpl</code>
+	 * instance.<br>
+	 * @param group CMGroupImpl Return values.
+	 */
+	public final void getSpecial(CMGroupImpl group) {
+		if (group == null)
+			return;
+		getDeclarations(group, Arrays.asList(SPECIAL).iterator());
+	}
+
+	private static String[] getNames() {
+		if (fNames == null) {
+			fNames = new String[Ids50.getNumOfIds()];
+			fNames[Ids.ID_A] = A;
+			fNames[Ids.ID_ABBR] = ABBR;
+			fNames[Ids.ID_ACRONYM] = ACRONYM;
+			fNames[Ids.ID_ADDRESS] = ADDRESS;
+			fNames[Ids.ID_APPLET] = APPLET;
+			fNames[Ids.ID_AREA] = AREA;
+			fNames[Ids50.ID_ARTICLE] = ARTICLE;
+			fNames[Ids50.ID_ASIDE] = ASIDE;
+			fNames[Ids50.ID_AUDIO] = AUDIO;
+			fNames[Ids.ID_B] = B;
+			fNames[Ids.ID_BASE] = BASE;
+			fNames[Ids.ID_BASEFONT] = BASEFONT;
+			fNames[Ids.ID_BDO] = BDO;
+			fNames[Ids.ID_BIG] = BIG;
+			fNames[Ids.ID_BLINK] = BLINK;
+			fNames[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE;
+			fNames[Ids.ID_BODY] = BODY;
+			fNames[Ids.ID_BR] = BR;
+			fNames[Ids.ID_BUTTON] = BUTTON;
+			fNames[Ids.ID_CAPTION] = CAPTION;
+			fNames[Ids50.ID_CANVAS] = CANVAS;
+			fNames[Ids.ID_CENTER] = CENTER;
+			fNames[Ids.ID_CITE] = CITE;
+			fNames[Ids.ID_CODE] = CODE;
+			fNames[Ids.ID_COL] = COL;
+			fNames[Ids.ID_COLGROUP] = COLGROUP;
+			fNames[Ids50.ID_COMMAND] = COMMAND;
+			fNames[Ids50.ID_DATALIST] = DATALIST;
+			fNames[Ids50.ID_DETAILS] = DETAILS;
+			fNames[Ids.ID_DD] = DD;
+			fNames[Ids.ID_DEL] = DEL;
+			fNames[Ids.ID_DFN] = DFN;
+			fNames[Ids.ID_DIR] = DIR;
+			fNames[Ids.ID_DIV] = DIV;
+			fNames[Ids.ID_DL] = DL;
+			fNames[Ids.ID_DT] = DT;
+			fNames[Ids.ID_EM] = EM;
+			fNames[Ids.ID_EMBED] = EMBED;
+			fNames[Ids.ID_FIELDSET] = FIELDSET;
+			fNames[Ids50.ID_FIGURE] = FIGURE;
+			fNames[Ids50.ID_FIGCAPTION] = FIGCAPTION;
+			fNames[Ids.ID_FONT] = FONT;
+			fNames[Ids.ID_FORM] = FORM;
+			fNames[Ids50.ID_FOOTER] = FOOTER;
+			fNames[Ids.ID_FRAME] = FRAME;
+			fNames[Ids.ID_FRAMESET] = FRAMESET;
+			fNames[Ids.ID_H1] = H1;
+			fNames[Ids.ID_H2] = H2;
+			fNames[Ids.ID_H3] = H3;
+			fNames[Ids.ID_H4] = H4;
+			fNames[Ids.ID_H5] = H5;
+			fNames[Ids.ID_H6] = H6;
+			fNames[Ids.ID_HEAD] = HEAD;
+			fNames[Ids50.ID_HEADER] = HEADER;
+			fNames[Ids50.ID_HGROUP] = HGROUP;
+			fNames[Ids.ID_HR] = HR;
+			fNames[Ids.ID_HTML] = HTML;
+			fNames[Ids.ID_I] = I;
+			fNames[Ids.ID_IFRAME] = IFRAME;
+			fNames[Ids.ID_IMG] = IMG;
+			fNames[Ids.ID_INPUT] = INPUT;
+			fNames[Ids.ID_INS] = INS;
+			fNames[Ids.ID_ISINDEX] = ISINDEX;
+			fNames[Ids.ID_KBD] = KBD;
+			fNames[Ids50.ID_KEYGEN] = KEYGEN;
+			fNames[Ids.ID_LABEL] = LABEL;
+			fNames[Ids.ID_LEGEND] = LEGEND;
+			fNames[Ids.ID_LI] = LI;
+			fNames[Ids.ID_LINK] = LINK;
+			fNames[Ids.ID_MAP] = MAP;
+			fNames[Ids50.ID_MARK] = MARK;
+			fNames[Ids.ID_MARQUEE] = MARQUEE;
+			fNames[Ids50.ID_MATH] = MATH;
+			fNames[Ids.ID_MENU] = MENU;
+			fNames[Ids.ID_META] = META;
+			fNames[Ids50.ID_METER] = METER;
+			fNames[Ids50.ID_NAV] = NAV;
+			fNames[Ids.ID_NOEMBED] = NOEMBED;
+			fNames[Ids.ID_NOFRAMES] = NOFRAMES;
+			fNames[Ids.ID_NOSCRIPT] = NOSCRIPT;
+			fNames[Ids.ID_OBJECT] = OBJECT;
+			fNames[Ids.ID_OL] = OL;
+			fNames[Ids.ID_OPTGROUP] = OPTGROUP;
+			fNames[Ids.ID_OPTION] = OPTION;
+			fNames[Ids50.ID_OUTPUT] = OUTPUT;
+			fNames[Ids.ID_P] = P;
+			fNames[Ids.ID_PARAM] = PARAM;
+			fNames[Ids.ID_PRE] = PRE;
+			fNames[Ids50.ID_PROGRESS] = PROGRESS;
+			fNames[Ids.ID_Q] = Q;
+			fNames[Ids50.ID_RP] = RP;
+			fNames[Ids50.ID_RT] = RT;
+			fNames[Ids50.ID_RUBY] = RUBY;
+			fNames[Ids.ID_S] = S;
+			fNames[Ids.ID_SAMP] = SAMP;
+			fNames[Ids.ID_SCRIPT] = SCRIPT;
+			fNames[Ids50.ID_SECTION] = SECTION;
+			fNames[Ids.ID_SELECT] = SELECT;
+			fNames[Ids.ID_SMALL] = SMALL;
+			fNames[Ids50.ID_SOURCE] = SOURCE;
+			fNames[Ids.ID_SPAN] = SPAN;
+			fNames[Ids.ID_STRIKE] = STRIKE;
+			fNames[Ids.ID_STRONG] = STRONG;
+			fNames[Ids.ID_STYLE] = STYLE;
+			fNames[Ids50.ID_SUMMARY] = SUMMARY;
+			fNames[Ids.ID_SUB] = SUB;
+			fNames[Ids.ID_SUP] = SUP;
+			fNames[Ids50.ID_SVG] = SVG;
+			fNames[Ids.ID_TABLE] = TABLE;
+			fNames[Ids.ID_TBODY] = TBODY;
+			fNames[Ids.ID_TD] = TD;
+			fNames[Ids.ID_TEXTAREA] = TEXTAREA;
+			fNames[Ids.ID_TFOOT] = TFOOT;
+			fNames[Ids.ID_TH] = TH;
+			fNames[Ids.ID_THEAD] = THEAD;
+			fNames[Ids50.ID_TIME] = TIME;
+			fNames[Ids.ID_TITLE] = TITLE;
+			fNames[Ids.ID_TR] = TR;
+			fNames[Ids.ID_TT] = TT;
+			fNames[Ids.ID_U] = U;
+			fNames[Ids.ID_UL] = UL;
+			fNames[Ids.ID_VAR] = VAR;
+			fNames[Ids50.ID_VIDEO] = VIDEO;
+			fNames[Ids.ID_WBR] = WBR;
+			fNames[Ids.ID_SSI_CONFIG] = SSI_CONFIG;
+			fNames[Ids.ID_SSI_ECHO] = SSI_ECHO;
+			fNames[Ids.ID_SSI_EXEC] = SSI_EXEC;
+			fNames[Ids.ID_SSI_FSIZE] = SSI_FSIZE;
+			fNames[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD;
+			fNames[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE;
+			fNames[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV;
+			fNames[Ids.ID_SSI_SET] = SSI_SET;
+			fNames[Ids.ID_BGSOUND] = BGSOUND;
+			fNames[Ids.ID_NOBR] = NOBR;
+			fNames[Ids.ID_WBR] = WBR;
+		}
+		return fNames;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java
index ce938e3..9c85e4a 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -27,6 +27,8 @@
 
 	private HTMLCMDataTypeImpl type = null;
 	private int usage = 0;
+	private boolean is_obsolete = false;
+
 
 	/**
 	 */
@@ -106,6 +108,9 @@
 			return true;
 		else if (propertyName.equals(HTMLCMProperties.IS_SCRIPTABLE))
 			return true;
+		else if (propertyName.equals(HTMLCMProperties.IS_OBSOLETE))
+			return is_obsolete;
+		
 		return super.supports(propertyName);
 	}
 
@@ -117,6 +122,13 @@
 		else if (propertyName.equals(HTMLCMProperties.IS_SCRIPTABLE)) {
 			return getAttrType().getDataTypeName() == HTMLCMDataType.SCRIPT ? new Boolean(true) : new Boolean(false);
 		}
+		else if (propertyName.equals(HTMLCMProperties.IS_OBSOLETE))
+			return new Boolean(is_obsolete);
+		
 		return super.getProperty(propertyName);
 	}
+	
+	public void obsolete(boolean is_obsolete){
+		this.is_obsolete = is_obsolete;
+	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java
index 675dc59..80adfe3 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,5 +20,5 @@
  * and {@link <code>HTMLCMNode</code>}.<br>
  */
 public interface HTMLAttributeDeclaration extends CMAttributeDeclaration {
-
+	String IS_HTML = "isHTML"; //$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java
index fba0b86..3c94c47 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -63,4 +63,9 @@
 	public static final String STYLE_SHEET = CMDataType.CDATA;
 	/** %Text; == CDATA */
 	public static final String TEXT = CMDataType.CDATA;
+	/** %MediaType; == CDATA */
+	public static final String MEDIA_TYPE = CMDataType.CDATA;
+	/** %BrowsingContext; == CDATA */
+	public static final String BROWSING_CONTEXT = CMDataType.CDATA;
+	
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java
index 28316ec..7b9f634 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
 
 import org.eclipse.wst.html.core.internal.contentmodel.chtml.CHCMDocImpl;
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
 
@@ -27,7 +28,7 @@
 public final class HTMLCMDocumentFactory {
 
 	private static Hashtable cmdocs = new Hashtable();
-	private static List supportedCMtypes = Arrays.asList(new Object[]{CMDocType.HTML_DOC_TYPE, CMDocType.CHTML_DOC_TYPE, CMDocType.JSP11_DOC_TYPE, CMDocType.JSP12_DOC_TYPE, CMDocType.JSP20_DOC_TYPE, CMDocType.TAG20_DOC_TYPE});
+	private static List supportedCMtypes = Arrays.asList(new Object[]{CMDocType.HTML_DOC_TYPE, CMDocType.CHTML_DOC_TYPE, CMDocType.JSP11_DOC_TYPE, CMDocType.JSP12_DOC_TYPE, CMDocType.JSP20_DOC_TYPE, CMDocType.TAG20_DOC_TYPE, CMDocType.JSP21_DOC_TYPE, CMDocType.HTML5_DOC_TYPE});
 
 	private static JCMDocImpl jsp11doc = null;
 
@@ -62,12 +63,24 @@
 			return html40doc;
 		}
 
+		else if (CMDocType.HTML5_DOC_TYPE.equals(cmtype)) {
+			CMNamespaceImpl h50ns = new CMNamespaceImpl(HTML50Namespace.HTML50_URI, HTML50Namespace.HTML50_TAG_PREFIX);
+			H5CMDocImpl html50doc = new H5CMDocImpl(CMDocType.HTML5_DOC_TYPE, h50ns);
+			return html50doc;
+		}
+		
 		else if (CMDocType.JSP20_DOC_TYPE.equals(cmtype)) {
 			CMNamespaceImpl j20ns = new CMNamespaceImpl(JSP20Namespace.JSP20_URI, JSP11Namespace.JSP_TAG_PREFIX);
 			JCM20DocImpl jsp20doc = new JCM20DocImpl(CMDocType.JSP20_DOC_TYPE, j20ns);
 			return jsp20doc;
 		}
 
+		else if (CMDocType.JSP21_DOC_TYPE.equals(cmtype)) {
+			CMNamespaceImpl j21ns = new CMNamespaceImpl(JSP21Namespace.JSP21_URI, JSP11Namespace.JSP_TAG_PREFIX);
+			JCM21DocImpl jsp21doc = new JCM21DocImpl(CMDocType.JSP21_DOC_TYPE, j21ns);
+			return jsp21doc;
+		}
+
 		else if (CMDocType.TAG20_DOC_TYPE.equals(cmtype)) {
 			CMNamespaceImpl j20ns = new CMNamespaceImpl(JSP20Namespace.JSP20_URI, JSP11Namespace.JSP_TAG_PREFIX);
 			TagCMDocImpl tag20doc = new TagCMDocImpl(CMDocType.TAG20_DOC_TYPE, j20ns);
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java
index f0b1471..3f5a9b7 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -43,6 +43,7 @@
 	protected boolean indentChild = false;
 	protected ElementCollection elementCollection = null;
 	protected AttributeCollection attributeCollection = null;
+	private boolean is_obsolete = false;
 	protected final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() {
 		public int getLength() {
 			return 0;
@@ -282,6 +283,9 @@
 			ComplexTypeDefinition def = getComplexTypeDefinition();
 			return (def != null);
 		}
+		if (propertyName.equals(HTMLCMProperties.IS_OBSOLETE)) {
+			return is_obsolete;
+		}
 		else {
 			PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
 			if (pp == null)
@@ -301,6 +305,9 @@
 			ComplexTypeDefinition def = getComplexTypeDefinition();
 			return (def != null) ? def.getPrimaryCandidate() : null;
 		}
+		else if (propertyName.equals(HTMLCMProperties.IS_OBSOLETE)){
+			return new Boolean(is_obsolete);
+		}
 		else {
 			PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
 			if (pp == null)
@@ -363,4 +370,8 @@
 		}
 		return false;
 	}
+	
+	public void obsolete(boolean is_obsolete){
+		this.is_obsolete = is_obsolete;
+	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java
index 92eb28e..270fc91 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,8 +12,6 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
@@ -35,21 +33,6 @@
 
 	/**
 	 * %attrs;
-	 * (charset %Charset; #IMPLIED)
-	 * (type %ContentType; #IMPLIED)
-	 * (name CDATA #IMPLIED)
-	 * (href %URI; #IMPLIED)
-	 * (hreflang %LanguageCode; #IMPLIED)
-	 * (target %FrameTarget; #IMPLIED)
-	 * (rel %LinkTypes; #IMPLIED)
-	 * (rev %LinkTypes; #IMPLIED)
-	 * (accesskey %Character; #IMPLIED)
-	 * (directkey %Character; #IMPLIED)
-	 * (shape %Shape; rect)
-	 * (coords %Coords; #IMPLIED)
-	 * (tabindex NUMBER #IMPLIED)
-	 * (onfocus %Script; #IMPLIED)
-	 * (onblur %Script; #IMPLIED) 
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -62,8 +45,9 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_TYPE, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_HREFLANG, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_REL, HTML40Namespace.ATTR_NAME_REV, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_DIRECTKEY, HTML40Namespace.ATTR_NAME_SHAPE, HTML40Namespace.ATTR_NAME_COORDS, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.A, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java
index 3afad06..322e65c 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,8 +12,6 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
 
 
@@ -34,16 +32,6 @@
 	/**
 	 * AREA.
 	 * %attrs;
-	 * (shape %Shape; rect)
-	 * (coords %Coords; #IMPLIED)
-	 * (href %URI; #IMPLIED)
-	 * (target %FrameTarget; #IMPLIED)
-	 * (nohref (nohref) #IMPLIED)
-	 * (alt %Text; #REQUIRED)
-	 * (tabindex NUMBER #IMPLIED)
-	 * (accesskey %Character; #IMPLIED)
-	 * (onfocus %Script; #IMPLIED)
-	 * (onblur %Script; #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -55,7 +43,8 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		String[] names = {HTML40Namespace.ATTR_NAME_SHAPE, HTML40Namespace.ATTR_NAME_COORDS, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_NOHREF, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.AREA, attributes);
+	
 	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java
index 9754980..6ace2cb 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,9 +15,7 @@
 import java.util.Arrays;
 
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
@@ -35,15 +33,6 @@
 
 	/**
 	 * %attrs;
-	 * %reserved; ... empty.
-	 * (name CDATA #IMPLIED)
-	 * (value CDATA #IMPLIED)
-	 * (type (button|submit|reset) submit) ... should be defined locally.
-	 * (disabled (disabled) #IMPLIED)
-	 * (tabindex NUMBER #IMPLIED)
-	 * (accesskey %Character; #IMPLIED)
-	 * (onfocus %Script; #IMPLIED)
-	 * (onblur %Script; #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -55,17 +44,10 @@
 
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
-
-		String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-
-		// (type (button|submit|reset) submit) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
-		String[] values = {HTML40Namespace.ATTR_VALUE_BUTTON, HTML40Namespace.ATTR_VALUE_SUBMIT, HTML40Namespace.ATTR_VALUE_RESET};
-		atype.setEnumValues(values);
-
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+		
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.BUTTON, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCANVAS.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCANVAS.java
new file mode 100644
index 0000000..453fb1c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCANVAS.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+
+
+/**
+ * CANVAS.
+ */
+final class HedCANVAS extends HTMLElemDeclImpl {
+
+	/**
+	 */
+	public HedCANVAS(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.CANVAS, collection);
+		layoutType = LAYOUT_BLOCK;
+	}
+
+	/**
+	 * %attrs;
+	 * (height, width)
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+		
+		
+		String[] names = { HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT };
+		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOMMAND.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOMMAND.java
new file mode 100644
index 0000000..3fc7c03
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOMMAND.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * COMMAND.
+ */
+final class HedCOMMAND extends HTMLElemDeclImpl {
+
+	/**
+	 */
+	public HedCOMMAND(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.COMMAND, collection);
+		layoutType = LAYOUT_OBJECT;
+	}
+
+	/**
+	 * COMMAND.
+	 * %attrs;
+	 * // (type %CommandTYPE; command | checkbox|radio) 
+	 * // (label %CDATA; #REQUIRED) 
+	 * // (icon %URI; #OPTIONAL) 
+	 * // (disabled %BOOLEAN; #OPTIONAL) 
+	 * // (checked %BOOLEAN; #OPTIONAL) 
+	 * // (radiogroup %TEXT; #OPTIONAL) 
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+		HTMLCMDataTypeImpl atype = null;
+		HTMLAttrDeclImpl attr = null;
+		// (type %CommandTYPE; command | checkbox|radio) 
+		// NOTE: %InputType is ENUM;
+		atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+		String[] values = {HTML50Namespace.ATTR_VALUE_COMMAND, HTML40Namespace.ATTR_VALUE_CHECKBOX, HTML40Namespace.ATTR_VALUE_RADIO};
+		atype.setEnumValues(values);
+		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML50Namespace.ATTR_VALUE_COMMAND);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+		
+		// (label %CDATA; #REQUIRED) 
+		atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_LABEL, atype, CMAttributeDeclaration.REQUIRED);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_LABEL, attr);
+
+		// (icon %URI; #OPTIONAL) 
+		atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+		attr = new HTMLAttrDeclImpl(HTML50Namespace.ATTR_NAME_ICON, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML50Namespace.ATTR_NAME_ICON, attr);
+
+		
+		// (disabled %BOOLEAN; #OPTIONAL) 
+		atype = new HTMLCMDataTypeImpl(HTMLCMDataType.BOOLEAN);
+		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_FALSE);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_DISABLED, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_DISABLED, attr);
+
+		// (checked %BOOLEAN; #OPTIONAL) 
+		atype = new HTMLCMDataTypeImpl(HTMLCMDataType.BOOLEAN);
+		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_FALSE);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_CHECKED, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_CHECKED, attr);
+
+		// (radiogroup %TEXT; #OPTIONAL) 
+		atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+		attr = new HTMLAttrDeclImpl(HTML50Namespace.ATTR_NAME_RADIOGROUP, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML50Namespace.ATTR_NAME_RADIOGROUP, attr);
+
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDATALIST.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDATALIST.java
new file mode 100644
index 0000000..ba671c6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDATALIST.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+/**
+ * DATALIST.
+ */
+final class HedDATALIST extends HTMLElemDeclImpl {
+
+	/**
+	 */
+	public HedDATALIST(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.DATALIST, collection);
+		typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_DATALIST;
+		layoutType = LAYOUT_OBJECT;
+		indentChild = true;
+	}
+
+	/**
+	 * %attrs;
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDETAILS.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDETAILS.java
new file mode 100644
index 0000000..a4e8f01
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDETAILS.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public class HedDETAILS extends HTMLElemDeclImpl {
+
+	public HedDETAILS(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.DETAILS, collection);
+		typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_DETAILS_CONTAINER;
+	}
+
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+		CMNode node = attributeCollection.getDeclaration(HTML50Namespace.ATTR_NAME_OPEN);
+		if (node != null)
+			attributes.putNamedItem(HTML50Namespace.ATTR_NAME_OPEN, node);
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java
index f47fbcb..3e0d7ff 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -41,6 +41,9 @@
 
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.FIELDSET, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIGCAPTION.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIGCAPTION.java
new file mode 100644
index 0000000..9b6162c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIGCAPTION.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+public class HedFIGCAPTION extends HedFlowContainer {
+	public HedFIGCAPTION(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.FIGCAPTION, collection);
+		layoutType = LAYOUT_HIDDEN;
+	}
+
+	/**
+	 * Article.
+	 * %attrs;
+	 * Global attributes
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIGURE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIGURE.java
new file mode 100644
index 0000000..87a4610
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIGURE.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+/**
+ * FIGURE.
+ */
+final class HedFIGURE extends HTMLElemDeclImpl {
+
+	/**
+	 */
+	public HedFIGURE(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.FIGURE, collection);
+		typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FIGURE;
+		layoutType = LAYOUT_BLOCK;
+		indentChild = true;
+	}
+
+	/**
+	 * %attrs;
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+	}
+	
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEADER.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEADER.java
new file mode 100644
index 0000000..5e72a35
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEADER.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public class HedHEADER extends HedFlowContainer {
+
+	public HedHEADER(String name, ElementCollection collection) {
+		super(name, collection);
+	}
+
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+	}
+
+	/**
+	 * Exclusion.
+	 * <code>HEADER</code> has the exclusion.
+	 * It is <code>HEADER</code> and <code>FOOTER</code>.
+	 */
+	public CMContent getExclusion() {
+		if (exclusion != null)
+			return exclusion; // already created.
+		if (elementCollection == null)
+			return null; // fatal
+
+		exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+		CMNode node = elementCollection.getNamedItem(HTML50Namespace.ElementName.HEADER);
+		if (node != null)
+			exclusion.appendChild(node);
+		node = elementCollection.getNamedItem(HTML50Namespace.ElementName.FOOTER);
+		if (node != null)
+			exclusion.appendChild(node);
+
+		return exclusion;
+	}
+
+	/**
+	 */
+	public CMNamedNodeMap getProhibitedAncestors() {
+		if (prohibitedAncestors != null)
+			return prohibitedAncestors;
+
+		String[] names = {HTML50Namespace.ElementName.HEADER, HTML50Namespace.ElementName.FOOTER};
+		prohibitedAncestors = elementCollection.getDeclarations(names);
+
+		return prohibitedAncestors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHGROUP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHGROUP.java
new file mode 100644
index 0000000..3bb51a4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHGROUP.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+public class HedHGROUP extends HTMLElemDeclImpl {
+
+	public HedHGROUP(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.HGROUP, collection);
+		typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HEADING_CONTAINER;
+		correctionType = CORRECT_EMPTY;
+		layoutType = LAYOUT_BLOCK;
+		indentChild = true;
+	}
+
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+	}
+
+	/**
+	 */
+	public CMNamedNodeMap getProhibitedAncestors() {
+		if (prohibitedAncestors != null)
+			return prohibitedAncestors;
+
+		String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+		prohibitedAncestors = elementCollection.getDeclarations(names);
+
+		return prohibitedAncestors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java
index 99b6332..e393d04 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -62,13 +62,10 @@
 
 		attributes = new CMNamedNodeMapImpl();
 
-		// %i18n;
-		attributeCollection.getI18n(attributes);
-		// version
-		HTMLAttributeDeclaration adec = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_VERSION);
-		if (adec != null)
-			attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VERSION, adec);
-	}
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.HTML, attributes);
+	
+		}
 
 	/**
 	 * HTML has terminators.
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java
index 191615e..0e4c564 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,8 +12,6 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
@@ -29,19 +27,7 @@
 		layoutType = LAYOUT_OBJECT;
 	}
 
-	/**
-	 * %coreattrs;
-	 * (longdesc %URI; #IMPLIED)
-	 * (name CDATA #IMPLIED)
-	 * (src %URI; #IMPLIED)
-	 * (frameborder (1|0) 1)
-	 * (marginwidth %Pixels; #IMPLIED)
-	 * (marginheight %Pixels; #IMPLIED)
-	 * (scrolling (yes|no|auto) auto)
-	 * (align %IAlign; #IMPLIED) ... should be defined locally.
-	 * (height %Length; #IMPLIED)
-	 * (width %Length; #IMPLIED)
-	 */
+	
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
 			return; // already created.
@@ -50,16 +36,9 @@
 
 		attributes = new CMNamedNodeMapImpl();
 
-		// %coreattrs;
-		attributeCollection.getCore(attributes);
-
-		String[] names = {HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_FRAMEBORDER, HTML40Namespace.ATTR_NAME_MARGINWIDTH, HTML40Namespace.ATTR_NAME_MARGINHEIGHT, HTML40Namespace.ATTR_NAME_SCROLLING, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-
-		// align
-		HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage();
-		if (attr != null)
-			attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.IFRAME, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java
index 1e1805e..b719416 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,11 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
 /**
@@ -34,19 +30,6 @@
 	/**
 	 * IMG.
 	 * %attrs;
-	 * (src %URI; #REQUIRED): should be defined locally.
-	 * (alt %Text; #REQUIRED)
-	 * (longdesc %URI; #IMPLIED)
-	 * (name CDATA #IMPLIED)
-	 * (height %Length; #IMPLIED)
-	 * (width %Length; #IMPLIED)
-	 * (usemap %URI; #IMPLIED)
-	 * (ismap (ismap) #IMPLIED)
-	 * (align %IAlign; #IMPLIED): should be defined locally.
-	 * (border %Pixels; #IMPLIED)
-	 * (hspace %Pixels; #IMPLIED)
-	 * (vspace %Pixels; #IMPLIED)
-	 * (mapfile %URI; #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -59,19 +42,9 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		// (src %URI; #REQUIRED): should be defined locally.
-		HTMLCMDataTypeImpl atype = null;
-		HTMLAttrDeclImpl attr = null;
-		atype = new HTMLCMDataTypeImpl(CMDataType.URI);
-		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr);
-
-		String[] names = {HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_ISMAP, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE, HTML40Namespace.ATTR_NAME_MAPFILE};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-
-		// align (local); should be defined locally.
-		attr = AttributeCollection.createAlignForImage();
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.IMG, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java
index 60b3049..9080201 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,11 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
 /**
@@ -34,32 +30,7 @@
 	/**
 	 * INPUT.
 	 * %attrs;
-	 * (type %InputType; TEXT) ... should be defined locally.
-	 * (name CDATA #IMPLIED)
-	 * (value CDATA #IMPLIED)
-	 * (checked (checked) #IMPLIED)
-	 * (disabled (disabled) #IMPLIED)
-	 * (readonly (readonly) #IMPLIED)
-	 * (size CDATA #IMPLIED) ... should be defined locally.
-	 * (maxlength NUMBER #IMPLIED)
-	 * (src %URI; #IMPLIED)
-	 * (alt CDATA #IMPLIED) ... should be defined locally.
-	 * (usemap %URI; #IMPLIED)
-	 * (ismap (ismap) #IMPLIED)
-	 * (tabindex NUMBER #IMPLIED)
-	 * (accesskey %Character; #IMPLIED)
-	 * (onfocus %Script; #IMPLIED)
-	 * (onblur %Script; #IMPLIED)
-	 * (onselect %Script; #IMPLIED)
-	 * (onchange %Script; #IMPLIED)
-	 * (accept %ContentTypes; #IMPLIED)
-	 * (align %IAlign; #IMPLIED) ... should be defined locally.
-	 * (istyle CDATA #IMPLIED)
-	 * <<D215684
-	 * (width CDATA; #IMPLIED)
-	 * (height CDATA; #IMPLIED)
-	 * (border CDATA; #IMPLIED)
-	 * D215684
+	
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -72,40 +43,8 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		HTMLCMDataTypeImpl atype = null;
-		HTMLAttrDeclImpl attr = null;
-		// (type %InputType; TEXT) ... should be defined locally.
-		// NOTE: %InputType is ENUM;
-		// (text | password | checkbox | radio | submit | reset |
-		//  file | hidden | image | button)
-		atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
-		String[] values = {HTML40Namespace.ATTR_VALUE_TEXT, HTML40Namespace.ATTR_VALUE_PASSWORD, HTML40Namespace.ATTR_VALUE_CHECKBOX, HTML40Namespace.ATTR_VALUE_RADIO, HTML40Namespace.ATTR_VALUE_SUBMIT, HTML40Namespace.ATTR_VALUE_RESET, HTML40Namespace.ATTR_VALUE_FILE, HTML40Namespace.ATTR_VALUE_HIDDEN, HTML40Namespace.ATTR_VALUE_IMAGE, HTML40Namespace.ATTR_VALUE_BUTTON};
-		atype.setEnumValues(values);
-		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_TEXT);
-		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
-
-		// (size CDATA #IMPLIED) ... should be defined locally.
-		atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
-		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr);
-
-		// (alt CDATA #IMPLIED) ... should be defined locally.
-		atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
-		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALT, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALT, attr);
-
-		// (align %IAlign; #IMPLIED) ... should be defined locally.
-		attr = AttributeCollection.createAlignForImage();
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
-
-		// the rest.
-		String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_CHECKED, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_READONLY, HTML40Namespace.ATTR_NAME_SIZE, HTML40Namespace.ATTR_NAME_MAXLENGTH, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_ISMAP, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONSELECT, HTML40Namespace.ATTR_NAME_ONCHANGE, HTML40Namespace.ATTR_NAME_ACCEPT, HTML40Namespace.ATTR_NAME_ALIGN, HTML40Namespace.ATTR_NAME_ISTYLE,
-		//<<D215684
-					HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BORDER
-		//<D215684
-		};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.INPUT, attributes);
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedKEYGEN.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedKEYGEN.java
new file mode 100644
index 0000000..c84b30a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedKEYGEN.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+public class HedKEYGEN extends HedEmpty {
+
+	public HedKEYGEN(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.KEYGEN, collection);
+		layoutType = LAYOUT_OBJECT;
+	}
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		attributeCollection.getAttrs(attributes);
+
+		String[] names = { HTML50Namespace.ATTR_NAME_AUTOFOCUS, HTML50Namespace.ATTR_NAME_CHALLENGE, HTML40Namespace.ATTR_NAME_DISABLED, HTML50Namespace.ATTR_NAME_FORM, HTML50Namespace.ATTR_NAME_KEYTYPE, HTML40Namespace.ATTR_NAME_NAME};
+		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java
index f43785e..a413193 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,8 +16,6 @@
 import java.util.Iterator;
 
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 
 /**
  * LI.
@@ -36,8 +34,6 @@
 
 	/**
 	 * %attrs;
-	 * (type %LIStyle; #IMPLIED) ... should be defined locally.
-	 * (value NUMBER #IMPLIED) ... should be defined locally.
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -50,15 +46,9 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		// (type %LIStyle; #IMPLIED) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LI_STYLE);
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
-
-		// (value NUMBER #IMPLIED) ... should be defined locally.
-		atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
-		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VALUE, attr);
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.LI, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java
index bfe132c..4c28bbe 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,10 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 
 /**
  * LINK.
@@ -32,14 +29,6 @@
 	/**
 	 * LINK.
 	 * %attrs;
-	 * (charset %Charset; #IMPLIED)
-	 * (href %URI; #IMPLIED)
-	 * (hreflang %LanguageCode; #IMPLIED)
-	 * (type %ContentType; #IMPLIED): should be defined locally.
-	 * (rel %LinkTypes; #IMPLIED)
-	 * (rev %LinkTypes; #IMPLIED)
-	 * (media %MediaDesc; #IMPLIED)
-	 * (target %FrameTarget; #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -52,12 +41,8 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_HREFLANG, HTML40Namespace.ATTR_NAME_REL, HTML40Namespace.ATTR_NAME_REV, HTML40Namespace.ATTR_NAME_MEDIA, HTML40Namespace.ATTR_NAME_TARGET};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-
-		// (type %ContentType; #IMPLIED)
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+		// different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.LINK, attributes);
+		
 	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java
index 0142558..812af9b 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -32,8 +32,7 @@
 
 	/**
 	 * MENU/DIR.
-	 * (compact (compact) #IMPLIED)
-	 */
+	*/
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
 			return; // already created.
@@ -45,8 +44,8 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		String[] names = {HTML40Namespace.ATTR_NAME_COMPACT};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.MENU, attributes);
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java
index d5b232c..92554ea 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,10 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 
 /**
  * META.
@@ -31,11 +28,7 @@
 
 	/**
 	 * META.
-	 * %i18n;
-	 * (http-equiv NAME #IMPLIED)
-	 * (name NAME #IMPLIED) ... should be defined locally.
-	 * (content CDATA #REQUIRED)
-	 * (scheme CDATA #IMPLIED)
+
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -44,16 +37,9 @@
 			return; // fatal
 
 		attributes = new CMNamedNodeMapImpl();
-
-		// %i18n;
-		attributeCollection.getI18n(attributes);
-
-		// (name NAME #IMPLIED) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME);
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr);
-
-		String[] names = {HTML40Namespace.ATTR_NAME_HTTP_EQUIV, HTML40Namespace.ATTR_NAME_CONTENT, HTML40Namespace.ATTR_NAME_SCHEME};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+		
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.META, attributes);
+	
 	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETER.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETER.java
new file mode 100644
index 0000000..c79e9e9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETER.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public class HedMETER extends HedInlineContainer {
+
+	public HedMETER(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.METER, collection);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.HTMLElemDeclImpl#createAttributeDeclarations()
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+		attributeCollection.getAttrs(attributes);
+
+		String[] names = { HTML50Namespace.ATTR_NAME_MIN, HTML50Namespace.ATTR_NAME_MAX, HTML50Namespace.ATTR_NAME_LOW, HTML50Namespace.ATTR_NAME_HIGH, HTML50Namespace.ATTR_NAME_OPTIMUM, HTML50Namespace.ATTR_NAME_FORM };
+		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+		HTMLAttrDeclImpl decl = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_VALUE, atype, CMAttributeDeclaration.REQUIRED);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VALUE, decl);
+	}
+
+	public CMContent getExclusion() {
+		if (exclusion != null)
+			return exclusion; // already created.
+		if (elementCollection == null)
+			return null;
+
+		exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+		CMNode meter = elementCollection.getNamedItem(HTML50Namespace.ElementName.METER);
+		if (meter != null)
+			exclusion.appendChild(meter);
+
+		return exclusion;
+	}
+
+	public CMNamedNodeMap getProhibitedAncestors() {
+		if (prohibitedAncestors != null)
+			return prohibitedAncestors;
+
+		String[] names = {HTML50Namespace.ElementName.METER};
+		prohibitedAncestors = elementCollection.getDeclarations(names);
+
+		return prohibitedAncestors;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMath.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMath.java
new file mode 100644
index 0000000..154dbfa
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMath.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+
+/**
+ * Math.
+ */
+final class HedMath extends HTMLElemDeclImpl {
+
+	private static String[] terminators = {HTML50Namespace.ElementName.MATH};
+
+	/**
+	 */
+	public HedMath(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.MATH, collection);
+		layoutType = LAYOUT_OBJECT;
+	}
+
+	/**
+	 * Create all attribute declarations.
+	 * MathML namespace
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+	}
+
+	/**
+	 * MATH has terminators.
+	 * @return java.util.Iterator
+	 */
+	protected Iterator getTerminators() {
+		return Arrays.asList(terminators).iterator();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMediaElement.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMediaElement.java
new file mode 100644
index 0000000..d36aa40
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMediaElement.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * EMBED.
+ */
+class HedMediaElement extends HTMLElemDeclImpl {
+
+	/**
+	 */
+	public HedMediaElement(String elementName, ElementCollection collection) {
+		super(elementName, collection);
+		typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_MEDIA_ELEMENT;
+		layoutType = LAYOUT_OBJECT;
+		indentChild = true;
+	}
+
+	/**
+	 * MediaElement
+	 * %attrs;
+	 * (src %URI; #REQUIRED): should be defined locally.
+	 * (preload %CDATA; #IMPLIED) 
+	 * (autoplay %ENUM; #IMPLIED) 
+	 * (loop %ENUM; #IMPLIED)
+	 * (controls %MediaType; #IMPLIED)
+	 * Global attributes
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+	
+		// (src %URI; #REQUIRED): should be defined locally.
+		HTMLCMDataTypeImpl atype = null;
+		HTMLAttrDeclImpl attr = null;
+		atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr);
+
+		//(preload %CDATA; #IMPLIED) ENUM
+		// (none | metadata | auto)
+		atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+		String[] values = {HTML40Namespace.ATTR_VALUE_NONE, HTML50Namespace.ATTR_VALUE_METADATA, HTML40Namespace.ATTR_VALUE_AUTO, HTML50Namespace.ATTR_VALUE_EMPTY};
+		atype.setEnumValues(values);
+		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_AUTO);
+		attr = new HTMLAttrDeclImpl(HTML50Namespace.ATTR_NAME_PRELOAD, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML50Namespace.ATTR_NAME_PRELOAD, attr);
+
+		// (autoplay (boolean) #IMPLIED)
+		atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+		String[] autoPlayValues = {HTML50Namespace.ATTR_NAME_AUTOPLAY};
+		atype.setEnumValues(autoPlayValues);
+		attr = new HTMLAttrDeclImpl(HTML50Namespace.ATTR_NAME_AUTOPLAY, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML50Namespace.ATTR_NAME_AUTOPLAY, attr);
+
+		// (loop (boolean) #IMPLIED)
+		atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+		String[] loopValues = {HTML50Namespace.ATTR_NAME_LOOP};
+		atype.setEnumValues(loopValues);
+		attr = new HTMLAttrDeclImpl(HTML50Namespace.ATTR_NAME_LOOP, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML50Namespace.ATTR_NAME_LOOP, attr);
+
+		// (controls (boolean) #IMPLIED)
+		atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+		String[] controlValues = {HTML50Namespace.ATTR_NAME_CONTROLS};
+		atype.setEnumValues(controlValues);
+		attr = new HTMLAttrDeclImpl(HTML50Namespace.ATTR_NAME_CONTROLS, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML50Namespace.ATTR_NAME_CONTROLS, attr);
+
+		
+		// global attributes
+		attributeCollection.getAttrs(attributes);
+	}
+}
+
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java
index 6668b90..6c6d50c 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,10 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
 /**
@@ -31,9 +28,6 @@
 
 	/**
 	 * OL.
-	 * (type %OLStyle; #IMPLIED) ... should be defined locally.
-	 * (compact (compact) #IMPLIED)
-	 * (start NUMBER #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -46,14 +40,9 @@
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
 
-		// (type %OLStyle; #IMPLIED) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.OL_STYLE);
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
-
-		// the rest.
-		String[] names = {HTML40Namespace.ATTR_NAME_COMPACT, HTML40Namespace.ATTR_NAME_START};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.OL, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOUTPUT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOUTPUT.java
new file mode 100644
index 0000000..fc172e1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOUTPUT.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+public class HedOUTPUT extends HedInlineContainer {
+
+	public HedOUTPUT(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.OUTPUT, collection);
+	}
+
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+		String[] names = { HTML40Namespace.ATTR_NAME_FOR, HTML50Namespace.ATTR_NAME_FORM, HTML40Namespace.ATTR_NAME_NAME};
+		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java
index 5541a1f..1bcea7e 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,11 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 
 /**
  * PARAM.
@@ -32,11 +28,6 @@
 
 	/**
 	 * PARAM.
-	 * (id ID #IMPLIED)
-	 * (name CDATA #REQUIRED) ... should be defined locally.
-	 * (value CDATA #IMPLIED)
-	 * (valuetype (DATA|REF|OBJECT) DATA)
-	 * (type %ContentType; #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -46,12 +37,9 @@
 
 		attributes = new CMNamedNodeMapImpl();
 
-		String[] names = {HTML40Namespace.ATTR_NAME_ID, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_VALUETYPE, HTML40Namespace.ATTR_NAME_TYPE};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-
-		// (name CDATA #REQUIRED) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.REQUIRED);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr);
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.PARAM, attributes);
+	
+		
 	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPROGRESS.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPROGRESS.java
new file mode 100644
index 0000000..223c129
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPROGRESS.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public class HedPROGRESS extends HedInlineContainer {
+
+	public HedPROGRESS(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.PROGRESS, collection);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.HTMLElemDeclImpl#createAttributeDeclarations()
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+		attributeCollection.getAttrs(attributes);
+
+		String[] names = { HTML40Namespace.ATTR_NAME_VALUE, HTML50Namespace.ATTR_NAME_MAX, HTML50Namespace.ATTR_NAME_FORM };
+		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+	}
+
+	public CMContent getExclusion() {
+		if (exclusion != null)
+			return exclusion;
+		if (elementCollection == null)
+			return null;
+
+		exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+		CMNode progress = elementCollection.getNamedItem(HTML50Namespace.ElementName.PROGRESS);
+		if (progress != null) {
+			exclusion.appendChild(progress);
+		}
+		return exclusion;
+	}
+
+	public CMNamedNodeMap getProhibitedAncestors() {
+		if (prohibitedAncestors == null) {
+			String[] names = { HTML50Namespace.ElementName.PROGRESS };
+			prohibitedAncestors = elementCollection.getDeclarations(names);
+		}
+		return prohibitedAncestors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRP.java
new file mode 100644
index 0000000..e31a9bc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRP.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+
+/**
+ * RP.
+ */
+final class HedRP extends HedPcdata {
+
+	private static String[] terminators = {HTML50Namespace.ElementName.RP};
+
+	/**
+	 */
+	public HedRP(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.RP, collection);
+		layoutType = LAYOUT_HIDDEN;
+	}
+
+	/**
+	 * OPTION.
+	 * %attrs;
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+	}
+
+	/**
+	 * OPTION has terminators.
+	 * @return java.util.Iterator
+	 */
+	protected Iterator getTerminators() {
+		return Arrays.asList(terminators).iterator();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRT.java
new file mode 100644
index 0000000..aba4a38
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRT.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+
+/**
+ * RT.
+ */
+final class HedRT extends HedPcdata {
+
+	private static String[] terminators = {HTML50Namespace.ElementName.RT};
+
+	/**
+	 */
+	public HedRT(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.RT, collection);
+		layoutType = LAYOUT_BLOCK;
+
+	}
+
+	/**
+	 * OPTION.
+	 * %attrs;
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+	}
+
+	/**
+	 * OPTION has terminators.
+	 * @return java.util.Iterator
+	 */
+	protected Iterator getTerminators() {
+		return Arrays.asList(terminators).iterator();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRUBY.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRUBY.java
new file mode 100644
index 0000000..6686a25
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedRUBY.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+/**
+ * RUBY.
+ */
+final class HedRUBY extends HTMLElemDeclImpl {
+
+	/**
+	 */
+	public HedRUBY(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.RUBY, collection);
+		typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_RUBY;
+		layoutType = LAYOUT_BLOCK;
+		indentChild = true;
+	}
+
+	/**
+	 * %attrs;
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java
index ae910b7..2af1317 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,12 +12,8 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 
 /**
@@ -35,13 +31,6 @@
 
 	/**
 	 * SCRIPT.
-	 * (charset %Charset; #IMPLIED)
-	 * (type %ContentType; #REQUIRED) ... should be defined locally.
-	 * (language CDATA #IMPLIED)
-	 * (src %URI; #IMPLIED)
-	 * (defer (defer) #IMPLIED)
-	 * (event CDATA #IMPLIED)
-	 * (for %URI; #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -51,14 +40,9 @@
 
 		attributes = new CMNamedNodeMapImpl();
 
-		String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_LANGUAGE, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_DEFER, HTML40Namespace.ATTR_NAME_EVENT, HTML40Namespace.ATTR_NAME_FOR};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-
-		// (type %ContentType; #REQUIRED) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
-		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/javascript"); //$NON-NLS-1$
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.SCRIPT, attributes);
+	
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java
index 78c3a08..a0de442 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,11 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
 /**
@@ -35,15 +31,6 @@
 
 	/**
 	 * %attrs;
-	 * %reserved;
-	 * (name CDATA #IMPLIED)
-	 * (size NUMBER #IMPLIED) ... should be defined locally.
-	 * (multiple (multiple) #IMPLIED)
-	 * (disabled (disabled) #IMPLIED)
-	 * (tabindex NUMBER #IMPLIED)
-	 * (onfocus %Script; #IMPLIED)
-	 * (onblur %Script; #IMPLIED)
-	 * (onchange %Script; #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -55,14 +42,11 @@
 
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
+		
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.SELECT, attributes);
+	
 
-		// (size NUMBER #IMPLIED) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr);
-
-		String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_MULTIPLE, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONCHANGE};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSOURCE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSOURCE.java
new file mode 100644
index 0000000..647a9d4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSOURCE.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * SOURCE.
+ */
+final class HedSOURCE extends HTMLElemDeclImpl {
+
+	private static String[] terminators = {HTML50Namespace.ElementName.SOURCE};
+
+	/**
+	 */
+	public HedSOURCE(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.SOURCE, collection);
+		typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_CDATA;
+		layoutType = LAYOUT_HIDDEN;
+	}
+
+	/**
+	 * SOURCE
+	 * %attrs;
+	 * (src %URI; #REQUIRED): should be defined locally.
+	 * (type %ContentType; #IMPLIED) 
+	 * (media %MediaType; #IMPLIED) 
+	 * Global attributes
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+	
+		// (src %URI; #REQUIRED): should be defined locally.
+		HTMLCMDataTypeImpl atype = null;
+		HTMLAttrDeclImpl attr = null;
+		atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr);
+
+		// (type %ContentType; #IMPLIED) 
+		atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+		
+
+		// (media %MediaType; #IMPLIED) 
+		atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MEDIA_TYPE);
+		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_ALL);
+		attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_MEDIA, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_MEDIA, attr);
+		
+		
+		// global attributes
+		attributeCollection.getAttrs(attributes);
+	}
+	
+	/**
+	 * SOURCE has terminators.
+	 * @return java.util.Iterator
+	 */
+	protected Iterator getTerminators() {
+		return Arrays.asList(terminators).iterator();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java
index 985b7fa..da0c3ed 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,12 +12,8 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 
 /**
@@ -35,11 +31,7 @@
 
 	/**
 	 * STYLE
-	 * %i18n;
-	 * (type %ContentType; #REQUIRED) ... should be defined locally.
-	 * (media %MediaDesc; #IMPLIED)
-	 * (title %Text; #IMPLIED)
-	 */
+	*/
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
 			return; // already created.
@@ -47,17 +39,11 @@
 			return; // fatal
 
 		attributes = new CMNamedNodeMapImpl();
-
-		// %i18n;
-		attributeCollection.getI18n(attributes);
-
-		String[] names = {HTML40Namespace.ATTR_NAME_MEDIA, HTML40Namespace.ATTR_NAME_TITLE};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-		// (type %ContentType; #REQUIRED) ... should be defined locally.
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
-		atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/css"); //$NON-NLS-1$
-		HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+		
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.STYLE, attributes);
+	
+		
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSUMMARY.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSUMMARY.java
new file mode 100644
index 0000000..c2b3e82
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSUMMARY.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+public class HedSUMMARY extends HedInlineContainer {
+
+	public HedSUMMARY(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.SUMMARY, collection);
+	}
+
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSVG.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSVG.java
new file mode 100644
index 0000000..0515172
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSVG.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+
+
+/**
+ * SVG.
+ */
+final class HedSVG extends HTMLElemDeclImpl {
+
+	private static String[] terminators = {HTML50Namespace.ElementName.SVG};
+
+	/**
+	 */
+	public HedSVG(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.SVG, collection);
+		layoutType = LAYOUT_OBJECT;
+	}
+
+	/**
+	 * Create all attribute declarations.
+	 * SVG namespace
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		attributeCollection.getAttrs(attributes);
+	}
+
+	/**
+	 * SVG has terminators.
+	 * @return java.util.Iterator
+	 */
+	protected Iterator getTerminators() {
+		return Arrays.asList(terminators).iterator();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSectioning.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSectioning.java
new file mode 100644
index 0000000..07a7209
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSectioning.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+public class HedSectioning extends HedFlowContainer {
+	public HedSectioning(String elementName, ElementCollection collection) {
+		super(elementName, collection);
+		layoutType = LAYOUT_BLOCK;
+		correctionType = CORRECT_EMPTY;
+	}
+
+	/**
+	 * Article.
+	 * %attrs;
+	 * Global attributes
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+
+		// %attrs;
+		attributeCollection.getAttrs(attributes);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java
index bed267c..426cd78 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,11 +12,7 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
 /**
@@ -36,20 +32,6 @@
 	/**
 	 * TABLE.
 	 * %attrs;
-	 * %reserved;
-	 * (summary %Text; #IMPLIED)
-	 * (width %Length; #IMPLIED)
-	 * (border %Pixels; #IMPLIED)
-	 * (frame %TFrame; #IMPLIED)
-	 * (rules %TRules; #IMPLIED)
-	 * (cellspacing %Length; #IMPLIED)
-	 * (cellpadding %Length; #IMPLIED)
-	 * (align %TAlign; #IMPLIED)
-	 * (bgcolor %Color; #IMPLIED)
-	 * (datapagesize CDATA #IMPLIED)
-	 * (height %Pixels; #IMPLIED)
-	 * (background %URI; #IMPLIED)
-	 * (bordercolor %Color #IMPLIED) ... D205514
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -61,19 +43,10 @@
 
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
-		// %reserved;
-		// ... %reserved; is empty in the current DTD.
-
-		String[] names = {HTML40Namespace.ATTR_NAME_SUMMARY, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_FRAME, HTML40Namespace.ATTR_NAME_RULES, HTML40Namespace.ATTR_NAME_CELLSPACING, HTML40Namespace.ATTR_NAME_CELLPADDING, HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_DATAPAGESIZE, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BACKGROUND, HTML40Namespace.ATTR_NAME_BORDERCOLOR // D205514
-		};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-
-		// align (local)
-		HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
-		String[] alignValues = {HTML40Namespace.ATTR_VALUE_LEFT, HTML40Namespace.ATTR_VALUE_CENTER, HTML40Namespace.ATTR_VALUE_RIGHT};
-		atype.setEnumValues(alignValues);
-		HTMLAttrDeclImpl adec = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
-		attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, adec);
+		
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.TABLE, attributes);
+		
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java
index f8a61c6..1b5ba41 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,8 +12,6 @@
 
 
 
-import java.util.Arrays;
-
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 
@@ -35,19 +33,6 @@
 	/**
 	 * TEXTAREA.
 	 * %attrs;
-	 * %reserved; ... empty
-	 * (name CDATA #IMPLIED)
-	 * (rows NUMBER #REQUIRED)
-	 * (cols NUMBER #REQUIRED)
-	 * (disabled (disabled) #IMPLIED)
-	 * (readonly (readonly) #IMPLIED)
-	 * (tabindex NUMBER #IMPLIED)
-	 * (accesskey %Character; #IMPLIED)
-	 * (onfocus %Script; #IMPLIED)
-	 * (onblur %Script; #IMPLIED)
-	 * (onselect %Script; #IMPLIED)
-	 * (onchange %Script; #IMPLIED)
-	 * (istyle CDATA #IMPLIED)
 	 */
 	protected void createAttributeDeclarations() {
 		if (attributes != null)
@@ -58,10 +43,10 @@
 
 		// %attrs;
 		attributeCollection.getAttrs(attributes);
-
-		String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_ROWS, HTML40Namespace.ATTR_NAME_COLS, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_READONLY, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONSELECT, HTML40Namespace.ATTR_NAME_ONCHANGE, HTML40Namespace.ATTR_NAME_ISTYLE};
-		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
-	}
+		//different sets of attributes for html 4 & 5
+		attributeCollection.createAttributeDeclarations(HTML40Namespace.ElementName.TEXTAREA, attributes);
+	
+		}
 
 	/**
 	 */
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTIME.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTIME.java
new file mode 100644
index 0000000..ec8191c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTIME.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public class HedTIME extends HedInlineContainer {
+
+	public HedTIME(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.TIME, collection);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.html.core.internal.contentmodel.HTMLElemDeclImpl#createAttributeDeclarations()
+	 */
+	protected void createAttributeDeclarations() {
+		if (attributes != null)
+			return; // already created.
+		if (attributeCollection == null)
+			return; // fatal
+
+		attributes = new CMNamedNodeMapImpl();
+		attributeCollection.getAttrs(attributes);
+
+		String[] names = { HTML40Namespace.ATTR_NAME_DATETIME, HTML50Namespace.ATTR_NAME_PUBDATE };
+		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+	}
+
+	public CMContent getExclusion() {
+		if (exclusion != null)
+			return exclusion; // already created.
+		if (elementCollection == null)
+			return null;
+
+		exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+		CMNode time = elementCollection.getNamedItem(HTML50Namespace.ElementName.TIME);
+		if (time != null)
+			exclusion.appendChild(time);
+
+		return exclusion;
+	}
+
+	public CMNamedNodeMap getProhibitedAncestors() {
+		if (prohibitedAncestors != null)
+			return prohibitedAncestors;
+
+		String[] names = {HTML50Namespace.ElementName.TIME};
+		prohibitedAncestors = elementCollection.getDeclarations(names);
+		return prohibitedAncestors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedVIDEO.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedVIDEO.java
new file mode 100644
index 0000000..98eb444
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedVIDEO.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+
+
+
+/**
+ * VIDEO.
+ */
+final class HedVIDEO extends HedMediaElement {
+
+	
+	public HedVIDEO(ElementCollection collection) {
+		super(HTML50Namespace.ElementName.VIDEO, collection);
+	}
+
+	/**
+	 * MediaElement
+	 * %attrs;
+	 * (src %URI; #REQUIRED): should be defined locally.
+	 * (preload %CDATA; #IMPLIED) 
+	 * (autoplay %ENUM; #IMPLIED) 
+	 * (loop %ENUM; #IMPLIED)
+	 * (controls %MediaType; #IMPLIED)
+	 * (poster %URI; OPTIONAL)
+	 * (height %Length; #IMPLIED)
+	 * (width %Length; #IMPLIED)
+	 * Global attributes
+	 */
+	protected void createAttributeDeclarations() {
+		super.createAttributeDeclarations();
+		
+		// (poster %URI; #optional): should be defined locally.
+		
+		HTMLCMDataTypeImpl atype = null;
+		HTMLAttrDeclImpl attr = null;
+		atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+		attr = new HTMLAttrDeclImpl(HTML50Namespace.ATTR_NAME_POSTER, atype, CMAttributeDeclaration.OPTIONAL);
+		attributes.putNamedItem(HTML50Namespace.ATTR_NAME_POSTER, attr);
+		
+		// height , width
+		String[] names = {HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH};
+		attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+
+		
+	}
+}
+
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCM21DocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCM21DocImpl.java
new file mode 100644
index 0000000..ba9e0cd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCM21DocImpl.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+class JCM21DocImpl extends JCMDocImpl {
+	/**
+	 * JCM21DocImpl constructor comment.
+	 */
+	public JCM21DocImpl(String docTypeName, CMNamespaceImpl targetNamespace) {
+		super(docTypeName, targetNamespace, new JSP21ElementCollection());
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP20ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP20ElementCollection.java
index 3ca1dad..fd404c5 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP20ElementCollection.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP20ElementCollection.java
@@ -23,7 +23,7 @@
 /**
  * Factory for element declarations of JSP 1.1 and JSP 1.2.
  */
-final class JSP20ElementCollection extends JSPElementCollection implements JSP20Namespace.ElementName {
+class JSP20ElementCollection extends JSPElementCollection implements JSP20Namespace.ElementName {
 
 	// element IDs
 	private static class Ids20 extends Ids {
@@ -55,7 +55,7 @@
 	}
 
 	// attribute creater
-	private class JACreater20 extends JACreater {
+	class JACreater20 extends JACreater {
 		public JACreater20() {
 			super();
 		}
@@ -483,9 +483,13 @@
 		if (content != null)
 			decl.setContent(content);
 
-		JACreater20 creater = new JACreater20();
+		JACreater20 creater = getAttributeCreator();
 		decl.setAttributes(creater.getDeclarations(eid));
 
 		return decl;
 	}
+
+	protected JACreater20 getAttributeCreator() {
+		return new JACreater20();
+	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP21ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP21ElementCollection.java
new file mode 100644
index 0000000..4b7a1ba
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP21ElementCollection.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+
+class JSP21ElementCollection extends JSP20ElementCollection {
+
+	class JACreator21 extends JACreater20 {
+		void createForDirPage() {
+			super.createForDirPage();
+			AttrDecl adec;
+			// ("trimDirectiveWhitespaces" ENUM DECLARED (true|false) "false")
+			adec = createBoolType(JSP21Namespace.ATTR_NAME_TRIM_DIRECTIVE_WHITESPACES, ATTR_VALUE_FALSE);
+			if (adec != null) {
+				adec.usage = CMAttributeDeclaration.OPTIONAL;
+				declarations.putNamedItem(JSP21Namespace.ATTR_NAME_TRIM_DIRECTIVE_WHITESPACES, adec);
+			}
+			// ("deferredSyntaxAllowedAsLiteral" ENUM DECLARED (true|false) "false")
+			adec = createBoolType(JSP21Namespace.ATTR_NAME_DEFERRED_SYNTAX_ALLOWED_AS_LITERAL, ATTR_VALUE_FALSE);
+			if (adec != null) {
+				adec.usage = CMAttributeDeclaration.OPTIONAL;
+				declarations.putNamedItem(JSP21Namespace.ATTR_NAME_DEFERRED_SYNTAX_ALLOWED_AS_LITERAL, adec);
+			}
+		}
+	}
+
+	protected JACreater20 getAttributeCreator() {
+		return new JACreator21();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP21Namespace.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP21Namespace.java
new file mode 100644
index 0000000..dde35b7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP21Namespace.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.contentmodel;
+
+public interface JSP21Namespace extends JSP20Namespace {
+	String JSP21_URI = "";//$NON-NLS-1$
+	String ATTR_NAME_TRIM_DIRECTIVE_WHITESPACES = "trimDirectiveWhitespaces"; //$NON-NLS-1$
+	String ATTR_NAME_DEFERRED_SYNTAX_ALLOWED_AS_LITERAL = "deferredSyntaxAllowedAsLiteral"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/Tag20ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/Tag20ElementCollection.java
index 7ae40f2..8dd86bc 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/Tag20ElementCollection.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/Tag20ElementCollection.java
@@ -501,23 +501,23 @@
 
 	static {
 		names = new String[TagIds20.getNumOfIds()];
-		names[Ids.ID_SCRIPTLET] = JSP11Namespace.ElementName.SCRIPTLET;
-		names[Ids.ID_EXPRESSION] = JSP11Namespace.ElementName.EXPRESSION;
-		names[Ids.ID_DECLARATION] = JSP11Namespace.ElementName.DECLARATION;
+		names[TagIds20.ID_SCRIPTLET] = JSP11Namespace.ElementName.SCRIPTLET;
+		names[TagIds20.ID_EXPRESSION] = JSP11Namespace.ElementName.EXPRESSION;
+		names[TagIds20.ID_DECLARATION] = JSP11Namespace.ElementName.DECLARATION;
 		names[TagIds20.ID_DIRECTIVE_TAG] = JSP20Namespace.ElementName.DIRECTIVE_TAG;
-		names[Ids.ID_DIRECTIVE_INCLUDE] = JSP11Namespace.ElementName.DIRECTIVE_INCLUDE;
-		names[Ids.ID_DIRECTIVE_TAGLIB] = JSP11Namespace.ElementName.DIRECTIVE_TAGLIB;
-		names[Ids.ID_USEBEAN] = JSP11Namespace.ElementName.USEBEAN;
-		names[Ids.ID_SETPROPERTY] = JSP11Namespace.ElementName.SETPROPERTY;
-		names[Ids.ID_GETPROPERTY] = JSP11Namespace.ElementName.GETPROPERTY;
-		names[Ids.ID_INCLUDE] = JSP11Namespace.ElementName.INCLUDE;
-		names[Ids.ID_FORWARD] = JSP11Namespace.ElementName.FORWARD;
-		names[Ids.ID_PLUGIN] = JSP11Namespace.ElementName.PLUGIN;
-		names[Ids.ID_PARAMS] = JSP11Namespace.ElementName.PARAMS;
-		names[Ids.ID_FALLBACK] = JSP11Namespace.ElementName.FALLBACK;
-		names[Ids.ID_PARAM] = JSP11Namespace.ElementName.PARAM;
-		names[Ids.ID_ROOT] = JSP11Namespace.ElementName.ROOT;
-		names[Ids.ID_TEXT] = JSP11Namespace.ElementName.TEXT;
+		names[TagIds20.ID_DIRECTIVE_INCLUDE] = JSP11Namespace.ElementName.DIRECTIVE_INCLUDE;
+		names[TagIds20.ID_DIRECTIVE_TAGLIB] = JSP11Namespace.ElementName.DIRECTIVE_TAGLIB;
+		names[TagIds20.ID_USEBEAN] = JSP11Namespace.ElementName.USEBEAN;
+		names[TagIds20.ID_SETPROPERTY] = JSP11Namespace.ElementName.SETPROPERTY;
+		names[TagIds20.ID_GETPROPERTY] = JSP11Namespace.ElementName.GETPROPERTY;
+		names[TagIds20.ID_INCLUDE] = JSP11Namespace.ElementName.INCLUDE;
+		names[TagIds20.ID_FORWARD] = JSP11Namespace.ElementName.FORWARD;
+		names[TagIds20.ID_PLUGIN] = JSP11Namespace.ElementName.PLUGIN;
+		names[TagIds20.ID_PARAMS] = JSP11Namespace.ElementName.PARAMS;
+		names[TagIds20.ID_FALLBACK] = JSP11Namespace.ElementName.FALLBACK;
+		names[TagIds20.ID_PARAM] = JSP11Namespace.ElementName.PARAM;
+		names[TagIds20.ID_ROOT] = JSP11Namespace.ElementName.ROOT;
+		names[TagIds20.ID_TEXT] = JSP11Namespace.ElementName.TEXT;
 		names[TagIds20.ID_DIRECTIVE_VARIABLE] = JSP20Namespace.ElementName.DIRECTIVE_VARIABLE;
 		names[TagIds20.ID_DIRECTIVE_ATTRIBUTE] = JSP20Namespace.ElementName.DIRECTIVE_ATTRIBUTE;
 		names[TagIds20.ID_BODY] = JSP20Namespace.ElementName.BODY;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentproperties/HTMLContentProperties.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentproperties/HTMLContentProperties.java
index 4c7a41b..f76fd8e 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentproperties/HTMLContentProperties.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentproperties/HTMLContentProperties.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
+ * Copyright (c) 2006, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -172,7 +172,7 @@
 			IProject project = resource.getProject();
 			if (project != null) {
 				Preferences preferences = getPreferences(project, key, true);
-				if (value == null || value.trim().length() == 0)
+				if (value == null)
 					preferences.remove(getKeyFor(resource.getFullPath()));
 				else
 					preferences.put(getKeyFor(resource.getFullPath()), value);
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/EncodingGuesser.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/EncodingGuesser.java
index eb46433..7656fba 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/EncodingGuesser.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/EncodingGuesser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -97,6 +97,13 @@
 		return encoding;
 	}
 
+	public static boolean canGuess() {
+		// Currently, only Japanese is supported.
+		String system_ctype = java.util.Locale.getDefault().getLanguage();
+		String jp_ctype = java.util.Locale.JAPANESE.getLanguage();
+		return system_ctype.compareTo(jp_ctype) == 0;
+	}
+
 	/**
 	 * Return guessed Java Encoding name target: bytes to be inspected length:
 	 * length of target
@@ -104,10 +111,8 @@
 	public static String guessEncoding(byte[] target, int length) {
 		int code = UNKNOWN;
 
-		// Currently, only Japanese is supported.
-		String system_ctype = java.util.Locale.getDefault().getLanguage();
-		String jp_ctype = java.util.Locale.JAPANESE.getLanguage();
-		if (system_ctype.compareTo(jp_ctype) == 0) {
+		
+		if (canGuess()) {
 			// Ok, I'm under ja_JP.
 			code = ASCII;
 			int pos = 0;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java
index 1dbdf56..06d1052 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java
@@ -1,7 +1,7 @@
-/* The following code was generated by JFlex 1.2.2 on 7/28/08 5:19 PM */
+/* The following code was generated by JFlex 1.2.2 on 11/2/10 2:04 PM */
 
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,8 +24,8 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 7/28/08 5:19 PM from the specification file
- * <tt>file:/D:/workspaces/wtp301/workspace/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex</tt>
+ * on 11/2/10 2:04 PM from the specification file
+ * <tt>file:/C:/dev/workspaces/helios/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex</tt>
  */
 public class HTMLHeadTokenizer {
 
@@ -56,15 +56,16 @@
    * Translates characters to character classes
    */
   final private static String yycmap_packed = 
-    "\1\11\10\0\1\6\1\7\2\0\1\10\22\0\1\6\1\0\1\40"+
-    "\2\0\1\44\1\0\1\43\5\0\1\34\1\0\1\42\13\0\1\45"+
-    "\1\13\1\12\1\31\1\14\1\0\1\22\1\0\1\24\1\26\1\20"+
-    "\1\0\1\30\1\32\1\27\2\0\1\17\1\16\1\23\1\25\1\33"+
-    "\1\35\2\0\1\21\1\36\1\37\1\0\1\15\1\41\7\0\1\22"+
-    "\1\0\1\24\1\26\1\20\1\0\1\30\1\32\1\27\2\0\1\17"+
-    "\1\16\1\23\1\25\1\33\1\35\2\0\1\21\1\36\1\37\1\0"+
-    "\1\15\1\41\101\0\1\4\3\0\1\5\17\0\1\3\16\0\1\1"+
-    "\20\0\1\3\16\0\1\1\1\2\170\0\1\2\ufe87\0";
+    "\1\11\10\0\1\6\1\7\2\0\1\10\22\0\1\6\1\23\1\40"+
+    "\2\0\1\56\1\0\1\41\5\0\1\53\1\44\1\35\1\0\1\50"+
+    "\1\0\1\45\5\0\1\51\1\42\1\57\1\13\1\12\1\52\1\14"+
+    "\1\0\1\22\1\33\1\26\1\24\1\20\1\0\1\47\1\31\1\34"+
+    "\2\0\1\17\1\16\1\36\1\25\1\30\1\54\1\46\1\37\1\21"+
+    "\1\32\1\55\1\43\1\15\1\27\7\0\1\22\1\33\1\26\1\24"+
+    "\1\20\1\0\1\47\1\31\1\34\2\0\1\17\1\16\1\36\1\25"+
+    "\1\30\1\54\1\46\1\37\1\21\1\32\1\55\1\43\1\15\1\27"+
+    "\101\0\1\4\3\0\1\5\17\0\1\3\16\0\1\1\20\0\1\3"+
+    "\16\0\1\1\1\2\170\0\1\2\ufe87\0";
 
   /** 
    * Translates characters to character classes
@@ -116,7 +117,7 @@
   private int yy_endRead;
 
   /** number of newlines encountered up to the start of the matched text */
-//  private int yyline;
+  //private int yyline;
 
   /** the number of characters up to the start of the matched text */
   private int yychar;
@@ -125,7 +126,7 @@
    * the number of characters from the last newline up to the start of the 
    * matched text
    */
-//  private int yycolumn; 
+  //private int yycolumn; 
 
   /** 
    * yy_atBOL == true <=> the scanner is currently at the beginning of a line
@@ -142,12 +143,14 @@
 
 
 	private boolean hasMore = true;
+	private boolean hasCharsetAttr = false;
 	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
 	private String valueText = null;
 	boolean foundContentTypeValue = false;
+	private boolean isXHTML;
 
 
 
@@ -188,7 +191,7 @@
   		yy_endRead = 0;
 
   		/* number of newlines encountered up to the start of the matched text */
-//  		yyline = 0;
+  		// yyline = 0;
 
   		/* the number of characters up to the start of the matched text */
   		yychar = 0;
@@ -197,7 +200,7 @@
   		 * the number of characters from the last newline up to the start
   		 * of the matched text
   		 */
-//  		yycolumn = 0; 
+  		// yycolumn = 0; 
 
   		/** 
   		 * yy_atBOL == true <=> the scanner is currently at the beginning 
@@ -215,7 +218,9 @@
   		fStateStack.clear();
   		
   		hasMore = true;
-  		
+  		hasCharsetAttr = false;
+  		isXHTML = false;
+
 		// its a little wasteful to "throw away" first char array generated
 		// by class init (via auto generated code), but we really do want
 		// a small buffer for our head parsers.
@@ -229,8 +234,16 @@
 
 	public final HeadParserToken getNextToken() throws IOException {
 		String context = null;
-		context = primGetNextToken();
 		HeadParserToken result = null;
+		try {
+			context = primGetNextToken();
+		}
+		catch (IllegalStateException e) {
+			hasMore = false;
+			result = createToken(HTMLHeadTokenizerConstants.UNDEFINED, yychar, yytext());
+			while(yy_advance() != YYEOF) {}
+			return result;
+		}
 		if (valueText != null) {
 			result = createToken(context, yychar, valueText);
 			valueText = null;
@@ -247,6 +260,9 @@
 		fStateStack.push(yystate());
 
 	}
+	public final boolean hasCharsetAttr() {
+		return hasCharsetAttr;
+	}
 
 	private void popState() {
 		yybegin(fStateStack.pop());
@@ -255,7 +271,9 @@
 		return new HeadParserToken(context, start, text);
 	}
 	
-
+    public boolean isXHTML() {
+       return isXHTML;
+    }
 
 
   /**
@@ -288,7 +306,7 @@
     char [] map = new char[0x10000];
     int i = 0;  /* index in packed string  */
     int j = 0;  /* index in unpacked array */
-    while (i < 176) {
+    while (i < 192) {
       int  count = packed.charAt(i++);
       char value = packed.charAt(i++);
       do map[j++] = value; while (--count > 0);
@@ -347,7 +365,7 @@
     return yy_buffer[yy_currentPos++];
   }
 
-
+    
   /**
    * Closes the input stream.
    */
@@ -397,13 +415,14 @@
    */
   private void yy_ScanError(int errorCode) {
     try {
-      System.out.println(YY_ERROR_MSG[errorCode]);
+      IllegalStateException ise = new IllegalStateException("Instance: " + System.identityHashCode(this) + " offset:" + yychar + " state:" + yystate());
+      System.out.println(YY_ERROR_MSG[errorCode] + "\n" + ise);
+      throw ise;
     }
     catch (ArrayIndexOutOfBoundsException e) {
       System.out.println(YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
     }
 
-    System.exit(1);
   } 
 
 
@@ -473,7 +492,7 @@
 
       yy_forAction: {
         while (true) {
-
+    
           yy_input = yy_advance();
 
           if ( yy_input == YYEOF ) break yy_forAction;
@@ -519,21 +538,22 @@
             case 3:
               switch (yy_input) {
                 case 9: yy_isFinal = true; yy_state = 21; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 22; break yy_forNext;
-                case 26: yy_isFinal = true; yy_state = 23; break yy_forNext;
-                case 34: yy_isFinal = true; yy_state = 24; break yy_forNext;
+                case 22: yy_isFinal = true; yy_state = 22; break yy_forNext;
+                case 25: yy_isFinal = true; yy_state = 23; break yy_forNext;
+                case 29: yy_isFinal = true; yy_state = 24; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 25; break yy_forNext;
                 default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 9; break yy_forNext;
               }
 
             case 4:
               switch (yy_input) {
                 case 6: 
-                case 8: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 7: yy_isFinal = true; yy_state = 27; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 28; break yy_forNext;
-                case 32: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 35: yy_isFinal = true; yy_state = 30; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 27; break yy_forNext;
+                case 7: yy_isFinal = true; yy_state = 28; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 29; break yy_forNext;
+                case 32: yy_isFinal = true; yy_state = 30; break yy_forNext;
+                case 33: yy_isFinal = true; yy_state = 31; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
               }
 
             case 5:
@@ -541,12 +561,12 @@
                 case 7: 
                 case 8: 
                 case 11: 
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 34; break yy_forNext;
                 case 12: 
-                case 34: yy_isFinal = true; yy_state = 34; break yy_forNext;
-                case 32: yy_isFinal = true; yy_state = 35; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 31; break yy_forNext;
+                case 29: yy_isFinal = true; yy_state = 35; break yy_forNext;
+                case 32: yy_isFinal = true; yy_state = 36; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 32; break yy_forNext;
               }
 
             case 6:
@@ -554,28 +574,28 @@
                 case 7: 
                 case 8: 
                 case 11: 
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 34: yy_isFinal = true; yy_state = 34; break yy_forNext;
-                case 35: yy_isFinal = true; yy_state = 35; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 36; break yy_forNext;
-                case 36: yy_isFinal = true; yy_state = 37; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 31; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 29: yy_isFinal = true; yy_state = 35; break yy_forNext;
+                case 33: yy_isFinal = true; yy_state = 36; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 37; break yy_forNext;
+                case 46: yy_isFinal = true; yy_state = 38; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 32; break yy_forNext;
               }
 
             case 7:
               switch (yy_input) {
                 case 11: 
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 34: yy_isFinal = true; yy_state = 34; break yy_forNext;
-                case 12: yy_isFinal = true; yy_state = 37; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 29: yy_isFinal = true; yy_state = 35; break yy_forNext;
+                case 12: yy_isFinal = true; yy_state = 38; break yy_forNext;
                 case 6: 
                 case 7: 
-                case 8: yy_isFinal = true; yy_state = 38; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 39; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 39; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 40; break yy_forNext;
                 case 32: 
-                case 35: yy_isFinal = true; yy_state = 40; break yy_forNext;
-                case 37: yy_isFinal = true; yy_pushbackPos = yy_currentPos; yy_pushback = true; yy_state = 41; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 31; break yy_forNext;
+                case 33: yy_isFinal = true; yy_state = 41; break yy_forNext;
+                case 47: yy_isFinal = true; yy_pushbackPos = yy_currentPos; yy_pushback = true; yy_state = 42; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 32; break yy_forNext;
               }
 
             case 8:
@@ -583,38 +603,40 @@
                 case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 9; break yy_forNext;
                 case 6: 
                 case 7: 
-                case 8: yy_isFinal = true; yy_noLookAhead = true; yy_state = 31; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 42; break yy_forNext;
+                case 8: yy_isFinal = true; yy_noLookAhead = true; yy_state = 32; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 43; break yy_forNext;
               }
 
             case 10:
               switch (yy_input) {
-                case 2: yy_isFinal = true; yy_noLookAhead = true; yy_state = 43; break yy_forNext;
+                case 2: yy_isFinal = true; yy_noLookAhead = true; yy_state = 44; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 11:
               switch (yy_input) {
-                case 1: yy_isFinal = true; yy_noLookAhead = true; yy_state = 44; break yy_forNext;
+                case 1: yy_isFinal = true; yy_noLookAhead = true; yy_state = 45; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 12:
               switch (yy_input) {
-                case 4: yy_state = 45; break yy_forNext;
+                case 4: yy_state = 46; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 13:
               switch (yy_input) {
-                case 11: yy_state = 46; break yy_forNext;
+                case 11: yy_state = 47; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 14:
               switch (yy_input) {
-                case 9: yy_state = 47; break yy_forNext;
-                case 14: yy_state = 48; break yy_forNext;
+                case 9: yy_state = 48; break yy_forNext;
+                case 14: yy_state = 49; break yy_forNext;
+                case 19: yy_state = 50; break yy_forNext;
+                case 25: yy_state = 51; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -622,9 +644,9 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 49; break yy_forNext;
-                case 9: yy_state = 50; break yy_forNext;
-                case 11: yy_state = 51; break yy_forNext;
+                case 8: yy_state = 52; break yy_forNext;
+                case 9: yy_state = 53; break yy_forNext;
+                case 11: yy_state = 54; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -632,477 +654,501 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 49; break yy_forNext;
-                case 11: yy_state = 52; break yy_forNext;
+                case 8: yy_state = 52; break yy_forNext;
+                case 11: yy_state = 55; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 17:
               switch (yy_input) {
-                case 14: yy_state = 48; break yy_forNext;
-                case 9: yy_state = 53; break yy_forNext;
-                case 12: yy_state = 54; break yy_forNext;
+                case 14: yy_state = 49; break yy_forNext;
+                case 19: yy_state = 50; break yy_forNext;
+                case 25: yy_state = 51; break yy_forNext;
+                case 9: yy_state = 56; break yy_forNext;
+                case 12: yy_state = 57; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 18:
               switch (yy_input) {
-                case 12: yy_state = 55; break yy_forNext;
-                case 16: yy_state = 56; break yy_forNext;
+                case 12: yy_state = 58; break yy_forNext;
+                case 16: yy_state = 59; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 19:
               switch (yy_input) {
-                case 9: yy_state = 57; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 58; break yy_forNext;
+                case 9: yy_state = 60; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 61; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 20:
               switch (yy_input) {
-                case 9: yy_state = 59; break yy_forNext;
-                case 19: yy_state = 60; break yy_forNext;
+                case 9: yy_state = 62; break yy_forNext;
+                case 30: yy_state = 63; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 21:
               switch (yy_input) {
-                case 25: yy_isFinal = true; yy_state = 22; break yy_forNext;
-                case 26: yy_state = 61; break yy_forNext;
-                case 34: yy_state = 62; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 25; break yy_forNext;
+                case 22: yy_state = 64; break yy_forNext;
+                case 25: yy_state = 65; break yy_forNext;
+                case 29: yy_state = 66; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 22:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 63; break yy_forNext;
+                case 9: yy_state = 67; break yy_forNext;
+                case 25: yy_state = 68; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 23:
               switch (yy_input) {
-                case 9: yy_state = 64; break yy_forNext;
-                case 17: yy_state = 65; break yy_forNext;
+                case 9: yy_state = 69; break yy_forNext;
+                case 17: yy_state = 70; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 24:
               switch (yy_input) {
-                case 9: yy_state = 66; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 67; break yy_forNext;
+                case 9: yy_state = 71; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 72; break yy_forNext;
                 default: break yy_forAction;
               }
 
-            case 26:
+            case 25:
               switch (yy_input) {
-                case 6: 
-                case 8: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 7: yy_state = 68; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 69; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 73; break yy_forNext;
+                default: break yy_forAction;
               }
 
             case 27:
               switch (yy_input) {
                 case 6: 
-                case 8: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 7: yy_state = 68; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 69; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 27; break yy_forNext;
+                case 7: yy_state = 74; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 75; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
               }
 
             case 28:
               switch (yy_input) {
-                case 32: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 35: yy_isFinal = true; yy_state = 30; break yy_forNext;
                 case 6: 
-                case 7: 
-                case 8: yy_state = 68; break yy_forNext;
-                default: break yy_forAction;
+                case 8: yy_isFinal = true; yy_state = 27; break yy_forNext;
+                case 7: yy_state = 74; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 75; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
               }
 
             case 29:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 70; break yy_forNext;
+                case 32: yy_isFinal = true; yy_state = 30; break yy_forNext;
+                case 33: yy_isFinal = true; yy_state = 31; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 74; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 30:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 71; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 76; break yy_forNext;
                 default: break yy_forAction;
               }
 
-            case 32:
+            case 31:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 72; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 77; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 33:
               switch (yy_input) {
-                case 7: 
-                case 8: 
-                case 11: 
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 32: yy_isFinal = true; yy_state = 35; break yy_forNext;
-                case 12: 
-                case 34: yy_state = 73; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 78; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 34:
               switch (yy_input) {
-                case 9: yy_state = 74; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 75; break yy_forNext;
+                case 7: 
+                case 8: 
+                case 11: 
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 32: yy_isFinal = true; yy_state = 36; break yy_forNext;
+                case 12: 
+                case 29: yy_state = 79; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 35:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 76; break yy_forNext;
+                case 9: yy_state = 80; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 81; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 36:
               switch (yy_input) {
-                case 7: 
-                case 8: 
-                case 11: 
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 35: yy_isFinal = true; yy_state = 35; break yy_forNext;
-                case 34: yy_state = 73; break yy_forNext;
-                case 36: yy_state = 77; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 82; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 37:
               switch (yy_input) {
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 9: yy_state = 78; break yy_forNext;
+                case 7: 
+                case 8: 
+                case 11: 
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 33: yy_isFinal = true; yy_state = 36; break yy_forNext;
+                case 29: yy_state = 79; break yy_forNext;
+                case 46: yy_state = 83; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 38:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 79; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 9: yy_state = 84; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 39:
               switch (yy_input) {
-                case 11: 
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 38; break yy_forNext;
-                case 32: 
-                case 35: yy_isFinal = true; yy_state = 40; break yy_forNext;
-                case 34: yy_state = 73; break yy_forNext;
-                case 12: yy_state = 77; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 85; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 40:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 80; break yy_forNext;
+                case 11: 
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 39; break yy_forNext;
+                case 32: 
+                case 33: yy_isFinal = true; yy_state = 41; break yy_forNext;
+                case 29: yy_state = 79; break yy_forNext;
+                case 12: yy_state = 83; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 41:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 81; break yy_forNext;
-                case 9: yy_state = 82; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 86; break yy_forNext;
                 default: break yy_forAction;
               }
 
-            case 45:
+            case 42:
               switch (yy_input) {
-                case 5: yy_isFinal = true; yy_noLookAhead = true; yy_state = 83; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 87; break yy_forNext;
+                case 9: yy_state = 88; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 46:
               switch (yy_input) {
-                case 9: yy_state = 47; break yy_forNext;
-                case 14: yy_state = 48; break yy_forNext;
+                case 5: yy_isFinal = true; yy_noLookAhead = true; yy_state = 89; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 47:
               switch (yy_input) {
-                case 14: yy_state = 48; break yy_forNext;
+                case 9: yy_state = 48; break yy_forNext;
+                case 14: yy_state = 49; break yy_forNext;
+                case 19: yy_state = 50; break yy_forNext;
+                case 25: yy_state = 51; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 48:
               switch (yy_input) {
-                case 9: yy_state = 84; break yy_forNext;
-                case 16: yy_state = 85; break yy_forNext;
+                case 14: yy_state = 49; break yy_forNext;
+                case 19: yy_state = 50; break yy_forNext;
+                case 25: yy_state = 51; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 49:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 49; break yy_forNext;
-                case 9: yy_state = 50; break yy_forNext;
-                case 11: yy_state = 51; break yy_forNext;
+                case 9: yy_state = 90; break yy_forNext;
+                case 16: yy_state = 91; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 50:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 49; break yy_forNext;
-                case 11: yy_state = 51; break yy_forNext;
-                case 9: yy_state = 86; break yy_forNext;
+                case 9: yy_state = 92; break yy_forNext;
+                case 20: yy_state = 93; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 51:
               switch (yy_input) {
-                case 12: yy_state = 54; break yy_forNext;
-                case 9: yy_state = 87; break yy_forNext;
+                case 9: yy_state = 94; break yy_forNext;
+                case 17: yy_state = 95; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 52:
               switch (yy_input) {
-                case 14: yy_state = 48; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 52; break yy_forNext;
                 case 9: yy_state = 53; break yy_forNext;
-                case 12: yy_state = 54; break yy_forNext;
+                case 11: yy_state = 54; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 53:
               switch (yy_input) {
-                case 14: yy_state = 48; break yy_forNext;
-                case 12: yy_state = 54; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 52; break yy_forNext;
+                case 11: yy_state = 54; break yy_forNext;
+                case 9: yy_state = 96; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 54:
               switch (yy_input) {
-                case 9: yy_state = 88; break yy_forNext;
-                case 13: yy_state = 89; break yy_forNext;
+                case 12: yy_state = 57; break yy_forNext;
+                case 9: yy_state = 97; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 55:
               switch (yy_input) {
-                case 9: yy_state = 57; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 58; break yy_forNext;
+                case 14: yy_state = 49; break yy_forNext;
+                case 19: yy_state = 50; break yy_forNext;
+                case 25: yy_state = 51; break yy_forNext;
+                case 9: yy_state = 56; break yy_forNext;
+                case 12: yy_state = 57; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 56:
               switch (yy_input) {
-                case 9: yy_state = 59; break yy_forNext;
-                case 19: yy_state = 60; break yy_forNext;
+                case 14: yy_state = 49; break yy_forNext;
+                case 19: yy_state = 50; break yy_forNext;
+                case 25: yy_state = 51; break yy_forNext;
+                case 12: yy_state = 57; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 57:
               switch (yy_input) {
-                case 25: yy_isFinal = true; yy_state = 58; break yy_forNext;
+                case 9: yy_state = 98; break yy_forNext;
+                case 13: yy_state = 99; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 58:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 90; break yy_forNext;
+                case 9: yy_state = 60; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 61; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 59:
               switch (yy_input) {
-                case 19: yy_state = 60; break yy_forNext;
+                case 9: yy_state = 62; break yy_forNext;
+                case 30: yy_state = 63; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 60:
               switch (yy_input) {
-                case 9: yy_state = 91; break yy_forNext;
-                case 20: yy_state = 92; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 61; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 61:
               switch (yy_input) {
-                case 9: yy_state = 64; break yy_forNext;
-                case 17: yy_state = 65; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 100; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 62:
               switch (yy_input) {
-                case 9: yy_state = 66; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 67; break yy_forNext;
+                case 30: yy_state = 63; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 63:
+              switch (yy_input) {
+                case 9: yy_state = 101; break yy_forNext;
+                case 22: yy_state = 102; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 64:
               switch (yy_input) {
-                case 17: yy_state = 65; break yy_forNext;
+                case 9: yy_state = 67; break yy_forNext;
+                case 25: yy_state = 68; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 65:
               switch (yy_input) {
-                case 9: yy_state = 93; break yy_forNext;
-                case 17: yy_state = 94; break yy_forNext;
+                case 9: yy_state = 69; break yy_forNext;
+                case 17: yy_state = 70; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 66:
               switch (yy_input) {
-                case 25: yy_isFinal = true; yy_state = 67; break yy_forNext;
+                case 9: yy_state = 71; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 72; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 67:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 95; break yy_forNext;
+                case 25: yy_state = 68; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 68:
               switch (yy_input) {
-                case 6: 
-                case 8: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 7: yy_state = 68; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 69; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
+                case 9: yy_state = 103; break yy_forNext;
+                case 18: yy_state = 104; break yy_forNext;
+                default: break yy_forAction;
               }
 
             case 69:
               switch (yy_input) {
-                case 6: 
-                case 8: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 7: yy_state = 68; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 96; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
+                case 17: yy_state = 70; break yy_forNext;
+                default: break yy_forAction;
               }
 
-            case 73:
+            case 70:
               switch (yy_input) {
-                case 9: yy_state = 74; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 75; break yy_forNext;
+                case 9: yy_state = 105; break yy_forNext;
+                case 17: yy_state = 106; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 71:
+              switch (yy_input) {
+                case 42: yy_isFinal = true; yy_state = 72; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 72:
+              switch (yy_input) {
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 107; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 74:
               switch (yy_input) {
-                case 25: yy_isFinal = true; yy_state = 75; break yy_forNext;
-                default: break yy_forAction;
+                case 6: 
+                case 8: yy_isFinal = true; yy_state = 27; break yy_forNext;
+                case 7: yy_state = 74; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 75; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
               }
 
             case 75:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 97; break yy_forNext;
+                case 6: 
+                case 8: yy_isFinal = true; yy_state = 27; break yy_forNext;
+                case 7: yy_state = 74; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 108; break yy_forNext;
+                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
+              }
+
+            case 79:
+              switch (yy_input) {
+                case 9: yy_state = 80; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 81; break yy_forNext;
                 default: break yy_forAction;
               }
 
-            case 77:
+            case 80:
               switch (yy_input) {
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 9: yy_state = 78; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 78:
-              switch (yy_input) {
-                case 25: yy_isFinal = true; yy_state = 32; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 81; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 81:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 81; break yy_forNext;
-                case 9: yy_isFinal = true; yy_pushback = true; yy_state = 98; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 109; break yy_forNext;
                 default: break yy_forAction;
               }
 
-            case 82:
+            case 83:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 81; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
+                case 9: yy_state = 84; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 84:
               switch (yy_input) {
-                case 16: yy_state = 85; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 85:
-              switch (yy_input) {
-                case 9: yy_state = 99; break yy_forNext;
-                case 17: yy_state = 100; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 86:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 49; break yy_forNext;
-                case 11: yy_state = 51; break yy_forNext;
+                case 42: yy_isFinal = true; yy_state = 33; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 87:
               switch (yy_input) {
-                case 12: yy_state = 54; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 87; break yy_forNext;
+                case 9: yy_isFinal = true; yy_pushback = true; yy_state = 110; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 88:
               switch (yy_input) {
-                case 13: yy_state = 89; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 87; break yy_forNext;
                 default: break yy_forAction;
               }
 
-            case 89:
+            case 90:
               switch (yy_input) {
-                case 9: yy_state = 101; break yy_forNext;
-                case 14: yy_state = 102; break yy_forNext;
+                case 16: yy_state = 91; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 91:
               switch (yy_input) {
-                case 20: yy_state = 92; break yy_forNext;
+                case 9: yy_state = 111; break yy_forNext;
+                case 17: yy_state = 112; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 92:
               switch (yy_input) {
-                case 9: yy_state = 103; break yy_forNext;
-                case 21: yy_state = 104; break yy_forNext;
+                case 20: yy_state = 93; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 93:
               switch (yy_input) {
-                case 17: yy_state = 94; break yy_forNext;
+                case 9: yy_state = 113; break yy_forNext;
+                case 21: yy_state = 114; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 94:
               switch (yy_input) {
-                case 9: yy_state = 105; break yy_forNext;
-                case 27: yy_state = 106; break yy_forNext;
+                case 17: yy_state = 95; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 95:
+              switch (yy_input) {
+                case 9: yy_state = 115; break yy_forNext;
+                case 14: yy_state = 116; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1110,86 +1156,74 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 68; break yy_forNext;
+                case 8: yy_state = 52; break yy_forNext;
+                case 11: yy_state = 54; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 97:
+              switch (yy_input) {
+                case 12: yy_state = 57; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 98:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 81; break yy_forNext;
-                case 9: yy_state = 82; break yy_forNext;
+                case 13: yy_state = 99; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 99:
               switch (yy_input) {
-                case 17: yy_state = 100; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 100:
-              switch (yy_input) {
-                case 9: yy_state = 107; break yy_forNext;
-                case 18: yy_isFinal = true; yy_state = 108; break yy_forNext;
+                case 9: yy_state = 117; break yy_forNext;
+                case 14: yy_state = 118; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 101:
               switch (yy_input) {
-                case 14: yy_state = 102; break yy_forNext;
+                case 22: yy_state = 102; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 102:
               switch (yy_input) {
-                case 9: yy_state = 109; break yy_forNext;
-                case 15: yy_state = 110; break yy_forNext;
+                case 9: yy_state = 119; break yy_forNext;
+                case 21: yy_state = 120; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 103:
               switch (yy_input) {
-                case 21: yy_state = 104; break yy_forNext;
+                case 18: yy_state = 104; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 104:
               switch (yy_input) {
-                case 9: yy_state = 111; break yy_forNext;
-                case 22: yy_state = 112; break yy_forNext;
+                case 9: yy_state = 121; break yy_forNext;
+                case 38: yy_state = 122; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 105:
               switch (yy_input) {
-                case 27: yy_state = 106; break yy_forNext;
+                case 17: yy_state = 106; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 106:
               switch (yy_input) {
-                case 9: yy_state = 113; break yy_forNext;
-                case 28: yy_state = 114; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 107:
-              switch (yy_input) {
-                case 18: yy_isFinal = true; yy_state = 108; break yy_forNext;
+                case 9: yy_state = 123; break yy_forNext;
+                case 24: yy_state = 124; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 108:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 115; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 109:
-              switch (yy_input) {
-                case 15: yy_state = 110; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 74; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1197,150 +1231,146 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
-                case 9: yy_state = 117; break yy_forNext;
+                case 8: yy_isFinal = true; yy_pushback = true; yy_state = 87; break yy_forNext;
+                case 9: yy_state = 88; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 111:
               switch (yy_input) {
-                case 22: yy_state = 112; break yy_forNext;
+                case 17: yy_state = 112; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 112:
               switch (yy_input) {
-                case 9: yy_state = 118; break yy_forNext;
-                case 23: yy_state = 119; break yy_forNext;
+                case 9: yy_state = 125; break yy_forNext;
+                case 18: yy_isFinal = true; yy_state = 126; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 113:
               switch (yy_input) {
-                case 28: yy_state = 114; break yy_forNext;
+                case 21: yy_state = 114; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 114:
               switch (yy_input) {
-                case 9: yy_state = 120; break yy_forNext;
-                case 16: yy_state = 121; break yy_forNext;
+                case 9: yy_state = 127; break yy_forNext;
+                case 22: yy_state = 128; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 115:
+              switch (yy_input) {
+                case 14: yy_state = 116; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 116:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 122; break yy_forNext;
+                case 9: yy_state = 129; break yy_forNext;
+                case 15: yy_state = 130; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 117:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
-                case 9: yy_state = 123; break yy_forNext;
+                case 14: yy_state = 118; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 118:
               switch (yy_input) {
-                case 23: yy_state = 119; break yy_forNext;
+                case 9: yy_state = 131; break yy_forNext;
+                case 15: yy_state = 132; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 119:
               switch (yy_input) {
-                case 9: yy_state = 124; break yy_forNext;
-                case 19: yy_state = 125; break yy_forNext;
+                case 21: yy_state = 120; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 120:
               switch (yy_input) {
-                case 16: yy_state = 121; break yy_forNext;
+                case 9: yy_state = 133; break yy_forNext;
+                case 20: yy_state = 134; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 121:
               switch (yy_input) {
-                case 9: yy_state = 126; break yy_forNext;
-                case 29: yy_state = 127; break yy_forNext;
+                case 38: yy_state = 122; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 122:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
-                case 9: yy_state = 123; break yy_forNext;
+                case 9: yy_state = 135; break yy_forNext;
+                case 31: yy_state = 136; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 123:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
+                case 24: yy_state = 124; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 124:
               switch (yy_input) {
-                case 19: yy_state = 125; break yy_forNext;
+                case 9: yy_state = 137; break yy_forNext;
+                case 43: yy_state = 138; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 125:
               switch (yy_input) {
-                case 9: yy_state = 128; break yy_forNext;
-                case 24: yy_state = 129; break yy_forNext;
+                case 18: yy_isFinal = true; yy_state = 126; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 126:
               switch (yy_input) {
-                case 29: yy_state = 127; break yy_forNext;
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 139; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 127:
               switch (yy_input) {
-                case 9: yy_state = 130; break yy_forNext;
-                case 30: yy_state = 131; break yy_forNext;
+                case 22: yy_state = 128; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 128:
               switch (yy_input) {
-                case 24: yy_state = 129; break yy_forNext;
+                case 9: yy_state = 140; break yy_forNext;
+                case 17: yy_state = 141; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 129:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 129; break yy_forNext;
-                case 9: yy_state = 132; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 133; break yy_forNext;
+                case 15: yy_state = 130; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 130:
               switch (yy_input) {
-                case 30: yy_state = 131; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 130; break yy_forNext;
+                case 9: yy_state = 142; break yy_forNext;
+                case 13: yy_state = 143; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 131:
               switch (yy_input) {
-                case 9: yy_state = 134; break yy_forNext;
-                case 23: yy_state = 135; break yy_forNext;
+                case 15: yy_state = 132; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1348,82 +1378,60 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 129; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 133; break yy_forNext;
-                case 9: yy_state = 136; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 144; break yy_forNext;
+                case 9: yy_state = 145; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 133:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 137; break yy_forNext;
-                case 9: yy_state = 138; break yy_forNext;
+                case 20: yy_state = 134; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 134:
               switch (yy_input) {
-                case 23: yy_state = 135; break yy_forNext;
+                case 9: yy_state = 146; break yy_forNext;
+                case 28: yy_state = 147; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 135:
               switch (yy_input) {
-                case 9: yy_state = 139; break yy_forNext;
-                case 31: yy_state = 140; break yy_forNext;
+                case 31: yy_state = 136; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 136:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 129; break yy_forNext;
+                case 9: yy_state = 148; break yy_forNext;
+                case 16: yy_state = 149; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 137:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_state = 133; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 137; break yy_forNext;
+                case 43: yy_state = 138; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 138:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 137; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 139:
-              switch (yy_input) {
-                case 31: yy_state = 140; break yy_forNext;
+                case 9: yy_state = 150; break yy_forNext;
+                case 16: yy_state = 151; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 140:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 140; break yy_forNext;
-                case 9: yy_state = 141; break yy_forNext;
-                case 10: yy_state = 142; break yy_forNext;
+                case 17: yy_state = 141; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 141:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 140; break yy_forNext;
-                case 10: yy_state = 142; break yy_forNext;
-                case 9: yy_state = 143; break yy_forNext;
+                case 9: yy_state = 152; break yy_forNext;
+                case 23: yy_state = 153; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1431,29 +1439,25 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 144; break yy_forNext;
-                case 9: yy_state = 145; break yy_forNext;
-                case 20: yy_state = 146; break yy_forNext;
-                case 32: yy_state = 147; break yy_forNext;
+                case 8: yy_state = 130; break yy_forNext;
+                case 13: yy_state = 143; break yy_forNext;
+                case 9: yy_state = 154; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 143:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 140; break yy_forNext;
+                case 9: yy_state = 155; break yy_forNext;
+                case 14: yy_state = 156; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 144:
               switch (yy_input) {
-                case 9: yy_state = 142; break yy_forNext;
                 case 6: 
                 case 7: 
-                case 8: yy_state = 144; break yy_forNext;
-                case 20: yy_state = 146; break yy_forNext;
-                case 32: yy_state = 147; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 144; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 157; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1461,173 +1465,183 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 144; break yy_forNext;
-                case 20: yy_state = 146; break yy_forNext;
-                case 32: yy_state = 147; break yy_forNext;
-                case 9: yy_state = 148; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 144; break yy_forNext;
+                case 9: yy_state = 158; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 146:
               switch (yy_input) {
-                case 9: yy_state = 149; break yy_forNext;
-                case 21: yy_state = 150; break yy_forNext;
+                case 28: yy_state = 147; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 147:
               switch (yy_input) {
-                case 20: yy_state = 146; break yy_forNext;
-                case 9: yy_state = 148; break yy_forNext;
+                case 9: yy_state = 159; break yy_forNext;
+                case 30: yy_state = 160; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 148:
               switch (yy_input) {
-                case 20: yy_state = 146; break yy_forNext;
-                case 9: yy_state = 151; break yy_forNext;
+                case 16: yy_state = 149; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 149:
               switch (yy_input) {
-                case 21: yy_state = 150; break yy_forNext;
+                case 9: yy_state = 161; break yy_forNext;
+                case 17: yy_state = 162; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 150:
               switch (yy_input) {
-                case 9: yy_state = 152; break yy_forNext;
-                case 19: yy_state = 153; break yy_forNext;
+                case 16: yy_state = 151; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 151:
               switch (yy_input) {
-                case 20: yy_state = 146; break yy_forNext;
+                case 9: yy_state = 163; break yy_forNext;
+                case 44: yy_state = 164; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 152:
               switch (yy_input) {
-                case 19: yy_state = 153; break yy_forNext;
+                case 23: yy_state = 153; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 153:
               switch (yy_input) {
-                case 9: yy_state = 154; break yy_forNext;
-                case 17: yy_state = 155; break yy_forNext;
+                case 9: yy_state = 165; break yy_forNext;
+                case 24: yy_state = 166; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 154:
               switch (yy_input) {
-                case 17: yy_state = 155; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 130; break yy_forNext;
+                case 13: yy_state = 143; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 155:
               switch (yy_input) {
-                case 9: yy_state = 156; break yy_forNext;
-                case 16: yy_state = 157; break yy_forNext;
+                case 14: yy_state = 156; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 156:
               switch (yy_input) {
-                case 16: yy_state = 157; break yy_forNext;
+                case 9: yy_state = 167; break yy_forNext;
+                case 15: yy_state = 168; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 157:
               switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 144; break yy_forNext;
                 case 9: yy_state = 158; break yy_forNext;
-                case 19: yy_state = 159; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 158:
               switch (yy_input) {
-                case 19: yy_state = 159; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 144; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 159:
               switch (yy_input) {
-                case 9: yy_state = 160; break yy_forNext;
-                case 17: yy_state = 161; break yy_forNext;
+                case 30: yy_state = 160; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 160:
               switch (yy_input) {
-                case 17: yy_state = 161; break yy_forNext;
+                case 9: yy_state = 169; break yy_forNext;
+                case 39: yy_state = 170; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 161:
               switch (yy_input) {
-                case 9: yy_state = 162; break yy_forNext;
-                case 28: yy_state = 163; break yy_forNext;
+                case 17: yy_state = 162; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 162:
               switch (yy_input) {
-                case 28: yy_state = 163; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 162; break yy_forNext;
+                case 9: yy_state = 171; break yy_forNext;
+                case 10: yy_isFinal = true; yy_state = 172; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 163:
               switch (yy_input) {
-                case 9: yy_state = 164; break yy_forNext;
-                case 17: yy_state = 165; break yy_forNext;
+                case 44: yy_state = 164; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 164:
               switch (yy_input) {
-                case 17: yy_state = 165; break yy_forNext;
+                case 9: yy_state = 173; break yy_forNext;
+                case 26: yy_state = 174; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 165:
               switch (yy_input) {
-                case 9: yy_state = 166; break yy_forNext;
-                case 33: yy_state = 167; break yy_forNext;
+                case 24: yy_state = 166; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 166:
               switch (yy_input) {
-                case 33: yy_state = 167; break yy_forNext;
+                case 9: yy_state = 175; break yy_forNext;
+                case 16: yy_state = 176; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 167:
               switch (yy_input) {
-                case 9: yy_state = 168; break yy_forNext;
-                case 27: yy_state = 169; break yy_forNext;
+                case 15: yy_state = 168; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 168:
               switch (yy_input) {
-                case 27: yy_state = 169; break yy_forNext;
+                case 9: yy_state = 177; break yy_forNext;
+                case 30: yy_state = 178; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 169:
               switch (yy_input) {
-                case 9: yy_state = 170; break yy_forNext;
-                case 16: yy_state = 171; break yy_forNext;
+                case 39: yy_state = 170; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 170:
               switch (yy_input) {
-                case 16: yy_state = 171; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 170; break yy_forNext;
+                case 9: yy_state = 179; break yy_forNext;
+                case 10: yy_isFinal = true; yy_state = 180; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1635,9 +1649,9 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 172; break yy_forNext;
-                case 9: yy_state = 173; break yy_forNext;
-                case 32: yy_state = 174; break yy_forNext;
+                case 8: yy_state = 162; break yy_forNext;
+                case 10: yy_isFinal = true; yy_state = 172; break yy_forNext;
+                case 9: yy_state = 181; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1645,76 +1659,69 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 172; break yy_forNext;
-                case 9: yy_state = 175; break yy_forNext;
-                case 20: yy_state = 176; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 182; break yy_forNext;
+                case 9: yy_state = 183; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 173:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 172; break yy_forNext;
-                case 32: yy_state = 174; break yy_forNext;
-                case 9: yy_state = 177; break yy_forNext;
+                case 26: yy_state = 174; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 174:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 172; break yy_forNext;
-                case 9: yy_state = 177; break yy_forNext;
+                case 9: yy_state = 184; break yy_forNext;
+                case 28: yy_state = 185; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 175:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 172; break yy_forNext;
-                case 20: yy_state = 176; break yy_forNext;
-                case 9: yy_state = 178; break yy_forNext;
+                case 16: yy_state = 176; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 176:
               switch (yy_input) {
-                case 9: yy_state = 179; break yy_forNext;
-                case 21: yy_state = 180; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 176; break yy_forNext;
+                case 9: yy_state = 186; break yy_forNext;
+                case 25: yy_state = 187; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 177:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 172; break yy_forNext;
-                case 9: yy_state = 181; break yy_forNext;
+                case 30: yy_state = 178; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 178:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 172; break yy_forNext;
-                case 20: yy_state = 176; break yy_forNext;
+                case 9: yy_state = 188; break yy_forNext;
+                case 31: yy_state = 189; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 179:
               switch (yy_input) {
-                case 21: yy_state = 180; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 170; break yy_forNext;
+                case 10: yy_isFinal = true; yy_state = 180; break yy_forNext;
+                case 9: yy_state = 190; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 180:
               switch (yy_input) {
-                case 9: yy_state = 182; break yy_forNext;
-                case 19: yy_state = 183; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 191; break yy_forNext;
+                case 9: yy_state = 192; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1722,75 +1729,87 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 172; break yy_forNext;
+                case 8: yy_state = 162; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 182:
               switch (yy_input) {
-                case 19: yy_state = 183; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 172; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 182; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 183:
               switch (yy_input) {
-                case 9: yy_state = 184; break yy_forNext;
-                case 17: yy_state = 185; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 182; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 184:
               switch (yy_input) {
-                case 17: yy_state = 185; break yy_forNext;
+                case 28: yy_state = 185; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 185:
               switch (yy_input) {
-                case 9: yy_state = 186; break yy_forNext;
-                case 16: yy_state = 187; break yy_forNext;
+                case 9: yy_state = 193; break yy_forNext;
+                case 45: yy_state = 194; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 186:
               switch (yy_input) {
-                case 16: yy_state = 187; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 176; break yy_forNext;
+                case 25: yy_state = 187; break yy_forNext;
+                case 9: yy_state = 195; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 187:
               switch (yy_input) {
-                case 9: yy_state = 188; break yy_forNext;
-                case 19: yy_state = 189; break yy_forNext;
+                case 9: yy_state = 196; break yy_forNext;
+                case 17: yy_state = 197; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 188:
               switch (yy_input) {
-                case 19: yy_state = 189; break yy_forNext;
+                case 31: yy_state = 189; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 189:
               switch (yy_input) {
-                case 9: yy_state = 190; break yy_forNext;
-                case 17: yy_state = 191; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 189; break yy_forNext;
+                case 9: yy_state = 198; break yy_forNext;
+                case 10: yy_state = 199; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 190:
               switch (yy_input) {
-                case 17: yy_state = 191; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 170; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 191:
               switch (yy_input) {
+                case 9: yy_isFinal = true; yy_state = 180; break yy_forNext;
                 case 6: 
                 case 7: 
-                case 8: yy_state = 191; break yy_forNext;
-                case 9: yy_state = 192; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 193; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 191; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1798,18 +1817,13 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 191; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 193; break yy_forNext;
-                case 9: yy_state = 194; break yy_forNext;
+                case 8: yy_isFinal = true; yy_state = 191; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 193:
               switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 195; break yy_forNext;
-                case 9: yy_state = 196; break yy_forNext;
+                case 45: yy_state = 194; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1817,24 +1831,1211 @@
               switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_state = 191; break yy_forNext;
+                case 8: yy_state = 194; break yy_forNext;
+                case 9: yy_state = 200; break yy_forNext;
+                case 10: yy_state = 201; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 195:
               switch (yy_input) {
-                case 9: yy_isFinal = true; yy_state = 193; break yy_forNext;
                 case 6: 
                 case 7: 
-                case 8: yy_isFinal = true; yy_state = 195; break yy_forNext;
+                case 8: yy_state = 176; break yy_forNext;
+                case 25: yy_state = 187; break yy_forNext;
                 default: break yy_forAction;
               }
 
             case 196:
               switch (yy_input) {
+                case 17: yy_state = 197; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 197:
+              switch (yy_input) {
+                case 9: yy_state = 202; break yy_forNext;
+                case 14: yy_state = 203; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 198:
+              switch (yy_input) {
                 case 6: 
                 case 7: 
-                case 8: yy_isFinal = true; yy_state = 195; break yy_forNext;
+                case 8: yy_state = 189; break yy_forNext;
+                case 10: yy_state = 199; break yy_forNext;
+                case 9: yy_state = 204; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 199:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 199; break yy_forNext;
+                case 9: yy_state = 205; break yy_forNext;
+                case 32: 
+                case 33: yy_state = 206; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 200:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 194; break yy_forNext;
+                case 10: yy_state = 201; break yy_forNext;
+                case 9: yy_state = 207; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 201:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 208; break yy_forNext;
+                case 9: yy_state = 209; break yy_forNext;
+                case 22: yy_state = 210; break yy_forNext;
+                case 32: yy_state = 211; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 202:
+              switch (yy_input) {
+                case 14: yy_state = 203; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 203:
+              switch (yy_input) {
+                case 9: yy_state = 212; break yy_forNext;
+                case 15: yy_state = 213; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 204:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 189; break yy_forNext;
+                case 10: yy_state = 199; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 205:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 199; break yy_forNext;
+                case 32: 
+                case 33: yy_state = 206; break yy_forNext;
+                case 9: yy_state = 214; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 206:
+              switch (yy_input) {
+                case 9: yy_state = 215; break yy_forNext;
+                case 25: yy_state = 216; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 207:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 194; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 208:
+              switch (yy_input) {
+                case 9: yy_state = 201; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_state = 208; break yy_forNext;
+                case 22: yy_state = 210; break yy_forNext;
+                case 32: yy_state = 211; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 209:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 208; break yy_forNext;
+                case 22: yy_state = 210; break yy_forNext;
+                case 32: yy_state = 211; break yy_forNext;
+                case 9: yy_state = 217; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 210:
+              switch (yy_input) {
+                case 9: yy_state = 218; break yy_forNext;
+                case 21: yy_state = 219; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 211:
+              switch (yy_input) {
+                case 22: yy_state = 210; break yy_forNext;
+                case 9: yy_state = 217; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 212:
+              switch (yy_input) {
+                case 15: yy_state = 213; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 213:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 213; break yy_forNext;
+                case 9: yy_state = 220; break yy_forNext;
+                case 24: yy_state = 221; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 214:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 199; break yy_forNext;
+                case 32: 
+                case 33: yy_state = 206; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 215:
+              switch (yy_input) {
+                case 25: yy_state = 216; break yy_forNext;
+                case 9: yy_state = 222; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 216:
+              switch (yy_input) {
+                case 9: yy_state = 223; break yy_forNext;
+                case 17: yy_state = 224; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 217:
+              switch (yy_input) {
+                case 22: yy_state = 210; break yy_forNext;
+                case 9: yy_state = 225; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 218:
+              switch (yy_input) {
+                case 21: yy_state = 219; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 219:
+              switch (yy_input) {
+                case 9: yy_state = 226; break yy_forNext;
+                case 30: yy_state = 227; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 220:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 213; break yy_forNext;
+                case 24: yy_state = 221; break yy_forNext;
+                case 9: yy_state = 228; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 221:
+              switch (yy_input) {
+                case 9: yy_state = 229; break yy_forNext;
+                case 26: yy_state = 230; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 222:
+              switch (yy_input) {
+                case 25: yy_state = 216; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 223:
+              switch (yy_input) {
+                case 17: yy_state = 224; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 224:
+              switch (yy_input) {
+                case 9: yy_state = 231; break yy_forNext;
+                case 17: yy_state = 232; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 225:
+              switch (yy_input) {
+                case 22: yy_state = 210; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 226:
+              switch (yy_input) {
+                case 30: yy_state = 227; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 227:
+              switch (yy_input) {
+                case 9: yy_state = 233; break yy_forNext;
+                case 17: yy_state = 234; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 228:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 213; break yy_forNext;
+                case 24: yy_state = 221; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 229:
+              switch (yy_input) {
+                case 26: yy_state = 230; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 230:
+              switch (yy_input) {
+                case 9: yy_state = 235; break yy_forNext;
+                case 27: yy_state = 236; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 231:
+              switch (yy_input) {
+                case 17: yy_state = 232; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 232:
+              switch (yy_input) {
+                case 9: yy_state = 237; break yy_forNext;
+                case 24: yy_state = 238; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 233:
+              switch (yy_input) {
+                case 17: yy_state = 234; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 234:
+              switch (yy_input) {
+                case 9: yy_state = 239; break yy_forNext;
+                case 16: yy_state = 240; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 235:
+              switch (yy_input) {
+                case 27: yy_state = 236; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 236:
+              switch (yy_input) {
+                case 9: yy_state = 241; break yy_forNext;
+                case 15: yy_state = 242; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 237:
+              switch (yy_input) {
+                case 24: yy_state = 238; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 238:
+              switch (yy_input) {
+                case 9: yy_state = 243; break yy_forNext;
+                case 34: yy_state = 244; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 239:
+              switch (yy_input) {
+                case 16: yy_state = 240; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 240:
+              switch (yy_input) {
+                case 9: yy_state = 245; break yy_forNext;
+                case 30: yy_state = 246; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 241:
+              switch (yy_input) {
+                case 15: yy_state = 242; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 242:
+              switch (yy_input) {
+                case 9: yy_state = 247; break yy_forNext;
+                case 28: yy_state = 248; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 243:
+              switch (yy_input) {
+                case 34: yy_state = 244; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 244:
+              switch (yy_input) {
+                case 9: yy_state = 249; break yy_forNext;
+                case 29: yy_state = 250; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 245:
+              switch (yy_input) {
+                case 30: yy_state = 246; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 246:
+              switch (yy_input) {
+                case 9: yy_state = 251; break yy_forNext;
+                case 17: yy_state = 252; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 247:
+              switch (yy_input) {
+                case 28: yy_state = 248; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 248:
+              switch (yy_input) {
+                case 9: yy_state = 253; break yy_forNext;
+                case 22: yy_state = 254; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 249:
+              switch (yy_input) {
+                case 29: yy_state = 250; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 250:
+              switch (yy_input) {
+                case 9: yy_state = 255; break yy_forNext;
+                case 29: yy_state = 256; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 251:
+              switch (yy_input) {
+                case 17: yy_state = 252; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 252:
+              switch (yy_input) {
+                case 9: yy_state = 257; break yy_forNext;
+                case 43: yy_state = 258; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 253:
+              switch (yy_input) {
+                case 22: yy_state = 254; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 254:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 255:
+              switch (yy_input) {
+                case 29: yy_state = 256; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 256:
+              switch (yy_input) {
+                case 9: yy_state = 260; break yy_forNext;
+                case 35: yy_state = 261; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 257:
+              switch (yy_input) {
+                case 43: yy_state = 258; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 258:
+              switch (yy_input) {
+                case 9: yy_state = 262; break yy_forNext;
+                case 17: yy_state = 263; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 259:
+              switch (yy_input) {
+                case 9: yy_state = 264; break yy_forNext;
+                case 29: yy_state = 265; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 260:
+              switch (yy_input) {
+                case 35: yy_state = 261; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 261:
+              switch (yy_input) {
+                case 9: yy_state = 266; break yy_forNext;
+                case 35: yy_state = 267; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 262:
+              switch (yy_input) {
+                case 17: yy_state = 263; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 263:
+              switch (yy_input) {
+                case 9: yy_state = 268; break yy_forNext;
+                case 23: yy_state = 269; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 264:
+              switch (yy_input) {
+                case 29: yy_state = 265; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 265:
+              switch (yy_input) {
+                case 29: yy_state = 265; break yy_forNext;
+                case 9: yy_state = 270; break yy_forNext;
+                case 20: yy_state = 271; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 266:
+              switch (yy_input) {
+                case 35: yy_state = 267; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 267:
+              switch (yy_input) {
+                case 9: yy_state = 272; break yy_forNext;
+                case 35: yy_state = 273; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 268:
+              switch (yy_input) {
+                case 23: yy_state = 269; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 269:
+              switch (yy_input) {
+                case 9: yy_state = 274; break yy_forNext;
+                case 24: yy_state = 275; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 270:
+              switch (yy_input) {
+                case 29: yy_state = 265; break yy_forNext;
+                case 20: yy_state = 271; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 271:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_state = 276; break yy_forNext;
+                case 17: yy_state = 277; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 272:
+              switch (yy_input) {
+                case 35: yy_state = 273; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 273:
+              switch (yy_input) {
+                case 9: yy_state = 278; break yy_forNext;
+                case 36: yy_state = 279; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 274:
+              switch (yy_input) {
+                case 24: yy_state = 275; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 275:
+              switch (yy_input) {
+                case 9: yy_state = 280; break yy_forNext;
+                case 16: yy_state = 281; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 276:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 17: yy_state = 277; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 277:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_state = 282; break yy_forNext;
+                case 20: yy_state = 283; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 278:
+              switch (yy_input) {
+                case 36: yy_state = 279; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 279:
+              switch (yy_input) {
+                case 9: yy_state = 284; break yy_forNext;
+                case 35: yy_state = 285; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 280:
+              switch (yy_input) {
+                case 16: yy_state = 281; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 281:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                case 9: yy_state = 287; break yy_forNext;
+                case 32: yy_state = 288; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 282:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 20: yy_state = 283; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 283:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 6: 
+                case 8: yy_state = 289; break yy_forNext;
+                case 7: yy_state = 290; break yy_forNext;
+                case 9: yy_state = 291; break yy_forNext;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 284:
+              switch (yy_input) {
+                case 35: yy_state = 285; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 285:
+              switch (yy_input) {
+                case 9: yy_state = 292; break yy_forNext;
+                case 37: yy_state = 293; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 286:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                case 9: yy_state = 294; break yy_forNext;
+                case 22: yy_state = 295; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 287:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                case 32: yy_state = 288; break yy_forNext;
+                case 9: yy_state = 296; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 288:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                case 9: yy_state = 296; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 289:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_state = 297; break yy_forNext;
+                case 13: yy_state = 298; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 290:
+              switch (yy_input) {
+                case 9: yy_state = 299; break yy_forNext;
+                case 13: yy_state = 300; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 291:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 6: 
+                case 8: yy_state = 289; break yy_forNext;
+                case 7: yy_state = 290; break yy_forNext;
+                case 9: yy_state = 301; break yy_forNext;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 292:
+              switch (yy_input) {
+                case 37: yy_state = 293; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 293:
+              switch (yy_input) {
+                case 9: yy_state = 302; break yy_forNext;
+                case 36: yy_state = 303; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 294:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                case 22: yy_state = 295; break yy_forNext;
+                case 9: yy_state = 304; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 295:
+              switch (yy_input) {
+                case 9: yy_state = 305; break yy_forNext;
+                case 21: yy_state = 306; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 296:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                case 9: yy_state = 307; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 297:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 13: yy_state = 298; break yy_forNext;
+                case 9: yy_state = 308; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 298:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_state = 309; break yy_forNext;
+                case 25: yy_state = 310; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 299:
+              switch (yy_input) {
+                case 13: yy_state = 300; break yy_forNext;
+                case 9: yy_state = 311; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 300:
+              switch (yy_input) {
+                case 9: yy_state = 312; break yy_forNext;
+                case 25: yy_state = 313; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 301:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 6: 
+                case 8: yy_state = 289; break yy_forNext;
+                case 7: yy_state = 290; break yy_forNext;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 302:
+              switch (yy_input) {
+                case 36: yy_state = 303; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 303:
+              switch (yy_input) {
+                case 9: yy_state = 314; break yy_forNext;
+                case 21: yy_state = 315; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 304:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                case 22: yy_state = 295; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 305:
+              switch (yy_input) {
+                case 21: yy_state = 306; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 306:
+              switch (yy_input) {
+                case 9: yy_state = 316; break yy_forNext;
+                case 30: yy_state = 317; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 307:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 286; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 308:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 13: yy_state = 298; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 309:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 25: yy_state = 310; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 310:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_state = 318; break yy_forNext;
+                case 17: yy_state = 319; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 311:
+              switch (yy_input) {
+                case 13: yy_state = 300; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 312:
+              switch (yy_input) {
+                case 25: yy_state = 313; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 313:
+              switch (yy_input) {
+                case 9: yy_state = 320; break yy_forNext;
+                case 17: yy_state = 321; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 314:
+              switch (yy_input) {
+                case 21: yy_state = 315; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 315:
+              switch (yy_input) {
+                case 9: yy_state = 322; break yy_forNext;
+                case 38: yy_state = 323; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 316:
+              switch (yy_input) {
+                case 30: yy_state = 317; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 317:
+              switch (yy_input) {
+                case 9: yy_state = 324; break yy_forNext;
+                case 17: yy_state = 325; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 318:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 17: yy_state = 319; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 319:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_state = 326; break yy_forNext;
+                case 14: yy_state = 327; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 320:
+              switch (yy_input) {
+                case 17: yy_state = 321; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 321:
+              switch (yy_input) {
+                case 9: yy_state = 328; break yy_forNext;
+                case 14: yy_state = 329; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 322:
+              switch (yy_input) {
+                case 38: yy_state = 323; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 323:
+              switch (yy_input) {
+                case 9: yy_state = 330; break yy_forNext;
+                case 39: yy_state = 331; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 324:
+              switch (yy_input) {
+                case 17: yy_state = 325; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 325:
+              switch (yy_input) {
+                case 9: yy_state = 332; break yy_forNext;
+                case 16: yy_state = 333; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 326:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 14: yy_state = 327; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 327:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_state = 334; break yy_forNext;
+                case 15: yy_isFinal = true; yy_state = 335; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 328:
+              switch (yy_input) {
+                case 14: yy_state = 329; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 329:
+              switch (yy_input) {
+                case 9: yy_state = 336; break yy_forNext;
+                case 15: yy_isFinal = true; yy_state = 337; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 330:
+              switch (yy_input) {
+                case 39: yy_state = 331; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 331:
+              switch (yy_input) {
+                case 9: yy_state = 338; break yy_forNext;
+                case 29: yy_state = 339; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 332:
+              switch (yy_input) {
+                case 16: yy_state = 333; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 333:
+              switch (yy_input) {
+                case 9: yy_state = 340; break yy_forNext;
+                case 30: yy_state = 341; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 334:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 15: yy_isFinal = true; yy_state = 335; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 335:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 9: yy_isFinal = true; yy_state = 342; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 336:
+              switch (yy_input) {
+                case 15: yy_isFinal = true; yy_state = 337; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 337:
+              switch (yy_input) {
+                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 343; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 338:
+              switch (yy_input) {
+                case 29: yy_state = 339; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 339:
+              switch (yy_input) {
+                case 9: yy_state = 344; break yy_forNext;
+                case 40: yy_state = 345; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 340:
+              switch (yy_input) {
+                case 30: yy_state = 341; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 341:
+              switch (yy_input) {
+                case 9: yy_state = 346; break yy_forNext;
+                case 17: yy_state = 347; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 342:
+              switch (yy_input) {
+                case 29: yy_state = 259; break yy_forNext;
+                case 7: break yy_forAction;
+                default: yy_state = 254; break yy_forNext;
+              }
+
+            case 344:
+              switch (yy_input) {
+                case 40: yy_state = 345; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 345:
+              switch (yy_input) {
+                case 9: yy_state = 348; break yy_forNext;
+                case 41: yy_state = 349; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 346:
+              switch (yy_input) {
+                case 17: yy_state = 347; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 347:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 347; break yy_forNext;
+                case 9: yy_state = 350; break yy_forNext;
+                case 10: yy_isFinal = true; yy_state = 351; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 348:
+              switch (yy_input) {
+                case 41: yy_state = 349; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 349:
+              switch (yy_input) {
+                case 9: yy_state = 352; break yy_forNext;
+                case 41: yy_state = 353; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 350:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 347; break yy_forNext;
+                case 10: yy_isFinal = true; yy_state = 351; break yy_forNext;
+                case 9: yy_state = 354; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 351:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 355; break yy_forNext;
+                case 9: yy_state = 356; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 352:
+              switch (yy_input) {
+                case 41: yy_state = 353; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 353:
+              switch (yy_input) {
+                case 9: yy_state = 357; break yy_forNext;
+                case 41: yy_state = 358; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 354:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_state = 347; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 355:
+              switch (yy_input) {
+                case 9: yy_isFinal = true; yy_state = 351; break yy_forNext;
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 355; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 356:
+              switch (yy_input) {
+                case 6: 
+                case 7: 
+                case 8: yy_isFinal = true; yy_state = 355; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 357:
+              switch (yy_input) {
+                case 41: yy_state = 358; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 358:
+              switch (yy_input) {
+                case 29: yy_state = 299; break yy_forNext;
+                case 9: yy_state = 359; break yy_forNext;
+                default: break yy_forAction;
+              }
+
+            case 359:
+              switch (yy_input) {
+                case 29: yy_state = 299; break yy_forNext;
                 default: break yy_forAction;
               }
 
@@ -1858,37 +3059,37 @@
 
       switch (yy_action) {    
 
-        case 32: 
-        case 72: 
+        case 33: 
+        case 78: 
           {  yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 198: break;
-        case 25: 
+        case 361: break;
         case 26: 
-        case 28: 
-        case 69: 
-        case 96: 
-          {  yypushback(1); yybegin(UnDelimitedString); string.setLength(0); }
-        case 199: break;
-        case 22: 
-        case 63: 
-          {  yybegin(YYINITIAL);  if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd; }
-        case 200: break;
-        case 40: 
-        case 80: 
-          {  yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue; }
-        case 201: break;
-        case 67: 
-        case 95: 
-          {  yybegin(YYINITIAL); if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd; }
-        case 202: break;
+        case 27: 
+        case 29: 
         case 75: 
-        case 97: 
+        case 108: 
+          {  yypushback(1); yybegin(UnDelimitedString); string.setLength(0); }
+        case 362: break;
+        case 25: 
+        case 73: 
+          {  yybegin(YYINITIAL);  if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd; }
+        case 363: break;
+        case 41: 
+        case 86: 
+          {  yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue; }
+        case 364: break;
+        case 72: 
+        case 107: 
+          {  yybegin(YYINITIAL); if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd; }
+        case 365: break;
+        case 81: 
+        case 109: 
           {  yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 203: break;
-        case 116: 
-        case 122: 
+        case 366: break;
+        case 144: 
+        case 157: 
           { if (yychar == 0 ) {yybegin(ST_XMLDecl); return XMLHeadTokenizerConstants.XMLDeclStart;} }
-        case 204: break;
+        case 367: break;
         case 9: 
         case 10: 
         case 11: 
@@ -1902,68 +3103,79 @@
         case 19: 
         case 20: 
         case 21: 
+        case 22: 
         case 23: 
         case 24: 
-        case 27: 
-        case 33: 
-        case 36: 
-        case 39: 
-          { if(yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;} }
-        case 205: break;
-        case 108: 
-        case 115: 
-          { yybegin(ST_META_TAG); return HTMLHeadTokenizerConstants.MetaTagStart; }
-        case 206: break;
-        case 58: 
-        case 90: 
-          { yybegin(YYINITIAL);  return XMLHeadTokenizerConstants.XMLDeclEnd; }
-        case 207: break;
-        case 193: 
-        case 195: 
-          { pushCurrentState(); yybegin(QuotedAttributeValue); foundContentTypeValue=true; return HTMLHeadTokenizerConstants.MetaTagContentType; }
-        case 208: break;
-        case 133: 
-        case 137: 
-          { pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding; }
-        case 209: break;
-        case 83: 
-          { hasMore = false; return EncodingParserConstants.UTF83ByteBOM; }
-        case 210: break;
-        case 43: 
-          { hasMore = false; return EncodingParserConstants.UTF16BE; }
-        case 211: break;
-        case 44: 
-          { hasMore = false; return EncodingParserConstants.UTF16LE; }
-        case 212: break;
-        case 35: 
-        case 76: 
-          {  popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;  }
-        case 213: break;
-        case 31: 
+        case 28: 
         case 34: 
         case 37: 
-          {  string.append( yytext() );  }
-        case 214: break;
-        case 30: 
-        case 71: 
-          {  yybegin(SQ_STRING); string.setLength(0);  }
-        case 215: break;
-        case 29: 
-        case 70: 
-          {  yybegin(DQ_STRING); string.setLength(0);  }
-        case 216: break;
+        case 40: 
+          { if(yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;} }
+        case 368: break;
+        case 126: 
+        case 139: 
+          { yybegin(ST_META_TAG); return HTMLHeadTokenizerConstants.MetaTagStart; }
+        case 369: break;
+        case 61: 
+        case 100: 
+          { yybegin(YYINITIAL);  return XMLHeadTokenizerConstants.XMLDeclEnd; }
+        case 370: break;
+        case 351: 
+        case 355: 
+          { pushCurrentState(); yybegin(QuotedAttributeValue); foundContentTypeValue=true; return HTMLHeadTokenizerConstants.MetaTagContentType; }
+        case 371: break;
+        case 180: 
+        case 191: 
+          { pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding; }
+        case 372: break;
+        case 172: 
+        case 182: 
+          { pushCurrentState(); yybegin(QuotedAttributeValue); foundContentTypeValue=true; hasCharsetAttr=true; return HTMLHeadTokenizerConstants.MetaTagContentType; }
+        case 373: break;
+        case 335: 
+        case 337: 
+        case 342: 
+        case 343: 
+          { isXHTML = true; }
+        case 374: break;
+        case 89: 
+          { hasMore = false; return EncodingParserConstants.UTF83ByteBOM; }
+        case 375: break;
+        case 44: 
+          { hasMore = false; return EncodingParserConstants.UTF16BE; }
+        case 376: break;
+        case 45: 
+          { hasMore = false; return EncodingParserConstants.UTF16LE; }
+        case 377: break;
+        case 36: 
+        case 82: 
+          {  popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;  }
+        case 378: break;
+        case 32: 
+        case 35: 
         case 38: 
-        case 79: 
+          {  string.append( yytext() );  }
+        case 379: break;
+        case 31: 
+        case 77: 
+          {  yybegin(SQ_STRING); string.setLength(0);  }
+        case 380: break;
+        case 30: 
+        case 76: 
+          {  yybegin(DQ_STRING); string.setLength(0);  }
+        case 381: break;
+        case 39: 
+        case 85: 
           {  yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue;  }
-        case 217: break;
-        case 41: 
-        case 81: 
-        case 98: 
-          {  pushCurrentState(); yybegin(UnDelimitedCharset); string.append( yytext() );  }
-        case 218: break;
+        case 382: break;
         case 42: 
+        case 87: 
+        case 110: 
+          {  pushCurrentState(); yybegin(UnDelimitedCharset); string.append( yytext() );  }
+        case 383: break;
+        case 43: 
           { yypushback(1); popState();  }
-        case 219: break;
+        case 384: break;
         default: 
           if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
             yy_atEOF = true;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizerConstants.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizerConstants.java
index 938bcde..2600b07 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizerConstants.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizerConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,5 +16,5 @@
 	String MetaTagEnd = "MetaTagEnd"; //$NON-NLS-1$
 	String MetaTagStart = "MetaTagStart"; //$NON-NLS-1$
 	String MetaTagContentType = "MetaTagContentType"; //$NON-NLS-1$
-
+	String UNDEFINED = "UNDEFINED"; //$NON-NLS-1$
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLResourceEncodingDetector.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLResourceEncodingDetector.java
index 0367e54..22a6136 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLResourceEncodingDetector.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLResourceEncodingDetector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
 import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
 import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;
+import org.eclipse.wst.xml.core.internal.contenttype.XMLHeadTokenizerConstants;
 
 public class HTMLResourceEncodingDetector extends AbstractResourceEncodingDetector implements IResourceCharsetDetector {
 
@@ -83,14 +84,17 @@
 		boolean noHeuristic = false;
 		String heuristicEncoding = null;
 		try {
-			fReader.reset();
-			fReader.mark(CodedIO.MAX_MARK_SIZE);
-			byte[] bytes = new byte[CodedIO.MAX_MARK_SIZE];
-			int nRead = 0;
-			for (int i = 0; i < bytes.length; i++) {
-				if (fReader.ready()) {
+			if (EncodingGuesser.canGuess()) {
+				fReader.reset();
+				fReader.mark(CodedIO.MAX_MARK_SIZE);
+				byte[] bytes = new byte[CodedIO.MAX_MARK_SIZE];
+				int nRead = 0;
+				for (int i = 0; i < bytes.length; i++) {
 					int oneByte = fReader.read();
 					nRead++;
+					if (oneByte == -1) {
+						break;
+					}
 					if (oneByte <= 0xFF) {
 						bytes[i] = (byte) oneByte;
 					}
@@ -99,13 +103,10 @@
 						break;
 					}
 				}
-				else {
-					break;
+				if (!noHeuristic) {
+					heuristicEncoding = EncodingGuesser.guessEncoding(bytes, nRead);
 				}
 			}
-			if (!noHeuristic) {
-				heuristicEncoding = EncodingGuesser.guessEncoding(bytes, nRead);
-			}
 		}
 		catch (IOException e) {
 			// if any IO exception, then not a heuristic case
@@ -125,9 +126,20 @@
 		HeadParserToken token = null;
 		String tokenType = null;
 		String contentTypeValue = null;
+		String xhtmlEncoding = HTMLHeadTokenizerConstants.UNDEFINED;
+		boolean isXHTML = false;
 		do {
 			token = tokenizer.getNextToken();
 			tokenType = token.getType();
+			if (tokenizer.isXHTML()) {
+				isXHTML = true;
+				if (!xhtmlEncoding.equals(HTMLHeadTokenizerConstants.UNDEFINED)) {
+					if (xhtmlEncoding.length() > 0) {
+						createEncodingMemento(xhtmlEncoding, EncodingMemento.FOUND_ENCODING_IN_CONTENT);
+						return ;
+					}
+				}
+			}
 			if (canHandleAsUnicodeStream(tokenType)) {
 				// side effect of canHandle is to create appropriate
 				// memento
@@ -142,11 +154,32 @@
 					}
 				}
 			}
+			else if (tokenType == XMLHeadTokenizerConstants.XMLDelEncoding ) {
+				if (tokenizer.hasMoreTokens()) {
+					token = tokenizer.getNextToken();
+					tokenType = token.getType();
+					if (isLegalString(tokenType)) 
+						xhtmlEncoding = token.getText();
+				}
+			}
 
 		}
 		while (tokenizer.hasMoreTokens());
 		if (contentTypeValue != null) {
-			parseContentTypeValue(contentTypeValue);
+			if (tokenizer.hasCharsetAttr()) {
+				contentTypeValue = contentTypeValue.trim();
+				if (contentTypeValue.length() > 0) {
+					createEncodingMemento(contentTypeValue, EncodingMemento.FOUND_ENCODING_IN_CONTENT);
+				}
+			}
+			else {
+				parseContentTypeValue(contentTypeValue);
+			}
+		}
+		//Content type is XHTML and no encoding found(since we did't hit return statement), use UTF-8
+		//https://bugs.eclipse.org/bugs/show_bug.cgi?id=318768
+		if (isXHTML) {
+			createEncodingMemento("UTF-8", EncodingMemento.DEFAULTS_ASSUMED_FOR_EMPTY_INPUT); //$NON-NLS-1$		
 		}
 	}
 
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/IntStack.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/IntStack.java
index 88b8ba8..f48f2f0 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/IntStack.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/IntStack.java
@@ -94,6 +94,21 @@
 	}
 
 	public int size() {
-		return list.length;
+		return size;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		StringBuffer s = new StringBuffer(getClass().getName() + ":" +size + " [");
+		for (int i = 0; i < size; i++) {
+			s.append(list[i]);
+			if(i < size - 1) {
+				s.append(", ");
+			}
+		}
+		s.append("]");
+		return s.toString();
 	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java
index eda938f..8efb14b 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java
@@ -9,10 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 /*
- * Created on Sep 2, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
+ * http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-DocumentStyle
  */
 package org.eclipse.wst.html.core.internal.document;
 
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java
index 24e03b7..7acc0fb 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -22,7 +22,6 @@
 import org.eclipse.wst.xml.core.internal.document.ElementImpl;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
 import org.w3c.dom.Document;
-import org.w3c.dom.Node;
 import org.w3c.dom.css.CSSStyleDeclaration;
 import org.w3c.dom.css.ElementCSSInlineStyle;
 import org.w3c.dom.stylesheets.LinkStyle;
@@ -63,11 +62,8 @@
 		super.setTagName(tagName);
 	}
 
-	public Node cloneNode(boolean deep) {
-		ElementImpl cloned = new ElementStyleImpl(this);
-		if (deep)
-			cloneChildNodes(cloned, deep);
-		return cloned;
+	protected ElementImpl newInstance() {
+		return new ElementStyleImpl(this);
 	}
 
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java
index 1f806e5..aecadc1 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -40,7 +40,6 @@
 	private final static String XHTML = "xhtml"; //$NON-NLS-1$
 	private final static String WML = "wml"; //$NON-NLS-1$
 
-
 	/**
 	 */
 	protected HTMLDocumentTypeAdapter() {
@@ -72,9 +71,11 @@
 
 		// find DOCTYPE delcaration and Public ID
 		String publicId = null;
+		String systemId = null;
 		DocumentType newDocumentType = findDocumentType(document);
 		if (newDocumentType != null) {
 			publicId = newDocumentType.getPublicId();
+			systemId = newDocumentType.getSystemId();
 		}
 		else {
 			// lookup default set by contentsettings
@@ -86,6 +87,11 @@
 		if (publicId != null) {
 			newEntry = HTMLDocumentTypeRegistry.getInstance().getEntry(publicId);
 		}
+		else if (systemId == null){
+			if (newDocumentType != null){ // <!DOCTYPE html>
+				newEntry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_HTML5);
+			}
+		}
 
 		boolean newXMLType = (newEntry != null ? newEntry.isXMLType() : false);
 		boolean newWMLType = (newEntry != null ? newEntry.isWMLType() : false);
@@ -137,7 +143,7 @@
 				if (impl != null) {
 					String name = newEntry.getName();
 					publicId = newEntry.getPublicId();
-					String systemId = newEntry.getSystemId();
+					systemId = newEntry.getSystemId();
 					newDocumentType = impl.createDocumentType(name, publicId, systemId);
 				}
 			}
@@ -186,7 +192,7 @@
 	 */
 	public int getAttrNameCase() {
 		if (isXMLType())
-			return LOWER_CASE; // XHTML
+			return super.getAttrNameCase(); // XHTML
 		return this.fFactory.getAttrNameCase();
 	}
 
@@ -224,6 +230,11 @@
 				return false;
 			return this.entry.hasFrameset();
 		}
+		if (feature.equals(HTML5)) {
+			if (this.entry == null)
+				return false;
+			return this.entry == HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_HTML5);
+		}
 		return false;
 	}
 
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java
index 1b26c13..7aae3cf 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,5 +15,6 @@
 	public final static String HTML = "HTML"; //$NON-NLS-1$
 	public final static String FRAMESET = "FRAMESET"; //$NON-NLS-1$
 	public final static String SSI = "SSI"; //$NON-NLS-1$
+	String HTML5 = "HTML5"; //$NON-NLS-1$
 
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java
index 3cd71ff..457558f 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,14 +10,28 @@
  *******************************************************************************/
 package org.eclipse.wst.html.core.internal.document;
 
-
-
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.List;
+import java.util.Vector;
 
-/**
- */
 public class HTMLDocumentTypeRegistry {
+	static class HTMLDocumentTypeEntryComparator implements Comparator {
+		static Collator delegate = Collator.getInstance();
+
+		public int compare(Object o1, Object o2) {
+			if (o1 instanceof HTMLDocumentTypeEntry && o2 instanceof HTMLDocumentTypeEntry) {
+				if (((HTMLDocumentTypeEntry) o1).getDisplayName() != null && ((HTMLDocumentTypeEntry) o2).getDisplayName() != null) {
+					return delegate.compare(((HTMLDocumentTypeEntry) o1).getDisplayName(), ((HTMLDocumentTypeEntry) o2).getDisplayName());
+				}
+			}
+			return 0;
+		}
+	}
 
 	private static HTMLDocumentTypeRegistry instance = null;
 	private Hashtable entries = null;
@@ -25,12 +39,14 @@
 	private HTMLDocumentTypeEntry defaultXHTMLEntry = null;
 	private HTMLDocumentTypeEntry defaultWMLEntry = null;
 	private HTMLDocumentTypeEntry defaultCHTMLEntry = null;
-
+	private HTMLDocumentTypeEntry defaultHTML5Entry = null;
+	
 	final static int DEFAULT_HTML = 0;
 	final static int DEFAULT_XHTML = 1;
 	final static int DEFAULT_WML = 2;
 	final static int DEFAULT_CHTML = 3;
-
+	final static int DEFAULT_HTML5 = 4;
+	
 	public static final String CHTML_PUBLIC_ID = "-//W3C//DTD Compact HTML 1.0 Draft//EN";//$NON-NLS-1$
 
 	/**
@@ -61,6 +77,15 @@
 		this.defaultCHTMLEntry = new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false, true);
 		this.entries.put(publicId, this.defaultCHTMLEntry);
 
+		//HTML5
+		name = "HTML5";//$NON-NLS-1$
+		publicId = "";
+		displayName = "HTML5"; //$NON-NLS-1$
+		this.defaultHTML5Entry = new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false, true);
+		this.entries.put(publicId, this.defaultHTML5Entry);
+		
+		
+
 		HTMLDocumentTypeRegistryReader reader = new HTMLDocumentTypeRegistryReader();
 		if (reader != null)
 			reader.readRegistry(this);
@@ -88,6 +113,9 @@
 	public HTMLDocumentTypeEntry getDefaultEntry(int type) {
 		HTMLDocumentTypeEntry entry = null;
 		switch (type) {
+			case DEFAULT_HTML5 :
+				entry = this.defaultHTML5Entry;
+				break;
 			case DEFAULT_XHTML :
 				entry = this.defaultXHTMLEntry;
 				break;
@@ -121,7 +149,9 @@
 	/**
 	 */
 	public Enumeration getEntries() {
-		return this.entries.elements();
+		List values = new ArrayList(this.entries.values());
+		Collections.sort(values, new HTMLDocumentTypeEntryComparator());
+		return new Vector(values).elements();
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java
index 6e30557..4e7ddcb 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,6 +13,7 @@
 
 
 import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLPropertyDeclaration;
 import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
 import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
@@ -62,6 +63,14 @@
 		return false;
 	}
 
+	public boolean isEndTagOmissible(Element element) {
+		CMElementDeclaration dec = CMNodeUtil.getElementDeclaration(element);
+		if (dec == null || !(dec instanceof HTMLPropertyDeclaration))
+			return false;
+		int type = ((HTMLPropertyDeclaration)dec ).getOmitType();
+		return type == HTMLElementDeclaration.OMIT_BOTH || type == HTMLElementDeclaration.OMIT_END || type == HTMLElementDeclaration.OMIT_END_DEFAULT || type == HTMLElementDeclaration.OMIT_END_MUST;
+	}
+
 	/**
 	 */
 	public boolean canContain(Element element, Node child) {
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java
index 3642881..07fb206 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Genuitec - fix for bug #203252
  *******************************************************************************/
 package org.eclipse.wst.html.core.internal.format;
 
@@ -37,10 +38,17 @@
 public class HTMLFormatter implements IStructuredFormatter {
 
 	private static final String HTML_NAME = "html";//$NON-NLS-1$
+	private static final String HEAD_NAME = "head"; //$NON-NLS-1$
 	private static final String BODY_NAME = "BODY";//$NON-NLS-1$
 	// hidden jsp logic that should be removed when jsp formatter is created
 	private static final String JSP = "jsp";//$NON-NLS-1$
 
+	private HTMLFormattingUtil formattingUtil;
+
+	public HTMLFormatter() {
+		formattingUtil = new HTMLFormattingUtil();
+	}
+
 	/**
 	 */
 	protected void addWidth(HTMLFormatContraints contraints, int width) {
@@ -164,6 +172,11 @@
 			if (decl != null) {
 				if (decl.getContentType() == CMElementDeclaration.ELEMENT)
 					return true;
+                // causes all closing tags to wrap to a new line
+                boolean allowsText = decl.getContentType() == CMElementDeclaration.MIXED
+                        || decl.getContentType() == CMElementDeclaration.PCDATA;
+                if (allowsNewlineAfter(allowsText, node, element))
+                    return true;
 				String tagName = element.getTagName();
 				// special for direct children under BODY
 				if (tagName != null && tagName.equalsIgnoreCase(BODY_NAME))
@@ -271,19 +284,12 @@
 
 			CMElementDeclaration decl = getElementDeclaration(element);
 			if (decl != null) {
-				if (decl.getContentType() == CMElementDeclaration.ELEMENT)
-					return true;
-				String tagName = element.getTagName();
-				// special for direct children under BODY
-				if (tagName != null && tagName.equalsIgnoreCase(BODY_NAME))
-					return true;
+			    return allowNewlineBefore(node, element);
 			}
 		}
 
 		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			CMElementDeclaration decl = getElementDeclaration((Element) node);
-			if (canInsertBreakBefore(decl))
-				return true;
+			return true;
 		}
 		if (prev != null && prev.getNodeType() == Node.ELEMENT_NODE) {
 			CMElementDeclaration decl = getElementDeclaration((Element) prev);
@@ -429,10 +435,15 @@
 					}
 					continue;
 				}
+				else {
+					String localName = element.getLocalName();
+					if (HTML_NAME.equalsIgnoreCase(localName) || HEAD_NAME.equalsIgnoreCase(localName))
+						break;
+				}
 
 				CMElementDeclaration decl = getElementDeclaration(element);
 				if (decl != null && decl.supports(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)) {
-					boolean shouldIndent = ((Boolean) decl.getProperty(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)).booleanValue();
+					boolean shouldIndent = isIdentable(node, parent); 
 					if (shouldIndent)
 						buffer.append(indent);
 				}
@@ -746,4 +757,70 @@
 	public void setProgressMonitor(IProgressMonitor progressMonitor) {
 		fProgressMonitor = progressMonitor;
 	}
+
+    /* Check to see if current text Node is a child of an inline element. */
+    public boolean isInlinableTextNode(Node theNode, Element theParentElement) {
+        return formattingUtil.isInline(theParentElement) && 
+               theNode.getNodeType() == Node.TEXT_NODE;
+    }
+    
+    public boolean allowsNewlineAfter(boolean theBool, Node theNode, Element theParentElement) {
+        boolean result = theBool;
+        if ((theNode.getNodeType() == Node.TEXT_NODE) && formattingUtil.isInline(theParentElement)) {
+            result = false;
+        } else if (theNode.getNodeType() == Node.ELEMENT_NODE
+                && formattingUtil.isInline(theNode.getNextSibling())) {
+            result = false;
+        }
+        else if (theNode.getNodeType() == Node.TEXT_NODE) {
+        	Node next = theNode.getNextSibling();
+        	if (next != null && formattingUtil.isInline(next) || theParentElement.getChildNodes().getLength() <= 1) {
+        		result = false;
+        	}
+        }
+        return result;
+    }
+
+    public boolean allowNewlineBefore(Node theNode) {
+        if (theNode.getNodeType() != Node.TEXT_NODE &&
+            theNode.getNodeType() != Node.ELEMENT_NODE) return false;
+        return (formattingUtil.isInline(theNode.getParentNode()) ||
+                        formattingUtil.isInline(theNode.getPreviousSibling()));        
+    }
+    
+    public boolean allowNewlineBefore(Node theNode, Element theParentElement) {
+        boolean result = true;
+        /* The calling method canInsertBreakBefore is checking if you can 
+         * insert a line break after the text node in the parentElement.  We 
+         * need to check for the case with inline element because we don't want to 
+         * break before the closing </tag> */
+        if (isInlinableTextNode(theNode, theParentElement)) {
+            result = false;
+        /* Check to see if we need to not break the line because we are
+         * a child of a inline element or a next sibling to an inline element*/
+        } else if (allowNewlineBefore(theNode)) {
+            result = false;
+        } else if (theNode.getNodeType() == Node.TEXT_NODE && theParentElement.getChildNodes().getLength() <= 1) {
+        	result = false;
+        }
+        return result;
+    }
+
+    public boolean isIdentable(Node theNode, Node theParent) {
+        boolean result = true;
+        /* The first 2 cases where we don't want to break/indent or if the
+         * node is a inlineText ELement or if we should skip it before its parent
+         * is an inlineText element.  
+         * The last check is to make sure that the parent is actually the parent
+         * of the node.  This method is called when the formatter is formatting
+         * the startTag and the wrap margin causes attributes to be indents on
+         * mulitple lines.  In this case where the parentNode doesn't match
+         * theParent argument, we can allow the indent. */
+        if (formattingUtil.isInline(theNode) && 
+        		formattingUtil.shouldSkipIndentForNode(theNode) &&
+                theParent == theNode.getParentNode()) {
+            result = false;
+        }
+        return result;
+    }
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormattingUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormattingUtil.java
new file mode 100644
index 0000000..9a2b000
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormattingUtil.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.format;
+
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.w3c.dom.Node;
+
+import com.ibm.icu.util.StringTokenizer;
+
+public class HTMLFormattingUtil {
+
+	private Set fInlineElements;
+
+	public HTMLFormattingUtil() {
+		fInlineElements = getInlineSet();
+	}
+
+	public boolean isInline(Node node) {
+		return node != null && fInlineElements.contains(node.getNodeName().toLowerCase(Locale.US));
+	}
+
+	public boolean shouldSkipIndentForNode(Node node) {
+		return isInline(node.getParentNode());
+	}
+
+	/**
+	 * Returns an array of the element names considered as "inline" for the purposes of formatting.
+	 * This list represents those stored in the preference store when invoked.
+	 * 
+	 * @return An array of element names considered to be "inline"
+	 */
+	public static Object[] getInlineElements() {
+		return getInlineSet().toArray();
+	}
+
+	/**
+	 * Stores the element names to the preference store to be considered as "inline"
+	 * 
+	 * @param elements The element names considered to be "inline"
+	 */
+	public static void exportToPreferences(Object[] elements) {
+		if (elements != null) {
+			StringBuffer buffer = new StringBuffer();
+			for (int i = 0; i < elements.length; i++) {
+				if (i > 0)
+					buffer.append(',');
+				buffer.append(elements[i]);
+			}
+			HTMLCorePlugin.getDefault().getPluginPreferences().setValue(HTMLCorePreferenceNames.INLINE_ELEMENTS, buffer.toString());
+		}
+	}
+
+	/**
+	 * Returns an array of the default element names considered as "inline" for the purposes of formatting.
+	 * 
+	 * @return An array of the default element names considered to be "inline"
+	 */
+	public static Object[] getDefaultInlineElements() {
+		String inline = HTMLCorePlugin.getDefault().getPluginPreferences().getDefaultString(HTMLCorePreferenceNames.INLINE_ELEMENTS);
+		Set defaults = new HashSet();
+		StringTokenizer tokenizer = new StringTokenizer(inline, ",");
+		while (tokenizer.hasMoreTokens()) {
+			defaults.add(tokenizer.nextToken());
+		}
+		return defaults.toArray();
+	}
+
+	private static Set getInlineSet() {
+		String inline = HTMLCorePlugin.getDefault().getPluginPreferences().getString(HTMLCorePreferenceNames.INLINE_ELEMENTS);
+		Set elements = new HashSet();
+		StringTokenizer tokenizer = new StringTokenizer(inline, ",");
+		while (tokenizer.hasMoreTokens()) {
+			elements.add(tokenizer.nextToken());
+		}
+		return elements;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLDocumentAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLDocumentAdapter.java
index c388305..49eb7ff 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLDocumentAdapter.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLDocumentAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -31,6 +31,7 @@
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -252,10 +253,16 @@
 		Node node = null;
 		switch (eventType) {
 			case INodeNotifier.ADD :
-				node = (Node) newValue;
+				if (newValue instanceof Node)
+					node = (Node) newValue;
+				else if (changedFeature instanceof Attr)
+					node = ((Attr) changedFeature);
 				break;
 			case INodeNotifier.REMOVE :
-				node = (Node) oldValue;
+				if (oldValue instanceof Node)
+					node = (Node) oldValue;
+				else if (changedFeature instanceof Attr)
+					node = ((Attr) changedFeature);
 				break;
 			case INodeNotifier.CHANGE :
 				node = (Node) notifier;
@@ -263,33 +270,46 @@
 			default :
 				break;
 		}
-		if (node == null || node.getNodeType() != Node.ELEMENT_NODE)
+		
+		if (node == null)
 			return;
-		IDOMElement element = (IDOMElement) node;
-		String tagName = element.getTagName();
-		if (tagName == null)
-			return;
+		
+		switch(node.getNodeType()) {
+			case Node.ELEMENT_NODE: {
+				IDOMElement element = (IDOMElement) node;
+				String tagName = element.getTagName();
+				if (tagName == null)
+					return;
 
-		if (eventType == INodeNotifier.CHANGE) {
-			if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.BASE)) {
-				refreshAdapters();
+				if (eventType == INodeNotifier.CHANGE) {
+					if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.BASE)) {
+						refreshAdapters();
+					}
+				}
+				else {
+					if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.HTML) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.STYLE) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.LINK) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.NOSCRIPT) || tagName.equalsIgnoreCase(JSP11Namespace.ElementName.ROOT) || element.isCommentTag() || (!element.isGlobalTag() && element.isContainer())) {
+						childReplaced();
+					}
+					else if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.BASE)) {
+						refreshAdapters();
+					}
+					else {
+						String localName = element.getLocalName();
+						if (localName != null && localName.equalsIgnoreCase(HTML40Namespace.ElementName.HTML)) {
+							// taglib html tag
+							childReplaced();
+						}
+					}
+				}
+				break;
 			}
-		}
-		else {
-			if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.HTML) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.STYLE) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.LINK) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.NOSCRIPT) || tagName.equalsIgnoreCase(JSP11Namespace.ElementName.ROOT) || element.isCommentTag() || (!element.isGlobalTag() && element.isContainer())) {
-				childReplaced();
-			}
-			else if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.BASE)) {
-				refreshAdapters();
-			}
-			else {
-				String localName = element.getLocalName();
-				if (localName != null && localName.equalsIgnoreCase(HTML40Namespace.ElementName.HTML)) {
-					// taglib html tag
-					childReplaced();
+			case Node.ATTRIBUTE_NODE : {
+				if (HTML40Namespace.ElementName.BASE.equals(((Attr) node).getOwnerElement().getLocalName())) {
+					refreshAdapters();
 				}
 			}
 		}
+		
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLStyleSelectorAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLStyleSelectorAdapter.java
index cf58aa4..cee65d1 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLStyleSelectorAdapter.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/HTMLStyleSelectorAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,13 +12,13 @@
 
 
 
-import com.ibm.icu.util.StringTokenizer;
-
 import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSelectorAdapter;
 import org.eclipse.wst.css.core.internal.provisional.document.ICSSSimpleSelector;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.w3c.dom.Element;
 
+import com.ibm.icu.util.StringTokenizer;
+
 /**
  * Insert the type's description here.
  */
@@ -67,8 +67,7 @@
 		if (i > 0) {
 			if (i > 1)
 				return false;
-			key = element.getAttribute("id");//$NON-NLS-1$
-			if (key == null)
+			if (!element.hasAttribute("id") || (key = element.getAttribute("id")).length() == 0)//$NON-NLS-1$ //$NON-NLS-2$
 				return false;
 			if (!selector.getID(0).equals(key))
 				return false;
@@ -77,8 +76,7 @@
 		// check class
 		i = selector.getNumOfClasses();
 		if (i > 0) {
-			key = element.getAttribute("class");//$NON-NLS-1$
-			if (key == null)
+			if (!element.hasAttribute("class") || (key = element.getAttribute("class")).length() == 0) //$NON-NLS-1$  //$NON-NLS-2$
 				return false;
 			StringTokenizer tokenizer = new StringTokenizer(key);
 			for (i = i - 1; i >= 0; i--) {
@@ -99,8 +97,9 @@
 			StringTokenizer tokenizer = new StringTokenizer(selector.getAttribute(i), "=~| \t\r\n\f");//$NON-NLS-1$
 			int countTokens = tokenizer.countTokens();
 			if (countTokens > 0) {
-				String attrValue = element.getAttribute(tokenizer.nextToken());
-				if (attrValue == null)
+				String attrName = tokenizer.nextToken();
+				String attrValue = null;
+				if (!element.hasAttribute(attrName) || (attrValue = element.getAttribute(attrName)).length() == 0)
 					return false;
 				if (countTokens > 1) {
 					String token = tokenizer.nextToken("= \t\r\n\f");//$NON-NLS-1$
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/LinkElementAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/LinkElementAdapter.java
index 0c73ac2..6113d4b 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/LinkElementAdapter.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/LinkElementAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
 import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
 import org.eclipse.wst.css.core.internal.provisional.contenttype.ContentTypeIdForCSS;
 import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.sse.core.internal.util.URIResolver;
@@ -73,8 +74,8 @@
 		URIResolver resolver = baseModel.getResolver();
 
 		// resolve to absolute url : this need not exact location of css file. It is important that absurl is not null. 
-		String ref = getElement().getAttribute(org.eclipse.wst.html.core.internal.provisional.HTML40Namespace.ATTR_NAME_HREF);
-		String absurl = (resolver != null && ref != null) ? resolver.getLocationByURI(ref, true) : null;
+		String ref = getElement().getAttribute(HTML40Namespace.ATTR_NAME_HREF);
+		String absurl = (resolver != null && ref != null && ref.length() > 0) ? resolver.getLocationByURI(ref, true) : null;
 		if ((absurl == null) || (absurl.length() == 0)) {
 			IPath basePath = new Path(baseModel.getBaseLocation());
 			URLHelper helper = new URLHelper(basePath.removeLastSegments(1).toString());
@@ -200,14 +201,11 @@
 		Element element = getElement();
 		if (element == null)
 			return false;
-		String rel = element.getAttribute("rel");//$NON-NLS-1$
-		if (rel == null || !rel.equalsIgnoreCase("stylesheet"))//$NON-NLS-1$
+		if (!element.hasAttribute("rel") || !"stylesheet".equalsIgnoreCase(element.getAttribute("rel")))//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			return false;
-		String type = element.getAttribute("type");//$NON-NLS-1$
-		if (type != null && !type.equalsIgnoreCase("text/css"))//$NON-NLS-1$
+		if (element.hasAttribute("type") && !"text/css".equalsIgnoreCase(element.getAttribute("type")))//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			return false;
-		String href = element.getAttribute("href");//$NON-NLS-1$
-		if (href == null || href.length() == 0)
+		if (!element.hasAttribute("href") || element.getAttribute("href").length() == 0) //$NON-NLS-1$ //$NON-NLS-2$
 			return false;
 		return true;
 	}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/StyleElementAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/StyleElementAdapter.java
index 3ef97b9..f26c904 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/StyleElementAdapter.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/htmlcss/StyleElementAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004-2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -166,7 +166,9 @@
 				modelProvideAdapter.modelProvided(model);
 
 			// from createModel()
-			IStructuredDocument structuredDocument = model.getStructuredDocument();
+			IStructuredDocument structuredDocument = null;
+			if (model != null)
+				structuredDocument = model.getStructuredDocument();
 			if (structuredDocument == null)
 				return null;
 			structuredDocument.addDocumentChangedListener(this);
@@ -198,7 +200,7 @@
 			return false;
 		}
 		String type = element.getAttribute(HTML40Namespace.ATTR_NAME_TYPE);
-		if (type != null && type.length() > 0 && !type.equalsIgnoreCase("text/css")) { //$NON-NLS-1$
+		if (element.hasAttribute(HTML40Namespace.ATTR_NAME_TYPE) && type.length() > 0 && !type.equalsIgnoreCase("text/css")) { //$NON-NLS-1$
 			return false;
 		}
 		return true;
@@ -217,10 +219,11 @@
 			return null;
 		}
 
-		if (!addListener)
-			return super.createModel(false);
+		ICSSModel model = super.createModel(addListener);
 
-		ICSSModel model = super.createModel();
+		if (!addListener)
+			return model;
+
 		IStructuredDocument structuredDocument = model.getStructuredDocument();
 		if (structuredDocument == null)
 			return null;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java
index 50cdd0f..cf9ffb7 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -23,7 +23,7 @@
 import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTagParser;
-import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
+import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
 import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
 import org.eclipse.wst.sse.core.internal.util.Assert;
@@ -71,9 +71,11 @@
 	/*
 	 * @see EmbeddedContentType#initializeParser(RegionParser)
 	 */
-	public void initializeParser(JSPCapableParser parser) {
-		addHTMLishTag(parser, "script"); //$NON-NLS-1$
-		addHTMLishTag(parser, "style"); //$NON-NLS-1$
+	public void initializeParser(RegionParser parser) {
+		if (parser instanceof BlockTagParser) {
+			addHTMLishTag((BlockTagParser) parser, "script"); //$NON-NLS-1$
+			addHTMLishTag((BlockTagParser) parser, "style"); //$NON-NLS-1$
+		}
 	}
 
 	public List getSupportedMimeTypes() {
@@ -142,11 +144,13 @@
 
 	}
 
-	public void uninitializeParser(JSPCapableParser parser) {
+	public void uninitializeParser(RegionParser parser) {
 		// I'm assuming block markers are unique based on name only
 		// we add these as full BlockMarkers, but remove based on name alone.
-		parser.removeBlockMarker("script"); //$NON-NLS-1$
-		parser.removeBlockMarker("script"); //$NON-NLS-1$
+		if (parser instanceof BlockTagParser) {
+			((BlockTagParser) parser).removeBlockMarker("style"); //$NON-NLS-1$
+			((BlockTagParser) parser).removeBlockMarker("script"); //$NON-NLS-1$
+		}
 	}
 
 	public EmbeddedTypeHandler newInstance() {
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
index 40e6d3d..80c1ce5 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -38,6 +38,7 @@
 public class HTMLModelQueryCMProvider implements ModelQueryCMProvider {
 
 
+	private static CMDocument staticHTML5 = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML5_DOC_TYPE);
 	private static CMDocument staticHTML = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
 	private static CMDocument staticCHTML = HTMLCMDocumentFactory.getCMDocument(CMDocType.CHTML_DOC_TYPE);
 	private static HTMLDocumentTypeRegistry doctypeRegistry = HTMLDocumentTypeRegistry.getInstance();
@@ -60,8 +61,10 @@
 			return null;
 
 		String pid = getPublicId(owner);
-		if (pid == null)
-			return staticHTML;
+		// no PID, always return the currently-supported HTML version
+		if (pid == null || "".equals(pid)){
+			return staticHTML5;
+		}
 
 		HTMLDocumentTypeEntry entry = doctypeRegistry.getEntry(pid);
 		if (entry == null)
@@ -112,6 +115,10 @@
 		if (doc == null)
 			return null;
 		DocumentType doctype = doc.getDoctype();
+		//doctype.
 		return (doctype != null) ? doctype.getPublicId() : doc.getDocumentTypeId();
 	}
+	
+	
+	
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
index bee1432..b3b02bd 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
@@ -85,12 +85,15 @@
 		// Now, the time to check exclusion.
 		Vector content = new Vector(candidates.size());
 		for (int i = 0; i < candidates.size(); i++) {
-			CMElementDeclaration candidate = (CMElementDeclaration) candidates.elementAt(i);
-			if (candidate == null)
-				continue;
-			if (isExcluded(candidate, element))
-				continue;
-			content.add(candidate);
+			Object eCandidate = candidates.elementAt(i);
+			if(eCandidate instanceof CMElementDeclaration) {
+				CMElementDeclaration candidate = (CMElementDeclaration) eCandidate;
+				if (candidate == null)
+					continue;
+				if (isExcluded(candidate, element))
+					continue;
+				content.add(candidate);
+			}
 		}
 
 		return content;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java
new file mode 100644
index 0000000..4c44297
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.modelquery;
+
+
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.XMLAssociationProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.w3c.dom.Document;
+
+/**
+ * A Class to provide an association between XHTML documents and DTDs for
+ * XHTML. This class is intended to be used only in HTMLModelQueryCMProvider.
+ */
+/*
+ * This class closely resemble XMLModelQueryAssociationProvider.
+ */
+class XHTMLAssociationProvider extends XMLAssociationProvider {
+	
+	/**
+	 * set CACHE_FIXED_DOCUMENTS to false to test effects of not caching certain catalog-contributed schemas.
+	 */
+	private static final boolean CACHE_FIXED_DOCUMENTS = true;
+	private static final String[] STANDARD_SCHEMA_BUNDLES = new String[] {"org.eclipse.wst.standard.schemas","org.eclipse.jst.standard.schemas"};
+	private static final String XML_CATALOG_EXT_POINT = "org.eclipse.wst.xml.core.catalogContributions"; 
+	private static Collection fFixedPublicIDs = null;
+	private static Map fFixedCMDocuments = new HashMap();
+
+	/**
+	 * set USE_QUICK_CACHE to false to test effects of not caching at all.
+	 */
+	private static final boolean USE_QUICK_CACHE = true;
+	protected URIResolver idResolver;
+	private String fCachedGrammerURI;
+	private String fCachedPublicID;
+	private String fCachedSystemID;
+	private boolean cached;
+
+	public XHTMLAssociationProvider(CMDocumentCache cache, URIResolver idResolver) {
+		super(cache);
+		this.idResolver = idResolver;
+		   
+		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=136399. If the CM document URI
+		// is resolved and cached at this level instruct the CM model manager to avoid 
+		// re-resolving the URI.
+
+		if (USE_QUICK_CACHE) {
+		  documentManager.setPropertyEnabled(CMDocumentManager.PROPERTY_PERFORM_URI_RESOLUTION, false);
+		}
+	}
+
+	/**
+	 * 
+	 * @param publicId
+	 * @param systemId
+	 * @return
+	 */
+	public CMDocument getXHTMLCMDocument(String publicId, String systemId) {
+		if (idResolver == null)
+			return null;
+		
+		String grammerURI = null;
+		if (USE_QUICK_CACHE) {
+			/*
+			 * In parsing a document, we get many identical requests to this
+			 * method, so instead of looking up (resolving) grammerURI each
+			 * time, we'll just return previously cached one. Probably not
+			 * worth have a more complex cache than that.
+			 */
+			if (cached && sameAs(fCachedPublicID, publicId) && sameAs(fCachedSystemID, systemId)) {
+				grammerURI = fCachedGrammerURI;
+			}
+			else {
+				grammerURI = idResolver.resolve(null, publicId, systemId);
+				fCachedGrammerURI = grammerURI;
+				fCachedPublicID = publicId;
+				fCachedSystemID = systemId;
+				cached = true;
+			}
+		}
+		else {
+			grammerURI = idResolver.resolve(null, publicId, systemId);
+		}
+
+		if (grammerURI == null)
+			return null;
+		
+		CMDocument cmDocument = null;
+		if (CACHE_FIXED_DOCUMENTS) {
+			Reference ref = (Reference) fFixedCMDocuments.get(publicId);
+			if (ref != null) {
+				cmDocument = (CMDocument) ref.get();
+				if (cmDocument != null) {
+					return cmDocument;
+				}
+			}
+		}
+		
+		/*
+		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=88896
+		 * 
+		 * We once called the deprecated 2 argument form of getCMDocument.
+		 * 
+		 * CMDocument cmDocument = documentManager.getCMDocument(publicId,
+		 * grammerURI);
+		 * 
+		 * which eventually resulted in empty string for type, which I don't
+		 * think the infrastructure handles any longer. So, I deleted
+		 * deprecated methods, and switched to null for type argument.
+		 * 
+		 * 'null' means to "create based on uri".
+		 * 
+		 * FYI, 'dtd' would mean load only those registered as dtd's
+		 * 
+		 * CMDocument cmDocument = documentManager.getCMDocument(publicId,
+		 * grammerURI); CMDocument cmDocument =
+		 * documentManager.getCMDocument(publicId, grammerURI, "dtd");
+		 */
+		synchronized (grammerURI) {
+			cmDocument = documentManager.getCMDocument(publicId, grammerURI, null);
+		}
+		
+		if (CACHE_FIXED_DOCUMENTS && getFixedPublicIDs().contains(publicId)) {
+			fFixedCMDocuments.put(publicId, new SoftReference(cmDocument));
+		}
+		
+		return cmDocument;
+	}
+
+	/**
+	 */
+	protected String resolveGrammarURI(Document document, String publicId, String systemId) {
+		return idResolver.resolve(null, publicId, systemId);
+	}
+
+	private boolean sameAs(String a, String b) {
+		boolean result = false;
+		if (a == null) {
+			result = b == null;
+		}
+		else {
+			result = a.equals(b);
+		}
+		return result;
+	}
+
+	/**
+	 * This added and/or made public specifically for experimentation. It
+	 * will change as this functionality becomes API. See
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=119084
+	 */
+	public String getCachedGrammerURI() {
+		return fCachedGrammerURI;
+	}
+
+	/**
+	 * @return the fFixedPublicIDs, a collection of contributed Public
+	 *         Identifiers from the known schema plug-ins.
+	 */
+	private static Collection getFixedPublicIDs() {
+		/**
+		 * public:publicId
+		 * TODO: system:systemId and uri:name in their own methods and maps?
+		 */
+		synchronized (STANDARD_SCHEMA_BUNDLES) {
+			if (fFixedPublicIDs == null) {
+				fFixedPublicIDs = new HashSet();
+				for (int i = 0; i < STANDARD_SCHEMA_BUNDLES.length; i++) {
+					IExtension[] extensions = Platform.getExtensionRegistry().getExtensions(STANDARD_SCHEMA_BUNDLES[i]);
+					for (int j = 0; j < extensions.length; j++) {
+						if (XML_CATALOG_EXT_POINT.equals(extensions[j].getExtensionPointUniqueIdentifier())) {
+							IConfigurationElement[] configurationElements = extensions[j].getConfigurationElements();
+							for (int k = 0; k < configurationElements.length; k++) {
+								IConfigurationElement[] publics = configurationElements[k].getChildren("public");
+								for (int l = 0; l < publics.length; l++) {
+									String publicId = publics[l].getAttribute("publicId");
+									if (publicId != null && publicId.length() > 0) {
+										fFixedPublicIDs.add(publicId);
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return fFixedPublicIDs;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java
index 44e2146..3130e16 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -61,6 +61,8 @@
 		// this could be made smarter by actually looking up the content
 		// type's valid extensions
 		node.put(HTMLCorePreferenceNames.DEFAULT_EXTENSION, "html"); //$NON-NLS-1$
+
+		node.put(HTMLCorePreferenceNames.INLINE_ELEMENTS, "a,abbr,acronym,b,basefont,big,br,cite,em,font,i,img,input,label,li,q,s,select,small,span,strike,strong,sub,sup,td,th,title,u");
 		
 		initializeValidationPreferences(node);
 	}
@@ -79,13 +81,16 @@
 		node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_DUPLICATE, ValidationMessage.WARNING);
 		node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_MISMATCH, ValidationMessage.ERROR);
 		node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_UNCLOSED, ValidationMessage.WARNING);
+		node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND, ValidationMessage.IGNORE);
+		node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_OBSOLETE_NAME, ValidationMessage.WARNING);
+		
 		
 		// Elements
 		node.putInt(HTMLCorePreferenceNames.ELEM_UNKNOWN_NAME, ValidationMessage.WARNING);
 		node.putInt(HTMLCorePreferenceNames.ELEM_INVALID_NAME, ValidationMessage.ERROR);
 		node.putInt(HTMLCorePreferenceNames.ELEM_START_INVALID_CASE, ValidationMessage.WARNING);
 		node.putInt(HTMLCorePreferenceNames.ELEM_END_INVALID_CASE, ValidationMessage.ERROR);
-		node.putInt(HTMLCorePreferenceNames.ELEM_MISSING_START, ValidationMessage.ERROR);
+		node.putInt(HTMLCorePreferenceNames.ELEM_MISSING_START, ValidationMessage.WARNING);
 		node.putInt(HTMLCorePreferenceNames.ELEM_MISSING_END, ValidationMessage.WARNING);
 		node.putInt(HTMLCorePreferenceNames.ELEM_UNNECESSARY_END, ValidationMessage.WARNING);
 		node.putInt(HTMLCorePreferenceNames.ELEM_INVALID_DIRECTIVE, ValidationMessage.ERROR);
@@ -95,6 +100,8 @@
 		node.putInt(HTMLCorePreferenceNames.ELEM_UNCLOSED_START_TAG, ValidationMessage.ERROR);
 		node.putInt(HTMLCorePreferenceNames.ELEM_UNCLOSED_END_TAG, ValidationMessage.ERROR);
 		node.putInt(HTMLCorePreferenceNames.ELEM_INVALID_EMPTY_TAG, ValidationMessage.WARNING);
+		node.putInt(HTMLCorePreferenceNames.ELEM_OBSOLETE_NAME, ValidationMessage.WARNING);
+		
 		
 		// DOCTYPE
 		node.putInt(HTMLCorePreferenceNames.DOC_DUPLICATE, ValidationMessage.ERROR);
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceNames.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceNames.java
index f4d3644..af1e90f 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceNames.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceNames.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -198,6 +198,14 @@
 	public static final String ATTR_NAME_CASE = "attrNameCase";//$NON-NLS-1$
 
 	/**
+	 * Preferred elements to be considered as inline for the purposes of formatting
+	 * <p>
+	 * Value is a comma-separated list of element names
+	 * </p>
+	 */
+	public static final String INLINE_ELEMENTS = "inlineElements"; //$NON-NLS-1$
+
+	/**
 	 * Possible value for the preference #TAG_NAME_CASE or #ATTR_NAME_CASE.
 	 * Indicates to leave case as is.
 	 * 
@@ -240,6 +248,9 @@
 	public static final String ATTRIBUTE_DUPLICATE = "attrDuplicate";//$NON-NLS-1$
 	public static final String ATTRIBUTE_VALUE_MISMATCH = "attrValueMismatch";//$NON-NLS-1$
 	public static final String ATTRIBUTE_VALUE_UNCLOSED = "attrValueUnclosed";//$NON-NLS-1$
+	public static final String ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND = "resourceNotFound";//$NON-NLS-1$
+	public static final String ATTRIBUTE_OBSOLETE_NAME = "attrObsoleteName";//$NON-NLS-1$
+	
 	
 	public static final String ELEM_UNKNOWN_NAME = "elemUnknownName";//$NON-NLS-1$
 	public static final String ELEM_INVALID_NAME = "elemInvalidName";//$NON-NLS-1$
@@ -255,6 +266,7 @@
 	public static final String ELEM_UNCLOSED_START_TAG = "elemUnclosedStartTag";//$NON-NLS-1$
 	public static final String ELEM_UNCLOSED_END_TAG = "elemUnclosedEndTag";//$NON-NLS-1$
 	public static final String ELEM_INVALID_EMPTY_TAG = "elemInvalidEmptyTag";//$NON-NLS-1$
+	public static final String ELEM_OBSOLETE_NAME = "elemObsoleteName";//$NON-NLS-1$
 	
 	public static final String DOC_DUPLICATE = "docDuplicateTag";//$NON-NLS-1$
 	public static final String DOC_INVALID_CONTENT = "docInvalidContent";//$NON-NLS-1$
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/provisional/HTML50Namespace.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/provisional/HTML50Namespace.java
new file mode 100644
index 0000000..e20fdac
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/provisional/HTML50Namespace.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.provisional;
+
+public interface HTML50Namespace extends HTML40Namespace {
+
+	public static interface ElementName extends HTML40Namespace.ElementName {
+		String ARTICLE = "article"; //$NON-NLS-1$
+		String ASIDE = "aside"; //$NON-NLS-1$
+		String AUDIO = "audio";
+		String CANVAS = "canvas";
+		String COMMAND = "command";
+		String DATALIST = "datalist";
+		String DETAILS = "details";
+		String FIGURE = "figure"; //$NON-NLS-1$
+		String FIGCAPTION = "figcaption"; //$NON-NLS-1$
+		String FOOTER = "footer"; //$NON-NLS-1$
+		String HEADER = "header";
+		String HGROUP = "hgroup";
+		String KEYGEN = "keygen";
+		String MARK = "mark";
+		String MATH = "math";
+		String METER = "meter";
+		String NAV = "nav";
+		String OUTPUT = "output";
+		String PROGRESS = "progress";
+		String RP = "rp";
+		String RT = "rt";
+		String RUBY = "ruby";
+		String SECTION = "section"; //$NON-NLS-1$
+		String SOURCE = "source";
+		String SUMMARY = "summary";
+		String SVG = "svg";
+		String TIME = "time";
+		String VIDEO = "video";
+	}
+
+	String HTML50_URI = "http://www.w3.org/TR/html50/";
+	String HTML50_TAG_PREFIX = "";
+
+	// global attribute names
+	String ATTR_NAME_CONTENT_EDITABLE = "contenteditable"; // %coreattrs; //$NON-NLS-1$
+	String ATTR_NAME_CONTEXT_MENU = "contextmenu"; // %coreattrs; //$NON-NLS-1$
+	String ATTR_NAME_DRAGGABLE = "draggable"; // %coreattrs; //$NON-NLS-1$
+	String ATTR_NAME_ROLE = "role"; // %coreattrs; //$NON_NLS-1$
+	String ATTR_NAME_SPELLCHECK = "spellcheck"; // %coreattrs; //$NON-NLS-1$
+	String ATTR_NAME_ONABORT = "onabort"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONCAN_PLAY = "oncanplay"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONCAN_PLAY_THROUGH = "oncanplaythrough"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONCONTEXT_MENU = "oncontextmenu"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDRAG = "ondrag"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDRAG_END = "ondragend"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDRAG_OVER = "ondragover"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDRAG_ENTER = "ondragenter"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDRAG_LEAVE = "ondragleave"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDRAG_START = "ondragstart"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDROP = "ondrop"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONDURATION_CHANGE = "ondurationchange"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONEMPTIED = "onemptied"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONENDED = "onended"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONERROR = "onerror"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONFORM_CHANGE = "onformchange"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONFORM_INPUT = "onforminput"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONINPUT = "oninput"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONINVALID = "oninvalid"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONLOADED_DATA = "onloadeddata"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONLOADED_METADATA = "onloadedmetadeta"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONLOAD_START = "onloadstart"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONMOUSE_WHEEL = "onmousewheel"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONPAUSE = "onpause"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONPLAY = "onplay"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONPLAYING = "onplaying"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONPROGRESS = "onprogress"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONRATE_CHANGE = "onratechange"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONREADY_STATE_CHANGE = "onreadystatechange"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONSCROLL = "onscroll"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONSEEKED = "onseeked"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONSEEKING = "onseeking"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONSHOW = "onshow"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONSTALLED = "onstalled"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONSUSPEND = "onsuspend"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONTIME_UPDATE = "ontimeupdate"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONVOLUME_UPDATE = "onvolumeupdate"; // %event; //$NON-NLS-1$
+	String ATTR_NAME_ONWAITING = "onwaiting"; // %event; //$NON-NLS-1$
+
+	String ATTR_NAME_PING = "ping";
+	String ATTR_NAME_AUTOFOCUS = "autofocus";
+	String ATTR_NAME_CHALLENGE = "challenge";
+	String ATTR_NAME_FORM = "form";
+	String ATTR_NAME_KEYTYPE = "keytype";
+	String ATTR_NAME_REQUIRED = "required";
+	String ATTR_NAME_AUTOCOMPLETE = "autocomplete"; // input
+	String ATTR_NAME_MIN = "min"; // input
+	String ATTR_NAME_MAX = "max"; // input
+	String ATTR_NAME_PATTERN = "pattern"; // input
+	String ATTR_NAME_STEP = "step"; // input
+	String ATTR_NAME_NOVALIDATE = "novalidate"; // form
+	String ATTR_NAME_FORMACTION = "formaction"; // input|button
+	String ATTR_NAME_FORMENCTYPE = "formenctype"; // input|button
+	String ATTR_NAME_FORMMETHOD = "formmethod"; // input|button
+	String ATTR_NAME_FORMNOVALIDATE = "formnovalidate"; // input|button
+	String ATTR_NAME_FORMTARGET = "formtarget"; // input|button
+	String ATTR_NAME_SCOPED = "scoped"; // style
+	String ATTR_NAME_ASYNC = "async"; // script
+	String ATTR_NAME_MANIFEST = "manifest"; // html
+	String ATTR_NAME_SIZES = "sizes"; // link
+	String ATTR_NAME_REVERSED = "reversed"; // ol
+	String ATTR_NAME_SANDBOX = "sandbox"; // iframe
+	String ATTR_NAME_SEAMLESS = "seamless"; // iframe
+	String ATTR_NAME_SRCDOC = "srcdoc"; // iframe
+	String ATTR_NAME_PRELOAD = "preload"; // %mediaElement; //$NON-NLS-1$
+	String ATTR_NAME_AUTOPLAY = "autoplay"; // %mediaElement; //$NON-NLS-1$
+	String ATTR_NAME_LOOP = "loop"; // %mediaElement; //$NON-NLS-1$
+	String ATTR_NAME_CONTROLS = "controls"; // %mediaElement; //$NON-NLS-1$
+	String ATTR_NAME_POSTER = "poster"; // %video; //$NON-NLS-1$
+	String ATTR_NAME_OPEN = "open"; // details //$NON-NLS-1$
+	String ATTR_NAME_PUBDATE = "pubdate"; //time //$NON-NLS-1$
+	String ATTR_NAME_LOW = "low"; //meter //$NON-NLS-1$
+	String ATTR_NAME_HIGH = "high"; //meter //$NON-NLS-1$
+	String ATTR_NAME_OPTIMUM = "optimum"; //meter //$NON-NLS-1$
+	String ATTR_NAME_ICON = "icon"; //command //$NON-NLS-1$
+	String ATTR_NAME_RADIOGROUP = "radiogroup"; //command //$NON-NLS-1$
+	String ATTR_NAME_LIST = "list"; //input //$NON-NLS-1$
+	String ATTR_NAME_PLACEHOLDER = "placeholder"; //input //$NON-NLS-1$
+	String ATTR_NAME_WRAP = "wrap"; //textarea //$NON-NLS-1$
+	String ATTR_NAME_XMLNS = "xmlns"; //html //$NON-NLS-1$
+	
+	// Global attributes properties
+
+	// for contenteditable (EMPTY|TRUE|FALSE|INHERIT)
+	String ATTR_VALUE_EMPTY = ""; // contenteditable //$NON-NLS-1$
+	String ATTR_VALUE_INHERIT = "inherit"; // contenteditable //$NON-NLS-1$
+	
+	// for MediaElement (Audio/Video) 
+	String ATTR_VALUE_METADATA = "metadata"; // mediaelement //$NON-NLS-1$
+	
+	// for Command
+	String ATTR_VALUE_COMMAND = "command"; //command //$NON-NLS-1$
+	
+	//Input type
+	String ATTR_VALUE_SEARCH = "search"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_TEL = "tel"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_URL = "url"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_EMAIL = "email"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_DATE = "date"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_DATETIME = "datetime"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_MONTH = "month"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_WEEK = "week"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_TIME = "time"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_DATETIME_LOCAL = "datetime-local"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_RANGE = "range"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_COLOR = "color"; //input type //$NON-NLS-1$
+	String ATTR_VALUE_NUMBER_STRING = "number"; //input type //$NON-NLS-1$
+
+	String ATTR_VALUE_ON = "on"; //input autocomplete //$NON-NLS-1$
+	String ATTR_VALUE_OFF = "off"; //input autocomplete //$NON-NLS-1$
+	
+	String ATTR_VALUE_PUT = "PUT"; //input formmethod //$NON-NLS-1$
+	String ATTR_VALUE_DELETE = "DELETE"; //input formmethod //$NON-NLS-1$
+	
+	String ATTR_VALUE_FORM_DATA = "multipart/form-data"; //input formencType //$NON-NLS-1$
+	String ATTR_VALUE_PLAIN = "text/plain"; //input formencType //$NON-NLS-1$
+	
+	String ATTR_VALUE_SOFT = "soft"; //textarea wrap //$NON-NLS-1$
+	String ATTR_VALUE_HARD = "hard"; //textarea wrap //$NON-NLS-1$
+	
+	
+	String ATTR_VALUE_CONTEXT = "context"; //menu type //$NON-NLS-1$
+	String ATTR_VALUE_TOOLBAR = "toolbar"; //menu type //$NON-NLS-1$
+	String ATTR_VALUE_LIST = "list"; //menu type //$NON-NLS-1$
+		
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/provisional/HTMLCMProperties.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/provisional/HTMLCMProperties.java
index 1d7a753..8098721 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/provisional/HTMLCMProperties.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/provisional/HTMLCMProperties.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -78,6 +78,11 @@
 	 * "isScriptable" returns java.lang.Boolean object.
 	 */
 	public static final String IS_SCRIPTABLE = "isScriptable"; //$NON-NLS-1$
+	/**
+	 * "isObsolete" returns java.lang.Boolean object.
+	 */
+	public static final String IS_OBSOLETE = "isObsolete";//$NON-NLS-1$
+	
 
 	public static interface Values {
 		/*
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java
index fdde5c7..08c61ee 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -51,7 +51,15 @@
 		HTML40Namespace.ATTR_NAME_ONKEYPRESS,
 		HTML40Namespace.ATTR_NAME_ONKEYDOWN,
 		HTML40Namespace.ATTR_NAME_ONKEYUP,
-		HTML40Namespace.ATTR_NAME_ONHELP};
+		HTML40Namespace.ATTR_NAME_ONHELP,
+		HTML40Namespace.ATTR_NAME_ONBLUR,
+		HTML40Namespace.ATTR_NAME_ONFOCUS,
+		HTML40Namespace.ATTR_NAME_ONLOAD,
+		HTML40Namespace.ATTR_NAME_ONUNLOAD,
+		HTML40Namespace.ATTR_NAME_ONSUBMIT};
+	
+	/** array of style attribute names */
+	private static final String[] STYLE_ATTRIBUTE_NAMES =  {HTML40Namespace.ATTR_NAME_STYLE};
 	
 	public StructuredTextPartitionerForHTML() {
 		super();
@@ -105,6 +113,15 @@
 							language = StringUtils.strip(node.getText(region));
 						else if (attrName.equalsIgnoreCase(HTML40Namespace.ATTR_NAME_TYPE)) {
 							type = StringUtils.strip(node.getText(region));
+							/*
+							 * Avoid partition names built with MIME subtypes,
+							 * e.g. type="text/javascript;e4x=1"
+							 */
+							if (type != null) {
+								int index = type.indexOf(';');
+								if (index > 1)
+									type = type.substring(0, index);
+							}
 							break;
 						}
 						attrNameRegion = null;
@@ -143,12 +160,14 @@
 
 	public String getPartitionType(ITextRegion region, int offset) {
 		String result = null;
-		if (region.getType() == DOMRegionContext.XML_COMMENT_TEXT || region.getType() == DOMRegionContext.XML_COMMENT_OPEN)
+		if (region.getType() == DOMRegionContext.XML_COMMENT_TEXT || region.getType() == DOMRegionContext.XML_COMMENT_OPEN || region.getType() == DOMRegionContext.XML_COMMENT_CLOSE)
 			result = IHTMLPartitions.HTML_COMMENT;
 		else if (region.getType() == DOMRegionContext.XML_DOCTYPE_DECLARATION || region.getType() == DOMRegionContext.XML_DECLARATION_OPEN)
 			result = IHTMLPartitions.HTML_DECLARATION;
 		else if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE && isScriptAttributeValue(region, offset))
 			result = IHTMLPartitions.SCRIPT_EVENTHANDLER;
+		else if (isStyleAttributeValue(region, offset))
+			result = ICSSPartitions.STYLE;
 		else
 			result = super.getPartitionType(region, offset);
 		return result;
@@ -198,7 +217,7 @@
 		}
 		else if (tagname.equalsIgnoreCase(HTML40Namespace.ElementName.SCRIPT))
 			result = IHTMLPartitions.SCRIPT;
-		else if (tagname.equalsIgnoreCase(HTML40Namespace.ElementName.STYLE))
+		else if (tagname.equalsIgnoreCase(HTML40Namespace.ElementName.STYLE) || isStyleAttributeValue(region,offset))
 			result = ICSSPartitions.STYLE;
 		else if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE && isScriptAttributeValue(region, offset))
 			result = IHTMLPartitions.SCRIPT_EVENTHANDLER;
@@ -227,14 +246,41 @@
 		if (region.getType() != DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)
 			return false;
 
-		return isAttributeNameForValueAnEventScript(region, offset);
+		return isAttributeNameForValueInArray(EVENT_ATTRIBUTE_NAMES, region, offset);
 	}
+	
+	/**
+	 * @param region {@link ITextRegion} containing <code>offset</code>
+	 * @param offset offset in the given <code>region</code> to check if it is in
+	 * the attribute value region of a style attribute
+	 * @return <code>true</code> if the given offset in the given region is
+	 * in the value region of a style attribute, <code>false</code> otherwise
+	 */
+	private boolean isStyleAttributeValue(ITextRegion region, int offset) {
+		boolean isStyleAttributeValue = false;
+		if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+			isStyleAttributeValue = isAttributeNameForValueInArray(STYLE_ATTRIBUTE_NAMES, region, offset);
+		}
 
-	private boolean isAttributeNameForValueAnEventScript(ITextRegion attrValueRegion, int offset) {
+		return isStyleAttributeValue;
+	}
+	
+	/**
+	 * <p>determines if the attribute name associated with the given attribute region
+	 * is in the given array of attribute names</p>
+	 * 
+	 * @param attributeNames determine if the attribute name associated with the given offset
+	 * is in this array of attribute names
+	 * @param attrValueRegion {@link ITextRegion} of the attribute region containing the given offset
+	 * @param offset offset in an attribute region to determine if it is in the list of given attribute names
+	 * @return <code>true</code> if the attribute name associated with the given offset is in the given
+	 * list of attribute names, <code>false</code> otherwise
+	 */
+	private boolean isAttributeNameForValueInArray(String[] attributeNames, ITextRegion attrValueRegion, int offset) {
 		IStructuredDocumentRegion node = fStructuredDocument.getRegionAtCharacterOffset(offset);
 		ITextRegionList regionList = node.getRegions();
 		int currentIndex = regionList.indexOf(attrValueRegion);
-
+		
 		/*
 		 * 4 is the minimum index allowing for the tag's open, name, attribute
 		 * name and equals character to appear first
@@ -243,17 +289,30 @@
 			return false;
 		ITextRegion tagAttrNameRegion = regionList.get(currentIndex - 2);
 		
-		boolean isEvent = false;
+		boolean foundAttributeName = false;
 		if (fStructuredDocument instanceof IRegionComparible) {
 			int start = node.getStartOffset(tagAttrNameRegion);
-			for (int i = 0; !isEvent && i < EVENT_ATTRIBUTE_NAMES.length; i++) {
-				isEvent = ((IRegionComparible) fStructuredDocument).regionMatchesIgnoreCase(start, tagAttrNameRegion.getTextLength(), EVENT_ATTRIBUTE_NAMES[i]);
+			for (int i = 0; !foundAttributeName && i < attributeNames.length; i++) {
+				foundAttributeName = ((IRegionComparible) fStructuredDocument).regionMatchesIgnoreCase(start, tagAttrNameRegion.getTextLength(), attributeNames[i]);
 			}
 		}
 		else {
 			String tagAttrName = node.getText(tagAttrNameRegion);
-			isEvent = StringUtils.contains(EVENT_ATTRIBUTE_NAMES, tagAttrName, false);
+			foundAttributeName = StringUtils.contains(attributeNames, tagAttrName, false);
 		}
-		return isEvent;
+		return foundAttributeName;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner#getParserSpecificPreviousRegion(org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion)
+	 */
+	protected IStructuredDocumentRegion getParserSpecificPreviousRegion(IStructuredDocumentRegion currentRegion) {
+		if (currentRegion == null)
+			return null;
+		do {
+			currentRegion = currentRegion.getPrevious();
+		} while (currentRegion != null && currentRegion.getType().equals(DOMRegionContext.BLOCK_TEXT));
+
+		return currentRegion;
 	}
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java
index 1809abd..9633916 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -197,4 +197,16 @@
 		}
 		return false;
 	}
+	
+	/**
+	 * The method to distinguish HTML and XHTML from other mark up.
+	 * This method returns true if the target is,
+	 * (1) not JSP,
+	 * (2) not SSI.
+	 */
+	public static boolean isObsolete(CMNode decl) {
+		return decl.supports(HTMLCMProperties.IS_OBSOLETE) && ((Boolean)(decl.getProperty(HTMLCMProperties.IS_OBSOLETE))).booleanValue();
+	}
+	
+	
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java
index 8097da4..4710a1e 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java
@@ -37,6 +37,7 @@
 					case UNDEFINED_VALUE_ERROR :
 					case MISMATCHED_VALUE_ERROR :
 					case UNCLOSED_ATTR_VALUE :
+					case RESOURCE_NOT_FOUND :
 						//D210422
 						return ((Attr) target).getValue();
 					default :
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java
index 17af433..f64d50e 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,6 +18,9 @@
 	static final int UNDEFINED_NAME_ERROR = 11;
 	static final int UNDEFINED_VALUE_ERROR = 12;
 	static final int MISMATCHED_VALUE_ERROR = 13;
+	static final int OBSOLETE_ATTR_NAME_ERROR = 14;
+	static final int OBSOLETE_TAG_NAME_ERROR = 15;
+	
 	// format error
 	static final int FORMAT_ERROR_LEVEL = 100;
 	static final int INVALID_NAME_ERROR = 101;
@@ -33,6 +36,7 @@
 	static final int UNCLOSED_END_TAG_ERROR = 111;
 	static final int INVALID_EMPTY_ELEMENT_TAG = 112;
 	static final int UNCLOSED_ATTR_VALUE = 113; //D210422
+	static final int RESOURCE_NOT_FOUND = 114; //D210422
 	// layout error
 	static final int LAYOUT_ERROR_LEVEL = 1000;
 	static final int INVALID_CONTENT_ERROR = 1001;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java
index a548dea..f3ee02a 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2008 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,7 +13,11 @@
 
 
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
 
 final class FMUtil {
 
@@ -21,6 +25,8 @@
 	public final static int SEG_WHOLE_TAG = 1;
 	public final static int SEG_START_TAG = 2;
 	public final static int SEG_END_TAG = 3;
+	public final static int SEG_START_TAG_NAME = 4;
+	public final static int SEG_END_TAG_NAME = 5;
 
 	/**
 	 */
@@ -55,7 +61,7 @@
 					seg = new Segment(startTag);
 				}
 				else {
-					seg = new Segment(target.getStartOffset(), 0);
+					seg = new Segment(target.getStartOffset(), 1);
 				}
 				break;
 			case SEG_END_TAG :
@@ -64,7 +70,31 @@
 					seg = new Segment(endTag);
 				}
 				else {
-					seg = new Segment(target.getEndOffset(), 0);
+					seg = new Segment(target.getEndOffset(), 1);
+				}
+				break;
+			case SEG_START_TAG_NAME :
+				startTag = target.getStartStructuredDocumentRegion();
+				if (startTag != null) {
+					ITextRegion nameRegion = getNameRegion(startTag);
+					if (nameRegion != null) {
+						seg = new Segment(startTag.getStartOffset(nameRegion), nameRegion.getTextLength());
+					}
+				}
+				if (seg == null) {
+					seg = getSegment(target, SEG_START_TAG);
+				}
+				break;
+			case SEG_END_TAG_NAME :
+				endTag = target.getEndStructuredDocumentRegion();
+				if (endTag != null) {
+					ITextRegion nameRegion = getNameRegion(endTag);
+					if (nameRegion != null) {
+						seg = new Segment(endTag.getStartOffset(nameRegion), nameRegion.getTextLength());
+					}
+				}
+				if (seg == null) {
+					seg = getSegment(target, SEG_END_TAG);
 				}
 				break;
 			case SEG_NONE :
@@ -74,5 +104,17 @@
 		return seg;
 	}
 
+	private static ITextRegion getNameRegion(ITextRegionCollection containerRegion) {
+		ITextRegionList regions = containerRegion.getRegions();
+		ITextRegion nameRegion = null;
+		for (int i = 0; i < regions.size(); i++) {
+			ITextRegion r = regions.get(i);
+			if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+				nameRegion = r;
+				break;
+			}
+		}
+		return nameRegion ;
+	}
 
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java
index a4a0279..76e9d2f 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,14 +10,17 @@
  *******************************************************************************/
 package org.eclipse.wst.html.core.internal.validate;
 
-
-
-import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeConstants;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
@@ -26,8 +29,8 @@
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
 import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
@@ -44,6 +47,11 @@
 	private static final char SINGLE_QUOTE = '\'';
 	private static final char DOUBLE_QUOTE = '\"';
 
+	private static final String ATTR_NAME_DATA = "data-"; //$NON-NLS-1$
+	//WHATWG x-vendor-feature attributes
+	private static final String ATTR_NAME_USER_AGENT_FEATURE = "x-"; //$NON-NLS-1$
+	private static final int ATTR_NAME_USER_AGENT_FEATURE_LENGTH = ATTR_NAME_USER_AGENT_FEATURE.length();
+
 	// D210422
 	/**
 	 * HTMLAttributeValidator constructor comment.
@@ -71,13 +79,17 @@
 			if (errorNode instanceof IDOMAttr) {
 				IDOMElement ownerElement = (IDOMElement) ((IDOMAttr) errorNode).getOwnerElement();
 				if (ownerElement != null) {
-					int regionStartOffset = ownerElement.getFirstStructuredDocumentRegion().getStartOffset(rgn);
-					int regionLength = rgn.getLength();
-					return new Segment(regionStartOffset, regionLength);
+					//if editor closed during validation this could be null
+					IStructuredDocumentRegion firstRegion = ownerElement.getFirstStructuredDocumentRegion();
+					if(firstRegion != null) {
+						int regionStartOffset = firstRegion.getStartOffset(rgn);
+						int regionLength = rgn.getTextLength();
+						return new Segment(regionStartOffset, regionLength);
+					}
 				}
 			}
 		}
-		return new Segment(errorNode.getStartOffset(), 0);
+		return new Segment(errorNode.getStartOffset(), 1);
 	}
 
 	/**
@@ -99,38 +111,7 @@
 			return;
 		CMNamedNodeMap declarations = edec.getAttributes();
 
-		CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(declarations) {
-			private Map caseInsensitive;
-			
-			private Map getCaseInsensitiveMap() {
-				if(caseInsensitive == null)
-					caseInsensitive = new HashMap();
-				return caseInsensitive;
-			}
-
-			public CMNode getNamedItem(String name) {
-				CMNode node = super.getNamedItem(name);
-				if (node == null) {
-					node = (CMNode) getCaseInsensitiveMap().get(name.toLowerCase(Locale.US));
-				}
-				return node;
-			}
-
-			public void put(CMNode cmNode) {
-				super.put(cmNode);
-				getCaseInsensitiveMap().put(cmNode.getNodeName().toLowerCase(Locale.US), cmNode);
-			}
-		};
-
-		List nodes = ModelQueryUtil.getModelQuery(target.getOwnerDocument()).getAvailableContent((Element) node, edec, ModelQuery.INCLUDE_ATTRIBUTES);
-		for (int k = 0; k < nodes.size(); k++) {
-			CMNode cmnode = (CMNode) nodes.get(k);
-			if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
-				allAttributes.put(cmnode);
-			}
-		}
-		declarations = allAttributes;
-
+		List modelQueryNodes = null;
 		NamedNodeMap attrs = target.getAttributes();
 		for (int i = 0; i < attrs.getLength(); i++) {
 			int rgnType = REGION_NAME;
@@ -150,7 +131,28 @@
 			}
 
 			CMAttributeDeclaration adec = (CMAttributeDeclaration) declarations.getNamedItem(a.getName());
+			final String attrName = a.getName().toLowerCase(Locale.US);
+			/* Check the modelquery if nothing is declared by the element declaration */
 			if (adec == null) {
+				if (modelQueryNodes == null)
+					modelQueryNodes = ModelQueryUtil.getModelQuery(target.getOwnerDocument()).getAvailableContent((Element) node, edec, ModelQuery.INCLUDE_ATTRIBUTES);
+				
+				
+				for (int k = 0; k < modelQueryNodes.size(); k++) {
+					CMNode cmnode = (CMNode) modelQueryNodes.get(k);
+					if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION && cmnode.getNodeName().toLowerCase(Locale.US).equals(attrName)) {
+						adec = (CMAttributeDeclaration) cmnode;
+						break;
+					}
+				}
+			}
+			
+			if (adec == null) {
+				if ((attrName.startsWith(ATTR_NAME_DATA) && attrName.length() > ATTR_NAME_DATA.length()) || (attrName.startsWith(ATTR_NAME_USER_AGENT_FEATURE) && attrName.length() > ATTR_NAME_USER_AGENT_FEATURE_LENGTH)) {
+					DocumentTypeAdapter documentTypeAdapter = (DocumentTypeAdapter) ((INodeNotifier) target.getOwnerDocument()).getAdapterFor(DocumentTypeAdapter.class);
+					if (documentTypeAdapter != null && documentTypeAdapter.hasFeature(HTMLDocumentTypeConstants.HTML5))
+						continue;
+				}
 				// No attr declaration was found. That is, the attr name is
 				// undefined.
 				// but not regard it as undefined name if it includes nested
@@ -162,6 +164,9 @@
 			} else {
 				// The attr declaration was found.
 				// At 1st, the name should be checked.
+				if (CMUtil.isObsolete(adec)){
+					state = ErrorState.OBSOLETE_ATTR_NAME_ERROR;
+				}
 				if (CMUtil.isHTML(edec) && (!CMUtil.isXHTML(edec))) {
 					// If the target element is pure HTML (not XHTML), some
 					// attributes
@@ -193,32 +198,67 @@
 							rgnType = REGION_VALUE;
 							state = ErrorState.UNDEFINED_VALUE_ERROR;
 						}
-					} else {
-						String[] candidates = attrType.getEnumeratedValues();
-						if (candidates != null && candidates.length > 0) {
-							// several candidates are found.
-							boolean found = false;
-							for (int index = 0; index < candidates.length; index++) {
-								String candidate = candidates[index];
+					}
+					else if (CMDataType.URI.equals(attrType.getDataTypeName())) {
+						// TODO: URI validation?
+						if (false && actualValue.indexOf('#') < 0 && actualValue.indexOf(":/") == -1 && CMUtil.isHTML(edec)) { //$NON-NLS-1$ //$NON-NLS-2$
+							IStructuredDocumentRegion start = ((IDOMNode) node).getStartStructuredDocumentRegion();
+							if (start != null && start.getFirstRegion().getTextLength() == 1) {
+								IPath basePath = new Path(((IDOMNode) node).getModel().getBaseLocation());
+								if (basePath.segmentCount() > 1) {
+									IPath path = ModuleCoreSupport.resolve(basePath, actualValue);
+									IResource found = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
+									if (found == null || !found.isAccessible()) {
+										rgnType = REGION_VALUE;
+										state = ErrorState.RESOURCE_NOT_FOUND;
+									}
+								}
+							}
+						}
+					}
+					else if (CMDataType.ENUM.equals(attrType.getDataTypeName())) {
+						/*
+						 * Check current value is valid among a known list.
+						 * There may be enumerated values provided even when
+						 * the datatype is not ENUM, but we'll only validate
+						 * against that list if the type matches.
+						 */
+						String[] enumeratedValues = attrType.getEnumeratedValues();
+						// several candidates are found.
+						boolean found = false;
+						for (int j = 0; j < enumeratedValues.length; j++) {
+							// At 1st, compare ignoring case.
+							if (actualValue.equalsIgnoreCase(enumeratedValues[j])) {
+								found = true;
+								if (CMUtil.isCaseSensitive(edec) && (!actualValue.equals(enumeratedValues[j]))) {
+									rgnType = REGION_VALUE;
+									state = ErrorState.MISMATCHED_VALUE_ERROR;
+								}
+								break; // exit the loop.
+							}
+						}
+						if (!found) {
+							// retrieve and check extended values (retrieval can call extensions, which may take longer)
+							String[] modelQueryExtensionValues = ModelQueryUtil.getModelQuery(target.getOwnerDocument()).getPossibleDataTypeValues((Element) node, adec);
+							// copied loop from above
+							for (int j = 0; j < modelQueryExtensionValues.length; j++) {
 								// At 1st, compare ignoring case.
-								if (actualValue.equalsIgnoreCase(candidate)) {
+								if (actualValue.equalsIgnoreCase(modelQueryExtensionValues[j])) {
 									found = true;
-									if (CMUtil.isCaseSensitive(edec) && (!actualValue.equals(candidate))) {
+									if (CMUtil.isCaseSensitive(edec) && (!actualValue.equals(modelQueryExtensionValues[j]))) {
 										rgnType = REGION_VALUE;
 										state = ErrorState.MISMATCHED_VALUE_ERROR;
 									}
 									break; // exit the loop.
 								}
 							}
-							if (!found) {
-								// No candidate was found. That is,
-								// actualValue is invalid.
-								// but not regard it as undefined value if it
-								// includes nested region.
-								if (!hasNestedRegion(((IDOMNode) a).getValueRegion())) {
-									rgnType = REGION_VALUE;
-									state = ErrorState.UNDEFINED_VALUE_ERROR;
-								}
+							// No candidate was found. That is,
+							// actualValue is invalid.
+							// but not regard it as undefined value if it
+							// includes nested region.
+							if (!hasNestedRegion(((IDOMNode) a).getValueRegion())) {
+								rgnType = REGION_VALUE;
+								state = ErrorState.UNDEFINED_VALUE_ERROR;
 							}
 						}
 					}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java
index 9041574..d7462fe 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,10 +10,10 @@
  *******************************************************************************/
 package org.eclipse.wst.html.core.internal.validate;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
+import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
 import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
@@ -50,7 +50,7 @@
 
 		validateContent(target, target.getFirstChild());
 	}
-
+	
 	private void validateContent(Element parent, Node child) {
 		if (child == null)
 			return;
@@ -59,28 +59,10 @@
 		if(ed == null || ed.getContentType() == CMElementDeclaration.ANY)
 			return;
 		
-		/*
-		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=218143 - 
-		 * ModelQuery use not pervasive enough
-		 */
-		List availableChildElementDeclarations = ModelQueryUtil.getModelQuery(parent.getOwnerDocument()).getAvailableContent(parent, ed, ModelQuery.INCLUDE_CHILD_NODES);
-		/*
-		 * Retrieve and set aside just the element names for faster checking
-		 * later.
-		 */
-		int availableChildCount = availableChildElementDeclarations.size();
-		List availableChildElementLowercaseNames = new ArrayList(availableChildCount);
-		for (int i = 0; i < availableChildCount; i++) {
-			CMNode cmnode = (CMNode) availableChildElementDeclarations.get(i);
-			if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION) {
-				availableChildElementLowercaseNames.add(cmnode.getNodeName().toLowerCase(Locale.US));
-			}
-		}
-		Object[] availableChildElementLowercaseNamesArray = availableChildElementLowercaseNames.toArray();
-
+		List[] extendedContent = new List[1];
 		while (child != null) {
 			// perform actual validation
-			validateNode(parent, child, ed, availableChildElementLowercaseNamesArray);
+			validateNode(parent, child, ed, extendedContent);
 			child = child.getNextSibling();
 		}
 	}
@@ -109,17 +91,17 @@
 	// return 1;
 	// }
 
-	private boolean containsName(String name, Object[] possible) {
-		if (name != null && possible != null) {
-			for (int i = 0; i < possible.length; i++) {
-				if(name.equals(possible[i]))
-				return true;
-			}
-		}
-		return false;
-	}
+//	private boolean containsName(String name, Object[] possible) {
+//		if (name != null && possible != null) {
+//			for (int i = 0; i < possible.length; i++) {
+//				if(name.equals(possible[i]))
+//				return true;
+//			}
+//		}
+//		return false;
+//	}
 
-	private void validateNode(Element target, Node child, CMElementDeclaration edec, Object[] availableLowercaseChildElementNames) {
+	private void validateNode(Element target, Node child, CMElementDeclaration edec, List[] extendedContent) {
 		// NOTE: If the target element is 'UNKNOWN', that is, it has no
 		// element declaration, the content type of the element should be
 		// regarded as 'ANY'. -- 9/10/2001
@@ -144,9 +126,13 @@
 				// Defect 186774: If a child is not one of HTML elements,
 				// it should be regarded as a valid child regardless the
 				// type of the parent content model. -- 10/12/2001
-				if (ced == null || CMUtil.isSSI(ced) || (!CMUtil.isHTML(ced)) || containsName(ced.getElementName().toLowerCase(Locale.US), availableLowercaseChildElementNames))
+				if (ced == null || CMUtil.isSSI(ced) || (!CMUtil.isHTML(ced)))
 					return;
-
+				if (CMUtil.isObsolete(ced)){
+					error = ErrorState.OBSOLETE_TAG_NAME_ERROR;
+					break;
+				}
+				
 				switch (contentType) {
 					case CMElementDeclaration.ANY :
 						// Keep going.
@@ -165,6 +151,29 @@
 							if (CMUtil.isValidInclusion(ced, target))
 								return;
 						}
+						
+						/*
+						 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=218143 - 
+						 * ModelQuery use not pervasive enough
+						 */
+						if (extendedContent[0] == null) {
+							extendedContent[0] = ModelQueryUtil.getModelQuery(target.getOwnerDocument()).getAvailableContent(target, edec, ModelQuery.INCLUDE_CHILD_NODES);
+						}
+
+						List availableChildElementDeclarations = extendedContent[0];
+						/*
+						 * Retrieve and set aside just the element names for faster checking
+						 * later.
+						 */
+						int availableChildCount = availableChildElementDeclarations.size();
+						String elementName = ced.getElementName().toLowerCase(Locale.US);
+						for (int i = 0; i < availableChildCount; i++) {
+							CMNode cmnode = (CMNode) availableChildElementDeclarations.get(i);
+							if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION && cmnode.getNodeName().toLowerCase(Locale.US).equals(elementName)) {
+								return;
+							}
+						}
+						
 						error = ErrorState.INVALID_CONTENT_ERROR;
 						break;
 					default :
@@ -204,6 +213,13 @@
 				// Mark the whole node as an error segment.
 				segType = FMUtil.SEG_WHOLE_TAG;
 				break;
+			case Node.CDATA_SECTION_NODE :
+				if (edec.supports(HTMLCMProperties.IS_XHTML) && Boolean.TRUE.equals(edec.getProperty(HTMLCMProperties.IS_XHTML)))
+					return;
+				// Mark the whole CDATA section as an error segment
+				error = ErrorState.INVALID_CONTENT_ERROR;
+				segType = FMUtil.SEG_WHOLE_TAG;
+				break;
 			default :
 				error = ErrorState.INVALID_CONTENT_ERROR;
 				// Mark the whole node as an error segment.
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java
index bee3e48..d7ed235 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,8 +14,11 @@
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.core.runtime.preferences.InstanceScope;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.html.core.internal.HTMLCoreMessages;
@@ -30,6 +33,8 @@
 
 
 	private IProject fProject;
+	private IScopeContext[] fLookupOrder;
+	private IPreferencesService fPreferenceService;
 	
 	public MessageFactory() {
 		init();
@@ -56,24 +61,21 @@
 	 * @param msg the message for the error
 	 */
 	private void mapToKey(String key, ErrorTable errorTable, int state, String msg) {
-		boolean useProject = false;
-		IEclipsePreferences prefs = null;
-		
-		if (fProject != null) {
-			prefs = new ProjectScope(fProject).getNode(HTMLCorePlugin.getDefault().getBundle().getSymbolicName());
-			useProject = prefs.getBoolean(HTMLCorePreferenceNames.USE_PROJECT_SETTINGS, false);
-		}
-		
 		int severity = ValidationMessage.WARNING;
-		if(useProject)
-			severity = prefs.getInt(key, ValidationMessage.WARNING);
-		else
-			severity = new InstanceScope().getNode(HTMLCorePlugin.getDefault().getBundle().getSymbolicName()).getInt(key, ValidationMessage.WARNING);
-			
+		severity = fPreferenceService.getInt(HTMLCorePlugin.getDefault().getBundle().getSymbolicName(), key, ValidationMessage.WARNING, fLookupOrder);
 		errorTable.put(state, msg, severity);
 	}
 	
 	private void init() {
+		fPreferenceService = Platform.getPreferencesService();
+		fLookupOrder = new IScopeContext[] {new InstanceScope(), new DefaultScope()};
+		
+		if (fProject != null) {
+			ProjectScope projectScope = new ProjectScope(fProject);
+			if(projectScope.getNode(HTMLCorePlugin.getDefault().getBundle().getSymbolicName()).getBoolean(HTMLCorePreferenceNames.USE_PROJECT_SETTINGS, false))
+				fLookupOrder = new IScopeContext[] {projectScope, new InstanceScope(), new DefaultScope()};
+		}
+		
 		for (int i = 0; i < NodeType.MAX_TYPE; i++) {
 			errTables[i] = new ErrorTable();
 		}
@@ -91,6 +93,8 @@
 		mapToKey(HTMLCorePreferenceNames.ATTRIBUTE_DUPLICATE, attrTable, DUPLICATE_ERROR, MSG_DUPLICATE_ATTR_ERROR);
 		mapToKey(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_MISMATCH, attrTable, MISMATCHED_VALUE_ERROR, MSG_MISMATCHED_ATTR_VALUE_ERROR);
 		mapToKey(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_UNCLOSED, attrTable, UNCLOSED_ATTR_VALUE, MSG_UNCLOSED_ATTR_VALUE_ERROR);
+		mapToKey(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND, attrTable, RESOURCE_NOT_FOUND, MSG_RESOURCE_NOT_FOUND);
+		mapToKey(HTMLCorePreferenceNames.ATTRIBUTE_OBSOLETE_NAME, attrTable, OBSOLETE_ATTR_NAME_ERROR, MSG_OBSOLETE_ATTR_ERROR);
 
 		// element error map
 		ErrorTable elemTable = errTables[NodeType.ELEMENT];// short hand
@@ -109,6 +113,8 @@
 		mapToKey(HTMLCorePreferenceNames.ELEM_UNCLOSED_START_TAG, elemTable, UNCLOSED_TAG_ERROR, MSG_UNCLOSED_START_TAG_ERROR);
 		mapToKey(HTMLCorePreferenceNames.ELEM_UNCLOSED_END_TAG, elemTable, UNCLOSED_END_TAG_ERROR, MSG_UNCLOSED_END_TAG_ERROR);
 		mapToKey(HTMLCorePreferenceNames.ELEM_INVALID_EMPTY_TAG, elemTable, INVALID_EMPTY_ELEMENT_TAG, MSG_INVALID_EMPTY_ELEMENT_TAG);
+		mapToKey(HTMLCorePreferenceNames.ELEM_OBSOLETE_NAME, elemTable, OBSOLETE_TAG_NAME_ERROR, MSG_OBSOLETE_TAG_ERROR);
+
 
 		// document type error map
 		ErrorTable docTable = errTables[NodeType.DOCUMENT_TYPE];// short hand
@@ -233,6 +239,10 @@
 	private static final String MSG_UNCLOSED_CDATA_SECTION_ERROR = HTMLCoreMessages.CDATA_section_not_closed__ERROR_;
 	private static final String MSG_INVALID_EMPTY_ELEMENT_TAG = HTMLCoreMessages._ERROR_Tag___0___should_be_an_empty_element_tag_1;
 	private static final String MSG_UNCLOSED_ATTR_VALUE_ERROR = HTMLCoreMessages._ERROR_Attribute_value___0___not_closed__1;
+	private static final String MSG_RESOURCE_NOT_FOUND = HTMLCoreMessages._ERROR_Resource_not_found_0;
+	private static final String MSG_OBSOLETE_ATTR_ERROR = HTMLCoreMessages.Obsolete_attribute_name___ERROR_;
+	private static final String MSG_OBSOLETE_TAG_ERROR = HTMLCoreMessages.Obsolete_tag___ERROR_;
+	
 	private ErrorTable[] errTables = new ErrorTable[NodeType.MAX_TYPE];
 
 //	static {
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ModuleCoreSupport.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ModuleCoreSupport.java
new file mode 100644
index 0000000..1bce59a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ModuleCoreSupport.java
@@ -0,0 +1,198 @@
+/*******************************************************************************

+ * Copyright (c) 2007, 2008 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.wst.html.core.internal.validate;

+

+import org.eclipse.core.filebuffers.FileBuffers;

+import org.eclipse.core.resources.IContainer;

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IFolder;

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.resources.IWorkspaceRoot;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.Path;

+

+/**

+ * This class encapsulates any used Module Core APIs along with fallbacks for

+ * use on non-compliant projects and when those services are not available at

+ * runtime.

+ * 

+ * Because ModuleCore API calls can result in locks needing to be acquired,

+ * none of these methods should be called while other thread locks have

+ * already been acquired.

+ */

+public final class ModuleCoreSupport {

+	static final boolean _dump_NCDFE = false;

+	private static final String WEB_INF = "WEB-INF"; //$NON-NLS-1$

+	private static final IPath WEB_INF_PATH = new Path(WEB_INF);

+

+	/**

+	 * @param project

+	 * @return the computed IPath to the "root" of the web contents, either

+	 *         from facet knowledge or hueristics, or null if one can not be

+	 *         determined

+	 */

+	public static IPath computeWebContentRootPath(IPath path) {

+		IPath root = null;

+		try {

+			root = ModuleCoreSupportDelegate.getWebContentRootPath(ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0)));

+		}

+		catch (NoClassDefFoundError e) {

+			if (_dump_NCDFE)

+				e.printStackTrace();

+		}

+		if (root == null) {

+			/*

+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=213245

+			 * 

+			 * NPE in JSPTaglibDirectiveContentAssistProcessor with

+			 * non-faceted project

+			 */

+			root = getLocalRoot(path);

+		}

+		return root;

+	}

+

+	/**

+	 * @param project

+	 * @return the IPath to the "root" of the web contents

+	 */

+	public static IPath getWebContentRootPath(IProject project) {

+		if (project == null)

+			return null;

+

+		IPath path = null;

+		try {

+			path = ModuleCoreSupportDelegate.getWebContentRootPath(project);

+		}

+		catch (NoClassDefFoundError e) {

+			if (_dump_NCDFE)

+				e.printStackTrace();

+		}

+		return path;

+	}

+

+	/**

+	 * @param path

+	 *            - the full path to a resource within the workspace

+	 * @return - the runtime path of the resource if one exists, null

+	 *         otherwise

+	 */

+	public static IPath getRuntimePath(IPath path) {

+		IPath result = null;

+		try {

+			result = ModuleCoreSupportDelegate.getRuntimePath(path);

+		}

+		catch (NoClassDefFoundError e) {

+			if (_dump_NCDFE)

+				e.printStackTrace();

+		}

+		if (result == null) {

+			IPath root = getLocalRoot(path);

+			result = path.removeFirstSegments(root.segmentCount()).makeAbsolute();

+		}

+		return result;

+	}

+

+	/**

+	 * @param basePath

+	 *            - the full path to a resource within the workspace

+	 * @param reference

+	 *            - the reference string to resolve

+	 * @return - the full path within the workspace that corresponds to the

+	 *         given reference according to the virtual pathing support

+	 */

+	public static IPath resolve(IPath basePath, String reference) {

+		IPath resolvedPath = null;

+		try {

+			resolvedPath = ModuleCoreSupportDelegate.resolve(basePath, reference);

+		}

+		catch (NoClassDefFoundError e) {

+			if (_dump_NCDFE)

+				e.printStackTrace();

+		}

+

+		if (resolvedPath == null) {

+			IPath rootPath = getLocalRoot(basePath);

+			if (reference.startsWith(Path.ROOT.toString())) {

+				resolvedPath = rootPath.append(reference);

+			}

+			else {

+				resolvedPath = basePath.removeLastSegments(1).append(reference);

+			}

+		}

+

+		return resolvedPath;

+	}

+

+	/**

+	 * @param basePath

+	 * @return the applicable Web context root path, if one exists

+	 */

+	private static IPath getLocalRoot(IPath basePath) {

+		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

+

+		// existing workspace resources - this is the 93% case

+		IResource file = FileBuffers.getWorkspaceFileAtLocation(basePath);

+

+		// Try the base path as a folder first

+		if (file == null && basePath.segmentCount() > 1) {

+			file = workspaceRoot.getFolder(basePath);

+		}

+		// If not a folder, then try base path as a file

+		if (file != null && !file.exists() && basePath.segmentCount() > 1) {

+			file = workspaceRoot.getFile(basePath);

+		}

+

+		if (file == null && basePath.segmentCount() == 1) {

+			file = workspaceRoot.getProject(basePath.segment(0));

+		}

+

+		if (file == null) {

+			/*

+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=116529

+			 * 

+			 * This method produces a less accurate result, but doesn't

+			 * require that the file exist yet.

+			 */

+			IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(basePath);

+			if (files.length > 0)

+				file = files[0];

+		}

+

+		while (file != null) {

+			/**

+			 * Treat any parent folder with a WEB-INF subfolder as a web-app

+			 * root

+			 */

+			IContainer folder = null;

+			if ((file.getType() & IResource.FOLDER) != 0) {

+				folder = (IContainer) file;

+			}

+			else {

+				folder = file.getParent();

+			}

+			// getFolder on a workspace root must use a full path, skip

+			if (folder != null && (folder.getType() & IResource.ROOT) == 0) {

+				IFolder webinf = folder.getFolder(WEB_INF_PATH);

+				if (webinf != null && webinf.exists()) {

+					return folder.getFullPath();

+				}

+			}

+			file = file.getParent();

+		}

+

+		return basePath.uptoSegment(1);

+	}

+

+

+}

diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ModuleCoreSupportDelegate.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ModuleCoreSupportDelegate.java
new file mode 100644
index 0000000..818d340
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ModuleCoreSupportDelegate.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.internal.validate;
+
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.ModuleCoreNature;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+
+/**
+ * Wrapper class for all Facet-related calls. If the Facet or ModuleCore
+ * bundles are not available, this class will not load, or if it does, its
+ * methods will cause NoClassDefFoundErrors. This allows us to
+ * compartmentalize the dependencies.
+ * 
+ */
+final class ModuleCoreSupportDelegate {
+	private static final String SLASH = "/";
+	private static Map fResolvedMap = new HashMap();
+
+	/**
+	 * @param path
+	 *            - the full path to a resource within the workspace
+	 * @return - the runtime path of the resource if one exists, null
+	 *         otherwise
+	 */
+	static IPath getRuntimePath(IPath path) {
+		if (path == null)
+			return null;
+
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0));
+
+		if (!ModuleCoreNature.isFlexibleProject(project))
+			return null;
+
+		IVirtualResource[] virtualResources = ComponentCore.createResources(ResourcesPlugin.getWorkspace().getRoot().getFile(path));
+		if (virtualResources != null && virtualResources.length > 0) {
+			return virtualResources[0].getRuntimePath();
+		}
+		return null;
+	}
+
+	/**
+	 * @param project
+	 * @return the IPath to the "root" of the web contents
+	 */
+	static IPath getWebContentRootPath(IProject project) {
+		if (project == null)
+			return null;
+
+		if (!ModuleCoreNature.isFlexibleProject(project))
+			return null;
+
+		IPath path = null;
+		IVirtualComponent component = ComponentCore.createComponent(project);
+		if (component != null && component.exists()) {
+			path = component.getRootFolder().getWorkspaceRelativePath();
+		}
+		return path;
+	}
+
+	/**
+	 * @param basePath
+	 *            - the full path to a resource within the workspace
+	 * @param reference
+	 *            - the reference string to resolve
+	 * @return - the full path within the workspace that corresponds to the
+	 *         given reference according to the virtual pathing support
+	 */
+	static IPath resolve(IPath basePath, String reference) {
+		if (reference == null || basePath == null || basePath.segmentCount() == 0)
+			return null;
+
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(basePath.segment(0));
+
+		if (!ModuleCoreNature.isFlexibleProject(project))
+			return null;
+
+		if (basePath.segmentCount() > 1) {
+			/*
+			 * It can take the better part of a full second to do this, so
+			 * cache the result.
+			 */
+			IPath resolved = null;
+			Map mapForBaseResource = null;
+			mapForBaseResource = (Map) fResolvedMap.get(basePath);
+			if (mapForBaseResource != null) {
+				Reference resolvedReference = (Reference) mapForBaseResource.get(reference);
+				if (resolvedReference != null)
+					resolved = (IPath) resolvedReference.get();
+			}
+			else {
+				mapForBaseResource = new HashMap();
+				fResolvedMap.put(basePath, mapForBaseResource);
+			}
+
+			if (resolved == null) {
+				IFile baseFile = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath);
+				IVirtualResource[] virtualResources = ComponentCore.createResources(baseFile);
+				for (int i = 0; i < virtualResources.length; i++) {
+					IPath baseRuntimePath = virtualResources[i].getRuntimePath();
+					IPath referenceRuntimePath = null;
+					if (reference.startsWith(SLASH)) {
+						referenceRuntimePath = new Path(reference);
+					}
+					else {
+						referenceRuntimePath = baseRuntimePath.removeLastSegments(1).append(reference);
+					}
+					IVirtualFile virtualFile = ComponentCore.createFile(project, referenceRuntimePath);
+					if (virtualFile != null && virtualFile.exists()) {
+						IFile[] underlyingFiles = virtualFile.getUnderlyingFiles();
+						for (int j = 0; j < underlyingFiles.length; j++) {
+							if (underlyingFiles[j].getProject().equals(project) && underlyingFiles[j].exists()) {
+								mapForBaseResource.put(reference, new SoftReference(underlyingFiles[j].getFullPath()));
+								resolved = underlyingFiles[j].getFullPath();
+							}
+
+						}
+					}
+				}
+			}
+			return resolved;
+		}
+		else {
+			IVirtualFile virtualFile = ComponentCore.createFile(project, new Path(reference));
+			if (virtualFile != null && virtualFile.exists()) {
+				return virtualFile.getUnderlyingFile().getFullPath();
+			}
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java
index f9e31ac..0df91b7 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java
@@ -41,7 +41,12 @@
 			IDOMElement e = (IDOMElement) target;
 			if (!isValidPrefix(e.getPrefix(), target) && !e.isCommentTag()) {
 				// report unknown tag error.
-				Segment errorSeg = FMUtil.getSegment(e, FMUtil.SEG_START_TAG);
+				Segment errorSeg = null;
+				if (e.hasStartTag())
+					errorSeg = FMUtil.getSegment(e, FMUtil.SEG_START_TAG);
+				else if (e.hasEndTag())
+					errorSeg = FMUtil.getSegment(e, FMUtil.SEG_END_TAG);
+
 				if (errorSeg != null)
 					reporter.report(new ErrorInfoImpl(UNDEFINED_NAME_ERROR, errorSeg, e));
 			}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java
index 75cc031..4dd8979 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,8 +12,11 @@
 
 import java.util.Iterator;
 
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLPropertyDeclaration;
 import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry;
 import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry;
+import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
 import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
@@ -26,8 +29,10 @@
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
 import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
 class SyntaxValidator extends PrimeValidator implements ErrorState {
@@ -75,9 +80,10 @@
 		public CMElementDeclaration decl = null;
 		public IStructuredDocumentRegion startTag = null;
 		public IStructuredDocumentRegion endTag = null;
-		public boolean hasStartTag = false;
-		public boolean hasEndTag = false;
+		public boolean hasStartTag() {return startTag != null;}
+		public boolean hasEndTag() {return endTag != null;}
 		public boolean isXHTML = false;
+		public boolean isXHTML5 = false;
 	}
 
 	public void validate(IndexedRegion indexedNode) {
@@ -95,8 +101,8 @@
 		// gather information to validate from target at once.
 		getInfo(info);
 
+		validateTags(info);
 		if (info.target.isGlobalTag()) {
-			validateTags(info);
 			validateNames(info);
 			if (info.decl != null && info.isXHTML) {
 				validateTagCase(info);
@@ -109,18 +115,45 @@
 		info.startTag = info.target.getStartStructuredDocumentRegion();
 		info.endTag = info.target.getEndStructuredDocumentRegion();
 
-		info.hasStartTag = (info.startTag != null);
-		info.hasEndTag = (info.endTag != null);
-
 		Document doc = info.target.getOwnerDocument();
 		if (!(doc instanceof IDOMDocument))
 			return;
 		String typeid = ((IDOMDocument) doc).getDocumentTypeId();
 		if (typeid != null) {
-			HTMLDocumentTypeEntry entry = HTMLDocumentTypeRegistry.getInstance().getEntry(typeid);
-			info.isXHTML = (entry != null && entry.isXMLType());
+			if (typeid.trim().length()!= 0){
+				HTMLDocumentTypeEntry entry = HTMLDocumentTypeRegistry.getInstance().getEntry(typeid);
+				info.isXHTML = (entry != null && entry.isXMLType());
+			}
+			else {
+				info.isXHTML = getXMLTarget(doc);
+				info.isXHTML5 = info.isXHTML;
+			}
 		}
 	}
+	
+	private boolean getXMLTarget(Document doc) {
+		if (doc == null)
+			return false;
+		Node child = doc.getFirstChild();
+		while (child != null) {
+			if (child.getNodeType() == Node.ELEMENT_NODE) {
+				if (child.getNodeName().equalsIgnoreCase("html")){
+					if (child.getAttributes()!= null){
+						NamedNodeMap attrs = child.getAttributes();
+						for (int i = 0; i < attrs.getLength(); i++) {
+							Attr a = (Attr) attrs.item(i);
+							if (a.getName().equalsIgnoreCase(HTML50Namespace.ATTR_NAME_XMLNS))
+									return true;
+						}
+					}
+					return false;
+				}
+				
+			}
+			child = child.getNextSibling();
+		}
+		return false;
+	}
 
 	class TagErrorInfoImpl extends AbstractErrorInfo {
 		private String hint = null;
@@ -175,7 +208,7 @@
 	}
 
 	private void validateTags(ElementInfo info) {
-		if (info.hasStartTag) {
+		if (info.hasStartTag()) {
 			if (!info.target.isStartTagClosed()) {
 				// Mark the whole START tag as an error segment.
 				Segment errorSeg = new Segment(info.startTag);
@@ -183,29 +216,39 @@
 			}
 		}
 		else {
-			if (info.hasEndTag) {
+			if (info.hasEndTag()) {
 				if (info.decl != null) {
-					if (CMUtil.isHTML(info.decl) && !info.target.hasChildNodes()) {
-						if (info.target.isContainer()) {
-							// Set the error mark to the start of the element.
-							Segment errorSeg = new Segment(info.target.getStartOffset(), 0);
-							report(MISSING_START_TAG_ERROR, errorSeg, info.target);
-						}
-						else {
-							// Mark the whole END tag as an error segment.
-							Segment errorSeg = new Segment(info.endTag);
-							report(UNNECESSARY_END_TAG_ERROR, errorSeg, info.target);
-						}
-					}
-					else if (info.isXHTML) {
-						Segment errorSeg = new Segment(info.target.getStartOffset(), 0);
+					//if xhtml then must have end tag
+					//else determine if end tag is omissible
+					if (info.isXHTML) {
+						Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_END_TAG_NAME);
 						report(MISSING_START_TAG_ERROR, errorSeg, info.target);
+					} else {
+						//determine if the end tag is omissible
+						boolean canOmitStartTag = false;
+						if(info.decl instanceof HTMLPropertyDeclaration) {
+							int omitType = ((HTMLPropertyDeclaration)info.decl).getOmitType();
+							canOmitStartTag = omitType == HTMLElementDeclaration.OMIT_BOTH;
+						}
+					
+						if (!canOmitStartTag && !info.target.hasChildNodes()) {
+							if (info.target.isContainer()) {
+								// Set the error mark to the start of the element.
+								Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_END_TAG);
+								report(MISSING_START_TAG_ERROR, errorSeg, info.target);
+							}
+							else {
+								// Mark the whole END tag as an error segment.
+								Segment errorSeg = new Segment(info.endTag);
+								report(UNNECESSARY_END_TAG_ERROR, errorSeg, info.target);
+							}
+						}
 					}
 				}
 			}
 		}
 
-		if (info.hasEndTag) {
+		if (info.hasEndTag()) {
 			if (!info.target.isClosed()) {
 				// Set the whole END tag as error segment.
 				Segment errorSeg = new Segment(info.endTag);
@@ -214,24 +257,31 @@
 		}
 		else {
 			if (info.isXHTML) { // XHTML
-				if (!info.target.isEmptyTag()) {
+				//if editor closed during validation this could be null
+				IStructuredDocumentRegion structRegion = info.target.getStartStructuredDocumentRegion();
+				if (!info.target.isEmptyTag() && structRegion != null && DOMRegionContext.XML_TAG_OPEN.equals(structRegion.getFirstRegion().getType())) {
+					/*
+					 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=248963 :
+					 * report empty tags not written as such, but only when
+					 * they follow actual XML/HTML syntax
+					 */
 					if (isEmptyContent(info.decl)) {
-						// EMPTY element should be written in <.../> form.
+						// EMPTY element should be written in <.../> form
 						Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG);
 						report(INVALID_EMPTY_ELEMENT_TAG, errorSeg, info.target);
 					}
 					else {
 						// end tag is required.
-						Segment errorSeg = new Segment(info.target.getEndOffset(), 0);
+						Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG);
 						report(MISSING_END_TAG_ERROR, errorSeg, info.target);
 					}
 				}
 			}
 			else { // HTML
-				if (info.hasStartTag) {
-					if (info.decl != null && CMUtil.isHTML(info.decl) && !info.target.isEmptyTag() && !CMUtil.isEndTagOmissible(info.decl)) {
+				if (info.hasStartTag()) {
+					if (info.decl != null && CMUtil.isHTML(info.decl) && !info.target.isEmptyTag() && !CMUtil.isEndTagOmissible(info.decl) && DOMRegionContext.XML_TAG_OPEN.equals(info.startTag.getFirstRegion().getType())) {
 						// Set the error mark to the end of the element.
-						Segment errorSeg = new Segment(info.target.getEndOffset(), 0);
+						Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG);
 						report(MISSING_END_TAG_ERROR, errorSeg, info.target);
 					}
 				}
@@ -241,15 +291,15 @@
 
 	/* perform validation about tag name definition. */
 	private void validateNames(ElementInfo info) {
-		boolean corrupted = info.hasEndTag && isEndTagCorrupted(info);
+		boolean corrupted = info.hasEndTag() && isEndTagCorrupted(info);
 		if (info.decl == null) {
 			// If no declaration is retrieved, the target is really
 			// unknown element.
-			if (!info.hasStartTag && corrupted) {
+			if (!info.hasStartTag() && corrupted) {
 				reportCorruptedEndTagError(info);
 			}
 			else {
-				Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG);
+				Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG_NAME);
 				report(UNDEFINED_NAME_ERROR, errorSeg, info.target);
 			}
 		}
@@ -271,24 +321,41 @@
 		if (declared == null)
 			return;
 
-		// start tag
-		if (info.hasStartTag) {
-			startTagName = getTagName(info.startTag);
-			if (!declared.equals(startTagName)) {
-				TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.startTag, startTagName);
-				this.reporter.report(error);
+		if (info.isXHTML5){
+			if (info.hasStartTag()) {
+				startTagName = getTagName(info.startTag);
+				if (info.hasEndTag()) {
+					endTagName = getTagName(info.endTag);
+					if (!endTagName.equals(startTagName)){
+						TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.endTag, endTagName);
+						this.reporter.report(error);
+					}
+				}
 			}
+			
 		}
-		// end tag
-		if (info.hasEndTag) {
-			endTagName = getTagName(info.endTag);
-			if (!info.hasStartTag || (!endTagName.equals(startTagName))) {
-				if (!declared.equals(endTagName)) {
-					TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.endTag, endTagName);
+		else
+		{
+			// start tag
+			if (info.hasStartTag()) {
+				startTagName = getTagName(info.startTag);
+				if (!declared.equals(startTagName)) {
+					TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.startTag, startTagName);
 					this.reporter.report(error);
 				}
 			}
+			// end tag
+			if (info.hasEndTag()) {
+				endTagName = getTagName(info.endTag);
+				if (!info.hasStartTag() || (!endTagName.equals(startTagName))) {
+					if (!declared.equals(endTagName)) {
+						TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.endTag, endTagName);
+						this.reporter.report(error);
+					}
+				}
+			}
 		}
+		
 	}
 
 	private void validateChildren(Node target) {
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/text/IHTMLPartitions.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/text/IHTMLPartitions.java
index e7dd5ae..f5e98cd 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/text/IHTMLPartitions.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/text/IHTMLPartitions.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -26,6 +26,10 @@
 
 	String SCRIPT = "org.eclipse.wst.html.SCRIPT"; //$NON-NLS-1$
 	String SCRIPT_EVENTHANDLER = SCRIPT + ".EVENTHANDLER"; //$NON-NLS-1$
+	
+	/**
+	 * @deprecated this partition type is not used locally any longer
+	 */
 	String STYLE = "org.eclipse.wst.html.STYLE"; //$NON-NLS-1$
 
 	// ISSUE: I think meta tag areas are here too?
diff --git a/bundles/org.eclipse.wst.html.ui/.classpath b/bundles/org.eclipse.wst.html.ui/.classpath
new file mode 100644
index 0000000..ce55878
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-html-validation"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible" pattern="org/eclipse/wst/**"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/bundles/org.eclipse.wst.html.ui/.cvsignore b/bundles/org.eclipse.wst.html.ui/.cvsignore
new file mode 100644
index 0000000..e4239f5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/.cvsignore
@@ -0,0 +1,7 @@
+bin
+htmleditor.jar
+temp.folder
+build.xml
+@dot
+src.zip
+javaCompiler...args
diff --git a/bundles/org.eclipse.wst.html.ui/.options b/bundles/org.eclipse.wst.html.ui/.options
new file mode 100644
index 0000000..6d015ff
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/.options
@@ -0,0 +1 @@
+org.eclipse.wst.html.ui/projectionperf=false
diff --git a/bundles/org.eclipse.wst.html.ui/.project b/bundles/org.eclipse.wst.html.ui/.project
new file mode 100644
index 0000000..38bee73
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.html.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.core.resources.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs
copy to bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.core.resources.prefs
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs b/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.core.runtime.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs
copy to bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.core.runtime.prefs
diff --git a/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ecc10e4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,79 @@
+#Wed Mar 28 03:26:40 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.jdt.ui.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.jdt.ui.prefs
copy to bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.jdt.ui.prefs
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs
copy to bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.pde.prefs
similarity index 100%
rename from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.pde.prefs
rename to bundles/org.eclipse.wst.html.ui/.settings/org.eclipse.pde.prefs
diff --git a/bundles/org.eclipse.wst.html.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.html.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..40d2506
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,52 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.wst.html.ui; singleton:=true
+Bundle-Version: 1.0.505.qualifier
+Bundle-Activator: org.eclipse.wst.html.ui.internal.HTMLUIPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.wst.html.internal.validation;x-internal:=true,
+ org.eclipse.wst.html.ui,
+ org.eclipse.wst.html.ui.internal;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.autoedit;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.contentassist;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.contentoutline;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.contentproperties.ui;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.correction;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.derived;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.edit.ui;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.editor;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.handlers;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.hyperlink;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.preferences;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.preferences.ui;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.registry;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.search;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.style;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.taginfo;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.templates;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.text;x-internal:=true,
+ org.eclipse.wst.html.ui.internal.wizard;x-internal:=true,
+ org.eclipse.wst.html.ui.views.contentoutline
+Import-Package: com.ibm.icu.util; version="3.8",
+ com.ibm.icu.text; version="3.8"
+Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.jface.text;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.workbench.texteditor;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.forms;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.sse.ui;bundle-version="[1.2.0,1.3.0)",
+ org.eclipse.wst.xml.ui;bundle-version="[1.1.100,1.2.0)",
+ org.eclipse.wst.css.ui;bundle-version="[1.0.500,1.1.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.wst.css.core;bundle-version="[1.1.400,1.2.0)",
+ org.eclipse.wst.html.core;bundle-version="[1.1.400,1.2.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.validation;bundle-version="[1.2.100,1.3.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.4.0,2.0.0)";resolution:=optional,
+ org.eclipse.wst.common.modulecore;bundle-version="[1.2.0,2.0.0)";resolution:=optional
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.sse.core/about.html b/bundles/org.eclipse.wst.html.ui/about.html
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/about.html
copy to bundles/org.eclipse.wst.html.ui/about.html
diff --git a/bundles/org.eclipse.wst.html.ui/build.properties b/bundles/org.eclipse.wst.html.ui/build.properties
new file mode 100644
index 0000000..be98a59
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/build.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2004, 2005 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+bin.includes = plugin.xml,\
+               icons/,\
+               plugin.properties,\
+               templates/,\
+               META-INF/,\
+               .,\
+               about.html
+bin.excludes = bin/**,\
+               @dot/**,\
+               temp.folder/**
+source.. = src/,\
+           src-html-validation/
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/dtool16/newhtml_wiz.gif b/bundles/org.eclipse.wst.html.ui/icons/full/dtool16/newhtml_wiz.gif
new file mode 100644
index 0000000..8175aa9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/dtool16/newhtml_wiz.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/etool16/newhtml_wiz.gif b/bundles/org.eclipse.wst.html.ui/icons/full/etool16/newhtml_wiz.gif
new file mode 100644
index 0000000..976e18d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/etool16/newhtml_wiz.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/sourceEditor.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/sourceEditor.gif
new file mode 100644
index 0000000..75ebdb8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/sourceEditor.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/table.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/table.gif
new file mode 100644
index 0000000..b99b45c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/table.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-anchor.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-anchor.gif
new file mode 100644
index 0000000..f58992d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-anchor.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-body.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-body.gif
new file mode 100644
index 0000000..005fa99
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-body.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-button.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-button.gif
new file mode 100644
index 0000000..d143fcf
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-button.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-font.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-font.gif
new file mode 100644
index 0000000..bbb40cb
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-font.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-form.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-form.gif
new file mode 100644
index 0000000..3b13958
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-form.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-generic.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-generic.gif
new file mode 100644
index 0000000..65f516e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-generic.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-html.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-html.gif
new file mode 100644
index 0000000..fb39ba6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-html.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-image-map.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-image-map.gif
new file mode 100644
index 0000000..ef3235d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-image-map.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-image.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-image.gif
new file mode 100644
index 0000000..a988c1d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-image.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-jsp.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-jsp.gif
new file mode 100644
index 0000000..4084602
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-jsp.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-template.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-template.gif
new file mode 100644
index 0000000..5d1f81b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-template.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-title.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-title.gif
new file mode 100644
index 0000000..b129090
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag-title.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag.gif b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag.gif
new file mode 100644
index 0000000..5e7fb33
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/obj16/tag.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/icons/full/wizban/newhfile_wiz.png b/bundles/org.eclipse.wst.html.ui/icons/full/wizban/newhfile_wiz.png
new file mode 100644
index 0000000..a4fa448
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/icons/full/wizban/newhfile_wiz.png
Binary files differ
diff --git a/bundles/org.eclipse.wst.html.ui/plugin.properties b/bundles/org.eclipse.wst.html.ui/plugin.properties
new file mode 100644
index 0000000..3232def
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/plugin.properties
@@ -0,0 +1,82 @@
+###############################################################################
+# Copyright (c) 2005, 2010 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+providerName=Eclipse Web Tools Platform
+pluginName=HTML UI Source Editor
+HTML_Source_Page_Editor.name=HTML Editor
+WEB.name=Web
+HTML_Files.name=HTML Files
+HTML_Source.name=Editor
+HTML_Content_Assist.name=Content Assist
+HTML_Templates.name=Templates
+HTML_Styles.name=Styles
+HTML_Syntax_Coloring=Syntax Coloring
+HTML_Typing=Typing
+HTML_Validation=Validation
+HTML_Property_validation=HTML Syntax
+WebContentSettings.name=Web Content Settings
+Device_Profile_Entry_Provider_Extension.name=Device Profile Entry Provider Extension
+All_HTML_context_type_Extension_Element.name=All HTML
+HTML_New_context_type_Extension_Element.name=New HTML
+HTML_Tag_context_type_Extension_Element.name=HTML Tag
+HTML_Attribute_context_type_Extension_Element.name=HTML Attribute
+HTML_Attribute_value_context_type_Extension_Element.name=HTML Attribute value
+HTML_Syntax_Validator.name=HTML Syntax Validator
+###############################################################################
+#org.eclipse.ui.newWizards extension point
+_UI_WIZARD_NAME = HTML File
+_UI_WIZARD_CREATE_NEW_FILE = Create a new HTML file
+##
+AddTask.label=Add &Task...
+AddTask.tooltip=Add Task...
+AddBookmark.label=Add Boo&kmark...
+AddBookmark.tooltip=Add Bookmark...
+SelectRuler.label=Select Ruler
+##
+CleanupDocument_label=Cleanup Document...
+CleanupDocument_tooltip=Cleanup Document
+ToggleComment_label=Toggle Comment
+ToggleComment_tooltip=Toggle Comment
+AddBlockComment_label=Add Block Comment
+AddBlockComment_tooltip=Add Block Comment
+RemoveBlockComment_label=Remove Block Comment
+RemoveBlockComment_tooltip=Remove Block Comment
+FindOccurrences_label=Occurrences in File
+StructureSelectEnclosing_label=Enclosing Element
+StructureSelectEnclosing_tooltip=Expand selection to include enclosing element
+StructureSelectNext_label=Next Element
+StructureSelectNext_tooltip=Expand selection to include next sibling
+StructureSelectPrevious_label=Previous Element
+StructureSelectPrevious_tooltip=Expand selection to include previous sibling
+StructureSelectHistory_label=Restore Last Selection
+StructureSelectHistory_tooltip=Restore last selection
+##
+preferenceKeywords.files=editor html creating saving files suffix specified encoding iana loading
+preferenceKeywords.source=editor html source formatting line width split multiple attributes new clear blank indent tabs spaces size content assist automatically suggestions prompt characters inserted strategy lax strict markup case code generation tag names capitalization uppercase lowercase
+preferenceKeywords.contentassist=html editor content code assist complete completion insert overwrite single proposal common prefix automatically import fill argument name guess alphabetical hide auto activation trigger category categories separate specific
+preferenceKeywords.templates=editor html templates snippet macros
+preferenceKeywords.styles=editor html style customize syntax highlighting type text content foreground background bold color
+preferenceKeywords.webcontent=editor html web content settings profile style document type doctype public system css
+preferenceKeywords.severities=html errors warnings ignore options severity severities suppress project specific projectspecific
+##
+HTML_Editors_target_name=HTML Editors
+
+scope.structured.text.editor.html.name=Editing HTML Source
+scope.structured.text.editor.html.description=Editing HTML Source
+scope.structured.text.editor.html.occurrences.name=HTML Source Occurrences
+scope.structured.text.editor.html.occurrences.description=HTML Source Occurrences
+
+Colors.scriptAreaBorder=Script Area Border
+hyperlinkDetector.anchor.name=Anchors
+hyperlink.target.script.name=HTML Client Script
+hyperlink.target.eventhandler.name=HTML Event Handlers
+
+proposalCategory.htmlTags=HTML Tag Proposals
+proposalCategory.htmlTemplates=HTML Template Proposals
diff --git a/bundles/org.eclipse.wst.html.ui/plugin.xml b/bundles/org.eclipse.wst.html.ui/plugin.xml
new file mode 100644
index 0000000..4652ead
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/plugin.xml
@@ -0,0 +1,738 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+	<extension-point id="deviceProfileEntryProvider" name="%Device_Profile_Entry_Provider_Extension.name" schema="schema/deviceProfileEntryProvider.exsd"/>
+
+	<extension point="org.eclipse.ui.editors">
+		<editor
+			name="%HTML_Source_Page_Editor.name"
+			icon="$nl$/icons/full/obj16/sourceEditor.gif"
+			contributorClass="org.eclipse.wst.html.ui.internal.edit.ui.ActionContributorHTML"
+			class="org.eclipse.wst.sse.ui.StructuredTextEditor"
+			symbolicFontName="org.eclipse.wst.sse.ui.textfont"
+			id="org.eclipse.wst.html.core.htmlsource.source">
+			<contentTypeBinding
+				contentTypeId="org.eclipse.wst.html.core.htmlsource" />
+		</editor>
+	</extension>
+	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
+		<sourceViewerConfiguration
+			class="org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML"
+			target="org.eclipse.wst.html.core.htmlsource" />
+		<contentOutlineConfiguration
+			class="org.eclipse.wst.html.ui.views.contentoutline.HTMLContentOutlineConfiguration"
+			target="org.eclipse.wst.html.core.htmlsource" />
+		<quickOutlineConfiguration
+			class="org.eclipse.wst.xml.ui.internal.quickoutline.XMLQuickOutlineConfiguration"
+			target="org.eclipse.wst.html.core.htmlsource"/>
+		<propertySheetConfiguration
+			class="org.eclipse.wst.xml.ui.views.properties.XMLPropertySheetConfiguration"
+			target="org.eclipse.wst.html.core.htmlsource" />
+  		<documentationTextHover
+        	class="org.eclipse.wst.html.ui.internal.taginfo.HTMLTagInfoHoverProcessor"
+        	target="org.eclipse.wst.html.HTML_DEFAULT">
+  		</documentationTextHover>
+		<provisionalConfiguration
+			type="sourceeditingtexttools"
+			class="org.eclipse.wst.xml.ui.internal.provisional.XMLSourceEditingTextTools"
+			target="org.eclipse.wst.html.core.htmlsource" />
+		<provisionalConfiguration
+			type="characterpairmatcher"
+			class="org.eclipse.wst.html.ui.internal.text.HTMLDocumentRegionEdgeMatcher"
+			target="org.eclipse.wst.html.core.htmlsource" />
+		<provisionalConfiguration
+			type="foldingstrategy"
+			class="org.eclipse.wst.xml.ui.internal.projection.XMLFoldingStrategy"
+			target="org.eclipse.wst.html.core.htmlsource" />
+		<provisionalConfiguration
+			type="org.eclipse.jface.text.quickassist.IQuickAssistProcessor"
+			class="org.eclipse.wst.xml.ui.internal.correction.XMLQuickAssistProcessor"
+			target="org.eclipse.wst.html.HTML_DEFAULT" />
+		<provisionalConfiguration
+			type="autoeditstrategy"
+			class="org.eclipse.wst.html.ui.internal.autoedit.StructuredAutoEditStrategyHTML"
+			target="org.eclipse.wst.html.HTML_DEFAULT, org.eclipse.wst.html.HTML_DECLARATION" />
+		<provisionalDefinition
+			type="preferencepages"
+			value="org.eclipse.wst.html.ui.preferences.html, org.eclipse.wst.html.ui.preferences.source, org.eclipse.wst.html.ui.preferences.templates, org.eclipse.wst.html.ui.preferences.styles,org.eclipse.wst.html.ui.preferences.validation, org.eclipse.wst.html.ui.preferences.contentassist"
+			target="org.eclipse.wst.html.core.htmlsource" />
+		<provisionalDefinition
+			type="spellingregions"
+			value="XML_COMMENT_TEXT, XML_CONTENT"
+			target="org.eclipse.wst.html.core.htmlsource" />
+		<provisionalDefinition
+			type="activecontexts"
+			value="org.eclipse.wst.html.core.htmlsource, org.eclipse.wst.html.occurrences, org.eclipse.core.runtime.xml, org.eclipse.wst.xml.navigation, org.eclipse.wst.xml.selection, org.eclipse.wst.sse.comments"
+        	target="org.eclipse.wst.html.core.htmlsource" />
+	</extension>
+	<extension
+		point="org.eclipse.core.filebuffers.annotationModelCreation">
+		<factory
+			contentTypeId="org.eclipse.wst.html.core.htmlsource"
+			class="org.eclipse.wst.sse.ui.internal.StructuredResourceMarkerAnnotationModelFactory" />
+	</extension>
+	<extension
+		point="org.eclipse.wst.sse.ui.adapterFactoryDescription">
+		<adapterFactoryDescription
+			class="org.eclipse.wst.html.ui.internal.registry.AdapterFactoryProviderForHTML">
+			<contentType id="org.eclipse.wst.html.core.htmlsource" />
+		</adapterFactoryDescription>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			name="%WEB.name"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.EmptyFilePreferencePage"
+			id="org.eclipse.wst.html.ui.preferences.web">
+		</page>
+		<!-- HTML PREFERENCE PAGES-->
+		<page
+			name="%HTML_Files.name"
+			category="org.eclipse.wst.html.ui.preferences.web"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLFilesPreferencePage"
+			id="org.eclipse.wst.html.ui.preferences.html">
+			<keywordReference id="org.eclipse.wst.html.ui.files"/>
+		</page>
+		<page
+			name="%HTML_Source.name"
+			category="org.eclipse.wst.html.ui.preferences.html"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLSourcePreferencePage"
+			id="org.eclipse.wst.html.ui.preferences.source">
+			<keywordReference id="org.eclipse.wst.html.ui.source"/>
+		</page>
+  <page
+        category="org.eclipse.wst.html.ui.preferences.source"
+        class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLContentAssistPreferencePage"
+        id="org.eclipse.wst.html.ui.preferences.contentassist"
+        name="%HTML_Content_Assist.name">
+     <keywordReference
+           id="org.eclipse.wst.html.ui.contentassist">
+     </keywordReference>
+  </page>
+		<page
+			name="%HTML_Templates.name"
+			category="org.eclipse.wst.html.ui.preferences.source"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLTemplatePreferencePage"
+			id="org.eclipse.wst.html.ui.preferences.templates">
+			<keywordReference id="org.eclipse.wst.html.ui.templates"/>
+		</page>
+		<page
+			name="%HTML_Syntax_Coloring"
+			category="org.eclipse.wst.html.ui.preferences.source"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLSyntaxColoringPage"
+			id="org.eclipse.wst.html.ui.preferences.styles">
+			<keywordReference id="org.eclipse.wst.html.ui.styles"/>
+		</page>
+		<page
+			name="%HTML_Validation"
+			category="org.eclipse.wst.html.ui.preferences.html"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLValidationPreferencePage"
+			id="org.eclipse.wst.html.ui.preferences.validation">
+		</page>
+		<page
+			name="%HTML_Typing"
+			category="org.eclipse.wst.html.ui.preferences.source"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLTypingPreferencePage"
+			id="org.eclipse.wst.html.ui.preferences.typing">
+		</page>
+	</extension>
+	<!-- Web content settings -->
+	<extension point="org.eclipse.ui.propertyPages">
+		<!-- for dynamic web project -->
+		<page
+			name="%WebContentSettings.name"
+			class="org.eclipse.wst.html.ui.internal.contentproperties.ui.ProjectWebContentSettingsPropertyPage"
+			id="org.eclipse.wst.html.ui.dynamicprojectpropertypage">
+         	<enabledWhen>
+               	<and>
+					<adapt type="org.eclipse.core.resources.IProject">
+						<or> 
+							<test 
+								forcePluginActivation="true"
+								property="org.eclipse.wst.common.project.facet.core.projectFacet"
+								value="jst.web" />
+							<test 
+								forcePluginActivation="true"
+								property="org.eclipse.wst.common.project.facet.core.projectFacet"
+								value="wst.web" />
+						</or>
+					</adapt>
+				</and> 
+			</enabledWhen>
+         	<keywordReference id="org.eclipse.wst.html.ui.webcontent"/>
+		</page>
+		<page
+			name="%WebContentSettings.name"
+			class="org.eclipse.wst.html.ui.internal.contentproperties.ui.WebContentSettingsPropertyPage"
+			id="org.eclipse.wst.html.ui.internal.contentproperties.ui.WebContentSettingsPropertyPage">
+         	<enabledWhen>
+               	<and>
+					<adapt type="org.eclipse.core.resources.IFile">
+						<or> 
+							<test 
+								forcePluginActivation="true"
+								property="org.eclipse.core.resources.contentTypeId"
+								value="org.eclipse.wst.html.core.htmlsource" />
+							<test 
+								forcePluginActivation="true"
+								property="org.eclipse.core.resources.contentTypeId"
+								value="org.eclipse.jst.jsp.core.jspsource" />
+							<test 
+								forcePluginActivation="true"
+								property="org.eclipse.core.resources.contentTypeId"
+								value="org.eclipse.jst.jsp.core.jspfragmentsource" />
+							<test 
+								forcePluginActivation="true"
+								property="org.eclipse.core.resources.contentTypeId"
+								value="org.eclipse.jst.jsp.core.cssjspfragmentsource" />
+						</or>
+					</adapt>
+				</and> 
+			</enabledWhen>
+         	<keywordReference id="org.eclipse.wst.html.ui.webcontent"/>
+		</page>
+		<page
+			name="%HTML_Property_validation"
+			class="org.eclipse.wst.html.ui.internal.preferences.ui.HTMLValidationPreferencePage"
+			id="org.eclipse.wst.html.ui.propertyPage.project.validation"
+			category="ValidationPropertiesPage">
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject">
+					
+				</adapt>
+			</enabledWhen>
+		</page>
+	</extension>
+	
+	<!-- Keywords for preference and properties pages -->
+	<extension point="org.eclipse.ui.keywords">
+		<keyword
+			label="%preferenceKeywords.files"
+			id="org.eclipse.wst.html.ui.files"/>
+		<keyword
+			label="%preferenceKeywords.source"
+			id="org.eclipse.wst.html.ui.source"/>
+		<keyword
+			label="%preferenceKeywords.contentassist"
+			id="org.eclipse.wst.html.ui.contentassist"/>
+		<keyword
+			label="%preferenceKeywords.templates"
+			id="org.eclipse.wst.html.ui.templates"/>
+		<keyword
+			label="%preferenceKeywords.styles"
+			id="org.eclipse.wst.html.ui.styles"/>
+		<keyword
+			label="%preferenceKeywords.webcontent"
+			id="org.eclipse.wst.html.ui.webcontent"/>
+		<keyword
+			label="%preferenceKeywords.severities"
+			id="org.eclipse.wst.html.ui.severities"/>
+    </extension>
+	
+	<!-- Editor actionsets -->
+	<extension point="org.eclipse.ui.actionSetPartAssociations">
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.edit.text.actionSet.annotationNavigation">
+			<part id="org.eclipse.wst.html.core.htmlsource.source">
+			</part>
+		</actionSetPartAssociation>
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.NavigateActionSet">
+			<part id="org.eclipse.wst.html.core.htmlsource.source">
+			</part>
+		</actionSetPartAssociation>
+	</extension>
+
+	<!-- Templates -->
+	<extension point="org.eclipse.ui.editors.templates">
+		<contextType
+			name="%All_HTML_context_type_Extension_Element.name"
+			class="org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeHTML"
+			id="html_all">
+		</contextType>
+		<contextType
+			name="%HTML_New_context_type_Extension_Element.name"
+			class="org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeHTML"
+			id="html_new">
+		</contextType>
+		<contextType
+			name="%HTML_Tag_context_type_Extension_Element.name"
+			class="org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeHTML"
+			id="html_tag">
+		</contextType>
+		<contextType
+			name="%HTML_Attribute_context_type_Extension_Element.name"
+			class="org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeHTML"
+			id="html_attribute">
+		</contextType>
+		<contextType
+			name="%HTML_Attribute_value_context_type_Extension_Element.name"
+			class="org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeHTML"
+			id="html_attribute_value">
+		</contextType>
+		<include
+			file="templates/htmldefault-templates.xml"
+			translations="$nl$/templates/htmldefault-templates.properties">
+		</include>
+	</extension>
+	
+	<!-- Define the HTML Contexts -->
+	<extension point="org.eclipse.ui.contexts">
+		<context
+			name="%scope.structured.text.editor.html.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.html.description"
+			id="org.eclipse.wst.html.core.htmlsource">
+		</context>
+		<context
+			name="%scope.structured.text.editor.html.occurrences.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.html.occurrences.description"
+			id="org.eclipse.wst.html.occurrences">
+		</context>
+	</extension>
+	
+	<!-- initialize html ui preferences -->
+	<extension point="org.eclipse.core.runtime.preferences">
+		<initializer
+			class="org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceInitializer" />
+	</extension>
+
+	<!--======================================================================================-->
+	<!-- Document provider for ExternalFileEditorInput                                        -->
+	<!--======================================================================================-->
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider
+			inputTypes="org.eclipse.wst.html.ui.internal.hyperlink.ExternalFileEditorInput"
+			class="org.eclipse.ui.editors.text.TextFileDocumentProvider"
+			id="org.eclipse.wst.html.ui.internal.ExternalFileDocumentProvider">
+		</provider>
+	</extension>
+
+	<!--======================================================================================-->
+	<!-- Workbench validation                                       						  -->
+	<!--======================================================================================-->
+   <extension id="HTMLValidator" name="%HTML_Syntax_Validator.name" point="org.eclipse.wst.validation.validatorV2">
+      <validator
+            build="true"
+            class="org.eclipse.wst.html.internal.validation.HTMLValidator"
+            manual="true"
+            sourceid="org.eclipse.wst.html.ui.internal.validation.htmlsyntaxvalidator"
+            version="1"
+            markerId="org.eclipse.wst.html.core.validationMarker">
+         <include>
+            <rules>
+               <contentType id="org.eclipse.wst.html.core.htmlsource"></contentType>
+               <fileext caseSensitive="false" ext="html"/>
+               <fileext caseSensitive="false" ext="xhtml"/>
+               <fileext caseSensitive="false" ext="htm"/>
+               <fileext caseSensitive="false" ext="htpl"/>
+               <fileext caseSensitive="false" ext="wml"/>
+            </rules>
+         </include>
+         <group id="org.eclipse.wst.sse.core.structuredModelGroup"/>
+      </validator>
+   </extension>
+
+	<!--======================================================================================-->
+	<!-- As you type validation                                      						  -->
+	<!--======================================================================================-->
+
+	<extension point="org.eclipse.wst.sse.ui.sourcevalidation">
+		<validator
+			scope="total"
+			class="org.eclipse.wst.html.internal.validation.HTMLValidator"
+			id="org.eclipse.wst.html.ui.internal.validation.htmlsyntaxvalidator">
+			<contentTypeIdentifier
+				id="org.eclipse.wst.html.core.htmlsource">
+				<partitionType id="org.eclipse.wst.html.HTML_DEFAULT"/>
+				<partitionType id="org.eclipse.wst.html.HTML_DECLARATION"/>
+				<partitionType id="org.eclipse.wst.html.HTML_COMMENT"/>
+				<partitionType id="org.eclipse.wst.xml.XML_DEFAULT"/>
+				<partitionType id="org.eclipse.wst.sse.ST_DEFAULT"/>
+			</contentTypeIdentifier>
+		</validator>
+	</extension>
+
+	<!-- New HTML wizard -->
+	<extension point="org.eclipse.ui.newWizards">
+		<wizard
+			id="org.eclipse.wst.html.ui.internal.wizard.NewHTMLWizard"
+			name="%_UI_WIZARD_NAME"
+			class="org.eclipse.wst.html.ui.internal.wizard.NewHTMLWizard"
+			category="org.eclipse.wst.web.ui"
+			icon="$nl$/icons/full/etool16/newhtml_wiz.gif">
+			<description>%_UI_WIZARD_CREATE_NEW_FILE</description>
+			<selection class="org.eclipse.core.resources.IResource" />
+		</wizard>
+	</extension>
+
+	<!-- Add new HTML wizard to Common Navigator -->
+	<extension
+		id="org.eclipse.wst.html.commonWizard.newHTML"
+		point="org.eclipse.ui.navigator.navigatorContent">
+		<commonWizard
+        menuGroupId="org.eclipse.wst.web.ui"
+        type="new"
+        wizardId="org.eclipse.wst.html.ui.internal.wizard.NewHTMLWizard">
+			<enablement>
+				<or>
+					<adapt type="org.eclipse.core.resources.IResource">
+						<or>
+							<test
+								property="org.eclipse.wst.common.project.facet.core.projectFacet"
+								value="wst.web"/>
+							<test
+								property="org.eclipse.wst.common.project.facet.core.projectFacet"
+								value="jst.web"/>
+						</or>
+					</adapt>
+				</or>
+			</enablement>
+		</commonWizard>
+	</extension>
+
+	<extension point="org.eclipse.ui.popupMenus">
+		<viewerContribution
+			targetID="org.eclipse.wst.html.core.htmlsource.source.RulerContext"
+			id="org.eclipse.ui.texteditor.ruler.context.actions">
+			<action
+				label="%AddTask.label"
+				helpContextId="org.eclipse.ui.AddTask_action_context"
+				class="org.eclipse.ui.texteditor.TaskRulerAction"
+				tooltip="%AddTask.tooltip"
+				menubarPath="additions"
+				id="org.eclipse.ui.texteditor.TaskRulerAction">
+			</action>
+			<action
+				label="%AddBookmark.label"
+				helpContextId="org.eclipse.ui.bookmark_action_context"
+				class="org.eclipse.ui.texteditor.BookmarkRulerAction"
+				tooltip="%AddBookmark.tooltip"
+				menubarPath="additions"
+				id="org.eclipse.ui.texteditor.BookmarkRulerAction">
+			</action>
+		</viewerContribution>
+	</extension>
+	
+	<extension point="org.eclipse.ui.editorActions">
+	<!--	<editorContribution
+			id="org.eclipse.wst.html.core.htmlsource.source.editorActions"
+			targetID="org.eclipse.wst.html.core.htmlsource.source">
+			<action
+				id="CleanupDocument"
+				label="%CleanupDocument_label"
+				definitionId="org.eclipse.wst.sse.ui.cleanup.document"
+				tooltip="%CleanupDocument_tooltip"
+				class="org.eclipse.wst.html.ui.internal.edit.ui.CleanupActionHTMLDelegate"
+				actionID="CleanupDocument">
+			</action>
+			<action
+				id="ToggleComment"
+				label="%ToggleComment_label"
+				definitionId="org.eclipse.wst.sse.ui.toggle.comment"
+				tooltip="%ToggleComment_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.actions.ToggleCommentActionXMLDelegate"
+				actionID="ToggleComment">
+			</action>
+			<action
+				id="AddBlockComment"
+				label="%AddBlockComment_label"
+				definitionId="org.eclipse.wst.sse.ui.add.block.comment"
+				tooltip="%AddBlockComment_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.actions.AddBlockCommentActionXMLDelegate"
+				actionID="AddBlockComment">
+			</action>
+			<action
+				id="RemoveBlockComment"
+				label="%RemoveBlockComment_label"
+				definitionId="org.eclipse.wst.sse.ui.remove.block.comment"
+				tooltip="%RemoveBlockComment_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.actions.RemoveBlockCommentActionXMLDelegate"
+				actionID="RemoveBlockComment">
+			</action>
+			<action
+				id="FindOccurrences"
+				label="%FindOccurrences_label"
+				definitionId="org.eclipse.wst.sse.ui.search.find.occurrences"
+				class="org.eclipse.wst.html.ui.internal.search.HTMLFindOccurrencesActionDelegate"
+				actionID="FindOccurrences">
+			</action>
+			<action
+				id="StructureSelectEnclosing"
+				label="%StructureSelectEnclosing_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.enclosing"
+				tooltip="%StructureSelectEnclosing_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.selection.StructuredSelectEnclosingXMLActionDelegate"
+				actionID="StructureSelectEnclosing">
+			</action>
+			<action
+				id="StructureSelectNext"
+				label="%StructureSelectNext_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.next"
+				tooltip="%StructureSelectNext_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.selection.StructuredSelectNextXMLActionDelegate"
+				actionID="StructureSelectNext">
+			</action>
+			<action
+				id="StructureSelectPrevious"
+				label="%StructureSelectPrevious_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.previous"
+				tooltip="%StructureSelectPrevious_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.selection.StructuredSelectPreviousXMLActionDelegate"
+				actionID="StructureSelectPrevious">
+			</action>
+			<action
+				id="StructureSelectHistory"
+				label="%StructureSelectHistory_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.last"
+				tooltip="%StructureSelectHistory_tooltip"
+				class="org.eclipse.wst.sse.ui.internal.selection.StructuredSelectHistoryActionDelegate"
+				actionID="StructureSelectHistory">
+			</action>
+		</editorContribution>-->
+        <editorContribution
+            targetID="org.eclipse.wst.html.core.htmlsource.source"
+            id="org.eclipse.wst.html.core.htmlsource.ruler.actions">
+         <action
+               label="%AddBookmark.label"
+               helpContextId="org.eclipse.ui.bookmark_action_context"
+               class="org.eclipse.ui.texteditor.BookmarkRulerAction"
+               actionID="RulerDoubleClick"
+               id="org.eclipse.ui.texteditor.BookmarkRulerAction"/>
+         <action
+               label="%SelectRuler.label"
+               class="org.eclipse.ui.texteditor.SelectRulerAction"
+               actionID="RulerClick"
+               id="org.eclipse.ui.texteditor.SelectRulerAction"/>
+        </editorContribution>
+	</extension>
+	
+	<extension
+       point="org.eclipse.ui.handlers">
+       <handler
+             class="org.eclipse.wst.html.ui.internal.edit.ui.CleanupDocumentHandler"
+             commandId="org.eclipse.wst.sse.ui.cleanup.document">
+             <activeWhen>
+             	<reference
+                    definitionId="org.eclipse.wst.html.ui.htmlSourceContributions.definition">
+             	</reference>
+             </activeWhen>
+             <enabledWhen>
+             	<reference
+                    definitionId="org.eclipse.wst.html.ui.htmlSourceContributions.definition">
+             	</reference>
+             </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.html.ui.internal.handlers.HTMLFindOccurrencesHandler"
+             commandId="org.eclipse.wst.sse.ui.search.find.occurrences">
+             <activeWhen>
+             	<reference
+                    definitionId="org.eclipse.wst.html.ui.occurrences">
+             	</reference>
+             </activeWhen>
+             <enabledWhen>
+             	<reference
+                    definitionId="org.eclipse.wst.html.ui.occurrences">
+             	</reference>
+             </enabledWhen>
+       </handler>
+       
+	</extension>
+	
+	<extension
+		point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
+		<target
+			id="org.eclipse.wst.html.core.htmlsource"
+			name="%HTML_Editors_target_name"/>
+		<target
+			id="org.eclipse.wst.html.SCRIPT"
+			name="%hyperlink.target.script.name"/>
+		<target
+			id="org.eclipse.wst.html.SCRIPT.EVENTHANDLER"
+			name="%hyperlink.target.eventhandler.name"/>
+	</extension>
+	
+	<extension
+		point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+		<hyperlinkDetector
+			class="org.eclipse.wst.html.ui.internal.hyperlink.AnchorHyperlinkDetector"
+			id="org.eclipse.wst.html.ui.internal.hyperlink.AnchorHyperlinkDetector"
+			name="%hyperlinkDetector.anchor.name"
+			targetId="org.eclipse.core.runtime.xml">
+		</hyperlinkDetector>
+		
+   </extension>
+
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.html.ui.htmlSourceContributions.definition">
+            <with variable="activeContexts">
+	           <iterate operator="or">
+	              <equals value="org.eclipse.wst.html.core.htmlsource"/>
+	           </iterate>
+            </with>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.html.ui.occurrences">
+            <with variable="activeContexts">
+	           <iterate operator="or">
+	              <equals value="org.eclipse.wst.html.occurrences"/>
+	           </iterate>
+            </with>
+		</definition>
+	</extension>
+	
+	<!-- Define theme - Many of the color overrides and definitions come from 
+	     the XML plugin -->
+	<extension
+		point="org.eclipse.ui.themes">
+		<theme
+			id="org.eclipse.ui.ide.systemDefault">
+			<colorOverride
+				id="SCRIPT_AREA_BORDER"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+		</theme>
+		<colorDefinition
+			id="SCRIPT_AREA_BORDER"
+			isEditable="false"
+			label="%Colors.scriptAreaBorder"
+			value="191, 95, 63">
+		</colorDefinition>
+	</extension>
+	
+	<!-- Enable the FormatHandler for HTML Content Type -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.wst.sse.ui.internal.handlers.FormatHandler"
+			commandId="org.eclipse.wst.sse.ui.format">
+			<activeWhen>
+				<reference definitionId="org.eclipse.wst.html.ui.htmlContentType.definition"></reference>
+			</activeWhen>
+			<enabledWhen>
+				<reference definitionId="org.eclipse.wst.html.ui.htmlContentType.definition"></reference>
+			</enabledWhen>
+		</handler>
+	</extension>
+
+	<extension
+       point="org.eclipse.wst.sse.ui.commentingStrategy">
+    <blockCommentingStrategy
+          prefix="&lt;!--"
+          suffix="--&gt;">
+       <contentType
+             id="org.eclipse.wst.html.core.htmlsource"
+             associatedCommentPartitionTypeID="org.eclipse.wst.html.HTML_COMMENT">
+          <requiredPartitionTypes>
+             <partitionType
+                   id="org.eclipse.wst.html.HTML_DEFAULT">
+             </partitionType>
+             <partitionType
+                   id="org.eclipse.wst.html.HTML_DECLARATION">
+             </partitionType>
+             <partitionType
+                   id="org.eclipse.wst.html.SCRIPT.EVENTHANDLER">
+             </partitionType>
+             <partitionType
+                   id="org.eclipse.wst.xml.XML_PI">
+             </partitionType>
+          </requiredPartitionTypes>
+          <allowablePartitionTypes
+                anyPartitionType="false">
+             <partitionType
+                   id="org.eclipse.wst.css.STYLE">
+             </partitionType>
+             <partitionType
+                   id="org.eclipse.wst.html.SCRIPT">
+             </partitionType>
+          </allowablePartitionTypes>
+       </contentType>
+    </blockCommentingStrategy>
+ </extension>
+	<!-- Set up a definition for HTML Content Types -->
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.html.ui.htmlContentType.definition">
+			<iterate ifEmpty="false">
+				<adapt type="org.eclipse.core.resources.IFile">
+					<!-- Force property tester to load, should not cause entire plug-in to start -->
+					<test property="org.eclipse.wst.sse.core.resources.contentTypeId"
+						value="org.eclipse.wst.html.core.htmlsource" forcePluginActivation="true"/>
+				</adapt>
+			</iterate>
+		</definition>
+	</extension>
+	<extension point="org.eclipse.wst.sse.ui.characterPairing">
+		<inserter class="org.eclipse.wst.html.ui.internal.text.CharacterPairInserter" id="org.eclipse.wst.html.ui.inserter">
+			<contentTypeIdentifier
+				id="org.eclipse.wst.html.core.htmlsource"
+				partitions="org.eclipse.wst.html.HTML_DEFAULT">
+			</contentTypeIdentifier>
+		</inserter>
+	</extension>
+ <extension
+       point="org.eclipse.wst.sse.ui.completionProposal">
+    <proposalCategory
+          icon="icons/full/obj16/tag-generic.gif"
+          id="org.eclipse.wst.html.ui.proposalCategory.htmlTags"
+          name="%proposalCategory.htmlTags">
+    </proposalCategory>
+    <proposalCategory
+          icon="icons/full/obj16/tag-template.gif"
+          id="org.eclipse.wst.html.ui.proposalCategory.htmlTemplates"
+          name="%proposalCategory.htmlTemplates">
+    </proposalCategory>
+    <proposalComputer
+          activate="false"
+          categoryId="org.eclipse.wst.html.ui.proposalCategory.htmlTags"
+          class="org.eclipse.wst.html.ui.internal.contentassist.HTMLTagsCompletionProposalComputer"
+          id="org.eclipse.wst.html.ui.proposalComputer.htmlTags">
+       <contentType
+             id="org.eclipse.wst.html.core.htmlsource">
+          <partitionType
+                id="org.eclipse.wst.html.HTML_DEFAULT">
+          </partitionType>
+       </contentType>
+    </proposalComputer>
+    <proposalComputer
+          activate="false"
+          categoryId="org.eclipse.wst.html.ui.proposalCategory.htmlTemplates"
+          class="org.eclipse.wst.html.ui.internal.contentassist.HTMLTemplatesCompletionProposalComputer"
+          id="org.eclipse.wst.html.ui.proposalComputer.htmlTemplates">
+       <contentType
+             id="org.eclipse.wst.html.core.htmlsource">
+          <partitionType
+                id="org.eclipse.wst.html.HTML_DEFAULT">
+          </partitionType>
+       </contentType>
+    </proposalComputer>
+    <proposalComputerExtendedActivation
+          id="org.eclipse.wst.css.ui.proposalComputer.css">
+       <contentType
+             id="org.eclipse.wst.html.core.htmlsource">
+          <partitionType
+                id="org.eclipse.wst.css.STYLE">
+          </partitionType>
+       </contentType>
+    </proposalComputerExtendedActivation>
+    <proposalComputerExtendedActivation
+          id="org.eclipse.wst.css.ui.proposalComputer.cssTemplates">
+       <contentType
+             id="org.eclipse.wst.html.core.htmlsource">
+          <partitionType
+                id="org.eclipse.wst.css.STYLE">
+          </partitionType>
+       </contentType>
+    </proposalComputerExtendedActivation>
+ </extension>
+ <extension
+       point="org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration">
+    <categoriesConfiguration
+          class="org.eclipse.wst.html.ui.internal.preferences.HTMLCompletionProposalCategoriesConfiguration"
+          contentTypeID="org.eclipse.wst.html.core.htmlsource">
+    </categoriesConfiguration>
+ </extension>
+	
+</plugin>
diff --git a/bundles/org.eclipse.wst.html.ui/schema/deviceProfileEntryProvider.exsd b/bundles/org.eclipse.wst.html.ui/schema/deviceProfileEntryProvider.exsd
new file mode 100644
index 0000000..742f82f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/schema/deviceProfileEntryProvider.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.html.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.html.ui" id="deviceProfileEntryProvider" name="Device Profile Entry Provider Extension"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="deviceProfileEntryProvider"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="deviceProfileEntryProvider">
+      <complexType>
+         <attribute name="class" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is deprecated and should not be used by any other plugins.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2000, 2005 IBM Corporation and others.&lt;br&gt;
+All rights reserved. This program and the accompanying materials are made 
+available under the terms of the Eclipse Public License v1.0 which accompanies 
+this distribution, and is available at &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationReporter.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationReporter.java
new file mode 100644
index 0000000..4d1068c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationReporter.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.internal.validation;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.wst.html.core.internal.validate.MessageFactory;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.validate.ErrorInfo;
+import org.eclipse.wst.sse.core.internal.validate.ValidationMessage;
+import org.eclipse.wst.sse.core.internal.validate.ValidationReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+public class HTMLValidationReporter implements ValidationReporter {
+
+	private IValidator owner = null;
+	private IReporter reporter = null;
+	private IFile file = null;
+	private IStructuredModel model = null;
+	private HTMLValidationResult result = null;
+	private MessageFactory fFactory = null;
+	
+	/**
+	 */
+	public HTMLValidationReporter(IValidator owner, IReporter reporter, IFile file, IStructuredModel model) {
+		super();
+		this.owner = owner;
+		this.reporter = reporter;
+		this.file = file;
+		this.model = model;
+		fFactory = new MessageFactory(file != null ? file.getProject() : null);
+	}
+
+	/**
+	 */
+	public void clear() {
+		if (this.file == null)
+			return;
+
+		this.result = null;
+
+		if (this.reporter != null) {
+			this.reporter.removeAllMessages(this.owner, this.file);
+		}
+		else {
+			// remove by myself?
+			String id = HTMLValidator.class.getName();
+			try {
+				// TaskListHelper API changed
+				// TaskListHelper.getTaskList().removeAllTasks(id, this.file,
+				// null);
+				TaskListHelper.getTaskList().removeAllTasks(this.file, id, null);
+			}
+			catch (CoreException ex) {
+			}
+		}
+	}
+
+
+	/**
+	 */
+	public HTMLValidationResult getResult() {
+		if (this.result == null)
+			this.result = new HTMLValidationResult();
+		return this.result;
+	}
+
+	/**
+	 */
+	public void report(ValidationMessage message) {
+		if (message == null || message.getSeverity() == ValidationMessage.IGNORE)
+			return;
+		IMessage mes = translateMessage(message);
+
+		if (this.reporter != null) {
+			this.reporter.addMessage(this.owner, mes);
+		}
+		else {
+			if (this.file == null)
+				return;
+
+			// add by myself?
+			String id = HTMLValidator.class.getName();
+			String location = Integer.toString(mes.getLineNumber());
+			String name = ""; //$NON-NLS-1$
+			IPath filePath = this.file.getFullPath();
+			if (filePath != null) {
+				name = filePath.toString();
+			}
+			try {
+				TaskListHelper.getTaskList().addTask(id, this.file, location, mes.getId(), mes.getText(), mes.getSeverity(), name, mes.getGroupName(), mes.getOffset(), mes.getLength());
+			}
+			catch (CoreException ex) {
+			}
+		}
+	}
+
+	/**
+	 * Translate ValidationMessage to IMessage and generate result log
+	 */
+	private IMessage translateMessage(ValidationMessage message) {
+		int severity = IMessage.LOW_SEVERITY;
+		HTMLValidationResult result = getResult();
+		switch (message.getSeverity()) {
+			case ValidationMessage.ERROR :
+				severity = IMessage.HIGH_SEVERITY;
+				result.addError();
+				break;
+			case ValidationMessage.WARNING :
+				severity = IMessage.NORMAL_SEVERITY;
+				result.addWarning();
+				break;
+			case ValidationMessage.INFORMATION :
+				result.addInformation();
+				break;
+			default :
+//				result.addInformation();
+				break;
+		}
+
+		IMessage mes = new LocalizedMessage(severity, message.getMessage(), this.file);
+		mes.setOffset(message.getOffset());
+		mes.setLength(message.getLength());
+		if (this.model != null) {
+			IStructuredDocument flatModel = this.model.getStructuredDocument();
+			if (flatModel != null) {
+				int line = flatModel.getLineOfOffset(message.getOffset());
+				mes.setLineNo(line + 1);
+			}
+		}
+
+		return mes;
+	}
+
+	public void report(ErrorInfo info) {
+		report(fFactory.createMessage(info));
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationResult.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationResult.java
new file mode 100644
index 0000000..26c5f08
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationResult.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.internal.validation;
+
+public class HTMLValidationResult {
+	private int errors = 0;
+	private int warnings = 0;
+	private int informations = 0;
+
+	/**
+	 */
+	public HTMLValidationResult() {
+	}
+
+	/**
+	 */
+	public void addError() {
+		this.errors++;
+	}
+
+	/**
+	 */
+	public void addInformation() {
+		this.informations++;
+	}
+
+	/**
+	 */
+	public void addWarning() {
+		this.warnings++;
+	}
+
+	/**
+	 */
+	public int getErrors() {
+		return this.errors;
+	}
+
+	/**
+	 */
+	public int getInformations() {
+		return this.informations;
+	}
+
+	/**
+	 */
+	public int getWarnings() {
+		return this.warnings;
+	}
+
+	/**
+	 */
+	public boolean isValid() {
+		return (this.errors == 0 && this.warnings == 0 && this.informations == 0);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationWorkbenchHelper.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationWorkbenchHelper.java
new file mode 100644
index 0000000..90bfde5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidationWorkbenchHelper.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.internal.validation;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
+
+public class HTMLValidationWorkbenchHelper extends WorkbenchContext {
+	/**
+	 */
+	public HTMLValidationWorkbenchHelper() {
+		super();
+	}
+
+	/**
+	 * When an IValidator associates a target object with an IMessage, the
+	 * WorkbenchReporter eventually resolves that target object with an
+	 * IResource. Sometimes more than one target object resolves to the same
+	 * IResource (usually the IProject, which is the default IResource when an
+	 * IFile cannot be found). This method is called, by the
+	 * WorkbenchReporter, so that the WorkbenchReporter can distinguish
+	 * between the IMessages which are on the same IResource, but refer to
+	 * different target objects. This is needed for the
+	 * removeAllMessages(IValidator, Object) method, so that when one target
+	 * object removes all of its messages, that it doesn't remove another
+	 * target object's messages.
+	 * 
+	 * This method may return null only if object is null. Otherwise, an id
+	 * which can uniquely identify a particular object must be returned. The
+	 * id needs to be unique only within one particular IValidator.
+	 */
+	public String getTargetObjectName(Object object) {
+		if (object == null)
+			return null;
+		if (object instanceof IFile)
+			return getPortableName((IFile) object);
+		return object.toString();
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidator.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidator.java
new file mode 100644
index 0000000..2efc77b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidator.java
@@ -0,0 +1,563 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.internal.validation;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filebuffers.ITextFileBuffer;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeConstants;
+import org.eclipse.wst.html.core.internal.validate.HTMLValidationAdapterFactory;
+import org.eclipse.wst.html.ui.internal.Logger;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.FileBufferModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.util.URIResolver;
+import org.eclipse.wst.sse.core.internal.validate.ValidationAdapter;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator;
+import org.eclipse.wst.validation.AbstractValidator;
+import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.ValidationState;
+import org.eclipse.wst.validation.internal.core.Message;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
+import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.w3c.dom.Text;
+
+public class HTMLValidator extends AbstractValidator implements IValidatorJob, ISourceValidator, IExecutableExtension {
+	private static final String ORG_ECLIPSE_WST_HTML_CORE_HTMLSOURCE = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
+
+	static boolean shouldValidate(IFile file) {
+		IResource resource = file;
+		do {
+			if (resource.isDerived() || resource.isTeamPrivateMember() || !resource.isAccessible() || (resource.getName().charAt(0) == '.' && resource.getType() == IResource.FOLDER)) {
+				return false;
+			}
+			resource = resource.getParent();
+		}
+		while ((resource.getType() & IResource.PROJECT) == 0);
+		return true;
+	}
+
+	private IDocument fDocument;
+	private IContentTypeManager fContentTypeManager;
+	private IContentType[] fOtherSupportedContentTypes = null;
+	private String[] fAdditionalContentTypesIDs = null;
+	private IContentType fHTMLContentType;
+
+	public HTMLValidator() {
+		super();
+		fContentTypeManager = Platform.getContentTypeManager();
+		fHTMLContentType = fContentTypeManager.getContentType(ORG_ECLIPSE_WST_HTML_CORE_HTMLSOURCE);
+	}
+
+	/**
+	 */
+	public void cleanup(IReporter reporter) {
+		// nothing to do
+	}
+
+	/**
+	 * Gets list of content types this validator is interested in
+	 * 
+	 * @return All HTML-related content types
+	 */
+	private IContentType[] getOtherSupportedContentTypes() {
+		if (fOtherSupportedContentTypes == null) {
+			List contentTypes = new ArrayList(3);
+			if (fAdditionalContentTypesIDs != null) {
+				for (int i = 0; i < fAdditionalContentTypesIDs.length; i++) {
+					IContentType type = Platform.getContentTypeManager().getContentType(fAdditionalContentTypesIDs[i]);
+					if (type != null) {
+						contentTypes.add(type);
+					}
+				}
+			}
+			fOtherSupportedContentTypes = (IContentType[]) contentTypes.toArray(new IContentType[contentTypes.size()]);
+		}
+		return fOtherSupportedContentTypes;
+	}
+
+
+	/**
+	 */
+	protected IDOMModel getModel(IProject project, IFile file) {
+		if (project == null || file == null)
+			return null;
+		if (!file.exists())
+			return null;
+		if (!canHandle(file))
+			return null;
+
+		IModelManager manager = StructuredModelManager.getModelManager();
+		if (manager == null)
+			return null;
+
+		IStructuredModel model = null;
+		try {
+			file.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+		try {
+			try {
+				model = manager.getModelForRead(file);
+			}
+			catch (UnsupportedEncodingException ex) {
+				// retry ignoring META charset for invalid META charset
+				// specification
+				// recreate input stream, because it is already partially read
+				model = manager.getModelForRead(file, new String(), null);
+			}
+		}
+		catch (UnsupportedEncodingException ex) {
+		}
+		catch (IOException ex) {
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+
+		if (model == null)
+			return null;
+		if (!(model instanceof IDOMModel)) {
+			releaseModel(model);
+			return null;
+		}
+		return (IDOMModel) model;
+	}
+
+	/**
+	 */
+	protected HTMLValidationReporter getReporter(IReporter reporter, IFile file, IDOMModel model) {
+		return new HTMLValidationReporter(this, reporter, file, model);
+	}
+
+	/**
+	 * Check file extension to validate
+	 */
+	private boolean canHandle(IFile file) {
+		boolean result = false;
+		if (file != null) {
+			try {
+				IContentDescription contentDescription = file.getContentDescription();
+				if (contentDescription != null) {
+					IContentType fileContentType = contentDescription.getContentType();
+					if (fileContentType.isKindOf(fHTMLContentType)) {
+						result = true;
+					}
+					else {
+						IContentType[] otherTypes = getOtherSupportedContentTypes();
+						for (int i = 0; i < otherTypes.length; i++) {
+							result = result || fileContentType.isKindOf(otherTypes[i]);
+						}
+					}
+				}
+				else if (fHTMLContentType != null) {
+					result = fHTMLContentType.isAssociatedWith(file.getName());
+				}
+			}
+			catch (CoreException e) {
+				// should be rare, but will ignore to avoid logging "encoding
+				// exceptions" and the like here.
+				// Logger.logException(e);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 */
+	private boolean hasHTMLFeature(IDOMDocument document) {
+		DocumentTypeAdapter adapter = (DocumentTypeAdapter) document.getAdapterFor(DocumentTypeAdapter.class);
+		if (adapter == null)
+			return false;
+		return adapter.hasFeature(HTMLDocumentTypeConstants.HTML);
+	}
+
+	/**
+	 */
+	protected void releaseModel(IStructuredModel model) {
+		if (model != null)
+			model.releaseFromRead();
+	}
+
+	/**
+	 */
+	public void validate(IValidationContext helper, IReporter reporter) {
+		if (helper == null)
+			return;
+		if ((reporter != null) && (reporter.isCancelled() == true)) {
+			throw new OperationCanceledException();
+		}
+		String[] deltaArray = helper.getURIs();
+		if (deltaArray != null && deltaArray.length > 0) {
+			validateDelta(helper, reporter);
+		}
+		else {
+			validateFull(helper, reporter);
+		}
+	}
+
+	/**
+	 * This validate call is for the ISourceValidator partial document
+	 * validation approach
+	 * 
+	 * @param dirtyRegion
+	 * @param helper
+	 * @param reporter
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
+	 */
+	public void validate(IRegion dirtyRegion, IValidationContext helper, IReporter reporter) {
+
+		if (helper == null || fDocument == null)
+			return;
+
+		if ((reporter != null) && (reporter.isCancelled() == true)) {
+			throw new OperationCanceledException();
+		}
+
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
+		if (model == null)
+			return; // error
+
+		try {
+
+			IDOMDocument document = null;
+			if (model instanceof IDOMModel) {
+				document = ((IDOMModel) model).getDocument();
+			}
+
+			if (document == null || !hasHTMLFeature(document)) {
+				// handled in finally clause
+				// model.releaseFromRead();
+				return; //ignore
+			}
+			
+			IPath filePath = null;
+			IFile file = null;
+
+			ITextFileBuffer fb = FileBufferModelManager.getInstance().getBuffer(fDocument);
+			if (fb != null) {
+				filePath = fb.getLocation();
+
+				if (filePath.segmentCount() > 1) {
+					file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+					if (!file.isAccessible()) {
+						file = null;
+					}
+				}
+			}
+			else {
+				filePath = new Path(model.getId());
+			}
+
+			// this will be the wrong region if it's Text (instead of Element)
+			// we don't know how to validate Text
+			IndexedRegion ir = getCoveringNode(dirtyRegion); //  model.getIndexedRegion(dirtyRegion.getOffset());
+			if (ir instanceof Text) {
+				while (ir != null && ir instanceof Text) {
+					// it's assumed that this gets the IndexedRegion to
+					// the right of the end offset
+					ir = model.getIndexedRegion(ir.getEndOffset());
+				}
+			}
+			
+			if (ir instanceof INodeNotifier) {
+
+				INodeAdapterFactory factory = HTMLValidationAdapterFactory.getInstance();
+				ValidationAdapter adapter = (ValidationAdapter) factory.adapt((INodeNotifier) ir);
+				if (adapter == null)
+					return; // error
+
+				if (reporter != null) {
+					HTMLValidationReporter rep = null;
+					rep = getReporter(reporter, file, (IDOMModel) model);
+					rep.clear();
+					adapter.setReporter(rep);
+
+					Message mess = new LocalizedMessage(IMessage.LOW_SEVERITY, filePath.toString().substring(1));
+					reporter.displaySubtask(this, mess);
+				}
+				adapter.validate(ir);
+			}
+		}
+		finally {
+			if (model != null)
+				model.releaseFromRead();
+		}
+	}
+
+	private IndexedRegion getCoveringNode(IRegion dirtyRegion) {
+		
+		IndexedRegion largestRegion = null;
+		if(fDocument instanceof IStructuredDocument) {
+			IStructuredDocumentRegion[] regions = ((IStructuredDocument) fDocument).getStructuredDocumentRegions(dirtyRegion.getOffset(), dirtyRegion.getLength());
+			largestRegion = getLargest(regions);
+		}
+		return largestRegion;
+	}
+	protected IndexedRegion getLargest(IStructuredDocumentRegion[] sdRegions) {
+		
+		if(sdRegions == null || sdRegions.length == 0)
+			return null;
+		 
+		IndexedRegion currentLargest = getCorrespondingNode(sdRegions[0]);
+		for (int i = 0; i < sdRegions.length; i++) {
+		    if(!sdRegions[i].isDeleted()) {
+    			IndexedRegion corresponding = getCorrespondingNode(sdRegions[i]);
+    			
+    			if(currentLargest instanceof Text)
+    				currentLargest = corresponding;
+    			
+                if(corresponding != null) {
+                	if(!(corresponding instanceof Text)) {
+	        			if (corresponding.getStartOffset() <= currentLargest.getStartOffset()  
+	        						&&  corresponding.getEndOffset() >= currentLargest.getEndOffset() )
+	        				currentLargest = corresponding;
+                	}
+                }
+                
+            }
+		}
+		return currentLargest;
+	}
+	protected IndexedRegion getCorrespondingNode(IStructuredDocumentRegion sdRegion) {
+		IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
+        IndexedRegion indexedRegion = null;
+        try {
+            if (sModel != null) 
+                indexedRegion = sModel.getIndexedRegion(sdRegion.getStart());    
+        } finally {
+            if (sModel != null)
+                sModel.releaseFromRead();
+        }
+        return indexedRegion;
+    }
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
+	 */
+	public void connect(IDocument document) {
+		fDocument = document;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
+	 */
+	public void disconnect(IDocument document) {
+		fDocument = null;
+	}
+
+	/**
+	 */
+	protected HTMLValidationResult validate(IDOMModel model, IFile file) {
+		IProject prj = null;
+		if (file != null) {
+			prj = file.getProject();
+		}
+		if ((prj == null) && (model != null)) {
+			URIResolver res = model.getResolver();
+			if (res != null) {
+				prj = res.getProject();
+			}
+		}
+		final WorkbenchReporter reporter = new WorkbenchReporter(prj, new NullProgressMonitor());
+		return validate(reporter, file, model);
+	}
+
+	/**
+	 */
+	private HTMLValidationResult validate(IReporter reporter, IFile file, IDOMModel model) {
+		if (file == null || model == null)
+			return null; // error
+		IDOMDocument document = model.getDocument();
+		if (document == null)
+			return null; // error
+		if (!hasHTMLFeature(document))
+			return null; // ignore
+
+		INodeAdapterFactory factory = HTMLValidationAdapterFactory.getInstance();
+		ValidationAdapter adapter = (ValidationAdapter) factory.adapt(document);
+		if (adapter == null)
+			return null; // error
+
+		HTMLValidationReporter rep = getReporter(reporter, file, model);
+		rep.clear();
+		adapter.setReporter(rep);
+		adapter.validate(document);
+		return rep.getResult();
+	}
+
+	/**
+	 */
+	private void validateContainer(IValidationContext helper, IReporter reporter, IContainer container) {
+		try {
+			IResource[] resourceArray = container.members(false);
+			for (int i = 0; i < resourceArray.length; i++) {
+				IResource resource = resourceArray[i];
+				if (resource == null || reporter.isCancelled())
+					continue;
+				if (resource instanceof IFile) {
+					Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, resource.getFullPath().toString().substring(1));
+					reporter.displaySubtask(this, message);
+					validateFile(helper, reporter, (IFile) resource);
+				}
+				else if (resource instanceof IContainer) {
+					validateContainer(helper, reporter, (IContainer) resource);
+				}
+			}
+		}
+		catch (CoreException ex) {
+		}
+	}
+
+	/**
+	 */
+	private void validateDelta(IValidationContext helper, IReporter reporter) {
+		String[] deltaArray = helper.getURIs();
+		for (int i = 0; i < deltaArray.length; i++) {
+			String delta = deltaArray[i];
+			if (delta == null)
+				continue;
+
+			if (reporter != null) {
+				Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, delta.substring(1));
+				reporter.displaySubtask(this, message);
+			}
+
+			IResource resource = getResource(delta);
+			if (resource == null || !(resource instanceof IFile))
+				continue;
+			validateFile(helper, reporter, (IFile) resource);
+		}
+	}
+
+	/**
+	 */
+	private void validateFile(IValidationContext helper, IReporter reporter, IFile file) {
+		if ((reporter != null) && (reporter.isCancelled() == true)) {
+			throw new OperationCanceledException();
+		}
+		if (!shouldValidate(file)) {
+			return;
+		}
+		IDOMModel model = getModel(file.getProject(), file);
+		if (model == null)
+			return;
+
+		try {
+			validate(reporter, file, model);
+		}
+		finally {
+			releaseModel(model);
+		}
+	}
+
+	/**
+	 */
+	private void validateFull(IValidationContext helper, IReporter reporter) {
+		IProject project = null;
+		String[] fileDelta = helper.getURIs();
+		if (helper instanceof IWorkbenchContext) {
+			IWorkbenchContext wbHelper = (IWorkbenchContext) helper;
+			project = wbHelper.getProject();
+		}
+		else if(fileDelta.length > 0){
+			// won't work for project validation (b/c nothing in file delta)
+			project = getResource(fileDelta[0]).getProject();
+		}
+		if (project == null)
+			return;
+		validateContainer(helper, reporter, project);
+	}
+
+	/*
+	 * added to get rid or dependency on IWorkbenchHelper
+	 * 
+	 */
+	public IResource getResource(String delta) {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(delta));
+	}
+
+	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+		return null;
+	}
+
+	public IStatus validateInJob(IValidationContext helper, IReporter reporter) throws ValidationException {
+		// Exception catching was removed, see
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=123600
+		IStatus status = Status.OK_STATUS;
+		validate(helper, reporter);
+		return status;
+	}
+	
+	/**
+	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
+	 *      java.lang.String, java.lang.Object)
+	 */
+	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+		fAdditionalContentTypesIDs = new String[0];
+		if (data != null) {
+			if (data instanceof String && data.toString().length() > 0) {
+				fAdditionalContentTypesIDs = StringUtils.unpack(data.toString());
+			}
+		}
+	}
+
+	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
+		if (resource.getType() != IResource.FILE)
+			return null;
+		ValidationResult result = new ValidationResult();
+		IReporter reporter = result.getReporter(monitor);
+		validateFile(null, reporter, (IFile) resource);
+		return result;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/LocalizedMessage.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/LocalizedMessage.java
new file mode 100644
index 0000000..1e38729
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/LocalizedMessage.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.internal.validation;
+
+import java.util.Locale;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.wst.validation.internal.core.Message;
+
+/**
+ * copied from org.eclipse.wst.validation.internal.operations.LocalizedMessage
+ * 
+ * This class is provided for validators which run only in Eclipse and whose messages, because they
+ * come from another tool, are already localized. LocalizedMessage cannot be used by any validator
+ * which needs to run in both WebSphere and Eclipse.
+ */
+public class LocalizedMessage extends Message {
+	private String _message = null;
+
+	public LocalizedMessage(int severity, String messageText) {
+		this(severity, messageText, null);
+	}
+
+	public LocalizedMessage(int severity, String messageText, IResource targetObject) {
+		this(severity, messageText, (Object) targetObject);
+	}
+
+	public LocalizedMessage(int severity, String messageText, Object targetObject) {
+		super(null, severity, null);
+		setLocalizedMessage(messageText);
+		setTargetObject(targetObject);
+	}
+
+	public void setLocalizedMessage(String message) {
+		_message = message;
+	}
+
+	public String getLocalizedMessage() {
+		return _message;
+	}
+
+	public String getText() {
+		return getLocalizedMessage();
+	}
+
+	public String getText(ClassLoader cl) {
+		return getLocalizedMessage();
+	}
+
+	public String getText(Locale l) {
+		return getLocalizedMessage();
+	}
+
+	public String getText(Locale l, ClassLoader cl) {
+		return getLocalizedMessage();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/TaskListHelper.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/TaskListHelper.java
new file mode 100644
index 0000000..71ede2d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/TaskListHelper.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.internal.validation;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * 
+ * Class to help this Problem's list.
+ * 
+ */
+class TaskListHelper {
+	private static TaskListHelper _taskListHelper = null;
+
+	public static TaskListHelper getTaskList() {
+		if (_taskListHelper == null) {
+			_taskListHelper = new TaskListHelper();
+		}
+		return _taskListHelper;
+	}
+
+	/**
+	 * This method adds a message to a resource in the task list.
+	 */
+	public void addTask(String pluginId, IResource resource, String location, String messageId, String message, int markerType, String targetObjectName, String groupName, int offset, int length) throws CoreException {
+		TaskListUtility.addTask(pluginId, resource, location, messageId, message, markerType, targetObjectName, groupName, offset, length);
+	}
+
+	/**
+	 * This method removes all messages from a resource in the task list.
+	 */
+	public void removeAllTasks(IResource resource, String owner, String objectName) throws CoreException {
+		TaskListUtility.removeAllTasks(resource, owner, objectName);
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/TaskListUtility.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/TaskListUtility.java
new file mode 100644
index 0000000..3de0a92
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/TaskListUtility.java
@@ -0,0 +1,436 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.internal.validation;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+/**
+ * This class must be called only by the validation framework.
+ * 
+ * This singleton interacts with the eclipse workbench's Task list.
+ * TaskListUtility adds and removes tasks from the list.
+ * 
+ * This class must not be called outside of an IWorkspaceRunnable or
+ * IRunnableWithProgress. Many resource deltas can be generated by the methods
+ * in this class.
+ * 
+ * This came from TaskListUtility
+ */
+public class TaskListUtility {
+	// private static final String PLUGIN_ID = ValidationPlugin.PLUGIN_ID;
+	private static final String PLUGIN_ID = HTMLUIPlugin.ID;
+	private static final String VALIDATION_MARKER = PLUGIN_ID + ".problemmarker"; //$NON-NLS-1$ // The extension which is used to add validation markers to the task list
+	private static final String VALIDATION_MARKER_OWNER = "owner"; //$NON-NLS-1$ // The IValidator who owns the IMarker on the task list
+	private static final String VALIDATION_MARKER_SEVERITY = "validationSeverity"; //$NON-NLS-1$ // one of the IMessage values
+	private static final String VALIDATION_MARKER_TARGETOBJECT = "targetObject"; //$NON-NLS-1$ // When more than one target object resolves to the same IResource, this field identifies which targetObject owns a particular message.
+	private static final String VALIDATION_MARKER_GROUP = "groupName"; //$NON-NLS-1$ // For incremental validation, this field associates a message with a group, so that a subset of messages may be removed from a file.
+	private static final String VALIDATION_MARKER_MESSAGEID = "messageId"; //$NON-NLS-1$ // Persist the message id of the message, not just the translated text.
+	private static final int DEPTH_INFINITE = IResource.DEPTH_INFINITE;
+	private static final int DEPTH_ZERO = IResource.DEPTH_ZERO;
+	private final static IMarker[] NO_MARKERS = new IMarker[0];
+
+	/**
+	 * This method adds a message to a resource in the task list.
+	 */
+	public static IMarker addTask(String pluginId, IResource resource, String location, String messageId, String message, int markerType, String targetObjectName, String groupName, int offset, int length) throws CoreException {
+		if ((message == null) || (resource == null)) {
+			return null;
+		}
+
+		int severity = getSeverity(markerType);
+
+		// Allow duplicate entries in the task list.
+		// Prior to a full validation, the validation framework will remove
+		// all messages owned
+		// by a validator before it is executed.
+		// Prior to an incremental validation, the validation framework will
+		// remove all messages,
+		// on each of the changed resources, owned by a validator before it is
+		// invoked.
+		// 
+		// It is up to the validator to make sure that it is not adding the
+		// same message
+		// in more than one place, and also to clear out any old messages
+		// which are not cleared
+		// by the validation framework.
+		IMarker item = resource.createMarker(VALIDATION_MARKER); // add a
+																	// validation
+																	// marker
+
+		// For performance reasons, replace the multiple setAttribute
+		// calls above with a single setAttributes call.
+		boolean offsetSet = ((offset != IMessage.OFFSET_UNSET) && (length != IMessage.OFFSET_UNSET));
+		int size = (offsetSet) ? 10 : 8; // add CHAR_START, CHAR_END only
+											// if the offset is set. If the
+											// offset is set, it takes
+											// precendence over the line
+											// number. (eclipse's rule, not
+											// mine.)
+		String[] attribNames = new String[size];
+		Object[] attribValues = new Object[size];
+
+		// Very first thing, add the owner. That way, if the code dies
+		// before things are persisted, hopefully this marker will be
+		// persisted.
+		// Hopefully, eclipse WILL persist this field, as requested.
+		attribNames[0] = VALIDATION_MARKER_OWNER;
+		attribValues[0] = pluginId;
+		attribNames[1] = VALIDATION_MARKER_SEVERITY; // this validation
+														// severity is stored,
+														// in addition to the
+														// marker severity, to
+														// enable more than
+														// one severity of
+														// message to be
+														// displayed. e.g.
+														// ERROR | WARNING
+														// (using binary OR).
+														// The IMarker
+														// constants are
+														// regular decimal
+														// constants.
+		attribValues[1] = new Integer(markerType);
+		attribNames[2] = VALIDATION_MARKER_TARGETOBJECT; // to distinguish
+															// between
+															// messages which
+															// are registered
+															// on an
+															// IResource, but
+															// against
+															// different
+															// target objects
+		attribValues[2] = ((targetObjectName == null) ? "" : targetObjectName); //$NON-NLS-1$
+		attribNames[3] = VALIDATION_MARKER_GROUP;
+		attribValues[3] = ((groupName == null) ? "" : groupName); //$NON-NLS-1$
+		attribNames[4] = IMarker.MESSAGE;
+		attribValues[4] = message;
+		attribNames[5] = VALIDATION_MARKER_MESSAGEID;
+		attribValues[5] = messageId;
+
+		attribNames[6] = IMarker.SEVERITY; // IMarker.SEVERITY_ERROR,
+											// IMarker.SEVERITY_WARNING,
+											// IMarker.SEVERITY_INFO
+		attribValues[6] = new Integer(severity);
+		try {
+			// If the location is a line number, store it as a line number
+			Integer lineNumber = Integer.valueOf(location);
+			attribNames[7] = IMarker.LINE_NUMBER;
+			attribValues[7] = lineNumber;
+		}
+		catch (NumberFormatException exc) {
+			// Otherwise, store it as a text location
+			attribNames[7] = IMarker.LOCATION;
+			attribValues[7] = location;
+		}
+
+		if (offsetSet) {
+			attribNames[8] = IMarker.CHAR_START;
+			attribValues[8] = new Integer(offset);
+			attribNames[9] = IMarker.CHAR_END;
+			attribValues[9] = new Integer(offset + length);
+		}
+
+		item.setAttributes(attribNames, attribValues);
+
+		return item;
+	}
+
+	/**
+	 * Given one of the SeverityEnum severities, return the IMarker severity
+	 * int that is its equivalent.
+	 */
+	private static int getSeverity(int severityEnumValue) {
+		switch (severityEnumValue) {
+			case (IMessage.HIGH_SEVERITY) : {
+				return IMarker.SEVERITY_ERROR;
+			}
+
+			case (IMessage.LOW_SEVERITY) : {
+				return IMarker.SEVERITY_INFO;
+			}
+
+			case (IMessage.NORMAL_SEVERITY) : {
+				return IMarker.SEVERITY_WARNING;
+			}
+
+			case (IMessage.ALL_MESSAGES) :
+			case (IMessage.ERROR_AND_WARNING) :
+			default : {
+				// assume it's a warning.
+				return IMarker.SEVERITY_WARNING;
+			}
+		}
+	}
+
+	private static int getDepth(IResource resource) {
+		if (resource instanceof IProject) {
+			return DEPTH_INFINITE; // DEPTH_INFINITE means get this project's
+									// markers, and the markers belonging to
+									// the project's children.
+		}
+		else if (resource instanceof IWorkspaceRoot) {
+			// Needed for the ValidationMigrator when it checks for orphan
+			// tasks.
+			return DEPTH_INFINITE; // DEPTH_INFINITE means get all of the
+									// markers in the workspace
+		}
+
+		return DEPTH_ZERO; // DEPTH_ZERO means just this resource, not its
+							// children
+	}
+
+	private static IMarker[] getValidationTasks(IResource resource, int severity, int depth) {
+		IMarker[] tempMarkers = null;
+		int validCount = 0;
+		try {
+			IMarker[] allMarkers = null;
+			try {
+				allMarkers = resource.findMarkers(VALIDATION_MARKER, false, depth); // false
+																					// means
+																					// only
+																					// consider
+																					// PROBLEM_MARKER,
+																					// not
+																					// variants
+																					// of
+																					// PROBLEM_MARKER.
+																					// Since
+																					// addTask
+																					// only
+																					// adds
+																					// PROBLEM_MARKER,
+																					// we
+																					// don't
+																					// need
+																					// to
+																					// consider
+																					// its
+																					// subtypes.
+			}
+			catch (CoreException exc) {
+				// Logger logger =
+				// ValidationPlugin.getPlugin().getMsgLogger();
+				// if (logger.isLoggingLevel(Level.SEVERE)) {
+				// LogEntry entry = ValidationPlugin.getLogEntry();
+				// entry.setSourceID("TaskListUtility.getValidationTasks(IResource,
+				// int)"); //$NON-NLS-1$
+				// entry.setTargetException(exc);
+				// logger.write(Level.SEVERE, entry);
+				// }
+				return NO_MARKERS;
+			}
+
+			// Now filter in the markers, based on severity type.
+			if (allMarkers.length != 0) {
+				tempMarkers = new IMarker[allMarkers.length];
+				for (int i = 0; i < allMarkers.length; i++) {
+					IMarker marker = allMarkers[i];
+					Integer filterSeverity = (Integer) marker.getAttribute(VALIDATION_MARKER_SEVERITY);
+					if (filterSeverity == null) {
+						// odd...marker wasn't created correctly. How could
+						// this happen?
+						// Default to the current severity and add it to the
+						// list.
+						try {
+							marker.setAttribute(IMarker.SEVERITY, getSeverity(severity));
+						}
+						catch (CoreException exc) {
+							// Logger logger =
+							// ValidationPlugin.getPlugin().getMsgLogger();
+							// if (logger.isLoggingLevel(Level.SEVERE)) {
+							// LogEntry entry =
+							// ValidationPlugin.getLogEntry();
+							// entry.setSourceID("TaskListUtility.getValidationTasks(int,
+							// IResource, int)"); //$NON-NLS-1$
+							// entry.setTargetException(exc);
+							// logger.write(Level.SEVERE, entry);
+							// }
+							continue;
+						}
+						catch (Exception exc) {
+							// Logger logger =
+							// ValidationPlugin.getPlugin().getMsgLogger();
+							// if (logger.isLoggingLevel(Level.SEVERE)) {
+							// LogEntry entry =
+							// ValidationPlugin.getLogEntry();
+							// entry.setSourceID("TaskListUtility.getValidationTasks(int,
+							// IResource, int)"); //$NON-NLS-1$
+							// entry.setTargetException(exc);
+							// logger.write(Level.SEVERE, entry);
+							// }
+							continue;
+						}
+					}
+					else if ((severity & filterSeverity.intValue()) == 0) {
+						continue;
+					}
+					tempMarkers[validCount++] = marker;
+				}
+			}
+		}
+		catch (CoreException exc) {
+			// Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
+			// if (logger.isLoggingLevel(Level.SEVERE)) {
+			// LogEntry entry = ValidationPlugin.getLogEntry();
+			// entry.setSourceID("TaskListUtility.getValidationTasks(int,
+			// IResource, int)"); //$NON-NLS-1$
+			// entry.setTargetException(exc);
+			// logger.write(Level.SEVERE, entry);
+			// }
+		}
+
+		if (validCount == 0) {
+			return NO_MARKERS;
+		}
+
+		IMarker[] validMarkers = new IMarker[validCount];
+		System.arraycopy(tempMarkers, 0, validMarkers, 0, validCount);
+		return validMarkers;
+	}
+
+	private static IMarker[] getValidationTasks(IResource resource, String[] messageOwners, int depth) {
+		IMarker[] markers = getValidationTasks(resource, IMessage.ALL_MESSAGES, depth);
+		if (markers.length == 0) {
+			return NO_MARKERS;
+		}
+
+		IMarker[] temp = new IMarker[markers.length];
+		int validCount = 0;
+		for (int i = 0; i < markers.length; i++) {
+			IMarker marker = markers[i];
+
+			try {
+				Object owner = marker.getAttribute(VALIDATION_MARKER_OWNER);
+				if ((owner == null) || !(owner instanceof String)) {
+					// The ValidationMigrator will remove any "unowned"
+					// validation markers.
+					continue;
+				}
+
+				for (int j = 0; j < messageOwners.length; j++) {
+					String messageOwner = messageOwners[j];
+					if (((String) owner).equals(messageOwner)) {
+						temp[validCount++] = marker;
+						break;
+					}
+				}
+			}
+			catch (CoreException exc) {
+				// Logger logger =
+				// ValidationPlugin.getPlugin().getMsgLogger();
+				// if (logger.isLoggingLevel(Level.SEVERE)) {
+				// LogEntry entry = ValidationPlugin.getLogEntry();
+				// entry.setSourceID("TaskListUtility.getValidationTasks(project,
+				// String[])"); //$NON-NLS-1$
+				// entry.setTargetException(exc);
+				// logger.write(Level.SEVERE, entry);
+				// }
+				return NO_MARKERS;
+			}
+		}
+
+		IMarker[] result = new IMarker[validCount];
+		System.arraycopy(temp, 0, result, 0, validCount);
+		return result;
+	}
+
+	/**
+	 * This method retrieves all validation tasks from the resource. If depth
+	 * is INFINITE, child tasks are returned as well. Only the tasks which are
+	 * owned by the specified messageOwner, and apply to the named IMessage's
+	 * target object (objectName) will be returned.
+	 */
+	private static IMarker[] getValidationTasks(IResource resource, String[] messageOwner, String objectName, String groupName, int depth) throws CoreException {
+		if ((messageOwner == null) || (resource == null)) {
+			return NO_MARKERS;
+		}
+
+		int validCount = 0;
+		IMarker[] validList = null;
+		IMarker[] markers = getValidationTasks(resource, messageOwner, depth);
+		if (markers != null) {
+			validList = new IMarker[markers.length];
+			for (int i = 0; i < markers.length; i++) {
+				IMarker marker = markers[i];
+
+				// If more than one target object resolves to the same
+				// resource, removing one target's
+				// messages should not remove the other target object's
+				// messages.
+				if (objectName != null) {
+					Object targetObject = marker.getAttribute(VALIDATION_MARKER_TARGETOBJECT);
+					if ((targetObject == null) || !(targetObject instanceof String) || !(((String) targetObject).equals(objectName))) {
+						continue;
+					}
+				}
+
+				if (groupName != null) {
+					Object group = marker.getAttribute(VALIDATION_MARKER_GROUP);
+					if ((group == null) || !(group instanceof String) || !(((String) group).equals(groupName))) {
+						continue;
+					}
+				}
+
+				validList[validCount++] = marker;
+			}
+		}
+
+		if (validCount == 0) {
+			return NO_MARKERS;
+		}
+
+		IMarker[] result = new IMarker[validCount];
+		System.arraycopy(validList, 0, result, 0, validCount);
+		return result;
+	}
+
+	/**
+	 * This method removes all messages from a resource in the task list.
+	 */
+	public static void removeAllTasks(IResource resource, String owner, String objectName) throws CoreException {
+		removeAllTasks(resource, new String[]{owner}, objectName);
+	}
+
+	public static void removeAllTasks(IResource resource, String[] owners, String objectName) throws CoreException {
+		removeAllTasks(resource, owners, objectName, getDepth(resource));
+	}
+
+	protected static void removeAllTasks(IResource resource, String[] owners, String objectName, int depth) throws CoreException {
+		removeTaskSubset(resource, owners, objectName, null, depth); // null
+																		// means
+																		// no
+																		// group
+																		// name
+	}
+
+	/**
+	 * This method removes a subset of tasks from the project, including child
+	 * tasks. Every task which belongs to the group, identified by groupName,
+	 * will be removed.
+	 */
+	protected static void removeTaskSubset(IResource resource, String[] owners, String objectName, String groupName, int depth) throws CoreException {
+		if ((owners == null) || (resource == null)) {
+			return;
+		}
+
+		IMarker[] allTasks = getValidationTasks(resource, owners, objectName, groupName, depth);
+		if (allTasks.length > 0) {
+			ResourcesPlugin.getWorkspace().deleteMarkers(allTasks);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/StructuredTextViewerConfigurationHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/StructuredTextViewerConfigurationHTML.java
new file mode 100644
index 0000000..a38409f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/StructuredTextViewerConfigurationHTML.java
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.formatter.IContentFormatter;
+import org.eclipse.jface.text.formatter.MultiPassContentFormatter;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.wst.css.core.text.ICSSPartitions;
+import org.eclipse.wst.css.ui.internal.style.LineStyleProviderForEmbeddedCSS;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.core.internal.text.StructuredTextPartitionerForHTML;
+import org.eclipse.wst.html.core.text.IHTMLPartitions;
+import org.eclipse.wst.html.ui.internal.autoedit.AutoEditStrategyForTabs;
+import org.eclipse.wst.html.ui.internal.contentassist.HTMLStructuredContentAssistProcessor;
+import org.eclipse.wst.html.ui.internal.style.LineStyleProviderForHTML;
+import org.eclipse.wst.sse.core.text.IStructuredPartitions;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.format.StructuredFormattingStrategy;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.core.internal.text.rules.StructuredTextPartitionerForXML;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+import org.eclipse.wst.xml.ui.StructuredTextViewerConfigurationXML;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+/**
+ * Configuration for a source viewer which shows HTML content.
+ * <p>
+ * Clients can subclass and override just those methods which must be specific
+ * to their needs.
+ * </p>
+ * 
+ * @see org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration
+ * @since 1.0
+ */
+public class StructuredTextViewerConfigurationHTML extends StructuredTextViewerConfiguration {
+	/*
+	 * One instance per configuration because not sourceviewer-specific and
+	 * it's a String array
+	 */
+	private String[] fConfiguredContentTypes;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForEmbeddedCSS;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForHTML;
+	/*
+	 * One instance per configuration
+	 */
+	private StructuredTextViewerConfiguration fXMLSourceViewerConfiguration;
+	private ILabelProvider fStatusLineLabelProvider;
+
+	/**
+	 * Create new instance of StructuredTextViewerConfigurationHTML
+	 */
+	public StructuredTextViewerConfigurationHTML() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+	}
+
+	public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) {
+		List allStrategies = new ArrayList(0);
+
+		IAutoEditStrategy[] superStrategies = super.getAutoEditStrategies(sourceViewer, contentType);
+		for (int i = 0; i < superStrategies.length; i++) {
+			allStrategies.add(superStrategies[i]);
+		}
+
+		// be sure this is added last in list, so it has a change to modify
+		// previous results.
+		// add auto edit strategy that handles when tab key is pressed
+		allStrategies.add(new AutoEditStrategyForTabs());
+
+		return (IAutoEditStrategy[]) allStrategies.toArray(new IAutoEditStrategy[allStrategies.size()]);
+	}
+
+	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+		if (fConfiguredContentTypes == null) {
+			String[] xmlTypes = StructuredTextPartitionerForXML.getConfiguredContentTypes();
+			String[] htmlTypes = StructuredTextPartitionerForHTML.getConfiguredContentTypes();
+			fConfiguredContentTypes = new String[2 + xmlTypes.length + htmlTypes.length];
+
+			fConfiguredContentTypes[0] = IStructuredPartitions.DEFAULT_PARTITION;
+			fConfiguredContentTypes[1] = IStructuredPartitions.UNKNOWN_PARTITION;
+
+			int index = 0;
+			System.arraycopy(xmlTypes, 0, fConfiguredContentTypes, index += 2, xmlTypes.length);
+			System.arraycopy(htmlTypes, 0, fConfiguredContentTypes, index += xmlTypes.length, htmlTypes.length);
+		}
+
+		return fConfiguredContentTypes;
+	}
+
+	protected IContentAssistProcessor[] getContentAssistProcessors(
+			ISourceViewer sourceViewer, String partitionType) {
+		
+		IContentAssistProcessor processor = new HTMLStructuredContentAssistProcessor(
+				this.getContentAssistant(), partitionType, sourceViewer);
+		return new IContentAssistProcessor[]{processor};
+	}
+
+	public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
+		IContentFormatter formatter = super.getContentFormatter(sourceViewer);
+		// super was unable to create a formatter, probably because
+		// sourceViewer does not have document set yet, so just create a
+		// generic one
+		if (!(formatter instanceof MultiPassContentFormatter))
+			formatter = new MultiPassContentFormatter(getConfiguredDocumentPartitioning(sourceViewer), IHTMLPartitions.HTML_DEFAULT);
+		((MultiPassContentFormatter) formatter).setMasterStrategy(new StructuredFormattingStrategy(new HTMLFormatProcessorImpl()));
+
+		return formatter;
+	}
+
+	public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
+		if (contentType == IHTMLPartitions.HTML_DEFAULT) {
+			// use xml's doubleclick strategy
+			return getXMLSourceViewerConfiguration().getDoubleClickStrategy(sourceViewer, IXMLPartitions.XML_DEFAULT);
+		}
+		else
+			return super.getDoubleClickStrategy(sourceViewer, contentType);
+
+	}
+
+	public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
+		Vector vector = new Vector();
+
+		// prefix[0] is either '\t' or ' ' x tabWidth, depending on preference
+		Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences();
+		int indentationWidth = preferences.getInt(HTMLCorePreferenceNames.INDENTATION_SIZE);
+		String indentCharPref = preferences.getString(HTMLCorePreferenceNames.INDENTATION_CHAR);
+		boolean useSpaces = HTMLCorePreferenceNames.SPACE.equals(indentCharPref);
+
+		for (int i = 0; i <= indentationWidth; i++) {
+			StringBuffer prefix = new StringBuffer();
+			boolean appendTab = false;
+
+			if (useSpaces) {
+				for (int j = 0; j + i < indentationWidth; j++)
+					prefix.append(' ');
+
+				if (i != 0)
+					appendTab = true;
+			}
+			else {
+				for (int j = 0; j < i; j++)
+					prefix.append(' ');
+
+				if (i != indentationWidth)
+					appendTab = true;
+			}
+
+			if (appendTab) {
+				prefix.append('\t');
+				vector.add(prefix.toString());
+				// remove the tab so that indentation - tab is also an indent
+				// prefix
+				prefix.deleteCharAt(prefix.length() - 1);
+			}
+			vector.add(prefix.toString());
+		}
+
+		vector.add(""); //$NON-NLS-1$
+
+		return (String[]) vector.toArray(new String[vector.size()]);
+	}
+
+	public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+		LineStyleProvider[] providers = null;
+
+		// workaround IXMLPartitions.XML_PI
+		if (partitionType == IHTMLPartitions.HTML_DEFAULT || partitionType == IHTMLPartitions.HTML_COMMENT || partitionType == IHTMLPartitions.HTML_DECLARATION || partitionType == IXMLPartitions.XML_PI) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForHTML()};
+		}
+		else if (partitionType == ICSSPartitions.STYLE || partitionType == ICSSPartitions.COMMENT) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForEmbeddedCSS()};
+		}
+
+		return providers;
+	}
+
+	private LineStyleProvider getLineStyleProviderForEmbeddedCSS() {
+		if (fLineStyleProviderForEmbeddedCSS == null) {
+			fLineStyleProviderForEmbeddedCSS = new LineStyleProviderForEmbeddedCSS();
+		}
+		return fLineStyleProviderForEmbeddedCSS;
+	}
+
+	private LineStyleProvider getLineStyleProviderForHTML() {
+		if (fLineStyleProviderForHTML == null) {
+			fLineStyleProviderForHTML = new LineStyleProviderForHTML();
+		}
+		return fLineStyleProviderForHTML;
+	}
+
+	public ILabelProvider getStatusLineLabelProvider(ISourceViewer sourceViewer) {
+		if (fStatusLineLabelProvider == null) {
+			fStatusLineLabelProvider = new JFaceNodeLabelProvider() {
+				public String getText(Object element) {
+					if (element == null)
+						return null;
+
+					StringBuffer s = new StringBuffer();
+					Node node = (Node) element;
+					while (node != null) {
+						if (node.getNodeType() != Node.DOCUMENT_NODE) {
+							s.insert(0, super.getText(node));
+						}
+
+						if (node.getNodeType() == Node.ATTRIBUTE_NODE)
+							node = ((Attr) node).getOwnerElement();
+						else
+							node = node.getParentNode();
+					
+						if (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
+							s.insert(0, IPath.SEPARATOR);
+						}
+					}
+					return s.toString();
+				}
+
+			};
+		}
+		return fStatusLineLabelProvider;
+	}
+
+	private StructuredTextViewerConfiguration getXMLSourceViewerConfiguration() {
+		if (fXMLSourceViewerConfiguration == null) {
+			fXMLSourceViewerConfiguration = new StructuredTextViewerConfigurationXML();
+		}
+		return fXMLSourceViewerConfiguration;
+	}
+
+	protected Map getHyperlinkDetectorTargets(ISourceViewer sourceViewer) {
+		Map targets = super.getHyperlinkDetectorTargets(sourceViewer);
+		targets.put(ContentTypeIdForHTML.ContentTypeID_HTML, null);
+
+		// also add xml since there could be xml content in html
+		// (just hope the hyperlink detectors will do additional checking)
+		targets.put(ContentTypeIdForXML.ContentTypeID_XML, null);
+		return targets;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIMessages.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIMessages.java
new file mode 100644
index 0000000..71f86b4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIMessages.java
@@ -0,0 +1,208 @@
+/**********************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others. All rights reserved.   This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: 
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.wst.html.ui.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Strings used by HTML UI
+ * 
+ * @plannedfor 1.0
+ */
+public class HTMLUIMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.html.ui.internal.HTMLUIPluginResources";//$NON-NLS-1$
+	private static ResourceBundle fResourceBundle;
+
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, HTMLUIMessages.class);
+	}
+	
+	private HTMLUIMessages() {
+		// cannot create new instance of this class
+	}
+	
+	public static ResourceBundle getResourceBundle() {
+		try {
+			if (fResourceBundle == null)
+				fResourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
+		}
+		catch (MissingResourceException x) {
+			fResourceBundle = null;
+		}
+		return fResourceBundle;
+	}
+	
+	public static String Sample_HTML_doc;
+	public static String HTMLFilesPreferencePage_0;
+	public static String _UI_WIZARD_NEW_TITLE;
+	public static String _UI_WIZARD_NEW_HEADING;
+	public static String _UI_WIZARD_NEW_DESCRIPTION;
+	public static String _ERROR_FILENAME_MUST_END_HTML;
+	public static String _WARNING_FOLDER_MUST_BE_INSIDE_WEB_CONTENT;
+	public static String ResourceGroup_nameExists;
+	public static String NewHTMLTemplatesWizardPage_0;
+	public static String NewHTMLTemplatesWizardPage_1;
+	public static String NewHTMLTemplatesWizardPage_2;
+	public static String NewHTMLTemplatesWizardPage_3;
+	public static String NewHTMLTemplatesWizardPage_4;
+	public static String NewHTMLTemplatesWizardPage_5;
+	public static String NewHTMLTemplatesWizardPage_6;
+	public static String NewHTMLTemplatesWizardPage_7;
+	public static String Creating_files_encoding;
+	public static String CleanupDocument_label; // resource bundle
+	public static String CleanupDocument_tooltip; // resource bundle
+	public static String CleanupDocument_description; // resource bundle
+	public static String ToggleComment_label; // resource bundle
+	public static String ToggleComment_tooltip; // resource bundle
+	public static String ToggleComment_description; // resource bundle
+	public static String AddBlockComment_label; // resource bundle
+	public static String AddBlockComment_tooltip; // resource bundle
+	public static String AddBlockComment_description; // resource bundle
+	public static String RemoveBlockComment_label; // resource bundle
+	public static String RemoveBlockComment_tooltip; // resource bundle
+	public static String RemoveBlockComment_description; // resource bundle
+	public static String FindOccurrences_label;	// resource bundle
+	public static String Creating_files;
+	public static String Encoding_desc;
+	public static String UI_Description_of_role_of_following_DOCTYPE;
+	public static String UI_Default_HTML_DOCTYPE_ID___1;
+	public static String UI_Public_ID;
+	public static String UI_System_ID;
+	public static String UI_none;
+	public static String UI_CSS_profile___2;
+	public static String WebContentSettingsPropertyPage_0;
+	public static String ProjectWebContentSettingsPropertyPage_0;
+	
+	public static String Auto_Activation_UI_;
+	public static String Automatically_make_suggest_UI_;
+	public static String Prompt_when_these_characte_UI_;
+	public static String Cycling_UI_;
+	public static String Formatting_UI_;
+	public static String Line_width__UI_;
+	public static String Split_multiple_attributes;
+	public static String Align_final_bracket;
+	public static String Indent_using_tabs;
+	public static String Indent_using_spaces;
+	public static String Indentation_size;
+	public static String Indentation_size_tip;
+	public static String Clear_all_blank_lines_UI_;
+	public static String Preferred_markup_case_UI_;
+	public static String Tag_names__UI_;
+	public static String Tag_names_Upper_case_UI_;
+	public static String Tag_names_Lower_case_UI_;
+	public static String Attribute_names__UI_;
+	public static String Attribute_names_Upper_case_UI_;
+	public static String Attribute_names_Lower_case_UI_;
+	public static String Cleanup_UI_;
+	public static String Tag_name_case_for_HTML_UI_;
+	public static String Tag_name_case_As_is_UI_;
+	public static String Tag_name_case_Lower_UI_;
+	public static String Tag_name_case_Upper_UI_;
+	public static String Attribute_name_case_for_HTML_UI_;
+	public static String Attribute_name_case_As_is_UI_;
+	public static String Attribute_name_case_Lower_UI_;
+	public static String Attribute_name_case_Upper_UI_;
+	public static String Insert_required_attributes_UI_;
+	public static String Insert_missing_tags_UI_;
+	public static String Quote_attribute_values_UI_;
+	public static String Format_source_UI_;
+	public static String Convert_EOL_codes_UI_;
+	public static String EOL_Windows_UI;
+	public static String EOL_Unix_UI;
+	public static String EOL_Mac_UI;
+	public static String SyntaxColoringPage_0;
+	public static String SyntaxColoringPage_2;
+	public static String SyntaxColoringPage_3;
+	public static String SyntaxColoringPage_4;
+	public static String SyntaxColoringPage_5;
+	public static String SyntaxColoringPage_6;
+	
+	// below are possibly unused strings that may be deleted
+	public static String HTMLFilesPreferencePage_1;
+	public static String HTMLFilesPreferencePage_2;
+	public static String HTMLFilesPreferencePage_3;
+	// above are possibly unused strings that may be deleted
+	public static String EmptyFilePreferencePage_0;
+	public static String _UI_STRUCTURED_TEXT_EDITOR_PREFS_LINK;
+	
+	// HTML Typing Preferences
+	public static String HTMLTyping_Auto_Complete;
+	public static String HTMLTyping_Auto_Remove;
+	public static String HTMLTyping_Complete_Comments;
+	public static String HTMLTyping_Complete_End_Tags;
+	public static String HTMLTyping_Remove_End_Tags;
+	public static String HTMLTyping_Close_Strings;
+	public static String HTMLTyping_Close_Brackets;
+	
+	// below are the strings for the validation page
+	public static String Validation_description;
+	public static String Validation_Warning;
+	public static String Validation_Error;
+	public static String Validation_Ignore;
+	public static String Expandable_label_attributes;
+	public static String Expandable_label_elements;
+	public static String Expandable_label_document_type;
+	public static String Expandable_label_text;
+	public static String Expandable_label_comment;
+	public static String Expandable_label_cdata;
+	public static String Expandable_label_pi;
+	public static String Expandable_label_entity_ref;
+	
+	public static String HTMLValidationPreferencePage_0;
+	public static String HTMLValidationPreferencePage_1;
+	public static String HTMLValidationPreferencePage_10;
+	public static String HTMLValidationPreferencePage_11;
+	public static String HTMLValidationPreferencePage_12;
+	public static String HTMLValidationPreferencePage_13;
+	public static String HTMLValidationPreferencePage_14;
+	public static String HTMLValidationPreferencePage_15;
+	public static String HTMLValidationPreferencePage_16;
+	public static String HTMLValidationPreferencePage_17;
+	public static String HTMLValidationPreferencePage_18;
+	public static String HTMLValidationPreferencePage_19;
+	public static String HTMLValidationPreferencePage_2;
+	public static String HTMLValidationPreferencePage_20;
+	public static String HTMLValidationPreferencePage_21;
+	public static String HTMLValidationPreferencePage_22;
+	public static String HTMLValidationPreferencePage_23;
+	public static String HTMLValidationPreferencePage_24;
+	public static String HTMLValidationPreferencePage_25;
+	public static String HTMLValidationPreferencePage_26;
+	public static String HTMLValidationPreferencePage_27;
+	public static String HTMLValidationPreferencePage_28;
+	public static String HTMLValidationPreferencePage_29;
+	public static String HTMLValidationPreferencePage_3;
+	public static String HTMLValidationPreferencePage_30;
+	public static String HTMLValidationPreferencePage_31;
+	public static String HTMLValidationPreferencePage_32;
+	public static String HTMLValidationPreferencePage_33;
+	public static String HTMLValidationPreferencePage_34;
+	public static String HTMLValidationPreferencePage_35;
+	public static String HTMLValidationPreferencePage_4;
+	public static String HTMLValidationPreferencePage_5;
+	public static String HTMLValidationPreferencePage_6;
+	public static String HTMLValidationPreferencePage_7;
+	public static String HTMLValidationPreferencePage_8;
+	public static String HTMLValidationPreferencePage_9;
+	
+	// Validation
+	public static String Validation_Title;
+	public static String Validation_Workspace;
+	public static String Validation_Project;
+	public static String Validation_jobName;
+	
+	// Hyperlinks
+	public static String Hyperlink_line;
+	public static String Open;
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPlugin.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPlugin.java
new file mode 100644
index 0000000..6d04933
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPlugin.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal;
+
+import java.io.IOException;
+
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry;
+import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+import org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeIdsHTML;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistry;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistryImpl;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class HTMLUIPlugin extends AbstractUIPlugin {
+	public final static String ID = "org.eclipse.wst.html.ui"; //$NON-NLS-1$
+
+	protected static HTMLUIPlugin instance = null;	
+
+	/**
+	 * The template store for the html editor.
+	 */
+	private TemplateStore fTemplateStore;
+
+	/**
+	 * The template context type registry for the html editor.
+	 */
+	private ContextTypeRegistry fContextTypeRegistry;
+
+	public HTMLUIPlugin() {
+		super();
+		instance = this;
+	}
+
+	public static HTMLUIPlugin getDefault() {
+		return instance;
+	}
+
+	public synchronized static HTMLUIPlugin getInstance() {
+		return instance;
+	}
+
+	public AdapterFactoryRegistry getAdapterFactoryRegistry() {
+		return AdapterFactoryRegistryImpl.getInstance();
+
+	}
+
+	/**
+	 * Returns the template store for the html editor templates.
+	 * 
+	 * @return the template store for the html editor templates
+	 */
+	public TemplateStore getTemplateStore() {
+		if (fTemplateStore == null) {
+			fTemplateStore = new ContributionTemplateStore(getTemplateContextRegistry(), getPreferenceStore(), HTMLUIPreferenceNames.TEMPLATES_KEY);
+
+			try {
+				fTemplateStore.load();
+			} catch (IOException e) {
+				Logger.logException(e);
+			}
+		}
+		return fTemplateStore;
+	}
+
+	/**
+	 * Returns the template context type registry for the html plugin.
+	 * 
+	 * @return the template context type registry for the html plugin
+	 */
+	public ContextTypeRegistry getTemplateContextRegistry() {
+		if (fContextTypeRegistry == null) {
+			ContributionContextTypeRegistry registry = new ContributionContextTypeRegistry();
+			registry.addContextType(TemplateContextTypeIdsHTML.ALL);
+			registry.addContextType(TemplateContextTypeIdsHTML.NEW);
+			registry.addContextType(TemplateContextTypeIdsHTML.TAG);
+			registry.addContextType(TemplateContextTypeIdsHTML.ATTRIBUTE);
+			registry.addContextType(TemplateContextTypeIdsHTML.ATTRIBUTE_VALUE);
+
+			fContextTypeRegistry = registry;
+		}
+
+		return fContextTypeRegistry;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPluginResources.properties b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPluginResources.properties
new file mode 100644
index 0000000..3caf87c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPluginResources.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2004, 2009 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference      
+###############################################################################
+## The following line is a sample HTML document.  Please translate only the following parts:
+## HTML Highlighting Preferences
+## we need a flaming logo
+Sample_HTML_doc=<!DOCTYPE html\n\tPUBLIC \"-//W3C/DTD/ HTML 4.01 Transitional//EN\"\n\t\"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n\t<head>\n\t\t<meta content=\"text/html\">\n\t\t<title>HTML Highlighting Preferences</title>\n\t</head>\n<body>\n\t<!--\n\t\twe need a flaming logo!\n\t-->\n\t<p>three&nbsp;&nbsp;&nbsp;spaces</p>\n</body>\n</html>
+
+HTMLFilesPreferencePage_0=Loading files
+#
+_UI_WIZARD_NEW_TITLE = New HTML File
+_UI_WIZARD_NEW_HEADING = HTML
+_UI_WIZARD_NEW_DESCRIPTION = Create a new HTML file.
+_ERROR_FILENAME_MUST_END_HTML = The file name must end in one of the following extensions {0}.
+_WARNING_FOLDER_MUST_BE_INSIDE_WEB_CONTENT = Files created outside of the Web Content folder will not be included in your deployed Web application. 
+ResourceGroup_nameExists = The same name already exists.
+NewHTMLTemplatesWizardPage_0=Select HTML Template
+NewHTMLTemplatesWizardPage_1=Select a template as initial content in the HTML page.
+NewHTMLTemplatesWizardPage_2=Name
+NewHTMLTemplatesWizardPage_3=Description
+NewHTMLTemplatesWizardPage_4=&Use HTML Template
+NewHTMLTemplatesWizardPage_5=&Preview:
+NewHTMLTemplatesWizardPage_6=Templates are 'New HTML' templates found in the <a>HTML Templates</a> preference page.
+NewHTMLTemplatesWizardPage_7=&Templates:
+#
+Creating_files_encoding=Creating files encoding preference
+# Copied from sse.ui
+CleanupDocument_label=Cleanup Document...
+CleanupDocument_tooltip=Cleanup Document
+CleanupDocument_description=Cleanup Document
+ToggleComment_label=Toggle Comment
+ToggleComment_tooltip=Toggle Comment
+ToggleComment_description=Toggle Comment
+AddBlockComment_label=Add Block Comment
+AddBlockComment_tooltip=Add Block Comment
+AddBlockComment_description=Add Block Comment
+RemoveBlockComment_label=Remove Block Comment
+RemoveBlockComment_tooltip=Remove Block Comment
+RemoveBlockComment_description=Remove Block Comment
+FindOccurrences_label=Occurrences in File
+Creating_files=Creating files
+Encoding_desc=The following encoding will apply:
+## HTML Source preference page
+Auto_Activation_UI_=Auto Activation
+Automatically_make_suggest_UI_=Automatically ma&ke suggestions
+Prompt_when_these_characte_UI_=P&rompt when these characters are inserted:
+Cycling_UI_=Cycling
+Formatting_UI_=Formatting
+Line_width__UI_=Line &width:
+Split_multiple_attributes=Split &multiple attributes each on a new line
+Align_final_bracket=&Align final bracket in multi-line element tags
+Indent_using_tabs=&Indent using tabs
+Indent_using_spaces=I&ndent using spaces
+Indentation_size=In&dentation size:
+Indentation_size_tip=Indentation size
+Clear_all_blank_lines_UI_=Clear all &blank lines
+Preferred_markup_case_UI_=Preferred markup case for content assist, and code generation
+Tag_names__UI_=Tag names:
+Tag_names_Upper_case_UI_=&Uppercase
+Tag_names_Lower_case_UI_=&Lowercase
+Attribute_names__UI_=Attribute names:
+Attribute_names_Upper_case_UI_=U&ppercase
+Attribute_names_Lower_case_UI_=L&owercase
+Cleanup_UI_=Cleanup
+Tag_name_case_for_HTML_UI_=Tag name case for HTML:
+Tag_name_case_As_is_UI_=&As-is
+Tag_name_case_Lower_UI_=&Lower
+Tag_name_case_Upper_UI_=&Upper
+Attribute_name_case_for_HTML_UI_=Attribute name case for HTML:
+Attribute_name_case_As_is_UI_=A&s-is
+Attribute_name_case_Lower_UI_=L&ower
+Attribute_name_case_Upper_UI_=U&pper
+Insert_required_attributes_UI_=Insert &required attributes
+Insert_missing_tags_UI_=&Insert missing tags
+Quote_attribute_values_UI_=&Quote attribute values
+Format_source_UI_=&Format source
+Convert_EOL_codes_UI_=Convert line &delimiters to
+EOL_Windows_UI=&Windows
+EOL_Unix_UI=U&NIX
+EOL_Mac_UI=&Mac
+
+# web content settings
+UI_Description_of_role_of_following_DOCTYPE=Use the following default document type when no DOCTYPE is declared in a file:
+UI_Default_HTML_DOCTYPE_ID___1=Document type:
+UI_Public_ID=Public ID:
+UI_System_ID=System ID:
+UI_none=none
+UI_CSS_profile___2=CSS profile:
+WebContentSettingsPropertyPage_0=The properties used that cannot or are not specified in web files.  The project setting is used if you specify "none."
+ProjectWebContentSettingsPropertyPage_0=These values are used when the corresponding properties are not specified within a web page.
+SyntaxColoringPage_0=Syntax Element:
+SyntaxColoringPage_2=Enable
+SyntaxColoringPage_3=&Bold
+SyntaxColoringPage_4=&Italic
+SyntaxColoringPage_5=&Strikethrough
+SyntaxColoringPage_6=&Underline
+# below are possibly unused strings that may be deleted
+HTMLFilesPreferencePage_1=Add this suffix (if not specified):
+HTMLFilesPreferencePage_2=Insert DOCTYPE declaration
+HTMLFilesPreferencePage_3=Insert GENERATOR with META tag
+EmptyFilePreferencePage_0=Expand the tree to edit preferences for a specific feature.
+_UI_STRUCTURED_TEXT_EDITOR_PREFS_LINK=HTML editing preferences.  Note that some preferences may be set on the <a>{0}</a> preference page.
+# above are possibly unused strings that may be deleted
+
+# HTML Typing Preference Page
+HTMLTyping_Auto_Complete=Automatically close
+HTMLTyping_Auto_Remove=Automatically remove
+HTMLTyping_Complete_Comments=&Comments
+HTMLTyping_Close_Strings=A&ttribute values
+HTMLTyping_Close_Brackets=(Parentheses) and [square] brac&kets
+HTMLTyping_Complete_End_Tags=&End tags
+HTMLTyping_Remove_End_Tags=E&nd tags when creating empty self-closing tags
+
+
+# Validation strings
+Validation_description=Select the severity level for the following validation problems:
+Validation_Warning=Warning
+Validation_Error=Error
+Validation_Ignore=Ignore
+Expandable_label_attributes=Attributes
+Expandable_label_elements=Elements
+Expandable_label_document_type=Document Type
+Expandable_label_text=Text Regions
+Expandable_label_comment=Comments
+Expandable_label_cdata=CDATA Sections
+Expandable_label_pi=Processing Instructions
+Expandable_label_entity_ref=Entity References
+
+HTMLValidationPreferencePage_0=Undefined attribute name:
+HTMLValidationPreferencePage_1=Undefined attribute value:
+HTMLValidationPreferencePage_10=Start-tag uses invalid case:
+HTMLValidationPreferencePage_11=End tag uses invalid case:
+HTMLValidationPreferencePage_12=Missing start tag:
+HTMLValidationPreferencePage_13=Missing end tag:
+HTMLValidationPreferencePage_14=Unnecessary end tag:
+HTMLValidationPreferencePage_15=Invalid directive:
+HTMLValidationPreferencePage_16=Invalid tag location:
+HTMLValidationPreferencePage_17=Duplicate tag:
+HTMLValidationPreferencePage_18=Coexistence:
+HTMLValidationPreferencePage_19=Unclosed start tag:
+HTMLValidationPreferencePage_2=Attribute name using wrong case character:
+HTMLValidationPreferencePage_20=Unclosed end tag:
+HTMLValidationPreferencePage_21=Invalid empty element tag:
+HTMLValidationPreferencePage_22=Duplicate DOCTYPE declaration:
+HTMLValidationPreferencePage_23=Invalid location:
+HTMLValidationPreferencePage_24=DOCTYPE declaration unclosed:
+HTMLValidationPreferencePage_25=Invalid text string:
+HTMLValidationPreferencePage_26=Invalid characters used in text string:
+HTMLValidationPreferencePage_27=Invalid location:
+HTMLValidationPreferencePage_28=Unclosed comment:
+HTMLValidationPreferencePage_29=Invalid location:
+HTMLValidationPreferencePage_3=Invalid attribute name:
+HTMLValidationPreferencePage_30=Unclosed CDATA section:
+HTMLValidationPreferencePage_31=Invalid location:
+HTMLValidationPreferencePage_32=Unclosed processing instruction:
+HTMLValidationPreferencePage_33=Invalid location:
+HTMLValidationPreferencePage_34=Unknown entity:
+HTMLValidationPreferencePage_4=Invalid attribute:
+HTMLValidationPreferencePage_5=Multiple values specified for an attribute:
+HTMLValidationPreferencePage_6=Attribute value using wrong case character:
+HTMLValidationPreferencePage_7=Unclosed attribute value:
+HTMLValidationPreferencePage_8=Unknown tag name:
+HTMLValidationPreferencePage_9=Invalid tag name:
+HTMLValidationPreferencePage_35=Attribute value refers to missing resource:
+
+Validation_Title=Validation Settings Changed
+Validation_Workspace=The validation settings have changed. A full validation is required for changes to take effect. Validate now?
+Validation_Project=The validation settings have changed. A validation of the project is required for changes to take effect. Validate the project now?
+Validation_jobName=Validating...
+
+Hyperlink_line={0}={1} : line {2}
+Open=Open ''{0}''
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/Logger.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/Logger.java
new file mode 100644
index 0000000..580f3fe
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/Logger.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal;
+
+
+
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Small convenience class to log messages to plugin's log file and also, if
+ * desired, the console. This class should only be used by classes in this
+ * plugin. Other plugins should make their own copy, with appropriate ID.
+ */
+public class Logger {
+	private static final String PLUGIN_ID = "org.eclipse.wst.html.ui"; //$NON-NLS-1$
+	
+	public static final int ERROR = IStatus.ERROR; // 4
+	public static final int ERROR_DEBUG = 200 + ERROR;
+	public static final int INFO = IStatus.INFO; // 1
+	public static final int INFO_DEBUG = 200 + INFO;
+
+	public static final int OK = IStatus.OK; // 0
+
+	public static final int OK_DEBUG = 200 + OK;
+
+	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
+	public static final int WARNING = IStatus.WARNING; // 2
+	public static final int WARNING_DEBUG = 200 + WARNING;
+
+	/**
+	 * Adds message to log.
+	 * 
+	 * @param level
+	 *            severity level of the message (OK, INFO, WARNING, ERROR,
+	 *            OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
+	 * @param message
+	 *            text to add to the log
+	 * @param exception
+	 *            exception thrown
+	 */
+	protected static void _log(int level, String message, Throwable exception) {
+		if (level == OK_DEBUG || level == INFO_DEBUG || level == WARNING_DEBUG || level == ERROR_DEBUG) {
+			if (!isDebugging())
+				return;
+		}
+
+		int severity = IStatus.OK;
+		switch (level) {
+			case INFO_DEBUG :
+			case INFO :
+				severity = IStatus.INFO;
+				break;
+			case WARNING_DEBUG :
+			case WARNING :
+				severity = IStatus.WARNING;
+				break;
+			case ERROR_DEBUG :
+			case ERROR :
+				severity = IStatus.ERROR;
+		}
+		message = (message != null) ? message : "null"; //$NON-NLS-1$
+		Status statusObj = new Status(severity, PLUGIN_ID, severity, message, exception);
+		Bundle bundle = Platform.getBundle(PLUGIN_ID);
+		if (bundle != null) 
+			Platform.getLog(bundle).log(statusObj);
+	}
+
+	/**
+	 * Prints message to log if category matches /debug/tracefilter option.
+	 * 
+	 * @param message
+	 *            text to print
+	 * @param category
+	 *            category of the message, to be compared with
+	 *            /debug/tracefilter
+	 */
+	protected static void _trace(String category, String message, Throwable exception) {
+		if (isTracing(category)) {
+			message = (message != null) ? message : "null"; //$NON-NLS-1$
+			Status statusObj = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, exception);
+			Bundle bundle = Platform.getBundle(PLUGIN_ID);
+			if (bundle != null) 
+				Platform.getLog(bundle).log(statusObj);
+		}
+	}
+
+	/**
+	 * @return true if the platform is debugging
+	 */
+	public static boolean isDebugging() {
+		return Platform.inDebugMode();
+	}
+
+	/**
+	 * Determines if currently tracing a category
+	 * 
+	 * @param category
+	 * @return true if tracing category, false otherwise
+	 */
+	public static boolean isTracing(String category) {
+		if (!isDebugging())
+			return false;
+
+		String traceFilter = Platform.getDebugOption(PLUGIN_ID + TRACEFILTER_LOCATION);
+		if (traceFilter != null) {
+			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
+			while (tokenizer.hasMoreTokens()) {
+				String cat = tokenizer.nextToken().trim();
+				if (category.equals(cat)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	public static void log(int level, String message) {
+		_log(level, message, null);
+	}
+
+	public static void log(int level, String message, Throwable exception) {
+		_log(level, message, exception);
+	}
+
+	public static void logException(String message, Throwable exception) {
+		_log(ERROR, message, exception);
+	}
+
+	public static void logException(Throwable exception) {
+		_log(ERROR, exception.getMessage(), exception);
+	}
+
+	public static void trace(String category, String message) {
+		_trace(category, message, null);
+	}
+
+	public static void traceException(String category, String message, Throwable exception) {
+		_trace(category, message, exception);
+	}
+
+	public static void traceException(String category, Throwable exception) {
+		_trace(category, exception.getMessage(), exception);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/autoedit/AutoEditStrategyForTabs.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/autoedit/AutoEditStrategyForTabs.java
new file mode 100644
index 0000000..bc89ee5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/autoedit/AutoEditStrategyForTabs.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ *******************************************************************************/
+
+package org.eclipse.wst.html.ui.internal.autoedit;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.ConfigurableLineTracker;
+import org.eclipse.jface.text.DocumentCommand;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ILineTracker;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension3;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.ui.internal.Logger;
+
+/**
+ * AutoEditStrategy to handle characters inserted when Tab key is pressed
+ */
+public class AutoEditStrategyForTabs implements IAutoEditStrategy {
+	private final String TAB_CHARACTER = "\t";	//$NON-NLS-1$
+	
+	public void customizeDocumentCommand(IDocument document, DocumentCommand command) {
+		// if not in smart insert mode just ignore
+		if (!isSmartInsertMode())
+			return;
+		
+		// spaces for tab character
+		if (command.length == 0 && command.text != null && command.text.length() > 0 && command.text.indexOf(TAB_CHARACTER) != -1)
+			smartInsertForTab(command, document);
+	}
+
+	/**
+	 * Insert spaces for tabs
+	 * 
+	 * @param command
+	 */
+	private void smartInsertForTab(DocumentCommand command, IDocument document) {
+		// tab key was pressed. now check preferences to see if need to insert
+		// spaces instead of tab
+		int indentationWidth = getIndentationWidth();
+		if (indentationWidth > -1) {
+			String originalText = command.text;
+			StringBuffer newText = new StringBuffer(originalText);
+
+			// determine where in line this command begins
+			int lineOffset = -1;
+			try {
+				IRegion lineInfo = document.getLineInformationOfOffset(command.offset);
+				lineOffset = command.offset - lineInfo.getOffset();
+			} catch (BadLocationException e) {
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			}
+
+			ILineTracker lineTracker = getLineTracker(document, originalText);
+
+			int startIndex = 0;
+			int index = newText.indexOf(TAB_CHARACTER);
+			while (index != -1) {
+				String indent = getIndentString(indentationWidth, lineOffset, lineTracker, index);
+
+				// replace \t character with spaces
+				newText.replace(index, index + 1, indent);
+				if (lineTracker != null) {
+					try {
+						lineTracker.replace(index, 1, indent);
+					} catch (BadLocationException e) {
+						// if something goes wrong with replacing text, just
+						// reset to current string
+						lineTracker.set(newText.toString());
+						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+					}
+				}
+
+				startIndex = index + indent.length();
+				index = newText.indexOf(TAB_CHARACTER, startIndex);
+			}
+			command.text = newText.toString();
+		}
+	}
+
+	/**
+	 * Calculate number of spaces for next tab stop
+	 */
+	private String getIndentString(int indentationWidth, int lineOffset, ILineTracker lineTracker, int index) {
+		int indentSize = indentationWidth;
+		int offsetInLine = -1;
+		if (lineTracker != null) {
+			try {
+				IRegion lineInfo = lineTracker.getLineInformationOfOffset(index);
+				if (lineInfo.getOffset() == 0 && lineOffset > -1)
+					offsetInLine = lineOffset + index;
+				else
+					offsetInLine = index - lineInfo.getOffset();
+			} catch (BadLocationException e) {
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			}
+		} else {
+			if (lineOffset > -1) {
+				offsetInLine = lineOffset + index;
+			}
+		}
+		if (offsetInLine > -1 && indentationWidth > 0) {
+			int remainder = offsetInLine % indentationWidth;
+			indentSize = indentationWidth - remainder;
+		}
+
+		StringBuffer indent = new StringBuffer();
+		for (int i = 0; i < indentSize; i++)
+			indent.append(' ');
+		return indent.toString();
+	}
+
+	/**
+	 * Set up a line tracker for text within command if text is multi-line
+	 */
+	private ILineTracker getLineTracker(IDocument document, String originalText) {
+		ConfigurableLineTracker lineTracker = null;
+		int[] delims = TextUtilities.indexOf(document.getLegalLineDelimiters(), originalText, 0);
+		if (delims[0] != -1 || delims[1] != -1) {
+			lineTracker = new ConfigurableLineTracker(document.getLegalLineDelimiters());
+			lineTracker.set(originalText);
+		}
+		return lineTracker;
+	}
+	
+	/**
+	 * Return true if active editor is in smart insert mode, false otherwise
+	 * 
+	 * @return
+	 */
+	private boolean isSmartInsertMode() {
+		boolean isSmartInsertMode = false;
+		
+		ITextEditor textEditor = null;
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (window != null) {
+			IWorkbenchPage page = window.getActivePage();
+			if (page != null) {
+				IEditorPart editor = page.getActiveEditor();
+				if (editor != null) {
+					if (editor instanceof ITextEditor)
+						textEditor = (ITextEditor)editor;
+					else
+						textEditor = (ITextEditor)editor.getAdapter(ITextEditor.class);
+				}
+			}
+		}
+		
+		// check if smart insert mode
+		if (textEditor instanceof ITextEditorExtension3 && ((ITextEditorExtension3) textEditor).getInsertMode() == ITextEditorExtension3.SMART_INSERT)
+			isSmartInsertMode = true;
+		return isSmartInsertMode;
+	}
+	
+	/**
+	 * Returns indentation width if using spaces for indentation, -1 otherwise
+	 * 
+	 * @return
+	 */
+	private int getIndentationWidth() {
+		int width = -1;
+
+		Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences();
+		if (HTMLCorePreferenceNames.SPACE.equals(preferences.getString(HTMLCorePreferenceNames.INDENTATION_CHAR)))
+			width = preferences.getInt(HTMLCorePreferenceNames.INDENTATION_SIZE);
+
+		return width;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/autoedit/StructuredAutoEditStrategyHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/autoedit/StructuredAutoEditStrategyHTML.java
new file mode 100644
index 0000000..57e49df
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/autoedit/StructuredAutoEditStrategyHTML.java
@@ -0,0 +1,349 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.autoedit;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentCommand;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension3;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry;
+import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Automatically inserts closing comment tag or end tag when appropriate.
+ */
+public class StructuredAutoEditStrategyHTML implements IAutoEditStrategy {
+	/*
+	 * NOTE: copies of this class exists in
+	 * org.eclipse.wst.xml.ui.internal.autoedit
+	 * org.eclipse.wst.html.ui.internal.autoedit
+	 */
+	public void customizeDocumentCommand(IDocument document, DocumentCommand command) {
+		Object textEditor = getActiveTextEditor();
+		if (!(textEditor instanceof ITextEditorExtension3 && ((ITextEditorExtension3) textEditor).getInsertMode() == ITextEditorExtension3.SMART_INSERT))
+			return;
+
+		IStructuredModel model = null;
+		try {
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+			if (model != null) {
+				if (command.text != null) {
+					smartInsertCloseElement(command, document, model);
+					smartInsertForComment(command, document, model);
+					smartInsertForEndTag(command, document, model);
+					smartRemoveEndTag(command, document, model);
+				}
+			}
+		}
+		finally {
+			if (model != null)
+				model.releaseFromRead();
+		}
+	}
+
+	private boolean isPreferenceEnabled(String key) {
+		return (key != null && HTMLUIPlugin.getDefault().getPreferenceStore().getBoolean(key));
+	}
+	
+	private boolean isCommentNode(IDOMNode node) {
+		return (node != null && node instanceof IDOMElement && ((IDOMElement) node).isCommentTag());
+	}
+
+	private boolean isDocumentNode(IDOMNode node) {
+		return (node != null && node.getNodeType() == Node.DOCUMENT_NODE);
+	}
+	
+	/**
+	 * Attempts to clean up an end-tag if a start-tag is converted into an empty-element
+	 * tag (e.g., <node />) and the original element was empty.
+	 * 
+	 * @param command the document command describing the change
+	 * @param document the document that will be changed
+	 * @param model the model based on the document
+	 */
+	private void smartRemoveEndTag(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			// An opening tag is now a self-terminated end-tag
+			if ("/".equals(command.text) && ">".equals(document.get(command.offset, 1)) && command.length == 0 && isPreferenceEnabled(HTMLUIPreferenceNames.TYPING_REMOVE_END_TAGS)) { //$NON-NLS-1$ //$NON-NLS-2$
+				IDOMNode node = (IDOMNode) model.getIndexedRegion(command.offset);
+				if (node != null && !node.hasChildNodes()) {
+					IStructuredDocumentRegion region = node.getFirstStructuredDocumentRegion();
+					if(region.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN && command.offset <= region.getEnd()) {
+						
+						/* if the region before the command offset is a an attribute value region
+						 * check to see if it has both and opening and closing quote
+						 */
+						ITextRegion prevTextRegion = region.getRegionAtCharacterOffset(command.offset-1);
+						boolean inUnclosedAttValueRegion = false;
+						if(prevTextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+							//get the text of the attribute value region
+							String prevText = region.getText(prevTextRegion);
+							inUnclosedAttValueRegion = (prevText.startsWith("'") && ((prevText.length() == 1) || !prevText.endsWith("'"))) ||
+								(prevText.startsWith("\"") && ((prevText.length() == 1) || !prevText.endsWith("\"")));
+						} 
+					
+						//if command offset is in an unclosed attribute value region then done remove the end tag
+						if(!inUnclosedAttValueRegion) {
+							region = node.getEndStructuredDocumentRegion();
+							if (region != null && region.isEnded()) {
+								document.replace(region.getStartOffset(), region.getLength(), ""); //$NON-NLS-1$
+							}
+						}
+					}
+				}
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+	}
+
+	private void smartInsertForComment(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			if (command.text.equals("-") && document.getLength() >= 3 && document.get(command.offset - 3, 3).equals("<!-") && isPreferenceEnabled(HTMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS)) { //$NON-NLS-1$ //$NON-NLS-2$
+				command.text += "  -->"; //$NON-NLS-1$
+				command.shiftsCaret = false;
+				command.caretOffset = command.offset + 2;
+				command.doit = false;
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+
+	}
+	
+	/**
+	 * Attempts to insert the end tag when completing a start-tag with the '&gt;' character.
+	 * 
+	 * @param command
+	 * @param document
+	 * @param model
+	 */
+	private void smartInsertCloseElement(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			// Check terminating start tag, but ignore empty-element tags
+			if (command.text.equals(">") && document.getLength() > 0 && document.getChar(command.offset - 1) != '/' && isPreferenceEnabled(HTMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS)) { //$NON-NLS-1$
+				IDOMNode node = (IDOMNode) model.getIndexedRegion(command.offset - 1);
+				boolean isClosedByParent = false;
+				// Only insert an end-tag if necessary. Because of the way the document is parsed, it is possible for a child tag with the same
+				// name as an ancestor to be paired with the end-tag of an ancestor, so the ancestors must be checked for an unclosed tag.
+				if (node != null && node.getNodeType() == Node.ELEMENT_NODE && (!node.isClosed() || (isClosedByParent = hasUnclosedAncestor(node)))) {
+					IStructuredDocumentRegion region = node.getEndStructuredDocumentRegion();
+					if (region != null && region.getRegions().size() > 0 && region.getRegions().get(0).getType() == DOMRegionContext.XML_END_TAG_OPEN && !isClosedByParent)
+						return;
+					CMElementDeclaration decl = getCMElementDeclaration(node);
+					// If it's XHTML, always generate the end tag
+					if (isXHTML(node) || shouldGenerateEndTag(decl)) {
+						command.text += "</" + getElementName(node, command.offset) + ">"; //$NON-NLS-1$ //$NON-NLS-2$
+						command.shiftsCaret = false;
+						command.caretOffset = command.offset + 1;
+					}
+				}
+				
+			}
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Get the element name that will be created by closing the start tag. Defaults
+	 * to the node's nodeName.
+	 * @param node the node that is being edited
+	 * @param offset the offset in the document where the start tag is closed
+	 * @return The element name of the tag
+	 */
+	private String getElementName(IDOMNode node, int offset) {
+		String name = null;
+		
+		IStructuredDocumentRegion region = node.getFirstStructuredDocumentRegion();
+		ITextRegion textRegion = region.getRegionAtCharacterOffset(offset);
+		if (textRegion != null && textRegion.getType() == DOMRegionContext.XML_TAG_NAME) {
+			int nameStart = region.getStartOffset(textRegion);
+			String regionText = region.getText(textRegion);
+			int length = offset - nameStart;
+			if (length <= regionText.length())
+				name = regionText.substring(0, length);
+		}
+		
+		// Default to the node name
+		if (name == null)
+			name = node.getNodeName();
+		return name;
+	}
+
+	private void smartInsertForEndTag(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			if (command.text.equals("/") && document.getLength() >= 1 && document.get(command.offset - 1, 1).equals("<") && isPreferenceEnabled(HTMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS)) { //$NON-NLS-1$ //$NON-NLS-2$
+				IDOMNode parentNode = (IDOMNode) ((IDOMNode) model.getIndexedRegion(command.offset - 1)).getParentNode();
+				if (isCommentNode(parentNode)) {
+					// loop and find non comment node parent
+					while (parentNode != null && isCommentNode(parentNode)) {
+						parentNode = (IDOMNode) parentNode.getParentNode();
+					}
+				}
+
+				if (!isDocumentNode(parentNode)) {
+					// only add end tag if one does not already exist or if
+					// add '/' does not create one already
+					IStructuredDocumentRegion endTagStructuredDocumentRegion = parentNode.getEndStructuredDocumentRegion();
+					IDOMNode ancestor = parentNode;
+					boolean smartInsertForEnd = false;
+					if(endTagStructuredDocumentRegion != null) {
+						// Look for ancestors by the same name that are missing end tags
+						while((ancestor = (IDOMNode) ancestor.getParentNode()) != null) {
+							if(ancestor.getEndStructuredDocumentRegion() == null && parentNode.getNodeName().equals(ancestor.getNodeName())) {
+								smartInsertForEnd = true;
+								break;
+							}
+						}
+					}
+					if (endTagStructuredDocumentRegion == null || smartInsertForEnd) {
+						StringBuffer toAdd = new StringBuffer(parentNode.getNodeName());
+						if (toAdd.length() > 0) {
+							toAdd.append(">"); //$NON-NLS-1$
+							String suffix = toAdd.toString();
+							if ((document.getLength() < command.offset + suffix.length()) || (!suffix.equals(document.get(command.offset, suffix.length())))) {
+								command.text += suffix;
+							}
+						}
+					}
+				}
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+	}
+
+	/**
+	 * Checks if <code>node</code> has an unclosed ancestor by the same name
+	 * 
+	 * @param node the node to check
+	 * @return true if <code>node</code> has an unclosed parent with the same node name
+	 */
+	private boolean hasUnclosedAncestor(IDOMNode node) {
+		IDOMNode parent = (IDOMNode) node.getParentNode();
+		while (parent != null && parent.getNodeType() != Node.DOCUMENT_NODE && parent.getNodeName().equals(node.getNodeName())) {
+			if (!parent.isClosed())
+				return true;
+			parent = (IDOMNode) parent.getParentNode();
+		}
+		return false;
+	}
+
+	/**
+	 * Based on the content model, determine if an end tag should be generated
+	 * @param elementDecl the content model element declaration
+	 * @return true if the end tag should be generated; false otherwise.
+	 */
+	private boolean shouldGenerateEndTag(CMElementDeclaration elementDecl) {
+		if (elementDecl == null)
+			return false;
+		if (elementDecl instanceof HTMLElementDeclaration) {
+			if (((Boolean) elementDecl.getProperty(HTMLCMProperties.IS_JSP)).booleanValue()) {
+				if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
+					return false;
+			}
+			else {
+				String ommission = (String) elementDecl.getProperty(HTMLCMProperties.OMIT_TYPE);
+				if (ommission.equals(HTMLCMProperties.Values.OMIT_END) || ommission.equals(HTMLCMProperties.Values.OMIT_END_DEFAULT) || ommission.equals(HTMLCMProperties.Values.OMIT_END_MUST)) {
+					return false;
+				}
+			}
+		}
+
+		if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
+			return false;
+		return true;
+	}
+
+	private CMElementDeclaration getCMElementDeclaration(Node node) {
+		CMElementDeclaration result = null;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+			if (modelQuery != null) {
+				result = modelQuery.getCMElementDeclaration((Element) node);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Is the node part of an XHTML document
+	 * @param node
+	 * @return
+	 */
+	private boolean isXHTML(Node node) {
+		Document doc = node.getOwnerDocument();
+		if (!(doc instanceof IDOMDocument))
+			return false;
+		String typeid = ((IDOMDocument) doc).getDocumentTypeId();
+		if (typeid != null) {
+			HTMLDocumentTypeEntry entry = HTMLDocumentTypeRegistry.getInstance().getEntry(typeid);
+			return (entry != null && entry.isXMLType());
+		}
+		return false;
+	}
+	
+	/**
+	 * Return the active text editor if possible, otherwise the active editor
+	 * part.
+	 * 
+	 * @return Object
+	 */
+	private Object getActiveTextEditor() {
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (window != null) {
+			IWorkbenchPage page = window.getActivePage();
+			if (page != null) {
+				IEditorPart editor = page.getActiveEditor();
+				if (editor != null) {
+					if (editor instanceof ITextEditor)
+						return editor;
+					ITextEditor textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);
+					if (textEditor != null)
+						return textEditor;
+					return editor;
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/CustomTemplateProposal.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/CustomTemplateProposal.java
new file mode 100644
index 0000000..6bb0f20
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/CustomTemplateProposal.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateProposal;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.contentassist.IRelevanceCompletionProposal;
+
+/**
+ * Purpose of this class is to make the additional proposal info into content
+ * fit for an HTML viewer (by escaping characters)
+ */
+class CustomTemplateProposal extends TemplateProposal implements IRelevanceCompletionProposal {
+	// copies of this class exist in:
+	// org.eclipse.jst.jsp.ui.internal.contentassist
+	// org.eclipse.wst.html.ui.internal.contentassist
+	// org.eclipse.wst.xml.ui.internal.contentassist
+
+	public CustomTemplateProposal(Template template, TemplateContext context, IRegion region, Image image, int relevance) {
+		super(template, context, region, image, relevance);
+	}
+
+	public String getAdditionalProposalInfo() {
+		String additionalInfo = super.getAdditionalProposalInfo();
+		return StringUtils.convertToHTMLContent(additionalInfo);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLContentAssistProcessor.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLContentAssistProcessor.java
new file mode 100644
index 0000000..63c2ced
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLContentAssistProcessor.java
@@ -0,0 +1,511 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.wst.css.ui.internal.contentassist.CSSContentAssistProcessor;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument;
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
+import org.eclipse.wst.html.core.text.IHTMLPartitions;
+import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImageHelper;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImages;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+import org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeIdsHTML;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
+import org.eclipse.wst.xml.ui.internal.contentassist.AbstractContentAssistProcessor;
+import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLContentModelGenerator;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLRelevanceConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @deprecated This class is no longer used locally and will be removed in the future
+ * @see HTMLStructuredContentAssistProcessor
+ */
+public class HTMLContentAssistProcessor extends AbstractContentAssistProcessor implements IPropertyChangeListener {
+	private INodeAdapterFactory factoryForCSS = null;
+	protected IPreferenceStore fPreferenceStore = null;
+	protected boolean isXHTML = false;
+	private HTMLTemplateCompletionProcessor fTemplateProcessor = null;
+	private IContentAssistProcessor fJSContentAssistProcessor = null;
+	private List fTemplateContexts = new ArrayList();
+
+	public HTMLContentAssistProcessor() {
+
+		super();
+	}
+
+	protected void addAttributeNameProposals(ContentAssistRequest contentAssistRequest) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.ATTRIBUTE);
+		super.addAttributeNameProposals(contentAssistRequest);
+	}
+
+	protected void addAttributeValueProposals(ContentAssistRequest contentAssistRequest) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.ATTRIBUTE_VALUE);
+		super.addAttributeValueProposals(contentAssistRequest);
+	}
+
+	/**
+	 * Add the proposals for a completely empty document
+	 */
+	protected void addEmptyDocumentProposals(ContentAssistRequest contentAssistRequest) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.NEW);
+	}
+
+	protected void addPCDATAProposal(String nodeName, ContentAssistRequest contentAssistRequest) {
+		if (isXHTML)
+			super.addPCDATAProposal(nodeName, contentAssistRequest);
+	}
+
+	protected void addStartDocumentProposals(ContentAssistRequest contentAssistRequest) {
+		if (isXHTML)
+			addEmptyDocumentProposals(contentAssistRequest);
+	}
+
+	protected void addTagInsertionProposals(ContentAssistRequest contentAssistRequest, int childPosition) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.TAG);
+		super.addTagInsertionProposals(contentAssistRequest, childPosition);
+	}
+
+	/**
+	 * Adds templates to the list of proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	private void addTemplates(ContentAssistRequest contentAssistRequest, String context) {
+		addTemplates(contentAssistRequest, context, contentAssistRequest.getReplacementBeginPosition());
+	}
+	
+	/**
+	 * Adds templates to the list of proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 * @param startOffset
+	 */
+	private void addTemplates(ContentAssistRequest contentAssistRequest, String context, int startOffset) {
+		if (contentAssistRequest == null)
+			return;
+		
+		// if already adding template proposals for a certain context type, do
+		// not add again
+		if (!fTemplateContexts.contains(context)) {
+			fTemplateContexts.add(context);
+			boolean useProposalList = !contentAssistRequest.shouldSeparate();
+
+			if (getTemplateCompletionProcessor() != null) {
+				getTemplateCompletionProcessor().setContextType(context);
+				ICompletionProposal[] proposals = getTemplateCompletionProcessor().computeCompletionProposals(fTextViewer, startOffset);
+				for (int i = 0; i < proposals.length; ++i) {
+					if (useProposalList)
+						contentAssistRequest.addProposal(proposals[i]);
+					else
+						contentAssistRequest.addMacro(proposals[i]);
+				}
+			}
+		}
+	}
+
+	protected boolean beginsWith(String aString, String prefix) {
+		if (aString == null || prefix == null || prefix.length() == 0)
+			return true;
+		int minimumLength = Math.min(prefix.length(), aString.length());
+		String beginning = aString.substring(0, minimumLength);
+		return beginning.equalsIgnoreCase(prefix);
+	}
+
+	protected ContentAssistRequest computeCompletionProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode treeNode, IDOMNode xmlnode) {
+		ContentAssistRequest request = super.computeCompletionProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+		// bug115927 use original document position for all/any region templates
+		addTemplates(request, TemplateContextTypeIdsHTML.ALL, documentPosition);
+		return request;
+	}
+
+	/**
+	 * Return a list of proposed code completions based on the specified
+	 * location within the document that corresponds to the current cursor
+	 * position within the text-editor control.
+	 * 
+	 * @param documentPosition
+	 *            a location within the document
+	 * @return an array of code-assist items
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer textViewer, int documentPosition) {
+		fTemplateContexts.clear();
+
+		IndexedRegion treeNode = ContentAssistUtils.getNodeAt(textViewer, documentPosition);
+		IDOMNode node = (IDOMNode) treeNode;
+		setErrorMessage(null);
+
+		// check if it's in a comment node
+		IStructuredDocument structuredDocument = (IStructuredDocument) textViewer.getDocument();
+		IStructuredDocumentRegion fn = structuredDocument.getRegionAtCharacterOffset(documentPosition);
+		if (fn != null && fn.getType() == DOMRegionContext.XML_COMMENT_TEXT && documentPosition != fn.getStartOffset()) {
+			return new ICompletionProposal[0];
+		}
+
+		// CMVC 242695
+		// if it's a </script> tag, bounce back to JS ca processor...
+		if (fn != null && fn.getType() == DOMRegionContext.XML_TAG_NAME && documentPosition == fn.getStartOffset()) {
+			ITextRegionList v = fn.getRegions();
+			if (v.size() > 1) {
+				// determine that it's a close tag
+				if ((v.get(0)).getType() == DOMRegionContext.XML_END_TAG_OPEN) {
+					Iterator it = v.iterator();
+					ITextRegion region = null;
+					// search for script tag name
+					while (it.hasNext()) {
+						region = (ITextRegion) it.next();
+						if (fn.getText(region).equalsIgnoreCase("script")) { //$NON-NLS-1$
+							IContentAssistProcessor jsProcessor = getJSContentAssistProcessor();
+							if (jsProcessor != null) {
+								return jsProcessor.computeCompletionProposals(textViewer, documentPosition);
+							}
+							return new ICompletionProposal[0];
+						}
+					}
+				}
+			}
+		}
+
+		isXHTML = getXHTML(node);
+
+		fGenerator = null; // force reload of content generator
+
+		// handle blank HTML document case
+		if (treeNode == null || isViewerEmpty(textViewer)) {
+			// cursor is at the EOF
+			ICompletionProposal htmlTagProposal = getHTMLTagProposal(textViewer, documentPosition);
+			ICompletionProposal[] superResults = super.computeCompletionProposals(textViewer, documentPosition);
+			if (superResults != null && superResults.length > 0 && htmlTagProposal != null) {
+				ICompletionProposal[] blankHTMLDocResults = new ICompletionProposal[superResults.length + 1];
+				blankHTMLDocResults[0] = htmlTagProposal;
+				System.arraycopy(superResults, 0, blankHTMLDocResults, 1, superResults.length);
+				return blankHTMLDocResults;
+			}
+		}
+
+		if (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
+
+			// check embedded CSS proposals at the beginning of the STYLE end
+			// tag
+			Element element = (Element) node;
+			String tagName = element.getTagName();
+			if (tagName != null && tagName.equalsIgnoreCase(HTML40Namespace.ATTR_NAME_STYLE)) {//$NON-NLS-1$
+				IStructuredDocumentRegion endStructuredDocumentRegion = node.getEndStructuredDocumentRegion();
+				if (endStructuredDocumentRegion != null && endStructuredDocumentRegion.getStartOffset() == documentPosition) {
+					IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
+					if (startStructuredDocumentRegion != null) {
+						int offset = startStructuredDocumentRegion.getEndOffset();
+						int pos = documentPosition - offset;
+						ICompletionProposal[] proposals = getCSSProposals(textViewer, pos, node, offset, (char) 0);
+						if (proposals != null)
+							return proposals;
+					}
+				}
+			}
+
+			// check inline CSS proposals
+			// need to find attr region from sd region
+			IStructuredDocumentRegion sdRegion = ContentAssistUtils.getStructuredDocumentRegion(textViewer, documentPosition);
+			Iterator regions = sdRegion.getRegions().iterator();
+			ITextRegion styleNameRegion = null;
+			ITextRegion styleValueRegion = null;
+			while (regions.hasNext()) {
+				styleNameRegion = (ITextRegion) regions.next();
+				if (styleNameRegion.getType().equals(DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) && sdRegion.getText(styleNameRegion).equalsIgnoreCase(HTML40Namespace.ATTR_NAME_STYLE)) { //$NON-NLS-1$
+					// the next region should be "="
+					if (regions.hasNext()) {
+						regions.next(); // skip the "="
+						// next region should be attr value region
+						if (regions.hasNext()) {
+							styleValueRegion = (ITextRegion) regions.next();
+							break;
+						}
+					}
+				}
+			}
+
+			if (styleValueRegion != null) {
+				int offset = sdRegion.getStartOffset(styleValueRegion);
+				int end = sdRegion.getTextEndOffset(styleValueRegion);
+				if (documentPosition >= offset && documentPosition <= end) {
+					boolean askCSS = true;
+					char quote = (char) 0;
+					String text = sdRegion.getText(styleValueRegion);
+					int length = (text != null ? text.length() : 0);
+					if (length > 0) {
+						char firstChar = text.charAt(0);
+						if (firstChar == '"' || firstChar == '\'') {
+							if (documentPosition == offset) {
+								// before quote
+								askCSS = false;
+							}
+							else {
+								offset++;
+								quote = firstChar;
+							}
+						}
+						if (documentPosition == end) {
+							if (length > 1 && text.charAt(length - 1) == quote) {
+								// after quote
+								askCSS = false;
+							}
+						}
+					}
+					if (askCSS) {
+						int pos = documentPosition - offset;
+						ICompletionProposal[] proposals = getCSSProposals(textViewer, pos, node, offset, quote);
+						if (proposals != null)
+							return proposals;
+					}
+				}
+			}
+		}
+
+		return super.computeCompletionProposals(textViewer, documentPosition);
+	}
+
+	/**
+	 * Returns true if there is no text or it's all white space, otherwise
+	 * returns false
+	 * 
+	 * @param treeNode
+	 * @param textViewer
+	 * @return boolean
+	 */
+	private boolean isViewerEmpty(ITextViewer textViewer) {
+		boolean isEmpty = false;
+		String text = textViewer.getTextWidget().getText();
+		if (text == null || (text != null && text.trim().equals(""))) //$NON-NLS-1$
+			isEmpty = true;
+		return isEmpty;
+	}
+
+	/**
+	 * @return ICompletionProposal
+	 */
+	private ICompletionProposal getHTMLTagProposal(ITextViewer viewer, int documentPosition) {
+		IModelManager mm = StructuredModelManager.getModelManager();
+		IStructuredModel model = null;
+		ICompletionProposal result = null;
+		try {
+			if (mm != null) {
+				model = mm.getExistingModelForRead(viewer.getDocument());
+
+				if (model != null) {
+					IDOMDocument doc = ((IDOMModel) model).getDocument();
+
+					ModelQuery mq = ModelQueryUtil.getModelQuery(doc);
+					if (mq != null) {
+
+						// XHTML requires lowercase tagname for lookup
+						CMDocument correspondingCMDocument = mq.getCorrespondingCMDocument(doc);
+						if (correspondingCMDocument != null) {
+							CMElementDeclaration htmlDecl = (CMElementDeclaration) correspondingCMDocument.getElements().getNamedItem(HTML40Namespace.ElementName.HTML.toLowerCase());
+							if (htmlDecl != null) {
+								StringBuffer proposedTextBuffer = new StringBuffer();
+								getContentGenerator().generateTag(doc, htmlDecl, proposedTextBuffer);
+
+								String proposedText = proposedTextBuffer.toString();
+								String requiredName = getContentGenerator().getRequiredName(doc, htmlDecl);
+
+								CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, documentPosition,
+								/* start pos */
+								0, /* replace length */
+								requiredName.length() + 2, /*
+															 * cursor position
+															 * after
+															 * (relavtive to
+															 * start)
+															 */
+								HTMLEditorPluginImageHelper.getInstance().getImage(HTMLEditorPluginImages.IMG_OBJ_TAG_GENERIC), requiredName, null, null, XMLRelevanceConstants.R_TAG_NAME);
+								result = proposal;
+							}
+						}
+					}
+				}
+			}
+		}
+		finally {
+			if (model != null)
+				model.releaseFromRead();
+		}
+		return result;
+	}
+
+	/**
+	 * @see AbstractContentAssistProcessor#getContentGenerator()
+	 */
+	public XMLContentModelGenerator getContentGenerator() {
+		if (fGenerator == null) {
+			if (isXHTML)
+				fGenerator = XHTMLMinimalContentModelGenerator.getInstance();
+			else
+				fGenerator = HTMLMinimalContentModelGenerator.getInstance();
+		}
+		return fGenerator;
+	}
+
+	protected ICompletionProposal[] getCSSProposals(ITextViewer viewer, int pos, IDOMNode element, int offset, char quote) {
+
+		CSSContentAssistProcessor cssProcessor = new CSSContentAssistProcessor();
+		cssProcessor.setDocumentOffset(offset);
+		cssProcessor.setQuoteCharOfStyleAttribute(quote);
+
+		return cssProcessor.computeCompletionProposals(viewer, pos);
+	}
+
+	protected String getEmptyTagCloseString() {
+		if (isXHTML)
+			return " />"; //$NON-NLS-1$
+		return ">"; //$NON-NLS-1$
+	}
+	
+	private IContentAssistProcessor getJSContentAssistProcessor() {
+		if (fJSContentAssistProcessor == null) {
+			fJSContentAssistProcessor = new StructuredTextViewerConfigurationHTML().getContentAssistant(null).getContentAssistProcessor(IHTMLPartitions.SCRIPT);
+		}
+		return fJSContentAssistProcessor;
+	}
+
+	private HTMLTemplateCompletionProcessor getTemplateCompletionProcessor() {
+		if (fTemplateProcessor == null) {
+			fTemplateProcessor = new HTMLTemplateCompletionProcessor();
+		}
+		return fTemplateProcessor;
+	}
+
+	/**
+	 * Determine if this Document is an XHTML Document. Oprates solely off of
+	 * the Document Type declaration
+	 */
+	protected boolean getXHTML(Node node) {
+		if (node == null)
+			return false;
+
+		Document doc = null;
+		if (node.getNodeType() != Node.DOCUMENT_NODE)
+			doc = node.getOwnerDocument();
+		else
+			doc = ((Document) node);
+
+		if (doc instanceof IDOMDocument)
+			return ((IDOMDocument) doc).isXMLType();
+
+
+		if (doc instanceof INodeNotifier) {
+			ModelQueryAdapter adapter = (ModelQueryAdapter) ((INodeNotifier) doc).getAdapterFor(ModelQueryAdapter.class);
+			CMDocument cmdoc = null;
+			if (adapter != null && adapter.getModelQuery() != null)
+				cmdoc = adapter.getModelQuery().getCorrespondingCMDocument(doc);
+			if (cmdoc != null) {
+				// treat as XHTML unless we've got the in-code HTML content
+				// model
+				if (cmdoc instanceof HTMLCMDocument)
+					return false;
+				if (cmdoc.supports(HTMLCMProperties.IS_XHTML))
+					return Boolean.TRUE.equals(cmdoc.getProperty(HTMLCMProperties.IS_XHTML));
+			}
+		}
+		// this should never be reached
+		DocumentType docType = doc.getDoctype();
+		return docType != null && docType.getPublicId() != null && docType.getPublicId().indexOf("-//W3C//DTD XHTML ") == 0; //$NON-NLS-1$
+	}
+
+	protected void init() {
+		getPreferenceStore().addPropertyChangeListener(this);
+		reinit();
+	}
+
+	protected void reinit() {
+		String key = HTMLUIPreferenceNames.AUTO_PROPOSE;
+		boolean doAuto = getPreferenceStore().getBoolean(key);
+		if (doAuto) {
+			key = HTMLUIPreferenceNames.AUTO_PROPOSE_CODE;
+			completionProposalAutoActivationCharacters = getPreferenceStore().getString(key).toCharArray();
+		}
+		else {
+			completionProposalAutoActivationCharacters = null;
+		}
+	}
+
+	public void release() {
+		if (factoryForCSS != null) {
+			factoryForCSS.release();
+		}
+		if (fJSContentAssistProcessor instanceof IReleasable) {
+			((IReleasable)fJSContentAssistProcessor).release();
+		}
+		getPreferenceStore().removePropertyChangeListener(this);
+		super.release();
+	}
+
+	protected boolean stringsEqual(String a, String b) {
+		return a.equalsIgnoreCase(b);
+	}
+
+	public void propertyChange(PropertyChangeEvent event) {
+		String property = event.getProperty();
+
+		if (property.compareTo(HTMLUIPreferenceNames.AUTO_PROPOSE) == 0 || property.compareTo(HTMLUIPreferenceNames.AUTO_PROPOSE_CODE) == 0) {
+			reinit();
+		}
+	}
+
+	protected IPreferenceStore getPreferenceStore() {
+		if (fPreferenceStore == null)
+			fPreferenceStore = HTMLUIPlugin.getDefault().getPreferenceStore();
+
+		return fPreferenceStore;
+	}
+
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentPosition, IndexedRegion indexedNode, ITextRegion region) {
+		return computeCompletionProposals(viewer, documentPosition);
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLMinimalContentModelGenerator.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLMinimalContentModelGenerator.java
new file mode 100644
index 0000000..0bdd85f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLMinimalContentModelGenerator.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLContentModelGenerator;
+import org.w3c.dom.Node;
+
+public class HTMLMinimalContentModelGenerator extends XMLContentModelGenerator {
+
+	private static HTMLMinimalContentModelGenerator instance = null;
+	protected int fTagCase;
+	protected int fAttrCase;
+
+	/**
+	 * HTMLMinimalContentModelGenerator constructor comment.
+	 */
+	private HTMLMinimalContentModelGenerator() {
+		super();
+	}
+
+	private void init() {
+		String qualifier = HTMLCorePlugin.getDefault().getBundle().getSymbolicName();
+		fTagCase = Platform.getPreferencesService().getInt(qualifier, HTMLCorePreferenceNames.TAG_NAME_CASE, 0, null);
+		fAttrCase = Platform.getPreferencesService().getInt(qualifier, HTMLCorePreferenceNames.ATTR_NAME_CASE, 0, null);
+	}
+
+	protected void generateEndTag(String tagName, Node parentNode, CMElementDeclaration elementDecl, StringBuffer buffer) {
+		if (elementDecl == null)
+			return;
+		if (elementDecl instanceof HTMLElementDeclaration) {
+			if (((Boolean) elementDecl.getProperty(HTMLCMProperties.IS_JSP)).booleanValue()) {
+				if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
+					return;
+			}
+			else {
+				String ommission = (String) elementDecl.getProperty(HTMLCMProperties.OMIT_TYPE);
+				if (ommission.equals(HTMLCMProperties.Values.OMIT_END) || ommission.equals(HTMLCMProperties.Values.OMIT_END_DEFAULT) || ommission.equals(HTMLCMProperties.Values.OMIT_END_MUST)) {
+					return;
+				}
+			}
+		}
+
+		if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
+			return;
+		buffer.append("</" + tagName + ">"); //$NON-NLS-2$//$NON-NLS-1$
+		return;
+	}
+
+	private boolean shouldIgnoreCase(CMNode cmnode) {
+		if (!cmnode.supports(HTMLCMProperties.SHOULD_IGNORE_CASE))
+			return false;
+		return ((Boolean) cmnode.getProperty(HTMLCMProperties.SHOULD_IGNORE_CASE)).booleanValue();
+	}
+
+	public String getRequiredName(Node ownerNode, CMNode cmnode) {
+		String name = super.getRequiredName(ownerNode, cmnode);
+		// don't change the case unless we're certain it is meaningless
+		if (shouldIgnoreCase(cmnode)) {
+			int caseVal = -1;
+			if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION)
+				caseVal = fTagCase;
+			else if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION)
+				caseVal = fAttrCase;
+			switch (caseVal) {
+				case HTMLCorePreferenceNames.LOWER :
+					{
+						name = name.toLowerCase();
+					}
+					break;
+				case HTMLCorePreferenceNames.UPPER :
+					{
+						name = name.toUpperCase();
+					}
+					break;
+			}
+		}
+		return name;
+	}
+
+	public String getStartTagClose(Node parentNode, CMElementDeclaration elementDecl) {
+		String other = getOtherClose(parentNode);
+		if (other != null)
+			return other;
+		if (elementDecl == null)
+			return ">"; //$NON-NLS-1$
+		if (elementDecl instanceof HTMLElementDeclaration) {
+			if (((Boolean) elementDecl.getProperty(HTMLCMProperties.IS_JSP)).booleanValue()) {
+				if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
+					return "/>"; //$NON-NLS-1$
+			}
+			else {
+				String ommission = (String) elementDecl.getProperty(HTMLCMProperties.OMIT_TYPE);
+				if (ommission.equals(HTMLCMProperties.Values.OMIT_END) || ommission.equals(HTMLCMProperties.Values.OMIT_END_DEFAULT) || ommission.equals(HTMLCMProperties.Values.OMIT_END_MUST)) {
+					return ">"; //$NON-NLS-1$
+				}
+			}
+		}
+		
+		//if not an html element and empty, assume start tag needs to be closed
+		else if (elementDecl.getContentType() == CMElementDeclaration.EMPTY) {
+			return "/>"; //$NON-NLS-1$
+		}
+
+		return ">"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Gets the instance.
+	 * @return Returns a HTMLMinimalContentModelGenerator
+	 */
+	public synchronized static HTMLMinimalContentModelGenerator getInstance() {
+		if (instance == null)
+			instance = new HTMLMinimalContentModelGenerator();
+		instance.init();
+		return instance;
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLStructuredContentAssistProcessor.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLStructuredContentAssistProcessor.java
new file mode 100644
index 0000000..994c111
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLStructuredContentAssistProcessor.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+import org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor;
+import org.eclipse.wst.xml.ui.internal.contentassist.AttributeContextInformationPresenter;
+
+/**
+ * <p>Implementation of {@link StructuredContentAssistProcessor} for HTML documents</p>
+ * 
+ * <p>This implementation will react to user preference changes for auto activation
+ * characters for HTML pages</p>
+ */
+public class HTMLStructuredContentAssistProcessor extends StructuredContentAssistProcessor {
+	/** the auto activation characters for this processor, set by user preference */
+	private char[] fCompletionProposalAutoActivationCharacters;
+
+	/** the context information validator for this processor */
+	private IContextInformationValidator fContextInformationValidator;
+	
+	/**
+	 * <p>Constructor</p>
+	 * 
+	 * @param assistant {@link ContentAssistant} to use
+	 * @param partitionTypeID the partition type this processor is for
+	 * @param viewer {@link ITextViewer} this processor is acting in
+	 */
+	public HTMLStructuredContentAssistProcessor(ContentAssistant assistant,
+			String partitionTypeID, ITextViewer viewer) {
+		
+		super(assistant, partitionTypeID, viewer, HTMLUIPlugin.getDefault().getPreferenceStore());
+		getAutoActivationCharacterPreferences();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#getContextInformationValidator()
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		if (this.fContextInformationValidator == null) {
+			this.fContextInformationValidator = new AttributeContextInformationPresenter();
+		}
+		return this.fContextInformationValidator;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return super.getCompletionProposalAutoActivationCharacters() != null ? super.getCompletionProposalAutoActivationCharacters() : this.fCompletionProposalAutoActivationCharacters;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#propertyChange(
+	 * 	org.eclipse.jface.util.PropertyChangeEvent)
+	 */
+	public void propertyChange(PropertyChangeEvent event) {
+		if(event.getProperty().equals(HTMLUIPreferenceNames.AUTO_PROPOSE) ||
+				event.getProperty().equals(HTMLUIPreferenceNames.AUTO_PROPOSE_CODE)) {
+			getAutoActivationCharacterPreferences();
+		}
+	}
+	
+	/**
+	 * <p>Gets the auto activation character user preferences and stores them for later use</p>
+	 */
+	private void getAutoActivationCharacterPreferences() {
+		String key = HTMLUIPreferenceNames.AUTO_PROPOSE;
+		boolean doAuto = getPreferenceStore().getBoolean(key);
+		if (doAuto) {
+			key = HTMLUIPreferenceNames.AUTO_PROPOSE_CODE;
+			this.fCompletionProposalAutoActivationCharacters = getPreferenceStore().getString(key).toCharArray();
+		}
+		else {
+			this.fCompletionProposalAutoActivationCharacters = null;
+		}
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTagsCompletionProposalComputer.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTagsCompletionProposalComputer.java
new file mode 100644
index 0000000..3265f58
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTagsCompletionProposalComputer.java
@@ -0,0 +1,338 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLPropertyDeclaration;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry;
+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImageHelper;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImages;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMElementDeclarationImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
+import org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLModelQueryCompletionProposalComputer;
+import org.eclipse.wst.xml.ui.internal.contentassist.AttributeContextInformationPresenter;
+import org.eclipse.wst.xml.ui.internal.contentassist.AttributeContextInformationProvider;
+import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLContentModelGenerator;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLRelevanceConstants;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Node;
+
+/**
+ * <p>{@link AbstractXMLModelQueryCompletionProposalComputer} for HTML tag proposals</p>
+ */
+public class HTMLTagsCompletionProposalComputer extends
+		AbstractXMLModelQueryCompletionProposalComputer {
+	
+	/** <code>true</code> if the document the proposal request is on is XHTML */
+	protected boolean isXHTML = false;
+	
+	/** the context information validator for this computer */
+	private IContextInformationValidator fContextInformationValidator;
+	
+	/**
+	 * <p>Default constructor</p>
+	 */
+	public HTMLTagsCompletionProposalComputer() {
+		this.fContextInformationValidator = null;
+	}
+	
+	/**
+	 * <p>Determine if the document is XHTML or not, then compute the proposals</p>
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#computeCompletionProposals(org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public List computeCompletionProposals(
+			CompletionProposalInvocationContext context,
+			IProgressMonitor monitor) {
+		
+		//determine if the content is XHTML or not
+		IndexedRegion treeNode = ContentAssistUtils.getNodeAt(context.getViewer(),
+				context.getInvocationOffset());
+		IDOMNode node = (IDOMNode) treeNode;
+		boolean isXHTMLNode = isXHTMLNode(node);
+		if(this.isXHTML != isXHTMLNode) {
+			this.isXHTML = isXHTMLNode;
+		}
+		
+		//compute the completion proposals
+		return super.computeCompletionProposals(context, monitor);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#computeContextInformation(org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public List computeContextInformation(
+			CompletionProposalInvocationContext context,
+			IProgressMonitor monitor) {
+		
+		AttributeContextInformationProvider attributeInfoProvider =
+			new AttributeContextInformationProvider((IStructuredDocument)context.getDocument(),
+					(AttributeContextInformationPresenter) getContextInformationValidator());
+		return Arrays.asList(attributeInfoProvider.getAttributeInformation(context.getInvocationOffset()));
+	}
+	
+	/**
+	 * <p>Dependent on if the document is XHTML or not</p>
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLModelQueryCompletionProposalComputer#getContentGenerator()
+	 */
+	protected XMLContentModelGenerator getContentGenerator() {
+		if (isXHTML) {
+			return XHTMLMinimalContentModelGenerator.getInstance();
+		} else {
+			return HTMLMinimalContentModelGenerator.getInstance();
+		}
+	}
+	
+	/**
+	 * <p>Filter out all {@link CMNode}s except those specific to HTML documents</p>
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLModelQueryCompletionProposalComputer#validModelQueryNode(org.eclipse.wst.xml.core.internal.contentmodel.CMNode)
+	 */
+	protected boolean validModelQueryNode(CMNode node) {
+		boolean isValid = false;
+		Object cmdoc = node.getProperty("CMDocument"); //$NON-NLS-1$
+		if (cmdoc instanceof CMNode) {
+			String name = ((CMNode) cmdoc).getNodeName();
+			isValid = name != null && name.endsWith(".dtd") && name.indexOf("html") != -1; //$NON-NLS-1$ //$NON-NLS-2$
+		} else if (node.supports(HTMLAttributeDeclaration.IS_HTML)) {
+			Boolean isHTML = (Boolean) node.getProperty(HTMLAttributeDeclaration.IS_HTML);
+			isValid = isHTML == null || isHTML.booleanValue();
+		} else if(node instanceof HTMLPropertyDeclaration) {
+			HTMLPropertyDeclaration propDec = (HTMLPropertyDeclaration)node;
+			isValid = !propDec.isJSP();
+		} else if (node instanceof CMAttributeDeclaration || node instanceof CMElementDeclarationImpl) {
+			isValid = true;
+		} else if(node instanceof CMElementDeclaration) {
+			Boolean isXHTML = ((Boolean)node.getProperty(HTMLCMProperties.IS_XHTML));
+			isValid = isXHTML != null && isXHTML.booleanValue();
+		}
+
+		// Do not propose obsolete tags, regardless
+		if (isValid && node.supports(HTMLCMProperties.IS_OBSOLETE)) {
+			Boolean isObsolete = ((Boolean) node.getProperty(HTMLCMProperties.IS_OBSOLETE));
+			isValid = !(isObsolete != null && isObsolete.booleanValue());
+		}
+
+		return isValid;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLModelQueryCompletionProposalComputer#addEmptyDocumentProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEmptyDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		addHTMLTagProposal(contentAssistRequest, context);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLModelQueryCompletionProposalComputer#addStartDocumentProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addStartDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		//determine if XMLPI is first element
+		Node aNode = contentAssistRequest.getNode();
+		Document owningDocument = aNode.getOwnerDocument();
+		Node first = owningDocument.getFirstChild();
+		boolean xmlpiIsFirstElement = ((first != null) && (first.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE));
+		
+		//if there is an XMLPI then XHTML doctype, else HTML doctype
+		if (xmlpiIsFirstElement && (owningDocument.getDoctype() == null) &&
+				isCursorAfterXMLPI(contentAssistRequest)) {
+			
+			addDocTypeProposal(contentAssistRequest, true);
+		} else {
+			addDocTypeProposal(contentAssistRequest,  false);
+		}
+	}
+	
+	/**
+	 * 
+	 * @param contentAssistRequest
+	 * @param isXHTML
+	 */
+	private void addDocTypeProposal(ContentAssistRequest contentAssistRequest, boolean isXHTML) {
+		// if a DocumentElement exists, use that for the root Element name
+		String rootname = "unspecified"; //$NON-NLS-1$
+		if (contentAssistRequest.getNode().getOwnerDocument().getDocumentElement() != null) {
+			rootname = contentAssistRequest.getNode().getOwnerDocument().getDocumentElement().getNodeName();
+		}
+		
+		//decide which entry to use
+		HTMLDocumentTypeEntry entry;
+		if(isXHTML) {
+			entry = HTMLDocumentTypeRegistry.getInstance().getXHTMLDefaultEntry();
+		} else {
+			entry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry();
+		}
+
+		//create the content assist string and proposal
+		String proposedText = "<!DOCTYPE " + rootname + " PUBLIC \"" + //$NON-NLS-1$ //$NON-NLS-2$
+				entry.getPublicId() + "\" \"" + entry.getSystemId() + "\">"; //$NON-NLS-1$ //$NON-NLS-2$
+		ICompletionProposal proposal = new CustomCompletionProposal(
+				proposedText, contentAssistRequest.getReplacementBeginPosition(),
+				contentAssistRequest.getReplacementLength(), 10,
+				XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DOCTYPE),
+				entry.getDisplayName() + " " + HTMLUIMessages.Expandable_label_document_type, //$NON-NLS-1$ 
+				null, null, XMLRelevanceConstants.R_DOCTYPE);
+		contentAssistRequest.addProposal(proposal);
+	}
+	
+	/**
+	 * <p>adds HTML tag proposal for empty document</p>
+	 * 
+	 * @param contentAssistRequest request to add proposal too
+	 * @param context context of the completion request
+	 */
+	private void addHTMLTagProposal(ContentAssistRequest contentAssistRequest, CompletionProposalInvocationContext context) {
+		IStructuredModel model = null;
+		try {
+			if(context.getDocument() instanceof IStructuredDocument) {
+				model = StructuredModelManager.getModelManager().getModelForRead((IStructuredDocument)context.getDocument());
+			}
+			if (model != null) {
+				IDOMDocument doc = ((IDOMModel) model).getDocument();
+
+				ModelQuery mq = ModelQueryUtil.getModelQuery(doc);
+				if (mq != null) {
+
+					// XHTML requires lowercase tagname for lookup
+					CMDocument correspondingCMDocument = mq.getCorrespondingCMDocument(doc);
+					if (correspondingCMDocument != null) {
+						CMElementDeclaration htmlDecl = (CMElementDeclaration) correspondingCMDocument.getElements().getNamedItem(HTML40Namespace.ElementName.HTML.toLowerCase());
+						if (htmlDecl != null) {
+							StringBuffer proposedTextBuffer = new StringBuffer();
+							getContentGenerator().generateTag(doc, htmlDecl, proposedTextBuffer);
+
+							String proposedText = proposedTextBuffer.toString();
+							String requiredName = getContentGenerator().getRequiredName(doc, htmlDecl);
+							
+							IStructuredDocumentRegion region = contentAssistRequest.getDocumentRegion();
+							if (region != null) {
+								if (region.getFirstRegion() != null && 
+										region.getFirstRegion().getType().equals(DOMRegionContext.XML_TAG_OPEN)) {
+									//in order to differentiate between content assist on 
+									//completely empty document and the one with xml open tag
+									proposedText = proposedText.substring(1);
+								}
+							}
+							if (!beginsWith(proposedText, contentAssistRequest.getMatchString())) {
+								return;
+							}
+							int cursorAdjustment = getCursorPositionForProposedText(proposedText);
+							CustomCompletionProposal proposal = new CustomCompletionProposal(
+									proposedText, contentAssistRequest.getReplacementBeginPosition(),
+									contentAssistRequest.getReplacementLength(), cursorAdjustment, 
+									HTMLEditorPluginImageHelper.getInstance().getImage(HTMLEditorPluginImages.IMG_OBJ_TAG_GENERIC),
+									requiredName, null, null, XMLRelevanceConstants.R_TAG_NAME);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+			}
+		}
+		finally {
+			if (model != null)
+				model.releaseFromRead();
+		}
+	}
+	
+	/**
+	 * Determine if this Document is an XHTML Document. Operates solely off of
+	 * the Document Type declaration
+	 */
+	private static boolean isXHTMLNode(Node node) {
+		if (node == null) {
+			return false;
+		}
+
+		Document doc = null;
+		if (node.getNodeType() != Node.DOCUMENT_NODE)
+			doc = node.getOwnerDocument();
+		else
+			doc = ((Document) node);
+
+		if (doc instanceof IDOMDocument) {
+			return ((IDOMDocument) doc).isXMLType();
+		}
+
+		if (doc instanceof INodeNotifier) {
+			ModelQueryAdapter adapter = (ModelQueryAdapter) ((INodeNotifier) doc).getAdapterFor(ModelQueryAdapter.class);
+			CMDocument cmdoc = null;
+			if (adapter != null && adapter.getModelQuery() != null)
+				cmdoc = adapter.getModelQuery().getCorrespondingCMDocument(doc);
+			if (cmdoc != null) {
+				// treat as XHTML unless we've got the in-code HTML content
+				// model
+				if (cmdoc instanceof HTMLCMDocument)
+					return false;
+				if (cmdoc.supports(HTMLCMProperties.IS_XHTML))
+					return Boolean.TRUE.equals(cmdoc.getProperty(HTMLCMProperties.IS_XHTML));
+			}
+		}
+		// this should never be reached
+		DocumentType docType = doc.getDoctype();
+		return docType != null && docType.getPublicId() != null && docType.getPublicId().indexOf("-//W3C//DTD XHTML ") == 0; //$NON-NLS-1$
+	}
+	
+	/**
+	 * Returns a validator used to determine when displayed context
+	 * information should be dismissed. May only return <code>null</code> if
+	 * the processor is incapable of computing context information.
+	 * 
+	 * a context information validator, or <code>null</code> if the
+	 * processor is incapable of computing context information
+	 */
+	private IContextInformationValidator getContextInformationValidator() {
+		if (fContextInformationValidator == null) {
+			fContextInformationValidator = new AttributeContextInformationPresenter();
+		}
+		return fContextInformationValidator;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTemplateCompletionProcessor.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTemplateCompletionProcessor.java
new file mode 100644
index 0000000..25d9a43
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTemplateCompletionProcessor.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateProposal;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImageHelper;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImages;
+
+
+/**
+ * <p>Completion computer for HTML templates</p>
+ */
+public class HTMLTemplateCompletionProcessor extends TemplateCompletionProcessor {
+	private static final class ProposalComparator implements Comparator {
+		public int compare(Object o1, Object o2) {
+			return ((TemplateProposal) o2).getRelevance() - ((TemplateProposal) o1).getRelevance();
+		}
+	}
+
+	private static final Comparator fgProposalComparator = new ProposalComparator();
+	private String fContextTypeId = null;
+
+	/*
+	 * Copied from super class except instead of calling createContext(viewer,
+	 * region) call createContext(viewer, region, offset) instead
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+
+		ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+
+		// adjust offset to end of normalized selection
+		if (selection.getOffset() == offset)
+			offset = selection.getOffset() + selection.getLength();
+
+		String prefix = extractPrefix(viewer, offset);
+		Region region = new Region(offset - prefix.length(), prefix.length());
+		TemplateContext context = createContext(viewer, region, offset);
+		if (context == null)
+			return new ICompletionProposal[0];
+		// name of the selection variables {line, word}_selection
+		context.setVariable("selection", selection.getText()); //$NON-NLS-1$
+
+		Template[] templates = getTemplates(context.getContextType().getId());
+
+		List matches = new ArrayList();
+		for (int i = 0; i < templates.length; i++) {
+			Template template = templates[i];
+			try {
+				context.getContextType().validate(template.getPattern());
+			}
+			catch (TemplateException e) {
+				continue;
+			}
+			if (template.matches(prefix, context.getContextType().getId()))
+				matches.add(createProposal(template, context, (IRegion) region, getRelevance(template, prefix)));
+		}
+
+		Collections.sort(matches, fgProposalComparator);
+
+		return (ICompletionProposal[]) matches.toArray(new ICompletionProposal[matches.size()]);
+	}
+
+	/**
+	 * Creates a concrete template context for the given region in the
+	 * document. This involves finding out which context type is valid at the
+	 * given location, and then creating a context of this type. The default
+	 * implementation returns a <code>SmartReplaceTemplateContext</code> for
+	 * the context type at the given location. This takes the offset at which
+	 * content assist was invoked into consideration.
+	 * 
+	 * @param viewer
+	 *            the viewer for which the context is created
+	 * @param region
+	 *            the region into <code>document</code> for which the
+	 *            context is created
+	 * @param offset
+	 *            the original offset where content assist was invoked
+	 * @return a template context that can handle template insertion at the
+	 *         given location, or <code>null</code>
+	 */
+	private TemplateContext createContext(ITextViewer viewer, IRegion region, int offset) {
+		// pretty much same code as super.createContext except create
+		// SmartReplaceTemplateContext
+		TemplateContextType contextType = getContextType(viewer, region);
+		if (contextType != null) {
+			IDocument document = viewer.getDocument();
+			return new ReplaceNameTemplateContext(contextType, document, region.getOffset(), region.getLength(), offset);
+		}
+		return null;
+	}
+
+	protected ICompletionProposal createProposal(Template template, TemplateContext context, IRegion region, int relevance) {
+		return new CustomTemplateProposal(template, context, region, getImage(template), relevance);
+	}
+
+	protected TemplateContextType getContextType(ITextViewer viewer, IRegion region) {
+		TemplateContextType type = null;
+
+		ContextTypeRegistry registry = getTemplateContextRegistry();
+		if (registry != null)
+			type = registry.getContextType(fContextTypeId);
+
+		return type;
+	}
+
+	protected Image getImage(Template template) {
+		// just return the same image for now
+		return HTMLEditorPluginImageHelper.getInstance().getImage(HTMLEditorPluginImages.IMG_OBJ_TAG_TEMPLATE);
+	}
+
+	private ContextTypeRegistry getTemplateContextRegistry() {
+		return HTMLUIPlugin.getDefault().getTemplateContextRegistry();
+	}
+
+	protected Template[] getTemplates(String contextTypeId) {
+		Template templates[] = null;
+
+		TemplateStore store = getTemplateStore();
+		if (store != null)
+			templates = store.getTemplates(contextTypeId);
+
+		return templates;
+	}
+
+	private TemplateStore getTemplateStore() {
+		return HTMLUIPlugin.getDefault().getTemplateStore();
+	}
+
+	public void setContextType(String contextTypeId) {
+		fContextTypeId = contextTypeId;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTemplatesCompletionProposalComputer.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTemplatesCompletionProposalComputer.java
new file mode 100644
index 0000000..2fe72d1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/HTMLTemplatesCompletionProposalComputer.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeIdsHTML;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest;
+import org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer;
+
+/**
+ * <p>XML type proposal computer to create HTML template proposals</p>
+ */
+public class HTMLTemplatesCompletionProposalComputer extends
+		DefaultXMLCompletionProposalComputer {
+
+	/** template processor used to create template proposals */
+	private HTMLTemplateCompletionProcessor fTemplateProcessor = null;
+
+	/**
+	 * <p>Create the computer</p>
+	 */
+	public HTMLTemplatesCompletionProposalComputer() {
+		fTemplateProcessor = new HTMLTemplateCompletionProcessor();
+	}
+
+	/**
+	 * <p>Calls super to add templates based on context and then
+	 * adds templates not specific to a context</p>
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#computeCompletionProposals(org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public List computeCompletionProposals(
+			CompletionProposalInvocationContext context,
+			IProgressMonitor monitor) {
+		
+		//get the templates specific to the context
+		List proposals = new ArrayList(super.computeCompletionProposals(context, monitor));
+		
+		//get templates not specific to the context
+		proposals.addAll(this.getTemplateProposals(TemplateContextTypeIdsHTML.ALL, context));
+		
+		return proposals;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addAttributeNameProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addAttributeNameProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.ATTRIBUTE, context);
+	}
+
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addAttributeValueProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addAttributeValueProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.ATTRIBUTE_VALUE, context);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addEmptyDocumentProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEmptyDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.NEW, context);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addTagInsertionProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, int, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addTagInsertionProposals(
+			ContentAssistRequest contentAssistRequest, int childPosition,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsHTML.TAG, context);
+	}
+	
+	/**
+	 * <p>Get the template proposals from the template processor</p>
+	 * 
+	 * @param templateContext
+	 * @param context
+	 * @return
+	 */
+	private List getTemplateProposals(String templateContext,
+			CompletionProposalInvocationContext context) {
+		
+		List templateProposals = new ArrayList();
+		
+		if (fTemplateProcessor != null) {
+			fTemplateProcessor.setContextType(templateContext);
+			ICompletionProposal[] proposals =
+				fTemplateProcessor.computeCompletionProposals(context.getViewer(), context.getInvocationOffset());
+		
+			templateProposals.addAll(Arrays.asList(proposals));
+		}
+		
+		return templateProposals;
+	}
+	
+	/**
+	 * Adds templates to the list of proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param templateContext
+	 * @param context
+	 */
+	private void addTemplates(ContentAssistRequest contentAssistRequest, String templateContext,
+			CompletionProposalInvocationContext context) {
+		
+		if (contentAssistRequest != null) {
+			boolean useProposalList = !contentAssistRequest.shouldSeparate();
+			List proposals = this.getTemplateProposals(templateContext, context);
+	
+			for (int i = 0; i < proposals.size(); ++i) {
+				if (useProposalList) {
+					contentAssistRequest.addProposal((ICompletionProposal)proposals.get(i));
+				}
+				else {
+					contentAssistRequest.addMacro((ICompletionProposal)proposals.get(i));
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/NoRegionContentAssistProcessorForHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/NoRegionContentAssistProcessorForHTML.java
new file mode 100644
index 0000000..748a54d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/NoRegionContentAssistProcessorForHTML.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.wst.css.core.text.ICSSPartitions;
+import org.eclipse.wst.css.ui.internal.contentassist.CSSContentAssistProcessor;
+import org.eclipse.wst.html.core.text.IHTMLPartitions;
+import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
+import org.eclipse.wst.xml.ui.internal.contentassist.NoRegionContentAssistProcessor;
+
+/**
+ * 
+ * @author pavery
+ */
+public class NoRegionContentAssistProcessorForHTML extends NoRegionContentAssistProcessor {
+	protected void initPartitionToProcessorMap() {
+		
+		super.initPartitionToProcessorMap();
+		IContentAssistProcessor htmlProcessor = new HTMLContentAssistProcessor();
+		addPartitionProcessor(IHTMLPartitions.HTML_DEFAULT, htmlProcessor);
+		addPartitionProcessor(IHTMLPartitions.HTML_COMMENT, htmlProcessor);
+
+		IContentAssistProcessor jsContentAssistProcessor = new StructuredTextViewerConfigurationHTML().getContentAssistant(null).getContentAssistProcessor(IHTMLPartitions.SCRIPT);
+		addPartitionProcessor(IHTMLPartitions.SCRIPT, jsContentAssistProcessor);
+
+		IContentAssistProcessor cssContentAssistProcessor = new CSSContentAssistProcessor();
+		addPartitionProcessor(ICSSPartitions.STYLE, cssContentAssistProcessor);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/ReplaceNameTemplateContext.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/ReplaceNameTemplateContext.java
new file mode 100644
index 0000000..764a915
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/ReplaceNameTemplateContext.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.templates.DocumentTemplateContext;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateVariable;
+
+/**
+ * Just like DocumentTemplateContext except if an insert offset is passed in,
+ * during evaluation, the "prefix" before the template will be checked to see
+ * if it matches the template name. If so, overwrite the template name.
+ * Otherwise, just insert the template at the insert offset location (by not
+ * overwriting the prefix text)
+ */
+public class ReplaceNameTemplateContext extends DocumentTemplateContext {
+	private int fInsertOffset = -1;
+
+	/**
+	 * Creates a document template context.
+	 * 
+	 * @param type
+	 *            the context type
+	 * @param document
+	 *            the document this context applies to
+	 * @param offset
+	 *            the offset of the document region
+	 * @param length
+	 *            the length of the document region
+	 */
+	public ReplaceNameTemplateContext(TemplateContextType type, IDocument document, int offset, int length) {
+		this(type, document, new Position(offset, length));
+	}
+
+	/**
+	 * Creates a document template context. The supplied <code>Position</code>
+	 * will be queried to compute the <code>getStart</code> and
+	 * <code>getEnd</code> methods, which will therefore answer updated
+	 * position data if it is registered with the document.
+	 * 
+	 * @param type
+	 *            the context type
+	 * @param document
+	 *            the document this context applies to
+	 * @param position
+	 *            the position describing the area of the document which forms
+	 *            the template context
+	 * @since 3.1
+	 */
+	public ReplaceNameTemplateContext(TemplateContextType type, IDocument document, Position position) {
+		super(type, document, position);
+	}
+
+	/**
+	 * Creates a document template context.
+	 * 
+	 * @param type
+	 *            the context type
+	 * @param document
+	 *            the document this context applies to
+	 * @param offset
+	 *            the offset of the document region
+	 * @param length
+	 *            the length of the document region
+	 * @param insertOffset
+	 *            the offset of the document region where insert was
+	 *            originally requested
+	 */
+	public ReplaceNameTemplateContext(TemplateContextType type, IDocument document, int offset, int length, int insertOffset) {
+		this(type, document, new Position(offset, length));
+		fInsertOffset = insertOffset;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.templates.TemplateContext#evaluate(org.eclipse.jface.text.templates.Template)
+	 */
+	public TemplateBuffer evaluate(Template template) throws BadLocationException, TemplateException {
+		TemplateBuffer buffer = super.evaluate(template);
+		if (buffer != null) {
+			if (fInsertOffset > -1 && fInsertOffset > getStart()) {
+				String prefix = getDocument().get(getStart(), fInsertOffset - getStart());
+				if (!template.getName().startsWith(prefix)) {
+					// generate a new buffer that actually contains the
+					// text that was going to be overwritten
+					int prefixSize = prefix.length();
+					TemplateVariable[] newTemplateVar = buffer.getVariables();
+					for (int i =0; i < newTemplateVar.length; i++ ){
+						int[] offsets = newTemplateVar[i].getOffsets();
+						for (int j=0; j<offsets.length ;j++){
+							offsets[j] += prefixSize;
+						}
+					}
+					buffer = new TemplateBuffer(prefix + buffer.getString(), newTemplateVar);
+				}
+			}
+		}
+		return buffer;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/XHTMLMinimalContentModelGenerator.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/XHTMLMinimalContentModelGenerator.java
new file mode 100644
index 0000000..2a9607e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/XHTMLMinimalContentModelGenerator.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentassist;
+
+
+
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLContentModelGenerator;
+import org.w3c.dom.Node;
+
+public class XHTMLMinimalContentModelGenerator extends XMLContentModelGenerator {
+
+	private static XHTMLMinimalContentModelGenerator instance = null;
+
+	private XHTMLMinimalContentModelGenerator() {
+		super();
+	}
+
+	protected void generateEndTag(String tagName, Node parentNode, CMElementDeclaration elementDecl, StringBuffer buffer) {
+		if (elementDecl == null)
+			return;
+		if (elementDecl instanceof HTMLElementDeclaration) {
+			if (((Boolean) elementDecl.getProperty(HTMLCMProperties.IS_JSP)).booleanValue()) {
+				if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
+					return;
+			}
+			else {
+				String ommission = (String) elementDecl.getProperty(HTMLCMProperties.OMIT_TYPE);
+				if (ommission.equals(HTMLCMProperties.Values.OMIT_END) || ommission.equals(HTMLCMProperties.Values.OMIT_END_DEFAULT) || ommission.equals(HTMLCMProperties.Values.OMIT_END_MUST)) {
+					return;
+				}
+			}
+		}
+
+		if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
+			return;
+		buffer.append("</" + tagName + ">"); //$NON-NLS-2$//$NON-NLS-1$
+		return;
+	}
+
+
+	public String getStartTagClose(Node parentNode, CMElementDeclaration elementDecl) {
+		String other = getOtherClose(parentNode);
+		if (other != null)
+			return other;
+		if (elementDecl == null)
+			return ">"; //$NON-NLS-1$
+		// EMPTY tag, do a self-close
+		if (elementDecl.getContentType() == CMElementDeclaration.EMPTY) {
+			// if it's a JSP element, don't add the space since the JSP container doesn't/shouldn't care
+			if (elementDecl instanceof HTMLElementDeclaration && (((Boolean) elementDecl.getProperty(HTMLCMProperties.IS_JSP)).booleanValue()))
+				// if it's not JSP, conform to XHTML guidelines and add the space
+				return "/>"; //$NON-NLS-1$
+			else
+				return " />"; //$NON-NLS-1$
+		}
+		// not defined as EMPTY, but should be treated as such anyway
+		else if (elementDecl instanceof HTMLElementDeclaration) {
+			String ommission = (String) elementDecl.getProperty(HTMLCMProperties.OMIT_TYPE);
+			if (ommission.equals(HTMLCMProperties.Values.OMIT_END) || ommission.equals(HTMLCMProperties.Values.OMIT_END_DEFAULT) || ommission.equals(HTMLCMProperties.Values.OMIT_END_MUST)) {
+				return " />"; //$NON-NLS-1$
+			}
+		}
+
+		return ">"; //$NON-NLS-1$
+	}
+
+	public synchronized static XHTMLMinimalContentModelGenerator getInstance() {
+		if (instance == null)
+			instance = new XHTMLMinimalContentModelGenerator();
+		return instance;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/HTMLNodeActionManager.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/HTMLNodeActionManager.java
new file mode 100644
index 0000000..b59c954
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/HTMLNodeActionManager.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentoutline;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.wst.html.core.internal.HTMLContentBuilder;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMContentBuilder;
+import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * 
+ */
+public class HTMLNodeActionManager extends XMLNodeActionManager {
+	protected int fTagCase;
+	protected int fAttrCase;
+
+	public HTMLNodeActionManager(IStructuredModel model, Viewer viewer) {
+		super(model, viewer);
+		updateCase();
+	}
+
+	/**
+	 * If neccessary, employ a DOMContentBuilder that understands how to
+	 * change the case of HTML tags (but NOT taglib derived tags).
+	 */
+	public DOMContentBuilder createDOMContentBuilder(Document document) {
+		DOMContentBuilder builder = null;
+		String one = fModel.getModelHandler().getAssociatedContentTypeId();
+		String modelContentTypeId = fModel.getContentTypeIdentifier();
+		if (one != modelContentTypeId) {
+			System.out.println("not equal"); //$NON-NLS-1$
+		}
+		if (modelContentTypeId.equals(ContentTypeIdForHTML.ContentTypeID_HTML))
+			builder = new HTMLContentBuilder(document);
+		else
+			builder = super.createDOMContentBuilder(document);
+
+		return builder;
+	}
+
+	private boolean shouldIgnoreCase(CMNode cmnode) {
+		if (!cmnode.supports(HTMLCMProperties.SHOULD_IGNORE_CASE))
+			return false;
+		return ((Boolean) cmnode.getProperty(HTMLCMProperties.SHOULD_IGNORE_CASE)).booleanValue();
+	}
+
+	/**
+	 * Modify the displayed menuitem label to change the case of HTML children
+	 * but neither XML nor taglib-derived children.
+	 */
+	public String getLabel(Node parent, CMNode cmnode) {
+		String result = null;
+		// CMNode cmnode = action.getCMNode();
+		// don't change the case unless we're certain it is meaningless
+		if (shouldIgnoreCase(cmnode)) {
+			String name = cmnode.getNodeName();
+			if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION) {
+				if (fTagCase == HTMLCorePreferenceNames.LOWER)
+					name = name.toLowerCase();
+				else if (fTagCase == HTMLCorePreferenceNames.UPPER)
+					name = name.toUpperCase();
+				// else do nothing
+			}
+			else if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+				if (fAttrCase == HTMLCorePreferenceNames.LOWER)
+					name = name.toLowerCase();
+				else if (fAttrCase == HTMLCorePreferenceNames.UPPER)
+					name = name.toUpperCase();
+				// else do nothing
+			}
+			result = name;
+		}
+		else {
+			result = super.getLabel(parent, cmnode);
+		}
+
+		return result;
+	}
+
+	/**
+	 * Another HTML specific detail.
+	 */
+	protected void updateCase() {
+		if (fModel != null) {
+			String modelContentTypeId = fModel.getContentTypeIdentifier();
+			if (modelContentTypeId != null) {
+				if (modelContentTypeId.equals(ContentTypeIdForHTML.ContentTypeID_HTML)) {
+					Preferences prefs = HTMLCorePlugin.getDefault().getPluginPreferences(); //$NON-NLS-1$
+					fTagCase = prefs.getInt(HTMLCorePreferenceNames.TAG_NAME_CASE);
+					fAttrCase = prefs.getInt(HTMLCorePreferenceNames.ATTR_NAME_CASE);
+				}
+			}
+		}
+	}
+
+	public void reformat(Node newElement, boolean deep) {
+		try {
+			// tell the model that we are about to make a big model change
+			fModel.aboutToChangeModel();
+
+			// format selected node
+			IStructuredFormatProcessor formatProcessor = new HTMLFormatProcessorImpl();
+			formatProcessor.formatNode(newElement);
+		}
+		finally {
+			// tell the model that we are done with the big model change
+			fModel.changedModel();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/JFaceNodeAdapterFactoryForHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/JFaceNodeAdapterFactoryForHTML.java
new file mode 100644
index 0000000..ea1dddd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/JFaceNodeAdapterFactoryForHTML.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentoutline;
+
+
+
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeAdapterFactory;
+
+/**
+ * An adapter factory to create JFaceNodeAdapters.  Use this
+ * adapter factory with a JFaceAdapterContentProvider to display
+ * DOM nodes in a tree.
+ */
+public class JFaceNodeAdapterFactoryForHTML extends JFaceNodeAdapterFactory {
+
+
+	public JFaceNodeAdapterFactoryForHTML() {
+		this(IJFaceNodeAdapter.class, true);
+	}
+
+	public JFaceNodeAdapterFactoryForHTML(Object adapterKey, boolean registerAdapters) {
+		super(adapterKey, registerAdapters);
+	}
+
+	protected INodeAdapter createAdapter(INodeNotifier node) {
+		if (singletonAdapter == null) {
+			// create the JFaceNodeAdapter
+			singletonAdapter = new JFaceNodeAdapterForHTML(this);
+			initAdapter(singletonAdapter, node);
+		}
+		return singletonAdapter;
+	}
+
+	public INodeAdapterFactory copy() {
+		return new JFaceNodeAdapterFactoryForHTML(getAdapterKey(), isShouldRegisterAdapter());
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/JFaceNodeAdapterForHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/JFaceNodeAdapterForHTML.java
new file mode 100644
index 0000000..1b494c5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentoutline/JFaceNodeAdapterForHTML.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentoutline;
+
+
+
+import java.util.Locale;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImageHelper;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImages;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeAdapter;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeAdapterFactory;
+import org.w3c.dom.Node;
+
+/**
+ * Adapts a DOM node to a JFace viewer.
+ */
+public class JFaceNodeAdapterForHTML extends JFaceNodeAdapter {
+
+	private Image createHTMLImage(String imageResourceName) {
+		return HTMLEditorPluginImageHelper.getInstance().getImage(imageResourceName);
+	}
+
+	/**
+	 * Constructor for JFaceNodeAdapterForHTML.
+	 * 
+	 * @param adapterFactory
+	 */
+	public JFaceNodeAdapterForHTML(JFaceNodeAdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	protected Image createImage(Object object) {
+		Image image = null;
+
+		Node node = (Node) object;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			String lowerName = node.getNodeName().toLowerCase(Locale.US);
+			if (lowerName.equals("table") || lowerName.endsWith(":table")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TABLE);
+			else if (lowerName.equals("a") || lowerName.endsWith(":a")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_ANCHOR);
+			else if (lowerName.equals("body") || lowerName.endsWith(":body")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_BODY);
+			else if (lowerName.equals("button") || lowerName.endsWith(":button")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_BUTTON);
+			else if (lowerName.equals("font") || lowerName.endsWith(":font")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_FONT);
+			else if (lowerName.equals("form") || lowerName.endsWith(":form")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_FORM);
+			else if (lowerName.equals("html") || lowerName.endsWith(":html")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_HTML);
+			else if (lowerName.equals("img") || lowerName.endsWith(":img")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_IMAGE);
+			else if (lowerName.equals("map") || lowerName.endsWith(":map")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_IMAGE_MAP);
+			else if (lowerName.equals("title") || lowerName.endsWith(":title")) //$NON-NLS-1$
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG_TITLE);
+			else
+				image = createHTMLImage(HTMLEditorPluginImages.IMG_OBJ_TAG);
+		}
+		if (image == null) {
+			image = super.createImage(node);
+		}
+		return image;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/AbstractDeviceProfileEntry.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/AbstractDeviceProfileEntry.java
new file mode 100644
index 0000000..b123df9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/AbstractDeviceProfileEntry.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+/**
+ * @deprecated Not needed. See BUG118359
+ */
+public class AbstractDeviceProfileEntry implements DeviceProfileEntry {
+
+	public AbstractDeviceProfileEntry() {
+		super();
+	}
+
+	public String getEntryId() {
+		return null;
+	}
+
+	public String getEntryName() {
+		return null;
+	}
+
+	public void release() {
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/AbstractDeviceProfileEntryProvider.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/AbstractDeviceProfileEntryProvider.java
new file mode 100644
index 0000000..664084c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/AbstractDeviceProfileEntryProvider.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import java.util.Iterator;
+
+/**
+ * @deprecated Not needed.  See BUG118359
+ */
+public class AbstractDeviceProfileEntryProvider implements
+		DeviceProfileEntryProvider {
+
+	public AbstractDeviceProfileEntryProvider() {
+		super();
+	}
+
+	public Iterator getDeviceProfileEntries() {
+		return null;
+	}
+
+	public void release() {
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ContentSettingsRegistry.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ContentSettingsRegistry.java
new file mode 100644
index 0000000..75b272d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ContentSettingsRegistry.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+
+import org.eclipse.wst.css.core.internal.metamodel.CSSProfile;
+import org.eclipse.wst.css.core.internal.metamodel.CSSProfileRegistry;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.sse.core.internal.encoding.CommonCharsetNames;
+import org.eclipse.wst.sse.ui.internal.contentproperties.ui.ComboList;
+
+/**
+ * @deprecated This class only contains helper methods that you should
+ *             actually implement yourself.
+ */
+public final class ContentSettingsRegistry {
+
+	private static final String NONE = HTMLUIMessages.UI_none;
+
+	public static String maxLengthStringInHTMLDocumentTypeRegistry = ""; //$NON-NLS-1$
+	public static String maxLengthStringInCharacterCodeRegistry = ""; //$NON-NLS-1$
+
+	private ContentSettingsRegistry() {
+	}
+
+	public static void setHTMLDocumentTypeRegistryInto(ComboList combo) {
+		combo.add(NONE, ""); //$NON-NLS-1$
+		HTMLDocumentTypeRegistry reg = HTMLDocumentTypeRegistry.getInstance();
+		Enumeration e = reg.getEntries();
+		while (e.hasMoreElements()) {
+			HTMLDocumentTypeEntry entry = (HTMLDocumentTypeEntry) e.nextElement();
+			String publicId = entry.getPublicId();
+			String displayName = entry.getDisplayName();
+			if (displayName != null) {
+				combo.add(displayName, publicId);
+				if (displayName.length() > maxLengthStringInHTMLDocumentTypeRegistry.length())
+					maxLengthStringInHTMLDocumentTypeRegistry = displayName;
+			}
+			else
+				combo.add(publicId, publicId);
+			if (publicId.length() > maxLengthStringInHTMLDocumentTypeRegistry.length())
+				maxLengthStringInHTMLDocumentTypeRegistry = publicId;
+			if (entry.getSystemId() == null)
+				continue; // if HTML entry
+			if (entry.getSystemId().length() > maxLengthStringInHTMLDocumentTypeRegistry.length())
+				maxLengthStringInHTMLDocumentTypeRegistry = entry.getSystemId();
+		}
+
+		combo.sortByKey(1);
+	}
+
+	public static void setCSSMetaModelRegistryInto(ComboList combo) {
+		combo.add(NONE, ""); //$NON-NLS-1$
+		CSSProfileRegistry reg = CSSProfileRegistry.getInstance();
+		Iterator i = reg.getProfiles();
+		while (i.hasNext()) {
+			CSSProfile profile = (CSSProfile) i.next();
+			String id = profile.getProfileID();
+			String name = profile.getProfileName();
+			combo.add(name, id);
+		}
+		combo.sortByKey(1);
+	}
+
+	public static void setDeviceProfileRegistryInto(ComboList combo) {
+		combo.add(NONE, ""); //$NON-NLS-1$
+		DeviceProfileEntryProvider reg = DeviceProfileEntryProviderBuilder.getEntryProvider();
+		if (reg == null) {
+			return;
+		}
+		Iterator profiles = reg.getDeviceProfileEntries();
+		if (profiles == null) {
+			reg.release();
+			return;
+		}
+		DeviceProfileEntry entry;
+		while (profiles.hasNext()) {
+			entry = (DeviceProfileEntry) profiles.next();
+			combo.add(entry.getEntryName(), entry.getEntryId());
+			entry.release();
+		}
+		reg.release();
+		combo.sortByKey(1);
+	}
+
+	public static String getSystemIdFrom(String publicId) {
+		if (publicId == null || publicId.length() == 0)
+			return null;
+		HTMLDocumentTypeRegistry reg = HTMLDocumentTypeRegistry.getInstance();
+		Enumeration e = reg.getEntries();
+		while (e.hasMoreElements()) {
+			HTMLDocumentTypeEntry entry = (HTMLDocumentTypeEntry) e.nextElement();
+			if (entry.getPublicId().equals(publicId))
+				return entry.getSystemId();
+		}
+		return null;
+	}
+
+	public static void setContentTypeInto(ComboList combo) {
+		String[] type = {"", //$NON-NLS-1$
+					"application/xhtml+xml", //$NON-NLS-1$
+					"application/xml", //$NON-NLS-1$
+					"text/html", //$NON-NLS-1$
+					"text/xml",}; //$NON-NLS-1$
+		String[] displayName = {NONE, "application/xhtml+xml", //$NON-NLS-1$
+					//$NON-NLS-1$
+					"application/xml", //$NON-NLS-1$
+					"text/html", //$NON-NLS-1$
+					"text/xml",}; //$NON-NLS-1$
+		for (int i = 0; i < type.length; i++) {
+			if (displayName[i] != null && displayName[i].length() != 0)
+				combo.add(displayName[i], type[i]);
+			else
+				combo.add(type[i], type[i]);
+		}
+
+	}
+
+	public static void setCharacterCodeInto(ComboList combo) {
+		combo.add(NONE, ""); //$NON-NLS-1$
+		String max = ""; //$NON-NLS-1$
+		// CommonCharsetNames encoding = new CommonCharsetNames();
+		String[] charCode = CommonCharsetNames.getCommonCharsetNames();
+		for (int i = 0; i < charCode.length; i++) {
+			String displayName = CommonCharsetNames.getDisplayString(charCode[i]);
+			if (displayName != null && displayName.length() != 0) {
+				combo.add(displayName, charCode[i]);
+				int n_byte = displayName.getBytes().length;
+				if (max.getBytes().length < n_byte)
+					max = displayName;
+			}
+			else
+				combo.add(charCode[i], charCode[i]);
+		}
+		/*
+		 * charCode = encoding.getSupportedJavaEncodings(); for(int i=0;i<charCode.length;i++){
+		 * String displayName = encoding.getDisplayString(charCode[i]); if
+		 * (displayName!=null && displayName.length()!=0)
+		 * combo.add(displayName,charCode[i]); else
+		 * combo.add(charCode[i],charCode[i]); }
+		 */
+		// combo.sortByKey(1);
+		maxLengthStringInCharacterCodeRegistry = max;
+	}
+
+	public static void setLanguageInto(ComboList combo) {
+		String[] lang = {"", //$NON-NLS-1$
+					"java", //$NON-NLS-1$
+					"javascript",}; //$NON-NLS-1$
+		String[] displayName = {NONE, "java", //$NON-NLS-1$
+					//$NON-NLS-1$
+					"javascript",}; //$NON-NLS-1$
+		for (int i = 0; i < lang.length; i++) {
+			if (displayName[i] != null && displayName[i].length() != 0)
+				combo.add(displayName[i], lang[i]);
+			else
+				combo.add(lang[i], lang[i]);
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntry.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntry.java
new file mode 100644
index 0000000..c42cb15
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntry.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+/**
+ * <p>
+ * This interface is not intended to be implemented by clients directly.
+ * Instead, please use abstract class(AbstractDeviceProfileEntry) instead.
+ * </p>
+ * 
+ * @deprecated Not needed. See BUG118359
+ */
+public interface DeviceProfileEntry {
+	public String getEntryId();
+
+	public String getEntryName();
+
+	public void release();
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntryProvider.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntryProvider.java
new file mode 100644
index 0000000..fe60779
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntryProvider.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import java.util.Iterator;
+
+/**
+ * <p>
+ * This interface is not intended to be implemented by clients directly.
+ * Instead, please use abstract class(AbstractDeviceProfileEntryProvider)
+ * instead.
+ * </p>
+ * 
+ * @deprecated Not needed. See BUG118359
+ */
+public interface DeviceProfileEntryProvider {
+	public Iterator getDeviceProfileEntries();
+
+	public void release();
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntryProviderBuilder.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntryProviderBuilder.java
new file mode 100644
index 0000000..3263eaa
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/DeviceProfileEntryProviderBuilder.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @deprecated Not needed.  See BUG118359
+ */
+public class DeviceProfileEntryProviderBuilder {
+	private static final String EXTENSION_POINT_PLUGINID = "org.eclipse.wst.html.ui";  //$NON-NLS-1$
+	private static final String EXTENSION_POINT_NAME = "deviceProfileEntryProvider"; //$NON-NLS-1$
+	private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+	public DeviceProfileEntryProviderBuilder() {
+		super();
+	}
+	static public DeviceProfileEntryProvider getEntryProvider() {
+		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_PLUGINID, EXTENSION_POINT_NAME);
+		if (point != null) {
+			IExtension extensions[] = point.getExtensions();
+			if ((extensions != null) && (extensions.length > 0)) {
+				for (int i = 0; i < extensions.length; i++) {
+					IConfigurationElement elements[] = extensions[i].getConfigurationElements();
+					if ((elements != null) && (elements.length > 0)) {
+						for (int j = 0; j < elements.length; j++) {
+							IConfigurationElement config = elements[j];
+							if ((config != null) && (config.getName().equals(EXTENSION_POINT_NAME) == true)) {
+								String className = config.getAttribute(ATTR_CLASS);
+								if (className != null) {
+									try {
+										DeviceProfileEntryProvider provider = (DeviceProfileEntryProvider)config.createExecutableExtension(ATTR_CLASS);
+										if (provider != null) {
+											return provider;
+										}
+									} catch (CoreException ignored) {
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/HTMLContentSettingsPropertyPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/HTMLContentSettingsPropertyPage.java
new file mode 100644
index 0000000..395fded
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/HTMLContentSettingsPropertyPage.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.Logger;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.internal.contentproperties.IContentSettings;
+import org.eclipse.wst.sse.ui.internal.contentproperties.ui.ComboListOnPropertyPage;
+import org.eclipse.wst.sse.ui.internal.contentproperties.ui.ContentSettingsPropertyPage;
+
+/**
+ * @deprecated Use WebContentSettingsPropertyPage instead
+ */
+public final class HTMLContentSettingsPropertyPage extends ContentSettingsPropertyPage implements org.eclipse.swt.events.SelectionListener {
+
+
+	private final int N_DOCUMENT_TYPE = 0;
+	private final int N_CSS_PROFILE = 1;
+	private final int N_TARGET_DEVICE = 2;
+
+	private Text publicIdText;
+	private Text systemIdText;
+
+	public HTMLContentSettingsPropertyPage() {
+		super();
+		numberOfCombo = 3;
+		numCols = 2;
+		numRows = 8;
+		combo = new ComboListOnPropertyPage[super.numberOfCombo];
+
+	}
+
+
+
+	protected void createDocumentTypeComboBox() {
+
+		// create description of implecit DOCTYPE	
+		Label label = new Label(propertyPage, SWT.LEFT);
+		label.setText(HTMLUIMessages.UI_Description_of_role_of_following_DOCTYPE);
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.horizontalSpan = numCols;
+		label.setLayoutData(data);
+
+		// create combobox
+		super.combo[N_DOCUMENT_TYPE] = super.createComboBoxOf(DOCUMENT_LABEL);
+		super.combo[this.N_DOCUMENT_TYPE].addSelectionListener(this);
+		// set entry list into Combo
+		ContentSettingsRegistry.setHTMLDocumentTypeRegistryInto(combo[N_DOCUMENT_TYPE]);
+		//	create TextField
+		createIDTextField();
+		if (combo[N_DOCUMENT_TYPE].getItemCount() <= 0)
+			return;
+
+		String initValue = contentSettings.getProperty((IResource) super.getElement(), IContentSettings.HTML_DOCUMENT_TYPE);
+		// when either .contentsettings or element doesn't exist
+		// when attribute doesn't exists,getProperty returns empty string.
+		if (initValue == null)
+			initValue = ""; //$NON-NLS-1$
+		// set init selectionItem in Combo
+		super.setSelectionItem(combo[N_DOCUMENT_TYPE], initValue);
+		this.publicIdText.setText(initValue);
+		if (!initValue.equals("")) {//$NON-NLS-1$
+			// toro D210260
+			if (ContentSettingsRegistry.getSystemIdFrom(initValue) != null)
+				this.systemIdText.setText(ContentSettingsRegistry.getSystemIdFrom(initValue));
+			else
+				this.systemIdText.setText("");//$NON-NLS-1$
+		}
+		else
+			this.systemIdText.setText("");//$NON-NLS-1$
+
+		// create separator
+		label = new Label(propertyPage, SWT.SEPARATOR | SWT.HORIZONTAL);
+		data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.horizontalSpan = numCols;
+		data.verticalSpan = 8;
+		label.setLayoutData(data);
+
+	}
+
+
+
+	protected void createCSSComboBox() {
+		super.combo[N_CSS_PROFILE] = super.createComboBoxOf(CSS_LABEL);
+
+		ContentSettingsRegistry.setCSSMetaModelRegistryInto(combo[N_CSS_PROFILE]);
+		if (combo[N_CSS_PROFILE].getItemCount() <= 0)
+			return;
+		String initValue = contentSettings.getProperty((IResource) super.getElement(), IContentSettings.CSS_PROFILE);
+		// when either .contentsettings or element doesn't exist
+		// when attribute doesn't exists,getProperty returns empty string.
+		if (initValue == null)
+			initValue = ""; //$NON-NLS-1$
+		// set init selectionItem in Combo
+		super.setSelectionItem(combo[N_CSS_PROFILE], initValue);
+	}
+
+
+
+	protected void createDeviceComboBox() {
+		super.combo[N_TARGET_DEVICE] = super.createComboBoxOf(DEVICE_LABEL);
+
+		ContentSettingsRegistry.setDeviceProfileRegistryInto(combo[N_TARGET_DEVICE]);
+		if (combo[N_TARGET_DEVICE].getItemCount() <= 0)
+			return;
+		String initValue = contentSettings.getProperty((IResource) super.getElement(), IContentSettings.DEVICE_PROFILE);
+		// when either .contentsettings or element doesn't exist
+		// when attribute doesn't exists,getProperty returns empty string.
+		if (initValue == null)
+			initValue = ""; //$NON-NLS-1$
+		// set init selectionItem in Combo
+		super.setSelectionItem(combo[N_TARGET_DEVICE], initValue);
+	}
+
+
+	protected void createSettingsPageGUI() {
+		int type = ((IResource) getElement()).getType();
+		switch (type) {
+			case IResource.FILE :
+				//	composite = createComposite(propertyPage,numCols,numRows);
+				createDocumentTypeComboBox();
+				createCSSComboBox();
+				createDeviceComboBox();
+				computeMaxWidthHint();
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(propertyPage, IHelpContextIds.WEB_CONTENT_SETTINGS_HELPID);
+				break;
+
+			default :
+				Logger.log(Logger.WARNING, "HTMLContentSettingsPropertyPage is instantiated by resource except FILE");//$NON-NLS-1$
+				break;
+		}
+
+	}
+
+
+
+	protected void putSelectedPropertyInto(Map properties, String valueInCombo, int index) {
+
+		switch (index) {
+			case N_DOCUMENT_TYPE :
+				// doc type
+				properties.put(IContentSettings.HTML_DOCUMENT_TYPE, valueInCombo);
+				break;
+			case N_CSS_PROFILE :
+				// css
+				properties.put(IContentSettings.CSS_PROFILE, valueInCombo);
+				break;
+			case N_TARGET_DEVICE :
+				// device
+				properties.put(IContentSettings.DEVICE_PROFILE, valueInCombo);
+				break;
+			default :
+				Logger.log(Logger.ERROR, "Index is out of range in putSelectedPropertyInto() in class HTMLContentSettingsPropertyPage");//$NON-NLS-1$
+				break;
+		}
+
+	}
+
+	protected void deleteNoneProperty(int index) {
+		switch (index) {
+			case N_DOCUMENT_TYPE :
+				// doc type
+				contentSettings.deleteProperty((IResource) super.getElement(), IContentSettings.HTML_DOCUMENT_TYPE);
+				break;
+			case N_CSS_PROFILE :
+				// css
+				contentSettings.deleteProperty((IResource) super.getElement(), IContentSettings.CSS_PROFILE);
+				break;
+			case N_TARGET_DEVICE :
+				// device
+				contentSettings.deleteProperty((IResource) super.getElement(), IContentSettings.DEVICE_PROFILE);
+				break;
+			default :
+				Logger.log(Logger.ERROR, "Index is out of range in deleteNoneProperty() in class HTMLContentSettingsPropertyPage");//$NON-NLS-1$
+				break;
+		}
+	}
+
+	private void createIDTextField() {
+		// public ID & System ID
+		Label publicLabel = new Label(super.propertyPage, SWT.NONE);
+		GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
+		data.horizontalIndent = 10;
+		publicLabel.setLayoutData(data);
+		publicLabel.setText(HTMLUIMessages.UI_Public_ID);
+		publicIdText = new Text(super.propertyPage, SWT.BORDER | SWT.READ_ONLY);
+		data = new GridData();
+
+		publicIdText.setLayoutData(data);
+
+		Label systemLabel = new Label(super.propertyPage, SWT.NONE);
+		data = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
+		data.horizontalIndent = 10;
+		systemLabel.setLayoutData(data);
+		systemLabel.setText(HTMLUIMessages.UI_System_ID);
+		systemIdText = new Text(super.propertyPage, SWT.BORDER | SWT.READ_ONLY);
+		data = new GridData();
+
+		systemIdText.setLayoutData(data);
+	}
+
+
+
+	private void computeMaxWidthHint() {
+		// maxLengthString was set when HTMLDocumentTypeEntry was set in class ContentSettingsRegistry.
+		String maxLengthString = ContentSettingsRegistry.maxLengthStringInHTMLDocumentTypeRegistry;
+		String backup = this.systemIdText.getText();
+		this.systemIdText.setText(maxLengthString);
+		int maxWidthHint = this.systemIdText.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
+		this.systemIdText.setText(backup);
+
+		if (this.combo[this.N_DOCUMENT_TYPE].getLayoutData() != null)
+			((GridData) this.combo[this.N_DOCUMENT_TYPE].getLayoutData()).widthHint = maxWidthHint;
+		if (this.publicIdText.getLayoutData() != null)
+			((GridData) this.publicIdText.getLayoutData()).widthHint = maxWidthHint;
+		if (this.systemIdText.getLayoutData() != null)
+			((GridData) this.systemIdText.getLayoutData()).widthHint = maxWidthHint;
+		if (this.combo[this.N_CSS_PROFILE].getLayoutData() != null)
+			((GridData) this.combo[this.N_CSS_PROFILE].getLayoutData()).widthHint = maxWidthHint;
+		if (this.combo[this.N_TARGET_DEVICE].getLayoutData() != null)
+			((GridData) this.combo[this.N_TARGET_DEVICE].getLayoutData()).widthHint = maxWidthHint;
+
+	}
+
+
+	public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+	}
+
+	public void widgetSelected(org.eclipse.swt.events.SelectionEvent event) {
+		Widget source = event.widget;
+
+		if (this.combo[this.N_DOCUMENT_TYPE].equals(source)) {
+			ComboListOnPropertyPage combo = this.combo[this.N_DOCUMENT_TYPE];
+			if (combo.getSelectionIndex() < 0)
+				return;
+			if (!combo.getSelectedValue().equals("")) {//$NON-NLS-1$
+				this.publicIdText.setText(combo.getSelectedValue());
+				if (ContentSettingsRegistry.getSystemIdFrom(combo.getSelectedValue()) != null)
+					this.systemIdText.setText(ContentSettingsRegistry.getSystemIdFrom(combo.getSelectedValue()));
+				else
+					this.systemIdText.setText("");//$NON-NLS-1$
+			}
+			else {
+				this.publicIdText.setText("");//$NON-NLS-1$
+				this.systemIdText.setText(""); //$NON-NLS-1$
+			}
+
+		}
+	}
+
+	protected void performDefaults() {
+		super.performDefaults();
+		this.publicIdText.setText("");//$NON-NLS-1$
+		this.systemIdText.setText(""); //$NON-NLS-1$
+
+	}
+
+
+}
+
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ProjectContentSettingsPropertyPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ProjectContentSettingsPropertyPage.java
new file mode 100644
index 0000000..333c615
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ProjectContentSettingsPropertyPage.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.Logger;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.internal.contentproperties.IContentSettings;
+import org.eclipse.wst.sse.ui.internal.contentproperties.ui.ComboListOnPropertyPage;
+import org.eclipse.wst.sse.ui.internal.contentproperties.ui.ContentSettingsPropertyPage;
+
+/**
+ * @deprecated Use ProjectHTMLContentSettingsPropertyPage instead
+ */
+public final class ProjectContentSettingsPropertyPage extends ContentSettingsPropertyPage implements org.eclipse.swt.events.SelectionListener {
+
+
+	private final int N_DOCUMENT_TYPE = 0;
+	private final int N_CSS_PROFILE = 1;
+	private final int N_TARGET_DEVICE = 2;
+
+	private Text publicIdText;
+	private Text systemIdText;
+
+	public ProjectContentSettingsPropertyPage() {
+		super();
+		numberOfCombo = 3;
+		numCols = 2;
+		numRows = 8;
+		combo = new ComboListOnPropertyPage[super.numberOfCombo];
+
+	}
+
+
+
+	protected void createDocumentTypeComboBox() {
+
+		// create description of implecit DOCTYPE
+		Label label = new Label(propertyPage, SWT.LEFT);
+		label.setText(HTMLUIMessages.UI_Description_of_role_of_following_DOCTYPE);
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.horizontalSpan = numCols;
+		label.setLayoutData(data);
+
+		// create combobox
+		super.combo[N_DOCUMENT_TYPE] = super.createComboBoxOf(DOCUMENT_LABEL);
+		super.combo[this.N_DOCUMENT_TYPE].addSelectionListener(this);
+		// set entry list into Combo
+		ContentSettingsRegistry.setHTMLDocumentTypeRegistryInto(combo[N_DOCUMENT_TYPE]);
+		// create TextField
+		createIDTextField();
+		if (combo[N_DOCUMENT_TYPE].getItemCount() <= 0)
+			return;
+
+		String initValue = contentSettings.getProperty((IResource) super.getElement(), IContentSettings.HTML_DOCUMENT_TYPE);
+		// when either .contentsettings or element doesn't exist
+		// when attribute doesn't exists,getProperty returns empty string.
+		if (initValue == null)
+			initValue = ""; //$NON-NLS-1$
+		// set init selectionItem in Combo
+		super.setSelectionItem(combo[N_DOCUMENT_TYPE], initValue);
+		this.publicIdText.setText(initValue);
+		if (!initValue.equals("")) {//$NON-NLS-1$
+			// toro D210260
+			if (ContentSettingsRegistry.getSystemIdFrom(initValue) != null)
+				this.systemIdText.setText(ContentSettingsRegistry.getSystemIdFrom(initValue));
+			else
+				this.systemIdText.setText("");//$NON-NLS-1$
+		}
+		else
+			this.systemIdText.setText("");//$NON-NLS-1$
+
+		// create separator
+		label = new Label(propertyPage, SWT.SEPARATOR | SWT.HORIZONTAL);
+		data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.horizontalSpan = numCols;
+		data.verticalSpan = 8;
+		label.setLayoutData(data);
+
+	}
+
+
+
+	protected void createCSSComboBox() {
+		super.combo[N_CSS_PROFILE] = super.createComboBoxOf(CSS_LABEL);
+
+		ContentSettingsRegistry.setCSSMetaModelRegistryInto(combo[N_CSS_PROFILE]);
+		if (combo[N_CSS_PROFILE].getItemCount() <= 0)
+			return;
+		String initValue = contentSettings.getProperty((IResource) super.getElement(), IContentSettings.CSS_PROFILE);
+		// when either .contentsettings or element doesn't exist
+		// when attribute doesn't exists,getProperty returns empty string.
+		if (initValue == null)
+			initValue = ""; //$NON-NLS-1$
+		// set init selectionItem in Combo
+		super.setSelectionItem(combo[N_CSS_PROFILE], initValue);
+	}
+
+
+
+	protected void createDeviceComboBox() {
+		super.combo[N_TARGET_DEVICE] = super.createComboBoxOf(DEVICE_LABEL);
+
+		ContentSettingsRegistry.setDeviceProfileRegistryInto(combo[N_TARGET_DEVICE]);
+		if (combo[N_TARGET_DEVICE].getItemCount() <= 0)
+			return;
+		String initValue = contentSettings.getProperty((IResource) super.getElement(), IContentSettings.DEVICE_PROFILE);
+		// when either .contentsettings or element doesn't exist
+		// when attribute doesn't exists,getProperty returns empty string.
+		if (initValue == null)
+			initValue = ""; //$NON-NLS-1$
+		// set init selectionItem in Combo
+		super.setSelectionItem(combo[N_TARGET_DEVICE], initValue);
+	}
+
+
+	protected void createSettingsPageGUI() {
+		int type = ((IResource) getElement()).getType();
+		switch (type) {
+			case IResource.PROJECT :
+				// composite = createComposite(propertyPage,numCols,numRows);
+				createDocumentTypeComboBox();
+				createCSSComboBox();
+				createDeviceComboBox();
+				computeMaxWidthHint();
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(propertyPage, IHelpContextIds.WEB_CONTENT_SETTINGS_HELPID);
+				break;
+
+			default :
+				Logger.log(Logger.WARNING, "ProjectContentSettingsPropertyPage is instantiated by resource except PROJECT");//$NON-NLS-1$
+				break;
+		}
+
+	}
+
+
+
+	protected void putSelectedPropertyInto(Map properties, String valueInCombo, int index) {
+
+		switch (index) {
+			case N_DOCUMENT_TYPE :
+				// doc type
+				properties.put(IContentSettings.HTML_DOCUMENT_TYPE, valueInCombo);
+				break;
+			case N_CSS_PROFILE :
+				// css
+				properties.put(IContentSettings.CSS_PROFILE, valueInCombo);
+				break;
+			case N_TARGET_DEVICE :
+				// device
+				properties.put(IContentSettings.DEVICE_PROFILE, valueInCombo);
+				break;
+			default :
+				Logger.log(Logger.ERROR, "Index is out of range in putSelectedPropertyInto() in class ProjectContentSettingsPropertyPage");//$NON-NLS-1$
+				break;
+		}
+
+	}
+
+	protected void deleteNoneProperty(int index) {
+		switch (index) {
+			case N_DOCUMENT_TYPE :
+				// doc type
+				contentSettings.deleteProperty((IResource) super.getElement(), IContentSettings.HTML_DOCUMENT_TYPE);
+				break;
+
+			case N_CSS_PROFILE :
+				// css
+				contentSettings.deleteProperty((IResource) super.getElement(), IContentSettings.CSS_PROFILE);
+				break;
+
+			case N_TARGET_DEVICE :
+				// device
+				contentSettings.deleteProperty((IResource) super.getElement(), IContentSettings.DEVICE_PROFILE);
+				break;
+
+			default :
+				Logger.log(Logger.ERROR, "Index is out of range in deleteNoneProperty() in class ProjectContentSettingsPropertyPage");//$NON-NLS-1$
+				break;
+		}
+	}
+
+	private void createIDTextField() {
+		// public ID & System ID
+		Label publicLabel = new Label(super.propertyPage, SWT.NONE);
+		GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
+		data.horizontalIndent = 10;
+		publicLabel.setLayoutData(data);
+		publicLabel.setText(HTMLUIMessages.UI_Public_ID);
+		publicIdText = new Text(super.propertyPage, SWT.BORDER | SWT.READ_ONLY);
+		data = new GridData();
+
+		publicIdText.setLayoutData(data);
+
+		Label systemLabel = new Label(super.propertyPage, SWT.NONE);
+		data = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
+		data.horizontalIndent = 10;
+		systemLabel.setLayoutData(data);
+		systemLabel.setText(HTMLUIMessages.UI_System_ID);
+		systemIdText = new Text(super.propertyPage, SWT.BORDER | SWT.READ_ONLY);
+		data = new GridData();
+
+		systemIdText.setLayoutData(data);
+	}
+
+
+
+	private void computeMaxWidthHint() {
+		// maxLengthString was set when HTMLDocumentTypeEntry was set in class
+		// ContentSettingsRegistry.
+		String maxLengthString = ContentSettingsRegistry.maxLengthStringInHTMLDocumentTypeRegistry;
+		String backup = this.systemIdText.getText();
+		this.systemIdText.setText(maxLengthString);
+		int maxWidthHint = this.systemIdText.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
+		this.systemIdText.setText(backup);
+
+		if (this.combo[this.N_DOCUMENT_TYPE].getLayoutData() != null)
+			((GridData) this.combo[this.N_DOCUMENT_TYPE].getLayoutData()).widthHint = maxWidthHint;
+		if (this.publicIdText.getLayoutData() != null)
+			((GridData) this.publicIdText.getLayoutData()).widthHint = maxWidthHint;
+		if (this.systemIdText.getLayoutData() != null)
+			((GridData) this.systemIdText.getLayoutData()).widthHint = maxWidthHint;
+		if (this.combo[this.N_CSS_PROFILE].getLayoutData() != null)
+			((GridData) this.combo[this.N_CSS_PROFILE].getLayoutData()).widthHint = maxWidthHint;
+		if (this.combo[this.N_TARGET_DEVICE].getLayoutData() != null)
+			((GridData) this.combo[this.N_TARGET_DEVICE].getLayoutData()).widthHint = maxWidthHint;
+
+	}
+
+
+	public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+	}
+
+	public void widgetSelected(org.eclipse.swt.events.SelectionEvent event) {
+		Widget source = event.widget;
+
+		if (this.combo[this.N_DOCUMENT_TYPE].equals(source)) {
+			ComboListOnPropertyPage combo = this.combo[this.N_DOCUMENT_TYPE];
+			if (combo.getSelectionIndex() < 0)
+				return;
+			if (!combo.getSelectedValue().equals("")) {//$NON-NLS-1$
+				this.publicIdText.setText(combo.getSelectedValue());
+				if (ContentSettingsRegistry.getSystemIdFrom(combo.getSelectedValue()) != null)
+					this.systemIdText.setText(ContentSettingsRegistry.getSystemIdFrom(combo.getSelectedValue()));
+				else
+					this.systemIdText.setText("");//$NON-NLS-1$
+			}
+			else {
+				this.publicIdText.setText("");//$NON-NLS-1$
+				this.systemIdText.setText(""); //$NON-NLS-1$
+			}
+
+		}
+	}
+
+	protected void performDefaults() {
+		super.performDefaults();
+		this.publicIdText.setText("");//$NON-NLS-1$
+		this.systemIdText.setText(""); //$NON-NLS-1$
+
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ProjectWebContentSettingsPropertyPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ProjectWebContentSettingsPropertyPage.java
new file mode 100644
index 0000000..6ccbe4c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/ProjectWebContentSettingsPropertyPage.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+
+public class ProjectWebContentSettingsPropertyPage extends WebContentSettingsPropertyPage {
+	public ProjectWebContentSettingsPropertyPage() {
+		setDescription(HTMLUIMessages.ProjectWebContentSettingsPropertyPage_0);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/WebContentSettingsPropertyPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/WebContentSettingsPropertyPage.java
new file mode 100644
index 0000000..76c3a7d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentproperties/ui/WebContentSettingsPropertyPage.java
@@ -0,0 +1,384 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.contentproperties.ui;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.wst.css.core.internal.contentproperties.CSSContentProperties;
+import org.eclipse.wst.css.core.internal.metamodel.CSSProfile;
+import org.eclipse.wst.css.core.internal.metamodel.CSSProfileRegistry;
+import org.eclipse.wst.html.core.internal.contentproperties.HTMLContentProperties;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.Logger;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+
+public class WebContentSettingsPropertyPage extends PropertyPage {
+	private static final String SELECT_NONE = HTMLUIMessages.UI_none;
+	private String maxLengthStringInHTMLDocumentTypeRegistry = ""; //$NON-NLS-1$
+
+	private class ComboSelectionListener implements SelectionListener {
+		public void widgetDefaultSelected(SelectionEvent e) {
+			// do nothing
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			int index = fDocumentTypeCombo.getSelectionIndex();
+			String doctype = (String) fDocumentTypeIds.get(index);
+			updateDoctypeText(index, doctype);
+		}
+	}
+
+	Combo fDocumentTypeCombo;
+	List fDocumentTypeIds;
+	private Text fPublicIdText;
+	private Text fSystemIdText;
+	private Combo fProfileCombo;
+	private List fProfileIds;
+	private SelectionListener fListener;
+
+	public WebContentSettingsPropertyPage() {
+		super();
+		setDescription(HTMLUIMessages.WebContentSettingsPropertyPage_0);
+	}
+
+	private Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		// GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+
+		// GridData
+		GridData data = new GridData(GridData.FILL, GridData.FILL, true, false);
+		data.horizontalIndent = 0;
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+	protected Control createContents(Composite parent) {
+		Composite propertyPage = createComposite(parent, 2);
+
+		createDoctypeContents(propertyPage);
+		createCSSProfileContents(propertyPage);
+
+		populateValues();
+		initializeValues();
+		computeMaxWidthHint();
+
+		fListener = new ComboSelectionListener();
+		fDocumentTypeCombo.addSelectionListener(fListener);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(propertyPage, IHelpContextIds.WEB_CONTENT_SETTINGS_HELPID);
+		Dialog.applyDialogFont(parent);
+		return propertyPage;
+	}
+
+	private void createCSSProfileContents(Composite parent) {
+		// CSS Profile
+		Label languageLabel = new Label(parent, SWT.NONE);
+		languageLabel.setText(HTMLUIMessages.UI_CSS_profile___2);
+		fProfileCombo = new Combo(parent, SWT.READ_ONLY);
+		GridData data = new GridData(GridData.FILL, GridData.FILL, true, false);
+		data.horizontalIndent = 0;
+		fProfileCombo.setLayoutData(data);
+	}
+
+	private void createDoctypeContents(Composite parent) {
+		// create description of implicit DOCTYPE
+		Text doctypeLabel = new Text(parent, SWT.READ_ONLY);
+		doctypeLabel.setText(HTMLUIMessages.UI_Description_of_role_of_following_DOCTYPE);
+		GridData data = new GridData(GridData.FILL, GridData.FILL, true, false);
+		data.horizontalIndent = 0;
+		data.horizontalSpan = 2;
+		doctypeLabel.setLayoutData(data);
+
+		// document type
+		Label languageLabel = new Label(parent, SWT.NONE);
+		languageLabel.setText(HTMLUIMessages.UI_Default_HTML_DOCTYPE_ID___1);
+		fDocumentTypeCombo = new Combo(parent, SWT.READ_ONLY);
+		data = new GridData(GridData.FILL, GridData.FILL, true, false);
+		data.horizontalIndent = 0;
+		fDocumentTypeCombo.setLayoutData(data);
+
+		// public ID
+		Label publicIdLabel = new Label(parent, SWT.NONE);
+		publicIdLabel.setText(HTMLUIMessages.UI_Public_ID);
+		fPublicIdText = new Text(parent, SWT.READ_ONLY | SWT.BORDER);
+		data = new GridData(GridData.FILL, GridData.FILL, true, false);
+		data.horizontalIndent = 0;
+		fPublicIdText.setLayoutData(data);
+
+		// system ID
+		Label systemIdLabel = new Label(parent, SWT.NONE);
+		systemIdLabel.setText(HTMLUIMessages.UI_System_ID);
+		fSystemIdText = new Text(parent, SWT.READ_ONLY | SWT.BORDER);
+		data = new GridData(GridData.FILL, GridData.FILL, true, false);
+		data.horizontalIndent = 0;
+		fSystemIdText.setLayoutData(data);
+
+		// create separator
+		Label label = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
+		data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.horizontalSpan = 2;
+		data.verticalSpan = 8;
+		label.setLayoutData(data);
+
+	}
+
+	/**
+	 * Get the resource this properties page is for
+	 * 
+	 * @return IResource for this properties page or null if there is no
+	 *         IResource
+	 */
+	private IResource getResource() {
+		IResource resource = null;
+		IAdaptable adaptable = getElement();
+		if (adaptable instanceof IResource) {
+			resource = (IResource) adaptable;
+		} else if (adaptable != null) {
+			Object o = adaptable.getAdapter(IResource.class);
+			if (o instanceof IResource) {
+				resource = (IResource)o;
+			}
+		}
+		return resource;
+	}
+
+	private String getSystemIdFrom(String publicId) {
+		if (publicId == null || publicId.length() == 0)
+			return null;
+		HTMLDocumentTypeRegistry reg = HTMLDocumentTypeRegistry.getInstance();
+		Enumeration e = reg.getEntries();
+		while (e.hasMoreElements()) {
+			HTMLDocumentTypeEntry entry = (HTMLDocumentTypeEntry) e.nextElement();
+			if (entry.getPublicId().equals(publicId))
+				return entry.getSystemId();
+		}
+		return null;
+	}
+
+	private void initializeValues() {
+		initializeDoctypeValues();
+		initializeCSSProfileValues();
+	}
+
+	private void initializeCSSProfileValues() {
+		int index = 0;
+		String profile = CSSContentProperties.getProperty(CSSContentProperties.CSS_PROFILE, getResource(), false);
+		if (profile != null && profile.length() > 0) {
+			/*
+			 * If item is already part of combo, select it. Otherwise, select
+			 * none.
+			 */
+			index = fProfileIds.indexOf(profile);
+		}
+		index = index >= 0 ? index : 0;
+		fProfileCombo.select(index);
+	}
+
+	private void initializeDoctypeValues() {
+		int index = 0;
+		String doctype = HTMLContentProperties.getProperty(HTMLContentProperties.DOCUMENT_TYPE, getResource(), false);
+		if (doctype != null) {
+			/*
+			 * If item is already part of combo, select it. Otherwise, select
+			 * none.
+			 */
+			index = fDocumentTypeIds.indexOf(doctype);
+		}
+
+		// set combobox
+		index = index >= 0 ? index : 0;
+		fDocumentTypeCombo.select(index);
+
+		updateDoctypeText(index, doctype);
+	}
+
+	void updateDoctypeText(int index, String doctype) {
+		if (index > 0) {
+			// set public/system id text
+			fPublicIdText.setText(doctype);
+			String systemId = getSystemIdFrom(doctype);
+			if (systemId != null)
+				fSystemIdText.setText(systemId);
+			else
+				fSystemIdText.setText(""); //$NON-NLS-1$
+		}
+		else {
+			// set public/system id text
+			fPublicIdText.setText(""); //$NON-NLS-1$
+			fSystemIdText.setText(""); //$NON-NLS-1$
+		}
+	}
+
+	private void populateValues() {
+		populateDoctypeValues();
+		populateCSSProfileValues();
+	}
+
+	private void populateCSSProfileValues() {
+		fProfileIds = new ArrayList();
+		// add none first
+		fProfileCombo.add(SELECT_NONE);
+		fProfileIds.add(null);
+
+		CSSProfileRegistry reg = CSSProfileRegistry.getInstance();
+		Iterator i = reg.getProfiles();
+		while (i.hasNext()) {
+			CSSProfile profile = (CSSProfile) i.next();
+			String id = profile.getProfileID();
+			String name = profile.getProfileName();
+			fProfileCombo.add(name);
+			fProfileIds.add(id);
+		}
+	}
+
+	private void populateDoctypeValues() {
+		fDocumentTypeIds = new ArrayList();
+		// add none first
+		fDocumentTypeCombo.add(SELECT_NONE);
+		fDocumentTypeIds.add(null);
+
+		HTMLDocumentTypeRegistry reg = HTMLDocumentTypeRegistry.getInstance();
+		Enumeration e = reg.getEntries();
+		while (e.hasMoreElements()) {
+			HTMLDocumentTypeEntry entry = (HTMLDocumentTypeEntry) e.nextElement();
+			String publicId = entry.getPublicId();
+			String displayName = entry.getDisplayName();
+			displayName = displayName != null ? displayName : publicId;
+
+			fDocumentTypeCombo.add(displayName);
+			fDocumentTypeIds.add(publicId);
+
+			if (displayName.length() > maxLengthStringInHTMLDocumentTypeRegistry.length()) {
+				maxLengthStringInHTMLDocumentTypeRegistry = displayName;
+			}
+
+			if (entry.getSystemId() == null)
+				continue; // if HTML entry
+
+
+			if (entry.getSystemId().length() > maxLengthStringInHTMLDocumentTypeRegistry.length())
+				maxLengthStringInHTMLDocumentTypeRegistry = entry.getSystemId();
+		}
+	}
+
+	private void computeMaxWidthHint() {
+		// maxLengthString was set populateDoctypeValues was called
+		String maxLengthString = maxLengthStringInHTMLDocumentTypeRegistry;
+		String backup = fSystemIdText.getText();
+		fSystemIdText.setText(maxLengthString);
+		int maxWidthHint = fSystemIdText.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
+		fSystemIdText.setText(backup);
+
+		if (fDocumentTypeCombo.getLayoutData() != null)
+			((GridData) fDocumentTypeCombo.getLayoutData()).widthHint = maxWidthHint;
+		if (fPublicIdText.getLayoutData() != null)
+			((GridData) fPublicIdText.getLayoutData()).widthHint = maxWidthHint;
+		if (fSystemIdText.getLayoutData() != null)
+			((GridData) fSystemIdText.getLayoutData()).widthHint = maxWidthHint;
+		if (fProfileCombo.getLayoutData() != null)
+			((GridData) fProfileCombo.getLayoutData()).widthHint = maxWidthHint;
+	}
+
+	private void performCSSProfileDefaults() {
+		int index = fProfileCombo.indexOf(SELECT_NONE);
+		if (index > -1)
+			fProfileCombo.select(index);
+
+		super.performDefaults();
+	}
+
+	private boolean performCSSProfileOk() {
+		int index = fProfileCombo.getSelectionIndex();
+		if (index > -1) {
+			String id = (String) fProfileIds.get(index);
+			if (id == null || id.length() == 0 || id.equalsIgnoreCase(SELECT_NONE)) {
+				// if none, use null
+				id = null;
+			}
+			try {
+				CSSContentProperties.setProperty(CSSContentProperties.CSS_PROFILE, getResource(), id);
+			}
+			catch (CoreException e) {
+				// maybe in future, let user know there was a problem saving
+				// file
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			}
+		}
+		return true;
+	}
+
+	protected void performDefaults() {
+		super.performDefaults();
+
+		performDoctypeDefaults();
+		performCSSProfileDefaults();
+	}
+
+	private void performDoctypeDefaults() {
+		fPublicIdText.setText("");//$NON-NLS-1$
+		fSystemIdText.setText(""); //$NON-NLS-1$
+	}
+
+	private boolean performDoctypeOk() {
+		int index = fDocumentTypeCombo.getSelectionIndex();
+		if (index > -1) {
+			String id = (String) fDocumentTypeIds.get(index);
+			if (id == null || id.equalsIgnoreCase(SELECT_NONE)) {
+				// if none, use null
+				id = null;
+			}
+			try {
+				HTMLContentProperties.setProperty(HTMLContentProperties.DOCUMENT_TYPE, getResource(), id);
+			}
+			catch (CoreException e) {
+				// maybe in future, let user know there was a problem saving
+				// file
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			}
+		}
+		return true;
+	}
+
+	public boolean performOk() {
+		performDoctypeOk();
+		performCSSProfileOk();
+
+		return super.performOk();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/correction/CorrectionAssistantProviderHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/correction/CorrectionAssistantProviderHTML.java
new file mode 100644
index 0000000..3ddb028
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/correction/CorrectionAssistantProviderHTML.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ *******************************************************************************/
+
+package org.eclipse.wst.html.ui.internal.correction;
+
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.html.core.text.IHTMLPartitions;
+import org.eclipse.wst.sse.ui.internal.correction.CorrectionAssistantProvider;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+import org.eclipse.wst.xml.ui.internal.correction.CorrectionProcessorXML;
+
+/**
+ * Correction assistant for HTML
+ * 
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public class CorrectionAssistantProviderHTML extends CorrectionAssistantProvider {
+
+	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
+		IContentAssistant ca = null;
+
+		if (sourceViewer != null) {
+			ContentAssistant assistant = new ContentAssistant();
+
+			if (sourceViewer != null) {
+				IContentAssistProcessor correctionProcessor = new CorrectionProcessorXML(sourceViewer);
+				assistant.setContentAssistProcessor(correctionProcessor, IHTMLPartitions.HTML_DEFAULT);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_CDATA);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_COMMENT);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_DECLARATION);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_PI);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.DTD_SUBSET);
+			}
+			ca = assistant;
+		}
+
+		return ca;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/SingleCharReader.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/SingleCharReader.java
new file mode 100644
index 0000000..3860bbc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/SingleCharReader.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ *******************************************************************************/
+
+package org.eclipse.wst.html.ui.internal.derived;
+
+import java.io.IOException;
+import java.io.Reader;
+
+/*
+ * Copied from org.eclipse.jdt.internal.corext.javadoc.SingleCharReader.
+ * Modification was made to fix statement unnecessarily nested within else
+ * clause warning in read(..).
+ */
+public abstract class SingleCharReader extends Reader {
+
+	/**
+	 * @see Reader#read()
+	 */
+	public abstract int read() throws IOException;
+
+	/**
+	 * @see Reader#read(char[],int,int)
+	 */
+	public int read(char cbuf[], int off, int len) throws IOException {
+		int end = off + len;
+		for (int i = off; i < end; i++) {
+			int ch = read();
+			if (ch == -1) {
+				if (i == off) {
+					return -1;
+				}
+				return i - off;
+			}
+			cbuf[i] = (char) ch;
+		}
+		return len;
+	}
+
+	/**
+	 * @see Reader#ready()
+	 */
+	public boolean ready() throws IOException {
+		return true;
+	}
+
+	/**
+	 * Gets the content as a String
+	 */
+	public String getString() throws IOException {
+		StringBuffer buf = new StringBuffer();
+		int ch;
+		while ((ch = read()) != -1) {
+			buf.append((char) ch);
+		}
+		return buf.toString();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/ActionContributorHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/ActionContributorHTML.java
new file mode 100644
index 0000000..c471d06
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/ActionContributorHTML.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.edit.ui;
+
+import org.eclipse.wst.xml.ui.internal.actions.ActionContributorXML;
+
+/**
+ *
+ * Instead, use SourcePageActionContributor for source page contributor
+ * of multi page editor.
+ * 
+ * Note that this class is still valid for single page editor.
+ */
+public class ActionContributorHTML extends ActionContributorXML {
+	private static final String[] EDITOR_IDS = {"org.eclipse.wst.html.core.htmlsource.source", "org.eclipse.wst.sse.ui.StructuredTextEditor"}; //$NON-NLS-1$ //$NON-NLS-2$
+
+
+	protected String[] getExtensionIDs() {
+		return EDITOR_IDS;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupActionHTMLDelegate.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupActionHTMLDelegate.java
new file mode 100644
index 0000000..6d8fd56
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupActionHTMLDelegate.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.html.ui.internal.edit.ui;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.html.core.internal.cleanup.HTMLCleanupProcessorImpl;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+
+/**
+ * Cleanup action delegate for HTML editor
+ */
+public class CleanupActionHTMLDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate {
+	private IEditorPart fEditor;
+	private IStructuredCleanupProcessor fCleanupProcessor;
+
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		fEditor = targetEditor;
+	}
+
+	public void dispose() {
+		// nulling out just in case
+		fEditor = null;
+		fCleanupProcessor = null;
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(HTMLUIMessages.CleanupDocument_label);
+			action.setToolTipText(HTMLUIMessages.CleanupDocument_tooltip);
+			action.setDescription(HTMLUIMessages.CleanupDocument_description);
+		}
+	}
+
+	public void runWithEvent(IAction action, Event event) {
+		run(action);
+	}
+
+	public void init(IViewPart view) {
+		// do nothing
+	}
+
+	public void run(IAction action) {
+		if (fEditor instanceof ITextEditor) {
+			final ITextEditor editor = (ITextEditor) fEditor;
+			CleanupDialogHTML cleanupDialog = new CleanupDialogHTML(editor.getSite().getShell());
+			cleanupDialog.setisXHTMLType(isXHTML());
+			if (cleanupDialog.open() == Window.OK) {
+				// setup runnable
+				Runnable runnable = new Runnable() {
+					public void run() {
+						IStructuredCleanupProcessor cleanupProcessor = getCleanupProcessor();
+						if (cleanupProcessor != null) {
+							IStructuredModel model = null;
+							try {
+								model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput()));
+								if (model != null)
+									cleanupProcessor.cleanupModel(model);
+							}
+							finally {
+								if (model != null)
+									model.releaseFromEdit();
+							}
+						}
+					}
+				};
+
+				// TODO: make independent of 'model'.
+				IStructuredModel model = null;
+				try {
+					model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput()));
+					if (model != null) {
+						// begin recording
+						ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+						model.beginRecording(this, SSEUIMessages.Cleanup_Document_UI_, SSEUIMessages.Cleanup_Document_UI_, selection.getOffset(), selection.getLength()); //$NON-NLS-1$ //$NON-NLS-2$
+
+						// tell the model that we are about to make a big
+						// model change
+						model.aboutToChangeModel();
+
+						// run
+						BusyIndicator.showWhile(fEditor.getEditorSite().getWorkbenchWindow().getShell().getDisplay(), runnable);
+					}
+				}
+				finally {
+					if (model != null) {
+						// tell the model that we are done with the big
+						// model
+						// change
+						model.changedModel();
+
+						// end recording
+						ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+						model.endRecording(this, selection.getOffset(), selection.getLength());
+						model.releaseFromEdit();
+					}
+				}
+			}
+		}
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		// do nothing
+	}
+
+	IStructuredCleanupProcessor getCleanupProcessor() {
+		if (fCleanupProcessor == null)
+			fCleanupProcessor = new HTMLCleanupProcessorImpl();
+
+		return fCleanupProcessor;
+	}
+
+	private boolean isXHTML() {
+		boolean isxhtml = false;
+		if (fEditor instanceof ITextEditor) {
+			ITextEditor textEditor = (ITextEditor) fEditor;
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			IStructuredModel model = null;
+			try {
+				model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+				if (model instanceof IDOMModel) {
+					IDOMDocument domDocument = ((IDOMModel) model).getDocument();
+					if (domDocument != null)
+						isxhtml = domDocument.isXMLType();
+				}
+			}
+			finally {
+				if (model != null) {
+					model.releaseFromRead();
+				}
+			}
+		}
+		return isxhtml;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupDialogHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupDialogHTML.java
new file mode 100644
index 0000000..9764210
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupDialogHTML.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.edit.ui;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class CleanupDialogHTML extends Dialog implements SelectionListener {
+
+	protected Button fRadioButtonTagNameCaseAsis;
+	protected Button fRadioButtonTagNameCaseLower;
+	protected Button fRadioButtonTagNameCaseUpper;
+	protected Button fRadioButtonAttrNameCaseAsis;
+	protected Button fRadioButtonAttrNameCaseLower;
+	protected Button fRadioButtonAttrNameCaseUpper;
+	protected Button fCheckBoxCompressEmptyElementTags;
+	protected Button fCheckBoxInsertRequiredAttrs;
+	protected Button fCheckBoxInsertMissingTags;
+	protected Button fCheckBoxQuoteAttrValues;
+	protected Button fCheckBoxFormatSource;
+	protected Button fCheckBoxConvertEOLCodes;
+	protected Button fRadioButtonConvertEOLWindows;
+	protected Button fRadioButtonConvertEOLUnix;
+	protected Button fRadioButtonConvertEOLMac;
+	protected Preferences fPreferences = null;
+	private boolean fIsXHTML = false;
+	private Group fTagNameCase;
+	private Group fAttrNameCase;
+
+	public CleanupDialogHTML(Shell shell) {
+		super(shell);
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		getShell().setText(HTMLUIMessages.Cleanup_UI_);
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		createDialogAreaInComposite(composite);
+		initializeOptions();
+
+		return composite;
+	}
+
+	protected Control createButtonBar(Composite parent) {
+		Control c = super.createButtonBar(parent);
+		okButtonEnablement();
+		return c;
+	}
+
+	protected void createDialogAreaInCompositeForHTML(Composite composite) {
+		// Convert tag name case
+		// d257064 need to associate group w/ radio buttons so radio buttons
+		// header can be read
+		fTagNameCase = new Group(composite, SWT.NONE);
+		fTagNameCase.setText(HTMLUIMessages.Tag_name_case_for_HTML_UI_);
+		GridLayout hLayout = new GridLayout();
+		hLayout.numColumns = 3;
+		fTagNameCase.setLayout(hLayout);
+		fRadioButtonTagNameCaseAsis = new Button(fTagNameCase, SWT.RADIO);
+		fRadioButtonTagNameCaseAsis.setText(HTMLUIMessages.Tag_name_case_As_is_UI_);
+		fRadioButtonTagNameCaseAsis.addSelectionListener(this);
+		fRadioButtonTagNameCaseLower = new Button(fTagNameCase, SWT.RADIO);
+		fRadioButtonTagNameCaseLower.setText(HTMLUIMessages.Tag_name_case_Lower_UI_);
+		fRadioButtonTagNameCaseLower.addSelectionListener(this);
+		fRadioButtonTagNameCaseUpper = new Button(fTagNameCase, SWT.RADIO);
+		fRadioButtonTagNameCaseUpper.setText(HTMLUIMessages.Tag_name_case_Upper_UI_);
+		fRadioButtonTagNameCaseUpper.addSelectionListener(this);
+
+		// Convert attr name case
+		// d257064 need to associate group w/ radio buttons so radio buttons
+		// header can be read
+		fAttrNameCase = new Group(composite, SWT.NONE);
+		fAttrNameCase.setText(HTMLUIMessages.Attribute_name_case_for_HTML_UI_);
+		fAttrNameCase.setLayout(hLayout);
+		fRadioButtonAttrNameCaseAsis = new Button(fAttrNameCase, SWT.RADIO);
+		fRadioButtonAttrNameCaseAsis.setText(HTMLUIMessages.Attribute_name_case_As_is_UI_);
+		fRadioButtonAttrNameCaseAsis.addSelectionListener(this);
+		fRadioButtonAttrNameCaseLower = new Button(fAttrNameCase, SWT.RADIO);
+		fRadioButtonAttrNameCaseLower.setText(HTMLUIMessages.Attribute_name_case_Lower_UI_);
+		fRadioButtonAttrNameCaseLower.addSelectionListener(this);
+		fRadioButtonAttrNameCaseUpper = new Button(fAttrNameCase, SWT.RADIO);
+		fRadioButtonAttrNameCaseUpper.setText(HTMLUIMessages.Attribute_name_case_Upper_UI_);
+		fRadioButtonAttrNameCaseUpper.addSelectionListener(this);
+	}
+
+	protected void createDialogAreaInComposite(Composite composite) {
+		createDialogAreaInCompositeForHTML(composite);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.CLEANUP_HTML_HELPID); // use
+		// HTML
+		// specific
+		// help
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.makeColumnsEqualWidth = true;
+		composite.setLayout(layout);
+
+		// Compress empty element tags
+		fCheckBoxCompressEmptyElementTags = new Button(composite, SWT.CHECK);
+		fCheckBoxCompressEmptyElementTags.setText(XMLUIMessages.Compress_empty_element_tags_UI_);
+		fCheckBoxCompressEmptyElementTags.addSelectionListener(this);
+
+		// Insert missing required attrs
+		fCheckBoxInsertRequiredAttrs = new Button(composite, SWT.CHECK);
+		fCheckBoxInsertRequiredAttrs.setText(HTMLUIMessages.Insert_required_attributes_UI_);
+		fCheckBoxInsertRequiredAttrs.addSelectionListener(this);
+
+		// Insert missing begin/end tags
+		fCheckBoxInsertMissingTags = new Button(composite, SWT.CHECK);
+		fCheckBoxInsertMissingTags.setText(HTMLUIMessages.Insert_missing_tags_UI_);
+		fCheckBoxInsertMissingTags.addSelectionListener(this);
+
+		// Quote attribute values
+		fCheckBoxQuoteAttrValues = new Button(composite, SWT.CHECK);
+		fCheckBoxQuoteAttrValues.setText(HTMLUIMessages.Quote_attribute_values_UI_);
+		fCheckBoxQuoteAttrValues.addSelectionListener(this);
+
+		// Format source
+		fCheckBoxFormatSource = new Button(composite, SWT.CHECK);
+		fCheckBoxFormatSource.setText(HTMLUIMessages.Format_source_UI_);
+		fCheckBoxFormatSource.addSelectionListener(this);
+
+		// Convert EOL code
+		fCheckBoxConvertEOLCodes = new Button(composite, SWT.CHECK);
+		fCheckBoxConvertEOLCodes.setText(HTMLUIMessages.Convert_EOL_codes_UI_);
+		fCheckBoxConvertEOLCodes.addSelectionListener(this);
+		Composite EOLCodes = new Composite(composite, SWT.NULL);
+		GridLayout hLayout = new GridLayout();
+		hLayout.numColumns = 3;
+		EOLCodes.setLayout(hLayout);
+		fRadioButtonConvertEOLWindows = new Button(EOLCodes, SWT.RADIO);
+		fRadioButtonConvertEOLWindows.setText(HTMLUIMessages.EOL_Windows_UI);
+		fRadioButtonConvertEOLWindows.addSelectionListener(this);
+		fRadioButtonConvertEOLUnix = new Button(EOLCodes, SWT.RADIO);
+		fRadioButtonConvertEOLUnix.setText(HTMLUIMessages.EOL_Unix_UI);
+		fRadioButtonConvertEOLUnix.addSelectionListener(this);
+		fRadioButtonConvertEOLMac = new Button(EOLCodes, SWT.RADIO);
+		fRadioButtonConvertEOLMac.setText(HTMLUIMessages.EOL_Mac_UI);
+		fRadioButtonConvertEOLMac.addSelectionListener(this);
+	}
+
+	protected void okPressed() {
+		storeOptions();
+
+		super.okPressed();
+	}
+
+	protected void initializeOptionsForHTML() {
+		boolean caseSensitive = isXHTMLType();
+
+		if (caseSensitive) {
+			fRadioButtonTagNameCaseLower.setSelection(true);
+		} else {
+			int tagNameCase = getModelPreferences().getInt(HTMLCorePreferenceNames.CLEANUP_TAG_NAME_CASE);
+			if (tagNameCase == HTMLCorePreferenceNames.UPPER) {
+				fRadioButtonTagNameCaseUpper.setSelection(true);
+			} else if (tagNameCase == HTMLCorePreferenceNames.LOWER)
+				fRadioButtonTagNameCaseLower.setSelection(true);
+			else
+				fRadioButtonTagNameCaseAsis.setSelection(true);
+		}
+
+		if (caseSensitive) {
+			fRadioButtonAttrNameCaseLower.setSelection(true);
+		} else {
+			int attrNameCase = getModelPreferences().getInt(HTMLCorePreferenceNames.CLEANUP_ATTR_NAME_CASE);
+			if (attrNameCase == HTMLCorePreferenceNames.UPPER) {
+				fRadioButtonAttrNameCaseUpper.setSelection(true);
+			} else if (attrNameCase == HTMLCorePreferenceNames.LOWER)
+				fRadioButtonAttrNameCaseLower.setSelection(true);
+			else
+				fRadioButtonAttrNameCaseAsis.setSelection(true);
+		}
+
+		enableCaseControls(!caseSensitive);
+	}
+
+	protected void initializeOptions() {
+		initializeOptionsForHTML();
+
+		fCheckBoxCompressEmptyElementTags.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.COMPRESS_EMPTY_ELEMENT_TAGS));
+		fCheckBoxInsertRequiredAttrs.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.INSERT_REQUIRED_ATTRS));
+		fCheckBoxInsertMissingTags.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.INSERT_MISSING_TAGS));
+		fCheckBoxQuoteAttrValues.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.QUOTE_ATTR_VALUES));
+		fCheckBoxFormatSource.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.FORMAT_SOURCE));
+		fCheckBoxConvertEOLCodes.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.CONVERT_EOL_CODES));
+		if (fCheckBoxConvertEOLCodes.getSelection()) {
+			String EOLCode = getModelPreferences().getString(HTMLCorePreferenceNames.CLEANUP_EOL_CODE);
+			if (EOLCode == CommonEncodingPreferenceNames.LF)
+				fRadioButtonConvertEOLUnix.setSelection(true);
+			else if (EOLCode == CommonEncodingPreferenceNames.CR)
+				fRadioButtonConvertEOLMac.setSelection(true);
+			else
+				fRadioButtonConvertEOLWindows.setSelection(true);
+		}
+		enableEOLCodeRadios(fCheckBoxConvertEOLCodes.getSelection());
+	}
+
+	protected void storeOptionsForHTML() {
+		if (!isXHTMLType() && fRadioButtonTagNameCaseUpper.getSelection())
+			getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_TAG_NAME_CASE, HTMLCorePreferenceNames.UPPER);
+		else if (fRadioButtonTagNameCaseLower.getSelection())
+			getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_TAG_NAME_CASE, HTMLCorePreferenceNames.LOWER);
+		else
+			getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_TAG_NAME_CASE, HTMLCorePreferenceNames.ASIS);
+
+		if (!isXHTMLType() && fRadioButtonAttrNameCaseUpper.getSelection())
+			getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_ATTR_NAME_CASE, HTMLCorePreferenceNames.UPPER);
+		else if (fRadioButtonAttrNameCaseLower.getSelection())
+			getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_ATTR_NAME_CASE, HTMLCorePreferenceNames.LOWER);
+		else
+			getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_ATTR_NAME_CASE, HTMLCorePreferenceNames.ASIS);
+
+		// explicitly save plugin preferences so values are stored
+		HTMLCorePlugin.getDefault().savePluginPreferences();
+	}
+
+	protected void storeOptions() {
+		storeOptionsForHTML();
+
+		getModelPreferences().setValue(HTMLCorePreferenceNames.COMPRESS_EMPTY_ELEMENT_TAGS, fCheckBoxCompressEmptyElementTags.getSelection());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.INSERT_REQUIRED_ATTRS, fCheckBoxInsertRequiredAttrs.getSelection());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.INSERT_MISSING_TAGS, fCheckBoxInsertMissingTags.getSelection());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.QUOTE_ATTR_VALUES, fCheckBoxQuoteAttrValues.getSelection());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.FORMAT_SOURCE, fCheckBoxFormatSource.getSelection());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.CONVERT_EOL_CODES, fCheckBoxConvertEOLCodes.getSelection());
+
+		if (fCheckBoxConvertEOLCodes.getSelection()) {
+			if (fRadioButtonConvertEOLUnix.getSelection()) {
+				getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_EOL_CODE, CommonEncodingPreferenceNames.LF);
+			} else if (fRadioButtonConvertEOLMac.getSelection()) {
+				getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_EOL_CODE, CommonEncodingPreferenceNames.CR);
+			} else {
+				getModelPreferences().setValue(HTMLCorePreferenceNames.CLEANUP_EOL_CODE, CommonEncodingPreferenceNames.CRLF);
+			}
+		}
+
+		// explicitly save plugin preferences so values are stored
+		HTMLCorePlugin.getDefault().savePluginPreferences();
+	}
+
+	public void widgetDefaultSelected(SelectionEvent e) {
+		widgetSelected(e);
+	}
+
+	public void widgetSelected(SelectionEvent e) {
+		if (e.widget == fCheckBoxConvertEOLCodes)
+			enableEOLCodeRadios(fCheckBoxConvertEOLCodes.getSelection());
+
+		okButtonEnablement();
+	}
+
+	protected Preferences getModelPreferences() {
+		return HTMLCorePlugin.getDefault().getPluginPreferences();
+	}
+
+	private boolean isXHTMLType() {
+		return fIsXHTML;
+	}
+
+	protected void enableEOLCodeRadios(boolean enable) {
+		if ((fRadioButtonConvertEOLWindows != null) && (fRadioButtonConvertEOLUnix != null) && (fRadioButtonConvertEOLMac != null)) {
+			fRadioButtonConvertEOLWindows.setEnabled(enable);
+			fRadioButtonConvertEOLUnix.setEnabled(enable);
+			fRadioButtonConvertEOLMac.setEnabled(enable);
+
+			if (!fRadioButtonConvertEOLWindows.getSelection() && !fRadioButtonConvertEOLUnix.getSelection() && !fRadioButtonConvertEOLMac.getSelection())
+				fRadioButtonConvertEOLWindows.setSelection(true);
+		}
+	}
+
+	/**
+	 * Enables/disables the tag/attr case radio buttons
+	 */
+	private void enableCaseControls(boolean enable) {
+		fTagNameCase.setEnabled(enable);
+		fRadioButtonTagNameCaseAsis.setEnabled(enable);
+		fRadioButtonTagNameCaseLower.setEnabled(enable);
+		fRadioButtonTagNameCaseUpper.setEnabled(enable);
+
+		fAttrNameCase.setEnabled(enable);
+		fRadioButtonAttrNameCaseAsis.setEnabled(enable);
+		fRadioButtonAttrNameCaseLower.setEnabled(enable);
+		fRadioButtonAttrNameCaseUpper.setEnabled(enable);
+	}
+
+	/**
+	 * Enables/disables OK button
+	 * 
+	 */
+	private void okButtonEnablement() {
+		boolean tagNameCaseCheck = ((fRadioButtonTagNameCaseUpper != null && fRadioButtonTagNameCaseUpper.getSelection()) || fRadioButtonTagNameCaseLower.getSelection());
+		boolean attrNameCaseCheck = ((fRadioButtonAttrNameCaseUpper != null && fRadioButtonAttrNameCaseUpper.getSelection()) || fRadioButtonAttrNameCaseLower.getSelection());
+		boolean eolCheck = fCheckBoxConvertEOLCodes.getSelection() && (fRadioButtonConvertEOLUnix.getSelection() || fRadioButtonConvertEOLMac.getSelection() || fRadioButtonConvertEOLWindows.getSelection());
+		boolean buttonEnabled = false;
+		if (isXHTMLType()){
+			buttonEnabled = fCheckBoxInsertRequiredAttrs.getSelection() || fCheckBoxInsertMissingTags.getSelection() || fCheckBoxQuoteAttrValues.getSelection() || fCheckBoxFormatSource.getSelection() || eolCheck;
+		}
+		else {
+			buttonEnabled = tagNameCaseCheck || attrNameCaseCheck || fCheckBoxInsertRequiredAttrs.getSelection() || fCheckBoxInsertMissingTags.getSelection() || fCheckBoxQuoteAttrValues.getSelection() || fCheckBoxFormatSource.getSelection() || eolCheck;
+		}
+		getButton(IDialogConstants.OK_ID).setEnabled(buttonEnabled);
+	}
+
+	void setisXHTMLType(boolean isXHTML) {
+		fIsXHTML = isXHTML;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupDocumentHandler.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupDocumentHandler.java
new file mode 100644
index 0000000..75c5267
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/edit/ui/CleanupDocumentHandler.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.edit.ui;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.html.core.internal.cleanup.HTMLCleanupProcessorImpl;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+
+public class CleanupDocumentHandler extends AbstractHandler implements IHandler {
+	private IStructuredCleanupProcessor fCleanupProcessor;
+
+	public void dispose() {
+		// nulling out just in case
+		fCleanupProcessor = null;
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editorPart = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editorPart instanceof ITextEditor)
+			textEditor = (ITextEditor) editorPart;
+		else {
+			Object o = editorPart.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+			final ITextEditor editor = textEditor;
+			CleanupDialogHTML cleanupDialog = new CleanupDialogHTML(editor.getSite().getShell());
+			cleanupDialog.setisXHTMLType(isXHTML(editor));
+			if (cleanupDialog.open() == Window.OK) {
+				// setup runnable
+				Runnable runnable = new Runnable() {
+					public void run() {
+						IStructuredCleanupProcessor cleanupProcessor = getCleanupProcessor();
+						if (cleanupProcessor != null) {
+							IStructuredModel model = null;
+							try {
+								model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput()));
+								if (model != null)
+									cleanupProcessor.cleanupModel(model);
+							}
+							finally {
+								if (model != null)
+									model.releaseFromEdit();
+							}
+						}
+					}
+				};
+
+				// TODO: make independent of 'model'.
+				IStructuredModel model = null;
+				try {
+					model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput()));
+					if (model != null) {
+						// begin recording
+						ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+						model.beginRecording(this, SSEUIMessages.Cleanup_Document_UI_, SSEUIMessages.Cleanup_Document_UI_, selection.getOffset(), selection.getLength()); //$NON-NLS-1$ //$NON-NLS-2$
+
+						// tell the model that we are about to make a big
+						// model change
+						model.aboutToChangeModel();
+
+						// run
+						BusyIndicator.showWhile(editor.getEditorSite().getWorkbenchWindow().getShell().getDisplay(), runnable);
+					}
+				}
+				finally {
+					if (model != null) {
+						// tell the model that we are done with the big
+						// model
+						// change
+						model.changedModel();
+
+						// end recording
+						ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+						model.endRecording(this, selection.getOffset(), selection.getLength());
+						model.releaseFromEdit();
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	IStructuredCleanupProcessor getCleanupProcessor() {
+		if (fCleanupProcessor == null)
+			fCleanupProcessor = new HTMLCleanupProcessorImpl();
+
+		return fCleanupProcessor;
+	}
+	
+	private boolean isXHTML(ITextEditor editor) {
+		boolean isxhtml = false;
+		if (editor != null) {
+			IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
+			IStructuredModel model = null;
+			try {
+				model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+				if (model instanceof IDOMModel) {
+					IDOMDocument domDocument = ((IDOMModel) model).getDocument();
+					if (domDocument != null)
+						isxhtml = domDocument.isXMLType();
+				}
+			}
+			finally {
+				if (model != null) {
+					model.releaseFromRead();
+				}
+			}
+		}
+		return isxhtml;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImageHelper.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImageHelper.java
new file mode 100644
index 0000000..ab6450a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImageHelper.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.editor;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+
+
+/**
+ * Helper class to handle images provided by this plug-in.
+ */
+public class HTMLEditorPluginImageHelper {
+	private final String PLUGINID = HTMLUIPlugin.ID;
+	private static HTMLEditorPluginImageHelper instance = null;
+
+	//	 save a descriptor for each image
+	private HashMap fImageDescRegistry = null;
+
+	/**
+	 * Gets the instance.
+	 * 
+	 * @return Returns a HTMLEditorPluginImageHelper
+	 */
+	public synchronized static HTMLEditorPluginImageHelper getInstance() {
+		if (instance == null)
+			instance = new HTMLEditorPluginImageHelper();
+		return instance;
+	}
+
+	/**
+	 * Retrieves the image associated with resource from the image registry.
+	 * If the image cannot be retrieved, attempt to find and load the image at
+	 * the location specified in resource.
+	 * 
+	 * @param resource
+	 *            the image to retrieve
+	 * @return Image the image associated with resource or null if one could
+	 *         not be found
+	 */
+	public Image getImage(String resource) {
+		Image image = getImageRegistry().get(resource);
+		if (image == null) {
+			// create an image
+			image = createImage(resource);
+		}
+		return image;
+	}
+
+	/**
+	 * Retrieves the image descriptor associated with resource from the image
+	 * descriptor registry. If the image descriptor cannot be retrieved,
+	 * attempt to find and load the image descriptor at the location specified
+	 * in resource.
+	 * 
+	 * @param resource
+	 *            the image descriptor to retrieve
+	 * @return ImageDescriptor the image descriptor assocated with resource or
+	 *         the default "missing" image descriptor if one could not be
+	 *         found
+	 */
+	public ImageDescriptor getImageDescriptor(String resource) {
+		ImageDescriptor imageDescriptor = null;
+		Object o = getImageDescriptorRegistry().get(resource);
+		if (o == null) {
+			//create a descriptor
+			imageDescriptor = createImageDescriptor(resource);
+		}
+		else {
+			imageDescriptor = (ImageDescriptor) o;
+		}
+		return imageDescriptor;
+	}
+
+	/**
+	 * Returns the image descriptor registry for this plugin.
+	 * 
+	 * @return HashMap - image descriptor registry for this plugin
+	 */
+	private HashMap getImageDescriptorRegistry() {
+		if (fImageDescRegistry == null)
+			fImageDescRegistry = new HashMap();
+		return fImageDescRegistry;
+	}
+
+	/**
+	 * Returns the image registry for this plugin.
+	 * 
+	 * @return ImageRegistry - image registry for this plugin
+	 */
+	private ImageRegistry getImageRegistry() {
+		return HTMLUIPlugin.getInstance().getImageRegistry();
+	}
+
+	/**
+	 * Creates an image from the given resource and adds the image to the
+	 * image registry.
+	 * 
+	 * @param resource
+	 * @return Image
+	 */
+	private Image createImage(String resource) {
+		ImageDescriptor desc = getImageDescriptor(resource);
+		Image image = null;
+		
+		if (desc != null) {
+			image = desc.createImage();
+			// dont add the missing image descriptor image to the image registry
+			if (!desc.equals(ImageDescriptor.getMissingImageDescriptor()))
+				getImageRegistry().put(resource, image);
+		}
+		return image;
+	}
+
+	/**
+	 * Creates an image descriptor from the given imageFilePath and adds the
+	 * image descriptor to the image descriptor registry. If an image
+	 * descriptor could not be created, the default "missing" image descriptor
+	 * is returned but not added to the image descriptor registry.
+	 * 
+	 * @param imageFilePath
+	 * @return ImageDescriptor image descriptor for imageFilePath or default
+	 *         "missing" image descriptor if resource could not be found
+	 */
+	private ImageDescriptor createImageDescriptor(String imageFilePath) {
+		ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGINID, imageFilePath);
+		if (imageDescriptor != null) {
+			getImageDescriptorRegistry().put(imageFilePath, imageDescriptor);
+		}
+		else {
+			imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
+		}
+
+		return imageDescriptor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImages.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImages.java
new file mode 100644
index 0000000..1fa0f24
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.editor;
+
+/**
+ * Bundle of most images used by the HTML Editor plug-in.
+ */
+public class HTMLEditorPluginImages { 	
+	public static final String IMG_OBJ_TABLE = "icons/full/obj16/table.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_ANCHOR = "icons/full/obj16/tag-anchor.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_BODY = "icons/full/obj16/tag-body.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_BUTTON = "icons/full/obj16/tag-button.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_FONT = "icons/full/obj16/tag-font.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_FORM = "icons/full/obj16/tag-form.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_GENERIC = "icons/full/obj16/tag-generic.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_HTML = "icons/full/obj16/tag-html.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_IMAGE_MAP = "icons/full/obj16/tag-image-map.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_IMAGE = "icons/full/obj16/tag-image.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_JSP = "icons/full/obj16/tag-jsp.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_TEMPLATE = "icons/full/obj16/tag-template.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_TITLE = "icons/full/obj16/tag-title.gif";			//$NON-NLS-1$
+	public static final String IMG_OBJ_TAG = "icons/full/obj16/tag.gif";			//$NON-NLS-1$
+	public static final String IMG_WIZBAN_NEWHTMLFILE = "icons/full/wizban/newhfile_wiz.png";			//$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/IHelpContextIds.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/IHelpContextIds.java
new file mode 100644
index 0000000..569b724
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/IHelpContextIds.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.editor;
+
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+
+/**
+ * Help context ids for the HTML Source Editor.
+ * <p>
+ * This interface contains constants only; it is not intended to be implemented.
+ * </p>
+ * 
+ */
+public interface IHelpContextIds {
+	// org.eclipse.wst.html.ui.
+	public static final String PREFIX = HTMLUIPlugin.ID + "."; //$NON-NLS-1$
+
+	// // figured out on the fly
+	// // HTML Source page editor
+	// public static final String HTML_SOURCEVIEW_HELPID =
+	// ContentTypeIdForHTML.ContentTypeID_HTML +"_source_HelpId";
+	// //$NON-NLS-1$
+	
+	// HTML Files Preference page
+	public static final String HTML_PREFWEBX_FILES_HELPID = PREFIX + "webx0030"; //$NON-NLS-1$
+	// HTML Source Preference page
+	public static final String HTML_PREFWEBX_SOURCE_HELPID = PREFIX + "webx0031"; //$NON-NLS-1$
+	// HTML Styles Preference page
+	public static final String HTML_PREFWEBX_STYLES_HELPID = PREFIX + "webx0032"; //$NON-NLS-1$
+	// HTML Templates Preference page
+	public static final String HTML_PREFWEBX_TEMPLATES_HELPID = PREFIX + "webx0033"; //$NON-NLS-1$
+		
+	// HTML Cleanup dialog
+	public static final String CLEANUP_HTML_HELPID = PREFIX + "xmlm1100"; //$NON-NLS-1$
+	
+	// HTML Content Settings
+	public static final String WEB_CONTENT_SETTINGS_HELPID = PREFIX + "misc0170"; //$NON-NLS-1$
+	
+	// HTML New File Wizard - Template Page
+	public static final String HTML_NEWWIZARD_TEMPLATE_HELPID = PREFIX + "htmlw0010"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/handlers/HTMLFindOccurrencesHandler.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/handlers/HTMLFindOccurrencesHandler.java
new file mode 100644
index 0000000..68cc317
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/handlers/HTMLFindOccurrencesHandler.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.handlers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.html.ui.internal.search.HTMLFindOccurrencesProcessor;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesProcessor;
+import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil;
+
+public class HTMLFindOccurrencesHandler extends AbstractHandler implements IHandler {
+	private List fProcessors;
+
+	
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		boolean okay = false;
+		
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		
+		if (textEditor != null) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null) {
+				ITextSelection textSelection = getTextSelection(textEditor);
+				FindOccurrencesProcessor findOccurrenceProcessor = getProcessorForCurrentSelection(document, textSelection);
+				if (findOccurrenceProcessor != null) {
+					if (textEditor.getEditorInput() instanceof IFileEditorInput) {
+						IFile file = ((IFileEditorInput) textEditor.getEditorInput()).getFile();
+						okay = findOccurrenceProcessor.findOccurrences(document, textSelection, file);
+					}
+				}
+			}
+		}
+		if (okay) {
+			// clear status message
+			PlatformStatusLineUtil.clearStatusLine();
+		}
+		else {
+			String errorMessage = SSEUIMessages.FindOccurrencesActionProvider_0; //$NON-NLS-1$
+			if (textEditor instanceof StructuredTextEditor) {
+				PlatformStatusLineUtil.displayTemporaryErrorMessage(((StructuredTextEditor) textEditor).getTextViewer(), errorMessage);
+			}
+			else {
+				PlatformStatusLineUtil.displayErrorMessage(errorMessage);
+				PlatformStatusLineUtil.addOneTimeClearListener();
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * Get the appropriate find occurrences processor
+	 * 
+	 * @param document -
+	 *            assumes not null
+	 * @param textSelection
+	 * @return
+	 */
+	private FindOccurrencesProcessor getProcessorForCurrentSelection(IDocument document, ITextSelection textSelection) {
+		// check if we have an action that's enabled on the current partition
+		ITypedRegion tr = getPartition(document, textSelection);
+		String partition = tr != null ? tr.getType() : ""; //$NON-NLS-1$
+
+		Iterator it = getProcessors().iterator();
+		FindOccurrencesProcessor processor = null;
+		while (it.hasNext()) {
+			processor = (FindOccurrencesProcessor) it.next();
+			// we just choose the first action that can handle the partition
+			if (processor.enabledForParitition(partition))
+				return processor;
+		}
+
+		List extendedFindOccurrencesProcessors = ExtendedConfigurationBuilder.getInstance().getConfigurations(FindOccurrencesProcessor.class.getName(), partition);
+		for (int i = 0; i < extendedFindOccurrencesProcessors.size(); i++) {
+			Object o = extendedFindOccurrencesProcessors.get(i);
+			if (o instanceof FindOccurrencesProcessor) {
+				/*
+				 * We just choose the first registered processor that
+				 * explicitly says it can handle the partition
+				 */
+				processor = (FindOccurrencesProcessor) o;
+				if (processor.enabledForParitition(partition))
+					return processor;
+			}
+		}
+		return null;
+	}
+	
+	private ITypedRegion getPartition(IDocument document, ITextSelection textSelection) {
+		ITypedRegion region = null;
+		if (textSelection != null) {
+			try {
+				region = document.getPartition(textSelection.getOffset());
+			}
+			catch (BadLocationException e) {
+				region = null;
+			}
+		}
+		return region;
+	}
+	
+	private ITextSelection getTextSelection(ITextEditor textEditor) {
+		ITextSelection textSelection = null;
+		ISelection selection = textEditor.getSelectionProvider().getSelection();
+		if (selection instanceof ITextSelection && !selection.isEmpty()) {
+			textSelection = (ITextSelection) selection;
+		}
+		return textSelection;
+	}
+	
+	protected List getProcessors() {
+		if (fProcessors == null) {
+			fProcessors = new ArrayList();
+			HTMLFindOccurrencesProcessor htmlProcessor = new HTMLFindOccurrencesProcessor();
+			fProcessors.add(htmlProcessor);
+		}
+		return fProcessors;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/hyperlink/AnchorHyperlinkDetector.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/hyperlink/AnchorHyperlinkDetector.java
new file mode 100644
index 0000000..4d8ab98
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/hyperlink/AnchorHyperlinkDetector.java
@@ -0,0 +1,511 @@
+/*******************************************************************************

+ * Copyright (c) 2008 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.wst.html.ui.internal.hyperlink;

+

+import java.util.ArrayList;

+import java.util.List;

+import java.util.NoSuchElementException;

+

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IMarker;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.IStatus;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.core.runtime.Status;

+import org.eclipse.core.runtime.jobs.Job;

+import org.eclipse.jface.text.BadLocationException;

+import org.eclipse.jface.text.IDocument;

+import org.eclipse.jface.text.IRegion;

+import org.eclipse.jface.text.ITextViewer;

+import org.eclipse.jface.text.ITextViewerExtension5;

+import org.eclipse.jface.text.Region;

+import org.eclipse.jface.text.TextSelection;

+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;

+import org.eclipse.jface.text.hyperlink.IHyperlink;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.PlatformUI;

+import org.eclipse.ui.ide.IDE;

+import org.eclipse.ui.progress.UIJob;

+import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;

+import org.eclipse.wst.html.core.internal.validate.ModuleCoreSupport;

+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;

+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;

+import org.eclipse.wst.html.ui.internal.Logger;

+import org.eclipse.wst.sse.core.StructuredModelManager;

+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;

+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;

+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;

+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;

+import org.eclipse.wst.sse.core.utils.StringUtils;

+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;

+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;

+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;

+import org.w3c.dom.Element;

+import org.w3c.dom.Node;

+import org.w3c.dom.NodeList;

+

+import com.ibm.icu.util.StringTokenizer;

+

+public class AnchorHyperlinkDetector extends AbstractHyperlinkDetector {

+	static class ExternalElementHyperlink implements IHyperlink {

+		private String fAnchorName = null;

+		private Element fBaseElement = null;

+		private Display fDisplay = null;

+		private IRegion fHyperlinkRegion = null;

+

+		/**

+		 * @param hyperlinkRegion

+		 * @param anchorName

+		 */

+		public ExternalElementHyperlink(Display display, IRegion hyperlinkRegion, String anchorName, Element baseElement) {

+			super();

+			fDisplay = display;

+			fHyperlinkRegion = hyperlinkRegion;

+			fAnchorName = anchorName;

+			fBaseElement = baseElement;

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#open()

+		 */

+		IStatus _open() {

+			if (fBaseElement instanceof IDOMNode) {

+				StringTokenizer tokenizer = new StringTokenizer(fAnchorName, "#"); //$NON-NLS-1$

+				String filename = null;

+				String anchorName = null;

+				if (tokenizer.hasMoreTokens()) {

+					try {

+						filename = tokenizer.nextToken();

+						anchorName = tokenizer.nextToken();

+					}

+					catch (NoSuchElementException e) {

+						// poorly formed value

+					}

+				}

+				if (filename != null && anchorName != null) {

+					// System.out.println(filename + ":" + anchorName + "-" +

+					// fBaseElement);

+

+					IPath basePath = new Path(((IDOMNode) fBaseElement).getModel().getBaseLocation());

+					if (basePath.segmentCount() > 1) {

+						IPath resolved = ModuleCoreSupport.resolve(basePath, filename);

+						IFile targetFile = ResourcesPlugin.getWorkspace().getRoot().getFile(resolved);

+						if (targetFile.isAccessible()) {

+							IStructuredModel model = null;

+							int start = -1;

+							int end = -1;

+							try {

+								model = StructuredModelManager.getModelManager().getModelForRead(targetFile);

+								if (model instanceof IDOMModel) {

+									NodeList anchors = ((IDOMModel) model).getDocument().getElementsByTagNameNS("*", HTML40Namespace.ElementName.A); //$NON-NLS-1$

+									for (int i = 0; i < anchors.getLength() && start < 0; i++) {

+										Node item = anchors.item(i);

+										Node nameNode = item.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_NAME);

+										if (nameNode == null)

+											nameNode = item.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_ID);

+										if (nameNode != null) {

+											String name = nameNode.getNodeValue();

+											if (anchorName.equals(name) && nameNode instanceof IndexedRegion) {

+												start = ((IndexedRegion) nameNode).getStartOffset();

+												end = ((IndexedRegion) nameNode).getEndOffset();

+											}

+										}

+									}

+									anchors = ((IDOMModel) model).getDocument().getElementsByTagName(HTML40Namespace.ElementName.A);

+									for (int i = 0; i < anchors.getLength() && start < 0; i++) {

+										Node item = anchors.item(i);

+										Node nameNode = item.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_NAME);

+										if (nameNode == null)

+											nameNode = item.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_ID);

+										if (nameNode != null) {

+											String name = nameNode.getNodeValue();

+											if (anchorName.equals(name) && nameNode instanceof IndexedRegion) {

+												start = ((IndexedRegion) nameNode).getStartOffset();

+												end = ((IndexedRegion) nameNode).getEndOffset();

+											}

+										}

+									}

+

+									anchors = ((IDOMModel) model).getDocument().getElementsByTagName("*"); //$NON-NLS-1$

+									for (int i = 0; i < anchors.getLength() && start < 0; i++) {

+										Node item = anchors.item(i);

+										Node nameNode = item.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_NAME);

+										if (nameNode == null)

+											nameNode = item.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_ID);

+										if (nameNode != null) {

+											String name = nameNode.getNodeValue();

+											if (anchorName.equals(name) && nameNode instanceof IndexedRegion) {

+												start = ((IndexedRegion) nameNode).getStartOffset();

+												end = ((IndexedRegion) nameNode).getEndOffset();

+											}

+										}

+									}

+

+								}

+								return open(basePath.toString(), targetFile, start, end);

+							}

+							catch (Exception e) {

+								Logger.logException(e);

+								return new Status(IStatus.ERROR, HTMLUIPlugin.ID, e.getMessage());

+

+							}

+							finally {

+								if (model != null)

+									model.releaseFromRead();

+							}

+						}

+					}

+				}

+			}

+			return Status.OK_STATUS;

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see

+		 * org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkRegion()

+		 */

+		public IRegion getHyperlinkRegion() {

+			return fHyperlinkRegion;

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()

+		 */

+		public String getHyperlinkText() {

+			return NLS.bind(HTMLUIMessages.Open, fAnchorName);

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()

+		 */

+		public String getTypeLabel() {

+			return null;

+		}

+

+		public void open() {

+			scheduleOpen();

+		}

+

+		/**

+		 * @param targetFile

+		 * @param start

+		 * @param end

+		 */

+		private IStatus open(String base, IFile targetFile, int start, int end) throws CoreException, PartInitException {

+			IMarker temporaryMarker = null;

+			try {

+				IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();

+

+				IEditorPart editor = IDE.openEditor(page, targetFile);

+

+				if (0 <= start && start <= end) {

+					temporaryMarker = targetFile.createMarker(IMarker.BOOKMARK);

+					temporaryMarker.setAttribute(IMarker.MESSAGE, base);

+					temporaryMarker.setAttribute(IMarker.CHAR_START, start);

+					temporaryMarker.setAttribute(IMarker.CHAR_END, end);

+					IDE.gotoMarker(editor, temporaryMarker);

+				}

+				return Status.OK_STATUS;

+			}

+			finally {

+				if (temporaryMarker != null)

+					try {

+						temporaryMarker.delete();

+					}

+					catch (CoreException e) {

+						Logger.logException(e);

+					}

+			}

+		}

+

+		void scheduleOpen() {

+			Job opener = new UIJob(fDisplay, fAnchorName) {

+				public IStatus runInUIThread(IProgressMonitor monitor) {

+					return _open();

+				}

+

+			};

+			opener.setSystem(true);

+			opener.setUser(false);

+			opener.schedule();

+		}

+	}

+

+	/**

+	 * Links to the given target node within the text viewer. The target node

+	 * is expected to implement IndexedNode and appear in that text viewer

+	 * (i.e. same editor).

+	 * 

+	 */

+	static class InternalElementHyperlink implements IHyperlink {

+		private IRegion fHyperlinkRegion;

+		private Node fTarget = null;

+		private ITextViewer fViewer = null;

+

+		/**

+		 * 

+		 */

+		public InternalElementHyperlink(ITextViewer textViewer, IRegion hyperlinkRegion, Node targetNode) {

+			fHyperlinkRegion = hyperlinkRegion;

+			fTarget = targetNode;

+			fViewer = textViewer;

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see

+		 * org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkRegion()

+		 */

+		public IRegion getHyperlinkRegion() {

+			return fHyperlinkRegion;

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()

+		 */

+		public String getHyperlinkText() {

+			if (fTarget instanceof IndexedRegion) {

+				try {

+					int line = fViewer.getDocument().getLineOfOffset(((IndexedRegion) fTarget).getStartOffset()) + 1;

+					return NLS.bind(HTMLUIMessages.Hyperlink_line, new String[]{fTarget.getNodeName(), fTarget.getNodeValue(), String.valueOf(line)});

+				}

+				catch (BadLocationException e) {

+					Logger.logException(e);

+				}

+			}

+			return NLS.bind(HTMLUIMessages.Open, fTarget.getNodeName());

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()

+		 */

+		public String getTypeLabel() {

+			return null;

+		}

+

+		/*

+		 * (non-Javadoc)

+		 * 

+		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#open()

+		 */

+		public void open() {

+			if (fTarget instanceof IndexedRegion) {

+				int offset = ((IndexedRegion) fTarget).getStartOffset();

+				if (fViewer instanceof ITextViewerExtension5) {

+					offset = ((ITextViewerExtension5) fViewer).modelOffset2WidgetOffset(offset);

+				}

+				fViewer.getSelectionProvider().setSelection(new TextSelection(offset, 0));

+				fViewer.revealRange(offset, 0);

+			}

+		}

+	}

+

+	public AnchorHyperlinkDetector() {

+		super();

+	}

+

+	private void addHyperLinkForHref(ITextViewer textViewer, IRegion linkRegion, Element element, String hrefValue, List links, Node anchor) {

+		Node nameNode = anchor.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_HREF);

+		if (nameNode != null) {

+			String name = nameNode.getNodeValue();

+			if (hrefValue.equals(name) && nameNode instanceof IndexedRegion) {

+				links.add(new InternalElementHyperlink(textViewer, linkRegion, nameNode));

+			}

+		}

+	}

+

+	private void addHyperLinkForName(ITextViewer textViewer, IRegion linkRegion, Element element, String anchorName, List links, Node anchor) {

+		Node nameNode = anchor.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_NAME);

+		if (nameNode != null) {

+			String name = nameNode.getNodeValue();

+			if (anchorName.equals(name) && nameNode instanceof IndexedRegion) {

+				links.add(new InternalElementHyperlink(textViewer, linkRegion, nameNode));

+			}

+		}

+		nameNode = anchor.getAttributes().getNamedItem(HTML40Namespace.ATTR_NAME_ID);

+		if (nameNode != null) {

+			String name = nameNode.getNodeValue();

+			if (anchorName.equals(name) && nameNode instanceof IndexedRegion) {

+				links.add(new InternalElementHyperlink(textViewer, linkRegion, nameNode));

+			}

+		}

+	}

+

+	/**

+	 * @param documentRegion

+	 * @param valueRegion

+	 * @return

+	 */

+	private IRegion createHyperlinkRegion(IStructuredDocumentRegion documentRegion, ITextRegion valueRegion) {

+		return new Region(documentRegion.getStartOffset(valueRegion), valueRegion.getTextLength());

+	}

+

+	// link to anchors with the given name (value includes the '#')

+	IHyperlink[] createHyperlinksToAnchorNamed(ITextViewer textViewer, IRegion hyperlinkRegion, Element element, String anchorName, boolean canShowMultipleHyperlinks) {

+		List links = new ArrayList(1);

+		// >1 guards the substring-ing

+		if (anchorName.length() > 1 && anchorName.startsWith("#")) { //$NON-NLS-1$

+			// an anchor in this document

+			NodeList anchors = null;//element.getOwnerDocument().getElementsByTagNameNS("*", HTML40Namespace.ElementName.A); //$NON-NLS-1$

+			String internalAnchorName = anchorName.substring(1);

+//			for (int i = 0; i < anchors.getLength(); i++) {

+//				addHyperLinkForName(textViewer, hyperlinkRegion, element, internalAnchorName, links, anchors.item(i));

+//			}

+//			anchors = element.getOwnerDocument().getElementsByTagName(HTML40Namespace.ElementName.A);

+//			for (int i = 0; i < anchors.getLength(); i++) {

+//				addHyperLinkForName(textViewer, hyperlinkRegion, element, internalAnchorName, links, anchors.item(i));

+//			}

+			anchors = element.getOwnerDocument().getElementsByTagName("*"); //$NON-NLS-1$

+			for (int i = 0; i < anchors.getLength(); i++) {

+				addHyperLinkForName(textViewer, hyperlinkRegion, element, internalAnchorName, links, anchors.item(i));

+			}

+		}

+		else {

+			// another file, possibly very slow to compute ahead of time

+			links.add(new ExternalElementHyperlink(textViewer.getTextWidget().getDisplay(), hyperlinkRegion, anchorName, element));

+		}

+		if (!links.isEmpty()) {

+			return (IHyperlink[]) links.toArray(new IHyperlink[links.size()]);

+		}

+		return null;

+	}

+

+	// link to anchors that link to this target

+	IHyperlink[] createReferrerHyperlinks(ITextViewer textViewer, IRegion hyperlinkRegion, Element element, String nameValue, boolean canShowMultipleHyperlinks) {

+		List links = new ArrayList(1);

+		if (nameValue.length() > 0) {

+			String target = "#" + nameValue; //$NON-NLS-1$

+			NodeList anchors = null;//element.getOwnerDocument().getElementsByTagNameNS("*", HTML40Namespace.ElementName.A); //$NON-NLS-1$

+//			for (int i = 0; i < anchors.getLength(); i++) {

+//				addHyperLinkForHref(textViewer, hyperlinkRegion, element, target, links, anchors.item(i));

+//			}

+//			anchors = element.getOwnerDocument().getElementsByTagName(HTML40Namespace.ElementName.A);

+//			for (int i = 0; i < anchors.getLength(); i++) {

+//				addHyperLinkForHref(textViewer, hyperlinkRegion, element, target, links, anchors.item(i));

+//			}

+			anchors = element.getOwnerDocument().getElementsByTagName("*"); //$NON-NLS-1$

+			for (int i = 0; i < anchors.getLength(); i++) {

+				addHyperLinkForHref(textViewer, hyperlinkRegion, element, target, links, anchors.item(i));

+			}

+		}

+		if (!links.isEmpty()) {

+			return (IHyperlink[]) links.toArray(new IHyperlink[links.size()]);

+		}

+		return null;

+	}

+

+	public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {

+		if (textViewer != null && region != null) {

+			IDocument document = textViewer.getDocument();

+			if (document != null) {

+				Node currentNode = getCurrentNode(document, region.getOffset());

+				if (currentNode != null && currentNode.getNodeType() == Node.ELEMENT_NODE) {

+					Element element = (Element) currentNode;

+						IStructuredDocumentRegion documentRegion = ((IStructuredDocument) document).getRegionAtCharacterOffset(region.getOffset());

+						ITextRegion textRegion = documentRegion.getRegionAtCharacterOffset(region.getOffset());

+						ITextRegion nameRegion = null;

+						ITextRegion valueRegion = null;

+						String name = null;

+						String value = null;

+						if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(textRegion.getType())) {

+							ITextRegionList regions = documentRegion.getRegions();

+							/*

+							 * Could use 2, but there needs to be the tag open

+							 * and name regions

+							 */

+							int index = regions.indexOf(textRegion);

+							if (index >= 4) {

+								nameRegion = regions.get(index - 2);

+								valueRegion = textRegion;

+								name = documentRegion.getText(nameRegion);

+								value = StringUtils.strip(documentRegion.getText(valueRegion));

+							}

+						}

+						else if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(textRegion.getType())) {

+							ITextRegionList regions = documentRegion.getRegions();

+							int index = regions.indexOf(textRegion);

+							// minus 3 to leave equal and value regions

+							if (index <= regions.size() - 3) {

+								nameRegion = textRegion;

+								valueRegion = regions.get(index + 2);

+								name = documentRegion.getText(nameRegion);

+								value = StringUtils.strip(documentRegion.getText(valueRegion));

+							}

+						}

+						if (name != null && value != null) {

+							if (HTML40Namespace.ATTR_NAME_HREF.equalsIgnoreCase(name) && value.indexOf("#") >= 0) { //$NON-NLS-1$

+								return createHyperlinksToAnchorNamed(textViewer, createHyperlinkRegion(documentRegion, valueRegion), element, value, canShowMultipleHyperlinks);

+							}

+							if (HTML40Namespace.ATTR_NAME_NAME.equalsIgnoreCase(name)||HTML40Namespace.ATTR_NAME_ID.equalsIgnoreCase(name)) {

+								return createReferrerHyperlinks(textViewer, createHyperlinkRegion(documentRegion, valueRegion), element, value, canShowMultipleHyperlinks);

+							}

+						}

+				}

+			}

+		}

+		return null;

+	}

+

+	/**

+	 * Returns the node the cursor is currently on in the document. null if no

+	 * node is selected

+	 * 

+	 * @param offset

+	 * @return Node either element, doctype, text, or null

+	 */

+	private Node getCurrentNode(IDocument document, int offset) {

+		// get the current node at the offset (returns either: element,

+		// doctype, text)

+		IndexedRegion inode = null;

+		IStructuredModel sModel = null;

+		try {

+			sModel = StructuredModelManager.getModelManager().getExistingModelForRead(document);

+			if (sModel != null) {

+				inode = sModel.getIndexedRegion(offset);

+				if (inode == null) {

+					inode = sModel.getIndexedRegion(offset - 1);

+				}

+			}

+		}

+		finally {

+			if (sModel != null)

+				sModel.releaseFromRead();

+		}

+

+		if (inode instanceof Node) {

+			return (Node) inode;

+		}

+		return null;

+	}

+}

diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLCompletionProposalCategoriesConfiguration.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLCompletionProposalCategoriesConfiguration.java
new file mode 100644
index 0000000..11cb1d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLCompletionProposalCategoriesConfiguration.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 20109 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration;
+
+/**
+ * <p>The readable and writable completion proposal categories configuration
+ * for the HTML content type</p>
+ */
+public class HTMLCompletionProposalCategoriesConfiguration extends AbstractCompletionProposalCategoriesConfiguration {
+
+	/** the ID of the preference page where users can change the preferences */
+	private static final String PREFERENCES_PAGE_ID = "org.eclipse.wst.html.ui.preferences.contentassist"; //$NON-NLS-1$
+	
+	/**
+	 * <p>Creates the configuration</p>
+	 */
+	public HTMLCompletionProposalCategoriesConfiguration() {
+		//nothing to do.
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getPreferenceStore()
+	 */
+	protected IPreferenceStore getPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#hasAssociatedPropertiesPage()
+	 */
+	public boolean hasAssociatedPropertiesPage() {
+		return true;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#getPropertiesPageID()
+	 */
+	public String getPropertiesPageID() {
+		return PREFERENCES_PAGE_ID;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getShouldNotDisplayOnDefaultPagePrefKey()
+	 */
+	protected String getShouldNotDisplayOnDefaultPagePrefKey() {
+		return HTMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_DEFAULT_PAGE;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getShouldNotDisplayOnOwnPagePrefKey()
+	 */
+	protected String getShouldNotDisplayOnOwnPagePrefKey() {
+		return HTMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_OWN_PAGE;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getPageSortOrderPrefKey()
+	 */
+	protected String getPageSortOrderPrefKey() {
+		return HTMLUIPreferenceNames.CONTENT_ASSIST_OWN_PAGE_SORT_ORDER;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getDefaultPageSortOrderPrefKey()
+	 */
+	protected String getDefaultPageSortOrderPrefKey() {
+		return HTMLUIPreferenceNames.CONTENT_ASSIST_DEFAULT_PAGE_SORT_ORDER;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLUIPreferenceInitializer.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLUIPreferenceInitializer.java
new file mode 100644
index 0000000..6ddbb67
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLUIPreferenceInitializer.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference      
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.style.IStyleConstantsHTML;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper;
+import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML;
+
+/**
+ * Sets default values for HTML UI preferences
+ */
+public class HTMLUIPreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	public void initializeDefaultPreferences() {
+		IPreferenceStore store = HTMLUIPlugin.getDefault().getPreferenceStore();
+		ColorRegistry registry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry();
+		
+		store.setDefault(HTMLUIPreferenceNames.AUTO_PROPOSE, true);
+		store.setDefault(HTMLUIPreferenceNames.AUTO_PROPOSE_CODE, "<=");//$NON-NLS-1$
+
+		// HTML Style Preferences
+		String NOBACKGROUNDBOLD = " | null | false"; //$NON-NLS-1$
+		String JUSTITALIC = " | null | false | true"; //$NON-NLS-1$
+		String styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_ATTRIBUTE_NAME, 127, 0, 127) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.TAG_ATTRIBUTE_NAME, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_ATTRIBUTE_VALUE, 42, 0, 255) + JUSTITALIC;
+		store.setDefault(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE, styleValue);
+
+		styleValue = "null" + NOBACKGROUNDBOLD; //$NON-NLS-1$
+		store.setDefault(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS, styleValue); // specified value is black; leaving as widget default
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.COMMENT_BORDER, 63, 95, 191) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.COMMENT_BORDER, styleValue);
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.COMMENT_TEXT, 63, 95, 191) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.COMMENT_TEXT, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DECL_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DECL_BORDER, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_NAME, 0, 0, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_NAME, styleValue);
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF, 0, 0, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID, 128, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF, 63, 127, 95) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF, styleValue);
+
+		styleValue = "null" + NOBACKGROUNDBOLD; //$NON-NLS-1$
+		store.setDefault(IStyleConstantsXML.XML_CONTENT, styleValue);	// specified value is black; leaving as widget default
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.TAG_BORDER, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_NAME, 63, 127, 127) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.TAG_NAME, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.PI_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.PI_BORDER, styleValue);
+
+		styleValue = "null" + NOBACKGROUNDBOLD; //$NON-NLS-1$
+		store.setDefault(IStyleConstantsXML.PI_CONTENT, styleValue);	// specified value is black; leaving as widget default
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.CDATA_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.CDATA_BORDER, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.CDATA_TEXT, 0, 0, 0) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.CDATA_TEXT, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsHTML.SCRIPT_AREA_BORDER, 191, 95, 63) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsHTML.SCRIPT_AREA_BORDER, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.ENTITY_REFERENCE, 42, 0, 255) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.ENTITY_REFERENCE, styleValue);
+
+		// set default new html file template to use in new file wizard
+		/*
+		 * Need to find template name that goes with default template id (name
+		 * may change for different language)
+		 */
+		store.setDefault(HTMLUIPreferenceNames.NEW_FILE_TEMPLATE_ID, "org.eclipse.wst.html.ui.templates.html"); //$NON-NLS-1$
+		
+		// Defaults for the Typing preference page
+		store.setDefault(HTMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS, true);
+		store.setDefault(HTMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS, true);
+		store.setDefault(HTMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS, true);
+		store.setDefault(HTMLUIPreferenceNames.TYPING_REMOVE_END_TAGS, true);
+		store.setDefault(HTMLUIPreferenceNames.TYPING_CLOSE_STRINGS, true);
+		store.setDefault(HTMLUIPreferenceNames.TYPING_CLOSE_BRACKETS, true);
+		
+		// Defaults for Content Assist preference page
+		store.setDefault(HTMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_DEFAULT_PAGE, "");
+		store.setDefault(HTMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_OWN_PAGE, "");
+		store.setDefault(HTMLUIPreferenceNames.CONTENT_ASSIST_DEFAULT_PAGE_SORT_ORDER,
+				"org.eclipse.wst.html.ui.proposalCategory.htmlTags\0" +
+				"org.eclipse.wst.css.ui.proposalCategory.css\0" +
+				"org.eclipse.wst.html.ui.proposalCategory.htmlTemplates\0" +
+				"org.eclipse.wst.css.ui.proposalCategory.cssTemplates");
+		store.setDefault(HTMLUIPreferenceNames.CONTENT_ASSIST_OWN_PAGE_SORT_ORDER,
+				"org.eclipse.wst.html.ui.proposalCategory.htmlTemplates\0"+
+				"org.eclipse.wst.css.ui.proposalCategory.cssTemplates\0" +
+				"org.eclipse.wst.html.ui.proposalCategory.htmlTags\0" +
+				"org.eclipse.wst.css.ui.proposalCategory.css");
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLUIPreferenceNames.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLUIPreferenceNames.java
new file mode 100644
index 0000000..4f8b012
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/HTMLUIPreferenceNames.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences;
+
+/**
+ * Preference keys for HTML UI
+ */
+public class HTMLUIPreferenceNames {
+	/**
+	 * A named preference that controls if code assist gets auto activated.
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 */
+	public static final String AUTO_PROPOSE = getAutoProposeKey();
+
+	private static String getAutoProposeKey() {
+		return "autoPropose";//$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that holds the characters that auto activate code
+	 * assist.
+	 * <p>
+	 * Value is of type <code>String</code>. All characters that trigger
+	 * auto code assist.
+	 * </p>
+	 */
+	public static final String AUTO_PROPOSE_CODE = getAutoProposeCodeKey();
+
+	private static String getAutoProposeCodeKey() {
+		return "autoProposeCode";//$NON-NLS-1$
+	}
+
+	/**
+	 * The key to store customized templates.
+	 * <p>
+	 * Value is of type <code>String</code>.
+	 * </p>
+	 */
+	public static final String TEMPLATES_KEY = getTemplatesKey();
+
+	private static String getTemplatesKey() {
+		return "org.eclipse.wst.sse.ui.custom_templates"; //$NON-NLS-1$
+	}
+	
+	/**
+	 * The key to store the last template name used in new HTML file wizard.
+	 * Template name is stored instead of template id because user-created
+	 * templates do not have template ids.
+	 * <p>
+	 * Value is of type <code>String</code>.
+	 * </p>
+	 */
+	public static final String NEW_FILE_TEMPLATE_NAME = "newFileTemplateName"; //$NON-NLS-1$
+
+	/**
+	 * The initial template ID to be used in the new HTML file wizard. In the absence
+	 * of {@link NEW_FILE_TEMPLATE_NAME}, this ID is used to find a template name
+	 */
+	public static final String NEW_FILE_TEMPLATE_ID = "newFileTemplateId"; //$NON-NLS-1$
+
+	/**
+	 * The key to store the option for auto-completing comments while
+	 * typing.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_COMPLETE_COMMENTS = "completeComments"; //$NON-NLS-1$
+	
+	/**
+	 * The key to store the option for auto-completing end-tags after entering
+	 * <code>&lt;/</code>
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_COMPLETE_END_TAGS = "completeEndTags"; //$NON-NLS-1$
+	
+	/**
+	 * The key to store the option for auto-completing the element after entering
+	 * <code>&gt;</code>
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_COMPLETE_ELEMENTS = "completeElements"; //$NON-NLS-1$
+	
+	/**
+	 * The key to store the option for removing an end-tag if the start tag is
+	 * converted to an empty-tag.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_REMOVE_END_TAGS = "removeEndTags"; //$NON-NLS-1$
+
+	/**
+	 * The key to store the option for auto-completing strings (" and ') while
+	 * typing.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_CLOSE_STRINGS = "closeStrings"; //$NON-NLS-1$
+
+	/**
+	 * The key to store the option for auto-completing brackets ([ and () while
+	 * typing.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_CLOSE_BRACKETS = "closeBrackets"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key used for saving which categories should not display on the default page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>), ordered is ignored</p>
+	 */
+	public static final String CONTENT_ASSIST_DO_NOT_DISPLAY_ON_DEFAULT_PAGE = "html_content_assist_display_on_default_page"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key used for saving which categories should not display on their own page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>), order is ignored</p>
+	 */
+	public static final String CONTENT_ASSIST_DO_NOT_DISPLAY_ON_OWN_PAGE = "html_content_assist_display_on_own_page"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key for saving the sort order of the categories when displaying them on their own page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>) in the desired sort order.</p>
+	 */
+	public static final String CONTENT_ASSIST_OWN_PAGE_SORT_ORDER= "html_content_assist_own_page_sort_order"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key for saving the sort order of the categories when displaying them on the default page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>) in the desired sort order.</p>
+	 */
+	public static final String CONTENT_ASSIST_DEFAULT_PAGE_SORT_ORDER= "html_content_assist_default_page_sort_order"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/AbstractValidationSettingsPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/AbstractValidationSettingsPage.java
new file mode 100644
index 0000000..f2ab08d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/AbstractValidationSettingsPage.java
@@ -0,0 +1,400 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.sse.core.internal.validate.ValidationMessage;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ScrolledPageContent;
+import org.eclipse.wst.validation.ValidationFramework;
+import org.osgi.service.prefs.BackingStoreException;
+
+/**
+ * Based on org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock
+ */
+abstract class AbstractValidationSettingsPage extends PropertyPreferencePage {
+
+	private List fCombos;
+	private List fExpandables;
+	
+	private SelectionListener fSelectionListener;
+	
+	private IPreferencesService fPreferencesService = null;
+	
+	private static final String SETTINGS_EXPANDED = "expanded"; //$NON-NLS-1$
+	
+	private ValidationFramework fValidation;
+	
+	private class ComboData {
+		private String fKey;
+		private int[] fSeverities;
+		private int fIndex;
+		int originalSeverity = -2;
+		
+		public ComboData(String key, int[] severities, int index) {
+			fKey = key;
+			fSeverities = severities;
+			fIndex = index;
+		}
+		
+		public String getKey() {
+			return fKey;
+		}
+		
+		public void setIndex(int index) {
+			fIndex = index;
+		}
+		
+		public int getIndex() {
+			return fIndex;
+		}
+		
+		/**
+		 * Sets the severity index based on <code>severity</code>.
+		 * If the severity doesn't exist, the index is set to -1.
+		 * 
+		 * @param severity the severity level
+		 */
+		public void setSeverity(int severity) {
+			for(int i = 0; fSeverities != null && i < fSeverities.length; i++) {
+				if(fSeverities[i] == severity) {
+					fIndex = i;
+					return;
+				}
+			}
+			
+			fIndex = -1;
+		}
+		
+		public int getSeverity() {
+			return (fIndex >= 0 && fSeverities != null && fIndex < fSeverities.length) ? fSeverities[fIndex] : -1;
+		}
+		
+		boolean isChanged() {
+			return fSeverities[fIndex] != originalSeverity;
+		}
+	}
+	
+	public AbstractValidationSettingsPage() {
+		super();
+		fCombos = new ArrayList();
+		fExpandables = new ArrayList();
+		fPreferencesService = Platform.getPreferencesService();
+		fValidation = ValidationFramework.getDefault();
+	}
+	
+	/**
+	 * Creates a Combo widget in the composite <code>parent</code>. The data
+	 * in the Combo is associated with <code>key</code>. The Combo data is
+	 * generated based on the integer <code>values</code> where the index
+	 * of <code>values</code> corresponds to the index of <code>valueLabels</code>
+	 * 
+	 * @param parent the composite to create the combo box in
+	 * @param label the label to give the combo box
+	 * @param key the unique key to identify the combo box
+	 * @param values the values represented by the combo options
+	 * @param valueLabels the calues displayed in the combo box
+	 * @param indent how far to indent the combo box label
+	 * 
+	 * @return the generated combo box
+	 */
+	protected Combo addComboBox(Composite parent, String label, String key, int[] values, String[] valueLabels, int indent) {
+		GridData gd= new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1);
+		gd.horizontalIndent= indent;
+				
+		Label labelControl= new Label(parent, SWT.LEFT);
+		labelControl.setFont(JFaceResources.getDialogFont());
+		labelControl.setText(label);
+		labelControl.setLayoutData(gd);
+				
+		Combo comboBox= newComboControl(parent, key, values, valueLabels);
+		comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+
+		return comboBox;
+	}
+	
+	/**
+	 * Creates a combo box and associates the combo data with the
+	 * combo box.
+	 * 
+	 * @param composite the composite to create the combo box in
+	 * @param key the unique key to identify the combo box
+	 * @param values the values represented by the combo options
+	 * @param valueLabels the values displayed in the combo box
+	 * 
+	 * @return the generated combo box
+	 */
+	protected Combo newComboControl(Composite composite, String key, int[] values, String[] valueLabels) {
+		ComboData data = new ComboData(key, values, -1);
+		
+		Combo comboBox= new Combo(composite, SWT.READ_ONLY);
+		comboBox.setItems(valueLabels);
+		comboBox.setData(data);
+		comboBox.addSelectionListener(getSelectionListener());
+		comboBox.setFont(JFaceResources.getDialogFont());
+			
+		makeScrollableCompositeAware(comboBox);
+		
+		int severity = -1;
+		if(key != null)
+			severity = fPreferencesService.getInt(getPreferenceNodeQualifier(), key, ValidationMessage.WARNING, createPreferenceScopes());
+
+		if (severity == ValidationMessage.ERROR || severity == ValidationMessage.WARNING || severity == ValidationMessage.IGNORE) {
+			data.setSeverity(severity);
+			data.originalSeverity = severity;
+		}
+		
+		if(data.getIndex() >= 0)
+			comboBox.select(data.getIndex());
+		
+		fCombos.add(comboBox);
+		return comboBox;
+	}
+	
+	protected SelectionListener getSelectionListener() {
+		if (fSelectionListener == null) {
+			fSelectionListener= new SelectionListener() {
+				public void widgetDefaultSelected(SelectionEvent e) {}
+	
+				public void widgetSelected(SelectionEvent e) {
+					controlChanged(e.widget);
+				}
+			};
+		}
+		return fSelectionListener;
+	}
+	
+	protected void controlChanged(Widget widget) {
+		ComboData data= (ComboData) widget.getData();
+		if (widget instanceof Combo) {
+			data.setIndex(((Combo)widget).getSelectionIndex());
+		} else {
+			return;
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractSettingsPage#storeValues()
+	 */
+	protected void storeValues() {
+		if(fCombos == null || fCombos.size() == 0)
+			return;
+		
+		Iterator it = fCombos.iterator();
+		
+		IScopeContext[] contexts = createPreferenceScopes();
+
+		while(it.hasNext()) {
+			ComboData data = (ComboData) ((Combo)it.next()).getData();
+			if(data.getKey() != null) {
+				contexts[0].getNode(getPreferenceNodeQualifier()).putInt(data.getKey(), data.getSeverity());
+			}
+		}
+		
+		for(int i = 0; i < contexts.length; i++) {
+			try {
+				contexts[i].getNode(getPreferenceNodeQualifier()).flush();
+			}
+			catch (BackingStoreException e) {
+				
+			}
+		}
+	}
+	
+	protected ExpandableComposite getParentExpandableComposite(Control control) {
+		Control parent= control.getParent();
+		while (!(parent instanceof ExpandableComposite) && parent != null) {
+			parent= parent.getParent();
+		}
+		if (parent instanceof ExpandableComposite) {
+			return (ExpandableComposite) parent;
+		}
+		return null;
+	}
+	
+	protected ExpandableComposite createStyleSection(Composite parent, String label, int nColumns) {
+		ExpandableComposite excomposite= new ExpandableComposite(parent, SWT.NONE, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT);
+		excomposite.setText(label);
+		excomposite.setExpanded(false);
+		excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
+		excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, nColumns, 1));
+		excomposite.addExpansionListener(new ExpansionAdapter() {
+			public void expansionStateChanged(ExpansionEvent e) {
+				expandedStateChanged((ExpandableComposite) e.getSource());
+			}
+		});
+		fExpandables.add(excomposite);
+		makeScrollableCompositeAware(excomposite);
+		return excomposite;
+	}
+	
+	protected final void expandedStateChanged(ExpandableComposite expandable) {
+		ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(expandable);
+		if (parentScrolledComposite != null) {
+			parentScrolledComposite.reflow(true);
+		}
+	}
+	
+	private void makeScrollableCompositeAware(Control control) {
+		ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(control);
+		if (parentScrolledComposite != null) {
+			parentScrolledComposite.adaptChild(control);
+		}
+	}
+	
+	protected ScrolledPageContent getParentScrolledComposite(Control control) {
+		Control parent= control.getParent();
+		while (!(parent instanceof ScrolledPageContent) && parent != null) {
+			parent= parent.getParent();
+		}
+		if (parent instanceof ScrolledPageContent) {
+			return (ScrolledPageContent) parent;
+		}
+		return null;
+	}
+	
+	protected void storeSectionExpansionStates(IDialogSettings section) {
+		for(int i = 0; i < fExpandables.size(); i++) {
+			ExpandableComposite comp = (ExpandableComposite) fExpandables.get(i);
+			section.put(SETTINGS_EXPANDED + String.valueOf(i), comp.isExpanded());
+		}
+	}
+	
+	protected void restoreSectionExpansionStates(IDialogSettings settings) {
+		for (int i= 0; i < fExpandables.size(); i++) {
+			ExpandableComposite excomposite= (ExpandableComposite) fExpandables.get(i);
+			if (settings == null) {
+				excomposite.setExpanded(i == 0); // only expand the first node by default
+			} else {
+				excomposite.setExpanded(settings.getBoolean(SETTINGS_EXPANDED + String.valueOf(i)));
+			}
+		}
+	}
+	
+	protected void resetSeverities() {
+		IEclipsePreferences defaultContext = new DefaultScope().getNode(getPreferenceNodeQualifier());
+		for(int i = 0; i < fCombos.size(); i++) {
+			ComboData data = (ComboData)((Combo)fCombos.get(i)).getData();
+			int severity = defaultContext.getInt(data.getKey(), ValidationMessage.WARNING);
+			data.setSeverity(severity);
+			((Combo)fCombos.get(i)).select(data.getIndex());
+		}
+	}
+	
+	protected boolean shouldRevalidateOnSettingsChange() {
+		Iterator it = fCombos.iterator();
+
+		while (it.hasNext()) {
+			ComboData data = (ComboData) ((Combo) it.next()).getData();
+			if (data.isChanged())
+				return true;
+		}
+		return false;
+	}
+	
+	public boolean performOk() {
+		if(super.performOk() && shouldRevalidateOnSettingsChange()) {
+			MessageBox mb = new MessageBox(this.getShell(), SWT.APPLICATION_MODAL | SWT.YES | SWT.NO | SWT.CANCEL | SWT.ICON_INFORMATION | SWT.RIGHT);
+			mb.setText(HTMLUIMessages.Validation_Title);
+			/* Choose which message to use based on if its project or workspace settings */
+			String msg = (getProject() == null) ? HTMLUIMessages.Validation_Workspace : HTMLUIMessages.Validation_Project;
+			mb.setMessage(msg);
+			switch(mb.open()) {
+				case SWT.CANCEL:
+					return false;
+				case SWT.YES:
+					storeValues();
+					ValidateJob job = new ValidateJob(HTMLUIMessages.Validation_jobName);
+					job.schedule();
+				case SWT.NO:
+					storeValues();
+				default:
+					return true;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * Performs validation after validation preferences have been modified.
+	 */
+	private class ValidateJob extends Job {
+		
+		public ValidateJob(String name) {
+			super(name);
+		}
+
+		protected IStatus run(IProgressMonitor monitor) {
+			IStatus status = Status.OK_STATUS;
+			try {
+				IProject[] projects = null;
+				/* Changed preferences for a single project, only validate it */
+				if(getProject() != null)
+					projects = new IProject[] {getProject()};
+				/* Workspace-wide preferences changed */
+				else {
+					/* Get all of the projects in the workspace */
+					projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+					IEclipsePreferences prefs = null;
+					List projectList = new ArrayList();
+					
+					/* Filter out projects that use project-specific settings or have been closed */
+					for(int i = 0; i < projects.length; i++) {
+						prefs = new ProjectScope(projects[i]).getNode(getPreferenceNodeQualifier());
+						if(projects[i].isAccessible() && !prefs.getBoolean(getProjectSettingsKey(), false))
+							projectList.add(projects[i]);
+					}
+					projects = (IProject[]) projectList.toArray(new IProject[projectList.size()]);
+				}
+				fValidation.validate(projects, true, false, monitor);
+			}
+			catch (CoreException ce) {
+				status = Status.CANCEL_STATUS;
+			}
+			
+			return status;
+		}
+		
+	}
+	
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/EmptyFilePreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/EmptyFilePreferencePage.java
new file mode 100644
index 0000000..cc3ca1b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/EmptyFilePreferencePage.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+
+public class EmptyFilePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+	private Composite createComposite(Composite parent, int numColumns) {
+		noDefaultAndApplyButton();
+
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		// GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+
+		// GridData
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalIndent = 0;
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+	protected Control createContents(Composite parent) {
+		Composite composite = createScrolledComposite(parent);
+
+		String description = HTMLUIMessages.EmptyFilePreferencePage_0; 
+		Text text = new Text(composite, SWT.READ_ONLY);
+		// some themes on GTK have different background colors for Text and Labels
+		text.setBackground(composite.getBackground());
+		text.setText(description);
+
+		setSize(composite);
+		return composite;
+	}
+
+	private Composite createScrolledComposite(Composite parent) {
+		// create scrollbars for this parent when needed
+		final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
+		Composite composite = createComposite(sc1, 1);
+		sc1.setContent(composite);
+
+		// not calling setSize for composite will result in a blank composite,
+		// so calling it here initially
+		// setSize actually needs to be called after all controls are created,
+		// so scrolledComposite
+		// has correct minSize
+		setSize(composite);
+		return composite;
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+
+	private void setSize(Composite composite) {
+		if (composite != null) {
+			// Note: The font is set here in anticipation that the class inheriting
+			//       this base class may add widgets to the dialog.   setSize
+			//       is assumed to be called just before we go live.
+			applyDialogFont(composite);
+			Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+			composite.setSize(minSize);
+			// set scrollbar composite's min size so page is expandable but
+			// has scrollbars when needed
+			if (composite.getParent() instanceof ScrolledComposite) {
+				ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
+				sc1.setMinSize(minSize);
+				sc1.setExpandHorizontal(true);
+				sc1.setExpandVertical(true);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLColorPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLColorPage.java
new file mode 100644
index 0000000..c299dac
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLColorPage.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004,2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore.OverlayKey;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.StyledTextColorPicker;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLColorPage;
+
+/**
+ * @deprecated
+ */
+public class HTMLColorPage extends XMLColorPage {
+
+	/**
+	 * Set up all the style preference keys in the overlay store
+	 */
+	protected OverlayKey[] createOverlayStoreKeys() {
+		ArrayList overlayKeys = new ArrayList();
+		
+		ArrayList styleList = new ArrayList();
+		initStyleList(styleList);
+		Iterator i = styleList.iterator();
+		while (i.hasNext()) {
+			overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, (String)i.next()));	
+		}
+
+		OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
+		overlayKeys.toArray(keys);
+		return keys;
+	}
+
+	public String getSampleText() {
+		return HTMLUIMessages.Sample_HTML_doc;
+
+	}
+
+	protected void initContextStyleMap(Dictionary contextStyleMap) {
+
+		initCommonContextStyleMap(contextStyleMap);
+		initDocTypeContextStyleMap(contextStyleMap);
+		// FIXME: these were "brute forced" commented out when moving XMLJSPRegionContexts
+		// effect is unknown, but thought just to effect preference page
+		//contextStyleMap.put(XMLJSPRegionContexts.JSP_DIRECTIVE_NAME, IStyleConstantsXML.TAG_NAME);
+		//contextStyleMap.put(XMLJSPRegionContexts.JSP_COMMENT_OPEN, IStyleConstantsXML.COMMENT_BORDER);
+		//contextStyleMap.put(XMLJSPRegionContexts.JSP_COMMENT_TEXT, IStyleConstantsXML.COMMENT_TEXT);
+		//contextStyleMap.put(XMLJSPRegionContexts.JSP_COMMENT_CLOSE, IStyleConstantsXML.COMMENT_BORDER);
+	}
+
+	protected void initDescriptions(Dictionary descriptions) {
+
+		initCommonDescriptions(descriptions);
+		initDocTypeDescriptions(descriptions);
+	}
+
+	protected void initStyleList(ArrayList list) {
+		initCommonStyleList(list);
+		initDocTypeStyleList(list);
+		//	list.add(HTMLColorManager.SCRIPT_AREA_BORDER);
+
+	}
+
+	protected void setupPicker(StyledTextColorPicker picker) {
+		IModelManager mmanager = StructuredModelManager.getModelManager();
+		picker.setParser(mmanager.createStructuredDocumentFor(ContentTypeIdForHTML.ContentTypeID_HTML).getParser());
+
+		// create descriptions for hilighting types
+		Dictionary descriptions = new Hashtable();
+		initDescriptions(descriptions);
+
+		// map region types to hilighting types
+		Dictionary contextStyleMap = new Hashtable();
+		initContextStyleMap(contextStyleMap);
+
+		ArrayList styleList = new ArrayList();
+		initStyleList(styleList);
+
+		picker.setContextStyleMap(contextStyleMap);
+		picker.setDescriptions(descriptions);
+		picker.setStyleList(styleList);
+
+		//	updatePickerFont(picker);
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		Control c = super.createContents(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(c, IHelpContextIds.HTML_PREFWEBX_STYLES_HELPID);
+		return c;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
+	 */
+	protected IPreferenceStore doGetPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.AbstractColorPage#savePreferences()
+	 */
+	protected void savePreferences() {
+		HTMLUIPlugin.getDefault().savePluginPreferences();
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLContentAssistPreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLContentAssistPreferencePage.java
new file mode 100644
index 0000000..c1fc2b6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLContentAssistPreferencePage.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposoalCatigoriesConfigurationRegistry;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+import org.eclipse.wst.sse.ui.preferences.CodeAssistCyclingConfigurationBlock;
+import org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter;
+
+/**
+ * <p>Defines the preference page for allowing the user to change the content
+ * assist preferences</p>
+ */
+public class HTMLContentAssistPreferencePage extends AbstractPreferencePage implements
+		IWorkbenchPreferencePage {
+
+	private static final String HTML_CONTENT_TYPE_ID = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
+	
+	// Auto Activation
+	private Button fAutoPropose;
+	private Label fAutoProposeLabel;
+	private Text fAutoProposeText;
+	
+	/** configuration block for changing preference having to do with the content assist categories */
+	private CodeAssistCyclingConfigurationBlock fConfigurationBlock;
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		final Composite composite = super.createComposite(parent, 1);
+		
+		createContentsForAutoActivationGroup(composite);
+		createContentsForCyclingGroup(composite);
+		
+		setSize(composite);
+		loadPreferences();
+		
+		return composite;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		performDefaultsForAutoActivationGroup();
+		performDefaultsForCyclingGroup();
+
+		validateValues();
+		enableValues();
+
+		super.performDefaults();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#initializeValues()
+	 */
+	protected void initializeValues() {
+		initializeValuesForAutoActivationGroup();
+		initializeValuesForCyclingGroup();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#storeValues()
+	 */
+	protected void storeValues() {
+		storeValuesForAutoActivationGroup();
+		storeValuesForCyclingGroup();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#enableValues()
+	 */
+	protected void enableValues() {
+		if (fAutoPropose != null) {
+			if (fAutoPropose.getSelection()) {
+				fAutoProposeLabel.setEnabled(true);
+				fAutoProposeText.setEnabled(true);
+			}
+			else {
+				fAutoProposeLabel.setEnabled(false);
+				fAutoProposeText.setEnabled(false);
+			}
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
+	 */
+	protected IPreferenceStore doGetPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	/**
+	 * <p>Create contents for the auto activation preference group</p>
+	 * @param parent {@link Composite} parent of the group
+	 */
+	private void createContentsForAutoActivationGroup(Composite parent) {
+		Group contentAssistGroup = createGroup(parent, 2);
+		contentAssistGroup.setText(HTMLUIMessages.Auto_Activation_UI_);
+
+		fAutoPropose = createCheckBox(contentAssistGroup, HTMLUIMessages.Automatically_make_suggest_UI_);
+		((GridData) fAutoPropose.getLayoutData()).horizontalSpan = 2;
+		fAutoPropose.addSelectionListener(this);
+
+		fAutoProposeLabel = createLabel(contentAssistGroup, HTMLUIMessages.Prompt_when_these_characte_UI_);
+		fAutoProposeText = createTextField(contentAssistGroup);
+	}
+	
+	/**
+	 * <p>Create the contents for the content assist cycling preference group</p>
+	 * @param parent {@link Composite} parent of the group
+	 */
+	private void createContentsForCyclingGroup(Composite parent) {
+		ICompletionProposalCategoriesConfigurationWriter configurationWriter = CompletionProposoalCatigoriesConfigurationRegistry.getDefault().getWritableConfiguration(HTML_CONTENT_TYPE_ID);
+		
+		if(configurationWriter != null) {
+			fConfigurationBlock = new CodeAssistCyclingConfigurationBlock(HTML_CONTENT_TYPE_ID, configurationWriter);
+			fConfigurationBlock.createContents(parent, HTMLUIMessages.Cycling_UI_);
+		} else {
+			Logger.log(Logger.ERROR, "There should be an ICompletionProposalCategoriesConfigurationWriter" + //$NON-NLS-1$
+					" specified for the HTML content type, but can't fine it, thus can't create user" + //$NON-NLS-1$
+					" preference block for editing proposal categories preferences."); //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * <p>Store the values for the auto activation group</p>
+	 */
+	private void storeValuesForAutoActivationGroup() {
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.AUTO_PROPOSE, fAutoPropose.getSelection());
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.AUTO_PROPOSE_CODE, fAutoProposeText.getText());
+	}
+	
+	/**
+	 * <p>Store the values for the cycling group</p>
+	 */
+	private void storeValuesForCyclingGroup() {
+		if (fConfigurationBlock != null) {
+			fConfigurationBlock.storeValues();
+		}
+	}
+	
+	/**
+	 * <p>Initialize the values for the auto activation group</p>
+	 */
+	private void initializeValuesForAutoActivationGroup() {
+		// Content Assist
+		fAutoPropose.setSelection(getPreferenceStore().getBoolean(HTMLUIPreferenceNames.AUTO_PROPOSE));
+		fAutoProposeText.setText(getPreferenceStore().getString(HTMLUIPreferenceNames.AUTO_PROPOSE_CODE));
+	}
+	
+	/**
+	 * <p>Initialize the values for the cycling group</p>
+	 */
+	private void initializeValuesForCyclingGroup() {
+		if(fConfigurationBlock != null) {
+			fConfigurationBlock.initializeValues();
+		}
+	}
+	
+	/**
+	 * <p>Load the defaults for the auto activation group</p>
+	 */
+	private void performDefaultsForAutoActivationGroup() {
+		// Content Assist
+		fAutoPropose.setSelection(getPreferenceStore().getDefaultBoolean(HTMLUIPreferenceNames.AUTO_PROPOSE));
+		fAutoProposeText.setText(getPreferenceStore().getDefaultString(HTMLUIPreferenceNames.AUTO_PROPOSE_CODE));
+	}
+	
+	/**
+	 * <p>Load the defaults of the cycling group</p>
+	 */
+	private void performDefaultsForCyclingGroup() {
+		if(fConfigurationBlock != null) {
+			fConfigurationBlock.performDefaults();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLFilesPreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLFilesPreferencePage.java
new file mode 100644
index 0000000..1aa3304
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLFilesPreferencePage.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.xml.ui.internal.preferences.WorkbenchDefaultEncodingSettings;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLFilesPreferencePage;
+
+public class HTMLFilesPreferencePage extends XMLFilesPreferencePage {
+	private WorkbenchDefaultEncodingSettings fInputEncodingSettings = null;
+
+	protected Preferences getModelPreferences() {
+		return HTMLCorePlugin.getDefault().getPluginPreferences();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
+	 */
+	protected IPreferenceStore doGetPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	protected void doSavePreferenceStore() {
+		HTMLCorePlugin.getDefault().savePluginPreferences(); // model
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		Composite scrolledComposite = createScrolledComposite(parent);
+		createContentsForCreatingGroup(scrolledComposite);
+		createContentsForLoadingGroup(scrolledComposite);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(scrolledComposite, IHelpContextIds.HTML_PREFWEBX_FILES_HELPID);
+
+		setSize(scrolledComposite);
+		loadPreferences();
+
+		return scrolledComposite;
+	}
+
+	protected void createContentsForLoadingGroup(Composite parent) {
+		Group group = createGroup(parent, 1);
+		group.setText(HTMLUIMessages.HTMLFilesPreferencePage_0);
+
+		fInputEncodingSettings = new WorkbenchDefaultEncodingSettings(group);
+	}
+
+	protected IContentType getContentType() {
+		return Platform.getContentTypeManager().getContentType(ContentTypeIdForHTML.ContentTypeID_HTML);
+	}
+
+	protected void initializeValues() {
+		super.initializeValues();
+		initializeValuesForLoadingGroup();
+	}
+
+	protected void initializeValuesForLoadingGroup() {
+		String encoding = getModelPreferences().getString(CommonEncodingPreferenceNames.INPUT_CODESET);
+
+		fInputEncodingSettings.setIANATag(encoding);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		super.performDefaults();
+		performDefaultsForLoadingGroup();
+	}
+
+	protected void performDefaultsForLoadingGroup() {
+		String encoding = getModelPreferences().getDefaultString(CommonEncodingPreferenceNames.INPUT_CODESET);
+
+		fInputEncodingSettings.setIANATag(encoding);
+	}
+
+	protected void storeValues() {
+		super.storeValues();
+		storeValuesForLoadingGroup();
+	}
+
+	protected void storeValuesForLoadingGroup() {
+		getModelPreferences().setValue(CommonEncodingPreferenceNames.INPUT_CODESET, fInputEncodingSettings.getIANATag());
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLSourcePreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLSourcePreferencePage.java
new file mode 100644
index 0000000..a5e711a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLSourcePreferencePage.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferenceLinkArea;
+import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+
+public class HTMLSourcePreferencePage extends AbstractPreferencePage {
+	private Button fTagNameUpper = null;
+	private Button fTagNameLower = null;
+	private Button fAttrNameUpper = null;
+	private Button fAttrNameLower = null;
+
+	private final int MIN_INDENTATION_SIZE = 0;
+	private final int MAX_INDENTATION_SIZE = 16;
+
+	private Button fClearAllBlankLines;
+
+	// Formatting
+	private Text fLineWidthText;
+	private Button fSplitMultiAttrs;
+	private Button fAlignEndBracket;
+	private Button fIndentUsingTabs;
+	private Button fIndentUsingSpaces;
+	private Spinner fIndentationSize;
+
+	private Composite createContentsForPreferredCaseGroup(Composite parent, int columnSpan) {
+		Group caseGroup = createGroup(parent, columnSpan);
+		caseGroup.setText(HTMLUIMessages.Preferred_markup_case_UI_);
+
+		// d257064 need to associate group w/ radio buttons so radio buttons
+		// header can be read
+		Group tagNameGroup = createGroup(caseGroup, 1);
+		tagNameGroup.setText(HTMLUIMessages.Tag_names__UI_);
+		fTagNameUpper = createRadioButton(tagNameGroup, HTMLUIMessages.Tag_names_Upper_case_UI_);
+		fTagNameLower = createRadioButton(tagNameGroup, HTMLUIMessages.Tag_names_Lower_case_UI_);
+
+		// d257064 need to associate group w/ radio buttons so radio buttons
+		// header can be read
+		Group attrNameGroup = createGroup(caseGroup, 1);
+		attrNameGroup.setText(HTMLUIMessages.Attribute_names__UI_);
+		fAttrNameUpper = createRadioButton(attrNameGroup, HTMLUIMessages.Attribute_names_Upper_case_UI_);
+		fAttrNameLower = createRadioButton(attrNameGroup, HTMLUIMessages.Attribute_names_Lower_case_UI_);
+
+		return parent;
+
+	}
+
+	private void createContentsForFormattingGroup(Composite parent) {
+		Group formattingGroup = createGroup(parent, 2);
+		formattingGroup.setText(HTMLUIMessages.Formatting_UI_);
+
+		createLabel(formattingGroup, HTMLUIMessages.Line_width__UI_);
+		fLineWidthText = new Text(formattingGroup, SWT.SINGLE | SWT.BORDER);
+		GridData gData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.BEGINNING);
+		gData.widthHint = 25;
+		fLineWidthText.setLayoutData(gData);
+		fLineWidthText.addModifyListener(this);
+
+		fSplitMultiAttrs = createCheckBox(formattingGroup, HTMLUIMessages.Split_multiple_attributes);
+		((GridData) fSplitMultiAttrs.getLayoutData()).horizontalSpan = 2;
+		fAlignEndBracket = createCheckBox(formattingGroup, HTMLUIMessages.Align_final_bracket);
+		((GridData) fAlignEndBracket.getLayoutData()).horizontalSpan = 2;
+		fClearAllBlankLines = createCheckBox(formattingGroup, HTMLUIMessages.Clear_all_blank_lines_UI_);
+		((GridData) fClearAllBlankLines.getLayoutData()).horizontalSpan = 2;
+
+		// [269224] - Place the indent controls in their own composite for proper tab ordering
+		Composite indentComposite = createComposite(formattingGroup, 1);
+		((GridData) indentComposite.getLayoutData()).horizontalSpan = 2;
+		((GridLayout) indentComposite.getLayout()).marginWidth = 0;
+		((GridLayout) indentComposite.getLayout()).marginHeight = 0;
+
+		fIndentUsingTabs = createRadioButton(indentComposite, HTMLUIMessages.Indent_using_tabs);
+		((GridData) fIndentUsingTabs.getLayoutData()).horizontalSpan = 1;
+
+		fIndentUsingSpaces = createRadioButton(indentComposite, HTMLUIMessages.Indent_using_spaces);
+		((GridData) fIndentUsingSpaces.getLayoutData()).horizontalSpan = 1;
+
+		createLabel(formattingGroup, HTMLUIMessages.Indentation_size);
+		fIndentationSize = new Spinner(formattingGroup, SWT.READ_ONLY | SWT.BORDER);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+		fIndentationSize.setLayoutData(gd);
+		fIndentationSize.setToolTipText(HTMLUIMessages.Indentation_size_tip);
+		fIndentationSize.setMinimum(MIN_INDENTATION_SIZE);
+		fIndentationSize.setMaximum(MAX_INDENTATION_SIZE);
+		fIndentationSize.setIncrement(1);
+		fIndentationSize.setPageIncrement(4);
+		fIndentationSize.addModifyListener(this);
+	}
+
+	protected void performDefaults() {
+		fTagNameUpper.setSelection(getModelPreferences().getDefaultInt(HTMLCorePreferenceNames.TAG_NAME_CASE) == HTMLCorePreferenceNames.UPPER);
+		fTagNameLower.setSelection(getModelPreferences().getDefaultInt(HTMLCorePreferenceNames.TAG_NAME_CASE) == HTMLCorePreferenceNames.LOWER);
+		fAttrNameUpper.setSelection(getModelPreferences().getDefaultInt(HTMLCorePreferenceNames.ATTR_NAME_CASE) == HTMLCorePreferenceNames.UPPER);
+		fAttrNameLower.setSelection(getModelPreferences().getDefaultInt(HTMLCorePreferenceNames.ATTR_NAME_CASE) == HTMLCorePreferenceNames.LOWER);
+
+		performDefaultsForFormattingGroup();
+
+		validateValues();
+		enableValues();
+
+		super.performDefaults();
+	}
+
+	private void performDefaultsForFormattingGroup() {
+		// Formatting
+		fLineWidthText.setText(getModelPreferences().getDefaultString(HTMLCorePreferenceNames.LINE_WIDTH));
+		fSplitMultiAttrs.setSelection(getModelPreferences().getDefaultBoolean(HTMLCorePreferenceNames.SPLIT_MULTI_ATTRS));
+		fAlignEndBracket.setSelection(getModelPreferences().getDefaultBoolean(HTMLCorePreferenceNames.ALIGN_END_BRACKET));
+		fClearAllBlankLines.setSelection(getModelPreferences().getDefaultBoolean(HTMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES));
+
+		if (HTMLCorePreferenceNames.TAB.equals(getModelPreferences().getDefaultString(HTMLCorePreferenceNames.INDENTATION_CHAR))) {
+			fIndentUsingTabs.setSelection(true);
+			fIndentUsingSpaces.setSelection(false);
+		}
+		else {
+			fIndentUsingSpaces.setSelection(true);
+			fIndentUsingTabs.setSelection(false);
+		}
+		fIndentationSize.setSelection(getModelPreferences().getDefaultInt(HTMLCorePreferenceNames.INDENTATION_SIZE));
+	}
+
+	protected void initializeValues() {
+		fTagNameUpper.setSelection(getModelPreferences().getInt(HTMLCorePreferenceNames.TAG_NAME_CASE) == HTMLCorePreferenceNames.UPPER);
+		fTagNameLower.setSelection(getModelPreferences().getInt(HTMLCorePreferenceNames.TAG_NAME_CASE) == HTMLCorePreferenceNames.LOWER);
+		fAttrNameUpper.setSelection(getModelPreferences().getInt(HTMLCorePreferenceNames.ATTR_NAME_CASE) == HTMLCorePreferenceNames.UPPER);
+		fAttrNameLower.setSelection(getModelPreferences().getInt(HTMLCorePreferenceNames.ATTR_NAME_CASE) == HTMLCorePreferenceNames.LOWER);
+
+		initializeValuesForFormattingGroup();
+	}
+
+	private void initializeValuesForFormattingGroup() {
+		// Formatting
+		fLineWidthText.setText(getModelPreferences().getString(HTMLCorePreferenceNames.LINE_WIDTH));
+		fSplitMultiAttrs.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.SPLIT_MULTI_ATTRS));
+		fAlignEndBracket.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.ALIGN_END_BRACKET));
+		fClearAllBlankLines.setSelection(getModelPreferences().getBoolean(HTMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES));
+
+		if (HTMLCorePreferenceNames.TAB.equals(getModelPreferences().getString(HTMLCorePreferenceNames.INDENTATION_CHAR))) {
+			fIndentUsingTabs.setSelection(true);
+			fIndentUsingSpaces.setSelection(false);
+		}
+		else {
+			fIndentUsingSpaces.setSelection(true);
+			fIndentUsingTabs.setSelection(false);
+		}
+
+		fIndentationSize.setSelection(getModelPreferences().getInt(HTMLCorePreferenceNames.INDENTATION_SIZE));
+	}
+
+	protected void storeValues() {
+		if (fTagNameUpper.getSelection())
+			getModelPreferences().setValue(HTMLCorePreferenceNames.TAG_NAME_CASE, HTMLCorePreferenceNames.UPPER);
+		else
+			getModelPreferences().setValue(HTMLCorePreferenceNames.TAG_NAME_CASE, HTMLCorePreferenceNames.LOWER);
+		if (fAttrNameUpper.getSelection())
+			getModelPreferences().setValue(HTMLCorePreferenceNames.ATTR_NAME_CASE, HTMLCorePreferenceNames.UPPER);
+		else
+			getModelPreferences().setValue(HTMLCorePreferenceNames.ATTR_NAME_CASE, HTMLCorePreferenceNames.LOWER);
+
+		storeValuesForFormattingGroup();
+	}
+
+	private void storeValuesForFormattingGroup() {
+		// Formatting
+		getModelPreferences().setValue(HTMLCorePreferenceNames.LINE_WIDTH, fLineWidthText.getText());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.SPLIT_MULTI_ATTRS, fSplitMultiAttrs.getSelection());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.ALIGN_END_BRACKET, fAlignEndBracket.getSelection());
+		getModelPreferences().setValue(HTMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES, fClearAllBlankLines.getSelection());
+
+		if (fIndentUsingTabs.getSelection()) {
+			getModelPreferences().setValue(HTMLCorePreferenceNames.INDENTATION_CHAR, HTMLCorePreferenceNames.TAB);
+		}
+		else {
+			getModelPreferences().setValue(HTMLCorePreferenceNames.INDENTATION_CHAR, HTMLCorePreferenceNames.SPACE);
+		}
+		getModelPreferences().setValue(HTMLCorePreferenceNames.INDENTATION_SIZE, fIndentationSize.getSelection());
+	}
+
+	public boolean performOk() {
+		boolean result = super.performOk();
+
+		doSavePreferenceStore();
+
+		return result;
+	}
+
+	protected Preferences getModelPreferences() {
+		return HTMLCorePlugin.getDefault().getPluginPreferences();
+	}
+
+	protected IPreferenceStore doGetPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	private void doSavePreferenceStore() {
+		HTMLUIPlugin.getDefault().savePluginPreferences(); // UI
+		HTMLCorePlugin.getDefault().savePluginPreferences(); // model
+	}
+
+	protected Control createContents(Composite parent) {
+		final Composite composite = super.createComposite(parent, 1);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.HTML_PREFWEBX_SOURCE_HELPID);
+
+		new PreferenceLinkArea(composite, SWT.WRAP | SWT.MULTI, "org.eclipse.wst.sse.ui.preferences.editor", HTMLUIMessages._UI_STRUCTURED_TEXT_EDITOR_PREFS_LINK,//$NON-NLS-1$
+					(IWorkbenchPreferenceContainer) getContainer(), null).getControl().setLayoutData(GridDataFactory.fillDefaults().hint(150, SWT.DEFAULT).create());
+		new Label(composite, SWT.NONE).setLayoutData(GridDataFactory.swtDefaults().create());
+
+		createContentsForFormattingGroup(composite);
+		createContentsForPreferredCaseGroup(composite, 2);
+		setSize(composite);
+		loadPreferences();
+
+		return composite;
+	}
+
+	protected void validateValues() {
+		boolean isError = false;
+		String widthText = null;
+
+		if (fLineWidthText != null) {
+			try {
+				widthText = fLineWidthText.getText();
+				int formattingLineWidth = Integer.parseInt(widthText);
+				if ((formattingLineWidth < WIDTH_VALIDATION_LOWER_LIMIT) || (formattingLineWidth > WIDTH_VALIDATION_UPPER_LIMIT)) {
+					throw new NumberFormatException();
+				}
+			}
+			catch (NumberFormatException nfexc) {
+				setInvalidInputMessage(widthText);
+				setValid(false);
+				isError = true;
+			}
+		}
+
+		int indentSize = 0;
+		if (fIndentationSize != null) {
+			try {
+				indentSize = fIndentationSize.getSelection();
+				if ((indentSize < MIN_INDENTATION_SIZE) || (indentSize > MAX_INDENTATION_SIZE)) {
+					throw new NumberFormatException();
+				}
+			}
+			catch (NumberFormatException nfexc) {
+				setInvalidInputMessage(Integer.toString(indentSize));
+				setValid(false);
+				isError = true;
+			}
+		}
+
+		if (!isError) {
+			setErrorMessage(null);
+			setValid(true);
+		}
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLSyntaxColoringPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLSyntaxColoringPage.java
new file mode 100644
index 0000000..ef0f01d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLSyntaxColoringPage.java
@@ -0,0 +1,874 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.preference.ColorSelector;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore.OverlayKey;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML;
+
+import com.ibm.icu.text.Collator;
+
+/**
+ * A preference page to configure our XML syntax color. It resembles the JDT
+ * and CDT pages far more than our original color page while retaining the
+ * extra "click-to-find" functionality.
+ */
+public final class HTMLSyntaxColoringPage extends PreferencePage implements IWorkbenchPreferencePage {
+
+	private Button fBold;
+	private Label fForegroundLabel;
+	private Label fBackgroundLabel;
+	private Button fClearStyle;
+	private Map fContextToStyleMap;
+	private Color fDefaultForeground = null;
+	private Color fDefaultBackground = null;
+	private IStructuredDocument fDocument;
+	private ColorSelector fForegroundColorEditor;
+	private ColorSelector fBackgroundColorEditor;
+	private Button fItalic;
+	private OverlayPreferenceStore fOverlayStore;
+	private Button fStrike;
+	private Collection fStylePreferenceKeys;
+	private StructuredViewer fStylesViewer = null;
+	private Map fStyleToDescriptionMap;
+	private StyledText fText;
+	private Button fUnderline;
+
+	// activate controls based on the given local color type
+	private void activate(String namedStyle) {
+		Color foreground = fDefaultForeground;
+		Color background = fDefaultBackground;
+		if (namedStyle == null) {
+			fClearStyle.setEnabled(false);
+			fBold.setEnabled(false);
+			fItalic.setEnabled(false);
+			fStrike.setEnabled(false);
+			fUnderline.setEnabled(false);
+			fForegroundLabel.setEnabled(false);
+			fBackgroundLabel.setEnabled(false);
+			fForegroundColorEditor.setEnabled(false);
+			fBackgroundColorEditor.setEnabled(false);
+			fBold.setSelection(false);
+			fItalic.setSelection(false);
+			fStrike.setSelection(false);
+			fUnderline.setSelection(false);
+		}
+		else {
+			TextAttribute attribute = getAttributeFor(namedStyle);
+			fClearStyle.setEnabled(true);
+			fBold.setEnabled(true);
+			fItalic.setEnabled(true);
+			fStrike.setEnabled(true);
+			fUnderline.setEnabled(true);
+			fForegroundLabel.setEnabled(true);
+			fBackgroundLabel.setEnabled(true);
+			fForegroundColorEditor.setEnabled(true);
+			fBackgroundColorEditor.setEnabled(true);
+			fBold.setSelection((attribute.getStyle() & SWT.BOLD) != 0);
+			fItalic.setSelection((attribute.getStyle() & SWT.ITALIC) != 0);
+			fStrike.setSelection((attribute.getStyle() & TextAttribute.STRIKETHROUGH) != 0);
+			fUnderline.setSelection((attribute.getStyle() & TextAttribute.UNDERLINE) != 0);
+			if (attribute.getForeground() != null) {
+				foreground = attribute.getForeground();
+			}
+			if (attribute.getBackground() != null) {
+				background = attribute.getBackground();
+			}
+		}
+
+		fForegroundColorEditor.setColorValue(foreground.getRGB());
+		fBackgroundColorEditor.setColorValue(background.getRGB());
+	}
+
+	/**
+	 * Color the text in the sample area according to the current preferences
+	 */
+	void applyStyles() {
+		if (fText == null || fText.isDisposed())
+			return;
+		IStructuredDocumentRegion documentRegion = fDocument.getFirstStructuredDocumentRegion();
+		while (documentRegion != null) {
+			ITextRegionList regions = documentRegion.getRegions();
+			for (int i = 0; i < regions.size(); i++) {
+				ITextRegion currentRegion = regions.get(i);
+				// lookup the local coloring type and apply it
+				String namedStyle = (String) fContextToStyleMap.get(currentRegion.getType());
+				if (namedStyle == null)
+					continue;
+				TextAttribute attribute = getAttributeFor(namedStyle);
+				if (attribute == null)
+					continue;
+				StyleRange style = new StyleRange(documentRegion.getStartOffset(currentRegion), currentRegion.getTextLength(), attribute.getForeground(), attribute.getBackground(), attribute.getStyle());
+				style.strikeout = (attribute.getStyle() & TextAttribute.STRIKETHROUGH) != 0;
+				style.underline = (attribute.getStyle() & TextAttribute.UNDERLINE) != 0;
+				fText.setStyleRange(style);
+			}
+			documentRegion = documentRegion.getNext();
+		}
+	}
+
+	Button createCheckbox(Composite parent, String label) {
+		Button button = new Button(parent, SWT.CHECK);
+		button.setText(label);
+		button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+		return button;
+	}
+
+	/**
+	 * Creates composite control and sets the default layout data.
+	 */
+	private Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		// GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		layout.makeColumnsEqualWidth = false;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+
+		// GridData
+		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
+		composite.setLayoutData(data);
+		return composite;
+	}
+
+	protected Control createContents(final Composite parent) {
+		initializeDialogUnits(parent);
+
+		fDefaultForeground = parent.getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+		fDefaultBackground = parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+		Composite pageComponent = createComposite(parent, 2);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(pageComponent, IHelpContextIds.HTML_PREFWEBX_STYLES_HELPID);
+
+		Link link = new Link(pageComponent, SWT.WRAP);
+		link.setText(SSEUIMessages.SyntaxColoring_Link);
+		link.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				PreferencesUtil.createPreferenceDialogOn(parent.getShell(), e.text, null, null);
+			}
+		});
+
+		GridData linkData= new GridData(SWT.FILL, SWT.BEGINNING, true, false, 2, 1);
+		linkData.widthHint= 150; // only expand further if anyone else requires it
+		link.setLayoutData(linkData);
+
+		new Label(pageComponent, SWT.NONE).setLayoutData(new GridData());
+		new Label(pageComponent, SWT.NONE).setLayoutData(new GridData());
+
+		SashForm editor = new SashForm(pageComponent, SWT.VERTICAL);
+		GridData gridData2 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData2.horizontalSpan = 2;
+		editor.setLayoutData(gridData2);
+		SashForm top = new SashForm(editor, SWT.HORIZONTAL);
+		Composite styleEditor = createComposite(top, 1);
+		((GridLayout) styleEditor.getLayout()).marginRight = 5;
+		((GridLayout) styleEditor.getLayout()).marginLeft = 0;
+		createLabel(styleEditor, HTMLUIMessages.SyntaxColoringPage_0);
+		fStylesViewer = createStylesViewer(styleEditor);
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData.horizontalIndent = 0;
+		Iterator iterator = fStyleToDescriptionMap.values().iterator();
+		while (iterator.hasNext()) {
+			gridData.widthHint = Math.max(gridData.widthHint, convertWidthInCharsToPixels(iterator.next().toString().length()));
+		}
+		gridData.heightHint = convertHeightInCharsToPixels(5);
+		fStylesViewer.getControl().setLayoutData(gridData);
+
+		Composite editingComposite = createComposite(top, 1);
+		((GridLayout) styleEditor.getLayout()).marginLeft = 5;
+		createLabel(editingComposite, ""); //$NON-NLS-1$
+		Button enabler = createCheckbox(editingComposite, HTMLUIMessages.SyntaxColoringPage_2);
+		enabler.setEnabled(false);
+		enabler.setSelection(true);
+		Composite editControls = createComposite(editingComposite, 2);
+		((GridLayout) editControls.getLayout()).marginLeft = 20;
+
+		fForegroundLabel = createLabel(editControls, SSEUIMessages.Foreground_UI_);
+		((GridData) fForegroundLabel.getLayoutData()).verticalAlignment = SWT.CENTER;
+		fForegroundLabel.setEnabled(false);
+
+		fForegroundColorEditor = new ColorSelector(editControls);
+		Button fForegroundColor = fForegroundColorEditor.getButton();
+		GridData gd = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
+		fForegroundColor.setLayoutData(gd);
+		fForegroundColorEditor.setEnabled(false);
+
+		fBackgroundLabel = createLabel(editControls, SSEUIMessages.Background_UI_);
+		((GridData) fBackgroundLabel.getLayoutData()).verticalAlignment = SWT.CENTER;
+		fBackgroundLabel.setEnabled(false);
+
+		fBackgroundColorEditor = new ColorSelector(editControls);
+		Button fBackgroundColor = fBackgroundColorEditor.getButton();
+		gd = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
+		fBackgroundColor.setLayoutData(gd);
+		fBackgroundColorEditor.setEnabled(false);
+
+		fBold = createCheckbox(editControls, HTMLUIMessages.SyntaxColoringPage_3);
+		fBold.setEnabled(false);
+		((GridData) fBold.getLayoutData()).horizontalSpan = 2;
+		fItalic = createCheckbox(editControls, HTMLUIMessages.SyntaxColoringPage_4);
+		fItalic.setEnabled(false);
+		((GridData) fItalic.getLayoutData()).horizontalSpan = 2;
+		fStrike = createCheckbox(editControls, HTMLUIMessages.SyntaxColoringPage_5);
+		fStrike.setEnabled(false);
+		((GridData) fStrike.getLayoutData()).horizontalSpan = 2;
+		fUnderline = createCheckbox(editControls, HTMLUIMessages.SyntaxColoringPage_6);
+		fUnderline.setEnabled(false);
+		((GridData) fUnderline.getLayoutData()).horizontalSpan = 2;
+		fClearStyle = new Button(editingComposite, SWT.PUSH);
+		fClearStyle.setText(SSEUIMessages.Restore_Default_UI_); //$NON-NLS-1$ = "Restore Default"
+		fClearStyle.setLayoutData(new GridData(SWT.BEGINNING));
+		((GridData)fClearStyle.getLayoutData()).horizontalIndent = 20;
+		fClearStyle.setEnabled(false);
+
+		Composite sampleArea = createComposite(editor, 1);
+
+		((GridLayout) sampleArea.getLayout()).marginLeft = 5;
+		((GridLayout) sampleArea.getLayout()).marginTop = 5;
+		createLabel(sampleArea, SSEUIMessages.Sample_text__UI_); //$NON-NLS-1$ = "&Sample text:"
+		SourceViewer viewer = new SourceViewer(sampleArea, null, SWT.BORDER | SWT.LEFT_TO_RIGHT | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY);
+		fText = viewer.getTextWidget();
+		GridData gridData3 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData3.widthHint = convertWidthInCharsToPixels(20);
+		gridData3.heightHint = convertHeightInCharsToPixels(5);
+		gridData3.horizontalSpan = 2;
+		fText.setLayoutData(gridData3);
+		fText.setEditable(false);
+		fText.setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
+		fText.addKeyListener(getTextKeyListener());
+		fText.addSelectionListener(getTextSelectionListener());
+		fText.addMouseListener(getTextMouseListener());
+		fText.addTraverseListener(getTraverseListener());
+		setAccessible(fText, SSEUIMessages.Sample_text__UI_);
+		fDocument = StructuredModelManager.getModelManager().createStructuredDocumentFor(ContentTypeIdForHTML.ContentTypeID_HTML);
+		fDocument.set(getExampleText());
+		viewer.setDocument(fDocument);
+
+		top.setWeights(new int[]{1, 1});
+		editor.setWeights(new int[]{1, 1});
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(pageComponent, IHelpContextIds.HTML_PREFWEBX_STYLES_HELPID);
+
+		fStylesViewer.setInput(getStylePreferenceKeys());
+
+		applyStyles();
+
+		fStylesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if (!event.getSelection().isEmpty()) {
+					Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
+					String namedStyle = o.toString();
+					activate(namedStyle);
+					if (namedStyle == null)
+						return;
+				}
+			}
+		});
+
+		fForegroundColorEditor.addListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) {
+					Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+					String namedStyle = o.toString();
+					String prefString = getOverlayStore().getString(namedStyle);
+					String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+					if (stylePrefs != null) {
+						String oldValue = stylePrefs[0];
+						// open color dialog to get new color
+						String newValue = ColorHelper.toRGBString(fForegroundColorEditor.getColorValue());
+
+						if (!newValue.equals(oldValue)) {
+							stylePrefs[0] = newValue;
+							String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+							getOverlayStore().setValue(namedStyle, newPrefString);
+							applyStyles();
+							fText.redraw();
+						}
+					}
+				}
+			}
+		});
+
+		fBackgroundColorEditor.addListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) {
+					Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+					String namedStyle = o.toString();
+					String prefString = getOverlayStore().getString(namedStyle);
+					String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+					if (stylePrefs != null) {
+						String oldValue = stylePrefs[1];
+						// open color dialog to get new color
+						String newValue = ColorHelper.toRGBString(fBackgroundColorEditor.getColorValue());
+
+						if (!newValue.equals(oldValue)) {
+							stylePrefs[1] = newValue;
+							String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+							getOverlayStore().setValue(namedStyle, newPrefString);
+							applyStyles();
+							fText.redraw();
+							activate(namedStyle);
+						}
+					}
+				}
+			}
+		});
+
+		fBold.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[2];
+					String newValue = String.valueOf(fBold.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[2] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+
+		fItalic.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[3];
+					String newValue = String.valueOf(fItalic.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[3] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+
+		fStrike.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[4];
+					String newValue = String.valueOf(fStrike.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[4] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+
+		fUnderline.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[5];
+					String newValue = String.valueOf(fUnderline.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[5] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+		
+		fClearStyle.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (fStylesViewer.getSelection().isEmpty())
+					return;
+				String namedStyle = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement().toString();
+				getOverlayStore().setToDefault(namedStyle);
+				applyStyles();
+				fText.redraw();
+				activate(namedStyle);
+			}
+		});
+
+		return pageComponent;
+	}
+
+	private Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.WRAP);
+		label.setText(text);
+		GridData data = new GridData(SWT.FILL, SWT.FILL, false, false);
+		label.setLayoutData(data);
+		label.setBackground(parent.getBackground());
+		return label;
+	}
+
+	// protected Label createDescriptionLabel(Composite parent) {
+	// return null;
+	// }
+
+	/**
+	 * Set up all the style preference keys in the overlay store
+	 */
+	private OverlayKey[] createOverlayStoreKeys() {
+		List overlayKeys = new ArrayList();
+
+		Iterator i = getStylePreferenceKeys().iterator();
+		while (i.hasNext()) {
+			overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, (String) i.next()));
+		}
+
+		OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
+		overlayKeys.toArray(keys);
+		return keys;
+	}
+
+	/**
+	 * Creates the List viewer where we see the various syntax element display
+	 * names--would it ever be a Tree like JDT's?
+	 * 
+	 * @param parent
+	 * @return
+	 */
+	private StructuredViewer createStylesViewer(Composite parent) {
+		StructuredViewer stylesViewer = new ListViewer(parent, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
+		stylesViewer.setComparator(new ViewerComparator(Collator.getInstance()));
+		stylesViewer.setLabelProvider(new LabelProvider() {
+			public String getText(Object element) {
+				Object description = fStyleToDescriptionMap.get(element);
+				if (description != null)
+					return description.toString();
+				return super.getText(element);
+			}
+		});
+		stylesViewer.setContentProvider(new ITreeContentProvider() {
+			public void dispose() {
+			}
+
+			public Object[] getChildren(Object parentElement) {
+				return getStylePreferenceKeys().toArray();
+			}
+
+			public Object[] getElements(Object inputElement) {
+				return getChildren(inputElement);
+			}
+
+			public Object getParent(Object element) {
+				return getStylePreferenceKeys();
+			}
+
+			public boolean hasChildren(Object element) {
+				return false;
+			}
+
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+		});
+		return stylesViewer;
+	}
+
+	public void dispose() {
+		if (fOverlayStore != null) {
+			fOverlayStore.stop();
+		}
+		super.dispose();
+	}
+
+	protected IPreferenceStore doGetPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	private TextAttribute getAttributeFor(String namedStyle) {
+		TextAttribute ta = new TextAttribute(fDefaultForeground, fDefaultBackground, SWT.NORMAL);
+
+		if (namedStyle != null && fOverlayStore != null) {
+			// note: "namedStyle" *is* the preference key
+			String prefString = getOverlayStore().getString(namedStyle);
+			String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+			if (stylePrefs != null) {
+				RGB foreground = ColorHelper.toRGB(stylePrefs[0]);
+				RGB background = ColorHelper.toRGB(stylePrefs[1]);
+
+				int fontModifier = SWT.NORMAL;
+
+				if (stylePrefs.length > 2) {
+					boolean on = Boolean.valueOf(stylePrefs[2]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | SWT.BOLD;
+				}
+				if (stylePrefs.length > 3) {
+					boolean on = Boolean.valueOf(stylePrefs[3]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | SWT.ITALIC;
+				}
+				if (stylePrefs.length > 4) {
+					boolean on = Boolean.valueOf(stylePrefs[4]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | TextAttribute.STRIKETHROUGH;
+				}
+				if (stylePrefs.length > 5) {
+					boolean on = Boolean.valueOf(stylePrefs[5]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | TextAttribute.UNDERLINE;
+				}
+
+				ta = new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, fontModifier);
+			}
+		}
+		return ta;
+	}
+
+	private String getExampleText() {
+		return HTMLUIMessages.Sample_HTML_doc;
+	}
+
+	private String getNamedStyleAtOffset(int offset) {
+		// ensure the offset is clean
+		if (offset >= fDocument.getLength())
+			return getNamedStyleAtOffset(fDocument.getLength() - 1);
+		else if (offset < 0)
+			return getNamedStyleAtOffset(0);
+		IStructuredDocumentRegion documentRegion = fDocument.getFirstStructuredDocumentRegion();
+		while (documentRegion != null && !documentRegion.containsOffset(offset)) {
+			documentRegion = documentRegion.getNext();
+		}
+		if (documentRegion != null) {
+			// find the ITextRegion's Context at this offset
+			ITextRegion interest = documentRegion.getRegionAtCharacterOffset(offset);
+			if (interest == null)
+				return null;
+			if (offset > documentRegion.getTextEndOffset(interest))
+				return null;
+			String regionContext = interest.getType();
+			if (regionContext == null)
+				return null;
+			// find the named style (internal/selectable name) for that
+			// context
+			String namedStyle = (String) fContextToStyleMap.get(regionContext);
+			if (namedStyle != null) {
+				return namedStyle;
+			}
+		}
+		return null;
+	}
+
+	private OverlayPreferenceStore getOverlayStore() {
+		return fOverlayStore;
+	}
+
+	private Collection getStylePreferenceKeys() {
+		if (fStylePreferenceKeys == null) {
+			List styles = new ArrayList();
+			styles.add(IStyleConstantsXML.ENTITY_REFERENCE);
+			styles.add(IStyleConstantsXML.TAG_BORDER);
+			styles.add(IStyleConstantsXML.TAG_NAME);
+			styles.add(IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+			styles.add(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS);
+			styles.add(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+			styles.add(IStyleConstantsXML.COMMENT_BORDER);
+			styles.add(IStyleConstantsXML.COMMENT_TEXT);
+			styles.add(IStyleConstantsXML.DECL_BORDER);
+			styles.add(IStyleConstantsXML.XML_CONTENT);
+			styles.add(IStyleConstantsXML.DOCTYPE_NAME);
+			styles.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+			styles.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+			styles.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+//			styles.add(IStyleConstantsXML.CDATA_BORDER);
+//			styles.add(IStyleConstantsXML.CDATA_TEXT);
+//			styles.add(IStyleConstantsXML.PI_BORDER);
+//			styles.add(IStyleConstantsXML.PI_CONTENT);
+			fStylePreferenceKeys = styles;
+		}
+		return fStylePreferenceKeys;
+	}
+
+	private KeyListener getTextKeyListener() {
+		return new KeyListener() {
+			public void keyPressed(KeyEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+
+			public void keyReleased(KeyEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+		};
+	}
+
+	private MouseListener getTextMouseListener() {
+		return new MouseListener() {
+			public void mouseDoubleClick(MouseEvent e) {
+			}
+
+			public void mouseDown(MouseEvent e) {
+			}
+
+			public void mouseUp(MouseEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+		};
+	}
+
+	private SelectionListener getTextSelectionListener() {
+		return new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				selectColorAtOffset(e.x);
+				if (e.widget instanceof StyledText) {
+					((StyledText) e.widget).setSelection(e.x);
+				}
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				selectColorAtOffset(e.x);
+				if (e.widget instanceof StyledText) {
+					((StyledText) e.widget).setSelection(e.x);
+				}
+			}
+		};
+	}
+
+	private TraverseListener getTraverseListener() {
+		return new TraverseListener() {
+			/**
+			 * @see org.eclipse.swt.events.TraverseListener#keyTraversed(TraverseEvent)
+			 */
+			public void keyTraversed(TraverseEvent e) {
+				if (e.widget instanceof StyledText) {
+					if ((e.detail == SWT.TRAVERSE_TAB_NEXT) || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS))
+						e.doit = true;
+				}
+			}
+		};
+	}
+
+	public void init(IWorkbench workbench) {
+		setDescription(SSEUIMessages.SyntaxColoring_Description);
+
+		fStyleToDescriptionMap = new HashMap();
+		fContextToStyleMap = new HashMap();
+
+		initStyleToDescriptionMap();
+		initRegionContextToStyleMap();
+
+		fOverlayStore = new OverlayPreferenceStore(getPreferenceStore(), createOverlayStoreKeys());
+		fOverlayStore.load();
+		fOverlayStore.start();
+	}
+
+	private void initRegionContextToStyleMap() {
+		fContextToStyleMap.put(DOMRegionContext.XML_COMMENT_OPEN, IStyleConstantsXML.COMMENT_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_COMMENT_TEXT, IStyleConstantsXML.COMMENT_TEXT);
+		fContextToStyleMap.put(DOMRegionContext.XML_COMMENT_CLOSE, IStyleConstantsXML.COMMENT_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_OPEN, IStyleConstantsXML.TAG_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_END_TAG_OPEN, IStyleConstantsXML.TAG_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_NAME, IStyleConstantsXML.TAG_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_CLOSE, IStyleConstantsXML.TAG_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_EMPTY_TAG_CLOSE, IStyleConstantsXML.TAG_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_DECLARATION_OPEN, IStyleConstantsXML.DECL_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_DECLARATION_CLOSE, IStyleConstantsXML.DECL_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_ELEMENT_DECLARATION, IStyleConstantsXML.DECL_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_ELEMENT_DECL_CLOSE, IStyleConstantsXML.DECL_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_CHAR_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+		fContextToStyleMap.put(DOMRegionContext.XML_ENTITY_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+		fContextToStyleMap.put(DOMRegionContext.XML_PE_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_CONTENT, IStyleConstantsXML.XML_CONTENT);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_ELEMENT_DECL_NAME, IStyleConstantsXML.DOCTYPE_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_DECLARATION, IStyleConstantsXML.TAG_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_DECLARATION_CLOSE, IStyleConstantsXML.DECL_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_NAME, IStyleConstantsXML.DOCTYPE_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBLIC, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBREF, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSTEM, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSREF, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+
+//		fContextToStyleMap.put(DOMRegionContext.XML_PI_OPEN, IStyleConstantsXML.PI_BORDER);
+//		fContextToStyleMap.put(DOMRegionContext.XML_PI_CONTENT, IStyleConstantsXML.PI_CONTENT);
+//		fContextToStyleMap.put(DOMRegionContext.XML_CDATA_OPEN, IStyleConstantsXML.CDATA_BORDER);
+//		fContextToStyleMap.put(DOMRegionContext.XML_CDATA_TEXT, IStyleConstantsXML.CDATA_TEXT);
+//		fContextToStyleMap.put(DOMRegionContext.XML_CDATA_CLOSE, IStyleConstantsXML.CDATA_BORDER);
+	}
+
+	private void initStyleToDescriptionMap() {
+		fStyleToDescriptionMap.put(IStyleConstantsXML.COMMENT_BORDER, XMLUIMessages.Comment_Delimiters_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.COMMENT_TEXT, XMLUIMessages.Comment_Content_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_BORDER, XMLUIMessages.Tag_Delimiters_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_NAME, XMLUIMessages.Tag_Names_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_ATTRIBUTE_NAME, XMLUIMessages.Attribute_Names_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS, XMLUIMessages.Attribute_Equals_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE, XMLUIMessages.Attribute_Values_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DECL_BORDER, XMLUIMessages.Declaration_Delimiters_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.XML_CONTENT, XMLUIMessages.Content_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.ENTITY_REFERENCE, XMLUIMessages.Entity_Reference_UI_); //$NON-NLS-1$ = "Entity References"
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_NAME, XMLUIMessages.DOCTYPE_Name_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID, XMLUIMessages.DOCTYPE_SYSTEM_PUBLIC_Keyw_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF, XMLUIMessages.DOCTYPE_Public_Reference_UI_); // =
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF, XMLUIMessages.DOCTYPE_System_Reference_UI_); // =
+//		fStyleToDescriptionMap.put(IStyleConstantsXML.PI_BORDER, XMLUIMessages.Processing_Instruction_Del_UI_);
+//		fStyleToDescriptionMap.put(IStyleConstantsXML.PI_CONTENT, XMLUIMessages.Processing_Instruction_Con_UI__UI_);
+//		fStyleToDescriptionMap.put(IStyleConstantsXML.CDATA_BORDER, XMLUIMessages.CDATA_Delimiters_UI_);
+//		fStyleToDescriptionMap.put(IStyleConstantsXML.CDATA_TEXT, XMLUIMessages.CDATA_Content_UI_);
+}
+
+	protected void performDefaults() {
+		super.performDefaults();
+		getOverlayStore().loadDefaults();
+		applyStyles();
+		fStylesViewer.setSelection(StructuredSelection.EMPTY);
+		activate(null);
+		fText.redraw();
+	}
+
+	public boolean performOk() {
+		getOverlayStore().propagate();
+
+		HTMLUIPlugin.getDefault().savePluginPreferences();
+		SSEUIPlugin.getDefault().savePluginPreferences();
+		return true;
+	}
+
+	private void selectColorAtOffset(int offset) {
+		String namedStyle = getNamedStyleAtOffset(offset);
+		if (namedStyle != null) {
+			fStylesViewer.setSelection(new StructuredSelection(namedStyle));
+			fStylesViewer.reveal(namedStyle);
+		}
+		else {
+			fStylesViewer.setSelection(StructuredSelection.EMPTY);
+		}
+		activate(namedStyle);
+	}
+
+	/**
+	 * Specifically set the reporting name of a control for accessibility
+	 */
+	private void setAccessible(Control control, String name) {
+		if (control == null)
+			return;
+		final String n = name;
+		control.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+			public void getName(AccessibleEvent e) {
+				if (e.childID == ACC.CHILDID_SELF)
+					e.result = n;
+			}
+		});
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLTemplatePreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLTemplatePreferencePage.java
new file mode 100644
index 0000000..0700d82
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLTemplatePreferencePage.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+
+
+/**
+ * Preference page for HTML templates
+ */
+public class HTMLTemplatePreferencePage extends TemplatePreferencePage {
+		class HTMLEditTemplateDialog extends EditTemplateDialog {
+		public HTMLEditTemplateDialog(Shell parent, Template template, boolean edit, boolean isNameModifiable, ContextTypeRegistry registry) {
+			super(parent, template, edit, isNameModifiable, registry);
+		}
+
+		protected SourceViewer createViewer(Composite parent) {
+			SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
+				StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationHTML();
+
+				public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+					return baseConfiguration.getConfiguredContentTypes(sourceViewer);
+				}
+
+				public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+					return baseConfiguration.getLineStyleProviders(sourceViewer, partitionType);
+				}
+
+				public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+					ContentAssistant assistant = new ContentAssistant();
+					assistant.enableAutoActivation(true);
+					assistant.enableAutoInsert(true);
+					assistant.setContentAssistProcessor(getTemplateProcessor(), IDocument.DEFAULT_CONTENT_TYPE);
+					return assistant;
+				}
+			};
+			return doCreateViewer(parent, sourceViewerConfiguration);
+		}
+	}
+
+	public HTMLTemplatePreferencePage() {
+		HTMLUIPlugin htmlEditorPlugin = HTMLUIPlugin.getDefault();
+		
+		setPreferenceStore(htmlEditorPlugin.getPreferenceStore());
+		setTemplateStore(htmlEditorPlugin.getTemplateStore());
+		setContextTypeRegistry(htmlEditorPlugin.getTemplateContextRegistry());
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+	 */
+	public boolean performOk() {
+  	  boolean ok = super.performOk();
+  	  HTMLUIPlugin.getDefault().savePluginPreferences();
+	  return ok;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.templates.TemplatePreferencePage#isShowFormatterSetting()
+	 */
+	protected boolean isShowFormatterSetting() {
+		// template formatting has not been implemented
+		return false;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite ancestor) {
+		Control c = super.createContents(ancestor);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(c, IHelpContextIds.HTML_PREFWEBX_TEMPLATES_HELPID);
+		return c;
+	}
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.templates.TemplatePreferencePage#createViewer(org.eclipse.swt.widgets.Composite)
+	 */
+	protected SourceViewer createViewer(Composite parent) {
+		SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
+			StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationHTML();
+
+			public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+				return baseConfiguration.getConfiguredContentTypes(sourceViewer);
+			}
+
+			public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+				return baseConfiguration.getLineStyleProviders(sourceViewer, partitionType);
+			}
+		};
+		return doCreateViewer(parent, sourceViewerConfiguration);
+	}
+
+	SourceViewer doCreateViewer(Composite parent, SourceViewerConfiguration viewerConfiguration) {
+		SourceViewer viewer = null;
+		String contentTypeID = ContentTypeIdForHTML.ContentTypeID_HTML;
+		viewer = new StructuredTextViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+		viewer.getTextWidget().setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
+		IStructuredModel scratchModel = StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(contentTypeID);
+		IDocument document = scratchModel.getStructuredDocument();
+		viewer.configure(viewerConfiguration);
+		viewer.setDocument(document);
+		return viewer;
+	}
+
+	/**
+	 * Creates the edit dialog. Subclasses may override this method to provide
+	 * a custom dialog.
+	 * 
+	 * @param template
+	 *            the template being edited
+	 * @param edit
+	 *            whether the dialog should be editable
+	 * @param isNameModifiable
+	 *            whether the template name may be modified
+	 * @return the created or modified template, or <code>null</code> if the
+	 *         edition failed
+	 * @since 3.1
+	 */
+	protected Template editTemplate(Template template, boolean edit, boolean isNameModifiable) {
+		EditTemplateDialog dialog = new HTMLEditTemplateDialog(getShell(), template, edit, isNameModifiable, getContextTypeRegistry());
+		if (dialog.open() == Window.OK) {
+			return dialog.getTemplate();
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLTypingPreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLTypingPreferencePage.java
new file mode 100644
index 0000000..8942dfe
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLTypingPreferencePage.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class HTMLTypingPreferencePage extends AbstractPreferencePage {
+
+	private Button fCloseComment;
+	private Button fCloseEndTag;
+	private Button fRemoveEndTag;
+	private Button fCloseElement;
+	private Button fCloseStrings;
+	private Button fCloseBrackets;
+	
+	protected Control createContents(Composite parent) {
+		Composite composite = super.createComposite(parent, 1);
+		
+		createStartTagGroup(composite);
+		createEndTagGroup(composite);
+		createAutoComplete(composite);
+		createAutoRemove(composite);
+		
+		setSize(composite);
+		loadPreferences();
+		
+		return composite;
+	}
+	
+	private void createStartTagGroup(Composite parent) {
+		Group group = createGroup(parent, 2);
+
+		group.setText(XMLUIMessages.XMLTyping_Start_Tag);
+
+		fCloseElement = createCheckBox(group, XMLUIMessages.XMLTyping_Complete_Elements);
+		((GridData) fCloseElement.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	private void createEndTagGroup(Composite parent) {
+		Group group = createGroup(parent, 2);
+
+		group.setText(XMLUIMessages.XMLTyping_End_Tag);
+
+		fCloseEndTag = createCheckBox(group, XMLUIMessages.XMLTyping_Complete_End_Tags);
+		((GridData) fCloseEndTag.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	private void createAutoComplete(Composite parent) {
+		Group group = createGroup(parent, 2);
+
+		group.setText(HTMLUIMessages.HTMLTyping_Auto_Complete);
+
+		fCloseComment = createCheckBox(group, HTMLUIMessages.HTMLTyping_Complete_Comments);
+		((GridData) fCloseComment.getLayoutData()).horizontalSpan = 2;
+
+		fCloseStrings = createCheckBox(group, HTMLUIMessages.HTMLTyping_Close_Strings);
+		((GridData) fCloseStrings.getLayoutData()).horizontalSpan = 2;
+
+		fCloseBrackets = createCheckBox(group, HTMLUIMessages.HTMLTyping_Close_Brackets);
+		((GridData) fCloseBrackets.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	private void createAutoRemove(Composite parent) {
+		Group group = createGroup(parent, 2);
+		
+		group.setText(HTMLUIMessages.HTMLTyping_Auto_Remove);
+		
+		fRemoveEndTag = createCheckBox(group, HTMLUIMessages.HTMLTyping_Remove_End_Tags);
+		((GridData) fRemoveEndTag.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	public boolean performOk() {
+		boolean result = super.performOk();
+		
+		HTMLUIPlugin.getDefault().savePluginPreferences();
+		
+		return result;
+	}
+	
+	protected void initializeValues() {
+		initCheckbox(fCloseComment, HTMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS);
+		initCheckbox(fCloseEndTag, HTMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS);
+		initCheckbox(fCloseElement, HTMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS);
+		initCheckbox(fRemoveEndTag, HTMLUIPreferenceNames.TYPING_REMOVE_END_TAGS);
+		initCheckbox(fCloseStrings, HTMLUIPreferenceNames.TYPING_CLOSE_STRINGS);
+		initCheckbox(fCloseBrackets, HTMLUIPreferenceNames.TYPING_CLOSE_BRACKETS);
+	}
+	
+	protected void performDefaults() {
+		defaultCheckbox(fCloseComment, HTMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS);
+		defaultCheckbox(fCloseEndTag, HTMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS);
+		defaultCheckbox(fCloseElement, HTMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS);
+		defaultCheckbox(fRemoveEndTag, HTMLUIPreferenceNames.TYPING_REMOVE_END_TAGS);
+		defaultCheckbox(fCloseStrings, HTMLUIPreferenceNames.TYPING_CLOSE_STRINGS);
+		defaultCheckbox(fCloseBrackets, HTMLUIPreferenceNames.TYPING_CLOSE_BRACKETS);
+	}
+	
+	protected void storeValues() {
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS, (fCloseComment != null) ? fCloseComment.getSelection() : false);
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS, (fCloseEndTag != null) ? fCloseEndTag.getSelection() : false);
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS, (fCloseElement != null) ? fCloseElement.getSelection() : false);
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.TYPING_REMOVE_END_TAGS, (fRemoveEndTag != null) ? fRemoveEndTag.getSelection() : false);
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.TYPING_CLOSE_STRINGS, (fCloseStrings != null) ? fCloseStrings.getSelection() : false);
+		getPreferenceStore().setValue(HTMLUIPreferenceNames.TYPING_CLOSE_BRACKETS, (fCloseBrackets != null) ? fCloseBrackets.getSelection() : false);
+	}
+	
+	protected IPreferenceStore doGetPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLValidationPreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLValidationPreferencePage.java
new file mode 100644
index 0000000..1a1f612
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLValidationPreferencePage.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.sse.core.internal.validate.ValidationMessage;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ScrolledPageContent;
+
+public class HTMLValidationPreferencePage extends AbstractValidationSettingsPage {
+	
+	private static final int[] SEVERITIES = {ValidationMessage.ERROR, ValidationMessage.WARNING, ValidationMessage.IGNORE};
+	
+	private static final String SETTINGS_SECTION_NAME = "HTMLValidationSeverities";//$NON-NLS-1$
+	
+	public HTMLValidationPreferencePage() {
+		super();
+	}
+	
+	private PixelConverter fPixelConverter;
+	
+	protected Control createCommonContents(Composite parent) {
+		final Composite page = new Composite(parent, SWT.NULL);
+		
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		page.setLayout(layout);
+		
+		fPixelConverter = new PixelConverter(parent);
+		
+		final Composite content = createValidationSection(page);
+
+		GridData gridData= new GridData(GridData.FILL, GridData.FILL, true, true);
+		gridData.heightHint = fPixelConverter.convertHeightInCharsToPixels(20);
+		content.setLayoutData(gridData);
+		
+		return page;
+	}
+	
+	private Composite createValidationSection(Composite page) {
+		int nColumns = 3;
+		
+		final ScrolledPageContent spContent = new ScrolledPageContent(page);
+		
+		Composite composite = spContent.getBody();
+		
+		GridLayout layout= new GridLayout(nColumns, false);
+		layout.marginHeight= 0;
+		layout.marginWidth= 0;
+		composite.setLayout(layout);
+		
+		Label description = new Label(composite, SWT.NONE);
+		description.setText(HTMLUIMessages.Validation_description);
+		description.setFont(page.getFont());
+
+		
+		ExpandableComposite ec;
+		Composite inner;
+		String label;
+		
+		String[] errorWarningIgnoreLabel = new String[] { HTMLUIMessages.Validation_Error, HTMLUIMessages.Validation_Warning, HTMLUIMessages.Validation_Ignore };
+		
+		// Element section
+		
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_elements, nColumns);
+		
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_8;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_UNKNOWN_NAME, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_9;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_INVALID_NAME, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_10;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_START_INVALID_CASE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_11;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_END_INVALID_CASE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_12;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_MISSING_START, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_13;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_MISSING_END, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_14;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_UNNECESSARY_END, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_15;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_INVALID_DIRECTIVE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_16;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_INVALID_CONTENT, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_17;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_DUPLICATE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_18;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_COEXISTENCE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_19;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_UNCLOSED_START_TAG, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_20;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_UNCLOSED_END_TAG, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_21;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ELEM_INVALID_EMPTY_TAG, SEVERITIES, errorWarningIgnoreLabel, 0);
+		// End Element Section
+		
+		// The Attribute validation section
+		
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_attributes, nColumns);
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_0;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_UNDEFINED_NAME, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_1;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_UNDEFINED_VALUE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_2;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_NAME_MISMATCH, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_3;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_INVALID_NAME, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_4;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_INVALID_VALUE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_5;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_DUPLICATE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_6;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_VALUE_MISMATCH, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_7;
+		addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_VALUE_UNCLOSED, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_35;
+		// TODO: validate resources?
+		// addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND, SEVERITIES, errorWarningIgnoreLabel, 0);
+
+		// End Attribute section
+		
+		
+		// Document Type
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_document_type, nColumns);
+		
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_22;
+		addComboBox(inner, label, HTMLCorePreferenceNames.DOC_DUPLICATE, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_23;
+		addComboBox(inner, label, HTMLCorePreferenceNames.DOC_INVALID_CONTENT, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_24;
+		addComboBox(inner, label, HTMLCorePreferenceNames.DOC_DOCTYPE_UNCLOSED, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		// End Document Type
+		
+		// Comments
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_comment, nColumns);
+		
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_27;
+		addComboBox(inner, label, HTMLCorePreferenceNames.COMMENT_INVALID_CONTENT, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_28;
+		addComboBox(inner, label, HTMLCorePreferenceNames.COMMENT_UNCLOSED, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		// End Comments
+		
+		
+		// CDATA Sections
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_cdata, nColumns);
+		
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_29;
+		addComboBox(inner, label, HTMLCorePreferenceNames.CDATA_INVALID_CONTENT, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_30;
+		addComboBox(inner, label, HTMLCorePreferenceNames.CDATA_UNCLOSED, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		// End CDATA Sections
+		
+		// Processing Instructions
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_pi, nColumns);
+		
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_31;
+		addComboBox(inner, label, HTMLCorePreferenceNames.PI_INVALID_CONTENT, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_32;
+		addComboBox(inner, label, HTMLCorePreferenceNames.PI_UNCLOSED, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		// End Processing Instructions
+		
+		// Entity References
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_entity_ref, nColumns);
+		
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_33;
+		addComboBox(inner, label, HTMLCorePreferenceNames.REF_INVALID_CONTENT, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_34;
+		addComboBox(inner, label, HTMLCorePreferenceNames.REF_UNDEFINED, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		
+		// End Entity References
+		
+		
+		// Text Content
+		ec = createStyleSection(composite, HTMLUIMessages.Expandable_label_text, nColumns);
+		
+		inner = new Composite(ec, SWT.NONE);
+		inner.setFont(composite.getFont());
+		inner.setLayout(new GridLayout(nColumns, false));
+		ec.setClient(inner);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_25;
+		addComboBox(inner, label, HTMLCorePreferenceNames.TEXT_INVALID_CONTENT, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		label = HTMLUIMessages.HTMLValidationPreferencePage_26;
+		addComboBox(inner, label, HTMLCorePreferenceNames.TEXT_INVALID_CHAR, SEVERITIES, errorWarningIgnoreLabel, 0);
+		
+		// End Text Content
+		
+		restoreSectionExpansionStates(getDialogSettings().getSection(SETTINGS_SECTION_NAME));
+		
+		return spContent;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		resetSeverities();
+		super.performDefaults();
+	}
+	
+	protected IDialogSettings getDialogSettings() {
+		return HTMLUIPlugin.getDefault().getDialogSettings();
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
+	 */
+	public void dispose() {
+		storeSectionExpansionStates(getDialogSettings().addNewSection(SETTINGS_SECTION_NAME));
+		super.dispose();
+	}
+	
+	protected String getQualifier() {
+		return HTMLCorePlugin.getDefault().getBundle().getSymbolicName();
+	}
+	
+	protected String getPreferenceNodeQualifier() {
+		return HTMLCorePlugin.getDefault().getBundle().getSymbolicName();
+	}
+
+	protected String getPreferencePageID() {
+		return "org.eclipse.wst.html.ui.preferences.validation";//$NON-NLS-1$
+	}
+
+	protected String getProjectSettingsKey() {
+		return HTMLCorePreferenceNames.USE_PROJECT_SETTINGS;
+	}
+
+	protected String getPropertyPageID() {
+		return "org.eclipse.wst.html.ui.propertyPage.project.validation";//$NON-NLS-1$
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/PropertyPreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/PropertyPreferencePage.java
new file mode 100644
index 0000000..ae95c84
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/PropertyPreferencePage.java
@@ -0,0 +1,300 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.preferences.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.dialogs.ControlEnableState;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.dialogs.ListDialog;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.views.navigator.ResourceSorter;
+import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * Based loosely on org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage
+ */
+abstract class PropertyPreferencePage extends PropertyPage implements IWorkbenchPreferencePage {
+	private static final boolean _debugPreferences = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/preferences-properties")); //$NON-NLS-1$ //$NON-NLS-2$
+	/*
+	 * Disable link data, prevents the display of a "workspace" or "project"
+	 * settings link to prevent recursive dialog launching
+	 */
+	private static final Object DISABLE_LINK = "DISABLE_LINK"; //$NON-NLS-1$
+
+	private Map fData = null;
+
+	private Button fEnableProjectSettings;
+
+	private Link fProjectSettingsLink;
+	
+	private Control fCommon;
+	
+	private ControlEnableState fEnablements;
+
+	public PropertyPreferencePage() {
+		super();
+	}
+
+	public final void applyData(Object data) {
+		super.applyData(data);
+		if (data instanceof Map) {
+			fData = (Map) data;
+			updateLinkEnablement();
+		}
+	}
+
+	protected abstract Control createCommonContents(Composite composite);
+
+	public final Control createContents(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		GridLayout layout = new GridLayout();
+		composite.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		composite.setLayoutData(data);
+
+		Composite checkLinkComposite = new Composite(composite, SWT.NONE);
+		checkLinkComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		checkLinkComposite.setLayout(new GridLayout(2, false));
+
+		if (getProject() != null) {
+			fEnableProjectSettings = new Button(checkLinkComposite, SWT.CHECK);
+			fEnableProjectSettings.setText(SSEUIMessages.EnableProjectSettings); //$NON-NLS-1$//$NON-NLS-2$
+			fEnableProjectSettings.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+			boolean enabledForProject = createPreferenceScopes()[0].getNode(getPreferenceNodeQualifier()).getBoolean(getProjectSettingsKey(), false);
+			fEnableProjectSettings.setSelection(enabledForProject);
+		}
+		else {
+			Label spacer = new Label(checkLinkComposite, SWT.CHECK);
+			spacer.setLayoutData(new GridData());
+		}
+
+		fProjectSettingsLink = new Link(checkLinkComposite, SWT.NONE);
+		fProjectSettingsLink.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
+
+		/*
+		 * "element" should be a project, if null, link to per-project
+		 * properties
+		 */
+		if (getProject() != null) {
+			fProjectSettingsLink.setText("<a>" + SSEUIMessages.ConfigureWorkspaceSettings + "</a>"); //$NON-NLS-1$//$NON-NLS-2$
+		}
+		else {
+			fProjectSettingsLink.setText("<a>" + SSEUIMessages.ConfigureProjectSettings + "</a>"); //$NON-NLS-1$//$NON-NLS-2$
+		}
+
+		updateLinkEnablement();
+
+		fProjectSettingsLink.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				if (getProject() == null) {
+					openProjectSettings();
+				}
+				else {
+					openWorkspaceSettings();
+				}
+			}
+
+		});
+
+		if (getProject() != null) {
+			Label line = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
+			line.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+		}
+
+//		final Control common = createCommonContents(composite);
+		fCommon = createCommonContents(composite);
+		
+		fCommon.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		if (fEnableProjectSettings != null) {
+			SelectionAdapter selectionAdapter = new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					super.widgetSelected(e);
+					enablePreferenceContent(fEnableProjectSettings.getSelection());
+				}
+			};
+			selectionAdapter.widgetSelected(null);
+			fEnableProjectSettings.addSelectionListener(selectionAdapter);
+		}
+		
+		applyDialogFont(composite);
+		return composite;
+	}
+
+	protected IScopeContext[] createPreferenceScopes() {
+		IProject project = getProject();
+		if (project != null) {
+			return new IScopeContext[]{new ProjectScope(project), new InstanceScope(), new DefaultScope()};
+		}
+		return new IScopeContext[]{new InstanceScope(), new DefaultScope()};
+	}
+
+	protected abstract String getPreferenceNodeQualifier();
+
+	protected abstract String getPreferencePageID();
+
+	protected IProject getProject() {
+		if (getElement() != null) {
+			if (getElement() instanceof IProject) {
+				return (IProject) getElement();
+			}
+			Object adapter = getElement().getAdapter(IProject.class);
+			if (adapter instanceof IProject) {
+				return (IProject) adapter;
+			}
+			adapter = getElement().getAdapter(IResource.class);
+			if (adapter instanceof IProject) {
+				return (IProject) adapter;
+			}
+		}
+		return null;
+	}
+
+	protected abstract String getProjectSettingsKey();
+
+	protected abstract String getPropertyPageID();
+
+	protected boolean isElementSettingsEnabled() {
+		return fEnableProjectSettings != null && fEnableProjectSettings.getSelection();
+	}
+
+	void openProjectSettings() {
+		ListDialog dialog = new ListDialog(getShell()) {
+
+			protected Control createDialogArea(Composite container) {
+				Control area = super.createDialogArea(container);
+				getTableViewer().setSorter(new ResourceSorter(ResourceSorter.NAME));
+				return area;
+			}
+		};
+		dialog.setMessage(SSEUIMessages.PropertyPreferencePage_02);
+		dialog.setContentProvider(new IStructuredContentProvider() {
+			public void dispose() {
+			}
+
+			public Object[] getElements(Object inputElement) {
+				return ((IWorkspace) inputElement).getRoot().getProjects();
+			}
+
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+		});
+		dialog.setLabelProvider(new DecoratingLabelProvider(new WorkbenchLabelProvider(), SSEUIPlugin.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));
+		dialog.setInput(ResourcesPlugin.getWorkspace());
+		dialog.setTitle(SSEUIMessages.PropertyPreferencePage_01);
+		if (dialog.open() == Window.OK) {
+			Object[] result = dialog.getResult();
+			if (result.length > 0) {
+				IProject project = (IProject) dialog.getResult()[0];
+				Map data = new HashMap();
+				data.put(DISABLE_LINK, Boolean.TRUE);
+				PreferencesUtil.createPropertyDialogOn(getShell(), project, getPropertyPageID(), new String[]{getPropertyPageID()}, data).open();
+			}
+		}
+	}
+
+	void openWorkspaceSettings() {
+		Map data = new HashMap();
+		data.put(DISABLE_LINK, Boolean.TRUE);
+		PreferencesUtil.createPreferenceDialogOn(getShell(), getPreferencePageID(), new String[]{getPreferencePageID()}, data).open();
+	}
+
+	public boolean performOk() {
+		boolean ok = super.performOk();
+		IScopeContext[] preferenceScopes = createPreferenceScopes();
+		if (getProject() != null) {
+			if (isElementSettingsEnabled()) {
+				if (_debugPreferences) {
+					System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " (" + true + ") in scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+				}
+				preferenceScopes[0].getNode(getPreferenceNodeQualifier()).putBoolean(getProjectSettingsKey(), fEnableProjectSettings.getSelection());
+			}
+			else {
+				if (_debugPreferences) {
+					System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " from scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+				}
+				preferenceScopes[0].getNode(getPreferenceNodeQualifier()).remove(getProjectSettingsKey());
+			}
+		}
+		return ok;
+	}
+	
+	protected void performDefaults() {
+		if(getProject() != null && fEnableProjectSettings != null) {
+			fEnableProjectSettings.setSelection(false);
+			enablePreferenceContent(false);
+		}
+		super.performDefaults();
+	}
+
+	private void updateLinkEnablement() {
+		if (fData != null && fProjectSettingsLink != null) {
+			fProjectSettingsLink.setEnabled(!Boolean.TRUE.equals(fData.get(DISABLE_LINK)));
+		}
+	}
+	
+	/**
+	 * Controls the enablement of the common content region
+	 * of a property or preference page
+	 * 
+	 * @param enable the enabled state of the common content
+	 * area
+	 */
+	protected void enablePreferenceContent(boolean enable) {
+		if(enable) {
+			if(fEnablements != null) {
+				fEnablements.restore();
+				fEnablements = null;
+			}
+		}
+		else {
+			if(fEnablements == null)
+				fEnablements = ControlEnableState.disable(fCommon);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/registry/AdapterFactoryProviderForHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/registry/AdapterFactoryProviderForHTML.java
new file mode 100644
index 0000000..145ab9a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/registry/AdapterFactoryProviderForHTML.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.registry;
+
+import org.eclipse.wst.html.core.internal.modelhandler.ModelHandlerForHTML;
+import org.eclipse.wst.html.ui.internal.contentoutline.JFaceNodeAdapterFactoryForHTML;
+import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler;
+import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryProvider;
+import org.eclipse.wst.sse.ui.internal.util.Assert;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+
+
+public class AdapterFactoryProviderForHTML implements AdapterFactoryProvider {
+
+
+	public void addAdapterFactories(IStructuredModel structuredModel) {
+
+		// these are the normal edit side content based factories
+		addContentBasedFactories(structuredModel);
+		// Must update/add to propagating adapter here too
+		if (structuredModel instanceof IDOMModel) {
+			addPropagatingAdapters(structuredModel);
+		}
+	}
+
+	protected void addContentBasedFactories(IStructuredModel structuredModel) {
+
+		FactoryRegistry factoryRegistry = structuredModel.getFactoryRegistry();
+		Assert.isNotNull(factoryRegistry, "Program Error: client caller must ensure model has factory registry"); //$NON-NLS-1$
+		INodeAdapterFactory factory = null;
+
+		factory = factoryRegistry.getFactoryFor(IJFaceNodeAdapter.class);
+		if (factory == null) {
+			factory = new JFaceNodeAdapterFactoryForHTML();
+			factoryRegistry.addFactory(factory);
+		}
+	}
+
+	protected void addPropagatingAdapters(IStructuredModel structuredModel) {
+		// no propagating to add
+	}
+
+	/*
+	 * @see AdapterFactoryProvider#isFor(ContentTypeDescription)
+	 */
+	public boolean isFor(IDocumentTypeHandler contentTypeDescription) {
+		return (contentTypeDescription instanceof ModelHandlerForHTML);
+	}
+
+	public void reinitializeFactories(IStructuredModel structuredModel) {
+		// nothing to do, since no embedded type
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/search/HTMLFindOccurrencesActionDelegate.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/search/HTMLFindOccurrencesActionDelegate.java
new file mode 100644
index 0000000..23c2c49
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/search/HTMLFindOccurrencesActionDelegate.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.html.ui.internal.search;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesActionDelegate;
+
+/**
+ * Sets up FindOccurrencesActionDelegate for html find occurrences processors
+ */
+public class HTMLFindOccurrencesActionDelegate extends FindOccurrencesActionDelegate {
+	private List fProcessors;
+
+	protected List getProcessors() {
+		if (fProcessors == null) {
+			fProcessors = new ArrayList();
+			HTMLFindOccurrencesProcessor htmlProcessor = new HTMLFindOccurrencesProcessor();
+			fProcessors.add(htmlProcessor);
+		}
+		return fProcessors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/search/HTMLFindOccurrencesProcessor.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/search/HTMLFindOccurrencesProcessor.java
new file mode 100644
index 0000000..c20efa1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/search/HTMLFindOccurrencesProcessor.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.html.ui.internal.search;
+
+import org.eclipse.wst.html.core.text.IHTMLPartitions;
+import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesProcessor;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+
+/**
+ * Configures a FindOccurrencesProcessor with HTML partitions and regions
+ */
+public class HTMLFindOccurrencesProcessor extends FindOccurrencesProcessor {
+
+	protected String[] getPartitionTypes() {
+		return new String[]{IHTMLPartitions.HTML_DEFAULT, IXMLPartitions.XML_DEFAULT};
+	}
+
+	protected String[] getRegionTypes() {
+		return new String[]{DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE};
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/style/IStyleConstantsHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/style/IStyleConstantsHTML.java
new file mode 100644
index 0000000..81f765c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/style/IStyleConstantsHTML.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.style;
+
+import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML;
+
+/**
+ * Contains the symbolic name of styles used by LineStyleProvider, ColorManager, and
+ * any others who may be interested
+ */
+public interface IStyleConstantsHTML extends IStyleConstantsXML {
+	public static final String SCRIPT_AREA_BORDER = "SCRIPT_AREA_BORDER";//$NON-NLS-1$
+	public static final String SCRIPT_AREA = "SCRIPT_AREA";//$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/style/LineStyleProviderForHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/style/LineStyleProviderForHTML.java
new file mode 100644
index 0000000..4db6f64
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/style/LineStyleProviderForHTML.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.style;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML;
+import org.eclipse.wst.xml.ui.internal.style.LineStyleProviderForXML;
+
+public class LineStyleProviderForHTML extends LineStyleProviderForXML implements LineStyleProvider {
+
+	public LineStyleProviderForHTML() {
+		super();
+	}
+
+	/**
+	 * a method to centralize all the "format rules" for regions 
+	 * specifically associated for how to "open" the region.
+	 */
+	// NOTE: this method was just copied down form LineStyleProviderForXML
+	public TextAttribute getAttributeFor(ITextRegion region) {
+		// not sure why this is coming through null, but just to catch it
+		if (region == null) {
+			return (TextAttribute)getTextAttributes().get(IStyleConstantsXML.XML_CONTENT);
+		}
+		String type = region.getType();
+		if (type == DOMRegionContext.BLOCK_TEXT) {
+			return (TextAttribute)getTextAttributes().get(IStyleConstantsXML.XML_CONTENT);
+		}
+		// workaround: make PI edges the same color as tag edges
+		else if ((type == DOMRegionContext.XML_PI_OPEN) || (type == DOMRegionContext.XML_PI_CLOSE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_BORDER);
+		}
+		// first try "standard" tag attributes from super class
+		return super.getAttributeFor(region);
+	}
+
+	protected void loadColors() {
+		super.loadColors();
+
+		addTextAttribute(IStyleConstantsHTML.SCRIPT_AREA_BORDER);
+	}
+	
+	
+	protected void handlePropertyChange(PropertyChangeEvent event) {
+		if (event != null) {
+			String prefKey = event.getProperty();
+			// check if preference changed is a style preference
+			if (IStyleConstantsHTML.SCRIPT_AREA_BORDER.equals(prefKey)) {
+				addTextAttribute(IStyleConstantsHTML.SCRIPT_AREA_BORDER);
+
+				// this is what AbstractLineStyleProvider.propertyChange() does
+				getHighlighter().refreshDisplay();
+			} else {
+				super.handlePropertyChange(event);
+			}
+		} else {
+			super.handlePropertyChange(event);
+		}
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.style.AbstractLineStyleProvider#getColorPreferences()
+	 */
+	protected IPreferenceStore getColorPreferences() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLInformationProvider.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLInformationProvider.java
new file mode 100644
index 0000000..5f859c7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLInformationProvider.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.taginfo;
+
+
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.IInformationProviderExtension;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * Provides context information for HTML tags (Shows tooltip description)
+ * 
+ * @deprecated StructuredTextViewerConfiguration creates the appropriate
+ *             information provider
+ */
+public class HTMLInformationProvider implements IInformationProvider, IInformationProviderExtension {
+
+	private ITextHover fTextHover = null;
+
+	public HTMLInformationProvider() {
+		fTextHover = SSEUIPlugin.getDefault().getTextHoverManager().createBestMatchHover(new HTMLTagInfoHoverProcessor());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.information.IInformationProvider#getSubject(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public IRegion getSubject(ITextViewer textViewer, int offset) {
+		return fTextHover.getHoverRegion(textViewer, offset);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.information.IInformationProvider#getInformation(org.eclipse.jface.text.ITextViewer,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public String getInformation(ITextViewer textViewer, IRegion subject) {
+		return (String) getInformation2(textViewer, subject);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.information.IInformationProviderExtension#getInformation2(org.eclipse.jface.text.ITextViewer,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public Object getInformation2(ITextViewer textViewer, IRegion subject) {
+		return fTextHover.getHoverInfo(textViewer, subject);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLTagInfoHoverProcessor.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLTagInfoHoverProcessor.java
new file mode 100644
index 0000000..a99186a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLTagInfoHoverProcessor.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.taginfo;
+
+
+
+import org.eclipse.wst.xml.ui.internal.taginfo.XMLTagInfoHoverProcessor;
+
+/**
+ * Provides hover help documentation for HTML tags
+ * 
+ * @author amywu
+ */
+public class HTMLTagInfoHoverProcessor extends XMLTagInfoHoverProcessor {
+	//	currently empty because XMLTagInfoHoverProcessor handles all cases relevant to HTML
+	public HTMLTagInfoHoverProcessor() {
+		super();
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/EncodingTemplateVariableResolverHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/EncodingTemplateVariableResolverHTML.java
new file mode 100644
index 0000000..aca7d17
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/EncodingTemplateVariableResolverHTML.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.templates;
+
+import org.eclipse.jface.text.templates.SimpleTemplateVariableResolver;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+
+
+public class EncodingTemplateVariableResolverHTML extends SimpleTemplateVariableResolver {
+	private static final String ENCODING_TYPE = getEncodingType();
+
+	private static String getEncodingType() {
+		return "encoding"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Creates a new encoding variable
+	 */
+	public EncodingTemplateVariableResolverHTML() {
+		super(ENCODING_TYPE, HTMLUIMessages.Creating_files_encoding);
+	}
+
+	protected String resolve(TemplateContext context) {
+		return HTMLCorePlugin.getDefault().getPluginPreferences().getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/TemplateContextTypeHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/TemplateContextTypeHTML.java
new file mode 100644
index 0000000..2a18055
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/TemplateContextTypeHTML.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.templates;
+
+import org.eclipse.jface.text.templates.GlobalTemplateVariables;
+import org.eclipse.jface.text.templates.TemplateContextType;
+
+/**
+ * Base class for HTML template context types. Templates of this context type
+ * apply to any place within HTML content type.
+ */
+public class TemplateContextTypeHTML extends TemplateContextType {
+
+	public TemplateContextTypeHTML() {
+		super();
+		addResolver(new GlobalTemplateVariables.Cursor());
+		addResolver(new GlobalTemplateVariables.Date());
+		addResolver(new GlobalTemplateVariables.Dollar());
+		addResolver(new GlobalTemplateVariables.LineSelection());
+		addResolver(new GlobalTemplateVariables.Time());
+		addResolver(new GlobalTemplateVariables.User());
+		addResolver(new GlobalTemplateVariables.WordSelection());
+		addResolver(new GlobalTemplateVariables.Year());
+		addResolver(new EncodingTemplateVariableResolverHTML());
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/TemplateContextTypeIdsHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/TemplateContextTypeIdsHTML.java
new file mode 100644
index 0000000..794b13d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/templates/TemplateContextTypeIdsHTML.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.templates;
+
+
+public class TemplateContextTypeIdsHTML {
+
+	public static final String ALL = getAll();
+
+	public static final String ATTRIBUTE = getAttribute();
+
+	public static final String ATTRIBUTE_VALUE = getAttributeValue();
+
+	public static final String NEW = getNew();
+
+	public static final String TAG = getTag();
+
+	private static String getAll() {
+		return getPrefix() + "_all"; //$NON-NLS-1$
+	}
+
+	private static String getAttribute() {
+		return getPrefix() + "_attribute"; //$NON-NLS-1$
+	}
+
+	private static String getAttributeValue() {
+		return getPrefix() + "_attribute_value"; //$NON-NLS-1$
+	}
+
+	private static String getNew() {
+		return getPrefix() + "_new"; //$NON-NLS-1$
+	}
+
+	private static String getTag() {
+		return getPrefix() + "_tag"; //$NON-NLS-1$
+	}
+
+	private static String getPrefix() {
+		return "html"; //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/CharacterPairInserter.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/CharacterPairInserter.java
new file mode 100644
index 0000000..b418adc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/CharacterPairInserter.java
@@ -0,0 +1,106 @@
+/*******************************************************************************

+ * Copyright (c) 2009, 2010 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.wst.html.ui.internal.text;

+

+import org.eclipse.jface.preference.IPreferenceStore;

+import org.eclipse.jface.text.IDocument;

+import org.eclipse.jface.text.source.ISourceViewer;

+import org.eclipse.jface.util.IPropertyChangeListener;

+import org.eclipse.jface.util.PropertyChangeEvent;

+import org.eclipse.swt.graphics.Point;

+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;

+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;

+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;

+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

+import org.eclipse.wst.sse.ui.typing.AbstractCharacterPairInserter;

+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;

+

+public class CharacterPairInserter extends AbstractCharacterPairInserter implements IPropertyChangeListener {

+

+	// preferences

+	private boolean fCloseStrings = true;

+	private boolean fCloseBrackets = true;

+

+	protected boolean shouldPair(ISourceViewer viewer, char c) {

+		switch (c) {

+			case '\'':

+			case '"':

+				return fCloseStrings ? checkRegion(viewer) : false;

+			default:

+				return fCloseBrackets;

+		}

+	}

+

+	/**

+	 * Checks if the region should support paired quotes

+	 * @param viewer the viewer

+	 * @return true if the region is not in an XML attribute value

+	 */

+	private boolean checkRegion(ISourceViewer viewer) {

+		final IDocument doc = viewer.getDocument();

+		final Point selection = viewer.getSelectedRange();

+		final int offset = selection.x;

+

+		if (doc instanceof IStructuredDocument) {

+			IStructuredDocumentRegion[] regions = ((IStructuredDocument) doc).getStructuredDocumentRegions(offset, 0);

+			if (regions != null && regions.length > 0) {

+				ITextRegion region = regions[0].getRegionAtCharacterOffset(offset);

+				return region != null && region.getType() != DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE;

+			}

+		}

+		return true;

+	}

+

+	public boolean hasPair(char c) {

+		switch (c) {

+			case '"':

+			case '\'':

+			case '[':

+			case '(':

+				return true;

+			default:

+				return false;

+		}

+	}

+

+	protected char getPair(char c) {

+		switch (c) {

+			case '\'':

+			case '"':

+				return c;

+			case '(':

+				return ')';

+			case '[':

+				return ']';

+			default:

+				throw new IllegalArgumentException();

+		}

+	}

+

+	public void initialize() {

+		IPreferenceStore store = HTMLUIPlugin.getInstance().getPreferenceStore();

+		fCloseStrings = store.getBoolean(HTMLUIPreferenceNames.TYPING_CLOSE_STRINGS);

+		fCloseBrackets = store.getBoolean(HTMLUIPreferenceNames.TYPING_CLOSE_BRACKETS);

+		store.addPropertyChangeListener(this);

+	}

+

+	public void dispose() {

+		HTMLUIPlugin.getInstance().getPreferenceStore().removePropertyChangeListener(this);

+	}

+

+	public void propertyChange(PropertyChangeEvent event) {

+		if (HTMLUIPreferenceNames.TYPING_CLOSE_BRACKETS.equals(event.getProperty()))

+			fCloseBrackets = ((Boolean) event.getNewValue()).booleanValue();

+		else if (HTMLUIPreferenceNames.TYPING_CLOSE_STRINGS.equals(event.getProperty()))

+			fCloseStrings = ((Boolean) event.getNewValue()).booleanValue();

+	}

+}

diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/HTMLDocumentRegionEdgeMatcher.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/HTMLDocumentRegionEdgeMatcher.java
new file mode 100644
index 0000000..aa75cdb
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/HTMLDocumentRegionEdgeMatcher.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.text;
+
+import org.eclipse.wst.sse.ui.internal.text.DocumentRegionEdgeMatcher;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+
+public class HTMLDocumentRegionEdgeMatcher extends DocumentRegionEdgeMatcher {
+
+	protected final static char[] BRACKETS = {'{', '}', '(', ')', '[', ']','"','"','\'','\''};
+	/**
+	 * @param validContexts
+	 * @param nextMatcher
+	 */
+	public HTMLDocumentRegionEdgeMatcher() {
+		super(new String[]{DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_CDATA_TEXT, DOMRegionContext.XML_PI_OPEN, DOMRegionContext.XML_PI_CONTENT}, new JavaPairMatcher(BRACKETS));
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/IJavaPartitions.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/IJavaPartitions.java
new file mode 100644
index 0000000..b9d8561
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/IJavaPartitions.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.text;
+
+// taken from package org.eclipse.jdt.ui.text;
+
+/**
+ * Definition of Java partitioning and its partitions.
+ * 
+ * @see Eclipse 3.1
+ */
+interface IJavaPartitions {
+
+	/**
+	 * The identifier of the Java partitioning.
+	 */
+	String JAVA_PARTITIONING = "___java_partitioning"; //$NON-NLS-1$
+
+	/**
+	 * The identifier of the single-line (JLS2: EndOfLineComment) end comment
+	 * partition content type.
+	 */
+	String JAVA_SINGLE_LINE_COMMENT = "__java_singleline_comment"; //$NON-NLS-1$
+
+	/**
+	 * The identifier multi-line (JLS2: TraditionalComment) comment partition
+	 * content type.
+	 */
+	String JAVA_MULTI_LINE_COMMENT = "__java_multiline_comment"; //$NON-NLS-1$
+
+	/**
+	 * The identifier of the Javadoc (JLS2: DocumentationComment) partition
+	 * content type.
+	 */
+	String JAVA_DOC = "__java_javadoc"; //$NON-NLS-1$
+
+	/**
+	 * The identifier of the Java string partition content type.
+	 */
+	String JAVA_STRING = "__java_string"; //$NON-NLS-1$
+
+	/**
+	 * The identifier of the Java character partition content type.
+	 */
+	String JAVA_CHARACTER = "__java_character"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaCodeReader.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaCodeReader.java
new file mode 100644
index 0000000..e3cace3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaCodeReader.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.text;
+
+// taken from package org.eclipse.jdt.ui.text;
+
+import java.io.IOException;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.wst.html.ui.internal.derived.SingleCharReader;
+
+/**
+ * Reads from a document either forwards or backwards. May be configured to
+ * skip comments and strings.
+ */
+class JavaCodeReader extends SingleCharReader {
+
+	/** The EOF character */
+	public static final int EOF = -1;
+
+	private boolean fSkipComments = false;
+	private boolean fSkipStrings = false;
+	private boolean fForward = false;
+
+	private IDocument fDocument;
+	private int fOffset;
+
+	private int fEnd = -1;
+	private int fCachedLineNumber = -1;
+	private int fCachedLineOffset = -1;
+
+
+	public JavaCodeReader() {
+	}
+
+	/**
+	 * Returns the offset of the last read character. Should only be called
+	 * after read has been called.
+	 */
+	public int getOffset() {
+		return fForward ? fOffset - 1 : fOffset;
+	}
+
+	public void configureForwardReader(IDocument document, int offset, int length, boolean skipComments, boolean skipStrings) throws IOException {
+		fDocument = document;
+		fOffset = offset;
+		fSkipComments = skipComments;
+		fSkipStrings = skipStrings;
+
+		fForward = true;
+		fEnd = Math.min(fDocument.getLength(), fOffset + length);
+	}
+
+	public void configureBackwardReader(IDocument document, int offset, boolean skipComments, boolean skipStrings) throws IOException {
+		fDocument = document;
+		fOffset = offset;
+		fSkipComments = skipComments;
+		fSkipStrings = skipStrings;
+
+		fForward = false;
+		try {
+			fCachedLineNumber = fDocument.getLineOfOffset(fOffset);
+		}
+		catch (BadLocationException x) {
+			throw new IOException(x.getMessage());
+		}
+	}
+
+	/*
+	 * @see Reader#close()
+	 */
+	public void close() throws IOException {
+		fDocument = null;
+	}
+
+	/*
+	 * @see SingleCharReader#read()
+	 */
+	public int read() throws IOException {
+		try {
+			return fForward ? readForwards() : readBackwards();
+		}
+		catch (BadLocationException x) {
+			throw new IOException(x.getMessage());
+		}
+	}
+
+	private void gotoCommentEnd() throws BadLocationException {
+		while (fOffset < fEnd) {
+			char current = fDocument.getChar(fOffset++);
+			if (current == '*') {
+				if (fOffset < fEnd && fDocument.getChar(fOffset) == '/') {
+					++fOffset;
+					return;
+				}
+			}
+		}
+	}
+
+	private void gotoStringEnd(char delimiter) throws BadLocationException {
+		while (fOffset < fEnd) {
+			char current = fDocument.getChar(fOffset++);
+			if (current == '\\') {
+				// ignore escaped characters
+				++fOffset;
+			}
+			else if (current == delimiter) {
+				return;
+			}
+		}
+	}
+
+	private void gotoLineEnd() throws BadLocationException {
+		int line = fDocument.getLineOfOffset(fOffset);
+		fOffset = fDocument.getLineOffset(line + 1);
+	}
+
+	private int readForwards() throws BadLocationException {
+		while (fOffset < fEnd) {
+			char current = fDocument.getChar(fOffset++);
+
+			switch (current) {
+				case '/' :
+
+					if (fSkipComments && fOffset < fEnd) {
+						char next = fDocument.getChar(fOffset);
+						if (next == '*') {
+							// a comment starts, advance to the comment end
+							++fOffset;
+							gotoCommentEnd();
+							continue;
+						}
+						else if (next == '/') {
+							// '//'-comment starts, advance to the line end
+							gotoLineEnd();
+							continue;
+						}
+					}
+
+					return current;
+
+				case '"' :
+				case '\'' :
+
+					if (fSkipStrings) {
+						gotoStringEnd(current);
+						continue;
+					}
+
+					return current;
+			}
+
+			return current;
+		}
+
+		return EOF;
+	}
+
+	private void handleSingleLineComment() throws BadLocationException {
+		int line = fDocument.getLineOfOffset(fOffset);
+		if (line < fCachedLineNumber) {
+			fCachedLineNumber = line;
+			fCachedLineOffset = fDocument.getLineOffset(line);
+			int offset = fOffset;
+			while (fCachedLineOffset < offset) {
+				char current = fDocument.getChar(offset--);
+				if (current == '/' && fCachedLineOffset <= offset && fDocument.getChar(offset) == '/') {
+					fOffset = offset;
+					return;
+				}
+			}
+		}
+	}
+
+	private void gotoCommentStart() throws BadLocationException {
+		while (0 < fOffset) {
+			char current = fDocument.getChar(fOffset--);
+			if (current == '*' && 0 <= fOffset && fDocument.getChar(fOffset) == '/')
+				return;
+		}
+	}
+
+	private void gotoStringStart(char delimiter) throws BadLocationException {
+		while (0 < fOffset) {
+			char current = fDocument.getChar(fOffset);
+			if (current == delimiter) {
+				if (!(0 <= fOffset && fDocument.getChar(fOffset - 1) == '\\'))
+					return;
+			}
+			--fOffset;
+		}
+	}
+
+	private int readBackwards() throws BadLocationException {
+
+		while (0 < fOffset) {
+			--fOffset;
+
+			handleSingleLineComment();
+
+			char current = fDocument.getChar(fOffset);
+			switch (current) {
+				case '/' :
+
+					if (fSkipComments && fOffset > 1) {
+						char next = fDocument.getChar(fOffset - 1);
+						if (next == '*') {
+							// a comment ends, advance to the comment start
+							fOffset -= 2;
+							gotoCommentStart();
+							continue;
+						}
+					}
+
+					return current;
+
+				case '"' :
+				case '\'' :
+
+					if (fSkipStrings) {
+						--fOffset;
+						gotoStringStart(current);
+						continue;
+					}
+
+					return current;
+			}
+
+			return current;
+		}
+
+		return EOF;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaHeuristicScanner.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaHeuristicScanner.java
new file mode 100644
index 0000000..01602a2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaHeuristicScanner.java
@@ -0,0 +1,986 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.text;
+
+// taken from package org.eclipse.jdt.internal.ui.text;
+
+import java.util.Arrays;
+
+import org.eclipse.jface.text.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.TypedRegion;
+
+/**
+ * Utility methods for heuristic based Java manipulations in an incomplete
+ * Java source file.
+ * 
+ * <p>
+ * An instance holds some internal position in the document and is therefore
+ * not threadsafe.
+ * </p>
+ * 
+ * @see Eclipse 3.0
+ */
+final class JavaHeuristicScanner implements Symbols {
+	/**
+	 * Returned by all methods when the requested position could not be found,
+	 * or if a {@link BadLocationException} was thrown while scanning.
+	 */
+	public static final int NOT_FOUND = -1;
+
+	/**
+	 * Special bound parameter that means either -1 (backward scanning) or
+	 * <code>fDocument.getLength()</code> (forward scanning).
+	 */
+	public static final int UNBOUND = -2;
+
+
+	/* character constants */
+	private static final char LBRACE = '{';
+	private static final char RBRACE = '}';
+	private static final char LPAREN = '(';
+	private static final char RPAREN = ')';
+	private static final char SEMICOLON = ';';
+	private static final char COLON = ':';
+	private static final char COMMA = ',';
+	private static final char LBRACKET = '[';
+	private static final char RBRACKET = ']';
+	private static final char QUESTIONMARK = '?';
+	private static final char EQUAL = '=';
+	private static final char LANGLE = '<';
+	private static final char RANGLE = '>';
+
+	/**
+	 * Specifies the stop condition, upon which the <code>scanXXX</code>
+	 * methods will decide whether to keep scanning or not. This interface may
+	 * implemented by clients.
+	 */
+	private static abstract class StopCondition {
+		/**
+		 * Instructs the scanner to return the current position.
+		 * 
+		 * @param ch
+		 *            the char at the current position
+		 * @param position
+		 *            the current position
+		 * @param forward
+		 *            the iteration direction
+		 * @return <code>true</code> if the stop condition is met.
+		 */
+		public abstract boolean stop(char ch, int position, boolean forward);
+
+		/**
+		 * Asks the condition to return the next position to query. The
+		 * default is to return the next/previous position.
+		 * 
+		 * @return the next position to scan
+		 */
+		public int nextPosition(int position, boolean forward) {
+			return forward ? position + 1 : position - 1;
+		}
+	}
+
+	/**
+	 * Stops upon a non-whitespace (as defined by
+	 * {@link Character#isWhitespace(char)}) character.
+	 */
+	private static class NonWhitespace extends StopCondition {
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#stop(char)
+		 */
+		public boolean stop(char ch, int position, boolean forward) {
+			return !Character.isWhitespace(ch);
+		}
+	}
+
+	/**
+	 * Stops upon a non-whitespace character in the default partition.
+	 * 
+	 * @see NonWhitespace
+	 */
+	private final class NonWhitespaceDefaultPartition extends NonWhitespace {
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#stop(char)
+		 */
+		public boolean stop(char ch, int position, boolean forward) {
+			return super.stop(ch, position, true) && isDefaultPartition(position);
+		}
+
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#nextPosition(int,
+		 *      boolean)
+		 */
+		public int nextPosition(int position, boolean forward) {
+			ITypedRegion partition = getPartition(position);
+			if (fPartition.equals(partition.getType()))
+				return super.nextPosition(position, forward);
+
+			if (forward) {
+				int end = partition.getOffset() + partition.getLength();
+				if (position < end)
+					return end;
+			}
+			else {
+				int offset = partition.getOffset();
+				if (position > offset)
+					return offset - 1;
+			}
+			return super.nextPosition(position, forward);
+		}
+	}
+
+	/**
+	 * Stops upon a non-java identifier (as defined by
+	 * {@link Character#isJavaIdentifierPart(char)}) character.
+	 */
+	private static class NonJavaIdentifierPart extends StopCondition {
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#stop(char)
+		 */
+		public boolean stop(char ch, int position, boolean forward) {
+			return !Character.isJavaIdentifierPart(ch);
+		}
+	}
+
+	/**
+	 * Stops upon a non-java identifier character in the default partition.
+	 * 
+	 * @see NonJavaIdentifierPart
+	 */
+	private final class NonJavaIdentifierPartDefaultPartition extends NonJavaIdentifierPart {
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#stop(char)
+		 */
+		public boolean stop(char ch, int position, boolean forward) {
+			return super.stop(ch, position, true) || !isDefaultPartition(position);
+		}
+
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#nextPosition(int,
+		 *      boolean)
+		 */
+		public int nextPosition(int position, boolean forward) {
+			ITypedRegion partition = getPartition(position);
+			if (fPartition.equals(partition.getType()))
+				return super.nextPosition(position, forward);
+
+			if (forward) {
+				int end = partition.getOffset() + partition.getLength();
+				if (position < end)
+					return end;
+			}
+			else {
+				int offset = partition.getOffset();
+				if (position > offset)
+					return offset - 1;
+			}
+			return super.nextPosition(position, forward);
+		}
+	}
+
+	/**
+	 * Stops upon a character in the default partition that matches the given
+	 * character list.
+	 */
+	private final class CharacterMatch extends StopCondition {
+		private final char[] fChars;
+
+		/**
+		 * Creates a new instance.
+		 * 
+		 * @param ch
+		 *            the single character to match
+		 */
+		public CharacterMatch(char ch) {
+			this(new char[]{ch});
+		}
+
+		/**
+		 * Creates a new instance.
+		 * 
+		 * @param chars
+		 *            the chars to match.
+		 */
+		public CharacterMatch(char[] chars) {
+			Assert.isNotNull(chars);
+			Assert.isTrue(chars.length > 0);
+			fChars = chars;
+			Arrays.sort(chars);
+		}
+
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#stop(char,
+		 *      int)
+		 */
+		public boolean stop(char ch, int position, boolean forward) {
+			return Arrays.binarySearch(fChars, ch) >= 0 && isDefaultPartition(position);
+		}
+
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner.StopCondition#nextPosition(int,
+		 *      boolean)
+		 */
+		public int nextPosition(int position, boolean forward) {
+			ITypedRegion partition = getPartition(position);
+			if (fPartition.equals(partition.getType()))
+				return super.nextPosition(position, forward);
+
+			if (forward) {
+				int end = partition.getOffset() + partition.getLength();
+				if (position < end)
+					return end;
+			}
+			else {
+				int offset = partition.getOffset();
+				if (position > offset)
+					return offset - 1;
+			}
+			return super.nextPosition(position, forward);
+		}
+	}
+
+	/** The document being scanned. */
+	private IDocument fDocument;
+	/** The partitioning being used for scanning. */
+	private String fPartitioning;
+	/** The partition to scan in. */
+	private String fPartition;
+
+	/* internal scan state */
+
+	/** the most recently read character. */
+	private char fChar;
+	/** the most recently read position. */
+	private int fPos;
+
+	/* preset stop conditions */
+	private final StopCondition fNonWSDefaultPart = new NonWhitespaceDefaultPartition();
+	private final static StopCondition fNonWS = new NonWhitespace();
+	private final StopCondition fNonIdent = new NonJavaIdentifierPartDefaultPartition();
+
+	/**
+	 * Creates a new instance.
+	 * 
+	 * @param document
+	 *            the document to scan
+	 * @param partitioning
+	 *            the partitioning to use for scanning
+	 * @param partition
+	 *            the partition to scan in
+	 */
+	public JavaHeuristicScanner(IDocument document, String partitioning, String partition) {
+		Assert.isNotNull(document);
+		Assert.isNotNull(partitioning);
+		Assert.isNotNull(partition);
+		fDocument = document;
+		fPartitioning = partitioning;
+		fPartition = partition;
+	}
+
+	/**
+	 * Calls
+	 * <code>this(document, IJavaPartitions.JAVA_PARTITIONING, IDocument.DEFAULT_CONTENT_TYPE)</code>.
+	 * 
+	 * @param document
+	 *            the document to scan.
+	 */
+	public JavaHeuristicScanner(IDocument document) {
+		this(document, IJavaPartitions.JAVA_PARTITIONING, IDocument.DEFAULT_CONTENT_TYPE);
+	}
+
+	/**
+	 * Returns the most recent internal scan position.
+	 * 
+	 * @return the most recent internal scan position.
+	 */
+	public int getPosition() {
+		return fPos;
+	}
+
+	/**
+	 * Returns the next token in forward direction, starting at
+	 * <code>start</code>, and not extending further than
+	 * <code>bound</code>. The return value is one of the constants defined
+	 * in {@link Symbols}. After a call, {@link #getPosition()} will return
+	 * the position just after the scanned token (i.e. the next position that
+	 * will be scanned).
+	 * 
+	 * @param start
+	 *            the first character position in the document to consider
+	 * @param bound
+	 *            the first position not to consider any more
+	 * @return a constant from {@link Symbols} describing the next token
+	 */
+	public int nextToken(int start, int bound) {
+		int pos = scanForward(start, bound, fNonWSDefaultPart);
+		if (pos == NOT_FOUND)
+			return TokenEOF;
+
+		fPos++;
+
+		switch (fChar) {
+			case LBRACE :
+				return TokenLBRACE;
+			case RBRACE :
+				return TokenRBRACE;
+			case LBRACKET :
+				return TokenLBRACKET;
+			case RBRACKET :
+				return TokenRBRACKET;
+			case LPAREN :
+				return TokenLPAREN;
+			case RPAREN :
+				return TokenRPAREN;
+			case SEMICOLON :
+				return TokenSEMICOLON;
+			case COMMA :
+				return TokenCOMMA;
+			case QUESTIONMARK :
+				return TokenQUESTIONMARK;
+			case EQUAL :
+				return TokenEQUAL;
+			case LANGLE :
+				return TokenLESSTHAN;
+			case RANGLE :
+				return TokenGREATERTHAN;
+		}
+
+		// else
+		if (Character.isJavaIdentifierPart(fChar)) {
+			// assume an ident or keyword
+			int from = pos, to;
+			pos = scanForward(pos + 1, bound, fNonIdent);
+			if (pos == NOT_FOUND)
+				to = bound == UNBOUND ? fDocument.getLength() : bound;
+			else
+				to = pos;
+
+			String identOrKeyword;
+			try {
+				identOrKeyword = fDocument.get(from, to - from);
+			}
+			catch (BadLocationException e) {
+				return TokenEOF;
+			}
+
+			return getToken(identOrKeyword);
+
+
+		}
+		else {
+			// operators, number literals etc
+			return TokenOTHER;
+		}
+	}
+
+	/**
+	 * Returns the next token in backward direction, starting at
+	 * <code>start</code>, and not extending further than
+	 * <code>bound</code>. The return value is one of the constants defined
+	 * in {@link Symbols}. After a call, {@link #getPosition()} will return
+	 * the position just before the scanned token starts (i.e. the next
+	 * position that will be scanned).
+	 * 
+	 * @param start
+	 *            the first character position in the document to consider
+	 * @param bound
+	 *            the first position not to consider any more
+	 * @return a constant from {@link Symbols} describing the previous token
+	 */
+	public int previousToken(int start, int bound) {
+		int pos = scanBackward(start, bound, fNonWSDefaultPart);
+		if (pos == NOT_FOUND)
+			return TokenEOF;
+
+		fPos--;
+
+		switch (fChar) {
+			case LBRACE :
+				return TokenLBRACE;
+			case RBRACE :
+				return TokenRBRACE;
+			case LBRACKET :
+				return TokenLBRACKET;
+			case RBRACKET :
+				return TokenRBRACKET;
+			case LPAREN :
+				return TokenLPAREN;
+			case RPAREN :
+				return TokenRPAREN;
+			case SEMICOLON :
+				return TokenSEMICOLON;
+			case COLON :
+				return TokenCOLON;
+			case COMMA :
+				return TokenCOMMA;
+			case QUESTIONMARK :
+				return TokenQUESTIONMARK;
+			case EQUAL :
+				return TokenEQUAL;
+			case LANGLE :
+				return TokenLESSTHAN;
+			case RANGLE :
+				return TokenGREATERTHAN;
+		}
+
+		// else
+		if (Character.isJavaIdentifierPart(fChar)) {
+			// assume an ident or keyword
+			int from, to = pos + 1;
+			pos = scanBackward(pos - 1, bound, fNonIdent);
+			if (pos == NOT_FOUND)
+				from = bound == UNBOUND ? 0 : bound + 1;
+			else
+				from = pos + 1;
+
+			String identOrKeyword;
+			try {
+				identOrKeyword = fDocument.get(from, to - from);
+			}
+			catch (BadLocationException e) {
+				return TokenEOF;
+			}
+
+			return getToken(identOrKeyword);
+
+
+		}
+		else {
+			// operators, number literals etc
+			return TokenOTHER;
+		}
+
+	}
+
+	/**
+	 * Returns one of the keyword constants or <code>TokenIDENT</code> for a
+	 * scanned identifier.
+	 * 
+	 * @param s
+	 *            a scanned identifier
+	 * @return one of the constants defined in {@link Symbols}
+	 */
+	private int getToken(String s) {
+		Assert.isNotNull(s);
+
+		switch (s.length()) {
+			case 2 :
+				if ("if".equals(s)) //$NON-NLS-1$
+					return TokenIF;
+				if ("do".equals(s)) //$NON-NLS-1$
+					return TokenDO;
+				break;
+			case 3 :
+				if ("for".equals(s)) //$NON-NLS-1$
+					return TokenFOR;
+				if ("try".equals(s)) //$NON-NLS-1$
+					return TokenTRY;
+				if ("new".equals(s)) //$NON-NLS-1$
+					return TokenNEW;
+				break;
+			case 4 :
+				if ("case".equals(s)) //$NON-NLS-1$
+					return TokenCASE;
+				if ("else".equals(s)) //$NON-NLS-1$
+					return TokenELSE;
+				if ("enum".equals(s)) //$NON-NLS-1$
+					return TokenENUM;
+				if ("goto".equals(s)) //$NON-NLS-1$
+					return TokenGOTO;
+				break;
+			case 5 :
+				if ("break".equals(s)) //$NON-NLS-1$
+					return TokenBREAK;
+				if ("catch".equals(s)) //$NON-NLS-1$
+					return TokenCATCH;
+				if ("class".equals(s)) //$NON-NLS-1$
+					return TokenCLASS;
+				if ("while".equals(s)) //$NON-NLS-1$
+					return TokenWHILE;
+				break;
+			case 6 :
+				if ("return".equals(s)) //$NON-NLS-1$
+					return TokenRETURN;
+				if ("static".equals(s)) //$NON-NLS-1$
+					return TokenSTATIC;
+				if ("switch".equals(s)) //$NON-NLS-1$
+					return TokenSWITCH;
+				break;
+			case 7 :
+				if ("default".equals(s)) //$NON-NLS-1$
+					return TokenDEFAULT;
+				if ("finally".equals(s)) //$NON-NLS-1$
+					return TokenFINALLY;
+				break;
+			case 9 :
+				if ("interface".equals(s)) //$NON-NLS-1$
+					return TokenINTERFACE;
+				break;
+			case 12 :
+				if ("synchronized".equals(s)) //$NON-NLS-1$
+					return TokenSYNCHRONIZED;
+				break;
+		}
+		return TokenIDENT;
+	}
+
+	/**
+	 * Returns the position of the closing peer character (forward search).
+	 * Any scopes introduced by opening peers are skipped. All peers accounted
+	 * for must reside in the default partition.
+	 * 
+	 * <p>
+	 * Note that <code>start</code> must not point to the opening peer, but
+	 * to the first character being searched.
+	 * </p>
+	 * 
+	 * @param start
+	 *            the start position
+	 * @param openingPeer
+	 *            the opening peer character (e.g. '{')
+	 * @param closingPeer
+	 *            the closing peer character (e.g. '}')
+	 * @return the matching peer character position, or <code>NOT_FOUND</code>
+	 */
+	public int findClosingPeer(int start, final char openingPeer, final char closingPeer) {
+		Assert.isNotNull(fDocument);
+		Assert.isTrue(start >= 0);
+
+		try {
+			int depth = 1;
+			start -= 1;
+			while (true) {
+				start = scanForward(start + 1, UNBOUND, new CharacterMatch(new char[]{openingPeer, closingPeer}));
+				if (start == NOT_FOUND)
+					return NOT_FOUND;
+
+				if (fDocument.getChar(start) == openingPeer)
+					depth++;
+				else
+					depth--;
+
+				if (depth == 0)
+					return start;
+			}
+
+		}
+		catch (BadLocationException e) {
+			return NOT_FOUND;
+		}
+	}
+
+	/**
+	 * Returns the position of the opening peer character (backward search).
+	 * Any scopes introduced by closing peers are skipped. All peers accounted
+	 * for must reside in the default partition.
+	 * 
+	 * <p>
+	 * Note that <code>start</code> must not point to the closing peer, but
+	 * to the first character being searched.
+	 * </p>
+	 * 
+	 * @param start
+	 *            the start position
+	 * @param openingPeer
+	 *            the opening peer character (e.g. '{')
+	 * @param closingPeer
+	 *            the closing peer character (e.g. '}')
+	 * @return the matching peer character position, or <code>NOT_FOUND</code>
+	 */
+	public int findOpeningPeer(int start, char openingPeer, char closingPeer) {
+		Assert.isTrue(start < fDocument.getLength());
+
+		try {
+			int depth = 1;
+			start += 1;
+			while (true) {
+				start = scanBackward(start - 1, UNBOUND, new CharacterMatch(new char[]{openingPeer, closingPeer}));
+				if (start == NOT_FOUND)
+					return NOT_FOUND;
+
+				if (fDocument.getChar(start) == closingPeer)
+					depth++;
+				else
+					depth--;
+
+				if (depth == 0)
+					return start;
+			}
+
+		}
+		catch (BadLocationException e) {
+			return NOT_FOUND;
+		}
+	}
+
+	/**
+	 * Computes the surrounding block around <code>offset</code>. The
+	 * search is started at the beginning of <code>offset</code>, i.e. an
+	 * opening brace at <code>offset</code> will not be part of the
+	 * surrounding block, but a closing brace will.
+	 * 
+	 * @param offset
+	 *            the offset for which the surrounding block is computed
+	 * @return a region describing the surrounding block, or <code>null</code>
+	 *         if none can be found
+	 */
+	public IRegion findSurroundingBlock(int offset) {
+		if (offset < 1 || offset >= fDocument.getLength())
+			return null;
+
+		int begin = findOpeningPeer(offset - 1, LBRACE, RBRACE);
+		int end = findClosingPeer(offset, LBRACE, RBRACE);
+		if (begin == NOT_FOUND || end == NOT_FOUND)
+			return null;
+		return new Region(begin, end + 1 - begin);
+	}
+
+	/**
+	 * Finds the smallest position in <code>fDocument</code> such that the
+	 * position is &gt;= <code>position</code> and &lt; <code>bound</code>
+	 * and <code>Character.isWhitespace(fDocument.getChar(pos))</code>
+	 * evaluates to <code>false</code> and the position is in the default
+	 * partition.
+	 * 
+	 * @param position
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &gt;
+	 *            <code>position</code>, or <code>UNBOUND</code>
+	 * @return the smallest position of a non-whitespace character in [<code>position</code>,
+	 *         <code>bound</code>) that resides in a Java partition, or
+	 *         <code>NOT_FOUND</code> if none can be found
+	 */
+	public int findNonWhitespaceForward(int position, int bound) {
+		return scanForward(position, bound, fNonWSDefaultPart);
+	}
+
+	/**
+	 * Finds the smallest position in <code>fDocument</code> such that the
+	 * position is &gt;= <code>position</code> and &lt; <code>bound</code>
+	 * and <code>Character.isWhitespace(fDocument.getChar(pos))</code>
+	 * evaluates to <code>false</code>.
+	 * 
+	 * @param position
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &gt;
+	 *            <code>position</code>, or <code>UNBOUND</code>
+	 * @return the smallest position of a non-whitespace character in [<code>position</code>,
+	 *         <code>bound</code>), or <code>NOT_FOUND</code> if none can
+	 *         be found
+	 */
+	public int findNonWhitespaceForwardInAnyPartition(int position, int bound) {
+		return scanForward(position, bound, fNonWS);
+	}
+
+	/**
+	 * Finds the highest position in <code>fDocument</code> such that the
+	 * position is &lt;= <code>position</code> and &gt; <code>bound</code>
+	 * and <code>Character.isWhitespace(fDocument.getChar(pos))</code>
+	 * evaluates to <code>false</code> and the position is in the default
+	 * partition.
+	 * 
+	 * @param position
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &lt;
+	 *            <code>position</code>, or <code>UNBOUND</code>
+	 * @return the highest position of a non-whitespace character in (<code>bound</code>,
+	 *         <code>position</code>] that resides in a Java partition, or
+	 *         <code>NOT_FOUND</code> if none can be found
+	 */
+	public int findNonWhitespaceBackward(int position, int bound) {
+		return scanBackward(position, bound, fNonWSDefaultPart);
+	}
+
+	/**
+	 * Finds the lowest position <code>p</code> in <code>fDocument</code>
+	 * such that <code>start</code> &lt;= p &lt; <code>bound</code> and
+	 * <code>condition.stop(fDocument.getChar(p), p)</code> evaluates to
+	 * <code>true</code>.
+	 * 
+	 * @param start
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &gt;
+	 *            <code>start</code>, or <code>UNBOUND</code>
+	 * @param condition
+	 *            the <code>StopCondition</code> to check
+	 * @return the lowest position in [<code>start</code>,
+	 *         <code>bound</code>) for which <code>condition</code>
+	 *         holds, or <code>NOT_FOUND</code> if none can be found
+	 */
+	public int scanForward(int start, int bound, StopCondition condition) {
+		Assert.isTrue(start >= 0);
+
+		if (bound == UNBOUND)
+			bound = fDocument.getLength();
+
+		Assert.isTrue(bound <= fDocument.getLength());
+
+		try {
+			fPos = start;
+			while (fPos < bound) {
+
+				fChar = fDocument.getChar(fPos);
+				if (condition.stop(fChar, fPos, true))
+					return fPos;
+
+				fPos = condition.nextPosition(fPos, true);
+			}
+		}
+		catch (BadLocationException e) {
+		}
+		return NOT_FOUND;
+	}
+
+
+	/**
+	 * Finds the lowest position in <code>fDocument</code> such that the
+	 * position is &gt;= <code>position</code> and &lt; <code>bound</code>
+	 * and <code>fDocument.getChar(position) == ch</code> evaluates to
+	 * <code>true</code> and the position is in the default partition.
+	 * 
+	 * @param position
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &gt;
+	 *            <code>position</code>, or <code>UNBOUND</code>
+	 * @param ch
+	 *            the <code>char</code> to search for
+	 * @return the lowest position of <code>ch</code> in (<code>bound</code>,
+	 *         <code>position</code>] that resides in a Java partition, or
+	 *         <code>NOT_FOUND</code> if none can be found
+	 */
+	public int scanForward(int position, int bound, char ch) {
+		return scanForward(position, bound, new CharacterMatch(ch));
+	}
+
+	/**
+	 * Finds the lowest position in <code>fDocument</code> such that the
+	 * position is &gt;= <code>position</code> and &lt; <code>bound</code>
+	 * and <code>fDocument.getChar(position) == ch</code> evaluates to
+	 * <code>true</code> for at least one ch in <code>chars</code> and the
+	 * position is in the default partition.
+	 * 
+	 * @param position
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &gt;
+	 *            <code>position</code>, or <code>UNBOUND</code>
+	 * @param chars
+	 *            an array of <code>char</code> to search for
+	 * @return the lowest position of a non-whitespace character in [<code>position</code>,
+	 *         <code>bound</code>) that resides in a Java partition, or
+	 *         <code>NOT_FOUND</code> if none can be found
+	 */
+	public int scanForward(int position, int bound, char[] chars) {
+		return scanForward(position, bound, new CharacterMatch(chars));
+	}
+
+	/**
+	 * Finds the highest position <code>p</code> in <code>fDocument</code>
+	 * such that <code>bound</code> &lt; <code>p</code> &lt;=
+	 * <code>start</code> and
+	 * <code>condition.stop(fDocument.getChar(p), p)</code> evaluates to
+	 * <code>true</code>.
+	 * 
+	 * @param start
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &lt;
+	 *            <code>start</code>, or <code>UNBOUND</code>
+	 * @param condition
+	 *            the <code>StopCondition</code> to check
+	 * @return the highest position in (<code>bound</code>,
+	 *         <code>start</code> for which <code>condition</code> holds,
+	 *         or <code>NOT_FOUND</code> if none can be found
+	 */
+	public int scanBackward(int start, int bound, StopCondition condition) {
+		if (bound == UNBOUND)
+			bound = -1;
+
+		Assert.isTrue(bound >= -1);
+		Assert.isTrue(start < fDocument.getLength());
+
+		try {
+			fPos = start;
+			while (fPos > bound) {
+
+				fChar = fDocument.getChar(fPos);
+				if (condition.stop(fChar, fPos, false))
+					return fPos;
+
+				fPos = condition.nextPosition(fPos, false);
+			}
+		}
+		catch (BadLocationException e) {
+		}
+		return NOT_FOUND;
+	}
+
+	/**
+	 * Finds the highest position in <code>fDocument</code> such that the
+	 * position is &lt;= <code>position</code> and &gt; <code>bound</code>
+	 * and <code>fDocument.getChar(position) == ch</code> evaluates to
+	 * <code>true</code> for at least one ch in <code>chars</code> and the
+	 * position is in the default partition.
+	 * 
+	 * @param position
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &lt;
+	 *            <code>position</code>, or <code>UNBOUND</code>
+	 * @param ch
+	 *            the <code>char</code> to search for
+	 * @return the highest position of one element in <code>chars</code> in (<code>bound</code>,
+	 *         <code>position</code>] that resides in a Java partition, or
+	 *         <code>NOT_FOUND</code> if none can be found
+	 */
+	public int scanBackward(int position, int bound, char ch) {
+		return scanBackward(position, bound, new CharacterMatch(ch));
+	}
+
+	/**
+	 * Finds the highest position in <code>fDocument</code> such that the
+	 * position is &lt;= <code>position</code> and &gt; <code>bound</code>
+	 * and <code>fDocument.getChar(position) == ch</code> evaluates to
+	 * <code>true</code> for at least one ch in <code>chars</code> and the
+	 * position is in the default partition.
+	 * 
+	 * @param position
+	 *            the first character position in <code>fDocument</code> to
+	 *            be considered
+	 * @param bound
+	 *            the first position in <code>fDocument</code> to not
+	 *            consider any more, with <code>bound</code> &lt;
+	 *            <code>position</code>, or <code>UNBOUND</code>
+	 * @param chars
+	 *            an array of <code>char</code> to search for
+	 * @return the highest position of one element in <code>chars</code> in (<code>bound</code>,
+	 *         <code>position</code>] that resides in a Java partition, or
+	 *         <code>NOT_FOUND</code> if none can be found
+	 */
+	public int scanBackward(int position, int bound, char[] chars) {
+		return scanBackward(position, bound, new CharacterMatch(chars));
+	}
+
+	/**
+	 * Checks whether <code>position</code> resides in a default (Java)
+	 * partition of <code>fDocument</code>.
+	 * 
+	 * @param position
+	 *            the position to be checked
+	 * @return <code>true</code> if <code>position</code> is in the
+	 *         default partition of <code>fDocument</code>,
+	 *         <code>false</code> otherwise
+	 */
+	public boolean isDefaultPartition(int position) {
+		Assert.isTrue(position >= 0);
+		Assert.isTrue(position <= fDocument.getLength());
+
+		try {
+			return fPartition.equals(TextUtilities.getContentType(fDocument, fPartitioning, position, false));
+		}
+		catch (BadLocationException e) {
+			return false;
+		}
+	}
+
+	/**
+	 * Returns the partition at <code>position</code>.
+	 * 
+	 * @param position
+	 *            the position to get the partition for
+	 * @return the partition at <code>position</code> or a dummy zero-length
+	 *         partition if accessing the document fails
+	 */
+	private ITypedRegion getPartition(int position) {
+		Assert.isTrue(position >= 0);
+		Assert.isTrue(position <= fDocument.getLength());
+
+		try {
+			return TextUtilities.getPartition(fDocument, fPartitioning, position, false);
+		}
+		catch (BadLocationException e) {
+			return new TypedRegion(position, 0, "__no_partition_at_all"); //$NON-NLS-1$
+		}
+
+	}
+
+	/**
+	 * Checks if the line seems to be an open condition not followed by a
+	 * block (i.e. an if, while, or for statement with just one following
+	 * statement, see example below).
+	 * 
+	 * <pre>
+	 * if (condition)
+	 * 	doStuff();
+	 * </pre>
+	 * 
+	 * <p>
+	 * Algorithm: if the last non-WS, non-Comment code on the line is an if
+	 * (condition), while (condition), for( expression), do, else, and there
+	 * is no statement after that
+	 * </p>
+	 * 
+	 * @param position
+	 *            the insert position of the new character
+	 * @param bound
+	 *            the lowest position to consider
+	 * @return <code>true</code> if the code is a conditional statement or
+	 *         loop without a block, <code>false</code> otherwise
+	 */
+	public boolean isBracelessBlockStart(int position, int bound) {
+		if (position < 1)
+			return false;
+
+		switch (previousToken(position, bound)) {
+			case TokenDO :
+			case TokenELSE :
+				return true;
+			case TokenRPAREN :
+				position = findOpeningPeer(fPos, LPAREN, RPAREN);
+				if (position > 0) {
+					switch (previousToken(position - 1, bound)) {
+						case TokenIF :
+						case TokenFOR :
+						case TokenWHILE :
+							return true;
+					}
+				}
+		}
+
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaPairMatcher.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaPairMatcher.java
new file mode 100644
index 0000000..020769f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/JavaPairMatcher.java
@@ -0,0 +1,277 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.text;
+
+// taken from package org.eclipse.jdt.ui.text;
+
+import java.io.IOException;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.ICharacterPairMatcher;
+
+class JavaPairMatcher implements ICharacterPairMatcher {
+
+	protected char[] fPairs;
+	protected IDocument fDocument;
+	protected int fOffset;
+
+	protected int fStartPos;
+	protected int fEndPos;
+	protected int fAnchor;
+
+	protected JavaCodeReader fReader = new JavaCodeReader();
+	/**
+	 * Stores the source version state.
+	 * 
+	 * @see Eclipse  3.1
+	 */
+	private boolean fHighlightAngularBrackets = false;
+
+
+	public JavaPairMatcher(char[] pairs) {
+		fPairs = pairs;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#match(org.eclipse.jface.text.IDocument,
+	 *      int)
+	 */
+	public IRegion match(IDocument document, int offset) {
+		fOffset = offset;
+
+		if(offset < 0 || offset >= document.getLength())
+			return null;
+
+		fDocument = document;
+
+		if (fDocument != null && matchPairsAt() && fStartPos != fEndPos)
+			return new Region(fStartPos, fEndPos - fStartPos + 1);
+
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#getAnchor()
+	 */
+	public int getAnchor() {
+		return fAnchor;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#dispose()
+	 */
+	public void dispose() {
+		clear();
+		fDocument = null;
+		fReader = null;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#clear()
+	 */
+	public void clear() {
+		if (fReader != null) {
+			try {
+				fReader.close();
+			}
+			catch (IOException x) {
+				// ignore
+			}
+		}
+	}
+
+	protected boolean matchPairsAt() {
+
+		int i;
+		int pairIndex1 = fPairs.length;
+		int pairIndex2 = fPairs.length;
+
+		fStartPos = -1;
+		fEndPos = -1;
+
+		// get the chars preceding and following the start position
+		try {
+
+			char prevChar = fDocument.getChar(Math.max(fOffset - 1, 0));
+			// modified behavior for
+			// http://dev.eclipse.org/bugs/show_bug.cgi?id=16879
+			// char nextChar= fDocument.getChar(fOffset);
+
+			// search for opening peer character next to the activation point
+			for (i = 0; i < fPairs.length; i = i + 2) {
+				// if (nextChar == fPairs[i]) {
+				// fStartPos= fOffset;
+				// pairIndex1= i;
+				// } else
+				if (prevChar == fPairs[i]) {
+					fStartPos = fOffset - 1;
+					pairIndex1 = i;
+				}
+			}
+
+			// search for closing peer character next to the activation point
+			for (i = 1; i < fPairs.length; i = i + 2) {
+				if (prevChar == fPairs[i]) {
+					fEndPos = fOffset - 1;
+					pairIndex2 = i;
+				}
+				// else if (nextChar == fPairs[i]) {
+				// fEndPos= fOffset;
+				// pairIndex2= i;
+				// }
+			}
+
+			if (fEndPos > -1) {
+				fAnchor = RIGHT;
+				fStartPos = searchForOpeningPeer(fEndPos, fPairs[pairIndex2 - 1], fPairs[pairIndex2], fDocument);
+				if (fStartPos > -1)
+					return true;
+				else
+					fEndPos = -1;
+			}
+			else if (fStartPos > -1) {
+				fAnchor = LEFT;
+				fEndPos = searchForClosingPeer(fStartPos, fPairs[pairIndex1], fPairs[pairIndex1 + 1], fDocument);
+				if (fEndPos > -1)
+					return true;
+				else
+					fStartPos = -1;
+			}
+
+		}
+		catch (BadLocationException x) {
+		}
+		catch (IOException x) {
+		}
+
+		return false;
+	}
+
+	protected int searchForClosingPeer(int offset, int openingPeer, int closingPeer, IDocument document) throws IOException {
+		if (openingPeer == '<' && !(fHighlightAngularBrackets && isTypeParameterBracket(offset, document)))
+			return -1;
+
+		fReader.configureForwardReader(document, offset + 1, document.getLength(), true, true);
+
+		int stack = 1;
+		int c = fReader.read();
+		while (c != JavaCodeReader.EOF) {
+			if (c == openingPeer && c != closingPeer)
+				stack++;
+			else if (c == closingPeer)
+				stack--;
+
+			if (stack == 0)
+				return fReader.getOffset();
+
+			c = fReader.read();
+		}
+
+		return -1;
+	}
+
+
+	protected int searchForOpeningPeer(int offset, int openingPeer, int closingPeer, IDocument document) throws IOException {
+		if (openingPeer == '<' && !fHighlightAngularBrackets)
+			return -1;
+
+		fReader.configureBackwardReader(document, offset, true, true);
+
+		int stack = 1;
+		int c = fReader.read();
+		while (c != JavaCodeReader.EOF) {
+			if (c == closingPeer && c != openingPeer)
+				stack++;
+			else if (c == openingPeer)
+				stack--;
+
+			if (stack == 0) {
+				if (closingPeer == '>' && !isTypeParameterBracket(fReader.getOffset(), document))
+					return -1;
+				return fReader.getOffset();
+			}
+
+			c = fReader.read();
+		}
+
+		return -1;
+	}
+
+	/**
+	 * Checks if the angular bracket at <code>offset</code> is a type
+	 * parameter bracket.
+	 * 
+	 * @param offset
+	 *            the offset of the opening bracket
+	 * @param document
+	 *            the document
+	 * @return <code>true</code> if the bracket is part of a type parameter,
+	 *         <code>false</code> otherwise
+	 * @see Eclipse  3.1
+	 */
+	private boolean isTypeParameterBracket(int offset, IDocument document) {
+		/*
+		 * type parameter come after braces (closing or opening), semicolons,
+		 * or after a Type name (heuristic: starts with capital character, or
+		 * after a modifier keyword in a method declaration (visibility,
+		 * static, synchronized, final)
+		 */
+
+		try {
+			IRegion line = document.getLineInformationOfOffset(offset);
+
+			JavaHeuristicScanner scanner = new JavaHeuristicScanner(document);
+			int prevToken = scanner.previousToken(offset - 1, line.getOffset());
+			int prevTokenOffset = scanner.getPosition() + 1;
+			String previous = prevToken == Symbols.TokenEOF ? null : document.get(prevTokenOffset, offset - prevTokenOffset).trim();
+
+			if (prevToken == Symbols.TokenLBRACE || prevToken == Symbols.TokenRBRACE || prevToken == Symbols.TokenSEMICOLON || prevToken == Symbols.TokenSYNCHRONIZED || prevToken == Symbols.TokenSTATIC || (prevToken == Symbols.TokenIDENT && isTypeParameterIntroducer(previous)) || prevToken == Symbols.TokenEOF)
+				return true;
+		}
+		catch (BadLocationException e) {
+			return false;
+		}
+
+		return false;
+	}
+
+	/**
+	 * Returns <code>true</code> if <code>identifier</code> is an
+	 * identifier that could come right before a type parameter list. It uses
+	 * a heuristic: if the identifier starts with an upper case, it is assumed
+	 * a type name. Also, if <code>identifier</code> is a method modifier,
+	 * it is assumed that the angular bracket is part of the generic type
+	 * parameter of a method.
+	 * 
+	 * @param identifier
+	 *            the identifier to check
+	 * @return <code>true</code> if the identifier could introduce a type
+	 *         parameter list
+	 * @see Eclipse  3.1
+	 */
+	private boolean isTypeParameterIntroducer(String identifier) {
+		return identifier.length() > 0 && (Character.isUpperCase(identifier.charAt(0)) || identifier.startsWith("final") //$NON-NLS-1$
+					|| identifier.startsWith("public") //$NON-NLS-1$
+					|| identifier.startsWith("public") //$NON-NLS-1$
+					|| identifier.startsWith("protected") //$NON-NLS-1$
+		|| identifier.startsWith("private")); //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/Symbols.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/Symbols.java
new file mode 100644
index 0000000..1b203e3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/Symbols.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.text;
+
+// taken from package org.eclipse.jdt.ui.text;
+
+/**
+ * Symbols for the heuristic java scanner.
+ * 
+ * @see Eclipse 3.0
+ */
+interface Symbols {
+	int TokenEOF = -1;
+	int TokenLBRACE = 1;
+	int TokenRBRACE = 2;
+	int TokenLBRACKET = 3;
+	int TokenRBRACKET = 4;
+	int TokenLPAREN = 5;
+	int TokenRPAREN = 6;
+	int TokenSEMICOLON = 7;
+	int TokenOTHER = 8;
+	int TokenCOLON = 9;
+	int TokenQUESTIONMARK = 10;
+	int TokenCOMMA = 11;
+	int TokenEQUAL = 12;
+	int TokenLESSTHAN = 13;
+	int TokenGREATERTHAN = 14;
+	int TokenIF = 109;
+	int TokenDO = 1010;
+	int TokenFOR = 1011;
+	int TokenTRY = 1012;
+	int TokenCASE = 1013;
+	int TokenELSE = 1014;
+	int TokenBREAK = 1015;
+	int TokenCATCH = 1016;
+	int TokenWHILE = 1017;
+	int TokenRETURN = 1018;
+	int TokenSTATIC = 1019;
+	int TokenSWITCH = 1020;
+	int TokenFINALLY = 1021;
+	int TokenSYNCHRONIZED = 1022;
+	int TokenGOTO = 1023;
+	int TokenDEFAULT = 1024;
+	int TokenNEW = 1025;
+	int TokenCLASS = 1026;
+	int TokenINTERFACE = 1027;
+	int TokenENUM = 1028;
+	int TokenIDENT = 2000;
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/FacetModuleCoreSupport.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/FacetModuleCoreSupport.java
new file mode 100644
index 0000000..fa1ab95
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/FacetModuleCoreSupport.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.wizard;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * This class encapsulates any used Module Core and Facets APIs along with
+ * fallbacks for use on non-compliant projects and when those services are not
+ * available at runtime.
+ * 
+ * Because ModuleCore API calls can result in locks needing to be acquired,
+ * none of these methods should be called while other thread locks have
+ * already been acquired.
+ */
+final class FacetModuleCoreSupport {
+	static final boolean _dump_NCDFE = false;
+
+	/**
+	 * @param project
+	 * @return the IPath to the "root" of the web contents
+	 */
+	public static IPath getWebContentRootPath(IProject project) {
+		if (project == null)
+			return null;
+		IPath path = null;
+		try {
+			path = FacetModuleCoreSupportDelegate.getWebContentRootPath(project);
+		}
+		catch (NoClassDefFoundError e) {
+			if (_dump_NCDFE)
+				e.printStackTrace();
+		}
+		return path;
+	}
+
+	/**
+	 * @param project
+	 * @return
+	 * @throws org.eclipse.core.runtime.CoreException
+	 */
+	public static boolean isWebProject(IProject project) {
+		if (project == null)
+			return false;
+		try {
+			return FacetModuleCoreSupportDelegate.isWebProject(project);
+		}
+		catch (NoClassDefFoundError e) {
+			if (_dump_NCDFE)
+				e.printStackTrace();
+		}
+		return true;
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/FacetModuleCoreSupportDelegate.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/FacetModuleCoreSupportDelegate.java
new file mode 100644
index 0000000..ab5484e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/FacetModuleCoreSupportDelegate.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.wizard;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.ModuleCoreNature;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.html.ui.internal.Logger;
+
+/**
+ * Wrapper class for all Facet-related calls. If the Facet or ModuleCore
+ * bundles are not available, this class will not load, or if it does, its
+ * methods will cause NoClassDefFoundErrors. This allows us to
+ * compartmentalize the dependencies.
+ * 
+ */
+final class FacetModuleCoreSupportDelegate {
+	/**
+	 * Copied to avoid unneeded extra dependency (plus it's unclear why the
+	 * value is in that plug-in).
+	 * 
+	 * @see org.eclipse.wst.common.componentcore.internal.util.IModuleConstants.JST_WEB_MODULE
+	 */
+	private final static String JST_WEB_MODULE = "jst.web"; //$NON-NLS-1$
+
+	private final static String WST_WEB_MODULE = "wst.web"; //$NON-NLS-1$
+
+	/**
+	 * @param project
+	 * @return the IPath to the "root" of the web contents
+	 */
+	static IPath getWebContentRootPath(IProject project) {
+		if (!ModuleCoreNature.isFlexibleProject(project))
+			return project.getFullPath();
+
+		IPath path = null;
+		IVirtualComponent component = ComponentCore.createComponent(project);
+		if (component != null && component.exists()) {
+			path = component.getRootFolder().getWorkspaceRelativePath();
+		}
+		else {
+			path = project.getFullPath();
+		}
+		return path;
+	}
+
+	/**
+	 * @param project
+	 * @return
+	 * @throws CoreException
+	 */
+	static boolean isWebProject(IProject project) {
+		boolean is = false;
+		try {
+			IFacetedProject faceted = ProjectFacetsManager.create(project);
+			if (ProjectFacetsManager.isProjectFacetDefined(JST_WEB_MODULE)) {
+				IProjectFacet facet = ProjectFacetsManager.getProjectFacet(JST_WEB_MODULE);
+				is = is || (faceted != null && faceted.hasProjectFacet(facet));
+			}
+			if (ProjectFacetsManager.isProjectFacetDefined(WST_WEB_MODULE)) {
+				IProjectFacet facet = ProjectFacetsManager.getProjectFacet(WST_WEB_MODULE);
+				is = is || (faceted != null && faceted.hasProjectFacet(facet));
+			}
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+		return is;
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLFileWizardPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLFileWizardPage.java
new file mode 100644
index 0000000..110d800
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLFileWizardPage.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.wizard;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+
+class NewHTMLFileWizardPage extends WizardNewFileCreationPage {
+
+	private IContentType fContentType;
+	private List fValidExtensions = null;
+	
+	public NewHTMLFileWizardPage(String pageName, IStructuredSelection selection) {
+        super(pageName, selection);
+    }
+	
+	/**
+	 * This method is overriden to set the selected folder to web contents 
+	 * folder if the current selection is outside the web contents folder. 
+	 */
+	protected void initialPopulateContainerNameField() {
+		super.initialPopulateContainerNameField();
+		
+		IPath fullPath = getContainerFullPath();
+		IProject project = getProjectFromPath(fullPath);
+		IPath webContentPath = getWebContentPath(project);
+		
+		if (webContentPath != null && !webContentPath.isPrefixOf(fullPath)) {
+			setContainerFullPath(webContentPath);
+		}
+	}
+	
+	/**
+	 * This method is overriden to set additional validation specific to 
+	 * html files. 
+	 */
+	protected boolean validatePage() {
+		setMessage(null);
+		setErrorMessage(null);
+		
+		if (!super.validatePage()) {
+			return false;
+		}
+		
+		String fileName = getFileName();
+		IPath fullPath = getContainerFullPath();
+		if ((fullPath != null) && (fullPath.isEmpty() == false) && (fileName != null)) {
+			// check that filename does not contain invalid extension
+			if (!extensionValidForContentType(fileName)) {
+				setErrorMessage(NLS.bind(HTMLUIMessages._ERROR_FILENAME_MUST_END_HTML, getValidExtensions().toString()));
+				return false;
+			}
+			// no file extension specified so check adding default
+			// extension doesn't equal a file that already exists
+			if (fileName.lastIndexOf('.') == -1) {
+				String newFileName = addDefaultExtension(fileName);
+				IPath resourcePath = fullPath.append(newFileName);
+
+				IWorkspace workspace = ResourcesPlugin.getWorkspace();
+				IStatus result = workspace.validatePath(resourcePath.toString(), IResource.FOLDER);
+				if (!result.isOK()) {
+					// path invalid
+					setErrorMessage(result.getMessage());
+					return false;
+				}
+
+				if ((workspace.getRoot().getFolder(resourcePath).exists() || workspace.getRoot().getFile(resourcePath).exists())) {
+					setErrorMessage(HTMLUIMessages.ResourceGroup_nameExists);
+					return false;
+				}
+			}
+			
+			// get the IProject for the selection path
+			IProject project = getProjectFromPath(fullPath);
+			// if inside web project, check if inside webContent folder
+			if (project != null && isWebProject(project)) {
+				// check that the path is inside the webContent folder
+				IPath webContentPath = getWebContentPath(project);
+				if (!webContentPath.isPrefixOf(fullPath)) {
+					setMessage(HTMLUIMessages._WARNING_FOLDER_MUST_BE_INSIDE_WEB_CONTENT, WARNING);
+				}
+			}
+		}
+
+		return true;
+	}
+	
+	/**
+	 * Get content type associated with this new file wizard
+	 * 
+	 * @return IContentType
+	 */
+	private IContentType getContentType() {
+		if (fContentType == null)
+			fContentType = Platform.getContentTypeManager().getContentType(ContentTypeIdForHTML.ContentTypeID_HTML);
+		return fContentType;
+	}
+
+	/**
+	 * Get list of valid extensions for HTML Content type
+	 * 
+	 * @return
+	 */
+	private List getValidExtensions() {
+		if (fValidExtensions == null) {
+			IContentType type = getContentType();
+			fValidExtensions = new ArrayList(Arrays.asList(type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC)));
+		}
+		return fValidExtensions;
+	}
+	
+	/**
+	 * Verifies if fileName is valid name for content type. Takes base content
+	 * type into consideration.
+	 * 
+	 * @param fileName
+	 * @return true if extension is valid for this content type
+	 */
+	private boolean extensionValidForContentType(String fileName) {
+		boolean valid = false;
+
+		IContentType type = getContentType();
+		// there is currently an extension
+		if (fileName.lastIndexOf('.') != -1) {
+			// check what content types are associated with current extension
+			IContentType[] types = Platform.getContentTypeManager().findContentTypesFor(fileName);
+			int i = 0;
+			while (i < types.length && !valid) {
+				valid = types[i].isKindOf(type);
+				++i;
+			}
+		}
+		else
+			valid = true; // no extension so valid
+		return valid;
+	}
+
+	/**
+	 * Adds default extension to the filename
+	 * 
+	 * @param filename
+	 * @return
+	 */
+	String addDefaultExtension(String filename) {
+		StringBuffer newFileName = new StringBuffer(filename);
+
+		Preferences preference = HTMLCorePlugin.getDefault().getPluginPreferences();
+		String ext = preference.getString(HTMLCorePreferenceNames.DEFAULT_EXTENSION);
+
+		newFileName.append("."); //$NON-NLS-1$
+		newFileName.append(ext);
+
+		return newFileName.toString();
+	}
+	
+	/**
+	 * Returns the project that contains the specified path
+	 * 
+	 * @param path the path which project is needed
+	 * @return IProject object. If path is <code>null</code> the return value 
+	 * 		   is also <code>null</code>. 
+	 */
+	private IProject getProjectFromPath(IPath path) {
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		IProject project = null;
+		
+		if (path != null) {
+			if (workspace.validatePath(path.toString(), IResource.PROJECT).isOK()) {
+				project = workspace.getRoot().getProject(path.toString());
+			} else {
+				project = workspace.getRoot().getFile(path).getProject();
+			}
+		}
+		
+		return project;
+	}
+	
+	/**
+	 * Checks if the specified project is a web project. 
+	 * 
+	 * @param project project to be checked
+	 * @return true if the project is web project, otherwise false
+	 */
+	private boolean isWebProject(IProject project) {
+		return FacetModuleCoreSupport.isWebProject(project);
+	}
+	
+	/**
+	 * Returns the web contents folder of the specified project
+	 * 
+	 * @param project the project which web contents path is needed
+	 * @return IPath of the web contents folder
+	 */
+	private IPath getWebContentPath(IProject project) {
+		return FacetModuleCoreSupport.getWebContentRootPath(project);
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLTemplatesWizardPage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLTemplatesWizardPage.java
new file mode 100644
index 0000000..115042e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLTemplatesWizardPage.java
@@ -0,0 +1,521 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.wizard;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.templates.DocumentTemplateContext;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.Logger;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+import org.eclipse.wst.html.ui.internal.templates.TemplateContextTypeIdsHTML;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+
+/**
+ * Templates page in new file wizard. Allows users to select a new file
+ * template to be applied in new file.
+ * 
+ */
+public class NewHTMLTemplatesWizardPage extends WizardPage {
+
+	/**
+	 * Content provider for templates
+	 */
+	private class TemplateContentProvider implements IStructuredContentProvider {
+		/** The template store. */
+		private TemplateStore fStore;
+
+		/*
+		 * @see IContentProvider#dispose()
+		 */
+		public void dispose() {
+			fStore = null;
+		}
+
+		/*
+		 * @see IStructuredContentProvider#getElements(Object)
+		 */
+		public Object[] getElements(Object input) {
+			return fStore.getTemplates(TemplateContextTypeIdsHTML.NEW);
+		}
+
+		/*
+		 * @see IContentProvider#inputChanged(Viewer, Object, Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			fStore = (TemplateStore) newInput;
+		}
+	}
+
+	/**
+	 * Label provider for templates.
+	 */
+	private class TemplateLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+		/*
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
+		 *      int)
+		 */
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		/*
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object,
+		 *      int)
+		 */
+		public String getColumnText(Object element, int columnIndex) {
+			Template template = (Template) element;
+
+			switch (columnIndex) {
+				case 0 :
+					return template.getName();
+				case 1 :
+					return template.getDescription();
+				default :
+					return ""; //$NON-NLS-1$
+			}
+		}
+	}
+
+	/** Last selected template name */
+	private String fLastSelectedTemplateName;
+	/** The viewer displays the pattern of selected template. */
+	private SourceViewer fPatternViewer;
+	/** The table presenting the templates. */
+	private TableViewer fTableViewer;
+	/** Template store used by this wizard page */
+	private TemplateStore fTemplateStore;
+	/** Checkbox for using templates. */
+	private Button fUseTemplateButton;
+
+	public NewHTMLTemplatesWizardPage() {
+		super("NewHTMLTemplatesWizardPage", HTMLUIMessages.NewHTMLTemplatesWizardPage_0, null); //$NON-NLS-1$
+		setDescription(HTMLUIMessages.NewHTMLTemplatesWizardPage_1);
+	}
+
+	/**
+	 * Correctly resizes the table so no phantom columns appear
+	 * 
+	 * @param parent
+	 *            the parent control
+	 * @param buttons
+	 *            the buttons
+	 * @param table
+	 *            the table
+	 * @param column1
+	 *            the first column
+	 * @param column2
+	 *            the second column
+	 * @param column3
+	 *            the third column
+	 */
+	private void configureTableResizing(final Composite parent, final Table table, final TableColumn column1, final TableColumn column2) {
+		parent.addControlListener(new ControlAdapter() {
+			public void controlResized(ControlEvent e) {
+				Rectangle area = parent.getClientArea();
+				Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+				int width = area.width - 2 * table.getBorderWidth();
+				if (preferredSize.y > area.height) {
+					// Subtract the scrollbar width from the total column
+					// width
+					// if a vertical scrollbar will be required
+					Point vBarSize = table.getVerticalBar().getSize();
+					width -= vBarSize.x;
+				}
+
+				Point oldSize = table.getSize();
+				if (oldSize.x > width) {
+					// table is getting smaller so make the columns
+					// smaller first and then resize the table to
+					// match the client area width
+					column1.setWidth(width / 2);
+					column2.setWidth(width / 2);
+					table.setSize(width, area.height);
+				}
+				else {
+					// table is getting bigger so make the table
+					// bigger first and then make the columns wider
+					// to match the client area width
+					table.setSize(width, area.height);
+					column1.setWidth(width / 2);
+					column2.setWidth(width / 2);
+				}
+			}
+		});
+	}
+
+	public void createControl(Composite ancestor) {
+		Composite parent = new Composite(ancestor, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+
+		// create checkbox for user to use HTML Template
+		fUseTemplateButton = new Button(parent, SWT.CHECK);
+		fUseTemplateButton.setText(HTMLUIMessages.NewHTMLTemplatesWizardPage_4);
+		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		fUseTemplateButton.setLayoutData(data);
+		fUseTemplateButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				enableTemplates();
+			}
+		});
+
+		// create composite for Templates table
+		Composite innerParent = new Composite(parent, SWT.NONE);
+		GridLayout innerLayout = new GridLayout();
+		innerLayout.numColumns = 2;
+		innerLayout.marginHeight = 0;
+		innerLayout.marginWidth = 0;
+		innerParent.setLayout(innerLayout);
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
+		innerParent.setLayoutData(gd);
+
+		Label label = new Label(innerParent, SWT.NONE);
+		label.setText(HTMLUIMessages.NewHTMLTemplatesWizardPage_7);
+		data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		label.setLayoutData(data);
+
+		// create table that displays templates
+		Table table = new Table(innerParent, SWT.BORDER | SWT.FULL_SELECTION);
+
+		data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = convertWidthInCharsToPixels(2);
+		data.heightHint = convertHeightInCharsToPixels(10);
+		data.horizontalSpan = 2;
+		table.setLayoutData(data);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(true);
+		TableLayout tableLayout = new TableLayout();
+		table.setLayout(tableLayout);
+
+		TableColumn column1 = new TableColumn(table, SWT.NONE);
+		column1.setText(HTMLUIMessages.NewHTMLTemplatesWizardPage_2);
+
+		TableColumn column2 = new TableColumn(table, SWT.NONE);
+		column2.setText(HTMLUIMessages.NewHTMLTemplatesWizardPage_3);
+
+		fTableViewer = new TableViewer(table);
+		fTableViewer.setLabelProvider(new TemplateLabelProvider());
+		fTableViewer.setContentProvider(new TemplateContentProvider());
+
+		fTableViewer.setSorter(new ViewerSorter() {
+			public int compare(Viewer viewer, Object object1, Object object2) {
+				if ((object1 instanceof Template) && (object2 instanceof Template)) {
+					Template left = (Template) object1;
+					Template right = (Template) object2;
+					int result = left.getName().compareToIgnoreCase(right.getName());
+					if (result != 0)
+						return result;
+					return left.getDescription().compareToIgnoreCase(right.getDescription());
+				}
+				return super.compare(viewer, object1, object2);
+			}
+
+			public boolean isSorterProperty(Object element, String property) {
+				return true;
+			}
+		});
+
+		fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent e) {
+				updateViewerInput();
+			}
+		});
+
+		// create viewer that displays currently selected template's contents
+		fPatternViewer = doCreateViewer(parent);
+
+		fTemplateStore = HTMLUIPlugin.getDefault().getTemplateStore();
+		fTableViewer.setInput(fTemplateStore);
+
+		// Create linked text to just to templates preference page
+		Link link = new Link(parent, SWT.NONE);
+		link.setText(HTMLUIMessages.NewHTMLTemplatesWizardPage_6);
+		data = new GridData(SWT.END, SWT.FILL, true, false, 2, 1);
+		link.setLayoutData(data);
+		link.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				linkClicked();
+			}
+		});
+
+		configureTableResizing(innerParent, table, column1, column2);
+		loadLastSavedPreferences();
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpContextIds.HTML_NEWWIZARD_TEMPLATE_HELPID);
+		Dialog.applyDialogFont(parent);
+		setControl(parent);
+	}
+
+	/**
+	 * Creates, configures and returns a source viewer to present the template
+	 * pattern on the preference page. Clients may override to provide a
+	 * custom source viewer featuring e.g. syntax coloring.
+	 * 
+	 * @param parent
+	 *            the parent control
+	 * @return a configured source viewer
+	 */
+	private SourceViewer createViewer(Composite parent) {
+		SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
+			StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationHTML();
+
+			public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+				return baseConfiguration.getConfiguredContentTypes(sourceViewer);
+			}
+
+			public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+				return baseConfiguration.getLineStyleProviders(sourceViewer, partitionType);
+			}
+		};
+		SourceViewer viewer = new StructuredTextViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+		viewer.getTextWidget().setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
+		IStructuredModel scratchModel = StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForHTML.ContentTypeID_HTML);
+		IDocument document = scratchModel.getStructuredDocument();
+		viewer.configure(sourceViewerConfiguration);
+		viewer.setDocument(document);
+		return viewer;
+	}
+
+	private SourceViewer doCreateViewer(Composite parent) {
+		Label label = new Label(parent, SWT.NONE);
+		label.setText(HTMLUIMessages.NewHTMLTemplatesWizardPage_5);
+		GridData data = new GridData();
+		data.horizontalSpan = 2;
+		label.setLayoutData(data);
+
+		SourceViewer viewer = createViewer(parent);
+		viewer.setEditable(false);
+
+		Control control = viewer.getControl();
+		data = new GridData(GridData.FILL_BOTH);
+		data.horizontalSpan = 2;
+		data.heightHint = convertHeightInCharsToPixels(5);
+		// [261274] - source viewer was growing to fit the max line width of the template
+		data.widthHint = convertWidthInCharsToPixels(2);
+		control.setLayoutData(data);
+
+		return viewer;
+	}
+
+	/**
+	 * Enable/disable controls in page based on fUseTemplateButton's current
+	 * state.
+	 */
+	void enableTemplates() {
+		boolean enabled = fUseTemplateButton.getSelection();
+
+		if (!enabled) {
+			// save last selected template
+			Template template = getSelectedTemplate();
+			if (template != null)
+				fLastSelectedTemplateName = template.getName();
+			else
+				fLastSelectedTemplateName = ""; //$NON-NLS-1$
+
+			fTableViewer.setSelection(null);
+		}
+		else {
+			setSelectedTemplate(fLastSelectedTemplateName);
+		}
+
+		fTableViewer.getControl().setEnabled(enabled);
+		fPatternViewer.getControl().setEnabled(enabled);
+	}
+
+	/**
+	 * Return the template preference page id
+	 * 
+	 * @return
+	 */
+	private String getPreferencePageId() {
+		return "org.eclipse.wst.html.ui.preferences.templates"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Get the currently selected template.
+	 * 
+	 * @return
+	 */
+	private Template getSelectedTemplate() {
+		Template template = null;
+		IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
+
+		if (selection.size() == 1) {
+			template = (Template) selection.getFirstElement();
+		}
+		return template;
+	}
+
+	/**
+	 * Returns template string to insert.
+	 * 
+	 * @return String to insert or null if none is to be inserted
+	 */
+	String getTemplateString() {
+		String templateString = null;
+
+		Template template = getSelectedTemplate();
+		if (template != null) {
+			TemplateContextType contextType = HTMLUIPlugin.getDefault().getTemplateContextRegistry().getContextType(TemplateContextTypeIdsHTML.NEW);
+			IDocument document = new Document();
+			TemplateContext context = new DocumentTemplateContext(contextType, document, 0, 0);
+			try {
+				TemplateBuffer buffer = context.evaluate(template);
+				templateString = buffer.getString();
+			}
+			catch (Exception e) {
+				Logger.log(Logger.WARNING_DEBUG, "Could not create template for new html", e); //$NON-NLS-1$
+			}
+		}
+
+		return templateString;
+	}
+
+	void linkClicked() {
+		String pageId = getPreferencePageId();
+		PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(getShell(), pageId, new String[]{pageId}, null);
+		dialog.open();
+		fTableViewer.refresh();
+	}
+
+	/**
+	 * Load the last template name used in New HTML File wizard.
+	 */
+	private void loadLastSavedPreferences() {
+		fLastSelectedTemplateName = ""; //$NON-NLS-1$
+		boolean setSelection = false;
+		String templateName = HTMLUIPlugin.getDefault().getPreferenceStore().getString(HTMLUIPreferenceNames.NEW_FILE_TEMPLATE_NAME);
+		if (templateName == null || templateName.length() == 0) {
+			templateName = HTMLUIPlugin.getDefault().getPreferenceStore().getString(HTMLUIPreferenceNames.NEW_FILE_TEMPLATE_ID);
+			if (templateName != null && templateName.length() > 0) {
+				Template template = fTemplateStore.findTemplateById(templateName);
+				if (template != null) {
+					fLastSelectedTemplateName = template.getName();
+					setSelection = true;
+				}
+			}
+		}
+		else {
+			fLastSelectedTemplateName = templateName;
+			setSelection = true;
+		}
+		fUseTemplateButton.setSelection(setSelection);
+		enableTemplates();
+	}
+
+	/**
+	 * Save template name used for next call to New HTML File wizard.
+	 */
+	void saveLastSavedPreferences() {
+		String templateName = ""; //$NON-NLS-1$
+
+		Template template = getSelectedTemplate();
+		if (template != null) {
+			templateName = template.getName();
+		}
+
+		HTMLUIPlugin.getDefault().getPreferenceStore().setValue(HTMLUIPreferenceNames.NEW_FILE_TEMPLATE_NAME, templateName);
+		HTMLUIPlugin.getDefault().savePluginPreferences();
+	}
+
+	/**
+	 * Select a template in the table viewer given the template name. If
+	 * template name cannot be found or templateName is null, just select
+	 * first item in table. If no items in table select nothing.
+	 * 
+	 * @param templateName
+	 */
+	private void setSelectedTemplate(String templateName) {
+		Object template = null;
+
+		if (templateName != null && templateName.length() > 0) {
+			// pick the last used template
+			template = fTemplateStore.findTemplate(templateName, TemplateContextTypeIdsHTML.NEW);
+		}
+
+		// no record of last used template so just pick first element
+		if (template == null) {
+			// just pick first element
+			template = fTableViewer.getElementAt(0);
+		}
+
+		if (template != null) {
+			IStructuredSelection selection = new StructuredSelection(template);
+			fTableViewer.setSelection(selection, true);
+		}
+	}
+
+	/**
+	 * Updates the pattern viewer.
+	 */
+	void updateViewerInput() {
+		Template template = getSelectedTemplate();
+		if (template != null) {
+			fPatternViewer.getDocument().set(template.getPattern());
+		}
+		else {
+			fPatternViewer.getDocument().set(""); //$NON-NLS-1$
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLWizard.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLWizard.java
new file mode 100644
index 0000000..77c52f1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/wizard/NewHTMLWizard.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.internal.wizard;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStreamWriter;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.html.ui.internal.Logger;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImageHelper;
+import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImages;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+
+public class NewHTMLWizard extends Wizard implements INewWizard {
+	
+	private NewHTMLFileWizardPage fNewFilePage;
+	private NewHTMLTemplatesWizardPage fNewFileTemplatesPage;
+	private IStructuredSelection fSelection;
+
+	public void addPages() {
+		fNewFilePage = new NewHTMLFileWizardPage("HTMLWizardNewFileCreationPage", new StructuredSelection(IDE.computeSelectedResources(fSelection))); //$NON-NLS-1$
+		fNewFilePage.setTitle(HTMLUIMessages._UI_WIZARD_NEW_HEADING);
+		fNewFilePage.setDescription(HTMLUIMessages._UI_WIZARD_NEW_DESCRIPTION);
+		addPage(fNewFilePage);
+
+		fNewFileTemplatesPage = new NewHTMLTemplatesWizardPage();
+		addPage(fNewFileTemplatesPage);
+	}
+	
+	private String applyLineDelimiter(IFile file, String text) {
+		String lineDelimiter = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, System.getProperty("line.separator"), new IScopeContext[] {new ProjectScope(file.getProject()), new InstanceScope() });//$NON-NLS-1$
+		String convertedText = StringUtils.replace(text, "\r\n", "\n");
+		convertedText = StringUtils.replace(convertedText, "\r", "\n");
+		convertedText = StringUtils.replace(convertedText, "\n", lineDelimiter);
+		return convertedText;
+	}
+
+	public void init(IWorkbench aWorkbench, IStructuredSelection aSelection) {
+		fSelection = aSelection;
+		setWindowTitle(HTMLUIMessages._UI_WIZARD_NEW_TITLE);
+
+		ImageDescriptor descriptor = HTMLEditorPluginImageHelper.getInstance().getImageDescriptor(HTMLEditorPluginImages.IMG_WIZBAN_NEWHTMLFILE);
+		setDefaultPageImageDescriptor(descriptor);
+	}
+
+	private void openEditor(final IFile file) {
+		if (file != null) {
+			getShell().getDisplay().asyncExec(new Runnable() {
+				public void run() {
+					try {
+						IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+						IDE.openEditor(page, file, true);
+					}
+					catch (PartInitException e) {
+						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+					}
+				}
+			});
+		}
+	}
+
+	public boolean performFinish() {
+		boolean performedOK = false;
+		// save user options for next use
+		fNewFileTemplatesPage.saveLastSavedPreferences();
+
+		// no file extension specified so add default extension
+		String fileName = fNewFilePage.getFileName();
+		if (fileName.lastIndexOf('.') == -1) {
+			String newFileName = fNewFilePage.addDefaultExtension(fileName);
+			fNewFilePage.setFileName(newFileName);
+		}
+
+		// create a new empty file
+		IFile file = fNewFilePage.createNewFile();
+
+		// if there was problem with creating file, it will be null, so make
+		// sure to check
+		if (file != null) {
+			// put template contents into file
+			String templateString = fNewFileTemplatesPage.getTemplateString();
+			if (templateString != null) {
+				templateString = applyLineDelimiter(file, templateString);
+				// determine the encoding for the new file
+				Preferences preference = HTMLCorePlugin.getDefault().getPluginPreferences();
+				String charSet = preference.getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
+
+				try {
+					ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+					OutputStreamWriter outputStreamWriter = null;
+					if (charSet == null || charSet.trim().equals("")) { //$NON-NLS-1$
+						// just use default encoding
+						outputStreamWriter = new OutputStreamWriter(outputStream);
+					}
+					else {
+						outputStreamWriter = new OutputStreamWriter(outputStream, charSet);
+					}
+					outputStreamWriter.write(templateString);
+					outputStreamWriter.flush();
+					outputStreamWriter.close();
+					ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+					file.setContents(inputStream, true, false, null);
+					inputStream.close();
+				}
+				catch (Exception e) {
+					Logger.log(Logger.WARNING_DEBUG, "Could not create contents for new HTML file", e); //$NON-NLS-1$
+				}
+			}
+
+			// open the file in editor
+			openEditor(file);
+
+			// everything's fine
+			performedOK = true;
+		}
+		return performedOK;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/views/contentoutline/HTMLContentOutlineConfiguration.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/views/contentoutline/HTMLContentOutlineConfiguration.java
new file mode 100644
index 0000000..4214204
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/views/contentoutline/HTMLContentOutlineConfiguration.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.ui.views.contentoutline;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.wst.html.ui.internal.HTMLUIPlugin;
+import org.eclipse.wst.html.ui.internal.contentoutline.HTMLNodeActionManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
+import org.eclipse.wst.xml.ui.views.contentoutline.XMLContentOutlineConfiguration;
+
+/**
+ * Configuration for outline view page which shows HTML content.
+ * 
+ * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration
+ * @since 1.0
+ */
+public class HTMLContentOutlineConfiguration extends XMLContentOutlineConfiguration {
+
+	/**
+	 * Create new instance of HTMLContentOutlineConfiguration
+	 */
+	public HTMLContentOutlineConfiguration() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+	}
+
+	protected XMLNodeActionManager createNodeActionManager(TreeViewer treeViewer) {
+		return new HTMLNodeActionManager((IStructuredModel) treeViewer.getInput(), treeViewer);
+	}
+
+	protected IPreferenceStore getPreferenceStore() {
+		return HTMLUIPlugin.getDefault().getPreferenceStore();
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/templates/htmldefault-templates.properties b/bundles/org.eclipse.wst.html.ui/templates/htmldefault-templates.properties
new file mode 100644
index 0000000..cfa1c62
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/templates/htmldefault-templates.properties
@@ -0,0 +1,54 @@
+###############################################################################
+# Copyright (c) 2004, 2010 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Benjamin Muskalla, b.muskalla@gmx.net - [156040] no new html template for xhtml 1.0 strict
+###############################################################################
+Templates.comment.name=comment
+Templates.comment.desc=comment
+Templates.ul.name=ul
+Templates.ul.desc=unordered list
+Templates.ul.content=<ul>\n  <li> Item one </li>\n  <li> Item two </li>\n</ul>\n
+Templates.dl.name=dl
+Templates.dl.desc=definition list
+Templates.dl.content=<dl>\n  <dt> First definition</dt>  <dd>  First explanation</dd>\n  <dt> Second definition</dt> <dd> Second explanation</dd>\n</dl>\n
+Templates.table.name=table
+Templates.table.desc=table
+Templates.table.content=<table>\n  <tr>\n    <th>Column 1 Heading</th>\n    <th>Column 2 Heading</th>\n  </tr>\n  <tr>\n    <td>Row 1: Col 1</td>\n    <td>Row 1: Col 2</td>\n  </tr>\n</table>\n
+Templates.ol.name=ol
+Templates.ol.desc=ordered list
+Templates.ol.content=<ol>\n  <li> Item one </li>\n  <li> Item two </li>\n</ol>\n
+Templates.html.name=New HTML File (4.01 transitional)
+Templates.html.desc=html 4.01 transitional
+Templates.html.content=<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=${encoding}">\n<title>Insert title here</title>\n</head>\n<body>\n${cursor}\n</body>\n</html>
+Templates.htmlframeset.name=New HTML File (4.01 frameset)
+Templates.htmlframeset.desc=html 4.01 frameset
+Templates.htmlframeset.content=<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=${encoding}">\n<title>Insert title here</title>\n</head>\n<frameset>\n    <frame>\n    <frame>\n    <noframes>\n    <body>\n    <p>This page uses frames. The current browser you are using does not support frames.</p>\n    </body>\n    </noframes>\n</frameset>\n</html>
+Templates.htmlstrict.name=New HTML File (4.01 strict)
+Templates.htmlstrict.desc=html 4.01 strict
+Templates.htmlstrict.content=<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=${encoding}">\n<title>Insert title here</title>\n</head>\n<body>\n${cursor}\n</body>\n</html>
+Templates.xhtml.name=New XHTML File (1.0 transitional)
+Templates.xhtml.desc=xhtml 1.0 transitional
+Templates.xhtml.content=<?xml version="1.0" encoding="${encoding}" ?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=${encoding}" />\n<title>Insert title here</title>\n</head>\n<body>\n${cursor}\n</body>\n</html>
+Templates.xhtmlframeset.name=New XHTML File (1.0 frameset)
+Templates.xhtmlframeset.desc=xhtml 1.0 frameset
+Templates.xhtmlframeset.content=<?xml version="1.0" encoding="${encoding}" ?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=${encoding}" />\n<title>Insert title here</title>\n</head>\n<frameset>\n    <frame />\n    <frame />\n    <noframes>\n    <body>\n    <p>This page uses frames. The current browser you are using does not support frames.</p>\n    </body>\n    </noframes>\n</frameset>\n</html>
+Templates.xhtmlstrict.name=New XHTML File (1.0 strict)
+Templates.xhtmlstrict.desc=xhtml 1.0 strict
+Templates.xhtmlstrict.content=<?xml version="1.0" encoding="${encoding}" ?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=${encoding}" />\n<title>Insert title here</title>\n</head>\n<body>\n${cursor}\n</body>\n</html>
+Templates.script.name=script
+Templates.script.desc=script     (commented)
+Templates.script.content=<script type=\"${cursor}text/javascript\">\n<!--\n\n//-->\n</script>
+Templates.style.name=style
+Templates.style.desc=style     (commented)
+Templates.style.content=<style>\n<!--\n${cursor}\n-->\n</style>
+Templates.imgmap.name=img
+Templates.imgmap.desc=img     (map)
+Templates.html5.name=New HTML File (5)
+Templates.html5.desc=html 5
+Templates.html5.content=<!DOCTYPE html>\n<html>\n<head>\n<meta charset="${encoding}">\n<title>Insert title here</title>\n</head>\n<body>\n${cursor}\n</body>\n</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/templates/htmldefault-templates.xml b/bundles/org.eclipse.wst.html.ui/templates/htmldefault-templates.xml
new file mode 100644
index 0000000..c600c08
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/templates/htmldefault-templates.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Benjamin Muskalla, b.muskalla@gmx.net - [156040] no new html template for xhtml 1.0 strict
+ *     
+ *******************************************************************************/
+ -->
+<templates>
+
+<template name="%Templates.comment.name" description="%Templates.comment.desc" id="org.eclipse.wst.html.ui.templates.comment" context="html_tag" enabled="true">&lt;!-- ${cursor} --&gt;</template>
+
+<template name="%Templates.imgmap.name" description="%Templates.imgmap.desc" id="org.eclipse.wst.html.ui.templates.imgmap" context="html_tag" enabled="true">&lt;img ismap&gt;</template>
+
+<template name="%Templates.ul.name" description="%Templates.ul.desc" id="org.eclipse.wst.html.ui.templates.ul" context="html_tag" enabled="true">%Templates.ul.content</template>
+
+<template name="%Templates.dl.name" description="%Templates.dl.desc" id="org.eclipse.wst.html.ui.templates.dl" context="html_tag" enabled="true">%Templates.dl.content</template>
+
+<template name="%Templates.table.name" description="%Templates.table.desc" id="org.eclipse.wst.html.ui.templates.table" context="html_tag" enabled="true">%Templates.table.content</template>
+
+<template name="%Templates.ol.name" description="%Templates.ol.desc" id="org.eclipse.wst.html.ui.templates.ol" context="html_tag" enabled="true">%Templates.ol.content</template>
+
+<template name="%Templates.html.name" description="%Templates.html.desc" id="org.eclipse.wst.html.ui.templates.html" context="html_new" enabled="true">%Templates.html.content</template>
+
+<template name="%Templates.htmlframeset.name" description="%Templates.htmlframeset.desc" id="org.eclipse.wst.html.ui.templates.htmlframeset" context="html_new" enabled="true">%Templates.htmlframeset.content</template>
+
+<template name="%Templates.htmlstrict.name" description="%Templates.htmlstrict.desc" id="org.eclipse.wst.html.ui.templates.htmlstrict" context="html_new" enabled="true">%Templates.htmlstrict.content</template>
+
+<template name="%Templates.xhtml.name" description="%Templates.xhtml.desc" id="org.eclipse.wst.html.ui.templates.xhtml" context="html_new" enabled="true">%Templates.xhtml.content</template>
+
+<template name="%Templates.xhtmlframeset.name" description="%Templates.xhtmlframeset.desc" id="org.eclipse.wst.html.ui.templates.xhtmlframeset" context="html_new" enabled="true">%Templates.xhtmlframeset.content</template>
+
+<template name="%Templates.xhtmlstrict.name" description="%Templates.xhtmlstrict.desc" id="org.eclipse.wst.html.ui.templates.xhtmlstrict" context="html_new" enabled="true">%Templates.xhtmlstrict.content</template>
+
+<template name="%Templates.script.name" description="%Templates.script.desc" id="org.eclipse.wst.html.ui.templates.script" context="html_tag" enabled="true">%Templates.script.content</template>
+
+<template name="%Templates.style.name" description="%Templates.style.desc" id="org.eclipse.wst.html.ui.templates.style" context="html_tag" enabled="true">%Templates.style.content</template>
+
+<template name="%Templates.html5.name" description="%Templates.html5.desc" id="org.eclipse.wst.html.ui.templates.html5" context="html_new" enabled="true">%Templates.html5.content</template>
+
+</templates>
diff --git a/bundles/org.eclipse.wst.sse.core/.classpath b/bundles/org.eclipse.wst.sse.core/.classpath
deleted file mode 100644
index df9dea9..0000000
--- a/bundles/org.eclipse.wst.sse.core/.classpath
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src-encoding"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="src-tasktags"/>
-	<classpathentry kind="src" path="src-contentproperties"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4">
-		<accessrules>
-			<accessrule kind="accessible" pattern="org/w3c/dom/traversal/NodeIterator"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.sse.core/.cvsignore b/bundles/org.eclipse.wst.sse.core/.cvsignore
deleted file mode 100644
index a71230f..0000000
--- a/bundles/org.eclipse.wst.sse.core/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-bin
-model.jar
-build.xml
-temp.folder
-org.eclipse.wst.sse.core_1.0.0.jar
-@dot
-src.zip
-.fbwarnings
-javaCompiler...args
diff --git a/bundles/org.eclipse.wst.sse.core/.options b/bundles/org.eclipse.wst.sse.core/.options
deleted file mode 100644
index 94d01b5..0000000
--- a/bundles/org.eclipse.wst.sse.core/.options
+++ /dev/null
@@ -1,18 +0,0 @@
-org.eclipse.wst.sse.core/debug=true
-org.eclipse.wst.sse.core/dom/adapter/notification/time=false
-org.eclipse.wst.sse.core/dom/adapter/notification/time/criteria=10
-org.eclipse.wst.sse.core/structureddocument=false
-org.eclipse.wst.sse.core/filebuffers/modelmanagement=false
-org.eclipse.wst.sse.core/filebuffers/lifecycle=false
-org.eclipse.wst.sse.core/structuredmodel/lifecycle=false
-org.eclipse.wst.sse.core/structuredmodel/state=false
-org.eclipse.wst.sse.core/structuredmodel/locks=true
-org.eclipse.wst.sse.core/structuredmodel/modelmanager=false
-org.eclipse.wst.sse.core/tasks=false
-org.eclipse.wst.sse.core/tasks/detection=false
-org.eclipse.wst.sse.core/tasks/job=false
-org.eclipse.wst.sse.core/tasks/overalltime=false
-org.eclipse.wst.sse.core/tasks/time=false
-org.eclipse.wst.sse.core/tasks/preferences=false
-org.eclipse.wst.sse.core/tasks/registry=false
-org.eclipse.wst.sse.core/format=false
diff --git a/bundles/org.eclipse.wst.sse.core/.project b/bundles/org.eclipse.wst.sse.core/.project
deleted file mode 100644
index 36c5b34..0000000
--- a/bundles/org.eclipse.wst.sse.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.sse.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 104e60d..0000000
--- a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,80 +0,0 @@
-#Sat Mar 24 11:23:54 EDT 2007

-eclipse.preferences.version=1

-org.eclipse.jdt.core.builder.cleanOutputFolder=clean

-org.eclipse.jdt.core.builder.duplicateResourceTask=warning

-org.eclipse.jdt.core.builder.invalidClasspath=ignore

-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch

-org.eclipse.jdt.core.circularClasspath=error

-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled

-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled

-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled

-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2

-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve

-org.eclipse.jdt.core.compiler.compliance=1.4

-org.eclipse.jdt.core.compiler.debug.lineNumber=generate

-org.eclipse.jdt.core.compiler.debug.localVariable=generate

-org.eclipse.jdt.core.compiler.debug.sourceFile=generate

-org.eclipse.jdt.core.compiler.doc.comment.support=enabled

-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100

-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning

-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning

-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore

-org.eclipse.jdt.core.compiler.problem.deprecation=ignore

-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled

-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled

-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning

-org.eclipse.jdt.core.compiler.problem.emptyStatement=error

-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning

-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning

-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore

-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore

-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error

-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error

-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning

-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning

-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore

-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error

-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore

-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled

-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled

-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private

-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore

-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error

-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore

-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore

-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled

-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public

-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore

-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled

-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private

-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore

-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error

-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error

-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning

-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore

-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning

-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error

-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled

-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error

-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled

-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore

-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore

-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning

-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore

-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning

-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore

-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error

-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore

-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore

-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled

-org.eclipse.jdt.core.compiler.problem.unusedImport=error

-org.eclipse.jdt.core.compiler.problem.unusedLabel=error

-org.eclipse.jdt.core.compiler.problem.unusedLocal=error

-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore

-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled

-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled

-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error

-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning

-org.eclipse.jdt.core.compiler.source=1.3

-org.eclipse.jdt.core.incompatibleJDKLevel=ignore

-org.eclipse.jdt.core.incompleteClasspath=error

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex
deleted file mode 100644
index bd7272a..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************

- * Copyright (c) 2004, 2008 IBM Corporation and others.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- * 

- * Contributors:

- *     IBM Corporation - initial API and implementation

- *******************************************************************************/

-/*nlsXXX*/

-package org.eclipse.wst.css.core.internal.contenttype;

-import java.io.IOException;

-import java.io.Reader;

-

-import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;

-import org.eclipse.wst.xml.core.internal.contenttype.XMLHeadTokenizerConstants;

-

-

-

-%%

-

-%{

-

-

-	private boolean hasMore = true;

-	private final static int MAX_TO_SCAN = 8000;

-	StringBuffer string = new StringBuffer();

-	// state stack for easier state handling

-	private IntStack fStateStack = new IntStack();

-	private String valueText = null;

-

-

-

-	public CSSHeadTokenizer() {

-		super();

-	}

-

-	  public void reset (Reader in) {

-	  	/* the input device */

-	  	yy_reader = in;

-

-  		/* the current state of the DFA */

-  		yy_state = 0;

-

-  		/* the current lexical state */

-  		yy_lexical_state = YYINITIAL;

-

-  		/* this buffer contains the current text to be matched and is

-  		 the source of the yytext() string */

-  		java.util.Arrays.fill(yy_buffer, (char)0);

-

-  		/* the textposition at the last accepting state */

-  		yy_markedPos = 0;

-

-  		/* the textposition at the last state to be included in yytext */

-  		yy_pushbackPos = 0;

-

-  		/* the current text position in the buffer */

-  		yy_currentPos = 0;

-

-  		/* startRead marks the beginning of the yytext() string in the buffer */

-  		yy_startRead = 0;

-

-  		/** 

-  		 * endRead marks the last character in the buffer, that has been read

-  		 * from input 

-  		 */

-  		yy_endRead = 0;

-

-  		/* number of newlines encountered up to the start of the matched text */

-  		yyline = 0;

-

-  		/* the number of characters up to the start of the matched text */

-  		yychar = 0;

-

-  		/**

-  		 * the number of characters from the last newline up to the start

-  		 * of the matched text

-  		 */

-  		yycolumn = 0; 

-

-  		/** 

-  		 * yy_atBOL == true <=> the scanner is currently at the beginning 

-  		 * of a line

-  		 */

-  		yy_atBOL = false;

-

-  		/* yy_atEOF == true <=> the scanner has returned a value for EOF */

-  		yy_atEOF = false;

-

-  		/* denotes if the user-EOF-code has already been executed */

-  		yy_eof_done = false;

-

-

-  		fStateStack.clear();

-  		

-  		hasMore = true;

-  		

-		// its a little wasteful to "throw away" first char array generated

-		// by class init (via auto generated code), but we really do want

-		// a small buffer for our head parsers.

-		if (yy_buffer.length != MAX_TO_SCAN) {

-			yy_buffer = new char[MAX_TO_SCAN];

-		}

-  		

-

-  	}

-

-

-	public final HeadParserToken getNextToken() throws IOException {

-		String context = null;

-		context = primGetNextToken();

-		HeadParserToken result = null;

-		if (valueText != null) {

-			result = createToken(context, yychar, valueText);

-			valueText = null;

-		} else {

-			result = createToken(context, yychar, yytext());

-		}

-		return result;

-	}

-

-	public final boolean hasMoreTokens() {

-		return hasMore && yychar < MAX_TO_SCAN;

-	}

-	private void pushCurrentState() {

-		fStateStack.push(yystate());

-

-	}

-

-	private void popState() {

-		yybegin(fStateStack.pop());

-	}

-	private HeadParserToken createToken(String context, int start, String text) {

-		return new HeadParserToken(context, start, text);

-	}

-	

-

-%}

-

-%eof{

-	hasMore=false;

-%eof}

-

-%public

-%class CSSHeadTokenizer

-%function primGetNextToken

-%type String

-%char

-%unicode

-%ignorecase 

-%debug

-%switch

-

-

-UTF16BE = \xFE\xFF

-UTF16LE = \xFF\xFE

-UTF83ByteBOM = \xEF\xBB\xBF

-

-//SpaceChar = [\x20\x09]

-

-

-

-// [3] S ::= (0x20 | 0x9 | 0xD | 0xA)+

-S = [\x20\x09\x0D\x0A]

-

-//BeginAttribeValue = {S}* \= {S}*

-

-LineTerminator = \r|\n

-

-// Z is the single-byte zero character to be used in parsing double-byte files

-Z = (\x00)?

-S_UTF = {Z}{S}{Z}

-BeginAttributeValueUTF = {S_UTF}* \= {S_UTF}*

-

-%state ST_XMLDecl

-%state CHARSET_RULE

-%state QuotedAttributeValue

-%state DQ_STRING

-%state SQ_STRING

-%state UnDelimitedString

-

-%%

-

-

-<YYINITIAL>  

-{

-	{UTF16BE}   		{hasMore = false; return EncodingParserConstants.UTF16BE;}

-	{UTF16LE}   		{hasMore = false; return EncodingParserConstants.UTF16LE;}

-	{UTF83ByteBOM}   	{hasMore = false; return EncodingParserConstants.UTF83ByteBOM;}

-

-	// force to be started on first line, but we do allow preceeding spaces

-	^ {Z}({S}{Z})* ({Z}<{Z}\?{Z}x{Z}m{Z}l{Z}){S_UTF}+ {if (yychar == 0 ) {yybegin(ST_XMLDecl); return XMLHeadTokenizerConstants.XMLDeclStart;}}

-	

-	^ {Z}({S}{Z})*({Z}@{Z}c{Z}h{Z}a{Z}r{Z}s{Z}e{Z}t{Z})   {if (yychar == 0 )  {yybegin(CHARSET_RULE); return CSSHeadTokenizerConstants.CHARSET_RULE;}}

-}	

-

-// I don't think there's really an XML form of CSS files ... but will leave here for consistency	

-<ST_XMLDecl> 

-{

-	//"version" {BeginAttribeValue} {pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDeclVersion;}

-	{Z}e{Z}n{Z}c{Z}o{Z}d{Z}i{Z}n{Z}g{Z} {BeginAttributeValueUTF} {pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding;}

-	// note this "forced end" once end of XML Declaration found

-	{Z}\?{Z}>{Z}    {yybegin(YYINITIAL);  return XMLHeadTokenizerConstants.XMLDeclEnd;}

-}	

-

-<CHARSET_RULE> 

-{

-

-	{S_UTF}*  {pushCurrentState(); yybegin(QuotedAttributeValue);}

-	{Z};{Z}    { yybegin(YYINITIAL);  hasMore = false; return CSSHeadTokenizerConstants.RuleEnd;}

-}

-	

-

-<QuotedAttributeValue>

-{

-	{Z}\"{Z}                     { yybegin(DQ_STRING); string.setLength(0); }

-	{Z}\'{Z}			{ yybegin(SQ_STRING); string.setLength(0); }

-	// in this state, anything other than a space character can start an undelimited string

-	{S_UTF}*.           { yypushback(yylength()); yybegin(UnDelimitedString); string.setLength(0);}

-

-}	

-

-

-<DQ_STRING>

-{

-

-	{Z}\"{Z}                      { popState(); valueText = string.toString(); return EncodingParserConstants.StringValue; }

-  	{Z}{LineTerminator}{Z}        { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\?{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}<{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	

-	{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\/{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z};{Z}                      { yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }

-	[^\x00]			{ string.append( yytext() ); }

-

-

-}

-

-<SQ_STRING>

-{

-

-	{Z}\'{Z}                      { popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;}

-  	{Z}{LineTerminator}{Z}        { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}%{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}<{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\/{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z};{Z}                      { yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }

-	[^\x00]			{ string.append( yytext() ); }

-

-}

-

-<UnDelimitedString>

-{

-

-

-	{S_UTF}                     { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue; }

-  	{Z}{LineTerminator}{Z}        { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\?{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}<{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	// these are a bit special, since we started an undelimit string, but found a quote ... probably indicates a missing beginning quote

-	{Z}\'{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue;}

-	{Z}\"{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue;}

-	

-	{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\/{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z};{Z}                      { yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue; }

-	[^\x00]			{ string.append( yytext() ); }

-}

-

-// The "match anything" rule should always be in effect except for when looking for end of string

-// (That is, remember to update state list if/when new states added)

-.|\n	{if(yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;}}

-

-// this rule always in effect

-<<EOF>>         {hasMore = false; return EncodingParserConstants.EOF;}

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.java
deleted file mode 100644
index d2309dd..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.java
+++ /dev/null
@@ -1,1441 +0,0 @@
-/* The following code was generated by JFlex 1.2.2 on 7/28/08 5:19 PM */
-
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*nlsXXX*/
-package org.eclipse.wst.css.core.internal.contenttype;
-import java.io.IOException;
-import java.io.Reader;
-
-import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;
-import org.eclipse.wst.xml.core.internal.contenttype.XMLHeadTokenizerConstants;
-
-
-
-
-/**
- * This class is a scanner generated by 
- * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 7/28/08 5:19 PM from the specification file
- * <tt>file:/D:/workspaces/wtp301/workspace/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex</tt>
- */
-public class CSSHeadTokenizer {
-
-  /** this character denotes the end of file */
-  final public static int YYEOF = -1;
-
-  /** lexical states */
-  final public static int YYINITIAL = 0;
-  final public static int UnDelimitedString = 12;
-  final public static int DQ_STRING = 8;
-  final public static int SQ_STRING = 10;
-  final public static int ST_XMLDecl = 2;
-  final public static int QuotedAttributeValue = 6;
-  final public static int CHARSET_RULE = 4;
-
-  /**
-   * YY_LEXSTATE[l] is the state in the DFA for the lexical state l
-   * YY_LEXSTATE[l+1] is the state in the DFA for the lexical state l
-   *                  at the beginning of a line
-   * l is of the form l = 2*k, k a non negative integer
-   */
-  private final static int YY_LEXSTATE[] = { 
-     0,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7, 7
-  };
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static String yycmap_packed = 
-    "\1\11\10\0\1\6\1\10\2\0\1\7\22\0\1\6\1\0\1\37"+
-    "\2\0\1\42\1\0\1\40\7\0\1\41\13\0\1\36\1\13\1\12"+
-    "\1\35\1\14\1\20\1\23\1\0\1\21\1\32\1\26\1\0\1\34"+
-    "\1\22\1\33\2\0\1\17\1\16\1\30\1\31\2\0\1\24\1\25"+
-    "\1\27\3\0\1\15\10\0\1\23\1\0\1\21\1\32\1\26\1\0"+
-    "\1\34\1\22\1\33\2\0\1\17\1\16\1\30\1\31\2\0\1\24"+
-    "\1\25\1\27\3\0\1\15\102\0\1\4\3\0\1\5\17\0\1\3"+
-    "\16\0\1\1\20\0\1\3\16\0\1\1\1\2\170\0\1\2\ufe87\0";
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);
-
-
-  /* error codes */
-  final private static int YY_UNKNOWN_ERROR = 0;
-  final private static int YY_ILLEGAL_STATE = 1;
-  final private static int YY_NO_MATCH = 2;
-  final private static int YY_PUSHBACK_2BIG = 3;
-
-  /* error messages for the codes above */
-  final private static String YY_ERROR_MSG[] = {
-    "Unkown internal scanner error",
-    "Internal error: unknown state",
-    "Error: could not match input",
-    "Error: pushback value was too large"
-  };
-
-  /** the input device */
-  private java.io.Reader yy_reader;
-
-  /** the current state of the DFA */
-  private int yy_state;
-
-  /** the current lexical state */
-  private int yy_lexical_state = YYINITIAL;
-
-  /** this buffer contains the current text to be matched and is
-      the source of the yytext() string */
-  private char yy_buffer[] = new char[16384];
-
-  /** the textposition at the last accepting state */
-  private int yy_markedPos;
-
-  /** the textposition at the last state to be included in yytext */
-  private int yy_pushbackPos;
-
-  /** the current text position in the buffer */
-  private int yy_currentPos;
-
-  /** startRead marks the beginning of the yytext() string in the buffer */
-  private int yy_startRead;
-
-  /** endRead marks the last character in the buffer, that has been read
-      from input */
-  private int yy_endRead;
-
-  /** number of newlines encountered up to the start of the matched text */
-  private int yyline;
-
-  /** the number of characters up to the start of the matched text */
-  private int yychar;
-
-  /**
-   * the number of characters from the last newline up to the start of the 
-   * matched text
-   */
-  private int yycolumn; 
-
-  /** 
-   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
-   */
-  private boolean yy_atBOL;
-
-  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
-  private boolean yy_atEOF;
-
-  /** denotes if the user-EOF-code has already been executed */
-  private boolean yy_eof_done;
-
-  /* user code: */
-
-
-	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 8000;
-	StringBuffer string = new StringBuffer();
-	// state stack for easier state handling
-	private IntStack fStateStack = new IntStack();
-	private String valueText = null;
-
-
-
-	public CSSHeadTokenizer() {
-		super();
-	}
-
-	  public void reset (Reader in) {
-	  	/* the input device */
-	  	yy_reader = in;
-
-  		/* the current state of the DFA */
-  		yy_state = 0;
-
-  		/* the current lexical state */
-  		yy_lexical_state = YYINITIAL;
-
-  		/* this buffer contains the current text to be matched and is
-  		 the source of the yytext() string */
-  		java.util.Arrays.fill(yy_buffer, (char)0);
-
-  		/* the textposition at the last accepting state */
-  		yy_markedPos = 0;
-
-  		/* the textposition at the last state to be included in yytext */
-  		yy_pushbackPos = 0;
-
-  		/* the current text position in the buffer */
-  		yy_currentPos = 0;
-
-  		/* startRead marks the beginning of the yytext() string in the buffer */
-  		yy_startRead = 0;
-
-  		/** 
-  		 * endRead marks the last character in the buffer, that has been read
-  		 * from input 
-  		 */
-  		yy_endRead = 0;
-
-  		/* number of newlines encountered up to the start of the matched text */
-  		yyline = 0;
-
-  		/* the number of characters up to the start of the matched text */
-  		yychar = 0;
-
-  		/**
-  		 * the number of characters from the last newline up to the start
-  		 * of the matched text
-  		 */
-  		yycolumn = 0; 
-
-  		/** 
-  		 * yy_atBOL == true <=> the scanner is currently at the beginning 
-  		 * of a line
-  		 */
-  		yy_atBOL = false;
-
-  		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
-  		yy_atEOF = false;
-
-  		/* denotes if the user-EOF-code has already been executed */
-  		yy_eof_done = false;
-
-
-  		fStateStack.clear();
-  		
-  		hasMore = true;
-  		
-		// its a little wasteful to "throw away" first char array generated
-		// by class init (via auto generated code), but we really do want
-		// a small buffer for our head parsers.
-		if (yy_buffer.length != MAX_TO_SCAN) {
-			yy_buffer = new char[MAX_TO_SCAN];
-		}
-  		
-
-  	}
-
-
-	public final HeadParserToken getNextToken() throws IOException {
-		String context = null;
-		context = primGetNextToken();
-		HeadParserToken result = null;
-		if (valueText != null) {
-			result = createToken(context, yychar, valueText);
-			valueText = null;
-		} else {
-			result = createToken(context, yychar, yytext());
-		}
-		return result;
-	}
-
-	public final boolean hasMoreTokens() {
-		return hasMore && yychar < MAX_TO_SCAN;
-	}
-	private void pushCurrentState() {
-		fStateStack.push(yystate());
-
-	}
-
-	private void popState() {
-		yybegin(fStateStack.pop());
-	}
-	private HeadParserToken createToken(String context, int start, String text) {
-		return new HeadParserToken(context, start, text);
-	}
-	
-
-
-
-  /**
-   * Creates a new scanner
-   * There is also a java.io.InputStream version of this constructor.
-   *
-   * @param   in  the java.io.Reader to read input from.
-   */
-  public CSSHeadTokenizer(java.io.Reader in) {
-    this.yy_reader = in;
-  }
-
-  /**
-   * Creates a new scanner.
-   * There is also java.io.Reader version of this constructor.
-   *
-   * @param   in  the java.io.Inputstream to read input from.
-   */
-  public CSSHeadTokenizer(java.io.InputStream in) {
-    this(new java.io.InputStreamReader(in));
-  }
-
-  /** 
-   * Unpacks the compressed character translation table.
-   *
-   * @param packed   the packed character translation table
-   * @return         the unpacked character translation table
-   */
-  private static char [] yy_unpack_cmap(String packed) {
-    char [] map = new char[0x10000];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 160) {
-      int  count = packed.charAt(i++);
-      char value = packed.charAt(i++);
-      do map[j++] = value; while (--count > 0);
-    }
-    return map;
-  }
-
-
-  /**
-   * Gets the next input character.
-   *
-   * @return      the next character of the input stream, EOF if the
-   *              end of the stream is reached.
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  private int yy_advance() throws java.io.IOException {
-
-    /* standard case */
-    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];
-
-    /* if the eof is reached, we don't need to work hard */ 
-    if (yy_atEOF) return YYEOF;
-
-    /* otherwise: need to refill the buffer */
-
-    /* first: make room (if you can) */
-    if (yy_startRead > 0) {
-      System.arraycopy(yy_buffer, yy_startRead, 
-                       yy_buffer, 0, 
-                       yy_endRead-yy_startRead);
-
-      /* translate stored positions */
-      yy_endRead-= yy_startRead;
-      yy_currentPos-= yy_startRead;
-      yy_markedPos-= yy_startRead;
-      yy_pushbackPos-= yy_startRead;
-      yy_startRead = 0;
-    }
-
-    /* is the buffer big enough? */
-    if (yy_currentPos >= yy_buffer.length) {
-      /* if not: blow it up */
-      char newBuffer[] = new char[yy_currentPos*2];
-      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
-      yy_buffer = newBuffer;
-    }
-
-    /* finally: fill the buffer with new input */
-    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
-                                            yy_buffer.length-yy_endRead);
-
-    if ( numRead == -1 ) return YYEOF;
-
-    yy_endRead+= numRead;
-
-    return yy_buffer[yy_currentPos++];
-  }
-
-
-  /**
-   * Closes the input stream.
-   */
-  final public void yyclose() throws java.io.IOException {
-    yy_atEOF = true;            /* indicate end of file */
-    yy_endRead = yy_startRead;  /* invalidate buffer    */
-    yy_reader.close();
-  }
-
-
-  /**
-   * Returns the current lexical state.
-   */
-  final public int yystate() {
-    return yy_lexical_state;
-  }
-
-  /**
-   * Enters a new lexical state
-   *
-   * @param newState the new lexical state
-   */
-  final public void yybegin(int newState) {
-    yy_lexical_state = newState;
-  }
-
-
-  /**
-   * Returns the text matched by the current regular expression.
-   */
-  final public String yytext() {
-    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
-  }
-
-  /**
-   * Returns the length of the matched text region.
-   */
-  final public int yylength() {
-    return yy_markedPos-yy_startRead;
-  }
-
-
-  /**
-   * Reports an error that occured while scanning.
-   *
-   * @param   errorCode  the code of the errormessage to display
-   */
-  private void yy_ScanError(int errorCode) {
-    try {
-      System.out.println(YY_ERROR_MSG[errorCode]);
-    }
-    catch (ArrayIndexOutOfBoundsException e) {
-      System.out.println(YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
-    }
-
-    System.exit(1);
-  } 
-
-
-  /**
-   * Pushes the specified amount of characters back into the input stream.
-   *
-   * They will be read again by then next call of the scanning method
-   *
-   * @param number  the number of characters to be read again.
-   *                This number must not be greater than yylength()!
-   */
-  private void yypushback(int number) {
-    if ( number > yylength() )
-      yy_ScanError(YY_PUSHBACK_2BIG);
-
-    yy_markedPos -= number;
-  }
-
-
-  /**
-   * Contains user EOF-code, which will be executed exactly once,
-   * when the end of file is reached
-   */
-  private void yy_do_eof() {
-    if (!yy_eof_done) {
-      yy_eof_done = true;
-    	hasMore=false;
-
-    }
-  }
-
-
-  /**
-   * Resumes scanning until the next regular expression is matched,
-   * the end of input is encountered or an I/O-Error occurs.
-   *
-   * @return      the next token
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  public String primGetNextToken() throws java.io.IOException {
-    int yy_input;
-    int yy_action;
-
-
-    while (true) {
-
-      yychar+= yylength();
-
-      yy_atBOL = yy_markedPos <= 0 || yy_buffer[yy_markedPos-1] == '\n';
-      if (!yy_atBOL && yy_buffer[yy_markedPos-1] == '\r') {
-        yy_atBOL = yy_advance() != '\n';
-        if (!yy_atEOF) yy_currentPos--;
-      }
-
-      yy_action = -1;
-
-      yy_currentPos = yy_startRead = yy_markedPos;
-
-      if (yy_atBOL)
-        yy_state = YY_LEXSTATE[yy_lexical_state+1];
-      else
-        yy_state = YY_LEXSTATE[yy_lexical_state];
-
-
-      yy_forAction: {
-        while (true) {
-
-          yy_input = yy_advance();
-
-          if ( yy_input == YYEOF ) break yy_forAction;
-
-          yy_input = yycmap[yy_input];
-
-          boolean yy_isFinal = false;
-          boolean yy_noLookAhead = false;
-
-          yy_forNext: { switch (yy_state) {
-            case 0:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_state = 9; break yy_forNext;
-                case 2: yy_isFinal = true; yy_state = 10; break yy_forNext;
-                case 3: yy_isFinal = true; yy_state = 11; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 1:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_state = 9; break yy_forNext;
-                case 2: yy_isFinal = true; yy_state = 10; break yy_forNext;
-                case 3: yy_isFinal = true; yy_state = 11; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 12; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 13; break yy_forNext;
-                case 11: yy_isFinal = true; yy_state = 14; break yy_forNext;
-                case 16: yy_isFinal = true; yy_state = 15; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 2:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_state = 16; break yy_forNext;
-                case 12: yy_isFinal = true; yy_state = 17; break yy_forNext;
-                case 22: yy_isFinal = true; yy_state = 18; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 3:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 19; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 20; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 21; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 4:
-              switch (yy_input) {
-                case 6: 
-                case 7: yy_isFinal = true; yy_state = 23; break yy_forNext;
-                case 8: yy_isFinal = true; yy_state = 24; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 25; break yy_forNext;
-                case 31: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 32: yy_isFinal = true; yy_state = 27; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 22; break yy_forNext;
-              }
-
-            case 5:
-              switch (yy_input) {
-                case 7: 
-                case 8: 
-                case 11: 
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 30; break yy_forNext;
-                case 12: 
-                case 33: yy_isFinal = true; yy_state = 31; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 31: yy_isFinal = true; yy_state = 33; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 28; break yy_forNext;
-              }
-
-            case 6:
-              switch (yy_input) {
-                case 7: 
-                case 8: 
-                case 11: 
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 33: yy_isFinal = true; yy_state = 31; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 32: yy_isFinal = true; yy_state = 33; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 34; break yy_forNext;
-                case 34: yy_isFinal = true; yy_state = 35; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 28; break yy_forNext;
-              }
-
-            case 7:
-              switch (yy_input) {
-                case 11: 
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 33: yy_isFinal = true; yy_state = 31; break yy_forNext;
-                case 12: yy_isFinal = true; yy_state = 35; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 36; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 37; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 38; break yy_forNext;
-                case 31: 
-                case 32: yy_isFinal = true; yy_state = 39; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 28; break yy_forNext;
-              }
-
-            case 9:
-              switch (yy_input) {
-                case 2: yy_isFinal = true; yy_noLookAhead = true; yy_state = 40; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 10:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_noLookAhead = true; yy_state = 41; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 11:
-              switch (yy_input) {
-                case 4: yy_state = 42; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 12:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 43; break yy_forNext;
-                case 9: yy_state = 44; break yy_forNext;
-                case 11: yy_state = 45; break yy_forNext;
-                case 16: yy_state = 46; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 13:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 43; break yy_forNext;
-                case 11: yy_state = 45; break yy_forNext;
-                case 16: yy_state = 46; break yy_forNext;
-                case 9: yy_state = 47; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 14:
-              switch (yy_input) {
-                case 9: yy_state = 48; break yy_forNext;
-                case 12: yy_state = 49; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 15:
-              switch (yy_input) {
-                case 9: yy_state = 50; break yy_forNext;
-                case 17: yy_state = 51; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 16:
-              switch (yy_input) {
-                case 12: yy_state = 52; break yy_forNext;
-                case 22: yy_state = 53; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 17:
-              switch (yy_input) {
-                case 9: yy_state = 54; break yy_forNext;
-                case 29: yy_isFinal = true; yy_state = 55; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 18:
-              switch (yy_input) {
-                case 9: yy_state = 56; break yy_forNext;
-                case 24: yy_state = 57; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 19:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 19; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 58; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 20:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 19; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 21; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 21:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 59; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 23:
-              switch (yy_input) {
-                case 6: 
-                case 7: yy_isFinal = true; yy_state = 23; break yy_forNext;
-                case 8: yy_state = 60; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 61; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 22; break yy_forNext;
-              }
-
-            case 24:
-              switch (yy_input) {
-                case 6: 
-                case 7: yy_isFinal = true; yy_state = 23; break yy_forNext;
-                case 8: yy_state = 60; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 61; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 22; break yy_forNext;
-              }
-
-            case 25:
-              switch (yy_input) {
-                case 31: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 32: yy_isFinal = true; yy_state = 27; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 8: yy_state = 60; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 26:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 62; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 27:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 63; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 29:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 64; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 30:
-              switch (yy_input) {
-                case 7: 
-                case 8: 
-                case 11: 
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 31: yy_isFinal = true; yy_state = 33; break yy_forNext;
-                case 12: 
-                case 33: yy_state = 65; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 31:
-              switch (yy_input) {
-                case 29: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 9: yy_state = 66; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 32:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 67; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 33:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 68; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 34:
-              switch (yy_input) {
-                case 7: 
-                case 8: 
-                case 11: 
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 32: yy_isFinal = true; yy_state = 33; break yy_forNext;
-                case 33: yy_state = 65; break yy_forNext;
-                case 34: yy_state = 69; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 35:
-              switch (yy_input) {
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 9: yy_state = 70; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 36:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 71; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 37:
-              switch (yy_input) {
-                case 11: 
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 36; break yy_forNext;
-                case 30: yy_isFinal = true; yy_state = 38; break yy_forNext;
-                case 31: 
-                case 32: yy_isFinal = true; yy_state = 39; break yy_forNext;
-                case 33: yy_state = 65; break yy_forNext;
-                case 12: yy_state = 69; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 38:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 72; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 39:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 73; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 42:
-              switch (yy_input) {
-                case 5: yy_isFinal = true; yy_noLookAhead = true; yy_state = 74; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 43:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 43; break yy_forNext;
-                case 9: yy_state = 44; break yy_forNext;
-                case 11: yy_state = 45; break yy_forNext;
-                case 16: yy_state = 46; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 44:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 43; break yy_forNext;
-                case 11: yy_state = 45; break yy_forNext;
-                case 16: yy_state = 46; break yy_forNext;
-                case 9: yy_state = 47; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 45:
-              switch (yy_input) {
-                case 9: yy_state = 48; break yy_forNext;
-                case 12: yy_state = 49; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 46:
-              switch (yy_input) {
-                case 9: yy_state = 50; break yy_forNext;
-                case 17: yy_state = 51; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 47:
-              switch (yy_input) {
-                case 11: yy_state = 45; break yy_forNext;
-                case 16: yy_state = 46; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 48:
-              switch (yy_input) {
-                case 12: yy_state = 49; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 49:
-              switch (yy_input) {
-                case 9: yy_state = 75; break yy_forNext;
-                case 13: yy_state = 76; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 50:
-              switch (yy_input) {
-                case 17: yy_state = 51; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 51:
-              switch (yy_input) {
-                case 9: yy_state = 77; break yy_forNext;
-                case 18: yy_state = 78; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 52:
-              switch (yy_input) {
-                case 9: yy_state = 54; break yy_forNext;
-                case 29: yy_isFinal = true; yy_state = 55; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 53:
-              switch (yy_input) {
-                case 9: yy_state = 56; break yy_forNext;
-                case 24: yy_state = 57; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 54:
-              switch (yy_input) {
-                case 29: yy_isFinal = true; yy_state = 55; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 55:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 79; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 56:
-              switch (yy_input) {
-                case 24: yy_state = 57; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 57:
-              switch (yy_input) {
-                case 9: yy_state = 80; break yy_forNext;
-                case 17: yy_state = 81; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 58:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 19; break yy_forNext;
-                case 9: yy_state = 82; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 60:
-              switch (yy_input) {
-                case 6: 
-                case 7: yy_isFinal = true; yy_state = 23; break yy_forNext;
-                case 8: yy_state = 60; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 61; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 22; break yy_forNext;
-              }
-
-            case 61:
-              switch (yy_input) {
-                case 6: 
-                case 7: yy_isFinal = true; yy_state = 23; break yy_forNext;
-                case 8: yy_state = 60; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 83; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 22; break yy_forNext;
-              }
-
-            case 65:
-              switch (yy_input) {
-                case 29: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                case 9: yy_state = 66; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 66:
-              switch (yy_input) {
-                case 29: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 69:
-              switch (yy_input) {
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 9: yy_state = 70; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 70:
-              switch (yy_input) {
-                case 29: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 75:
-              switch (yy_input) {
-                case 13: yy_state = 76; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 76:
-              switch (yy_input) {
-                case 9: yy_state = 84; break yy_forNext;
-                case 14: yy_state = 85; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 77:
-              switch (yy_input) {
-                case 18: yy_state = 78; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 78:
-              switch (yy_input) {
-                case 9: yy_state = 86; break yy_forNext;
-                case 19: yy_state = 87; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 80:
-              switch (yy_input) {
-                case 17: yy_state = 81; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 81:
-              switch (yy_input) {
-                case 9: yy_state = 88; break yy_forNext;
-                case 25: yy_state = 89; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 82:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 19; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 83:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 60; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 84:
-              switch (yy_input) {
-                case 14: yy_state = 85; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 85:
-              switch (yy_input) {
-                case 9: yy_state = 90; break yy_forNext;
-                case 15: yy_state = 91; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 86:
-              switch (yy_input) {
-                case 19: yy_state = 87; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 87:
-              switch (yy_input) {
-                case 9: yy_state = 92; break yy_forNext;
-                case 20: yy_state = 93; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 88:
-              switch (yy_input) {
-                case 25: yy_state = 89; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 89:
-              switch (yy_input) {
-                case 9: yy_state = 94; break yy_forNext;
-                case 26: yy_state = 95; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 90:
-              switch (yy_input) {
-                case 15: yy_state = 91; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 91:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 96; break yy_forNext;
-                case 9: yy_state = 97; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 92:
-              switch (yy_input) {
-                case 20: yy_state = 93; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 93:
-              switch (yy_input) {
-                case 9: yy_state = 98; break yy_forNext;
-                case 21: yy_state = 99; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 94:
-              switch (yy_input) {
-                case 26: yy_state = 95; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 95:
-              switch (yy_input) {
-                case 9: yy_state = 100; break yy_forNext;
-                case 27: yy_state = 101; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 96:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 96; break yy_forNext;
-                case 9: yy_isFinal = true; yy_state = 102; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 97:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 96; break yy_forNext;
-                case 9: yy_state = 103; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 98:
-              switch (yy_input) {
-                case 21: yy_state = 99; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 99:
-              switch (yy_input) {
-                case 9: yy_state = 104; break yy_forNext;
-                case 22: yy_state = 105; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 100:
-              switch (yy_input) {
-                case 27: yy_state = 101; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 101:
-              switch (yy_input) {
-                case 9: yy_state = 106; break yy_forNext;
-                case 24: yy_state = 107; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 102:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 96; break yy_forNext;
-                case 9: yy_state = 103; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 103:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 96; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 104:
-              switch (yy_input) {
-                case 22: yy_state = 105; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 105:
-              switch (yy_input) {
-                case 9: yy_state = 108; break yy_forNext;
-                case 23: yy_isFinal = true; yy_state = 109; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 106:
-              switch (yy_input) {
-                case 24: yy_state = 107; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 107:
-              switch (yy_input) {
-                case 9: yy_state = 110; break yy_forNext;
-                case 28: yy_state = 111; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 108:
-              switch (yy_input) {
-                case 23: yy_isFinal = true; yy_state = 109; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 109:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 112; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 110:
-              switch (yy_input) {
-                case 28: yy_state = 111; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 111:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 111; break yy_forNext;
-                case 9: yy_state = 113; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 114; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 113:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 111; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 114; break yy_forNext;
-                case 9: yy_state = 115; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 114:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
-                case 9: yy_state = 117; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 115:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_state = 111; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 116:
-              switch (yy_input) {
-                case 9: yy_isFinal = true; yy_state = 114; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 117:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 8: yy_isFinal = true; yy_state = 116; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            default:
-              yy_ScanError(YY_ILLEGAL_STATE);
-              break;
-          } }
-
-          if ( yy_isFinal ) {
-            yy_action = yy_state; 
-            yy_markedPos = yy_currentPos; 
-            if ( yy_noLookAhead ) break yy_forAction;
-          }
-
-        }
-      }
-
-
-      switch (yy_action) {    
-
-        case 29: 
-        case 64: 
-          {  yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 119: break;
-        case 22: 
-        case 23: 
-        case 25: 
-        case 61: 
-        case 83: 
-          {  yypushback(yylength()); yybegin(UnDelimitedString); string.setLength(0); }
-        case 120: break;
-        case 21: 
-        case 59: 
-          {  yybegin(YYINITIAL);  hasMore = false; return CSSHeadTokenizerConstants.RuleEnd; }
-        case 121: break;
-        case 39: 
-        case 73: 
-          {  yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue; }
-        case 122: break;
-        case 109: 
-        case 112: 
-          { if (yychar == 0 )  {yybegin(CHARSET_RULE); return CSSHeadTokenizerConstants.CHARSET_RULE;} }
-        case 123: break;
-        case 96: 
-        case 102: 
-          { if (yychar == 0 ) {yybegin(ST_XMLDecl); return XMLHeadTokenizerConstants.XMLDeclStart;} }
-        case 124: break;
-        case 8: 
-        case 9: 
-        case 10: 
-        case 11: 
-        case 12: 
-        case 13: 
-        case 14: 
-        case 15: 
-        case 16: 
-        case 17: 
-        case 18: 
-        case 20: 
-        case 24: 
-        case 30: 
-        case 34: 
-        case 37: 
-          { if(yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;} }
-        case 125: break;
-        case 55: 
-        case 79: 
-          { yybegin(YYINITIAL);  return XMLHeadTokenizerConstants.XMLDeclEnd; }
-        case 126: break;
-        case 114: 
-        case 116: 
-          { pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding; }
-        case 127: break;
-        case 3: 
-        case 19: 
-        case 58: 
-          { pushCurrentState(); yybegin(QuotedAttributeValue); }
-        case 128: break;
-        case 40: 
-          { hasMore = false; return EncodingParserConstants.UTF16BE; }
-        case 129: break;
-        case 41: 
-          { hasMore = false; return EncodingParserConstants.UTF16LE; }
-        case 130: break;
-        case 74: 
-          { hasMore = false; return EncodingParserConstants.UTF83ByteBOM; }
-        case 131: break;
-        case 28: 
-        case 31: 
-        case 35: 
-          {  string.append( yytext() );  }
-        case 132: break;
-        case 27: 
-        case 63: 
-          {  yybegin(SQ_STRING); string.setLength(0);  }
-        case 133: break;
-        case 26: 
-        case 62: 
-          {  yybegin(DQ_STRING); string.setLength(0);  }
-        case 134: break;
-        case 32: 
-        case 67: 
-          {  yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;  }
-        case 135: break;
-        case 33: 
-        case 68: 
-          {  popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;  }
-        case 136: break;
-        case 36: 
-        case 71: 
-          {  yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue;  }
-        case 137: break;
-        case 38: 
-        case 72: 
-          {  yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue;  }
-        case 138: break;
-        default: 
-          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
-            yy_atEOF = true;
-            yy_do_eof();
-              { hasMore = false; return EncodingParserConstants.EOF; }
-          } 
-          else {
-            yy_ScanError(YY_NO_MATCH);
-          }
-      }
-    }
-  }    
-
-  /**
-   * Runs the scanner on input files.
-   *
-   * This main method is the debugging routine for the scanner.
-   * It prints each returned token to System.out until the end of
-   * file is reached, or an error occured.
-   *
-   * @param argv   the command line, contains the filenames to run
-   *               the scanner on.
-   */
-  public static void main(String argv[]) {
-    for (int i = 0; i < argv.length; i++) {
-      CSSHeadTokenizer scanner = null;
-      try {
-        scanner = new CSSHeadTokenizer( new java.io.FileReader(argv[i]) );
-      }
-      catch (java.io.FileNotFoundException e) {
-        System.out.println("File not found : \""+argv[i]+"\"");
-        System.exit(1);
-      }
-      catch (java.io.IOException e) {
-        System.out.println("Error opening file \""+argv[i]+"\"");
-        System.exit(1);
-      }
-      catch (ArrayIndexOutOfBoundsException e) {
-        System.out.println("Usage : java CSSHeadTokenizer <inputfile>");
-        System.exit(1);
-      }
-
-      try {
-        do {
-          System.out.println(scanner.primGetNextToken());
-        } while (!scanner.yy_atEOF);
-
-      }
-      catch (java.io.IOException e) {
-        System.out.println("An I/O error occured while scanning :");
-        System.out.println(e);
-        System.exit(1);
-      }
-      catch (Exception e) {
-        e.printStackTrace();
-        System.exit(1);
-      }
-    }
-  }
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizerGenJava.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizerGenJava.cmd
deleted file mode 100644
index 9ef06e9..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizerGenJava.cmd
+++ /dev/null
@@ -1,23 +0,0 @@
-@echo off

-

-rem The following variables need to be set/specified for each "development machine"

-set PATH=%PATH%;d:jdks\j2sdk1.4.1_02\bin

-set WORKSPACE_LOCATION=D:\builds\Workspaces\PureHeadWorkspace

-set JFLEX_LIB_LOCATION=D:\DevTimeSupport\JFlex\lib

-

-rem The following variables differ from project to project, but should be otherwise constant

-set MAIN_NAME=CSSHeadTokenizer

-set PROJECT_SRC=\org.eclipse.wst.common.encoding.contentspecific\src\

-set PACKAGE_DIR=com\ibm\encoding\resource\contentspecific\css\

-

-rem Given the above "framework" and the command themselves, these variables should never need to be modified

-set JAVA_FILE=%MAIN_NAME%.java

-set JFLEX_RULES=%MAIN_NAME%.jflex

-set SKELETON_FILE=%MAIN_NAME%.skeleton

-

-IF EXIST %JAVA_FILE% del %JAVA_FILE%

-rem java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\sed-jflex.jar;. JFlex.Main %JFLEX_RULES% -skel %SKELETON_FILE% 1>jflexout.txt 2>jflexerr.txt

-java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\sed-jflex.jar;. JFlex.Main %JFLEX_RULES%  1>jflexout.txt 2>jflexerr.txt

-IF EXIST %JAVA_FILE% copy %JAVA_FILE% %WORKSPACE_LOCATION%%PROJECT_SRC%%PACKAGE_DIR%%JAVA_FILE%

-

-rem pause

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/jflexerr.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/jflexerr.txt
deleted file mode 100644
index e69de29..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/jflexerr.txt
+++ /dev/null
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/jflexout.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/jflexout.txt
deleted file mode 100644
index e0743ca..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/jflexout.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Reading "CSSHeadTokenizer.jflex"
-Constructing NFA : 458 states in NFA
-Converting NFA to DFA : 
-........................................................................................
-102 states before minimization, 64 states in minimized DFA
-Writing code to "CSSHeadTokenizer.java"
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex
deleted file mode 100644
index fd5dc23..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex
+++ /dev/null
@@ -1,292 +0,0 @@
-/*******************************************************************************

- * Copyright (c) 2004, 2008 IBM Corporation and others.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- * 

- * Contributors:

- *     IBM Corporation - initial API and implementation

- *******************************************************************************/

-/*nlsXXX*/

-package org.eclipse.wst.html.core.internal.contenttype;

-import java.io.IOException;

-import java.io.Reader;

-

-import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;

-import org.eclipse.wst.xml.core.internal.contenttype.XMLHeadTokenizerConstants;

-

-

-

-%%

-

-%{

-

-

-	private boolean hasMore = true;

-	private final static int MAX_TO_SCAN = 8000;

-	StringBuffer string = new StringBuffer();

-	// state stack for easier state handling

-	private IntStack fStateStack = new IntStack();

-	private String valueText = null;

-	boolean foundContentTypeValue = false;

-

-

-

-	public HTMLHeadTokenizer() {

-		super();

-	}

-

-	  public void reset (Reader in) {

-	  	/* the input device */

-	  	yy_reader = in;

-

-  		/* the current state of the DFA */

-  		yy_state = 0;

-

-  		/* the current lexical state */

-  		yy_lexical_state = YYINITIAL;

-

-  		/* this buffer contains the current text to be matched and is

-  		 the source of the yytext() string */

-  		java.util.Arrays.fill(yy_buffer, (char)0);

-

-  		/* the textposition at the last accepting state */

-  		yy_markedPos = 0;

-

-  		/* the textposition at the last state to be included in yytext */

-  		yy_pushbackPos = 0;

-

-  		/* the current text position in the buffer */

-  		yy_currentPos = 0;

-

-  		/* startRead marks the beginning of the yytext() string in the buffer */

-  		yy_startRead = 0;

-

-  		/** 

-  		 * endRead marks the last character in the buffer, that has been read

-  		 * from input 

-  		 */

-  		yy_endRead = 0;

-

-  		/* number of newlines encountered up to the start of the matched text */

-  		yyline = 0;

-

-  		/* the number of characters up to the start of the matched text */

-  		yychar = 0;

-

-  		/**

-  		 * the number of characters from the last newline up to the start

-  		 * of the matched text

-  		 */

-  		yycolumn = 0; 

-

-  		/** 

-  		 * yy_atBOL == true <=> the scanner is currently at the beginning 

-  		 * of a line

-  		 */

-  		yy_atBOL = false;

-

-  		/* yy_atEOF == true <=> the scanner has returned a value for EOF */

-  		yy_atEOF = false;

-

-  		/* denotes if the user-EOF-code has already been executed */

-  		yy_eof_done = false;

-

-

-  		fStateStack.clear();

-  		

-  		hasMore = true;

-  		

-		// its a little wasteful to "throw away" first char array generated

-		// by class init (via auto generated code), but we really do want

-		// a small buffer for our head parsers.

-		if (yy_buffer.length != MAX_TO_SCAN) {

-			yy_buffer = new char[MAX_TO_SCAN];

-		}

-  		

-

-  	}

-

-

-	public final HeadParserToken getNextToken() throws IOException {

-		String context = null;

-		context = primGetNextToken();

-		HeadParserToken result = null;

-		if (valueText != null) {

-			result = createToken(context, yychar, valueText);

-			valueText = null;

-		} else {

-			result = createToken(context, yychar, yytext());

-		}

-		return result;

-	}

-

-	public final boolean hasMoreTokens() {

-		return hasMore && yychar < MAX_TO_SCAN;

-	}

-	private void pushCurrentState() {

-		fStateStack.push(yystate());

-

-	}

-

-	private void popState() {

-		yybegin(fStateStack.pop());

-	}

-	private HeadParserToken createToken(String context, int start, String text) {

-		return new HeadParserToken(context, start, text);

-	}

-	

-

-%}

-

-%eof{

-	hasMore=false;

-%eof}

-

-%public

-%class HTMLHeadTokenizer

-%function primGetNextToken

-%type String

-%char

-%unicode

-%ignorecase 

-//%debug

-%switch

-

-

-UTF16BE = \xFE\xFF

-UTF16LE = \xFF\xFE

-UTF83ByteBOM = \xEF\xBB\xBF

-

-SpaceChar = [\x20\x09]

-

-

-

-// [3] S ::= (0x20 | 0x9 | 0xD | 0xA)+

-S = [\x20\x09\x0D\x0A]

-

-// BeginAttribeValue = {S}* \= {S}*

-

-LineTerminator = \r|\n

-

-Z = (\x00)?

-S_UTF = {Z}{S}{Z}

-BeginAttributeValueUTF = {S_UTF}* \= {S_UTF}*

-

-%state ST_XMLDecl

-%state ST_META_TAG

-%state QuotedAttributeValue

-%state DQ_STRING

-%state SQ_STRING

-%state UnDelimitedString

-%state UnDelimitedCharset

-

-%%

-

-

-<YYINITIAL>  

-{

-	{UTF16BE}   		{hasMore = false; return EncodingParserConstants.UTF16BE;}

-	{UTF16LE}   		{hasMore = false; return EncodingParserConstants.UTF16LE;}

-	{UTF83ByteBOM}   	{hasMore = false; return EncodingParserConstants.UTF83ByteBOM;}

-

-	// force to be started on first line, but we do allow preceeding spaces

-	^ {S_UTF}* ({Z}<{Z}\?{Z}x{Z}m{Z}l{Z}){S_UTF}+ {if (yychar == 0 ) {yybegin(ST_XMLDecl); return XMLHeadTokenizerConstants.XMLDeclStart;}}

-	({Z}<{Z}M{Z}E{Z}T{Z}A{Z})       {yybegin(ST_META_TAG); return HTMLHeadTokenizerConstants.MetaTagStart;}

-	

-

-}	

-	

-<ST_XMLDecl> 

-{

-	//"version" {BeginAttribeValue} {pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDeclVersion;}

-	({Z}e{Z}n{Z}c{Z}o{Z}d{Z}i{Z}n{Z}g{Z}) {BeginAttributeValueUTF} {pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding;}

-	// note this "forced end" once end of XML Declaration found

-	({Z}\?{Z}>{Z})    {yybegin(YYINITIAL);  return XMLHeadTokenizerConstants.XMLDeclEnd;}

-}	

-

-<ST_META_TAG> 

-{

-

-//	"http-equiv" {S}* \= {S}* \"? "Content-Type" \"? {S}+ "content" {BeginAttribeValue}  {pushCurrentState(); yybegin(QuotedAttributeValue); foundContentTypeValue=true; return HTMLHeadTokenizerConstants.MetaTagContentType;}

-	{Z}h{Z}t{Z}t{Z}p{Z}-{Z}e{Z}q{Z}u{Z}i{Z}v{Z} {S_UTF}* \= {S_UTF}* {Z}\"?{Z} ({Z}C{Z}o{Z}n{Z}t{Z}e{Z}n{Z}t{Z}-{Z}T{Z}y{Z}p{Z}e{Z}) \"?{Z} ({S_UTF})+ ({Z}c{Z}o{Z}n{Z}t{Z}e{Z}n{Z}t{Z}) {BeginAttributeValueUTF}  {pushCurrentState(); yybegin(QuotedAttributeValue); foundContentTypeValue=true; return HTMLHeadTokenizerConstants.MetaTagContentType;}

-	{Z}>{Z}    { yybegin(YYINITIAL);  if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd;}

-	{Z}\/{Z}>{Z}    { yybegin(YYINITIAL); if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd;}

-}

-	

-

-<QuotedAttributeValue>

-{

-	{Z}\"{Z}            { yybegin(DQ_STRING); string.setLength(0); }

-	{Z}\'{Z}			{ yybegin(SQ_STRING); string.setLength(0); }

-	// in this state, anything other than a space character can start an undelimited string

-	{S_UTF}*.           { yypushback(1); yybegin(UnDelimitedString); string.setLength(0);}

-

-}	

-

-

-<DQ_STRING>

-{

-

-	{Z}\"{Z}                      { popState(); valueText = string.toString(); return EncodingParserConstants.StringValue; }

-  	{Z}{LineTerminator}{Z}        { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\?{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}<{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	

-	{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\/{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	[^\x00]			{ string.append( yytext() ); }

-

-

-}

-

-<SQ_STRING>

-{

-

-	{Z}\'{Z}                      { popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;}

-  	{Z}{LineTerminator}{Z}        { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}%{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}<{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\/{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	[^\x00]			{ string.append( yytext() ); }

-

-

-}

-

-<UnDelimitedString>

-{

-

-

-	// note this initial special case for HTTP contenttype values

-	// Look ahead and see if there are spaces, but don't append the spaces as they may be double-byte

-	// Let the next state handle removal of the \x00 and properly append spaces

-	";"/{S_UTF}*			{ pushCurrentState(); yybegin(UnDelimitedCharset); string.append( yytext() ); }

-	{S_UTF}                     { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue; }

-  	{Z}{LineTerminator}{Z}        { yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\?{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}<{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	// these are a bit special, since we started an undelimit string, but found a quote ... probably indicates a missing beginning quote

-	{Z}\'{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue;}

-	{Z}\"{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue;}

-	

-	{Z}>{Z}			{ yypushback(yylength());popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	{Z}\/{Z}>{Z}			{ yypushback(yylength()); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}

-	[^\x00]			{ string.append( yytext() ); }

-

-}

-

-<UnDelimitedCharset>

-{

-	{S} { string.append( yytext() ); }

-	// For non \x00 characters, let the previous state handle it

-	[^\x00] {yypushback(1); popState(); }

-}

-

-// The "match anything" rule should always be in effect except for when looking for end of string

-// (That is, remember to update state list if/when new states added)

-.|\n	{if(yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;}}

-

-// this rule always in effect

-<<EOF>>         {hasMore = false; return EncodingParserConstants.EOF;}

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.java
deleted file mode 100644
index 87d6c8f..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.java
+++ /dev/null
@@ -1,1206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-/* The following code was generated by JFlex 1.2.2 on 1/27/04 6:41 PM */
-
-/*nlsXXX*/
-package org.eclipse.wst.common.encoding.contentspecific.html;
-import java.io.IOException;
-import java.io.Reader;
-
-import org.eclipse.wst.common.encoding.contentspecific.EncodingParserConstants;
-import org.eclipse.wst.common.encoding.contentspecific.HeadParserToken;
-import org.eclipse.wst.common.encoding.contentspecific.IntStack;
-import org.eclipse.wst.common.encoding.contentspecific.xml.XMLHeadTokenizerConstants;
-
-
-
-
-/**
- * This class is a scanner generated by 
- * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 1/27/04 6:41 PM from the specification file
- * <tt>file:/D:/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jflex</tt>
- */
-public class HTMLHeadTokenizer {
-
-  /** this character denotes the end of file */
-  final public static int YYEOF = -1;
-
-  /** lexical states */
-  final public static int ST_META_TAG = 4;
-  final public static int YYINITIAL = 0;
-  final public static int UnDelimitedString = 12;
-  final public static int DQ_STRING = 8;
-  final public static int SQ_STRING = 10;
-  final public static int ST_XMLDecl = 2;
-  final public static int QuotedAttributeValue = 6;
-
-  /**
-   * YY_LEXSTATE[l] is the state in the DFA for the lexical state l
-   * YY_LEXSTATE[l+1] is the state in the DFA for the lexical state l
-   *                  at the beginning of a line
-   * l is of the form l = 2*k, k a non negative integer
-   */
-  private final static int YY_LEXSTATE[] = { 
-     0,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7, 7
-  };
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static String yycmap_packed = 
-    "\11\0\1\6\1\7\2\0\1\11\22\0\1\22\1\0\1\40\2\0"+
-    "\1\44\1\0\1\43\5\0\1\34\1\0\1\42\13\0\1\45\1\12"+
-    "\1\10\1\31\1\13\1\0\1\21\1\0\1\24\1\26\1\17\1\0"+
-    "\1\30\1\32\1\27\2\0\1\16\1\15\1\23\1\25\1\33\1\35"+
-    "\2\0\1\20\1\36\1\37\1\0\1\14\1\41\7\0\1\21\1\0"+
-    "\1\24\1\26\1\17\1\0\1\30\1\32\1\27\2\0\1\16\1\15"+
-    "\1\23\1\25\1\33\1\35\2\0\1\20\1\36\1\37\1\0\1\14"+
-    "\1\41\101\0\1\4\3\0\1\5\17\0\1\3\16\0\1\1\20\0"+
-    "\1\3\16\0\1\1\1\2\170\0\1\2\ufe87\0";
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);
-
-
-  /* error codes */
-  final private static int YY_UNKNOWN_ERROR = 0;
-  final private static int YY_ILLEGAL_STATE = 1;
-  final private static int YY_NO_MATCH = 2;
-  final private static int YY_PUSHBACK_2BIG = 3;
-
-  /* error messages for the codes above */
-  final private static String YY_ERROR_MSG[] = {
-    "Unkown internal scanner error",
-    "Internal error: unknown state",
-    "Error: could not match input",
-    "Error: pushback value was too large"
-  };
-
-  /** the input device */
-  private java.io.Reader yy_reader;
-
-  /** the current state of the DFA */
-  private int yy_state;
-
-  /** the current lexical state */
-  private int yy_lexical_state = YYINITIAL;
-
-  /** this buffer contains the current text to be matched and is
-      the source of the yytext() string */
-  private char yy_buffer[] = new char[16384];
-
-  /** the textposition at the last accepting state */
-  private int yy_markedPos;
-
-  /** the textposition at the last state to be included in yytext */
-  private int yy_pushbackPos;
-
-  /** the current text position in the buffer */
-  private int yy_currentPos;
-
-  /** startRead marks the beginning of the yytext() string in the buffer */
-  private int yy_startRead;
-
-  /** endRead marks the last character in the buffer, that has been read
-      from input */
-  private int yy_endRead;
-
-  /** number of newlines encountered up to the start of the matched text */
-  private int yyline;
-
-  /** the number of characters up to the start of the matched text */
-  private int yychar;
-
-  /**
-   * the number of characters from the last newline up to the start of the 
-   * matched text
-   */
-  private int yycolumn; 
-
-  /** 
-   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
-   */
-  private boolean yy_atBOL;
-
-  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
-  private boolean yy_atEOF;
-
-  /** denotes if the user-EOF-code has already been executed */
-  private boolean yy_eof_done;
-
-  /* user code: */
-
-
-	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 8000;
-	StringBuffer string = new StringBuffer();
-	// state stack for easier state handling
-	private IntStack fStateStack = new IntStack();
-	private String valueText = null;
-	boolean foundContentTypeValue = false;
-
-
-
-	public HTMLHeadTokenizer() {
-		super();
-	}
-
-	  public void reset (Reader in) {
-	  	/* the input device */
-	  	yy_reader = in;
-
-  		/* the current state of the DFA */
-  		yy_state = 0;
-
-  		/* the current lexical state */
-  		yy_lexical_state = YYINITIAL;
-
-  		/* this buffer contains the current text to be matched and is
-  		 the source of the yytext() string */
-  		java.util.Arrays.fill(yy_buffer, (char)0);
-
-  		/* the textposition at the last accepting state */
-  		yy_markedPos = 0;
-
-  		/* the textposition at the last state to be included in yytext */
-  		yy_pushbackPos = 0;
-
-  		/* the current text position in the buffer */
-  		yy_currentPos = 0;
-
-  		/* startRead marks the beginning of the yytext() string in the buffer */
-  		yy_startRead = 0;
-
-  		/** 
-  		 * endRead marks the last character in the buffer, that has been read
-  		 * from input 
-  		 */
-  		yy_endRead = 0;
-
-  		/* number of newlines encountered up to the start of the matched text */
-  		yyline = 0;
-
-  		/* the number of characters up to the start of the matched text */
-  		yychar = 0;
-
-  		/**
-  		 * the number of characters from the last newline up to the start
-  		 * of the matched text
-  		 */
-  		yycolumn = 0; 
-
-  		/** 
-  		 * yy_atBOL == true <=> the scanner is currently at the beginning 
-  		 * of a line
-  		 */
-  		yy_atBOL = false;
-
-  		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
-  		yy_atEOF = false;
-
-  		/* denotes if the user-EOF-code has already been executed */
-  		yy_eof_done = false;
-
-
-  		fStateStack.clear();
-  		
-  		hasMore = true;
-  		
-		// its a little wasteful to "throw away" first char array generated
-		// by class init (via auto generated code), but we really do want
-		// a small buffer for our head parsers.
-		if (yy_buffer.length != MAX_TO_SCAN) {
-			yy_buffer = new char[MAX_TO_SCAN];
-		}
-  		
-
-  	}
-
-
-	public final HeadParserToken getNextToken() throws IOException {
-		String context = null;
-		context = primGetNextToken();
-		HeadParserToken result = null;
-		if (valueText != null) {
-			result = createToken(context, yychar, valueText);
-			valueText = null;
-		} else {
-			result = createToken(context, yychar, yytext());
-		}
-		return result;
-	}
-
-	public final boolean hasMoreTokens() {
-		return hasMore && yychar < MAX_TO_SCAN;
-	}
-	private void pushCurrentState() {
-		fStateStack.push(yystate());
-
-	}
-
-	private void popState() {
-		yybegin(fStateStack.pop());
-	}
-	private HeadParserToken createToken(String context, int start, String text) {
-		return new HeadParserToken(context, start, text);
-	}
-	
-
-
-
-  /**
-   * Creates a new scanner
-   * There is also a java.io.InputStream version of this constructor.
-   *
-   * @param   in  the java.io.Reader to read input from.
-   */
-  public HTMLHeadTokenizer(java.io.Reader in) {
-    this.yy_reader = in;
-  }
-
-  /**
-   * Creates a new scanner.
-   * There is also java.io.Reader version of this constructor.
-   *
-   * @param   in  the java.io.Inputstream to read input from.
-   */
-  public HTMLHeadTokenizer(java.io.InputStream in) {
-    this(new java.io.InputStreamReader(in));
-  }
-
-  /** 
-   * Unpacks the compressed character translation table.
-   *
-   * @param packed   the packed character translation table
-   * @return         the unpacked character translation table
-   */
-  private static char [] yy_unpack_cmap(String packed) {
-    char [] map = new char[0x10000];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 174) {
-      int  count = packed.charAt(i++);
-      char value = packed.charAt(i++);
-      do map[j++] = value; while (--count > 0);
-    }
-    return map;
-  }
-
-
-  /**
-   * Gets the next input character.
-   *
-   * @return      the next character of the input stream, EOF if the
-   *              end of the stream is reached.
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  private int yy_advance() throws java.io.IOException {
-
-    /* standard case */
-    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];
-
-    /* if the eof is reached, we don't need to work hard */ 
-    if (yy_atEOF) return YYEOF;
-
-    /* otherwise: need to refill the buffer */
-
-    /* first: make room (if you can) */
-    if (yy_startRead > 0) {
-      System.arraycopy(yy_buffer, yy_startRead, 
-                       yy_buffer, 0, 
-                       yy_endRead-yy_startRead);
-
-      /* translate stored positions */
-      yy_endRead-= yy_startRead;
-      yy_currentPos-= yy_startRead;
-      yy_markedPos-= yy_startRead;
-      yy_pushbackPos-= yy_startRead;
-      yy_startRead = 0;
-    }
-
-    /* is the buffer big enough? */
-    if (yy_currentPos >= yy_buffer.length) {
-      /* if not: blow it up */
-      char newBuffer[] = new char[yy_currentPos*2];
-      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
-      yy_buffer = newBuffer;
-    }
-
-    /* finally: fill the buffer with new input */
-    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
-                                            yy_buffer.length-yy_endRead);
-
-    if ( numRead == -1 ) return YYEOF;
-
-    yy_endRead+= numRead;
-
-    return yy_buffer[yy_currentPos++];
-  }
-
-
-  /**
-   * Closes the input stream.
-   */
-  final public void yyclose() throws java.io.IOException {
-    yy_atEOF = true;            /* indicate end of file */
-    yy_endRead = yy_startRead;  /* invalidate buffer    */
-    yy_reader.close();
-  }
-
-
-  /**
-   * Returns the current lexical state.
-   */
-  final public int yystate() {
-    return yy_lexical_state;
-  }
-
-  /**
-   * Enters a new lexical state
-   *
-   * @param newState the new lexical state
-   */
-  final public void yybegin(int newState) {
-    yy_lexical_state = newState;
-  }
-
-
-  /**
-   * Returns the text matched by the current regular expression.
-   */
-  final public String yytext() {
-    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
-  }
-
-  /**
-   * Returns the length of the matched text region.
-   */
-  final public int yylength() {
-    return yy_markedPos-yy_startRead;
-  }
-
-
-  /**
-   * Reports an error that occured while scanning.
-   *
-   * @param   errorCode  the code of the errormessage to display
-   */
-  private void yy_ScanError(int errorCode) {
-    try {
-      System.out.println(YY_ERROR_MSG[errorCode]);
-    }
-    catch (ArrayIndexOutOfBoundsException e) {
-      System.out.println(YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
-    }
-
-    System.exit(1);
-  } 
-
-
-  /**
-   * Pushes the specified amount of characters back into the input stream.
-   *
-   * They will be read again by then next call of the scanning method
-   *
-   * @param number  the number of characters to be read again.
-   *                This number must not be greater than yylength()!
-   */
-  private void yypushback(int number) {
-    if ( number > yylength() )
-      yy_ScanError(YY_PUSHBACK_2BIG);
-
-    yy_markedPos -= number;
-  }
-
-
-  /**
-   * Contains user EOF-code, which will be executed exactly once,
-   * when the end of file is reached
-   */
-  private void yy_do_eof() {
-    if (!yy_eof_done) {
-      yy_eof_done = true;
-    	hasMore=false;
-
-    }
-  }
-
-
-  /**
-   * Resumes scanning until the next regular expression is matched,
-   * the end of input is encountered or an I/O-Error occurs.
-   *
-   * @return      the next token
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  public String primGetNextToken() throws java.io.IOException {
-    int yy_input;
-    int yy_action;
-
-
-    while (true) {
-
-      yychar+= yylength();
-
-      yy_atBOL = yy_markedPos <= 0 || yy_buffer[yy_markedPos-1] == '\n';
-      if (!yy_atBOL && yy_buffer[yy_markedPos-1] == '\r') {
-        yy_atBOL = yy_advance() != '\n';
-        if (!yy_atEOF) yy_currentPos--;
-      }
-
-      yy_action = -1;
-
-      yy_currentPos = yy_startRead = yy_markedPos;
-
-      if (yy_atBOL)
-        yy_state = YY_LEXSTATE[yy_lexical_state+1];
-      else
-        yy_state = YY_LEXSTATE[yy_lexical_state];
-
-
-      yy_forAction: {
-        while (true) {
-
-          yy_input = yy_advance();
-
-          if ( yy_input == YYEOF ) break yy_forAction;
-
-          yy_input = yycmap[yy_input];
-
-          boolean yy_isFinal = false;
-          boolean yy_noLookAhead = false;
-
-          yy_forNext: { switch (yy_state) {
-            case 0:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_state = 9; break yy_forNext;
-                case 2: yy_isFinal = true; yy_state = 10; break yy_forNext;
-                case 3: yy_isFinal = true; yy_state = 11; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 12; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 1:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_state = 9; break yy_forNext;
-                case 2: yy_isFinal = true; yy_state = 10; break yy_forNext;
-                case 3: yy_isFinal = true; yy_state = 11; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 13; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 14; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 2:
-              switch (yy_input) {
-                case 11: yy_isFinal = true; yy_state = 15; break yy_forNext;
-                case 15: yy_isFinal = true; yy_state = 16; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 3:
-              switch (yy_input) {
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 17; break yy_forNext;
-                case 26: yy_isFinal = true; yy_state = 18; break yy_forNext;
-                case 34: yy_isFinal = true; yy_state = 19; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 8; break yy_forNext;
-              }
-
-            case 4:
-              switch (yy_input) {
-                case 6: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 21; break yy_forNext;
-                case 7: yy_isFinal = true; yy_state = 22; break yy_forNext;
-                case 32: yy_isFinal = true; yy_noLookAhead = true; yy_state = 23; break yy_forNext;
-                case 35: yy_isFinal = true; yy_noLookAhead = true; yy_state = 24; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 20; break yy_forNext;
-              }
-
-            case 5:
-              switch (yy_input) {
-                case 7: 
-                case 9: 
-                case 10: 
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
-                case 11: 
-                case 34: yy_isFinal = true; yy_state = 27; break yy_forNext;
-                case 32: yy_isFinal = true; yy_noLookAhead = true; yy_state = 28; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
-              }
-
-            case 6:
-              switch (yy_input) {
-                case 7: 
-                case 9: 
-                case 10: 
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
-                case 34: yy_isFinal = true; yy_state = 27; break yy_forNext;
-                case 35: yy_isFinal = true; yy_noLookAhead = true; yy_state = 28; break yy_forNext;
-                case 36: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
-              }
-
-            case 7:
-              switch (yy_input) {
-                case 10: 
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 26; break yy_forNext;
-                case 34: yy_isFinal = true; yy_state = 27; break yy_forNext;
-                case 11: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_noLookAhead = true; yy_state = 30; break yy_forNext;
-                case 32: 
-                case 35: yy_isFinal = true; yy_noLookAhead = true; yy_state = 31; break yy_forNext;
-                case 37: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 25; break yy_forNext;
-              }
-
-            case 9:
-              switch (yy_input) {
-                case 2: yy_isFinal = true; yy_noLookAhead = true; yy_state = 33; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 10:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_noLookAhead = true; yy_state = 34; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 11:
-              switch (yy_input) {
-                case 4: yy_state = 35; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 12:
-              switch (yy_input) {
-                case 13: yy_state = 36; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 13:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 37; break yy_forNext;
-                case 10: yy_state = 38; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 14:
-              switch (yy_input) {
-                case 13: yy_state = 36; break yy_forNext;
-                case 11: yy_state = 39; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 15:
-              switch (yy_input) {
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 40; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 16:
-              switch (yy_input) {
-                case 19: yy_state = 41; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 18:
-              switch (yy_input) {
-                case 16: yy_state = 42; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 19:
-              switch (yy_input) {
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 43; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 21:
-              switch (yy_input) {
-                case 6: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 21; break yy_forNext;
-                case 7: yy_state = 44; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 20; break yy_forNext;
-              }
-
-            case 22:
-              switch (yy_input) {
-                case 6: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 21; break yy_forNext;
-                case 7: yy_state = 44; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 20; break yy_forNext;
-              }
-
-            case 27:
-              switch (yy_input) {
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 45; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 29:
-              switch (yy_input) {
-                case 25: yy_isFinal = true; yy_noLookAhead = true; yy_state = 46; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 32:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 32; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 35:
-              switch (yy_input) {
-                case 5: yy_isFinal = true; yy_noLookAhead = true; yy_state = 47; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 36:
-              switch (yy_input) {
-                case 15: yy_state = 48; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 37:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 37; break yy_forNext;
-                case 10: yy_state = 38; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 38:
-              switch (yy_input) {
-                case 11: yy_state = 39; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 39:
-              switch (yy_input) {
-                case 12: yy_state = 49; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 41:
-              switch (yy_input) {
-                case 20: yy_state = 50; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 42:
-              switch (yy_input) {
-                case 16: yy_state = 51; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 44:
-              switch (yy_input) {
-                case 6: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 21; break yy_forNext;
-                case 7: yy_state = 44; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 20; break yy_forNext;
-              }
-
-            case 48:
-              switch (yy_input) {
-                case 16: yy_state = 52; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 49:
-              switch (yy_input) {
-                case 13: yy_state = 53; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 50:
-              switch (yy_input) {
-                case 21: yy_state = 54; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 51:
-              switch (yy_input) {
-                case 27: yy_state = 55; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 52:
-              switch (yy_input) {
-                case 17: yy_state = 56; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 53:
-              switch (yy_input) {
-                case 14: yy_state = 57; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 54:
-              switch (yy_input) {
-                case 22: yy_state = 58; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 55:
-              switch (yy_input) {
-                case 28: yy_state = 59; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 56:
-              switch (yy_input) {
-                case 18: yy_isFinal = true; yy_noLookAhead = true; yy_state = 60; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 57:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 61; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 58:
-              switch (yy_input) {
-                case 23: yy_state = 62; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 59:
-              switch (yy_input) {
-                case 15: yy_state = 63; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 61:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 61; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 62:
-              switch (yy_input) {
-                case 19: yy_state = 64; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 63:
-              switch (yy_input) {
-                case 29: yy_state = 65; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 64:
-              switch (yy_input) {
-                case 24: yy_state = 66; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 65:
-              switch (yy_input) {
-                case 30: yy_state = 67; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 66:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 66; break yy_forNext;
-                case 8: yy_isFinal = true; yy_state = 68; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 67:
-              switch (yy_input) {
-                case 23: yy_state = 69; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 68:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 68; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 69:
-              switch (yy_input) {
-                case 31: yy_state = 70; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 70:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 70; break yy_forNext;
-                case 8: yy_state = 71; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 71:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 71; break yy_forNext;
-                case 20: yy_state = 72; break yy_forNext;
-                case 32: yy_state = 73; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 72:
-              switch (yy_input) {
-                case 21: yy_state = 74; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 73:
-              switch (yy_input) {
-                case 20: yy_state = 72; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 74:
-              switch (yy_input) {
-                case 19: yy_state = 75; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 75:
-              switch (yy_input) {
-                case 16: yy_state = 76; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 76:
-              switch (yy_input) {
-                case 15: yy_state = 77; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 77:
-              switch (yy_input) {
-                case 19: yy_state = 78; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 78:
-              switch (yy_input) {
-                case 16: yy_state = 79; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 79:
-              switch (yy_input) {
-                case 28: yy_state = 80; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 80:
-              switch (yy_input) {
-                case 16: yy_state = 81; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 81:
-              switch (yy_input) {
-                case 33: yy_state = 82; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 82:
-              switch (yy_input) {
-                case 27: yy_state = 83; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 83:
-              switch (yy_input) {
-                case 15: yy_state = 84; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 84:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 85; break yy_forNext;
-                case 32: yy_state = 86; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 85:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 85; break yy_forNext;
-                case 20: yy_state = 87; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 86:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 85; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 87:
-              switch (yy_input) {
-                case 21: yy_state = 88; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 88:
-              switch (yy_input) {
-                case 19: yy_state = 89; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 89:
-              switch (yy_input) {
-                case 16: yy_state = 90; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 90:
-              switch (yy_input) {
-                case 15: yy_state = 91; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 91:
-              switch (yy_input) {
-                case 19: yy_state = 92; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 92:
-              switch (yy_input) {
-                case 16: yy_state = 93; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 93:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_state = 93; break yy_forNext;
-                case 8: yy_isFinal = true; yy_state = 94; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 94:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: 
-                case 18: yy_isFinal = true; yy_state = 94; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            default:
-              yy_ScanError(YY_ILLEGAL_STATE);
-              break;
-          } }
-
-          if ( yy_isFinal ) {
-            yy_action = yy_state; 
-            yy_markedPos = yy_currentPos; 
-            if ( yy_noLookAhead ) break yy_forAction;
-          }
-
-        }
-      }
-
-
-      switch (yy_action) {    
-
-        case 26: 
-          {  yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 96: break;
-        case 20: 
-        case 21: 
-          {  yypushback(1); yybegin(UnDelimitedString); string.setLength(0); }
-        case 97: break;
-        case 17: 
-          {  yybegin(YYINITIAL);  if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd; }
-        case 98: break;
-        case 31: 
-          {  yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue; }
-        case 99: break;
-        case 43: 
-          {  yybegin(YYINITIAL); if (foundContentTypeValue) hasMore = false; return HTMLHeadTokenizerConstants.MetaTagEnd; }
-        case 100: break;
-        case 45: 
-          {  yypushback(2); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 101: break;
-        case 46: 
-          {  yypushback(2);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 102: break;
-        case 61: 
-          { if (yychar == 0 ) {yybegin(ST_XMLDecl); return XMLHeadTokenizerConstants.XMLDeclStart;} }
-        case 103: break;
-        case 8: 
-        case 9: 
-        case 10: 
-        case 11: 
-        case 12: 
-        case 13: 
-        case 14: 
-        case 15: 
-        case 16: 
-        case 18: 
-        case 19: 
-        case 22: 
-          { if (yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;} }
-        case 104: break;
-        case 60: 
-          { yybegin(ST_META_TAG); return HTMLHeadTokenizerConstants.MetaTagStart; }
-        case 105: break;
-        case 40: 
-          { yybegin(YYINITIAL);  return XMLHeadTokenizerConstants.XMLDeclEnd; }
-        case 106: break;
-        case 94: 
-          { pushCurrentState(); yybegin(QuotedAttributeValue); foundContentTypeValue=true; return HTMLHeadTokenizerConstants.MetaTagContentType; }
-        case 107: break;
-        case 68: 
-          { pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding; }
-        case 108: break;
-        case 33: 
-          { hasMore = false; return EncodingParserConstants.UTF16BE; }
-        case 109: break;
-        case 34: 
-          { hasMore = false; return EncodingParserConstants.UTF16LE; }
-        case 110: break;
-        case 47: 
-          { hasMore = false; return EncodingParserConstants.UTF83ByteBOM; }
-        case 111: break;
-        case 28: 
-          {  popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;  }
-        case 112: break;
-        case 25: 
-        case 27: 
-        case 29: 
-        case 32: 
-          {  string.append( yytext() );  }
-        case 113: break;
-        case 24: 
-          {  yybegin(SQ_STRING); string.setLength(0);  }
-        case 114: break;
-        case 23: 
-          {  yybegin(DQ_STRING); string.setLength(0);  }
-        case 115: break;
-        case 30: 
-          {  yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue;  }
-        case 116: break;
-        default: 
-          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
-            yy_atEOF = true;
-            yy_do_eof();
-              { hasMore = false; return EncodingParserConstants.EOF; }
-          } 
-          else {
-            yy_ScanError(YY_NO_MATCH);
-          }
-      }
-    }
-  }    
-
-  /**
-   * Runs the scanner on input files.
-   *
-   * This main method is the debugging routine for the scanner.
-   * It prints each returned token to System.out until the end of
-   * file is reached, or an error occured.
-   *
-   * @param argv   the command line, contains the filenames to run
-   *               the scanner on.
-   */
-  public static void main(String argv[]) {
-    for (int i = 0; i < argv.length; i++) {
-      HTMLHeadTokenizer scanner = null;
-      try {
-        scanner = new HTMLHeadTokenizer( new java.io.FileReader(argv[i]) );
-      }
-      catch (java.io.FileNotFoundException e) {
-        System.out.println("File not found : \""+argv[i]+"\"");
-        System.exit(1);
-      }
-      catch (java.io.IOException e) {
-        System.out.println("Error opening file \""+argv[i]+"\"");
-        System.exit(1);
-      }
-      catch (ArrayIndexOutOfBoundsException e) {
-        System.out.println("Usage : java HTMLHeadTokenizer <inputfile>");
-        System.exit(1);
-      }
-
-      try {
-        do {
-          System.out.println(scanner.primGetNextToken());
-        } while (!scanner.yy_atEOF);
-
-      }
-      catch (java.io.IOException e) {
-        System.out.println("An I/O error occured while scanning :");
-        System.out.println(e);
-        System.exit(1);
-      }
-      catch (Exception e) {
-        e.printStackTrace();
-        System.exit(1);
-      }
-    }
-  }
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizerGenJava.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizerGenJava.cmd
deleted file mode 100644
index 96f2325..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizerGenJava.cmd
+++ /dev/null
@@ -1,23 +0,0 @@
-@echo off

-

-rem The following variables need to be set/specified for each "development machine"

-set PATH=%PATH%;d:jdks\j2sdk1.4.1_02\bin

-set WORKSPACE_LOCATION=D:\builds\Workspaces\PureHeadWorkspace

-set JFLEX_LIB_LOCATION=D:\DevTimeSupport\JFlex\lib

-

-rem The following variables differ from project to project, but should be otherwise constant

-set MAIN_NAME=HTMLHeadTokenizer

-set PROJECT_SRC=\org.eclipse.wst.common.encoding.contentspecific\src\

-set PACKAGE_DIR=com\ibm\encoding\resource\contentspecific\html\

-

-rem Given the above "framework" and the command themselves, these variables should never need to be modified

-set JAVA_FILE=%MAIN_NAME%.java

-set JFLEX_RULES=%MAIN_NAME%.jflex

-set SKELETON_FILE=%MAIN_NAME%.skeleton

-

-IF EXIST %JAVA_FILE% del %JAVA_FILE%

-rem java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\sed-jflex.jar;. JFlex.Main %JFLEX_RULES% -skel %SKELETON_FILE% 1>jflexout.txt 2>jflexerr.txt

-java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\sed-jflex.jar;. JFlex.Main %JFLEX_RULES%  1>jflexout.txt 2>jflexerr.txt

-IF EXIST %JAVA_FILE% copy %JAVA_FILE% %WORKSPACE_LOCATION%%PROJECT_SRC%%PACKAGE_DIR%%JAVA_FILE%

-

-rem pause

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/jflexerr.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/jflexerr.txt
deleted file mode 100644
index e69de29..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/jflexerr.txt
+++ /dev/null
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/jflexout.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/jflexout.txt
deleted file mode 100644
index 1469e9c..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/jflexout.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Reading "HTMLHeadTokenizer.jflex"
-
-Warning : Macro "SpaceChar" has been declared but never used.
-Constructing NFA : 660 states in NFA
-Converting NFA to DFA : 
-.........................................................................................................................
-135 states before minimization, 95 states in minimized DFA
-Writing code to "HTMLHeadTokenizer.java"
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10Names.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10Names.jFlex
deleted file mode 100644
index d307389..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10Names.jFlex
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004,2008 IBM Corporation, and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     kb.huang  - Bug 214416  Dot char is not escaped in XML10Names.jFlex
- *******************************************************************************/
-/*nlsXXX*/
-package org.eclipse.wst.xml.core.internal.parser;
-
-
-
-%%
-
-%table
-%public
-%final
-%class XML10Names
-%function isValidXML10Name
-%type boolean
-%unicode
-%ignorecase
-%buffer 2048
-%apiprivate
-
-BaseChar = [\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4-\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7-\u04C8\u04CB-\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8-\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5-\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0E01-\u0E2E\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EAE\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102-\u1103\u1105-\u1107\u1109\u110B-\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154-\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D-\u116E\u1172-\u1173\u1175\u119E\u11A8\u11AB\u11AE-\u11AF\u11B7-\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u212A-\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3]
-
-Ideographic = [\u4E00-\u9FA5\u3007\u3021-\u3029]
-
-CombiningChar = [\u0300-\u0345\u0360-\u0361\u0483-\u0486\u0591-\u05A1\u05A3-\u05B9\u05BB-\u05BD\u05BF\u05C1-\u05C2\u05C4\u064B-\u0652\u0670\u06D6-\u06DC\u06DD-\u06DF\u06E0-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0901-\u0903\u093C\u093E-\u094C\u094D\u0951-\u0954\u0962-\u0963\u0981-\u0983\u09BC\u09BE\u09BF\u09C0-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09E2-\u09E3\u0A02\u0A3C\u0A3E\u0A3F\u0A40-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A70-\u0A71\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0B01-\u0B03\u0B3C\u0B3E-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B82-\u0B83\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C01-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C82-\u0C83\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86-\u0F8B\u0F90-\u0F95\u0F97\u0F99-\u0FAD\u0FB1-\u0FB7\u0FB9\u20D0-\u20DC\u20E1\u302A-\u302F\u3099\u309A]
-
-Digit =  [\u0030-\u0039\u0660-\u0669\u06F0-\u06F9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE7-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29]
-
-Extender = [\u00B7\u02D0\u02D1\u0387\u0640\u0E46\u0EC6\u3005\u3031-\u3035\u309D-\u309E\u30FC-\u30FE]
-
-Letter = ({BaseChar} | {Ideographic})
-
-NameChar = ({Letter} | {Digit} | "." | "-" | "_" | ":" | {CombiningChar} | {Extender})
-
-Name = ({Letter} | "_" | ":" ) ({NameChar})*
-
-
-
-%{
-        boolean result;
-        /**
-         * Creates a new scanner
-         */
-        public XML10Names() {
-                this.zzReader = null;
-        }
-
-        public boolean isValidXML10Name(String stringToCheck) {
-                boolean result = false;
-                yyreset(new java.io.StringReader(stringToCheck));
-                try {
-                        result = isValidXML10Name();
-                }
-                catch (java.io.IOException e) {
-                        // should be impossible with strings, but if occurs, just means
-                        // "not"
-                        result = false;
-                }
-                return result;
-        }
-
-%}
-
-
-
-
-%%
-
-<YYINITIAL>
-{
-
-        // name must be whole line (input), not partial
-        // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=214416
-        {Name}            {return true; /* exact name */}
-        {Name}.+          {return false; /* more than name */}
-
-        // match anything (else) should normally come last
-        .                 {return false; /* matched wild */}
-
-}
-
-
-// this rule always in effect
-<<EOF>>
-{
-        {return false; /* hit end with no match */}
-}
-
-
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10Names.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10Names.java
deleted file mode 100644
index fe91212..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10Names.java
+++ /dev/null
@@ -1,595 +0,0 @@
-/* The following code was generated by JFlex 1.4 on 2/25/08 10:25 AM */
-
-/*******************************************************************************
- * Copyright (c) 2004,2008 IBM Corporation, and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     kb.huang  - Bug 214416  Dot char is not escaped in XML10Names.jFlex
- *******************************************************************************/
-/*nlsXXX*/
-package org.eclipse.wst.xml.core.internal.parser;
-
-
-
-
-/**
- * This class is a scanner generated by 
- * <a href="http://www.jflex.de/">JFlex</a> 1.4
- * on 2/25/08 10:25 AM from the specification file
- * <tt>XML10Names.jflex</tt>
- */
-public final class XML10Names {
-
-  /** This character denotes the end of file */
-  private static final int YYEOF = -1;
-
-  /** initial size of the lookahead buffer */
-  private static final int ZZ_BUFFERSIZE = 2048;
-
-  /** lexical states */
-  private static final int YYINITIAL = 0;
-
-  /** 
-   * Translates characters to character classes
-   */
-  private static final String ZZ_CMAP_PACKED = 
-    "\12\0\1\3\42\0\1\2\1\2\1\0\12\2\1\1\6\0\32\1"+
-    "\4\0\1\1\1\0\32\1\74\0\1\2\10\0\27\1\1\0\37\1"+
-    "\1\0\72\1\2\0\13\1\2\0\10\1\1\0\65\1\1\0\104\1"+
-    "\11\0\44\1\3\0\2\1\4\0\36\1\70\0\131\1\22\0\7\1"+
-    "\16\0\2\2\56\0\106\2\32\0\2\2\44\0\1\1\1\2\3\1"+
-    "\1\0\1\1\1\0\24\1\1\0\54\1\1\0\7\1\3\0\1\1"+
-    "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\22\1\15\0\14\1"+
-    "\1\0\102\1\1\0\14\1\1\0\44\1\1\0\4\2\11\0\65\1"+
-    "\2\0\2\1\2\0\2\1\3\0\34\1\2\0\10\1\2\0\2\1"+
-    "\67\0\46\1\2\0\1\1\7\0\46\1\12\0\21\2\1\0\27\2"+
-    "\1\0\3\2\1\0\1\2\1\0\2\2\1\0\1\2\13\0\33\1"+
-    "\5\0\3\1\56\0\32\1\5\0\1\2\12\1\10\2\15\0\12\2"+
-    "\6\0\1\2\107\1\2\0\5\1\1\0\17\1\1\0\4\1\1\0"+
-    "\1\1\17\2\2\1\2\2\1\0\4\2\2\0\12\2\u0207\0\3\2"+
-    "\1\0\65\1\2\0\1\2\1\1\20\2\3\0\4\2\3\0\12\1"+
-    "\2\2\2\0\12\2\21\0\3\2\1\0\10\1\2\0\2\1\2\0"+
-    "\26\1\1\0\7\1\1\0\1\1\3\0\4\1\2\0\1\2\1\0"+
-    "\7\2\2\0\2\2\2\0\3\2\11\0\1\2\4\0\2\1\1\0"+
-    "\3\1\2\2\2\0\12\2\2\1\20\0\1\2\2\0\6\1\4\0"+
-    "\2\1\2\0\26\1\1\0\7\1\1\0\2\1\1\0\2\1\1\0"+
-    "\2\1\2\0\1\2\1\0\5\2\4\0\2\2\2\0\3\2\13\0"+
-    "\4\1\1\0\1\1\7\0\12\2\2\2\3\1\14\0\3\2\1\0"+
-    "\7\1\1\0\1\1\1\0\3\1\1\0\26\1\1\0\7\1\1\0"+
-    "\2\1\1\0\5\1\2\0\1\2\1\1\10\2\1\0\3\2\1\0"+
-    "\3\2\22\0\1\1\5\0\12\2\21\0\3\2\1\0\10\1\2\0"+
-    "\2\1\2\0\26\1\1\0\7\1\1\0\2\1\2\0\4\1\2\0"+
-    "\1\2\1\1\6\2\3\0\2\2\2\0\3\2\10\0\2\2\4\0"+
-    "\2\1\1\0\3\1\4\0\12\2\22\0\2\2\1\0\6\1\3\0"+
-    "\3\1\1\0\4\1\3\0\2\1\1\0\1\1\1\0\2\1\3\0"+
-    "\2\1\3\0\3\1\3\0\10\1\1\0\3\1\4\0\5\2\3\0"+
-    "\3\2\1\0\4\2\11\0\1\2\17\0\11\2\21\0\3\2\1\0"+
-    "\10\1\1\0\3\1\1\0\27\1\1\0\12\1\1\0\5\1\4\0"+
-    "\7\2\1\0\3\2\1\0\4\2\7\0\2\2\11\0\2\1\4\0"+
-    "\12\2\22\0\2\2\1\0\10\1\1\0\3\1\1\0\27\1\1\0"+
-    "\12\1\1\0\5\1\4\0\7\2\1\0\3\2\1\0\4\2\7\0"+
-    "\2\2\7\0\1\1\1\0\2\1\4\0\12\2\22\0\2\2\1\0"+
-    "\10\1\1\0\3\1\1\0\27\1\1\0\20\1\4\0\6\2\2\0"+
-    "\3\2\1\0\4\2\11\0\1\2\10\0\2\1\4\0\12\2\221\0"+
-    "\56\1\1\0\1\1\1\2\2\1\7\2\5\0\6\1\1\2\10\2"+
-    "\1\0\12\2\47\0\2\1\1\0\1\1\2\0\2\1\1\0\1\1"+
-    "\2\0\1\1\6\0\4\1\1\0\7\1\1\0\3\1\1\0\1\1"+
-    "\1\0\1\1\2\0\2\1\1\0\2\1\1\0\1\1\1\2\2\1"+
-    "\6\2\1\0\2\2\1\1\2\0\5\1\1\0\1\2\1\0\6\2"+
-    "\2\0\12\2\76\0\2\2\6\0\12\2\13\0\1\2\1\0\1\2"+
-    "\1\0\1\2\4\0\2\2\10\1\1\0\41\1\7\0\24\2\1\0"+
-    "\6\2\4\0\6\2\1\0\1\2\1\0\25\2\3\0\7\2\1\0"+
-    "\1\2\346\0\46\1\12\0\47\1\11\0\1\1\1\0\2\1\1\0"+
-    "\3\1\1\0\1\1\1\0\2\1\1\0\5\1\51\0\1\1\1\0"+
-    "\1\1\1\0\1\1\13\0\1\1\1\0\1\1\1\0\1\1\3\0"+
-    "\2\1\3\0\1\1\5\0\3\1\1\0\1\1\1\0\1\1\1\0"+
-    "\1\1\1\0\1\1\3\0\2\1\3\0\2\1\1\0\1\1\50\0"+
-    "\1\1\11\0\1\1\2\0\1\1\2\0\2\1\7\0\2\1\1\0"+
-    "\1\1\1\0\7\1\50\0\1\1\4\0\1\1\10\0\1\1\u0c06\0"+
-    "\234\1\4\0\132\1\6\0\26\1\2\0\6\1\2\0\46\1\2\0"+
-    "\6\1\2\0\10\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+
-    "\37\1\2\0\65\1\1\0\7\1\1\0\1\1\3\0\3\1\1\0"+
-    "\7\1\3\0\4\1\2\0\6\1\4\0\15\1\5\0\3\1\1\0"+
-    "\7\1\323\0\15\2\4\0\1\2\104\0\1\1\3\0\2\1\2\0"+
-    "\1\1\121\0\3\1\u0e82\0\1\2\1\0\1\1\31\0\11\1\6\2"+
-    "\1\0\5\2\13\0\124\1\4\0\2\2\2\0\2\2\2\0\132\1"+
-    "\1\0\3\2\6\0\50\1\u1cd3\0\u51a6\1\u0c5a\0\u2ba4\1\u285c\0";
-
-  /** 
-   * Translates characters to character classes
-   */
-  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
-
-  /** 
-   * Translates DFA states to action switch labels.
-   */
-  private static final int [] ZZ_ACTION = zzUnpackAction();
-
-  private static final String ZZ_ACTION_PACKED_0 =
-    "\1\0\1\1\1\2\1\3";
-
-  private static int [] zzUnpackAction() {
-    int [] result = new int[4];
-    int offset = 0;
-    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
-    return result;
-  }
-
-  private static int zzUnpackAction(String packed, int offset, int [] result) {
-    int i = 0;       /* index in packed string  */
-    int j = offset;  /* index in unpacked array */
-    int l = packed.length();
-    while (i < l) {
-      int count = packed.charAt(i++);
-      int value = packed.charAt(i++);
-      do result[j++] = value; while (--count > 0);
-    }
-    return j;
-  }
-
-
-  /** 
-   * Translates a state to a row index in the transition table
-   */
-  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
-
-  private static final String ZZ_ROWMAP_PACKED_0 =
-    "\0\0\0\4\0\10\0\14";
-
-  private static int [] zzUnpackRowMap() {
-    int [] result = new int[4];
-    int offset = 0;
-    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
-    return result;
-  }
-
-  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
-    int i = 0;  /* index in packed string  */
-    int j = offset;  /* index in unpacked array */
-    int l = packed.length();
-    while (i < l) {
-      int high = packed.charAt(i++) << 16;
-      result[j++] = high | packed.charAt(i++);
-    }
-    return j;
-  }
-
-  /** 
-   * The transition table of the DFA
-   */
-  private static final int ZZ_TRANS [] = {
-    1, 2, 1, -1, -1, -1, -1, -1, 3, 2, 
-    2, -1, 3, 3, 3, -1
-  };
-
-  /* error codes */
-  private static final int ZZ_UNKNOWN_ERROR = 0;
-  private static final int ZZ_NO_MATCH = 1;
-  private static final int ZZ_PUSHBACK_2BIG = 2;
-
-  /* error messages for the codes above */
-  private static final String ZZ_ERROR_MSG[] = {
-    "Unkown internal scanner error",
-    "Error: could not match input",
-    "Error: pushback value was too large"
-  };
-
-  /**
-   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
-   */
-  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
-
-  private static final String ZZ_ATTRIBUTE_PACKED_0 =
-    "\1\0\1\11\2\1";
-
-  private static int [] zzUnpackAttribute() {
-    int [] result = new int[4];
-    int offset = 0;
-    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
-    return result;
-  }
-
-  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
-    int i = 0;       /* index in packed string  */
-    int j = offset;  /* index in unpacked array */
-    int l = packed.length();
-    while (i < l) {
-      int count = packed.charAt(i++);
-      int value = packed.charAt(i++);
-      do result[j++] = value; while (--count > 0);
-    }
-    return j;
-  }
-
-  /** the input device */
-  private java.io.Reader zzReader;
-
-  /** the current state of the DFA */
-  private int zzState;
-
-  /** the current lexical state */
-  private int zzLexicalState = YYINITIAL;
-
-  /** this buffer contains the current text to be matched and is
-      the source of the yytext() string */
-  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
-
-  /** the textposition at the last accepting state */
-  private int zzMarkedPos;
-
-  /** the textposition at the last state to be included in yytext */
-  private int zzPushbackPos;
-
-  /** the current text position in the buffer */
-  private int zzCurrentPos;
-
-  /** startRead marks the beginning of the yytext() string in the buffer */
-  private int zzStartRead;
-
-  /** endRead marks the last character in the buffer, that has been read
-      from input */
-  private int zzEndRead;
-
-  /** number of newlines encountered up to the start of the matched text */
-  private int yyline;
-
-  /** the number of characters up to the start of the matched text */
-  private int yychar;
-
-  /**
-   * the number of characters from the last newline up to the start of the 
-   * matched text
-   */
-  private int yycolumn;
-
-  /** 
-   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
-   */
-  private boolean zzAtBOL = true;
-
-  /** zzAtEOF == true <=> the scanner is at the EOF */
-  private boolean zzAtEOF;
-
-  /* user code: */
-        boolean result;
-        /**
-         * Creates a new scanner
-         */
-        public XML10Names() {
-                this.zzReader = null;
-        }
-
-        public boolean isValidXML10Name(String stringToCheck) {
-                boolean result = false;
-                yyreset(new java.io.StringReader(stringToCheck));
-                try {
-                        result = isValidXML10Name();
-                }
-                catch (java.io.IOException e) {
-                        // should be impossible with strings, but if occurs, just means
-                        // "not"
-                        result = false;
-                }
-                return result;
-        }
-
-
-
-  /**
-   * Creates a new scanner
-   * There is also a java.io.InputStream version of this constructor.
-   *
-   * @param   in  the java.io.Reader to read input from.
-   */
-  public XML10Names(java.io.Reader in) {
-    this.zzReader = in;
-  }
-
-  /**
-   * Creates a new scanner.
-   * There is also java.io.Reader version of this constructor.
-   *
-   * @param   in  the java.io.Inputstream to read input from.
-   */
-  public XML10Names(java.io.InputStream in) {
-    this(new java.io.InputStreamReader(in));
-  }
-
-  /** 
-   * Unpacks the compressed character translation table.
-   *
-   * @param packed   the packed character translation table
-   * @return         the unpacked character translation table
-   */
-  private static char [] zzUnpackCMap(String packed) {
-    char [] map = new char[0x10000];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 1218) {
-      int  count = packed.charAt(i++);
-      char value = packed.charAt(i++);
-      do map[j++] = value; while (--count > 0);
-    }
-    return map;
-  }
-
-
-  /**
-   * Refills the input buffer.
-   *
-   * @return      <code>false</code>, iff there was new input.
-   * 
-   * @exception   java.io.IOException  if any I/O-Error occurs
-   */
-  private boolean zzRefill() throws java.io.IOException {
-
-    /* first: make room (if you can) */
-    if (zzStartRead > 0) {
-      System.arraycopy(zzBuffer, zzStartRead,
-                       zzBuffer, 0,
-                       zzEndRead-zzStartRead);
-
-      /* translate stored positions */
-      zzEndRead-= zzStartRead;
-      zzCurrentPos-= zzStartRead;
-      zzMarkedPos-= zzStartRead;
-      zzPushbackPos-= zzStartRead;
-      zzStartRead = 0;
-    }
-
-    /* is the buffer big enough? */
-    if (zzCurrentPos >= zzBuffer.length) {
-      /* if not: blow it up */
-      char newBuffer[] = new char[zzCurrentPos*2];
-      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
-      zzBuffer = newBuffer;
-    }
-
-    /* finally: fill the buffer with new input */
-    int numRead = zzReader.read(zzBuffer, zzEndRead,
-                                            zzBuffer.length-zzEndRead);
-
-    if (numRead < 0) {
-      return true;
-    }
-    else {
-      zzEndRead+= numRead;
-      return false;
-    }
-  }
-
-    
-  /**
-   * Closes the input stream.
-   */
-  private final void yyclose() throws java.io.IOException {
-    zzAtEOF = true;            /* indicate end of file */
-    zzEndRead = zzStartRead;  /* invalidate buffer    */
-
-    if (zzReader != null)
-      zzReader.close();
-  }
-
-
-  /**
-   * Resets the scanner to read from a new input stream.
-   * Does not close the old reader.
-   *
-   * All internal variables are reset, the old input stream 
-   * <b>cannot</b> be reused (internal buffer is discarded and lost).
-   * Lexical state is set to <tt>ZZ_INITIAL</tt>.
-   *
-   * @param reader   the new input stream 
-   */
-  private final void yyreset(java.io.Reader reader) {
-    zzReader = reader;
-    zzAtBOL  = true;
-    zzAtEOF  = false;
-    zzEndRead = zzStartRead = 0;
-    zzCurrentPos = zzMarkedPos = zzPushbackPos = 0;
-    yyline = yychar = yycolumn = 0;
-    zzLexicalState = YYINITIAL;
-  }
-
-
-  /**
-   * Returns the current lexical state.
-   */
-  private final int yystate() {
-    return zzLexicalState;
-  }
-
-
-  /**
-   * Enters a new lexical state
-   *
-   * @param newState the new lexical state
-   */
-  private final void yybegin(int newState) {
-    zzLexicalState = newState;
-  }
-
-
-  /**
-   * Returns the text matched by the current regular expression.
-   */
-  private final String yytext() {
-    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
-  }
-
-
-  /**
-   * Returns the character at position <tt>pos</tt> from the 
-   * matched text. 
-   * 
-   * It is equivalent to yytext().charAt(pos), but faster
-   *
-   * @param pos the position of the character to fetch. 
-   *            A value from 0 to yylength()-1.
-   *
-   * @return the character at position pos
-   */
-  private final char yycharat(int pos) {
-    return zzBuffer[zzStartRead+pos];
-  }
-
-
-  /**
-   * Returns the length of the matched text region.
-   */
-  private final int yylength() {
-    return zzMarkedPos-zzStartRead;
-  }
-
-
-  /**
-   * Reports an error that occured while scanning.
-   *
-   * In a wellformed scanner (no or only correct usage of 
-   * yypushback(int) and a match-all fallback rule) this method 
-   * will only be called with things that "Can't Possibly Happen".
-   * If this method is called, something is seriously wrong
-   * (e.g. a JFlex bug producing a faulty scanner etc.).
-   *
-   * Usual syntax/scanner level error handling should be done
-   * in error fallback rules.
-   *
-   * @param   errorCode  the code of the errormessage to display
-   */
-  private void zzScanError(int errorCode) {
-    String message;
-    try {
-      message = ZZ_ERROR_MSG[errorCode];
-    }
-    catch (ArrayIndexOutOfBoundsException e) {
-      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
-    }
-
-    throw new Error(message);
-  } 
-
-
-  /**
-   * Pushes the specified amount of characters back into the input stream.
-   *
-   * They will be read again by then next call of the scanning method
-   *
-   * @param number  the number of characters to be read again.
-   *                This number must not be greater than yylength()!
-   */
-  private void yypushback(int number)  {
-    if ( number > yylength() )
-      zzScanError(ZZ_PUSHBACK_2BIG);
-
-    zzMarkedPos -= number;
-  }
-
-
-  /**
-   * Resumes scanning until the next regular expression is matched,
-   * the end of input is encountered or an I/O-Error occurs.
-   *
-   * @return      the next token
-   * @exception   java.io.IOException  if any I/O-Error occurs
-   */
-  private boolean isValidXML10Name() throws java.io.IOException {
-    int zzInput;
-    int zzAction;
-
-    // cached fields:
-    int zzCurrentPosL;
-    int zzMarkedPosL;
-    int zzEndReadL = zzEndRead;
-    char [] zzBufferL = zzBuffer;
-    char [] zzCMapL = ZZ_CMAP;
-
-    int [] zzTransL = ZZ_TRANS;
-    int [] zzRowMapL = ZZ_ROWMAP;
-    int [] zzAttrL = ZZ_ATTRIBUTE;
-
-    while (true) {
-      zzMarkedPosL = zzMarkedPos;
-
-      zzAction = -1;
-
-      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
-  
-      zzState = zzLexicalState;
-
-
-      zzForAction: {
-        while (true) {
-    
-          if (zzCurrentPosL < zzEndReadL)
-            zzInput = zzBufferL[zzCurrentPosL++];
-          else if (zzAtEOF) {
-            zzInput = YYEOF;
-            break zzForAction;
-          }
-          else {
-            // store back cached positions
-            zzCurrentPos  = zzCurrentPosL;
-            zzMarkedPos   = zzMarkedPosL;
-            boolean eof = zzRefill();
-            // get translated positions and possibly new buffer
-            zzCurrentPosL  = zzCurrentPos;
-            zzMarkedPosL   = zzMarkedPos;
-            zzBufferL      = zzBuffer;
-            zzEndReadL     = zzEndRead;
-            if (eof) {
-              zzInput = YYEOF;
-              break zzForAction;
-            }
-            else {
-              zzInput = zzBufferL[zzCurrentPosL++];
-            }
-          }
-          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
-          if (zzNext == -1) break zzForAction;
-          zzState = zzNext;
-
-          int zzAttributes = zzAttrL[zzState];
-          if ( (zzAttributes & 1) == 1 ) {
-            zzAction = zzState;
-            zzMarkedPosL = zzCurrentPosL;
-            if ( (zzAttributes & 8) == 8 ) break zzForAction;
-          }
-
-        }
-      }
-
-      // store back cached position
-      zzMarkedPos = zzMarkedPosL;
-
-      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
-        case 1: 
-          { return false; /* matched wild */
-          }
-        case 4: break;
-        case 2: 
-          { return true; /* exact name */
-          }
-        case 5: break;
-        case 3: 
-          { return false; /* more than name */
-          }
-        case 6: break;
-        default: 
-          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
-            zzAtEOF = true;
-              { {return false; /* hit end with no match */} }
-          } 
-          else {
-            zzScanError(ZZ_NO_MATCH);
-          }
-      }
-    }
-  }
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10NamesGenJavaJFlex14.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10NamesGenJavaJFlex14.cmd
deleted file mode 100644
index 7c816d0..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/XML10NamesGenJavaJFlex14.cmd
+++ /dev/null
@@ -1,25 +0,0 @@
-@echo on

-

-rem The following variables need to be set/specified for each "development machine"

-set PATH=%PATH%;D:\JDKs\ibm-java2-sdk-50-win-i386\bin

-set WORKSPACE_LOCATION=D:\builds\Workspaces\newWTPpurehead

-set JFLEX_LIB_LOCATION=D:\DevTimeSupport\JFlex-1.4\lib

-

-rem The following variables differ from project to project, but should be otherwise constant

-set MAIN_NAME=XML10Names

-

-set PROJECT_SRC=\org.eclipse.wst.xml.core\src\

-set PACKAGE_DIR=org\eclipse\wst\xml\core\internal\parser\

-

-

-rem Given the above "framework" and the command themselves, these variables should never need to be modified

-set JAVA_FILE=%MAIN_NAME%.java

-set JFLEX_RULES=%MAIN_NAME%.jflex

-set SKELETON_FILE=%MAIN_NAME%.skeleton

-

-IF EXIST %JAVA_FILE% del %JAVA_FILE%

-rem java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\Jflex.jar;. JFlex.Main %JFLEX_RULES% -skel %SKELETON_FILE% 1>jflexout.txt 2>jflexerr.txt

-java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\Jflex.jar;. JFlex.Main %JFLEX_RULES%  1>jflexout.txt 2>jflexerr.txt

-IF EXIST %JAVA_FILE% copy %JAVA_FILE% %WORKSPACE_LOCATION%%PROJECT_SRC%%PACKAGE_DIR%%JAVA_FILE%

-

-pause

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/jflexerr.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/jflexerr.txt
deleted file mode 100644
index e69de29..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/jflexerr.txt
+++ /dev/null
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/jflexout.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/jflexout.txt
deleted file mode 100644
index c336f12..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XML10Names/jflexout.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Reading "XML10Names.jflex"
-Constructing NFA : 84 states in NFA
-Converting NFA to DFA : 
-............
-14 states before minimization, 4 states in minimized DFA
-Writing code to "XML10Names.java"
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jFlex
deleted file mode 100644
index d6fe899..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jFlex
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*nlsXXX*/
-package org.eclipse.wst.common.encoding.contentspecific.xml;
-import java.io.IOException;
-import java.io.Reader;
-
-import org.eclipse.wst.common.encoding.contentspecific.EncodingParserConstants;
-import org.eclipse.wst.common.encoding.contentspecific.HeadParserToken;
-import org.eclipse.wst.common.encoding.contentspecific.IntStack;
-import org.eclipse.wst.common.encoding.contentspecific.xml.XMLHeadTokenizerConstants;
-
-
-
-
-%%
-
-%{
-
-
-	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 8000;
-	StringBuffer string = new StringBuffer();
-	// state stack for easier state handling
-	private IntStack fStateStack = new IntStack();
-	private String valueText = null;
-
-
-	public XMLHeadTokenizer() {
-		super();
-	}
-
-	  public void reset (Reader in) {
-                /* the input device */
-                zzReader = in;
-
-                /* the current state of the DFA */
-                zzState = 0;
-
-                /* the current lexical state */
-                zzLexicalState = YYINITIAL;
-
-                /* this buffer contains the current text to be matched and is
-                 the source of the yytext() string */
-                java.util.Arrays.fill(zzBuffer, (char)0);
-
-                /* the textposition at the last accepting state */
-                zzMarkedPos = 0;
-
-                /* the textposition at the last state to be included in yytext */
-                zzPushbackPos = 0;
-
-                /* the current text position in the buffer */
-                zzCurrentPos = 0;
-
-                /* startRead marks the beginning of the yytext() string in the buffer */
-                zzStartRead = 0;
-
-                /**
-                 * endRead marks the last character in the buffer, that has been read
-                 * from input
-                 */
-                zzEndRead = 0;
-
-                /* number of newlines encountered up to the start of the matched text */
-                yyline = 0;
-
-                /* the number of characters up to the start of the matched text */
-                yychar = 0;
-
-                /**
-                 * the number of characters from the last newline up to the start
-                 * of the matched text
-                 */
-                yycolumn = 0;
-
-                /**
-                 * yy_atBOL == true <=> the scanner is currently at the beginning
-                 * of a line
-                 */
-                zzAtBOL = true;
-
-                /* yy_atEOF == true <=> the scanner has returned a value for EOF */
-                zzAtEOF = false;
-
-                /* denotes if the user-EOF-code has already been executed */
-                zzEOFDone = false;
-
-
-                fStateStack.clear();
-
-                hasMore = true;
-  		
-  	}
-
-
-	public final HeadParserToken getNextToken() throws IOException {
-		String context = null;
-		context = primGetNextToken();
-		HeadParserToken result = null;
-		if (valueText != null) {
-			result = createToken(context, yychar, valueText);
-			valueText = null;
-		} else {
-			result = createToken(context, yychar, yytext());
-		}
-		return result;
-	}
-
-	public final boolean hasMoreTokens() {
-		return hasMore && yychar < MAX_TO_SCAN;
-	}
-	private void pushCurrentState() {
-		fStateStack.push(yystate());
-
-	}
-
-	private void popState() {
-		yybegin(fStateStack.pop());
-	}
-	
-	private HeadParserToken createToken(String context, int start, String text) {
-		return new HeadParserToken(context, start, text);
-	}	
-
-%}
-
-%eof{
-	hasMore=false;
-%eof}
-
-%public
-%class XMLHeadTokenizer
-%function primGetNextToken
-%type String
-%char
-%unicode
-%ignorecase 
-//%debug
-%switch
-%buffer 8192
-
-UTF16BE = \xFE\xFF
-UTF16LE = \xFF\xFE
-UTF83ByteBOM = \xEF\xBB\xBF
-
-SpaceChar = [\x20\x09]
-
-// [3] S ::= (0x20 | 0x9 | 0xD | 0xA)+
-S = [\x20\x09\x0D\x0A]
-
-BeginAttribeValue = {S}* \= {S}*
-
-LineTerminator = \r|\n
-
-
-%state ST_XMLDecl
-%state QuotedAttributeValue
-%state DQ_STRING
-%state SQ_STRING
-%state UnDelimitedString
-
-%%
-
-
-<YYINITIAL>  
-{
-	// force to start at beginning of line (^) and at beginning of file (yychar == 0)
-	^{UTF16BE}   		{if (yychar == 0 ) {hasMore = false; return EncodingParserConstants.UTF16BE;}}
-	^{UTF16LE}   		{if (yychar == 0 ) {hasMore = false; return EncodingParserConstants.UTF16LE;}}
-	^{UTF83ByteBOM}   	{if (yychar == 0 ) {hasMore = false; return EncodingParserConstants.UTF83ByteBOM;}}
-	
-	// force to be started on first line, but we do allow preceeding spaces
-	^ {S}* "<\?xml" {S}+ {if (yychar == 0 ) {yybegin(ST_XMLDecl); return XMLHeadTokenizerConstants.XMLDeclStart;}}
-	
-}	
-	
-<ST_XMLDecl> 
-{
-	"version" {BeginAttribeValue} {pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDeclVersion;}
-	"encoding" {BeginAttribeValue} {pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding;}
-	// note the "forced end" (via 'hasMore=false') once the end of XML Declaration found
-	// This is since non-ascii chars may follow and may cause IOExceptions which would not occur once stream is 
-	// read with incorrect encoding (such as if platform encoding is in effect until true encoding detected). 
-	"\?>"    {yybegin(YYINITIAL); hasMore = false; return XMLHeadTokenizerConstants.XMLDeclEnd;}
-}	
-
-	
-
-<QuotedAttributeValue>
-{
-	\"                      { yybegin(DQ_STRING); string.setLength(0); }
-	\'			{ yybegin(SQ_STRING); string.setLength(0); }
-	// in this state, anything other than a space character can start an undelimited string
-	{S}*.           { yypushback(1); yybegin(UnDelimitedString); string.setLength(0);}
-
-}	
-
-
-<DQ_STRING>
-{
-
-	\"                      { popState(); valueText = string.toString(); return EncodingParserConstants.StringValue; }
-  	{LineTerminator}        { yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	"\?>"			{ yypushback(2); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	'<'			{ yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	.			{ string.append( yytext() ); }
-
-
-}
-
-<SQ_STRING>
-{
-
-	\'                      { popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;}
-  	{LineTerminator}        { yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	"%>"			{ yypushback(2);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	'<'			{ yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	.			{ string.append( yytext() ); }
-
-
-}
-
-<UnDelimitedString>
-{
-
-	{S}                     { yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue; }
-  	{LineTerminator}        { yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	"\?>"			{ yypushback(2);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	'<'	
-	{ yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue;}
-	// these are a bit special, since we started an undelimit string, but found a quote ... probably indicates a missing beginning quote
-	\'			{ yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue;}
-	
-	\"			{ yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue;}
-	
-	.			{ string.append( yytext() ); }
-
-}
-
-// The "match anything" rule should always be in effect except for when looking for end of string
-// (That is, remember to update state list if/when new states added)
-<YYINITIAL, ST_XMLDecl, QuotedAttributeValue>
-{
-// this is the fallback (match "anything") rule  (for this scanner, input is ignored, and position advanced, if not recognized)
-.|\n              {if (yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;}}
-}
-
-// this rule always in effect
-<<EOF>>         {hasMore = false; return EncodingParserConstants.EOF;}
-
-	
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.java
deleted file mode 100644
index b353067..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.java
+++ /dev/null
@@ -1,905 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-/* The following code was generated by JFlex 1.2.2 on 4/6/04 11:13 PM */
-
-/*nlsXXX*/
-package org.eclipse.wst.common.encoding.contentspecific.xml;
-import java.io.IOException;
-import java.io.Reader;
-
-import org.eclipse.wst.common.encoding.contentspecific.EncodingParserConstants;
-import org.eclipse.wst.common.encoding.contentspecific.HeadParserToken;
-import org.eclipse.wst.common.encoding.contentspecific.IntStack;
-import org.eclipse.wst.common.encoding.contentspecific.xml.XMLHeadTokenizerConstants;
-
-
-
-
-
-/**
- * This class is a scanner generated by 
- * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 4/6/04 11:13 PM from the specification file
- * <tt>file:/D:/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jflex</tt>
- */
-public class XMLHeadTokenizer {
-
-  /** this character denotes the end of file */
-  final public static int YYEOF = -1;
-
-  /** lexical states */
-  final public static int YYINITIAL = 0;
-  final public static int UnDelimitedString = 10;
-  final public static int DQ_STRING = 6;
-  final public static int SQ_STRING = 8;
-  final public static int ST_XMLDecl = 2;
-  final public static int QuotedAttributeValue = 4;
-
-  /**
-   * YY_LEXSTATE[l] is the state in the DFA for the lexical state l
-   * YY_LEXSTATE[l+1] is the state in the DFA for the lexical state l
-   *                  at the beginning of a line
-   * l is of the form l = 2*k, k a non negative integer
-   */
-  private final static int YY_LEXSTATE[] = { 
-     0,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6, 6
-  };
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static String yycmap_packed = 
-    "\11\0\1\6\1\7\2\0\1\11\22\0\1\6\1\0\1\27\2\0"+
-    "\1\31\1\0\1\30\24\0\1\12\1\10\1\26\1\13\3\0\1\21"+
-    "\1\23\1\17\1\0\1\25\1\0\1\24\2\0\1\16\1\15\1\20"+
-    "\1\22\10\0\1\14\12\0\1\21\1\23\1\17\1\0\1\25\1\0"+
-    "\1\24\2\0\1\16\1\15\1\20\1\22\10\0\1\14\102\0\1\4"+
-    "\3\0\1\5\17\0\1\3\16\0\1\1\20\0\1\3\16\0\1\1"+
-    "\1\2\170\0\1\2\ufe87\0";
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);
-
-
-  /* error codes */
-  final private static int YY_UNKNOWN_ERROR = 0;
-  final private static int YY_ILLEGAL_STATE = 1;
-  final private static int YY_NO_MATCH = 2;
-  final private static int YY_PUSHBACK_2BIG = 3;
-
-  /* error messages for the codes above */
-  final private static String YY_ERROR_MSG[] = {
-    "Unkown internal scanner error",
-    "Internal error: unknown state",
-    "Error: could not match input",
-    "Error: pushback value was too large"
-  };
-
-  /** the input device */
-  private java.io.Reader yy_reader;
-
-  /** the current state of the DFA */
-  private int yy_state;
-
-  /** the current lexical state */
-  private int yy_lexical_state = YYINITIAL;
-
-  /** this buffer contains the current text to be matched and is
-      the source of the yytext() string */
-  private char yy_buffer[] = new char[16384];
-
-  /** the textposition at the last accepting state */
-  private int yy_markedPos;
-
-  /** the textposition at the last state to be included in yytext */
-  private int yy_pushbackPos;
-
-  /** the current text position in the buffer */
-  private int yy_currentPos;
-
-  /** startRead marks the beginning of the yytext() string in the buffer */
-  private int yy_startRead;
-
-  /** endRead marks the last character in the buffer, that has been read
-      from input */
-  private int yy_endRead;
-
-  /** number of newlines encountered up to the start of the matched text */
-  private int yyline;
-
-  /** the number of characters up to the start of the matched text */
-  private int yychar;
-
-  /**
-   * the number of characters from the last newline up to the start of the 
-   * matched text
-   */
-  private int yycolumn; 
-
-  /** 
-   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
-   */
-  private boolean yy_atBOL;
-
-  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
-  private boolean yy_atEOF;
-
-  /** denotes if the user-EOF-code has already been executed */
-  private boolean yy_eof_done;
-
-  /* user code: */
-
-
-	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 8000;
-	StringBuffer string = new StringBuffer();
-	// state stack for easier state handling
-	private IntStack fStateStack = new IntStack();
-	private String valueText = null;
-
-
-	public XMLHeadTokenizer() {
-		super();
-	}
-
-	  public void reset (Reader in) {
-	  	/* the input device */
-	  	yy_reader = in;
-
-  		/* the current state of the DFA */
-  		yy_state = 0;
-
-  		/* the current lexical state */
-  		yy_lexical_state = YYINITIAL;
-
-  		/* this buffer contains the current text to be matched and is
-  		 the source of the yytext() string */
-  		java.util.Arrays.fill(yy_buffer, (char)0);
-
-  		/* the textposition at the last accepting state */
-  		yy_markedPos = 0;
-
-  		/* the textposition at the last state to be included in yytext */
-  		yy_pushbackPos = 0;
-
-  		/* the current text position in the buffer */
-  		yy_currentPos = 0;
-
-  		/* startRead marks the beginning of the yytext() string in the buffer */
-  		yy_startRead = 0;
-
-  		/** 
-  		 * endRead marks the last character in the buffer, that has been read
-  		 * from input 
-  		 */
-  		yy_endRead = 0;
-
-  		/* number of newlines encountered up to the start of the matched text */
-  		yyline = 0;
-
-  		/* the number of characters up to the start of the matched text */
-  		yychar = 0;
-
-  		/**
-  		 * the number of characters from the last newline up to the start
-  		 * of the matched text
-  		 */
-  		yycolumn = 0; 
-
-  		/** 
-  		 * yy_atBOL == true <=> the scanner is currently at the beginning 
-  		 * of a line
-  		 */
-  		yy_atBOL = false;
-
-  		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
-  		yy_atEOF = false;
-
-  		/* denotes if the user-EOF-code has already been executed */
-  		yy_eof_done = false;
-
-
-  		fStateStack.clear();
-  		
-  		hasMore = true;
-  		
-  		// its a little wasteful to "throw away" first char array generated
-  		// by class init (via auto generated code), but we really do want 
-  		// a small buffer for our head parsers. 
-  		if (yy_buffer.length != MAX_TO_SCAN) {
-  			yy_buffer = new char[MAX_TO_SCAN];
-  		}
-
-
-  	}
-
-
-	public final HeadParserToken getNextToken() throws IOException {
-		String context = null;
-		context = primGetNextToken();
-		HeadParserToken result = null;
-		if (valueText != null) {
-			result = createToken(context, yychar, valueText);
-			valueText = null;
-		} else {
-			result = createToken(context, yychar, yytext());
-		}
-		return result;
-	}
-
-	public final boolean hasMoreTokens() {
-		return hasMore && yychar < MAX_TO_SCAN;
-	}
-	private void pushCurrentState() {
-		fStateStack.push(yystate());
-
-	}
-
-	private void popState() {
-		yybegin(fStateStack.pop());
-	}
-	
-	private HeadParserToken createToken(String context, int start, String text) {
-		return new HeadParserToken(context, start, text);
-	}	
-
-
-
-  /**
-   * Creates a new scanner
-   * There is also a java.io.InputStream version of this constructor.
-   *
-   * @param   in  the java.io.Reader to read input from.
-   */
-  public XMLHeadTokenizer(java.io.Reader in) {
-    this.yy_reader = in;
-  }
-
-  /**
-   * Creates a new scanner.
-   * There is also java.io.Reader version of this constructor.
-   *
-   * @param   in  the java.io.Inputstream to read input from.
-   */
-  public XMLHeadTokenizer(java.io.InputStream in) {
-    this(new java.io.InputStreamReader(in));
-  }
-
-  /** 
-   * Unpacks the compressed character translation table.
-   *
-   * @param packed   the packed character translation table
-   * @return         the unpacked character translation table
-   */
-  private static char [] yy_unpack_cmap(String packed) {
-    char [] map = new char[0x10000];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 128) {
-      int  count = packed.charAt(i++);
-      char value = packed.charAt(i++);
-      do map[j++] = value; while (--count > 0);
-    }
-    return map;
-  }
-
-
-  /**
-   * Gets the next input character.
-   *
-   * @return      the next character of the input stream, EOF if the
-   *              end of the stream is reached.
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  private int yy_advance() throws java.io.IOException {
-
-    /* standard case */
-    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];
-
-    /* if the eof is reached, we don't need to work hard */ 
-    if (yy_atEOF) return YYEOF;
-
-    /* otherwise: need to refill the buffer */
-
-    /* first: make room (if you can) */
-    if (yy_startRead > 0) {
-      System.arraycopy(yy_buffer, yy_startRead, 
-                       yy_buffer, 0, 
-                       yy_endRead-yy_startRead);
-
-      /* translate stored positions */
-      yy_endRead-= yy_startRead;
-      yy_currentPos-= yy_startRead;
-      yy_markedPos-= yy_startRead;
-      yy_pushbackPos-= yy_startRead;
-      yy_startRead = 0;
-    }
-
-    /* is the buffer big enough? */
-    if (yy_currentPos >= yy_buffer.length) {
-      /* if not: blow it up */
-      char newBuffer[] = new char[yy_currentPos*2];
-      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
-      yy_buffer = newBuffer;
-    }
-
-    /* finally: fill the buffer with new input */
-    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
-                                            yy_buffer.length-yy_endRead);
-
-    if ( numRead == -1 ) return YYEOF;
-
-    yy_endRead+= numRead;
-
-    return yy_buffer[yy_currentPos++];
-  }
-
-
-  /**
-   * Closes the input stream.
-   */
-  final public void yyclose() throws java.io.IOException {
-    yy_atEOF = true;            /* indicate end of file */
-    yy_endRead = yy_startRead;  /* invalidate buffer    */
-    yy_reader.close();
-  }
-
-
-  /**
-   * Returns the current lexical state.
-   */
-  final public int yystate() {
-    return yy_lexical_state;
-  }
-
-  /**
-   * Enters a new lexical state
-   *
-   * @param newState the new lexical state
-   */
-  final public void yybegin(int newState) {
-    yy_lexical_state = newState;
-  }
-
-
-  /**
-   * Returns the text matched by the current regular expression.
-   */
-  final public String yytext() {
-    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
-  }
-
-  /**
-   * Returns the length of the matched text region.
-   */
-  final public int yylength() {
-    return yy_markedPos-yy_startRead;
-  }
-
-
-  /**
-   * Reports an error that occured while scanning.
-   *
-   * @param   errorCode  the code of the errormessage to display
-   */
-  private void yy_ScanError(int errorCode) {
-    try {
-      System.out.println(YY_ERROR_MSG[errorCode]);
-    }
-    catch (ArrayIndexOutOfBoundsException e) {
-      System.out.println(YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
-    }
-
-    System.exit(1);
-  } 
-
-
-  /**
-   * Pushes the specified amount of characters back into the input stream.
-   *
-   * They will be read again by then next call of the scanning method
-   *
-   * @param number  the number of characters to be read again.
-   *                This number must not be greater than yylength()!
-   */
-  private void yypushback(int number) {
-    if ( number > yylength() )
-      yy_ScanError(YY_PUSHBACK_2BIG);
-
-    yy_markedPos -= number;
-  }
-
-
-  /**
-   * Contains user EOF-code, which will be executed exactly once,
-   * when the end of file is reached
-   */
-  private void yy_do_eof() {
-    if (!yy_eof_done) {
-      yy_eof_done = true;
-    	hasMore=false;
-
-    }
-  }
-
-
-  /**
-   * Resumes scanning until the next regular expression is matched,
-   * the end of input is encountered or an I/O-Error occurs.
-   *
-   * @return      the next token
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  public String primGetNextToken() throws java.io.IOException {
-    int yy_input;
-    int yy_action;
-
-
-    while (true) {
-
-      yychar+= yylength();
-
-      yy_atBOL = yy_markedPos <= 0 || yy_buffer[yy_markedPos-1] == '\n';
-      if (!yy_atBOL && yy_buffer[yy_markedPos-1] == '\r') {
-        yy_atBOL = yy_advance() != '\n';
-        if (!yy_atEOF) yy_currentPos--;
-      }
-
-      yy_action = -1;
-
-      yy_currentPos = yy_startRead = yy_markedPos;
-
-      if (yy_atBOL)
-        yy_state = YY_LEXSTATE[yy_lexical_state+1];
-      else
-        yy_state = YY_LEXSTATE[yy_lexical_state];
-
-
-      yy_forAction: {
-        while (true) {
-
-          yy_input = yy_advance();
-
-          if ( yy_input == YYEOF ) break yy_forAction;
-
-          yy_input = yycmap[yy_input];
-
-          boolean yy_isFinal = false;
-          boolean yy_noLookAhead = false;
-
-          yy_forNext: { switch (yy_state) {
-            case 0:
-              switch (yy_input) {
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 7; break yy_forNext;
-              }
-
-            case 1:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_state = 8; break yy_forNext;
-                case 2: yy_isFinal = true; yy_state = 9; break yy_forNext;
-                case 3: yy_isFinal = true; yy_state = 10; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 9: yy_isFinal = true; yy_state = 11; break yy_forNext;
-                case 10: yy_isFinal = true; yy_state = 12; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 7; break yy_forNext;
-              }
-
-            case 2:
-              switch (yy_input) {
-                case 11: yy_isFinal = true; yy_state = 13; break yy_forNext;
-                case 15: yy_isFinal = true; yy_state = 14; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 7; break yy_forNext;
-              }
-
-            case 3:
-              switch (yy_input) {
-                case 6: 
-                case 9: yy_isFinal = true; yy_state = 16; break yy_forNext;
-                case 7: yy_isFinal = true; yy_state = 17; break yy_forNext;
-                case 23: yy_isFinal = true; yy_noLookAhead = true; yy_state = 18; break yy_forNext;
-                case 24: yy_isFinal = true; yy_noLookAhead = true; yy_state = 19; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 15; break yy_forNext;
-              }
-
-            case 4:
-              switch (yy_input) {
-                case 7: 
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 21; break yy_forNext;
-                case 11: yy_isFinal = true; yy_state = 22; break yy_forNext;
-                case 23: yy_isFinal = true; yy_noLookAhead = true; yy_state = 23; break yy_forNext;
-                case 24: yy_isFinal = true; yy_state = 24; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 20; break yy_forNext;
-              }
-
-            case 5:
-              switch (yy_input) {
-                case 7: 
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 21; break yy_forNext;
-                case 24: yy_isFinal = true; yy_state = 25; break yy_forNext;
-                case 25: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 20; break yy_forNext;
-              }
-
-            case 6:
-              switch (yy_input) {
-                case 11: yy_isFinal = true; yy_state = 26; break yy_forNext;
-                case 6: 
-                case 7: 
-                case 9: yy_isFinal = true; yy_noLookAhead = true; yy_state = 27; break yy_forNext;
-                case 23: yy_isFinal = true; yy_noLookAhead = true; yy_state = 28; break yy_forNext;
-                case 24: yy_isFinal = true; yy_state = 29; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 20; break yy_forNext;
-              }
-
-            case 8:
-              switch (yy_input) {
-                case 2: yy_isFinal = true; yy_noLookAhead = true; yy_state = 30; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 9:
-              switch (yy_input) {
-                case 1: yy_isFinal = true; yy_noLookAhead = true; yy_state = 31; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 10:
-              switch (yy_input) {
-                case 4: yy_state = 32; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 11:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: yy_state = 33; break yy_forNext;
-                case 10: yy_state = 34; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 12:
-              switch (yy_input) {
-                case 11: yy_state = 35; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 13:
-              switch (yy_input) {
-                case 22: yy_isFinal = true; yy_noLookAhead = true; yy_state = 36; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 14:
-              switch (yy_input) {
-                case 16: yy_state = 37; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 16:
-              switch (yy_input) {
-                case 6: 
-                case 9: yy_isFinal = true; yy_state = 16; break yy_forNext;
-                case 7: yy_state = 38; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 15; break yy_forNext;
-              }
-
-            case 17:
-              switch (yy_input) {
-                case 6: 
-                case 9: yy_isFinal = true; yy_state = 16; break yy_forNext;
-                case 7: yy_state = 38; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 15; break yy_forNext;
-              }
-
-            case 22:
-              switch (yy_input) {
-                case 22: yy_isFinal = true; yy_noLookAhead = true; yy_state = 39; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 24:
-              switch (yy_input) {
-                case 10: yy_state = 40; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 25:
-              switch (yy_input) {
-                case 10: yy_state = 40; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 26:
-              switch (yy_input) {
-                case 22: yy_isFinal = true; yy_noLookAhead = true; yy_state = 41; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 29:
-              switch (yy_input) {
-                case 10: yy_state = 40; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 32:
-              switch (yy_input) {
-                case 5: yy_isFinal = true; yy_noLookAhead = true; yy_state = 42; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 33:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: yy_state = 33; break yy_forNext;
-                case 10: yy_state = 34; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 34:
-              switch (yy_input) {
-                case 11: yy_state = 35; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 35:
-              switch (yy_input) {
-                case 12: yy_state = 43; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 37:
-              switch (yy_input) {
-                case 17: yy_state = 44; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 38:
-              switch (yy_input) {
-                case 6: 
-                case 9: yy_isFinal = true; yy_state = 16; break yy_forNext;
-                case 7: yy_state = 38; break yy_forNext;
-                default: yy_isFinal = true; yy_noLookAhead = true; yy_state = 15; break yy_forNext;
-              }
-
-            case 40:
-              switch (yy_input) {
-                case 24: yy_isFinal = true; yy_noLookAhead = true; yy_state = 21; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 43:
-              switch (yy_input) {
-                case 13: yy_state = 45; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 44:
-              switch (yy_input) {
-                case 18: yy_state = 46; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 45:
-              switch (yy_input) {
-                case 14: yy_state = 47; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 46:
-              switch (yy_input) {
-                case 19: yy_state = 48; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 47:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: yy_isFinal = true; yy_state = 49; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 48:
-              switch (yy_input) {
-                case 20: yy_state = 50; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 49:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: yy_isFinal = true; yy_state = 49; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 50:
-              switch (yy_input) {
-                case 16: yy_state = 51; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 51:
-              switch (yy_input) {
-                case 21: yy_state = 52; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 52:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: yy_state = 52; break yy_forNext;
-                case 8: yy_isFinal = true; yy_state = 53; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            case 53:
-              switch (yy_input) {
-                case 6: 
-                case 7: 
-                case 9: yy_isFinal = true; yy_state = 53; break yy_forNext;
-                default: break yy_forAction;
-              }
-
-            default:
-              yy_ScanError(YY_ILLEGAL_STATE);
-              break;
-          } }
-
-          if ( yy_isFinal ) {
-            yy_action = yy_state; 
-            yy_markedPos = yy_currentPos; 
-            if ( yy_noLookAhead ) break yy_forAction;
-          }
-
-        }
-      }
-
-
-      switch (yy_action) {    
-
-        case 25: 
-          {  popState(); valueText = string.toString(); return EncodingParserConstants.StringValue; }
-        case 55: break;
-        case 21: 
-          {  yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 56: break;
-        case 15: 
-        case 16: 
-          {  yypushback(1); yybegin(UnDelimitedString); string.setLength(0); }
-        case 57: break;
-        case 28: 
-        case 29: 
-          {  yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue; }
-        case 58: break;
-        case 39: 
-          {  yypushback(2); popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 59: break;
-        case 41: 
-          {  yypushback(2);popState(); valueText = string.toString(); return EncodingParserConstants.InvalidTerminatedStringValue; }
-        case 60: break;
-        case 7: 
-        case 8: 
-        case 9: 
-        case 10: 
-        case 11: 
-        case 12: 
-        case 13: 
-        case 14: 
-        case 17: 
-          { if (yychar > MAX_TO_SCAN) {hasMore=false; return EncodingParserConstants.MAX_CHARS_REACHED;} }
-        case 61: break;
-        case 30: 
-          { if (yychar == 0 ) {hasMore = false; return EncodingParserConstants.UTF16BE;} }
-        case 62: break;
-        case 31: 
-          { if (yychar == 0 ) {hasMore = false; return EncodingParserConstants.UTF16LE;} }
-        case 63: break;
-        case 42: 
-          { if (yychar == 0 ) {hasMore = false; return EncodingParserConstants.UTF83ByteBOM;} }
-        case 64: break;
-        case 49: 
-          { if (yychar == 0 ) {yybegin(ST_XMLDecl); return XMLHeadTokenizerConstants.XMLDeclStart;} }
-        case 65: break;
-        case 36: 
-          { yybegin(YYINITIAL); hasMore = false; return XMLHeadTokenizerConstants.XMLDeclEnd; }
-        case 66: break;
-        case 53: 
-          { pushCurrentState(); yybegin(QuotedAttributeValue); return XMLHeadTokenizerConstants.XMLDelEncoding; }
-        case 67: break;
-        case 23: 
-          {  popState(); valueText = string.toString(); return EncodingParserConstants.StringValue;  }
-        case 68: break;
-        case 20: 
-        case 22: 
-        case 24: 
-        case 26: 
-          {  string.append( yytext() );  }
-        case 69: break;
-        case 19: 
-          {  yybegin(SQ_STRING); string.setLength(0);  }
-        case 70: break;
-        case 18: 
-          {  yybegin(DQ_STRING); string.setLength(0);  }
-        case 71: break;
-        case 27: 
-          {  yypushback(1);popState(); valueText = string.toString(); return EncodingParserConstants.UnDelimitedStringValue;  }
-        case 72: break;
-        default: 
-          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
-            yy_atEOF = true;
-            yy_do_eof();
-              { hasMore = false; return EncodingParserConstants.EOF; }
-          } 
-          else {
-            yy_ScanError(YY_NO_MATCH);
-          }
-      }
-    }
-  }    
-
-  /**
-   * Runs the scanner on input files.
-   *
-   * This main method is the debugging routine for the scanner.
-   * It prints each returned token to System.out until the end of
-   * file is reached, or an error occured.
-   *
-   * @param argv   the command line, contains the filenames to run
-   *               the scanner on.
-   */
-  public static void main(String argv[]) {
-    for (int i = 0; i < argv.length; i++) {
-      XMLHeadTokenizer scanner = null;
-      try {
-        scanner = new XMLHeadTokenizer( new java.io.FileReader(argv[i]) );
-      }
-      catch (java.io.FileNotFoundException e) {
-        System.out.println("File not found : \""+argv[i]+"\"");
-        System.exit(1);
-      }
-      catch (java.io.IOException e) {
-        System.out.println("Error opening file \""+argv[i]+"\"");
-        System.exit(1);
-      }
-      catch (ArrayIndexOutOfBoundsException e) {
-        System.out.println("Usage : java XMLHeadTokenizer <inputfile>");
-        System.exit(1);
-      }
-
-      try {
-        do {
-          System.out.println(scanner.primGetNextToken());
-        } while (!scanner.yy_atEOF);
-
-      }
-      catch (java.io.IOException e) {
-        System.out.println("An I/O error occured while scanning :");
-        System.out.println(e);
-        System.exit(1);
-      }
-      catch (Exception e) {
-        e.printStackTrace();
-        System.exit(1);
-      }
-    }
-  }
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizerGenJava.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizerGenJava.cmd
deleted file mode 100644
index 7ec1c7b..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizerGenJava.cmd
+++ /dev/null
@@ -1,28 +0,0 @@
-@echo on

-

-rem The following variables need to be set/specified for each "development machine"

-set PATH=%PATH%;D:\JDKs\j2sdk1.4.2_03\bin

-set WORKSPACE_LOCATION=D:\builds\Workspaces\WSWBM8

-set JFLEX_LIB_LOCATION=D:\DevTimeSupport\JFlex\lib

-

-rem The following variables differ from project to project, but should be otherwise constant

-set MAIN_NAME=XMLHeadTokenizer

-

-rem set PROJECT_SRC=\org.eclipse.wst.sse.core.xml\src\

-rem set PACKAGE_DIR=com\ibm\sse\model\xml\encoding\

-

-set PROJECT_SRC=\org.eclipse.wst.common.encoding.contentspecific\src\

-set PACKAGE_DIR=com\ibm\encoding\resource\contentspecific\xml\

-

-

-rem Given the above "framework" and the command themselves, these variables should never need to be modified

-set JAVA_FILE=%MAIN_NAME%.java

-set JFLEX_RULES=%MAIN_NAME%.jflex

-set SKELETON_FILE=%MAIN_NAME%.skeleton

-

-IF EXIST %JAVA_FILE% del %JAVA_FILE%

-rem java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\sed-jflex.jar;. JFlex.Main %JFLEX_RULES% -skel %SKELETON_FILE% 1>jflexout.txt 2>jflexerr.txt

-java -Xmx470000000 -cp %JFLEX_LIB_LOCATION%\sed-jflex.jar;. JFlex.Main %JFLEX_RULES%  1>jflexout.txt 2>jflexerr.txt

-IF EXIST %JAVA_FILE% copy %JAVA_FILE% %WORKSPACE_LOCATION%%PROJECT_SRC%%PACKAGE_DIR%%JAVA_FILE%

-

-pause

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/jflexerr.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/jflexerr.txt
deleted file mode 100644
index e69de29..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/jflexerr.txt
+++ /dev/null
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/jflexout.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/jflexout.txt
deleted file mode 100644
index 316c32e..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/jflexout.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Reading "XMLHeadTokenizer.jflex"
-
-Warning : Macro "SpaceChar" has been declared but never used.
-Constructing NFA : 358 states in NFA
-Converting NFA to DFA : 
-...................................................................
-79 states before minimization, 54 states in minimized DFA
-Writing code to "XMLHeadTokenizer.java"
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/oldXMLHeadTokenizer.skeleton b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/oldXMLHeadTokenizer.skeleton
deleted file mode 100644
index 9809602..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/oldXMLHeadTokenizer.skeleton
+++ /dev/null
@@ -1,263 +0,0 @@
-

-  /** this character denotes the end of file */

-  final public static int YYEOF = -1;

-

-  /** lexical states */

----  lexical states, charmap

-

-  /* error codes */

-  final private static int YY_UNKNOWN_ERROR = 0;

-  final private static int YY_ILLEGAL_STATE = 1;

-  final private static int YY_NO_MATCH = 2;

-  final private static int YY_PUSHBACK_2BIG = 3;

-

-  /* error messages for the codes above */

-  final private static String YY_ERROR_MSG[] = {

-    "Unkown internal scanner error",		//$NON-NLS-1$

-    "Internal error: unknown state",		//$NON-NLS-1$

-    "Error: could not match input",		//$NON-NLS-1$

-    "Error: pushback value was too large"	//$NON-NLS-1$

-  };

-

---- isFinal list

-  /** the input device */

-  private java.io.Reader yy_reader;

-

-  /** the current state of the DFA */

-  private int yy_state;

-

-  /** the current lexical state */

-  private int yy_lexical_state = YYINITIAL;

-

-  /** this buffer contains the current text to be matched and is

-      the source of the yytext() string */

-  private char yy_buffer[] = new char[16384];

-

-  /** the textposition at the last accepting state */

-  private int yy_markedPos;

-

-  /** the textposition at the last state to be included in yytext */

-  private int yy_pushbackPos;

-

-  /** the current text position in the buffer */

-  private int yy_currentPos;

-

-  /** startRead marks the beginning of the yytext() string in the buffer */

-  private int yy_startRead;

-

-  /** endRead marks the last character in the buffer, that has been read

-      from input */

-  private int yy_endRead;

-

-  /** number of newlines encountered up to the start of the matched text */

-  private int yyline;

-

-  /** the number of characters up to the start of the matched text */

-  private int yychar;

-

-  

-  /** yy_atEOF == true <=> the scanner has returned a value for EOF */

-  private boolean yy_atEOF;

-

-	// state stack for handling embedded regions

-	private IntStack fStateStack = new IntStack();

-

-

---- user class code

-

-  /**

-   * Creates a new scanner

-   * There is also a java.io.InputStream version of this constructor.

-   *

-   * @param   in  the java.io.Reader to read input from.

-   */

---- constructor declaration

-

-

-  /**

-   * Gets the next input character.

-   *

-   * @return      the next character of the input stream, EOF if the

-   *              end of the stream is reached.

-   * @exception   IOException  if any I/O-Error occurs

-   */

-  private int yy_advance() throws java.io.IOException {

-

-    /* standard case */

-    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];

-

-    /* if the eof is reached, we don't need to work hard */ 

-    if (yy_atEOF) return YYEOF;

-

-    /* otherwise: need to refill the buffer */

-

-    /* first: make room (if you can) */

-    if (yy_startRead > 0) {

-      System.arraycopy(yy_buffer, yy_startRead, 

-                       yy_buffer, 0, 

-                       yy_endRead-yy_startRead);

-

-      /* translate stored positions */

-      yy_endRead-= yy_startRead;

-      yy_currentPos-= yy_startRead;

-      yy_markedPos-= yy_startRead;

-      yy_pushbackPos-= yy_startRead;

-      yy_startRead = 0;

-    }

-

-    /* is the buffer big enough? */

-    if (yy_currentPos >= yy_buffer.length) {

-      /* if not: blow it up */

-      char newBuffer[] = new char[yy_currentPos*2];

-      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);

-      yy_buffer = newBuffer;

-    }

-

-    /* finally: fill the buffer with new input */

-    int numRead = yy_reader.read(yy_buffer, yy_endRead, 

-                                            yy_buffer.length-yy_endRead);

-

-    if ( numRead == -1 ) return YYEOF;

-

-    yy_endRead+= numRead;

-

-    return yy_buffer[yy_currentPos++];

-  }

-

-    

-  /**

-   * Closes the input stream.

-   */

-  final public void yyclose() throws java.io.IOException {

-    yy_atEOF = true;            /* indicate end of file */

-    yy_endRead = yy_startRead;  /* invalidate buffer    */

-    yy_reader.close();

-  }

-

-

-  /**

-   * Returns the current lexical state.

-   */

-  final public int yystate() {

-    return yy_lexical_state;

-  }

-

-  /**

-   * Enters a new lexical state

-   *

-   * @param newState the new lexical state

-   */

-  final public void yybegin(int newState) {

-    yy_lexical_state = newState;

-  }

-

-

-  /**

-   * Returns the text matched by the current regular expression.

-   */

-  final public String yytext() {

-    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );

-  }

-

-  /**

-   * Returns the length of the matched text region.

-   */

-  final public int yylength() {

-    return yy_markedPos-yy_startRead;

-  }

-

-

-  /**

-   * Reports an error that occured while scanning - from the SED JFlex skeleton

-   *

-   * @param   errorCode  the code of the errormessage to display

-   */

-  private void yy_ScanError(int errorCode) {

-    try {

-      //Logger.log(Logger.ERROR, YY_ERROR_MSG[errorCode]);

-	System.out.println("ScanError: " + errorCode + ": " + YY_ERROR_MSG[errorCode]);

-    }

-    catch (ArrayIndexOutOfBoundsException e) {

-      //Logger.log(Logger.ERROR, YY_ERROR_MSG[YY_UNKNOWN_ERROR]);

-	System.out.println("ScanError: " + errorCode + ": " + YY_ERROR_MSG[YY_UNKNOWN_ERROR]);

-   }

-    // DO NOT EXIT the VM on an error

-    // System.exit(1);

-  } 

-

-

-  /**

-   * Pushes the specified amount of characters back into the input stream.

-   *

-   * They will be read again by then next call of the scanning method

-   *

-   * @param number  the number of characters to be read again.

-   *                This number must not be greater than yylength()!

-   */

-  private void yypushback(int number) {

-    if ( number > yylength() )

-      yy_ScanError(YY_PUSHBACK_2BIG);

-

-    yy_markedPos -= number;

-  }

-

-

---- yy_doEof

-  /**

-   * Resumes scanning until the next regular expression is matched,

-   * the end of input is encountered or an I/O-Error occurs.

-   *

-   * @return      the next token

-   * @exception   IOException  if any I/O-Error occurs

-   */

---- yylex declaration

-    int yy_input;

-    int yy_action;

-

---- local declarations

-

-    while (true) {

-

---- start admin (line, char, col count)

-      yy_action = -1;

-

-      yy_currentPos = yy_startRead = yy_markedPos;

-

---- start admin (lexstate etc)

-

-      yy_forAction: {

-        while (true) {

-    

-          yy_input = yy_advance();

-

-          if ( yy_input == YYEOF ) break yy_forAction;

-

---- line, col, char count, next transition, isFinal action

-            yy_action = yy_state; 

-            yy_markedPos = yy_currentPos; 

---- line count update

-          }

-

-        }

-      }

-

---- char count update

-

-      switch (yy_action) {    

-

---- actions

-        default: 

-          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {

-            yy_atEOF = true;

---- eofvalue

-          } 

-          else {

---- no match

-          }

-      }

-    }

-  }    

-

---- main

-

-}

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/CSSTokenizer/devel/CSSTokenizer.jflex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/CSSTokenizer/devel/CSSTokenizer.jflex
deleted file mode 100644
index 1a269c6..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/CSSTokenizer/devel/CSSTokenizer.jflex
+++ /dev/null
@@ -1,520 +0,0 @@
-/*******************************************************************************

- * Copyright (c) 2004, 2008 IBM Corporation and others.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- * 

- * Contributors:

- *     IBM Corporation - initial API and implementation

- *******************************************************************************/

-/*nlsXXX*/

-package org.eclipse.wst.css.core.internal.parser;

-

-import java.io.CharArrayReader;

-import java.io.IOException;

-import java.util.ArrayList;

-import java.util.List;

-

-import org.eclipse.wst.css.core.internal.parser.regions.CSSTextRegionFactory;

-import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts;

-import org.eclipse.wst.css.core.internal.parserz.CSSTextToken;

-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

-

-%%

-

-%public

-%class CSSTokenizer

-%implements CSSRegionContexts, ICSSTokenizer

-%function primGetNextToken

-%type String

-%char

-%unicode

-%caseless

-//%debug

-%pack

-

-%{

-	private final static String UNDEFINED = "undefined";

-	private String fBufferedContext = null;

-	private int fBufferedStart;

-//	private int fBufferedTextLength;

-	private int fBufferedLength;

-//	private StringBuffer fBufferedText = null;

-	private CSSTextRegionFactory fRegionFactory = CSSTextRegionFactory.getInstance();

-	private int fInitialState = YYINITIAL;

-	public final static int BUFFER_SIZE_NORMAL = 16384;

-	public final static int BUFFER_SIZE_SMALL = 256;

-	private int fInitialBufferSize = BUFFER_SIZE_NORMAL;

-

-	public void setInitialState(int state) {

-		fInitialState = state;

-	}

-	

-	public void setInitialBufferSize(int size) {

-		fInitialBufferSize = size;

-	}

-

-	/* user method */

-  	public final ITextRegion getNextToken() throws IOException {

-		String context;

-		String nextTokenType;

-		boolean spaceFollows;

-//		StringBuffer text;

-		int start;

-		int textLength;

-		int length;

-		if (fBufferedContext != null) {

-			context = fBufferedContext;

-//			text = fBufferedText;

-			start = fBufferedStart;

-			textLength = length = fBufferedLength;

-

-			fBufferedContext = null;

-		} else {

-			context = primGetNextToken();

-//			text = new StringBuffer(yytext());

-			start = yychar;

-			textLength = length = yylength();

-		}

-

-		if (context != null) {

-			if (context == UNDEFINED) {

-				// undef -> concatenate undef's

-				nextTokenType = primGetNextToken();

-				while (nextTokenType == UNDEFINED) {

-//					text.append(yytext());

-					textLength += yylength();

-					length = textLength;

-					nextTokenType = primGetNextToken();

-				}

-				fBufferedContext = nextTokenType;

-//				fBufferedText = new StringBuffer(yytext());

-				fBufferedStart = yychar;

-				fBufferedLength = yylength();

-			} else {

-				nextTokenType = null;

-				spaceFollows = false;

-				if (CSSRegionUtil.isDeclarationValueType(context)) { // declaration value can contain VALUE_S

-					nextTokenType = primGetNextToken();

-					spaceFollows = (nextTokenType == CSS_DECLARATION_VALUE_S);

-				} else if (canContainSpace(context)) {

-					nextTokenType = primGetNextToken();

-					spaceFollows = (nextTokenType == CSS_S);

-				}

-				if (nextTokenType != null) { // nextToken is retrieved

-					if (spaceFollows) {

-						// next is space -> append

-//						text.append(yytext());

-						length += yylength();

-					} else {

-						// next is NOT space -> push this for next time, return itself

-						fBufferedContext = nextTokenType;

-//						fBufferedText = new StringBuffer(yytext());

-						fBufferedStart = yychar;

-						fBufferedLength = yylength();

-					}

-				}

-			}

-		}

-

-		if (context != null) {

-			if (context == UNDEFINED) {

-				context = CSS_UNKNOWN;

-			}

-			return fRegionFactory.createRegion(context, start, textLength, length);

-		} else {

-			return null;

-		}

-  	}

-

-	/* user method */

-	/* for standalone use */

-  	public final List parseText() throws IOException {

-  		List tokens = new ArrayList();

-

-  		CSSTextToken token;

-		for (String kind = primGetNextToken(); kind != null; kind = primGetNextToken()) {

-			token = new CSSTextToken();

-			token.kind = kind;  				

-			token.start = yychar;

-			token.length = yylength();

-			token.image = yytext();

-			tokens.add(token);

-		}

-

-  		return tokens;

-  	}

-  	

-  	/* user method */

-  	private boolean canContainSpace(String type) {

-  		if (type == CSS_DELIMITER || type == CSS_RBRACE || type == CSS_DECLARATION_DELIMITER) {

-  			return false;

-  		} else {

-  			return true;

-  		}

-  	}

-

-	/* user method */

-	public final int getOffset() {

-		return yychar;

-	}

-	

-	/* user method */

-	public final boolean isEOF() {

-		return zzAtEOF;

-	}

-

-	/* user method */

-	public void reset(char[] charArray) {

-		reset(new CharArrayReader(charArray), 0);

-	}

-

-	/* user method */

-	public final void reset(java.io.Reader in, int newOffset) {

-		/** the input device */

-		zzReader = in;

-

-		/** the current state of the DFA */

-		zzState = 0;

-

-		/** the current lexical state */

-		zzLexicalState = fInitialState; //YYINITIAL;

-

-		/** this buffer contains the current text to be matched and is

-			the source of the yytext() string */

-		if (zzBuffer.length != fInitialBufferSize) {

-			zzBuffer = new char[fInitialBufferSize];

-		}

-		java.util.Arrays.fill(zzBuffer, (char)0);

-

-		/** the textposition at the last accepting state */

-		zzMarkedPos = 0;

-

-		/** the textposition at the last state to be included in yytext */

-//		yy_pushbackPos = 0;

-

-		/** the current text position in the buffer */

-		zzCurrentPos = 0;

-

-		/** startRead marks the beginning of the yytext() string in the buffer */

-		zzStartRead = 0;

-

-		/** endRead marks the last character in the buffer, that has been read

-			from input */

-		zzEndRead = 0;

-

-		/** number of newlines encountered up to the start of the matched text */

-		yyline = 0;

-

-		/** the number of characters up to the start of the matched text */

-		yychar = 0;

-

-		/**

-		 * the number of characters from the last newline up to the start of the 

-		 * matched text

-		 */

-//		yycolumn = 0; 

-

-		/** 

-		 * yy_atBOL == true <=> the scanner is currently at the beginning of a line

-		 */

-//		yy_atBOL = false;

-		

-		/** zzAtEOF == true <=> the scanner has returned a value for EOF */

-		zzAtEOF = false;

-

-		/* user variables */

-		//		fUndefined.delete(0, fUndefined.length());

-	}

-

-	/* user method */

-	public CSSTokenizer() {

-		super();

-	}

-

-	/**

-	 * Added to workaround stricter compilation options without creating

-	 * an alternate skeleton file

-	 */

-	void _usePrivates() {

-		System.out.print(yycolumn);

-		System.out.print(yyline);

-		System.out.print(Boolean.toString(zzAtBOL));

-	}

-%}

-

-%state ST_CHARSET_NAME

-%state ST_CHARSET_DELIMITER

-%state ST_IMPORT_URI

-%state ST_IMPORT_MEDIUM

-%state ST_IMPORT_DELIMITER

-%state ST_MEDIA_MEDIUM

-%state ST_MEDIA_DELIMITER

-%state ST_PAGE_PSEUDO_PAGE

-%state ST_PAGE_DELIMITER

-%state ST_FONT_FACE_DELIMITER

-%state ST_SELECTOR

-%state ST_SELECTOR_MODIFIER

-%state ST_SELECTOR_ATTRIBUTE_NAME

-%state ST_SELECTOR_ATTRIBUTE_OPERATOR

-%state ST_SELECTOR_ATTRIBUTE_VALUE

-%state ST_SELECTOR_ATTRIBUTE_END

-%state ST_DECLARATION

-%state ST_DECLARATION_SEPARATOR

-%state ST_DECLARATION_PRE_VALUE

-%state ST_DECLARATION_VALUE

-

-h = [0-9a-f]

-nonascii = [\u0080-\uffff]

-unicode = \\{h}{1,6}[ \t\r\n\f]?

-escape = {unicode}|\\[ -~\u0080-\uffff]

-

-

-

-nmstart = [_a-zA-Z]|{nonascii}|{escape}

-nmchar = [_a-zA-Z0-9-]|{nonascii}|{escape}

-string1 = \"([\t !#$%&(-~]|\\{nl}|\'|{nonascii}|{escape})*\"

-string2 = \'([\t !#$%&(-~]|\\{nl}|\"|{nonascii}|{escape})*\'

-

-ident = -?{nmstart}{nmchar}*

-value_ident = -?{nmstart}"."?({nmchar}+"."?)*

-

-name = {nmchar}+

-num = [+-]?([0-9]+|[0-9]*"."[0-9]+)

-string = {string1}|{string2}

-url = ([ !#$%&*-~]|{nonascii}|{escape})*

-s = [ \t\r\n\f]

-w = {s}*

-nl = \n|\r\n|\r|\f

-

-//range = \?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h})))))

-

-hash = "#"{name}

-uri = ("url("{w}{string}{w}")"|"url("{w}{url}{w}")")

-function = {ident}"("

-unicode_range = "U"\+[0-9a-fA-F?]{1,6}("-"[0-9a-fA-F?]{1,6})?

-

-%%

-

-/*

- * *** global ***

- */

-

-{s}+ { return CSS_S; }

-"<!--" { return CSS_CDO; }

-"-->" { return CSS_CDC; }

-"}" { yybegin(YYINITIAL); return CSS_RBRACE; }

-\/\*[^*]*\*+([^/*][^*]*\*+)*\/ { return CSS_COMMENT; }

-

-//<YYINITIAL> {

-//	"@import" {	yybegin(ST_IMPORT_URI); return CSS_IMPORT; }

-//}

-

-/*

- * *** charset rule ***

- * CHARSET_SYM S* STRING S* ';'

- */

-

-"@charset" { yybegin(ST_CHARSET_NAME); return CSS_CHARSET; }

-

-<ST_CHARSET_NAME> {

-	{string} { yybegin(ST_CHARSET_DELIMITER); return CSS_STRING; }

-}

-

-<ST_CHARSET_DELIMITER> {

-	";" { yybegin(YYINITIAL); return CSS_DELIMITER; }

-}

-

-/*

- * *** import rule ***

- * IMPORT_SYM S* [STRING|URI] S* [ medium [ COMMA S* medium]* ]? ';' S*

- */

-

-"@import" { yybegin(ST_IMPORT_URI); return CSS_IMPORT; }

-

-<ST_IMPORT_URI> {

-	{string} { yybegin(ST_IMPORT_MEDIUM); return CSS_STRING; }

-	//	"url("{w}{string}{w}")" { yybegin(ST_IMPORT_MEDIUM); return CSS_URI; }

-	//	"url("{w}{url}{w}")" { yybegin(ST_IMPORT_MEDIUM); return CSS_URI; }

-	{uri} { yybegin(ST_IMPORT_MEDIUM); return CSS_URI; }

-	";" { yybegin(YYINITIAL); return CSS_DELIMITER; }

-}

-

-<ST_IMPORT_MEDIUM> {

-	{ident} { yybegin(ST_IMPORT_DELIMITER); return CSS_MEDIUM; }

-	";" { yybegin(YYINITIAL); return CSS_DELIMITER; }

-}

-

-<ST_IMPORT_DELIMITER> {

-	";" { yybegin(YYINITIAL); return CSS_DELIMITER; }

-	"," { yybegin(ST_IMPORT_MEDIUM); return CSS_MEDIA_SEPARATOR; }

-}

-

-/*

- * *** media rule ***

- * MEDIA_SYM S* medium [ COMMA S* medium ]* LBRACE S* ruleset* '}' S*

- */

-

-"@media" { yybegin(ST_MEDIA_MEDIUM); return CSS_MEDIA; }

-

-/* 

- * medium

- * IDENT S*

- */

-<ST_MEDIA_MEDIUM> {

-	{ident} { yybegin(ST_MEDIA_DELIMITER); return CSS_MEDIUM; }

-}

-

-<ST_MEDIA_DELIMITER> {

-	"{" { yybegin(YYINITIAL); return CSS_LBRACE; }

-	"," { yybegin(ST_MEDIA_MEDIUM); return CSS_MEDIA_SEPARATOR; }

-}

-

-/*

- * *** page rule **

- * PAGE_SYM S* pseudo_page? S* LBRACE S* declaration [ ';' S* declaration ]* '}' S*

- */

-

-"@page" { yybegin(ST_PAGE_PSEUDO_PAGE); return CSS_PAGE; }

- 

-/*

- * pseudo_page

- * ':' IDENT

- */

-

-<ST_PAGE_PSEUDO_PAGE> {

-	":"?{ident} { yybegin(ST_PAGE_DELIMITER); return CSS_PAGE_SELECTOR; }

-	"{" { yybegin(ST_DECLARATION); return CSS_LBRACE; }

-}

-

-<ST_PAGE_DELIMITER> {

-	"{" { yybegin(ST_DECLARATION); return CSS_LBRACE; }

-}

-

-/*

- * font-face

- * FONT_FACE_SYM S* '{' S* declaration [ ';' S* declaration '* '}' S*

- */

-

-"@font-face" { yybegin(ST_FONT_FACE_DELIMITER); return CSS_FONT_FACE; }

-

-<ST_FONT_FACE_DELIMITER> {

-	"{" { yybegin(ST_DECLARATION); return CSS_LBRACE; }

-}

-

-/*

- * selector

- * simple_selector [ combinator simple_selector ]*

- */

-

-/*

- * simple_selector

- * element_name [ HASH | class | attrib | pseudo ]* | [ HASH | class | attrib | pseudo ]+

- */

-

-<YYINITIAL, ST_SELECTOR_MODIFIER, ST_SELECTOR> {

-	"*" { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_UNIVERSAL; }

-	{hash} { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_ID; }

-//	":"{ident}("("{s}*{ident}{s}*")")? { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_PSEUDO; }

-	":"({ident}("("{s}*{ident}{s}*")")?)? { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_PSEUDO; }

-	"."{name} { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_CLASS; }

-	"[" { yybegin(ST_SELECTOR_ATTRIBUTE_NAME); return CSS_SELECTOR_ATTRIBUTE_START; }

-}

-

-<YYINITIAL, ST_SELECTOR> {

-	{ident} { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_ELEMENT_NAME; }

-}

-

-<ST_SELECTOR_MODIFIER> {

-	"," { yybegin(ST_SELECTOR); return CSS_SELECTOR_SEPARATOR; }

-	// using LOOKAHEAD

-	{s}+/[^+>\{,/] { yybegin(ST_SELECTOR); return CSS_SELECTOR_COMBINATOR; }

-	"+"|">" { yybegin(ST_SELECTOR); return CSS_SELECTOR_COMBINATOR; }

-	"{" { yybegin(ST_DECLARATION); return CSS_LBRACE; }

-}

-

-/*

- * attrib

- * '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* [ IDENT | STRING ] S* ]? ']'

- */

-

-<ST_SELECTOR_ATTRIBUTE_NAME> {

-	{ident} { yybegin(ST_SELECTOR_ATTRIBUTE_OPERATOR); return CSS_SELECTOR_ATTRIBUTE_NAME; }

-}

-

-<ST_SELECTOR_ATTRIBUTE_OPERATOR> {

-	"="|"~="|"|=" { yybegin(ST_SELECTOR_ATTRIBUTE_VALUE); return CSS_SELECTOR_ATTRIBUTE_OPERATOR; }

-	"]" { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_ATTRIBUTE_END; }

-}

-

-<ST_SELECTOR_ATTRIBUTE_VALUE> {

-	{ident}|{string} { yybegin(ST_SELECTOR_ATTRIBUTE_END); return CSS_SELECTOR_ATTRIBUTE_VALUE; }

-}

-

-<ST_SELECTOR_ATTRIBUTE_END> {

-	"]" { yybegin(ST_SELECTOR_MODIFIER); return CSS_SELECTOR_ATTRIBUTE_END; }

-}

-

-/*

- * declaration

- * property ':' S* expr prio? | // empty //

- */

-

-<ST_DECLARATION> {

-	{ident} { yybegin(ST_DECLARATION_SEPARATOR); return CSS_DECLARATION_PROPERTY; }

-}

-

-<ST_DECLARATION_SEPARATOR> {

-	":" { yybegin(ST_DECLARATION_PRE_VALUE); return CSS_DECLARATION_SEPARATOR; }

-}

-

-<ST_DECLARATION_PRE_VALUE, ST_DECLARATION_VALUE> {

-	"!"{s}*"important" { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_IMPORTANT; }

-	

-	

-	")" { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_PARENTHESIS_CLOSE; }

-	

-	// ordered following two rules deliberately, see 

-	//  https://bugs.eclipse.org/bugs/show_bug.cgi?id=129902

-	{num}{ident} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_DIMENSION; }

-	{value_ident} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_IDENT; }

-

-

-	{num}"%" { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_PERCENTAGE; }

-		

-	{num} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_NUMBER; }

-	

-	

-	

-	{function} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_FUNCTION; }

-	{string} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_STRING; }

-	{uri} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_URI; }

-	"#"{name} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_HASH; }

-	{unicode_range} { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_UNICODE_RANGE; }

-	[,/] { yybegin(ST_DECLARATION_VALUE); return CSS_DECLARATION_VALUE_OPERATOR; }

-}

-

-<ST_DECLARATION_VALUE> {

-	{s}+/[^;}] { return CSS_DECLARATION_VALUE_S; }

-}

-

-<ST_DECLARATION, ST_DECLARATION_SEPARATOR, ST_DECLARATION_PRE_VALUE, ST_DECLARATION_VALUE> {

-	";" { yybegin(ST_DECLARATION); return CSS_DECLARATION_DELIMITER; }

-	//	"}" { yybegin(YYINITIAL); return CSS_RBRACE; }

-}

-

-

-//<YYINITIAL, ST_IMPORT_URI, ST_IMPORT_MEDIUM, ST_IMPORT_DELIMITER> {

-//	\/\*[^*]*\*+([^/*][^*]*\*+)*\/ { return CSS_COMMENT; }

-//	{s}+ { return CSS_S; }

-//	. { return UNDEFINED; }

-//}

-

-//<YYINITIAL, ST_IMPORT_URI, ST_IMPORT_MEDIUM, ST_IMPORT_DELIMITER> {

-//	[^ \t\r\n\f]+ { return CSS_UNKNOWN; }

-//}

-

-. {

-	return UNDEFINED;

-}

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/CSSTokenizer/devel/flex.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/CSSTokenizer/devel/flex.cmd
deleted file mode 100644
index d39ae78..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/CSSTokenizer/devel/flex.cmd
+++ /dev/null
@@ -1,6 +0,0 @@
-@echo off

-set JAVA_HOME=d:\jdk6_03

-set JFLEX_HOME=D:\JFlex\jflex-1.4.2

-

-%JAVA_HOME%\bin\java -Xmx470M -jar %JFLEX_HOME%\lib\JFlex.jar CSSTokenizer.jflex

-move CSSTokenizer.java ..\..\..\..\..\org.eclipse.wst.css.core\src\org\eclipse\wst\css\core\internal\parser\ && del CSSTokenizer.java*

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/README b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/README
deleted file mode 100644
index 3d820e1..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/README
+++ /dev/null
@@ -1,9 +0,0 @@
-devel     - the active development environment (sans JDK)

-            - latest version of HTMLTokenizer specification and generated code

-            - modified skeleton to prevent VM exits on unmatched input

-            - "flex" scripts to run JFlex with modified skeleton

-            - active RCS archive

-resources - backup/pristine resources

-            - Unmodified JFlex 1.2.2 download

-            - Separate modifications to the JFlex skeleton

-            - W3C XML recommendation used for several of the HTMLTokenizer rules

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.java
deleted file mode 100644
index b424476..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.java
+++ /dev/null
@@ -1,3838 +0,0 @@
-/* The following code was generated by JFlex 1.2.2 on 10/24/07 5:16 AM */
-
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsp.core.internal.parser.internal;
-
-import java.io.CharArrayReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsp.core.internal.Logger;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
-import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.sse.core.internal.util.Debug;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-import org.eclipse.wst.xml.core.internal.parser.ContextRegionContainer;
-import org.eclipse.wst.xml.core.internal.parser.IntStack;
-
-
-/**
- * This class is a scanner generated by 
- * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 10/24/07 5:16 AM from the specification file
- * <tt>file:/D:/eclipse.wtp/workspace/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
- */
-public class JSPTokenizer implements BlockTokenizer, DOMJSPRegionContexts {
-
-  /** this character denotes the end of file */
-  final public static int YYEOF = -1;
-
-  /** lexical states */
-  final public static int ST_JSP_VBL_DQUOTES = 51;
-  final public static int ST_JSP_VBL_SQUOTES = 50;
-  final public static int ST_JSP_VBL_SQUOTES_END = 52;
-  final public static int ST_XML_COMMENT_END = 4;
-  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE = 21;
-  final public static int ST_JSP_EL_SQUOTES_END = 45;
-  final public static int ST_JSP_EL_DQUOTES = 44;
-  final public static int ST_JSP_EL = 42;
-  final public static int ST_BLOCK_TAG_SCAN = 36;
-  final public static int ST_JSP_EL_SQUOTES = 43;
-  final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
-  final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;
-  final public static int ST_DHTML_TAG_CLOSE = 15;
-  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 41;
-  final public static int ST_DHTML_EQUALS = 13;
-  final public static int ST_XML_PI_ATTRIBUTE_VALUE = 10;
-  final public static int ST_XML_ATTRIBUTE_VALUE = 25;
-  final public static int ST_JSP_VBL = 49;
-  final public static int ST_JSP_SQUOTED_VBL = 55;
-  final public static int ST_XML_ATTRIBUTE_VALUE_SQUOTED = 40;
-  final public static int ST_XML_ATTRIBUTE_NAME = 23;
-  final public static int ST_XML_EQUALS = 24;
-  final public static int YYINITIAL = 0;
-  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_NAME = 19;
-  final public static int ST_JSP_CONTENT = 16;
-  final public static int ST_XML_DOCTYPE_ID_SYSTEM = 31;
-  final public static int ST_XML_ELEMENT_DECLARATION = 32;
-  final public static int ST_XML_DECLARATION_CLOSE = 27;
-  final public static int ST_JSP_DIRECTIVE_EQUALS = 20;
-  final public static int ST_JSP_VBL_DQUOTES_END = 53;
-  final public static int ST_JSP_DQUOTED_EL = 47;
-  final public static int ST_XML_DOCTYPE_DECLARATION = 28;
-  final public static int ST_CDATA_END = 2;
-  final public static int ST_PI_WS = 6;
-  final public static int ST_CDATA_TEXT = 1;
-  final public static int ST_JSP_DIRECTIVE_NAME_WHITESPACE = 18;
-  final public static int ST_XML_ELEMENT_DECLARATION_CONTENT = 33;
-  final public static int ST_XML_ATTLIST_DECLARATION = 34;
-  final public static int ST_JSP_EL_DQUOTES_END = 46;
-  final public static int ST_JSP_SQUOTED_EL = 48;
-  final public static int ST_JSP_COMMENT_END = 39;
-  final public static int ST_XML_PI_EQUALS = 9;
-  final public static int ST_XML_ATTLIST_DECLARATION_CONTENT = 35;
-  final public static int ST_XML_DOCTYPE_ID_PUBLIC = 30;
-  final public static int ST_JSP_DQUOTED_VBL = 54;
-  final public static int ST_DHTML_ATTRIBUTE_NAME = 12;
-  final public static int ST_ABORT_EMBEDDED = 37;
-  final public static int ST_XML_DOCTYPE_EXTERNAL_ID = 29;
-  final public static int ST_JSP_COMMENT = 38;
-  final public static int ST_PI_CONTENT = 7;
-  final public static int ST_BLOCK_TAG_INTERNAL_SCAN = 37;
-  final public static int ST_PI = 5;
-  final public static int ST_XML_DECLARATION = 26;
-  final public static int ST_JSP_DIRECTIVE_NAME = 17;
-  final public static int ST_XML_TAG_NAME = 22;
-  final public static int ST_XML_PI_TAG_CLOSE = 11;
-  final public static int ST_XML_COMMENT = 3;
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static String yycmap_packed = 
-    "\11\0\1\5\1\26\2\0\1\17\22\0\1\17\1\25\1\12\1\65"+
-    "\1\15\1\22\1\13\1\14\1\24\1\24\1\24\1\24\1\24\1\7"+
-    "\1\6\1\3\12\20\1\11\1\72\1\1\1\51\1\2\1\4\1\21"+
-    "\1\40\1\73\1\36\1\37\1\55\1\70\1\62\1\62\1\63\1\62"+
-    "\1\62\1\33\1\31\1\64\1\52\1\54\1\62\1\67\1\66\1\41"+
-    "\1\71\2\62\1\27\1\53\1\62\1\35\1\104\1\23\1\0\1\10"+
-    "\1\0\1\57\1\103\1\74\1\60\1\43\1\70\1\75\1\106\1\46"+
-    "\1\100\1\62\1\34\1\32\1\50\1\47\1\101\1\62\1\44\1\45"+
-    "\1\56\1\102\1\42\1\62\1\30\1\61\1\62\1\16\1\0\1\105"+
-    "\71\0\1\77\10\0\27\76\1\0\37\76\1\0\72\76\2\0\13\76"+
-    "\2\0\10\76\1\0\65\76\1\0\104\76\11\0\44\76\3\0\2\76"+
-    "\4\0\36\76\70\0\131\76\22\0\7\76\16\0\2\77\56\0\106\77"+
-    "\32\0\2\77\44\0\1\76\1\77\3\76\1\0\1\76\1\0\24\76"+
-    "\1\0\54\76\1\0\7\76\3\0\1\76\1\0\1\76\1\0\1\76"+
-    "\1\0\1\76\1\0\22\76\15\0\14\76\1\0\102\76\1\0\14\76"+
-    "\1\0\44\76\1\0\4\77\11\0\65\76\2\0\2\76\2\0\2\76"+
-    "\3\0\34\76\2\0\10\76\2\0\2\76\67\0\46\76\2\0\1\76"+
-    "\7\0\46\76\12\0\21\77\1\0\27\77\1\0\3\77\1\0\1\77"+
-    "\1\0\2\77\1\0\1\77\13\0\33\76\5\0\3\76\56\0\32\76"+
-    "\5\0\1\77\12\76\10\77\15\0\12\77\6\0\1\77\107\76\2\0"+
-    "\5\76\1\0\17\76\1\0\4\76\1\0\1\76\17\77\2\76\2\77"+
-    "\1\0\4\77\2\0\12\77\u0207\0\3\77\1\0\65\76\2\0\1\77"+
-    "\1\76\20\77\3\0\4\77\3\0\12\76\2\77\2\0\12\77\21\0"+
-    "\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0\7\76\1\0"+
-    "\1\76\3\0\4\76\2\0\1\77\1\0\7\77\2\0\2\77\2\0"+
-    "\3\77\11\0\1\77\4\0\2\76\1\0\3\76\2\77\2\0\12\77"+
-    "\2\76\20\0\1\77\2\0\6\76\4\0\2\76\2\0\26\76\1\0"+
-    "\7\76\1\0\2\76\1\0\2\76\1\0\2\76\2\0\1\77\1\0"+
-    "\5\77\4\0\2\77\2\0\3\77\13\0\4\76\1\0\1\76\7\0"+
-    "\12\77\2\77\3\76\14\0\3\77\1\0\7\76\1\0\1\76\1\0"+
-    "\3\76\1\0\26\76\1\0\7\76\1\0\2\76\1\0\5\76\2\0"+
-    "\1\77\1\76\10\77\1\0\3\77\1\0\3\77\22\0\1\76\5\0"+
-    "\12\77\21\0\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0"+
-    "\7\76\1\0\2\76\2\0\4\76\2\0\1\77\1\76\6\77\3\0"+
-    "\2\77\2\0\3\77\10\0\2\77\4\0\2\76\1\0\3\76\4\0"+
-    "\12\77\22\0\2\77\1\0\6\76\3\0\3\76\1\0\4\76\3\0"+
-    "\2\76\1\0\1\76\1\0\2\76\3\0\2\76\3\0\3\76\3\0"+
-    "\10\76\1\0\3\76\4\0\5\77\3\0\3\77\1\0\4\77\11\0"+
-    "\1\77\17\0\11\77\21\0\3\77\1\0\10\76\1\0\3\76\1\0"+
-    "\27\76\1\0\12\76\1\0\5\76\4\0\7\77\1\0\3\77\1\0"+
-    "\4\77\7\0\2\77\11\0\2\76\4\0\12\77\22\0\2\77\1\0"+
-    "\10\76\1\0\3\76\1\0\27\76\1\0\12\76\1\0\5\76\4\0"+
-    "\7\77\1\0\3\77\1\0\4\77\7\0\2\77\7\0\1\76\1\0"+
-    "\2\76\4\0\12\77\22\0\2\77\1\0\10\76\1\0\3\76\1\0"+
-    "\27\76\1\0\20\76\4\0\6\77\2\0\3\77\1\0\4\77\11\0"+
-    "\1\77\10\0\2\76\4\0\12\77\221\0\56\76\1\0\1\76\1\77"+
-    "\2\76\7\77\5\0\6\76\1\77\10\77\1\0\12\77\47\0\2\76"+
-    "\1\0\1\76\2\0\2\76\1\0\1\76\2\0\1\76\6\0\4\76"+
-    "\1\0\7\76\1\0\3\76\1\0\1\76\1\0\1\76\2\0\2\76"+
-    "\1\0\2\76\1\0\1\76\1\77\2\76\6\77\1\0\2\77\1\76"+
-    "\2\0\5\76\1\0\1\77\1\0\6\77\2\0\12\77\76\0\2\77"+
-    "\6\0\12\77\13\0\1\77\1\0\1\77\1\0\1\77\4\0\2\77"+
-    "\10\76\1\0\41\76\7\0\24\77\1\0\6\77\4\0\6\77\1\0"+
-    "\1\77\1\0\25\77\3\0\7\77\1\0\1\77\346\0\46\76\12\0"+
-    "\47\76\11\0\1\76\1\0\2\76\1\0\3\76\1\0\1\76\1\0"+
-    "\2\76\1\0\5\76\51\0\1\76\1\0\1\76\1\0\1\76\13\0"+
-    "\1\76\1\0\1\76\1\0\1\76\3\0\2\76\3\0\1\76\5\0"+
-    "\3\76\1\0\1\76\1\0\1\76\1\0\1\76\1\0\1\76\3\0"+
-    "\2\76\3\0\2\76\1\0\1\76\50\0\1\76\11\0\1\76\2\0"+
-    "\1\76\2\0\2\76\7\0\2\76\1\0\1\76\1\0\7\76\50\0"+
-    "\1\76\4\0\1\76\10\0\1\76\u0c06\0\234\76\4\0\132\76\6\0"+
-    "\26\76\2\0\6\76\2\0\46\76\2\0\6\76\2\0\10\76\1\0"+
-    "\1\76\1\0\1\76\1\0\1\76\1\0\37\76\2\0\65\76\1\0"+
-    "\7\76\1\0\1\76\3\0\3\76\1\0\7\76\3\0\4\76\2\0"+
-    "\6\76\4\0\15\76\5\0\3\76\1\0\7\76\323\0\15\77\4\0"+
-    "\1\77\104\0\1\76\3\0\2\76\2\0\1\76\121\0\3\76\u0e82\0"+
-    "\1\77\1\0\1\76\31\0\11\76\6\77\1\0\5\77\13\0\124\76"+
-    "\4\0\2\77\2\0\2\77\2\0\132\76\1\0\3\77\6\0\50\76"+
-    "\u1cd3\0\u51a6\76\u0c5a\0\u2ba4\76\134\0\u0800\0\u1ffe\0\2\0";
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);
-
-  /** 
-   * Translates a state to a row index in the transition table
-   */
-  final private static int yy_rowMap [] = { 
-        0,    71,   142,   213,   284,   355,   426,   497,   568,   639, 
-      710,   781,   852,   923,   994,  1065,  1136,  1207,  1278,  1349, 
-     1420,  1491,  1562,  1633,  1704,  1775,  1846,  1917,  1988,  2059, 
-     2130,  2201,  2272,  2343,  2414,  2485,  2556,  2627,  2698,  2769, 
-     2840,  2911,  2982,  3053,  3124,  3195,  3266,  3337,  3408,  3479, 
-     3550,  3621,  3692,  3763,  3834,  3905,  3976,  4047,  4118,  4189, 
-     4260,  4331,  4402,  4473,  4402,  4473,  4544,  4402,  4402,  4473, 
-     4615,  4686,  4757,  4828,  4899,  4970,  5041,  5112,  4402,  4473, 
-     5183,  5254,  5325,  4402,  5396,  5396,  5467,  5538,  5609,  5183, 
-     4402,  5680,  5751,  4402,  5822,  5893,  5964,  6035,  4402,  4473, 
-     6106,  6177,  6248,  6319,  6390,  6461,  4402,  6532,  6532,  6603, 
-     6674,  6745,  6816,  6887,  4402,  6958,  7029,  7100,  7171,  7242, 
-     7313,  4402,  7384,  7455,  7526,  7597,  7668,  7739,  7810,  7881, 
-     4402,  7952,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8449, 
-     8520,  8591,  8662,  8733,  8733,  8804,  8875,  8946,  9017,  9017, 
-     9088,  9159,  9230,  9301,  4402,  9372,  9372,  9443,  9514,  9585, 
-     9656,  4402,  4402,  4473,  4402,  4473,  9727,  9798,  9869,  9940, 
-     4402, 10011, 10082, 10153, 10224,  4402, 10295, 10366, 10437, 10508, 
-     4402,  4402, 10579,  4402, 10650, 10721, 10650, 10792, 10863, 10792, 
-     4402,  4402, 10934, 11005, 11076,  4402, 11147, 11218, 11289, 11360, 
-    11431,  4402,  4402, 11502,  4402, 11573, 11644, 11573, 11715, 11786, 
-    11715,  4402,  4402, 11857, 11928, 11999,  4402, 12070, 12141, 12212, 
-     4402,  4402, 12283, 12354, 12425, 12496, 12567,  4402, 12638, 12709, 
-    12780, 12851, 12922, 12993, 13064, 13135,  4402, 13206, 13277, 13348, 
-     4402,  4402,  5396,  5538,  4402, 13419,  5609, 13490,  5680,  5822, 
-     5893, 13561,  5964,  4402, 13632, 13703,  6035, 13774,  4402, 12354, 
-     4402,  6532,  6603,  4402, 13845,  6674, 13916,  4402, 13987, 14058, 
-     7384, 14129,  7597,  4402, 14200,  7668, 14271, 14342, 14413, 14484, 
-    14555, 14626,  8165,  4402, 14697, 14768,  8449,  8520,  4402, 14839, 
-    14910, 14981, 15052, 15123,  8662,  8449,  8733,  8804,  4402,  8875, 
-     8946,  8733,  9017,  9088,  4402, 15194, 15265, 15336, 15407, 15478, 
-    15549, 15620,  9372,  9443,  4402, 15691, 15762, 15833, 15904, 15975, 
-    16046, 16117, 16188, 16259,  4402,  4402,  4402, 16330,  4402,  4402, 
-    16401, 16472, 16543, 16614, 10650,  4402, 16685, 16756, 10792,  4402, 
-    16827, 16898, 16969, 17040, 17111, 17182, 17253, 17324, 17395, 11360, 
-    11573,  4402, 17466, 17537, 11715,  4402, 17608, 17679, 17750, 17821, 
-    17892, 17963, 18034, 18105, 18176,  4402,  4402,  4402, 18247, 18318, 
-    18389, 18460, 18531,  4402, 18602, 18673,  4402,  4402,  4402,  4402, 
-     4402,  4828, 18744, 18815, 18886, 18957, 19028, 19099, 19170, 19099, 
-    19241, 19312, 19241, 19383, 19454, 19525, 19596, 19667, 19738, 19809, 
-    19809, 19880, 19951, 19951, 20022,  9230,  9230,  9230, 20093, 20164, 
-    20235, 20235, 20306,  9585,  9585,  9585, 20377, 20448, 16543, 20519, 
-    10437, 10437, 10437, 20590, 20661, 10650, 10650, 10650, 20732, 20803, 
-    10792, 10792, 10792, 20874, 20945, 10934, 10934, 10934, 17111, 21016, 
-    21087, 11147, 11147, 11147, 17324, 21158, 21229, 11360, 11360, 11360, 
-    21300, 11573, 11573, 11573, 21371, 21442, 11715, 11715, 11715, 21513, 
-    21584, 11857, 11857, 11857, 17892, 21655, 21726, 12070, 12070, 12070, 
-    18105, 21797,  4402,  4402, 21868, 21939,  4402, 22010, 22081, 22152, 
-    22223,  7384,  4402,  4402, 22294, 22365, 22436, 22507, 22578, 15052, 
-    15407,  9230, 22649, 15904,  9585, 22720,  4402, 10437, 10650, 22791, 
-    10792, 22862, 10934, 22933,  4402, 11147, 23004, 11360, 11573, 23075, 
-    11715, 23146, 11857, 23217,  4402, 12070, 23288, 23359, 23430, 23501, 
-    23572, 23643, 23714, 23785, 23856, 23927, 23998, 24069, 24140, 24211, 
-    24282, 24353, 24424, 24495, 24566, 24637, 24708, 24779, 24850,  4828, 
-    24921, 24992, 25063, 25134, 25205,  4402,  4402, 25276, 25347, 25418, 
-    25489, 17111, 17324, 25560, 25631, 17892, 18105, 25702, 25773, 25844, 
-    25915,  4402,  4402,  4402, 25986, 26057, 26128, 26199, 26270, 26341, 
-    26412, 26483,  7100, 26554, 26625, 26696, 26767, 26838, 26909, 26980, 
-     4402, 27051, 27122,  9230,  9585, 10650, 10792, 11573, 11715, 27193, 
-    27264, 27335, 27406, 27477, 27548, 27619, 27690,  4828, 27761, 27832, 
-    27903, 27974, 28045, 28116, 28187, 28258, 28329, 28400, 28471, 28542, 
-    28613, 28684, 28755, 28826, 28897, 28968, 29039, 29110, 29181, 29252, 
-    29323, 29394, 29465, 29536, 29607, 29678, 29749, 29820, 29891, 29962, 
-    30033, 30104, 30175, 30246,  4402, 30317, 30388, 30459, 30530,  7100, 
-    30601, 30672, 30743, 30814, 30885, 30956, 31027, 31098, 31169, 31240, 
-    31311, 31382, 31453, 31524
-  };
-
-  /** 
-   * The packed transition table of the DFA
-   */
-  final private static String yy_packed = 
-    "\1\71\1\72\11\71\1\73\1\71\1\74\4\71\1\75"+
-    "\42\71\1\76\21\71\1\77\1\100\105\77\1\101\1\102"+
-    "\21\101\1\103\2\101\1\104\60\101\1\105\1\106\105\105"+
-    "\1\101\1\102\5\101\1\107\16\101\1\104\61\101\1\102"+
-    "\2\101\1\110\1\111\2\101\2\112\5\101\1\111\6\101"+
-    "\1\111\1\113\1\114\4\112\1\101\10\112\1\115\2\112"+
-    "\1\101\11\112\1\115\1\112\1\101\4\112\1\101\4\112"+
-    "\1\101\4\112\2\101\1\112\1\101\1\102\2\101\1\110"+
-    "\1\116\11\101\1\116\6\101\1\116\60\101\1\117\1\120"+
-    "\2\117\1\121\21\117\1\104\60\117\1\101\1\102\2\101"+
-    "\1\122\1\111\2\101\2\123\5\101\1\111\6\101\1\111"+
-    "\6\123\1\101\13\123\1\101\13\123\1\101\4\123\1\101"+
-    "\4\123\1\101\4\123\2\101\1\123\1\101\1\102\2\101"+
-    "\1\122\1\111\2\101\2\123\5\101\1\111\6\101\1\111"+
-    "\6\123\1\101\13\123\1\124\13\123\1\101\4\123\1\101"+
-    "\4\123\1\101\4\123\2\101\1\123\1\125\1\102\1\101"+
-    "\1\126\1\127\1\111\4\125\1\130\1\125\1\131\2\125"+
-    "\1\111\6\125\1\111\60\125\1\101\1\102\2\101\1\132"+
-    "\21\101\1\104\61\101\1\102\1\133\1\134\1\101\1\111"+
-    "\2\101\2\135\5\101\1\111\6\101\1\111\6\135\1\101"+
-    "\13\135\1\101\13\135\1\101\4\135\1\101\4\135\1\101"+
-    "\4\135\2\101\1\135\1\101\1\102\1\133\1\134\1\101"+
-    "\1\111\2\101\2\135\5\101\1\111\6\101\1\111\6\135"+
-    "\1\101\13\135\1\136\13\135\1\101\4\135\1\101\4\135"+
-    "\1\101\4\135\2\101\1\135\1\137\1\102\1\133\1\140"+
-    "\1\137\1\111\4\137\1\141\1\137\1\142\2\137\1\111"+
-    "\6\137\1\111\60\137\1\101\1\102\3\101\1\111\11\101"+
-    "\1\111\6\101\1\111\60\101\1\143\1\144\20\143\1\145"+
-    "\64\143\1\101\1\146\3\101\1\111\2\101\2\147\5\101"+
-    "\1\111\2\101\1\150\3\101\1\111\6\147\1\101\13\147"+
-    "\1\101\13\147\1\101\4\147\1\101\4\147\1\101\4\147"+
-    "\2\101\1\147\1\101\1\146\3\101\1\151\11\101\1\151"+
-    "\2\101\1\150\3\101\1\151\61\101\1\146\3\101\1\111"+
-    "\2\101\2\152\5\101\1\111\2\101\1\150\3\101\1\111"+
-    "\6\152\1\101\13\152\1\101\13\152\1\101\4\152\1\101"+
-    "\4\152\1\101\4\152\2\101\1\152\1\101\1\146\3\101"+
-    "\1\111\2\101\2\152\5\101\1\111\2\101\1\150\3\101"+
-    "\1\111\6\152\1\101\13\152\1\153\13\152\1\101\4\152"+
-    "\1\101\4\152\1\101\4\152\2\101\1\152\1\154\1\146"+
-    "\1\101\1\155\1\154\1\111\4\154\1\156\1\154\1\157"+
-    "\2\154\1\111\2\154\1\160\3\154\1\111\60\154\1\161"+
-    "\1\162\1\163\1\164\4\161\2\165\15\161\6\166\1\161"+
-    "\13\166\1\161\13\166\1\161\4\166\1\161\4\166\1\161"+
-    "\1\167\3\166\2\161\1\166\1\101\1\170\1\163\1\164"+
-    "\1\101\1\111\2\101\2\171\5\101\1\111\6\101\1\111"+
-    "\6\171\1\101\13\171\1\101\13\171\1\101\4\171\1\101"+
-    "\4\171\1\101\4\171\2\101\1\171\1\101\1\170\1\163"+
-    "\1\164\1\101\1\111\2\101\2\171\5\101\1\111\6\101"+
-    "\1\111\6\171\1\101\13\171\1\172\13\171\1\101\4\171"+
-    "\1\101\4\171\1\101\4\171\2\101\1\171\1\173\1\174"+
-    "\1\163\1\175\1\173\1\111\4\173\1\176\1\173\1\177"+
-    "\1\200\1\173\1\111\6\173\1\111\36\173\1\201\21\173"+
-    "\1\101\1\202\1\203\2\101\1\111\11\101\1\111\6\101"+
-    "\1\111\10\101\1\204\1\205\2\101\1\206\11\101\1\206"+
-    "\1\101\1\205\1\204\27\101\1\102\1\203\2\101\1\111"+
-    "\11\101\1\111\6\101\1\111\6\101\1\207\52\101\1\102"+
-    "\1\203\2\101\1\111\2\101\2\210\5\101\1\111\6\101"+
-    "\1\111\6\210\1\207\13\210\1\101\13\210\1\101\4\210"+
-    "\1\101\4\210\1\101\4\210\2\101\1\210\1\101\1\102"+
-    "\1\203\2\101\1\111\11\101\1\111\6\101\1\111\6\101"+
-    "\1\207\7\101\1\211\6\101\1\212\11\101\1\211\12\101"+
-    "\1\212\5\101\1\213\1\102\1\203\1\214\1\213\1\111"+
-    "\4\213\1\215\1\213\1\216\2\213\1\111\6\213\1\111"+
-    "\6\213\1\217\51\213\1\220\1\102\1\203\1\221\1\220"+
-    "\1\111\4\220\1\222\1\220\1\223\2\220\1\111\6\220"+
-    "\1\111\6\220\1\224\51\220\1\225\1\102\1\203\1\226"+
-    "\1\225\1\111\4\225\1\227\1\225\1\230\2\225\1\111"+
-    "\6\225\1\111\60\225\1\231\1\232\1\233\104\231\1\234"+
-    "\1\102\1\203\1\235\1\234\1\111\4\234\1\236\1\234"+
-    "\1\237\2\234\1\111\6\234\1\111\60\234\1\240\1\241"+
-    "\1\242\104\240\1\243\1\244\105\243\1\101\1\102\24\101"+
-    "\1\104\60\101\1\245\1\246\105\245\1\101\1\102\5\101"+
-    "\1\247\16\101\1\104\60\101\1\250\1\251\3\250\1\252"+
-    "\6\250\1\253\1\254\1\250\1\252\6\250\1\252\36\250"+
-    "\1\255\21\250\1\256\1\251\3\256\1\257\4\256\1\260"+
-    "\2\256\1\261\1\256\1\257\6\256\1\257\36\256\1\262"+
-    "\21\256\1\263\1\264\10\263\1\265\1\263\1\266\1\267"+
-    "\67\263\1\270\1\263\1\271\1\272\12\271\1\101\11\271"+
-    "\1\273\60\271\1\274\1\275\10\274\1\101\13\274\1\276"+
-    "\60\274\1\101\1\102\12\101\1\277\11\101\1\104\61\101"+
-    "\1\102\10\101\1\300\13\101\1\104\60\101\1\301\1\302"+
-    "\10\301\1\260\71\301\1\303\1\304\1\301\1\305\1\306"+
-    "\12\305\1\253\67\305\1\307\1\304\1\305\1\310\1\311"+
-    "\10\310\1\312\1\310\1\313\50\310\1\314\17\310\1\315"+
-    "\1\310\1\316\1\317\12\316\1\101\11\316\1\320\60\316"+
-    "\1\321\1\322\10\321\1\101\13\321\1\323\60\321\1\101"+
-    "\1\102\12\101\1\324\11\101\1\104\61\101\1\102\10\101"+
-    "\1\325\13\101\1\104\60\101\1\326\1\327\10\326\1\260"+
-    "\71\326\1\330\1\331\1\326\1\332\1\333\12\332\1\253"+
-    "\67\332\1\334\1\331\1\332\1\71\1\0\11\71\1\0"+
-    "\1\71\1\0\4\71\1\0\42\71\1\0\21\71\3\0"+
-    "\1\335\1\336\15\0\1\337\2\0\1\340\66\0\1\341"+
-    "\2\0\2\342\5\0\1\341\6\0\1\341\6\342\1\0"+
-    "\13\342\1\0\13\342\1\343\4\342\1\0\4\342\1\0"+
-    "\4\342\2\0\1\342\1\344\1\0\11\344\1\0\1\344"+
-    "\1\345\1\346\3\344\1\0\64\344\5\0\1\341\2\0"+
-    "\2\347\5\0\1\341\6\0\1\341\6\347\1\0\13\347"+
-    "\1\0\13\347\1\0\4\347\1\0\4\347\1\0\4\347"+
-    "\2\0\1\347\1\344\1\0\11\344\1\0\2\344\1\350"+
-    "\3\344\1\0\42\344\1\351\21\344\131\0\1\337\2\0"+
-    "\1\352\104\0\1\353\72\0\1\354\101\0\1\355\111\0"+
-    "\1\111\11\0\1\111\6\0\1\111\66\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\13\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\112\6\0"+
-    "\1\112\6\0\2\112\2\356\2\112\1\0\13\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\112\6\0\1\112\6\0\2\112\1\356\1\357\2\112"+
-    "\1\0\13\112\1\0\13\112\1\0\4\112\1\0\11\112"+
-    "\2\0\1\112\6\0\4\112\6\0\1\112\6\0\2\112"+
-    "\2\360\2\112\1\0\13\112\1\0\13\112\1\0\4\112"+
-    "\1\0\11\112\2\0\1\112\5\0\1\116\11\0\1\116"+
-    "\6\0\1\116\62\0\1\361\106\0\1\362\112\0\4\123"+
-    "\6\0\1\123\6\0\6\123\1\0\13\123\1\0\13\123"+
-    "\1\0\4\123\1\0\11\123\2\0\1\123\1\125\2\0"+
-    "\1\363\1\125\1\0\4\125\1\0\1\125\1\0\2\125"+
-    "\1\0\6\125\1\0\61\125\1\0\1\362\1\363\1\125"+
-    "\1\0\4\125\1\0\1\125\1\0\2\125\1\0\6\125"+
-    "\1\0\60\125\1\364\1\0\10\364\1\365\2\364\1\366"+
-    "\47\364\1\366\21\364\1\367\1\0\12\367\1\365\1\370"+
-    "\47\367\1\370\21\367\2\0\1\133\1\371\111\0\4\135"+
-    "\6\0\1\135\6\0\6\135\1\0\13\135\1\0\13\135"+
-    "\1\0\4\135\1\0\11\135\2\0\1\135\1\137\2\0"+
-    "\1\372\1\137\1\0\4\137\1\0\1\137\1\0\2\137"+
-    "\1\0\6\137\1\0\61\137\1\0\1\133\1\373\1\137"+
-    "\1\0\4\137\1\0\1\137\1\0\2\137\1\0\6\137"+
-    "\1\0\60\137\1\141\1\0\1\374\1\375\1\141\1\374"+
-    "\4\141\1\376\1\141\1\374\1\377\1\141\1\374\6\141"+
-    "\1\374\36\141\1\377\21\141\1\142\1\0\1\u0100\1\u0101"+
-    "\1\142\1\u0100\4\142\1\u0100\1\142\1\376\1\u0102\1\142"+
-    "\1\u0100\6\142\1\u0100\36\142\1\u0102\21\142\2\0\1\u0103"+
-    "\126\0\1\337\2\0\1\u0104\67\0\4\147\6\0\1\147"+
-    "\6\0\6\147\1\0\13\147\1\0\13\147\1\0\4\147"+
-    "\1\0\11\147\2\0\1\147\2\0\1\u0105\111\0\1\151"+
-    "\11\0\1\151\6\0\1\151\66\0\4\152\6\0\1\152"+
-    "\6\0\6\152\1\0\13\152\1\0\13\152\1\0\4\152"+
-    "\1\0\11\152\2\0\1\152\1\154\2\0\1\u0106\1\154"+
-    "\1\0\4\154\1\0\1\154\1\0\2\154\1\0\6\154"+
-    "\1\0\60\154\1\u0107\1\0\10\u0107\1\u0108\2\u0107\1\u0109"+
-    "\47\u0107\1\u0109\21\u0107\1\u010a\1\0\12\u010a\1\u0108\1\u010b"+
-    "\47\u010a\1\u010b\21\u010a\1\154\1\0\1\u0105\1\u0106\1\154"+
-    "\1\0\4\154\1\0\1\154\1\0\2\154\1\0\6\154"+
-    "\1\0\60\154\1\161\3\0\23\161\6\0\1\161\13\0"+
-    "\1\161\13\0\1\161\4\0\1\161\4\0\1\161\4\0"+
-    "\2\161\4\0\1\335\16\0\1\337\2\0\1\340\63\0"+
-    "\1\u010c\104\0\1\161\3\0\2\161\4\165\6\161\1\165"+
-    "\6\161\6\166\1\161\13\166\1\161\13\166\1\161\4\166"+
-    "\1\161\4\166\1\165\4\166\2\161\1\166\6\0\4\166"+
-    "\6\0\1\166\6\0\6\166\1\0\13\166\1\0\13\166"+
-    "\1\0\4\166\1\0\11\166\2\0\1\166\6\0\4\166"+
-    "\6\0\1\166\6\0\6\166\1\0\7\166\1\u010d\3\166"+
-    "\1\0\13\166\1\0\4\166\1\0\11\166\2\0\1\166"+
-    "\3\0\1\335\4\0\2\u010e\10\0\1\337\2\0\1\340"+
-    "\1\0\6\u010e\1\0\13\u010e\1\0\13\u010e\1\0\4\u010e"+
-    "\1\0\4\u010e\1\0\4\u010e\2\0\1\u010e\6\0\4\171"+
-    "\6\0\1\171\6\0\6\171\1\0\13\171\1\0\13\171"+
-    "\1\0\4\171\1\0\11\171\2\0\1\171\1\173\2\0"+
-    "\1\u010f\1\173\1\0\4\173\1\0\1\173\1\0\2\173"+
-    "\1\0\6\173\1\0\60\173\3\0\1\335\4\0\2\u0110"+
-    "\10\0\1\337\2\0\1\340\1\0\6\u0110\1\0\13\u0110"+
-    "\1\0\13\u0110\1\0\4\u0110\1\0\4\u0110\1\0\4\u0110"+
-    "\2\0\1\u0110\1\173\1\0\1\u010c\1\u010f\1\173\1\0"+
-    "\4\173\1\0\1\173\1\0\2\173\1\0\6\173\1\0"+
-    "\60\173\1\u0111\1\0\10\u0111\1\u0112\2\u0111\1\u0113\47\u0111"+
-    "\1\u0113\21\u0111\1\u0114\1\0\12\u0114\1\u0112\1\u0115\47\u0114"+
-    "\1\u0115\21\u0114\1\173\2\0\1\u010f\1\173\1\0\4\173"+
-    "\1\0\1\173\1\0\1\173\1\u0116\1\0\6\173\1\0"+
-    "\61\173\2\0\1\u010f\1\173\1\0\4\173\1\0\1\173"+
-    "\1\0\1\173\1\u0117\1\0\6\173\1\0\60\173\3\0"+
-    "\1\335\16\0\1\337\2\0\1\u0104\130\0\1\u0118\2\0"+
-    "\1\u0118\75\0\1\u0119\14\0\1\u0119\63\0\2\u011a\52\0"+
-    "\23\u011b\1\u011c\63\u011b\6\0\4\210\6\0\1\210\6\0"+
-    "\6\210\1\0\13\210\1\0\13\210\1\0\4\210\1\0"+
-    "\11\210\2\0\1\210\53\0\1\u011d\5\0\1\u011d\116\0"+
-    "\1\u011e\10\0\1\u011e\4\0\1\213\2\0\1\u011f\1\213"+
-    "\1\0\4\213\1\0\1\213\1\0\2\213\1\0\6\213"+
-    "\1\0\60\213\1\u0120\1\0\10\u0120\1\u0121\2\u0120\1\u0122"+
-    "\47\u0120\1\u0122\21\u0120\1\u0123\1\0\1\u0123\2\u0124\1\u0123"+
-    "\4\u0124\2\u0123\1\u0125\1\u0126\1\u0123\4\u0124\1\u0123\11\u0124"+
-    "\1\u0123\27\u0124\1\u0126\10\u0124\2\u0123\4\u0124\2\u0123\1\u0124"+
-    "\1\217\2\u011b\1\u0127\1\217\1\u011b\4\217\1\u011b\1\217"+
-    "\1\u011b\2\217\1\u011b\3\217\1\u0128\2\217\1\u011b\60\217"+
-    "\1\220\2\0\1\u0129\1\220\1\0\4\220\1\0\1\220"+
-    "\1\0\2\220\1\0\6\220\1\0\60\220\12\u012a\1\u012b"+
-    "\74\u012a\14\u012c\1\u012b\72\u012c\1\224\2\u011b\1\u012d\1\224"+
-    "\1\u011b\4\224\1\u011b\1\224\1\u011b\2\224\1\u011b\3\224"+
-    "\1\u012e\2\224\1\u011b\60\224\1\225\2\0\1\u012f\1\225"+
-    "\1\0\4\225\1\0\1\225\1\0\2\225\1\0\6\225"+
-    "\1\0\60\225\1\u0130\1\0\10\u0130\1\u0131\2\u0130\1\u0132"+
-    "\47\u0130\1\u0132\21\u0130\1\u0133\1\0\1\u0133\2\u0134\1\u0133"+
-    "\4\u0134\2\u0133\1\u0135\1\u0136\1\u0133\4\u0134\1\u0133\11\u0134"+
-    "\1\u0133\27\u0134\1\u0136\10\u0134\2\u0133\4\u0134\2\u0133\1\u0134"+
-    "\2\231\1\0\106\231\1\0\17\231\1\u0137\2\231\1\u0138"+
-    "\61\231\1\234\2\0\1\u0139\1\234\1\0\4\234\1\0"+
-    "\1\234\1\0\2\234\1\0\6\234\1\0\60\234\1\u013a"+
-    "\1\0\10\u013a\1\u013b\2\u013a\1\u013c\47\u013a\1\u013c\21\u013a"+
-    "\1\u013d\1\0\1\u013d\2\u013e\1\u013d\4\u013e\2\u013d\1\u013f"+
-    "\1\u0140\1\u013d\4\u013e\1\u013d\11\u013e\1\u013d\27\u013e\1\u0140"+
-    "\10\u013e\2\u013d\4\u013e\2\u013d\1\u013e\2\240\1\0\106\240"+
-    "\1\0\17\240\1\u0141\2\240\1\u0142\61\240\7\0\1\u0143"+
-    "\77\0\1\250\1\0\12\250\1\0\1\u0144\47\250\1\u0144"+
-    "\21\250\3\0\1\u0145\16\0\1\337\2\0\1\352\61\0"+
-    "\1\250\1\0\3\250\1\252\6\250\1\0\1\u0144\1\250"+
-    "\1\252\6\250\1\252\36\250\1\u0144\37\250\1\u0146\106\250"+
-    "\1\u0147\70\250\1\256\1\0\10\256\1\0\2\256\1\u0148"+
-    "\47\256\1\u0148\22\256\1\0\3\256\1\257\4\256\1\0"+
-    "\2\256\1\u0148\1\256\1\257\6\256\1\257\36\256\1\u0148"+
-    "\37\256\1\u0149\106\256\1\u014a\70\256\12\263\1\0\1\263"+
-    "\1\0\1\u014b\67\263\1\0\13\263\1\0\1\263\1\0"+
-    "\1\u014b\4\263\1\u014c\62\263\1\0\13\263\1\0\1\263"+
-    "\1\0\1\263\1\u014d\66\263\1\u014e\1\263\14\u014f\1\u0150"+
-    "\106\u014f\1\u0150\5\u014f\1\u0151\2\u014f\1\u0152\61\u014f\12\u0153"+
-    "\1\u0154\106\u0153\1\u0154\7\u0153\1\u0155\2\u0153\1\u0156\61\u0153"+
-    "\12\301\1\0\71\301\1\u0157\1\0\13\301\1\0\7\301"+
-    "\1\u0158\61\301\1\u0157\1\0\13\301\1\u0159\74\301\14\305"+
-    "\1\0\67\305\1\u015a\1\0\15\305\1\0\5\305\1\u015b"+
-    "\61\305\1\u015a\1\0\15\305\1\u015c\72\305\12\310\1\0"+
-    "\1\310\1\0\70\310\1\0\13\310\1\0\1\310\1\0"+
-    "\5\310\1\u015d\62\310\1\0\13\310\1\0\1\310\1\0"+
-    "\1\310\1\u015e\66\310\1\0\1\310\14\u015f\1\u0160\106\u015f"+
-    "\1\u0160\5\u015f\1\u0161\2\u015f\1\u0162\61\u015f\12\u0163\1\u0164"+
-    "\106\u0163\1\u0164\7\u0163\1\u0165\2\u0163\1\u0166\61\u0163\12\326"+
-    "\1\0\71\326\1\u0167\1\0\13\326\1\0\7\326\1\u0168"+
-    "\61\326\1\u0167\1\0\13\326\1\u0169\74\326\14\332\1\0"+
-    "\67\332\1\u016a\1\0\15\332\1\0\5\332\1\u016b\61\332"+
-    "\1\u016a\1\0\15\332\1\u016c\72\332\7\0\1\u016d\11\0"+
-    "\1\u016e\3\0\1\u016f\23\0\1\u0170\44\0\1\u0171\25\0"+
-    "\1\u0172\56\0\1\341\2\0\2\u0173\5\0\1\341\6\0"+
-    "\1\341\6\u0173\1\0\13\u0173\1\0\13\u0173\1\0\4\u0173"+
-    "\1\0\4\u0173\1\0\4\u0173\2\0\1\u0173\1\u0174\1\0"+
-    "\3\u0174\1\u0175\4\342\1\u0174\1\0\3\u0174\1\u0175\1\342"+
-    "\1\u0174\1\0\3\u0174\1\u0175\6\342\1\u0174\13\342\1\u0174"+
-    "\13\342\1\u0174\4\342\1\u0176\11\342\2\u0174\1\342\20\0"+
-    "\1\u0177\7\0\1\u0178\73\0\1\345\71\0\105\346\1\u0179"+
-    "\1\346\1\u0174\1\0\3\u0174\1\u0175\4\347\1\u0174\1\0"+
-    "\3\u0174\1\u0175\1\347\1\u0174\1\0\3\u0174\1\u0175\6\347"+
-    "\1\u0174\13\347\1\u0174\13\347\1\u0174\4\347\1\u017a\11\347"+
-    "\2\u0174\1\347\105\350\1\u017b\1\350\65\0\1\351\56\0"+
-    "\1\u0172\53\0\1\u017c\106\0\1\u017d\112\0\4\112\6\0"+
-    "\1\112\6\0\4\112\2\u017e\1\0\13\112\1\0\13\112"+
-    "\1\0\4\112\1\0\11\112\2\0\1\112\6\0\4\112"+
-    "\6\0\1\112\6\0\4\112\1\u017e\1\u017f\1\0\13\112"+
-    "\1\0\13\112\1\0\4\112\1\0\11\112\2\0\1\112"+
-    "\6\0\4\112\6\0\1\112\6\0\6\112\1\0\13\112"+
-    "\1\0\2\112\1\u0180\10\112\1\0\4\112\1\0\6\112"+
-    "\1\u0180\2\112\2\0\1\112\12\364\1\365\3\364\1\0"+
-    "\70\364\14\367\1\365\1\367\1\0\70\367\1\374\1\0"+
-    "\10\374\1\376\2\374\1\u0181\47\374\1\u0181\21\374\1\141"+
-    "\2\374\1\375\1\141\1\374\4\141\1\376\1\141\1\374"+
-    "\1\141\1\137\1\374\6\141\1\374\60\141\1\u0100\1\0"+
-    "\12\u0100\1\376\1\u0182\47\u0100\1\u0182\21\u0100\1\142\2\u0100"+
-    "\1\u0101\1\142\1\u0100\4\142\1\u0100\1\142\1\376\1\142"+
-    "\1\137\1\u0100\6\142\1\u0100\60\142\12\u0107\1\u0108\3\u0107"+
-    "\1\0\70\u0107\14\u010a\1\u0108\1\u010a\1\0\70\u010a\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\6\166\1\u0183\2\166\2\0"+
-    "\1\166\6\0\4\u010e\6\0\1\u010e\6\0\6\u010e\1\0"+
-    "\13\u010e\1\0\13\u010e\1\0\4\u010e\1\0\11\u010e\2\0"+
-    "\1\u010e\6\0\4\u0110\6\0\1\u0110\6\0\6\u0110\1\0"+
-    "\13\u0110\1\0\13\u0110\1\0\4\u0110\1\0\11\u0110\2\0"+
-    "\1\u0110\12\u0111\1\u0112\3\u0111\1\0\70\u0111\14\u0114\1\u0112"+
-    "\1\u0114\1\0\70\u0114\1\u0184\2\u0185\1\u0186\1\u0184\1\u0185"+
-    "\4\u0184\1\u0185\1\u0184\1\u0185\2\u0184\1\u0185\6\u0184\1\u0185"+
-    "\56\u0184\1\173\1\u0184\1\u0187\2\u0188\1\u0189\1\u0187\1\u0188"+
-    "\4\u0187\1\u0188\1\u0187\1\u0188\2\u0187\1\u0188\6\u0187\1\u0188"+
-    "\56\u0187\1\173\1\u0187\36\0\1\u018a\35\0\1\u018a\53\0"+
-    "\1\u018b\14\0\1\u018b\73\0\1\u018c\11\0\1\u018c\76\0"+
-    "\1\u018d\20\0\1\u018d\113\0\1\u018e\7\0\1\u018e\3\0"+
-    "\12\u0120\1\u0121\3\u0120\1\0\70\u0120\1\u0123\1\0\12\u0123"+
-    "\1\u0121\1\u018f\47\u0123\1\u018f\22\u0123\1\0\12\u0123\1\u0190"+
-    "\1\u018f\47\u0123\1\u018f\21\u0123\14\0\1\u0191\72\0\14\u0123"+
-    "\1\u0190\1\u0123\1\0\70\u0123\12\u0130\1\u0131\3\u0130\1\0"+
-    "\70\u0130\1\u0133\1\0\12\u0133\1\u0131\1\u0192\47\u0133\1\u0192"+
-    "\22\u0133\1\0\12\u0133\1\u0193\1\u0192\47\u0133\1\u0192\21\u0133"+
-    "\14\0\1\u0194\72\0\14\u0133\1\u0193\1\u0133\1\0\70\u0133"+
-    "\2\231\1\0\4\231\1\u0195\11\231\1\u0196\3\231\1\u0197"+
-    "\23\231\1\u0198\37\231\1\0\32\231\1\u0199\51\231\12\u013a"+
-    "\1\u013b\3\u013a\1\0\70\u013a\1\u013d\1\0\12\u013d\1\u013b"+
-    "\1\u019a\47\u013d\1\u019a\22\u013d\1\0\12\u013d\1\u019b\1\u019a"+
-    "\47\u013d\1\u019a\21\u013d\14\0\1\u019c\72\0\14\u013d\1\u019b"+
-    "\1\u013d\1\0\70\u013d\2\240\1\0\4\240\1\u019d\11\240"+
-    "\1\u019e\3\240\1\u019f\23\240\1\u01a0\37\240\1\0\32\240"+
-    "\1\u01a1\51\240\22\0\1\u01a2\64\0\16\250\1\0\70\250"+
-    "\16\256\1\0\70\256\12\263\1\0\1\263\1\0\1\263"+
-    "\1\u01a3\66\263\1\u014e\10\263\1\u01a4\2\263\1\0\1\263"+
-    "\1\0\1\u014b\3\263\1\u01a5\3\263\1\u01a6\23\263\1\u01a7"+
-    "\33\263\1\0\1\263\12\u01a3\1\0\1\u01a3\1\0\70\u01a3"+
-    "\1\0\1\u01a3\12\u014e\1\0\1\u014e\1\0\1\u01a8\67\u014e"+
-    "\1\0\1\u014e\7\u014f\1\u01a9\4\u014f\1\u0150\4\u014f\1\u01aa"+
-    "\3\u014f\1\u01ab\23\u014f\1\u01ac\51\u014f\1\u0150\20\u014f\1\u01ad"+
-    "\51\u014f\7\u0153\1\u01ae\2\u0153\1\u0154\6\u0153\1\u01af\3\u0153"+
-    "\1\u01b0\23\u0153\1\u01b1\47\u0153\1\u0154\22\u0153\1\u01b2\51\u0153"+
-    "\12\301\1\0\103\301\1\u01b3\2\301\1\0\6\301\1\u01b4"+
-    "\3\301\1\u01b5\23\301\1\u01b6\32\301\1\u0157\1\0\1\301"+
-    "\104\u01b7\1\u01b8\2\u01b7\14\305\1\0\101\305\1\u01b9\4\305"+
-    "\1\0\4\305\1\u01ba\3\305\1\u01bb\23\305\1\u01bc\32\305"+
-    "\1\u015a\1\0\1\305\104\u01bd\1\u01be\2\u01bd\7\310\1\u01bf"+
-    "\2\310\1\0\1\310\1\0\4\310\1\u01c0\3\310\1\u01c1"+
-    "\23\310\1\u01c2\33\310\1\0\1\310\7\u015f\1\u01c3\4\u015f"+
-    "\1\u0160\4\u015f\1\u01c4\3\u015f\1\u01c5\23\u015f\1\u01c6\51\u015f"+
-    "\1\u0160\20\u015f\1\u01c7\51\u015f\7\u0163\1\u01c8\2\u0163\1\u0164"+
-    "\6\u0163\1\u01c9\3\u0163\1\u01ca\23\u0163\1\u01cb\47\u0163\1\u0164"+
-    "\22\u0163\1\u01cc\51\u0163\12\326\1\0\103\326\1\u01cd\2\326"+
-    "\1\0\6\326\1\u01ce\3\326\1\u01cf\23\326\1\u01d0\32\326"+
-    "\1\u0167\1\0\1\326\104\u01d1\1\u01d2\2\u01d1\14\332\1\0"+
-    "\101\332\1\u01d3\4\332\1\0\4\332\1\u01d4\3\332\1\u01d5"+
-    "\23\332\1\u01d6\32\332\1\u016a\1\0\1\332\104\u01d7\1\u01d8"+
-    "\2\u01d7\7\0\1\u01d9\106\0\1\u01da\135\0\1\u01db\50\0"+
-    "\1\u0173\1\0\11\u0173\1\0\6\u0173\1\0\64\u0173\1\u0174"+
-    "\1\0\11\u0174\1\0\6\u0174\1\0\47\u0174\1\0\15\u0174"+
-    "\1\0\3\u0174\1\u0175\5\u0174\1\0\3\u0174\1\u0175\2\u0174"+
-    "\1\0\3\u0174\1\u0175\43\u0174\1\u01dc\14\u0174\20\0\1\u0177"+
-    "\51\0\1\u01dd\34\0\1\u01de\15\0\3\u01de\2\0\1\u01de"+
-    "\11\0\1\u01de\1\0\2\u01de\7\0\1\u01de\2\0\2\u01de"+
-    "\6\0\1\u01de\11\0\1\112\1\u01df\2\112\6\0\1\112"+
-    "\6\0\6\112\1\0\13\112\1\0\13\112\1\0\4\112"+
-    "\1\0\11\112\2\0\1\112\6\0\4\112\6\0\1\112"+
-    "\6\0\6\112\1\0\11\112\1\u01e0\1\112\1\0\1\u01e0"+
-    "\12\112\1\0\4\112\1\0\11\112\2\0\1\112\12\374"+
-    "\1\376\3\374\1\0\70\374\14\u0100\1\376\1\u0100\1\0"+
-    "\70\u0100\6\0\3\166\1\u01e1\6\0\1\166\6\0\6\166"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\1\u0184\2\u0185\1\u0186\1\u0184\1\u0185\4\u0184"+
-    "\1\u0185\1\u0184\1\u0185\2\u0184\1\u0185\6\u0184\1\u0185\56\u0184"+
-    "\1\u01e2\1\u0184\105\u0185\1\u01e3\1\u0185\1\u0187\2\u0188\1\u0189"+
-    "\1\u0187\1\u0188\4\u0187\1\u0188\1\u0187\1\u0188\2\u0187\1\u0188"+
-    "\6\u0187\1\u0188\56\u0187\1\u01e2\1\u0187\105\u0188\1\u01e4\1\u0188"+
-    "\41\0\1\u01e5\14\0\1\u01e5\63\0\2\u01e6\103\0\2\u01e7"+
-    "\115\0\1\u01e8\14\0\1\u01e8\63\0\2\u01e9\52\0\14\u0123"+
-    "\1\u0121\1\u0123\1\0\70\u0123\3\0\2\u01ea\1\0\4\u01ea"+
-    "\2\0\1\u0125\1\u01ea\1\0\4\u01ea\1\0\11\u01ea\1\0"+
-    "\40\u01ea\2\0\4\u01ea\2\0\1\u01ea\14\u0133\1\u0131\1\u0133"+
-    "\1\0\70\u0133\3\0\2\u01eb\1\0\4\u01eb\2\0\1\u0135"+
-    "\1\u01eb\1\0\4\u01eb\1\0\11\u01eb\1\0\40\u01eb\2\0"+
-    "\4\u01eb\2\0\1\u01eb\2\231\1\0\4\231\1\u01ec\101\231"+
-    "\1\0\33\231\1\u01ed\50\231\14\u013d\1\u013b\1\u013d\1\0"+
-    "\70\u013d\3\0\2\u01ee\1\0\4\u01ee\2\0\1\u013f\1\u01ee"+
-    "\1\0\4\u01ee\1\0\11\u01ee\1\0\40\u01ee\2\0\4\u01ee"+
-    "\2\0\1\u01ee\2\240\1\0\4\240\1\u01ef\101\240\1\0"+
-    "\33\240\1\u01f0\50\240\2\0\1\u01f1\104\0\7\263\1\u01f2"+
-    "\2\263\1\0\1\263\1\0\1\u014b\67\263\1\0\1\263"+
-    "\12\u014e\1\0\1\u014e\1\0\1\u014e\1\0\70\u014e\7\u014f"+
-    "\1\u01f3\4\u014f\1\u0150\106\u014f\1\u0150\21\u014f\1\u01f4\50\u014f"+
-    "\7\u0153\1\u01f5\2\u0153\1\u0154\106\u0153\1\u0154\23\u0153\1\u01f6"+
-    "\50\u0153\7\301\1\u01f7\2\301\1\0\71\301\1\u0157\1\0"+
-    "\1\301\12\u01f8\1\u01f9\72\u01f8\1\0\1\u01f8\7\305\1\u01fa"+
-    "\4\305\1\0\67\305\1\u015a\1\0\1\305\14\u01fb\1\u01f9"+
-    "\70\u01fb\1\0\1\u01fb\7\310\1\u01fc\2\310\1\0\1\310"+
-    "\1\0\70\310\1\0\1\310\7\u015f\1\u01fd\4\u015f\1\u0160"+
-    "\106\u015f\1\u0160\21\u015f\1\u01fe\50\u015f\7\u0163\1\u01ff\2\u0163"+
-    "\1\u0164\106\u0163\1\u0164\23\u0163\1\u0200\50\u0163\7\326\1\u0201"+
-    "\2\326\1\0\71\326\1\u0167\1\0\1\326\12\u0202\1\u0203"+
-    "\72\u0202\1\0\1\u0202\7\332\1\u0204\4\332\1\0\67\332"+
-    "\1\u016a\1\0\1\332\14\u0205\1\u0203\70\u0205\1\0\1\u0205"+
-    "\37\0\1\u0206\141\0\1\u01dc\34\0\1\u01de\15\0\3\u01de"+
-    "\2\0\1\u01de\11\0\1\u01de\1\0\2\u01de\7\0\1\u01de"+
-    "\1\0\1\u01dd\2\u01de\6\0\1\u01de\11\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\7\112\1\u0207\3\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\112\6\0\1\112\6\0\6\112\1\0\6\112\1\u0208"+
-    "\4\112\1\0\13\112\1\0\1\112\1\u0208\2\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u0209\4\166\1\0\6\166\1\u020a"+
-    "\4\166\1\0\4\166\1\0\11\166\2\0\1\166\53\0"+
-    "\1\u020b\5\0\1\u020b\73\0\1\u020c\14\0\1\u020c\66\0"+
-    "\1\u020d\11\0\1\u020d\74\0\1\u020e\11\0\1\u020e\77\0"+
-    "\1\u020f\14\0\1\u020f\23\0\2\231\1\0\34\231\1\u0210"+
-    "\47\231\2\240\1\0\34\240\1\u0211\47\240\14\u014f\1\u0150"+
-    "\22\u014f\1\u0212\47\u014f\12\u0153\1\u0154\24\u0153\1\u0213\47\u0153"+
-    "\12\u01f8\1\u01b7\71\u01f8\1\u0214\1\u01b7\1\u01f8\14\u01fb\1\u01bd"+
-    "\67\u01fb\1\u0215\1\u01bd\1\u01fb\14\u015f\1\u0160\22\u015f\1\u0216"+
-    "\47\u015f\12\u0163\1\u0164\24\u0163\1\u0217\47\u0163\12\u0202\1\u01d1"+
-    "\71\u0202\1\u0218\1\u01d1\1\u0202\14\u0205\1\u01d7\67\u0205\1\u0219"+
-    "\1\u01d7\1\u0205\40\0\1\u021a\54\0\4\112\6\0\1\112"+
-    "\6\0\6\112\1\0\13\112\1\0\4\112\1\u021b\6\112"+
-    "\1\0\4\112\1\0\11\112\2\0\1\112\6\0\4\112"+
-    "\6\0\1\112\6\0\6\112\1\0\3\112\1\u021c\7\112"+
-    "\1\0\4\112\1\u021c\6\112\1\0\4\112\1\0\11\112"+
-    "\2\0\1\112\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\11\166\1\u021d\1\166\1\0\13\166\1\0\4\166"+
-    "\1\0\11\166\2\0\1\166\6\0\4\166\6\0\1\166"+
-    "\6\0\6\166\1\0\10\166\1\u021e\2\166\1\0\13\166"+
-    "\1\0\4\166\1\0\11\166\2\0\1\166\54\0\1\u021f"+
-    "\24\0\1\u021f\52\0\1\u0220\20\0\1\u0220\70\0\1\u0221"+
-    "\13\0\1\u0221\53\0\2\u0222\112\0\1\u0223\35\0\1\u0223"+
-    "\12\0\2\231\1\0\35\231\1\u0224\46\231\2\240\1\0"+
-    "\35\240\1\u0225\46\240\14\u014f\1\u0150\23\u014f\1\u0226\46\u014f"+
-    "\12\u0153\1\u0154\25\u0153\1\u0227\46\u0153\12\u01f8\1\u0228\71\u01f8"+
-    "\1\u0214\1\u01b7\1\u01f8\14\u01fb\1\u0229\67\u01fb\1\u0215\1\u01bd"+
-    "\1\u01fb\14\u015f\1\u0160\23\u015f\1\u022a\46\u015f\12\u0163\1\u0164"+
-    "\25\u0163\1\u022b\46\u0163\12\u0202\1\u022c\71\u0202\1\u0218\1\u01d1"+
-    "\1\u0202\14\u0205\1\u022d\67\u0205\1\u0219\1\u01d7\1\u0205\41\0"+
-    "\1\u022e\53\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\13\112\1\0\7\112\1\u022f\3\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\11\166\1\u0230\1\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\6\166\1\u0231\4\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\43\0"+
-    "\1\u0232\11\0\1\u0232\72\0\1\u0233\14\0\1\u0233\71\0"+
-    "\1\u0234\14\0\1\u0234\30\0\2\231\1\0\36\231\1\u0235"+
-    "\45\231\2\240\1\0\36\240\1\u0236\45\240\14\u014f\1\u0150"+
-    "\24\u014f\1\u0237\45\u014f\12\u0153\1\u0154\26\u0153\1\u0238\45\u0153"+
-    "\14\u015f\1\u0160\24\u015f\1\u0239\45\u015f\12\u0163\1\u0164\26\u0163"+
-    "\1\u023a\45\u0163\40\0\1\u023b\54\0\4\112\6\0\1\112"+
-    "\6\0\5\112\1\u023c\1\0\13\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u023d"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\5\166\1\u023e"+
-    "\5\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\2\231\1\0\35\231\1\u023f\46\231\2\240\1\0"+
-    "\35\240\1\u0240\46\240\14\u014f\1\u0150\23\u014f\1\u0241\46\u014f"+
-    "\12\u0153\1\u0154\25\u0153\1\u0242\46\u0153\14\u015f\1\u0160\23\u015f"+
-    "\1\u0243\46\u015f\12\u0163\1\u0164\25\u0163\1\u0244\46\u0163\35\0"+
-    "\1\u0245\57\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\5\112\1\u0246\5\112\1\0\13\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\1\166\1\u0247\7\166\2\0\1\166\2\231\1\0\32\231"+
-    "\1\u0248\51\231\2\240\1\0\32\240\1\u0249\51\240\14\u014f"+
-    "\1\u0150\20\u014f\1\u024a\51\u014f\12\u0153\1\u0154\22\u0153\1\u024b"+
-    "\51\u0153\14\u015f\1\u0160\20\u015f\1\u024c\51\u015f\12\u0163\1\u0164"+
-    "\22\u0163\1\u024d\51\u0163\6\0\4\112\6\0\1\112\6\0"+
-    "\6\112\1\0\7\112\1\u024e\3\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u024f"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\112\6\0\1\112\6\0\6\112\1\0\13\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\u0250\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\10\166\1\u0251"+
-    "\2\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\5\112\1\u0252\5\112\1\0\13\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\4\166\1\u0253\6\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\5\112\1\u0254\5\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\5\166\1\u0255"+
-    "\5\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\13\112\1\0\4\112\1\u0256\6\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\u0257\4\u0258\6\u0257\1\u0258\5\u0257"+
-    "\1\0\6\u0258\1\u0257\13\u0258\1\u0257\13\u0258\1\u0257\4\u0258"+
-    "\1\u0257\11\u0258\2\u0257\1\u0258\42\0\1\u0259\3\0\1\u025a"+
-    "\7\0\1\u025b\1\u025c\21\0\1\u025d\13\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\4\166\1\u025e\3\166\1\u025f"+
-    "\2\166\1\0\4\166\1\u0260\1\u0261\5\166\1\0\4\166"+
-    "\1\0\6\166\1\u0262\2\166\2\0\1\166\57\0\1\u0263"+
-    "\77\0\1\u0264\115\0\1\u0265\105\0\1\u0266\107\0\1\u0267"+
-    "\35\0\4\166\6\0\1\166\6\0\6\166\1\0\13\166"+
-    "\1\0\5\166\1\u0268\5\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\12\166\1\u0269\1\0\13\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\5\166\1\u026a\5\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u026b"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\5\166\1\u026c\5\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\44\0\1\u026d\136\0\1\u026e\107\0\1\u026f\67\0"+
-    "\1\u0270\125\0\1\u0271\17\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u0272\4\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\13\166\1\0"+
-    "\4\166\1\0\1\166\1\u0273\7\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\2\166\1\u0274\6\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\4\166\1\u0275\6\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\2\166\1\u0276\6\166\2\0\1\166\46\0\1\u0277\74\0"+
-    "\1\u0278\106\0\1\u0279\116\0\1\u027a\105\0\1\u027b\51\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\10\166\1\u027c"+
-    "\2\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\5\166\1\u027d"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\5\166"+
-    "\1\u027e\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u027f\4\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\5\166\1\u0280\5\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\57\0"+
-    "\1\u0281\131\0\1\u0282\52\0\1\u0283\106\0\1\u0284\46\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\5\166\1\u0285\5\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\7\166\1\u0286"+
-    "\1\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\10\166\1\u0287\2\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\10\166\1\u0288\2\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\103\0"+
-    "\1\u0289\63\0\1\u0271\131\0\1\u027b\106\0\1\u028a\11\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\10\166\1\u028b\2\0\1\166"+
-    "\6\0\4\166\6\0\1\166\6\0\6\166\1\0\13\166"+
-    "\1\0\6\166\1\u0276\4\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\10\166"+
-    "\1\u0280\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\10\166\1\u028c\2\0\1\166\34\0\1\u0271\154\0\1\u028d"+
-    "\12\0\4\166\6\0\1\166\6\0\5\166\1\u0276\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\7\166\1\u028e"+
-    "\1\166\2\0\1\166\56\0\1\u0271\36\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u0276"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166";
-
-  /** 
-   * The transition table of the DFA
-   */
-  final private static int yytrans [] = yy_unpack(yy_packed);
-
-
-  /* error codes */
-  final private static int YY_UNKNOWN_ERROR = 0;
-  // final private static int YY_ILLEGAL_STATE = 1;
-  final private static int YY_NO_MATCH = 2;
-  final private static int YY_PUSHBACK_2BIG = 3;
-
-  /* error messages for the codes above */
-  final private static String YY_ERROR_MSG[] = {
-    "Unkown internal scanner error",		//$NON-NLS-1$
-    "Internal error: unknown state",		//$NON-NLS-1$
-    "Error: could not match input",		//$NON-NLS-1$
-    "Error: pushback value was too large"	//$NON-NLS-1$
-  };
-
-  /**
-   * YY_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
-   */
-  private final static byte YY_ATTRIBUTE[] = {
-     1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1, 
-     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0,  0,  0, 
-     0,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  9,  1, 
-     9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1, 
-     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
-     1,  9,  9,  1,  9,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9, 
-     1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  3,  3,  3,  3,  9,  9, 
-     1,  1,  1,  9,  1,  1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  3, 
-     3,  3,  3,  9,  9,  1,  1,  1,  9,  1,  1,  1,  9,  9,  1,  1, 
-     0,  1,  0,  9,  1,  2,  1,  2,  1,  0,  0,  0,  9,  1,  1,  1, 
-     9,  9,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  0, 
-     0,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  9,  1,  1,  0,  1, 
-     0,  9,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9,  0,  0,  0,  0, 
-     9,  0,  0,  0,  1,  0,  0,  1,  0,  0,  9,  0,  0,  1,  0,  0, 
-     9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  9,  0,  0,  0,  1,  0, 
-     1,  1,  0,  0,  9,  9,  9,  0,  9,  9,  1,  1,  1,  1,  2, 13, 
-     3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  1,  1,  2, 13, 
-     3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  0,  9,  9,  9, 
-     0,  0,  1,  1,  1,  9,  0,  0, 13,  9, 13,  9,  9,  1,  1,  1, 
-     0,  0,  1,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0,  0,  1, 
-     0,  0,  1,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1, 
-     1,  0,  1,  1,  1,  1,  1,  0,  2,  3,  3,  3,  2,  2,  3,  3, 
-     3,  2,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1, 
-     1,  1,  2,  3,  3,  3,  2,  2,  3,  3,  3,  2,  1,  1,  1,  1, 
-     0,  0,  1,  1,  1,  1,  0,  0,  9,  9,  0,  1,  9,  0,  1,  1, 
-     1,  5, 13, 13,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  1,  1, 
-     9,  1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  1,  3,  2,  3,  2, 
-     1,  0,  9,  1,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  1, 
-     1,  2,  2,  0,  0,  2,  2,  0,  0,  0,  1,  1,  1,  1,  0,  0, 
-     0,  9,  9,  1,  1,  2,  2,  1,  1,  2,  2,  1,  1,  0,  1,  1, 
-     1,  9,  9,  9,  1,  1,  2,  2,  2,  2,  0,  1,  1,  1,  1,  1, 
-     2,  2,  2,  2,  9,  1,  1,  1,  1,  3,  3,  3,  3,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  0,  1,  0,  0,  0,  0,  0,  1,  1,  1, 
-     1,  1,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  1,  0, 
-     0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  9,  1,  1,  1,  1,  1, 
-     0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1,  0,  1
-  };
-
-  /** the input device */
-  private java.io.Reader yy_reader;
-
-  /** the current state of the DFA */
-  private int yy_state;
-
-  /** the current lexical state */
-  private int yy_lexical_state = YYINITIAL;
-
-  /** this buffer contains the current text to be matched and is
-      the source of the yytext() string */
-  private char yy_buffer[] = new char[16384];
-
-  /** the textposition at the last accepting state */
-  private int yy_markedPos;
-
-  /** the textposition at the last state to be included in yytext */
-  private int yy_pushbackPos;
-
-  /** the current text position in the buffer */
-  private int yy_currentPos;
-
-  /** startRead marks the beginning of the yytext() string in the buffer */
-  private int yy_startRead;
-
-  /** endRead marks the last character in the buffer, that has been read
-      from input */
-  private int yy_endRead;
-
-  /** number of newlines encountered up to the start of the matched text */
-  private int yyline;
-
-  /** the number of characters up to the start of the matched text */
-  private int yychar;
-
-  /**
-   * the number of characters from the last newline up to the start of the 
-   * matched text
-   */
-  // private int yycolumn; 
-
-  /** 
-   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
-   */
-  // private boolean yy_atBOL;
-
-  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
-  private boolean yy_atEOF;
-
-  /** denotes if the user-EOF-code has already been executed */
-  private boolean yy_eof_done;
-
-  /* user code: */
-	private int fTokenCount = 0;
- 
-	// required holders for white-space compacting
-	private boolean fShouldLoadBuffered = false;
-	private String fBufferedContext = null;
-	private int fBufferedStart = 1;
-	private int fBufferedLength = 0;
-	private ContextRegionContainer fBufferedEmbeddedContainer = null;
-	private String f_context = null;
-
-	// state stack for handling embedded regions
-	private IntStack fStateStack = new IntStack();
-	// a "hint" as to what an embedded region should be evaluated
-	private String fEmbeddedHint = UNDEFINED;
-	// a "hint" as to what state to enter once an embedded region has
-	//   been completed
-	private int fEmbeddedPostState = YYINITIAL;
-	// the container used to create embedded regions
-	private ContextRegionContainer fEmbeddedContainer = null;
-	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";
-
-	private String context = null;
-	private int start = 0;
-	private int textLength = 0;
-	private int length = 0;
-
-	// offset for tracking position specific block tags
-	private int fOffset = 0;
-	
-	// the name of the current tag being opened
-	private String fCurrentTagName = null;
-
-	// the name of the current tag inside of an embedded region
-	private String internalTagName = null;
-	private String internalContext = null;
-
-	// the list of tag name BlockMarkers
-	private List fBlockMarkers = new ArrayList(0);
-	private List fNestablePrefixes = new ArrayList(1);
-	
-	// where the last internal container block was found
-	private int fLastInternalBlockStart = -1;
-
-	// required to not seek text blocks on an end tag
-	private boolean fIsBlockingEnabled = false;
-	private boolean fIsCaseSensitiveBlocking = true;
-
-	private static final boolean fForbidJSP = false;
-	
-	private int fELlevel = 0;
-
-	private JSPParserRegionFactory fRegionFactory = new JSPParserRegionFactory();
-
-	/**
-	 * user method 
-	 */
-	public final void addBlockMarker(BlockMarker marker) {
-		if(containsTagName(marker.getTagName()))
-			return;
-		fBlockMarkers.add(marker);
-	}
-	/**
-	 * user method
-	 */
-	public final void addNestablePrefix(TagMarker marker) {
-		fNestablePrefixes.add(marker);
-	}
-	/* user method */
-	public List getNestablePrefixes() {
-		return fNestablePrefixes;
-	}
-	/**
-	 * user method
-	 */
-	private boolean isNestable(String tagName) {
-		//Iterator blocks = fNestablePrefixes.iterator();
-		//while(blocks.hasNext()) {
-		//	TagMarker marker = (TagMarker)blocks.next();
-		//	String markerName = marker.getTagName();
-		//	if(tagName.length() > markerName.length() + 1 && tagName.startsWith(markerName) && tagName.charAt(markerName.length()) == ':') {
-		//		return marker.isGlobal() || getOffset() >= marker.getMarker().getStart();
-		//	}
-		//}
-		//return false;
-		return true;
-	}
-	/**
-	 * user method 
-	 */
-	public final void removeNestablePrefix(String name) {
-		if (fNestablePrefixes != null) {
-			Iterator nestables = fNestablePrefixes.iterator();
-			while (nestables.hasNext()) {
-				if (((TagMarker) nestables.next()).getTagName().equalsIgnoreCase(name))
-					nestables.remove();
-			}
-		}
-	}
-	/**
-	 * user method 
-	 */
-	public final void removeBlockMarker(BlockMarker marker) {
-		fBlockMarkers.remove(marker);
-	}
-	/**
-	 * user method 
-	 */
-	public final void removeBlockMarker(String tagname) {
-		if (fBlockMarkers != null) {
-			Iterator blocks = fBlockMarkers.iterator();
-			while (blocks.hasNext()) {
-				if (((BlockMarker) blocks.next()).getTagName().equals(tagname))
-					blocks.remove();
-			}
-		}
-	}
-	/* user method */
-	private final void assembleEmbeddedTagSequence(String startType, String endTagName) {
-		assembleEmbeddedContainer(startType, null, endTagName);
-	}
-	/* user method */
-	private final void assembleEmbeddedContainer(String startType, String[] endTypes) {
-		assembleEmbeddedContainer(startType, endTypes, null);
-	}
-	/* user method */
-	private final void assembleEmbeddedContainer(String startType, String endType) {
-		assembleEmbeddedContainer(startType, new String[]{endType}, null);
-	}
-	/**
-	 *  user method 
-	 * 
-	 * Assembles an embedded container beginning with the given startType as
-	 * the first ContextRegion within it and of the type fEmbeddedHint.  The
-	 * endTypes[] array contains the context types that will cause a successful
-	 * exit.  Use of the endTagName parameter alters this behavior to force an
-	 * exit on an XML_TAG_CLOSE after seeing an XML_TAG_NAME whose significant
-	 * text matches the endTagName String.  All contents in between are
-	 * insignificant, and yes, this means comments are allowed inside.
-	 **/
-	private final void assembleEmbeddedContainer(String startType, String[] endTypes, String endTagName) {
-		// the context of the region being added to the embedded container
-		internalContext = startType;
-		// keep track of where this container began; to provide relative indeces for the regions
-		int containerStart = yychar;
-		boolean notFinished = true;
-		// keep track of where we seem to be so that the endTagName can be checked
-		boolean isInEndTag = false;
-		boolean isInFirstTag = true;
-		// create the embedded container and setup its "type"
-		if (fEmbeddedContainer == null) {
-			fEmbeddedContainer = new ContextRegionContainer();
-			fEmbeddedContainer.setType(fEmbeddedHint);
-			fEmbeddedContainer.setStart(containerStart);
-			// TODO: parent region needs to be set .... but not sure where to get it from 
-			//		fEmbeddedContainer.setParent(parentRegion);
-		}
-		containerStart = fEmbeddedContainer.getStart();
-		while (notFinished) {
-			// add the region to the container
-			if (internalContext != null && internalContext != PROXY_CONTEXT) {
-				ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
-				fEmbeddedContainer.getRegions().add(newToken);
-				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
-				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
-				// DW, 4/16/2003 token regions no longer have parents
-				//newToken.setParent(fEmbeddedContainer);
-			}
-			try {
-				// longscan determines whether to attempt a blockTagScan within the embedded container
-				boolean longscan = false;
-				// save the tokenizer state in case of a block tag scan
-				int previousState = yystate();
-				String previousCurrentTagName = fCurrentTagName;
-				int previousPostState = fEmbeddedPostState;
-				String previousEmbeddedHint = fEmbeddedHint;
-				// determine if a block tag scan is necessary
-				if (internalContext == XML_TAG_NAME) {
-					internalTagName = yytext();
-					if(!isNestable(internalTagName)) {
-						internalTagName = null;
-						// snagged a tag name we shouldn't have
-						fEmbeddedPostState = ST_ABORT_EMBEDDED;
-						notFinished = false;
-					}
-				}
-				else if (internalContext == XML_TAG_OPEN || internalContext == XML_END_TAG_OPEN) {
-					internalTagName = null;
-				}
-				// do upkeep for endTagName usage; must be here since the next token could be the close
-				if (internalContext == XML_END_TAG_OPEN) {
-					isInEndTag = true;
-				} else if (internalContext == XML_TAG_CLOSE) {
-					isInFirstTag = isInEndTag = false;
-				} else {
-				 	ITextRegionList embeddedRegions = fEmbeddedContainer.getRegions();
-					if (embeddedRegions.size() > 2 && (embeddedRegions.get(embeddedRegions.size()-1)).getType() == XML_TAG_CLOSE && (embeddedRegions.get(embeddedRegions.size() - 3)).getType() == XML_TAG_OPEN && internalTagName != null) {
-						if (containsTagName(internalTagName)) {
-							longscan = true;
-							yybegin(ST_BLOCK_TAG_SCAN);
-						}
-					}
-				}
-				if (longscan)
-					fCurrentTagName = internalTagName;
-				// read the next region and context
-				internalContext = primGetNextToken();
-				if (longscan) {
-					// Returning from a block tag scan requires restoring some state variables
-					// as well as handling the block region and setting up for normal scanning
-					// inside the embedded container
-					ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
-					fEmbeddedContainer.getRegions().add(newToken);
-					fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
-					fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
-					// DW, 4/16/2003 token regions no longer have parents
-					// newToken.setParent(fEmbeddedContainer);
-					longscan = false;
-					fEmbeddedPostState = previousPostState;
-					fEmbeddedHint = previousEmbeddedHint;
-					fCurrentTagName = previousCurrentTagName;
-					yybegin(previousState);
-					internalContext = primGetNextToken();
-				}
-			} catch (IOException e) {
-				// primGetNextToken() calls may throw an IOException
-				// catch and do nothing since the isEOF check below
-				// will properly exit if the input was too short
-			} catch (Exception f) {
-				// some other exception happened; never should
-				Logger.logException(f);
-			}
-			boolean isEndingType = yystate() == ST_ABORT_EMBEDDED;
-			if(!isEndingType) {
-				// check for ending context
-				if (endTagName == null) {
-					for (int i = 0; i < endTypes.length; i++) {
-						isEndingType = isEndingType || (internalContext == endTypes[i]);
-					}
-				}
-				else {
-					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);
-				}
-			}
-			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
-			notFinished = notFinished && ((!isEndingType) && !isEOF() && (endTagName != null || internalContext != UNDEFINED) && !(internalContext == PROXY_CONTEXT && (embeddedList.get(embeddedList.size()-1)).getType() == UNDEFINED));
-		}
-		// finish adding the last context
-		if (internalContext != null && internalContext != PROXY_CONTEXT) {
-			ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
-			fEmbeddedContainer.getRegions().add(newToken);
-			// DW, 4/16/2003 token regions no longer have parents
-			//newToken.setParent(fEmbeddedContainer);
-			fEmbeddedContainer.setLength(yychar - containerStart + yylength());
-			fEmbeddedContainer.setTextLength(yychar - containerStart + yylength());
-		}
-		yybegin(fEmbeddedPostState);
-	}
-	/* user method */
-	public final boolean isCaseSensitiveBlocking() {
-		return fIsCaseSensitiveBlocking;
-	}
-	/* user method */
-	public final void setCaseSensitiveBlocking(boolean newValue) {
-		fIsCaseSensitiveBlocking = newValue;
-	}
-	/* user method */
-	public boolean getBlockMarkerAllowsJSP() {
-		return getBlockMarkerAllowsJSP(fCurrentTagName);
-	}
-	/* user method */
-	public boolean getBlockMarkerAllowsJSP(String name) {
-		Iterator iterator = fBlockMarkers.iterator();
-		while(iterator.hasNext()) {
-			BlockMarker marker = (BlockMarker)iterator.next();
-			boolean casesensitive = marker.isCaseSensitive();
-			if(casesensitive && marker.getTagName().equals(name))
-				return marker.allowsJSP();
-			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
-				return marker.allowsJSP();
-		}
-		return true;
-	}
-	/* user method */
-	public boolean getBlockMarkerCaseSensitivity() {
-		return getBlockMarkerCaseSensitivity(fCurrentTagName);
-	}
-	public boolean getBlockMarkerCaseSensitivity(String name) {
-		Iterator iterator = fBlockMarkers.iterator();
-		while(iterator.hasNext()) {
-			BlockMarker marker = (BlockMarker)iterator.next();
-			boolean casesensitive = marker.isCaseSensitive();
-			if(casesensitive && marker.getTagName().equals(name))
-				return casesensitive;
-			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
-				return casesensitive;
-		}
-		return true;
-	}
-	/* user method */
-	public String getBlockMarkerContext() {
-		return getBlockMarkerContext(fCurrentTagName);
-	}
-	/* user method */
-	public String getBlockMarkerContext(String name) {
-		Iterator iterator = fBlockMarkers.iterator();
-		while(iterator.hasNext()) {
-			BlockMarker marker = (BlockMarker)iterator.next();
-			if(marker.getTagName().equals(name))
-				return marker.getContext();
-		}
-		return BLOCK_TEXT;
-	}
-	/* user method */
-	public List getBlockMarkers() {
-		return fBlockMarkers;
-	}
-	/* user method */
-	public final int getOffset() {
-		return fOffset + yychar;
-	}
-	private final boolean isBlockMarker() {
-		return isBlockMarker(fCurrentTagName);
-	}
-	private final boolean isBlockMarker(String tagName) {
-		if (!fIsBlockingEnabled)
-			return false;
-		return containsTagName(tagName);
-	}
-	/**
-	 * user method
-	 */
-	public final void beginBlockTagScan(String newTagName) {
-		beginBlockMarkerScan(newTagName, BLOCK_TEXT);
-	}
-	/**
-	 * user method
-	 *
-	 * Special tokenizer setup.  Allows tokenization to be initiated at the
-	 * start of a text block within a "newTagName" tag.
-	 *
-	 * Example: 
-	 *	Tokenizer toker = new Tokenizer();
-	 *	toker.setCaseSensitiveBlocking(false);
-	 *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));
-	 *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);
-	 *	toker.getRegions(); 
-	 *
-	 * Returns:
-	 *	BLOCK_TEXT: 0-40
-	 *	XML_END_TAG_OPEN: 41-42
-	 *	XML_TAG_NAME: 43-48
-	 *	XML_TAG_CLOSE: 49-49
-	 *	XML_CONTENT: 50-57
-	 *
-	 */
-	public final void beginBlockMarkerScan(String newTagName, String blockcontext) {
-		yybegin(ST_BLOCK_TAG_SCAN);
-		fCurrentTagName = newTagName;
-	}
-
-/**
- * Method doScan.
- * 
- * Returns a context region for all of the text from the current position upto the end of input or
- * to right *before* the first occurence of searchString
- * 
- * @param searchString - target string to search for ex.: "-->", "</tagname"
- * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'
- * @param allowJSP - check for and allow for JSP markup <%%>
- * @param context - the context of the scanned region if non-zero length
- * @param exitState - the state to go to if the region was of non-zero length
- * @param abortState - the state to go to if the searchString was found immediately
- * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success
- * @throws IOException
- */
-private final String doScan(String searchString, boolean requireTailSeparator, boolean allowJSP, boolean allowCDATA, String searchContext, int exitState, int immediateFallbackState) throws IOException {
-	boolean stillSearching = true;
-	// Disable further block (probably)
-	fIsBlockingEnabled = false;
-	int searchStringLength = searchString.length();
-	int n = 0;
-	char lastCheckChar;
-	int i;
-	boolean same = false;
-	// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE
-	boolean checkJSPs = allowJSP && !fForbidJSP;
-	boolean checkedForJSPsOnce = !checkJSPs;
-	boolean checkedJSPsAtStartOnce = false;
-	
-	while (stillSearching) {
-		n = 0;
-		// Ensure that enough data from the input exists to compare against the search String.
-		n = yy_advance();
-		while(n != YYEOF && yy_currentPos < searchStringLength)
-			n = yy_advance();
-//		c = (char) n;
-		// If the input was too short or we've exhausted the input, stop immediately.
-		if (n == YYEOF && checkedForJSPsOnce) {
-			stillSearching = false;
-		}
-		else {
-			/**
-			 * Look for starting JSPs "<%"
-			 */
-			checkedForJSPsOnce = true;
-			// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs
-			// ---
-			// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
-			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
-			if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
-				yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-			// 2) yy_currentPos - jspstarter.length : There's not searchStringLength of input available; check for a JSP 2 spots back in what we could read
-			// ---
-			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
-			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
-			// spill over the end of the buffer while checking.
-			else if(checkJSPs && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
-					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-			// 3) yy_currentPos..(yy_currentPos+jspStartlength-1) : Check at the start of the block one time
-			// ---
-			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
-			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
-			else if(checkJSPs && !checkedJSPsAtStartOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
-					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
-				checkedJSPsAtStartOnce = true;
-				fLastInternalBlockStart = yy_markedPos = yy_startRead;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-
-
-			/**
-			 * Look for starting CDATA "<![CDATA["
-			 */
-			// 1) yy_currentPos - searchStringLength: There's at least searchStringLength of input available; once that's read, check for CDATA
-			// ---
-			// Look for a CDATA beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
-			// Ensure that we've not encountered a complete block (<[!CDATA[]]>) that was *shorter* than the closeTagString and
-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
-/*			if(checkCDATA && yy_currentPos > searchStringLength && yy_currentPos + searchStringLength < yy_buffer.length && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
-				charsMatch(cdataStarter, yy_buffer, 0, yy_currentPos - searchStringLength)) {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				// go to a state where CDATA can be found
-				if (fEmbeddedContainer == null) {
-					fEmbeddedContainer = new ContextRegionContainer();
-					fEmbeddedContainer.setType(searchContext);
-					fEmbeddedContainer.setStart(yychar);
-				}
-				ITextRegion newToken = fRegionFactory.createToken(searchContext, yychar, yylength(), yylength());
-				fEmbeddedContainer.getRegions().add(newToken);
-				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
-				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
-				yybegin(YYINITIAL);
-				String context = primGetNextToken();
-				if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {
-					assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);
-				}
-				yybegin(resumeState);
-				return searchContext;
-			}
-*//*
-			// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read
-			// ---
-			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
-			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
-			// spill over the end of the buffer while checking.
-			else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
-					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-			// 3) yy_currentPos : Check at the start of the block one time
-			// ---
-			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
-			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
-			else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
-					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
-				checkedForCDATAOnce = true;
-				fLastInternalBlockStart = yy_markedPos = yy_startRead;
-				yy_currentPos = yy_markedPos + 1;
-				int resumeState = yystate();
-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
-				if(yy_markedPos == yy_startRead) {
-					String jspContext = primGetNextToken();
-					yybegin(resumeState);
-					return jspContext;
-				}
-				return searchContext;
-			}
-*/
-			// Check the characters in the target versus the last targetLength characters read from the buffer
-			// and see if it matches
-			if (n == YYEOF) {
-				stillSearching = false;
-			}
-			else {
-				same = true;
-				// safety check for array accesses
-				if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
-					for(i = 0; i < searchStringLength; i++) {
-						if(same && fIsCaseSensitiveBlocking)
-							same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
-						else if(same && !fIsCaseSensitiveBlocking)
-							same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
-					}
-				}
-				// safety check failed; no match is possible right now
-				else {
-					same = false;
-				}
-			}
-			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
-				// Additional check for close tags to ensure that targetString="</script" doesn't match
-				// "</scriptS"
-				lastCheckChar = yy_buffer[yy_currentPos];
-				// Succeed on "</script>" and "</script "
-				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
-					stillSearching = false;
-			}
-			else {
-				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
-			}
-		}
-	}
-	if (n != YYEOF || same) {
-		// We've stopped short of the end or definitely found a match
-		yy_markedPos = yy_currentPos - searchStringLength;
-		yy_currentPos = yy_markedPos + 1;
-		// If the searchString occurs at the very beginning of what would have
-		// been a Block, resume scanning normally immediately
-		if (yy_markedPos == yy_startRead) {
-			yybegin(immediateFallbackState);
-			return primGetNextToken();
-		}
-	}
-	else {
-		// We ran through the rest of the input
-		yy_markedPos = yy_currentPos;
-		yy_currentPos++;
-	}
-	yybegin(exitState);
-	// If the ending occurs at the very beginning of what would have
-	// been a Block, resume scanning normally immediately
-	if(yy_markedPos == yy_startRead)
-		return primGetNextToken();
-	return searchContext;
-}
-/**
- * user method 
- * does a lookahead for the current tag name
- */
-private final String doBlockTagScan() throws IOException {
-	fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();
-	return doScan("</" + fCurrentTagName, true, getBlockMarkerAllowsJSP(), true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);
-}
-	/**
-	 * user method
-	 *
-	 * Converts the raw context String returned by the primGetNextToken()
-	 * method into a full ITextRegion by pulling in values for the
-	 * current offset within the scanning text.
-	 *
-	 * Returns null when EOF is encountered and attaches intermittently
-	 * discovered whitespace onto the end of useful regions.
-	 *
-	 * Note that this algorithm caches the token following the one being returned
-	 * so that whitespace can be collapsed.
-	 */
-	public final ITextRegion getNextToken() throws IOException {
-		fEmbeddedContainer = null;
-		// load the starting non-whitespace token (assume that it is so)
-		if (fShouldLoadBuffered) {
-			if (fBufferedEmbeddedContainer != null) {
-				ITextRegion container = fBufferedEmbeddedContainer;
-				fBufferedEmbeddedContainer = null;
-				fShouldLoadBuffered = false;
-				return container;
-			}
-			context = fBufferedContext;
-			start = fBufferedStart;
-			textLength = length = fBufferedLength;
-			fShouldLoadBuffered = false;
-		} else {
-			context = primGetNextToken();
-			if (context == PROXY_CONTEXT) {
-				return fEmbeddedContainer;
-			} else if (context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
-				if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
-					fCurrentTagName = yytext();
-				else
-					fCurrentTagName = null;
-			} else if (context == XML_TAG_OPEN) {
-				fIsBlockingEnabled = true;
-			} else if (context == XML_END_TAG_OPEN) {
-				fIsBlockingEnabled = false;
-			}
-			start = yychar;
-			textLength = length = yylength();
-			if (yy_atEOF) {
-				fTokenCount++;
-				return null;
-			}
-		}
-		// store the next token
-		f_context = primGetNextToken();
-		if (f_context == PROXY_CONTEXT) {
-			fBufferedEmbeddedContainer = fEmbeddedContainer;
-			fShouldLoadBuffered = true;
-		} else if (f_context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
-			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
-				fCurrentTagName = yytext();
-			else
-				fCurrentTagName = null;
-		} else if (f_context == XML_TAG_OPEN) {
-			fIsBlockingEnabled = true;
-		} else if (f_context == XML_END_TAG_OPEN) {
-			fIsBlockingEnabled = false;
-		}
-		fBufferedContext = f_context;
-		fBufferedStart = yychar;
-		fBufferedLength = yylength();
-		fShouldLoadBuffered = true;
-		if (fBufferedContext == WHITE_SPACE) {
-			fShouldLoadBuffered = false;
-			length += fBufferedLength;
-		}
-		if (context == null) {
-			// EOF
-			if (Debug.debugTokenizer) {
-				System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$
-			}
-			return null;
-		}
-		fTokenCount++;
-		return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);
-	}
-	/* user method */
-	public JSPTokenizer(){
-		super();
-	}
-	/* user method */
-	public JSPTokenizer(char[] charArray){
-			this(new CharArrayReader(charArray));
-	}
-	/* user method */
-	public void reset(char[] charArray) {
-		reset(new CharArrayReader(charArray), 0);
-	}
-	/* user method */
-	public void reset(char[] charArray, int newOffset) {
-		reset(new CharArrayReader(charArray), newOffset);
-	}
-	/* user method */
-	public void reset(java.io.InputStream in) {
-		reset(new java.io.InputStreamReader(in), 0);
-	}
-	/* user method */
-	public void reset(java.io.InputStream in, int newOffset) {
-		reset(new java.io.InputStreamReader(in), newOffset);
-	}
-	/* user method */
-	public void reset(java.io.Reader in) {
-		reset(in, 0);
-	}
-	/**
-	 * user method *
-	 *
-	 * Reset internal counters and vars to "newly created" values, in the hopes
-	 * that resetting a pre-existing tokenizer is faster than creating a new one.
-	 *
-	 * This method contains code blocks that were essentially duplicated from the
-	 * <em>generated</em> output of this specification before this method was
-	 * added.  Those code blocks were under the above copyright.
-	 */
-	public void reset(java.io.Reader in, int newOffset) {
-		if (Debug.debugTokenizer) {
-			System.out.println("resetting tokenizer");//$NON-NLS-1$
-		}
-		fOffset = newOffset;
-	
-		/* the input device */
-		yy_reader = in;
-	
-		/* the current state of the DFA */
-		yy_state = 0;
-	
-		/* the current lexical state */
-		yy_lexical_state = YYINITIAL;
-	
-		/* this buffer contains the current text to be matched and is
-		the source of the yytext() string */
-		java.util.Arrays.fill(yy_buffer, (char)0);
-	
-		/* the textposition at the last accepting state */
-		yy_markedPos = 0;
-	
-		/* the textposition at the last state to be included in yytext */
-		yy_pushbackPos = 0;
-	
-		/* the current text position in the buffer */
-		yy_currentPos = 0;
-	
-		/* startRead marks the beginning of the yytext() string in the buffer */
-		yy_startRead = 0;
-	
-		/** 
-		 * endRead marks the last character in the buffer, that has been read
-		 * from input 
-		 */
-		yy_endRead = 0;
-	
-		/* number of newlines encountered up to the start of the matched text */
-		yyline = 0;
-	
-		/* the number of characters up to the start of the matched text */
-		yychar = 0;
-	
-		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
-		yy_atEOF = false;
-	
-		/* denotes if the user-EOF-code has already been executed */
-		yy_eof_done = false;
-	
-	
-		/* user vars: */
-		fTokenCount = 0;
-	 
-		fShouldLoadBuffered = false;
-		fBufferedContext = null;
-		fBufferedStart = 1;
-		fBufferedLength = 0;
-		fStateStack = new IntStack();
-	
-		fLastInternalBlockStart = -1;
-	
-		context = null;
-		start = 0;
-		textLength = 0;
-		length = 0;
-	
-		fEmbeddedContainer = null;
-		
-		fELlevel = 0;
-	}
-	/**
-	 * user method
-	 *
-	 */
-	public BlockTokenizer newInstance() {
-		JSPTokenizer newInstance = new JSPTokenizer();
-		// global tagmarkers can be shared; they have no state and 
-		// are never destroyed (e.g. 'release')
-		for(int i = 0; i < fBlockMarkers.size(); i++) {
-			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);
-			if(blockMarker.isGlobal())
-				newInstance.addBlockMarker(blockMarker);
-		}
-		for(int i = 0; i < fNestablePrefixes.size(); i++) {
-			TagMarker marker = (TagMarker) fNestablePrefixes.get(i);
-			if(marker.isGlobal())
-				newInstance.addNestablePrefix(marker);
-		}
-		return newInstance;
-	}
-	/* user method */
-	private final String scanXMLCommentText() throws IOException {
-		// Scan for '-->' and return the text up to that point as
-		//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
-		//  case change to the ST_XML_COMMENT_END state and return the next
-		//  context as usual.
-		return doScan("-->", false, true, true, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);
-	}
-	/* user method */
-	private final String scanJSPCommentText() throws IOException {
-		// Scan for '--%>' and return the text up to that point as
-		//   JSP_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
-		//  case change to the ST_JSP_COMMENT_END state and return the next
-		//  context as usual.
-		return doScan("--%>", false, false, true, JSP_COMMENT_TEXT, ST_JSP_COMMENT_END, ST_JSP_COMMENT_END);
-	}
-
-
-  /**
-   * Creates a new scanner
-   * There is also a java.io.InputStream version of this constructor.
-   *
-   * @param   in  the java.io.Reader to read input from.
-   */
-  public JSPTokenizer(java.io.Reader in) {
-    this.yy_reader = in;
-  }
-
-  /**
-   * Creates a new scanner.
-   * There is also java.io.Reader version of this constructor.
-   *
-   * @param   in  the java.io.Inputstream to read input from.
-   */
-  public JSPTokenizer(java.io.InputStream in) {
-    this(new java.io.InputStreamReader(in));
-  }
-
-  /** 
-   * Unpacks the compressed DFA transition table.
-   *
-   * @param packed   the packed transition table
-   * @return         the unpacked transition table
-   */
-  private static int [] yy_unpack(String packed) {
-    int [] trans = new int[31595];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 8206) {
-      int count = packed.charAt(i++);
-      int value = packed.charAt(i++);
-      value--;
-      do trans[j++] = value; while (--count > 0);
-    }
-    return trans;
-  }
-
-  /** 
-   * Unpacks the compressed character translation table.
-   *
-   * @param packed   the packed character translation table
-   * @return         the unpacked character translation table
-   */
-  private static char [] yy_unpack_cmap(String packed) {
-    char [] map = new char[0x10000];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 1376) {
-      int  count = packed.charAt(i++);
-      char value = packed.charAt(i++);
-      do map[j++] = value; while (--count > 0);
-    }
-    return map;
-  }
-
-
-  /**
-   * Gets the next input character.
-   *
-   * @return      the next character of the input stream, EOF if the
-   *              end of the stream is reached.
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  private int yy_advance() throws java.io.IOException {
-
-    /* standard case */
-    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];
-
-    /* if the eof is reached, we don't need to work hard */ 
-    if (yy_atEOF) return YYEOF;
-
-    /* otherwise: need to refill the buffer */
-
-    /* first: make room (if you can) */
-    if (yy_startRead > 0) {
-      System.arraycopy(yy_buffer, yy_startRead, 
-                       yy_buffer, 0, 
-                       yy_endRead-yy_startRead);
-
-      /* translate stored positions */
-      yy_endRead-= yy_startRead;
-      yy_currentPos-= yy_startRead;
-      yy_markedPos-= yy_startRead;
-      yy_pushbackPos-= yy_startRead;
-      yy_startRead = 0;
-    }
-
-    /* is the buffer big enough? */
-    if (yy_currentPos >= yy_buffer.length) {
-      /* if not: blow it up */
-      char newBuffer[] = new char[yy_currentPos*2];
-      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
-      yy_buffer = newBuffer;
-    }
-
-    /* finally: fill the buffer with new input */
-    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
-                                            yy_buffer.length-yy_endRead);
-
-    if ( numRead == -1 ) return YYEOF;
-
-    yy_endRead+= numRead;
-
-    return yy_buffer[yy_currentPos++];
-  }
-
-    
-  /**
-   * Closes the input stream.
-   */
-  final public void yyclose() throws java.io.IOException {
-    yy_atEOF = true;            /* indicate end of file */
-    yy_endRead = yy_startRead;  /* invalidate buffer    */
-    yy_reader.close();
-  }
-
-
-  /**
-   * Returns the current lexical state.
-   */
-  final public int yystate() {
-    return yy_lexical_state;
-  }
-
-  /**
-   * Enters a new lexical state
-   *
-   * @param newState the new lexical state
-   */
-  final public void yybegin(int newState) {
-    yy_lexical_state = newState;
-  }
-
-
-  /**
-   * Returns the text matched by the current regular expression.
-   */
-  final public String yytext() {
-    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
-  }
-
-  /**
-   * Returns the length of the matched text region.
-   */
-  final public int yylength() {
-    return yy_markedPos-yy_startRead;
-  }
-
-
-  /**
-   * Reports an error that occured while scanning - from the SED JFlex skeleton
-   *
-   * @param   errorCode  the code of the errormessage to display
-   */
-  private void yy_ScanError(int errorCode) {
-    try {
-      Logger.log(Logger.ERROR, YY_ERROR_MSG[errorCode]);
-    }
-    catch (ArrayIndexOutOfBoundsException e) {
-      Logger.log(Logger.ERROR, YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
-    }
-    // DO NOT EXIT the VM on an error
-    // System.exit(1);
-  } 
-
-
-  /**
-   * Pushes the specified amount of characters back into the input stream.
-   *
-   * They will be read again by then next call of the scanning method
-   *
-   * @param number  the number of characters to be read again.
-   *                This number must not be greater than yylength()!
-   */
-  void yypushback(int number) {
-    if ( number > yylength() )
-      yy_ScanError(YY_PUSHBACK_2BIG);
-
-    yy_markedPos -= number;
-  }
-
-	/**
-	 * user method - skeleton.sed
-	 */
-	protected final boolean containsTagName(char[] markerTagName, int offset, int tagnameLength) {
-		for(int j = 0; j < fBlockMarkers.size(); j++) {
-			BlockMarker marker = (BlockMarker)fBlockMarkers.get(j);
-			if(marker.getTagName().length() == tagnameLength) {
-				boolean matchesSoFar = true;
-				for(int i = 0; i < tagnameLength && matchesSoFar; i++) {
-					if(marker.isCaseSensitive()) {
-						if(marker.getTagName().charAt(i) != markerTagName[i + offset])
-							matchesSoFar = false;
-					}
-					else {
-						if(Character.toLowerCase(marker.getTagName().charAt(i)) != Character.toLowerCase(markerTagName[i + offset]))
-							matchesSoFar = false;
-					}
-				}
-				if(matchesSoFar)
-					return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * user method - skeleton.sed
-	 *
-	 * Return ALL of the regions scannable within the remaining text
-	 * Note: for verification use
-	 */
-	public final List getRegions() {
-		List tokens = new ArrayList();
-		ITextRegion region = null;
-		try {
-			region = getNextToken();
-			while(region != null) {
-				if (region != null) {
-					tokens.add(region);
-				}
-				region = getNextToken();
-			}
-		}
-		catch (StackOverflowError e) {
-			Logger.logException(getClass().getName()+": input could not be tokenized correctly at position " + getOffset(), e);//$NON-NLS-1$
-			throw e;
-		}
-		catch (Exception e) {
-			// Since this is convenience method and NOT the recommended 
-			// way of getting tokens, many errors are simply hidden
-			Logger.logException("Exception not handled retrieving regions: " + e.getLocalizedMessage(), e);//$NON-NLS-1$
-		}
-		return tokens;
-	}
-	/**
-	 * user method - skeleton.sed
-	 */
-	private final void dump(String s) {
-		if (Debug.debugTokenizer) {
-			System.out.println(s + " (" + yychar + "-" + //$NON-NLS-2$//$NON-NLS-1$
-				(yylength() + yychar) + "):\'" +//$NON-NLS-1$
-					StringUtils.escape(yytext()) + "\'");//$NON-NLS-1$
-		}
-	}
-	/* user method  - skeleton.sed */
-	public final boolean isEOF() {
-		return yy_atEOF;
-	}
-/* user method - skeleton.sed */
-protected final boolean containsTagName(String markerTagName) {
-	Iterator blocks = fBlockMarkers.iterator();
-	while(blocks.hasNext()) {
-		BlockMarker marker = (BlockMarker)blocks.next();
-		if(marker.isCaseSensitive()) {
-			if(marker.getTagName().equals(markerTagName))
-				return true;
-		}
-		else {
-			if(marker.getTagName().equalsIgnoreCase(markerTagName))
-				return true;
-		}
-	}
-	return false;
-}
-
-  /**
-   * Contains user EOF-code, which will be executed exactly once,
-   * when the end of file is reached
-   */
-  private void yy_do_eof() {
-    if (!yy_eof_done) {
-      yy_eof_done = true;
-    // do nothing, this is the downstream parser's job
-
-    }
-  }
-
-
-  /**
-   * Resumes scanning until the next regular expression is matched,
-   * the end of input is encountered or an I/O-Error occurs.
-   *
-   * @return      the next token
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  public String primGetNextToken() throws java.io.IOException {
-    int yy_input;
-    int yy_action;
-
-    yy_pushbackPos = -1;
-    boolean yy_was_pushback;
-
-    while (true) {
-
-      yychar+= yylength();
-
-      boolean yy_counted = false;
-      for (yy_currentPos = yy_startRead; yy_currentPos < yy_markedPos;
-                                                      yy_currentPos++) {
-        switch (yy_buffer[yy_currentPos]) {
-        case '\r':
-          yyline++;
-          yy_counted = true;
-          break;
-        case '\n':
-          if (yy_counted)
-            yy_counted = false;
-          else {
-            yyline++;
-          }
-          break;
-        default:
-          yy_counted = false;
-        }
-      }
-
-      if (yy_counted) {
-        if ( yy_advance() == '\n' ) yyline--;
-        if ( !yy_atEOF ) yy_currentPos--;
-      }
-
-      yy_action = -1;
-
-      yy_currentPos = yy_startRead = yy_markedPos;
-
-      yy_state = yy_lexical_state;
-
-      yy_was_pushback = false;
-
-      yy_forAction: {
-        while (true) {
-    
-          yy_input = yy_advance();
-
-          if ( yy_input == YYEOF ) break yy_forAction;
-
-          int yy_next = yytrans[ yy_rowMap[yy_state] + yycmap[yy_input] ];
-          if (yy_next == -1) break yy_forAction;
-          yy_state = yy_next;
-
-          int yy_attributes = YY_ATTRIBUTE[yy_state];
-          if ( (yy_attributes & 2) > 0 )
-            yy_pushbackPos = yy_currentPos;
-
-          if ( (yy_attributes & 1) > 0 ) {
-            yy_was_pushback = (yy_attributes & 4) > 0;
-            yy_action = yy_state; 
-            yy_markedPos = yy_currentPos; 
-            if ( (yy_attributes & 8) > 0 ) break yy_forAction;
-          }
-
-        }
-      }
-
-      if (yy_was_pushback)
-        yy_markedPos = yy_pushbackPos;
-
-      switch (yy_action) {    
-
-        case 622: 
-        case 627: 
-        case 634: 
-        case 639: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("jsp directive tag name");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return JSP_DIRECTIVE_NAME;
- }
-        case 655: break;
-        case 597: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XSL processing instruction target");//$NON-NLS-1$
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 656: break;
-        case 580: 
-        case 583: 
-        case 584: 
-        case 585: 
-        case 586: 
-        case 587: 
-        case 588: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nCDATA start");//$NON-NLS-1$
-	fStateStack.push(yystate());
-	yybegin(ST_CDATA_TEXT);
-	return XML_CDATA_OPEN;
- }
-        case 657: break;
-        case 572: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("jsp:root tag name");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return JSP_ROOT_TAG_NAME;
- }
-        case 658: break;
-        case 563: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("element");//$NON-NLS-1$
-	yybegin(ST_XML_ELEMENT_DECLARATION);
-	return XML_ELEMENT_DECLARATION;
- }
-        case 659: break;
-        case 562: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist");//$NON-NLS-1$
-	yybegin(ST_XML_ATTLIST_DECLARATION);
-	return XML_ATTLIST_DECLARATION;
- }
-        case 660: break;
-        case 561: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype");//$NON-NLS-1$
-	yybegin(ST_XML_DOCTYPE_DECLARATION);
-	return XML_DOCTYPE_DECLARATION;
- }
-        case 661: break;
-        case 546: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype external id");//$NON-NLS-1$
-	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_PUBREF;
-	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
-	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
- }
-        case 662: break;
-        case 545: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype external id");//$NON-NLS-1$
-	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_SYSREF;
-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
-	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
- }
-        case 663: break;
-        case 539: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction target");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_DHTML_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 664: break;
-        case 514: 
-        case 555: 
-        case 556: 
-          { 
-	return JSP_VBL_QUOTED_CONTENT;
- }
-        case 665: break;
-        case 504: 
-        case 551: 
-        case 552: 
-          { 
-	return JSP_EL_QUOTED_CONTENT;
- }
-        case 666: break;
-        case 496: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nJSP comment close");//$NON-NLS-1$
-	yybegin(YYINITIAL);
-	return JSP_COMMENT_CLOSE;
- }
-        case 667: break;
-        case 483: 
-          { 
-	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-	}
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	fStateStack.push(yystate());
-	if(yylength() > 2)
-		yypushback(yylength() -2);
-	if(Debug.debugTokenizer)
-		dump("VBL in attr value");//$NON-NLS-1$
-	yybegin(ST_JSP_VBL);
-	fELlevel++;
-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE});
-	fStateStack.pop();
-	yybegin(ST_XML_ATTRIBUTE_NAME);
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-	return PROXY_CONTEXT;
- }
-        case 668: break;
-        case 482: 
-          { 
-	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-	}
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	fStateStack.push(yystate());
-	if(yylength() > 2)
-		yypushback(yylength() -2);
-	if(Debug.debugTokenizer)
-		dump("EL in attr value");//$NON-NLS-1$
-	yybegin(ST_JSP_EL);
-	fELlevel++;
-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE});
-	fStateStack.pop();
-	yybegin(ST_XML_ATTRIBUTE_NAME);
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-	return PROXY_CONTEXT;
- }
-        case 669: break;
-        case 476: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nCharRef");//$NON-NLS-1$
-	return XML_CHAR_REFERENCE;
- }
-        case 670: break;
-        case 473: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\ncomment start");//$NON-NLS-1$
-	fEmbeddedHint = XML_COMMENT_TEXT;
-	fEmbeddedPostState = ST_XML_COMMENT;
-	yybegin(ST_XML_COMMENT);
-	return XML_COMMENT_OPEN;
- }
-        case 671: break;
-        case 472: 
-        case 491: 
-        case 494: 
-        case 497: 
-        case 498: 
-        case 500: 
-        case 502: 
-        case 505: 
-        case 507: 
-        case 508: 
-        case 510: 
-        case 512: 
-        case 515: 
-          { 
-	/* JSP comment begun (anywhere)
-	 * A consequence of the start anywhere possibility is that the
-	 *  incoming state must be checked to see if it's erroneous
-	 *  due to the order of precedence generated
-	 */
-	// begin sanity checks
-	if(yystate() == ST_JSP_CONTENT) {
-		// at the beginning?!
-		yypushback(3);
-		return JSP_CONTENT;
-	}
-	else if(yystate() == ST_BLOCK_TAG_SCAN) {
-		yypushback(4);
-		return doBlockTagScan();
-	}
-	else if(yystate() == ST_XML_COMMENT) {
-		yypushback(4);
-		return scanXMLCommentText();
-	}
-	else if(yystate() == ST_JSP_COMMENT) {
-		yypushback(4);
-		return scanJSPCommentText();
-	}
-	else if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)  {
-		yybegin(ST_JSP_COMMENT);
-		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)
-			yybegin(ST_BLOCK_TAG_SCAN);
-		return PROXY_CONTEXT;
-	}
-	// finished sanity checks
-	if(yystate()==YYINITIAL) {
-		// the simple case, just a regular scriptlet out in content
-		if(Debug.debugTokenizer)
-			dump("\nJSP comment start");//$NON-NLS-1$
-		yybegin(ST_JSP_COMMENT);
-		return JSP_COMMENT_OPEN;
-	}
-	else {
-		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-		}
-		if(Debug.debugTokenizer)
-			dump("JSP comment start");//$NON-NLS-1$
-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
-		else if(yystate() == ST_CDATA_TEXT) {
-			fEmbeddedPostState = ST_CDATA_TEXT;
-			fEmbeddedHint = XML_CDATA_TEXT;
-		}
-		yybegin(ST_JSP_COMMENT);
-		// the comment container itself will act as comment text
-		fEmbeddedHint = JSP_COMMENT_TEXT;
-		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
-			yybegin(ST_BLOCK_TAG_SCAN);
-			return BLOCK_TEXT;
-		}
-		/*
-		 * required help for successive embedded regions; mark this one as a
-		 * comment so it will be otherwise ignored but preserved (which is why
-		 * we can't use white-space)
-		 */
-		if(yystate() == ST_XML_TAG_NAME) {
-			fEmbeddedHint = XML_TAG_NAME;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-			fEmbeddedPostState = ST_XML_EQUALS;
-		}
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		return PROXY_CONTEXT;
-	}
- }
-        case 672: break;
-        case 381: 
-        case 382: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction target");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 673: break;
-        case 380: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("comment end");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-	yybegin(YYINITIAL);
-	return XML_COMMENT_CLOSE;
- }
-        case 674: break;
-        case 379: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("CDATA end");//$NON-NLS-1$
-	yybegin(fStateStack.pop());
-	return XML_CDATA_CLOSE;
- }
-        case 675: break;
-        case 378: 
-          { 
-	yybegin(ST_JSP_VBL);
-	if(yylength() > 2)
-		yypushback(yylength() - 2);
-	fELlevel++;
-	fEmbeddedHint = XML_CONTENT;
-	fEmbeddedPostState = YYINITIAL;
-	assembleEmbeddedContainer(JSP_VBL_OPEN, JSP_VBL_CLOSE);
-	fEmbeddedHint = XML_CONTENT;
-	yybegin(YYINITIAL);
-	return PROXY_CONTEXT;
- }
-        case 676: break;
-        case 377: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nPEReference");//$NON-NLS-1$
-	return XML_PE_REFERENCE;
- }
-        case 677: break;
-        case 376: 
-          { 
-	yybegin(ST_JSP_EL);
-	if(yylength() > 2)
-		yypushback(yylength() - 2);
-	fELlevel++;
-	fEmbeddedHint = XML_CONTENT;
-	fEmbeddedPostState = YYINITIAL;
-	assembleEmbeddedContainer(JSP_EL_OPEN, JSP_EL_CLOSE);
-	fEmbeddedHint = XML_CONTENT;
-	yybegin(YYINITIAL);
-	return PROXY_CONTEXT;
- }
-        case 678: break;
-        case 373: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nEntityRef");//$NON-NLS-1$
-	return XML_ENTITY_REFERENCE;
- }
-        case 679: break;
-        case 367: 
-        case 407: 
-        case 415: 
-        case 422: 
-        case 427: 
-        case 432: 
-        case 437: 
-        case 443: 
-        case 449: 
-        case 453: 
-        case 458: 
-        case 463: 
-        case 469: 
-          { 
-	/* JSP expression begun (anywhere)
-	 * A consequence of the start anywhere possibility is that the
-	 *  incoming state must be checked to see if it's erroneous
-	 *  due to the order of precedence generated
-	 */
-	// begin sanity checks
-	if(yystate() == ST_JSP_CONTENT) {
-		// at the beginning?!
-		yypushback(2);
-		return JSP_CONTENT;
-	}
-	else if(yystate() == ST_BLOCK_TAG_SCAN) {
-		yypushback(3);
-		return doBlockTagScan();
-	}
-	else if(yystate() == ST_XML_COMMENT) {
-		yypushback(3);
-		return scanXMLCommentText();
-	}
-	else if(yystate() == ST_JSP_COMMENT) {
-		yypushback(3);
-		return scanJSPCommentText();
-	}
-	// end sanity checks
-	fStateStack.push(yystate());
-	if(fStateStack.peek()==YYINITIAL) {
-		// the simple case, just an expression out in content
-		if(Debug.debugTokenizer)
-			dump("\nJSP expression start");//$NON-NLS-1$
-		yybegin(ST_JSP_CONTENT);
-		return JSP_EXPRESSION_OPEN;
-	}
-	else {
-		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-		}
-		if(Debug.debugTokenizer)
-			dump("JSP expression start");//$NON-NLS-1$
-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
-		else if(yystate() == ST_CDATA_TEXT) {
-			fEmbeddedPostState = ST_CDATA_TEXT;
-			fEmbeddedHint = XML_CDATA_TEXT;
-		}
-		yybegin(ST_JSP_CONTENT);
-		assembleEmbeddedContainer(JSP_EXPRESSION_OPEN, JSP_CLOSE);
-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
-			yybegin(ST_BLOCK_TAG_SCAN);
-			return BLOCK_TEXT;
-		}
-		// required help for successive embedded regions
-		if(yystate() == ST_XML_TAG_NAME) {
-			fEmbeddedHint = XML_TAG_NAME;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-			fEmbeddedPostState = ST_XML_EQUALS;
-		}
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		return PROXY_CONTEXT;
-	}
- }
-        case 680: break;
-        case 366: 
-        case 406: 
-        case 414: 
-        case 421: 
-        case 426: 
-        case 431: 
-        case 436: 
-        case 442: 
-        case 448: 
-        case 452: 
-        case 457: 
-        case 462: 
-        case 468: 
-          { 
-	/* JSP declaration begun (anywhere)
-	 * A consequence of the start anywhere possibility is that the
-	 *  incoming state must be checked to see if it's erroneous
-	 *  due to the order of precedence generated
-	 */
-	// begin sanity checks
-	if(yystate() == ST_JSP_CONTENT) {
-		// at the beginning?!
-		yypushback(2);
-		return JSP_CONTENT;
-	}
-	else if(yystate() == ST_BLOCK_TAG_SCAN) {
-		yypushback(3);
-		return doBlockTagScan();
-	}
-	else if(yystate() == ST_XML_COMMENT) {
-		yypushback(3);
-		return scanXMLCommentText();
-	}
-	else if(yystate() == ST_JSP_COMMENT) {
-		yypushback(3);
-		return scanJSPCommentText();
-	}
-	// end sanity checks
-	fStateStack.push(yystate());
-	if(fStateStack.peek()==YYINITIAL) {
-		// the simple case, just a declaration out in content
-		if(Debug.debugTokenizer)
-			dump("\nJSP declaration start");//$NON-NLS-1$
-		yybegin(ST_JSP_CONTENT);
-		return JSP_DECLARATION_OPEN;
-	}
-	else {
-		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-		}
-		if(Debug.debugTokenizer)
-			dump("JSP declaration start");//$NON-NLS-1$
-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
-		else if(yystate() == ST_CDATA_TEXT) {
-			fEmbeddedPostState = ST_CDATA_TEXT;
-			fEmbeddedHint = XML_CDATA_TEXT;
-		}
-		yybegin(ST_JSP_CONTENT);
-		assembleEmbeddedContainer(JSP_DECLARATION_OPEN, JSP_CLOSE);
-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
-			yybegin(ST_BLOCK_TAG_SCAN);
-			return BLOCK_TEXT;
-		}
-		// required help for successive embedded regions
-		if(yystate() == ST_XML_TAG_NAME) {
-			fEmbeddedHint = XML_TAG_NAME;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-			fEmbeddedPostState = ST_XML_EQUALS;
-		}
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		return PROXY_CONTEXT;
-	}
- }
-        case 681: break;
-        case 365: 
-        case 405: 
-        case 413: 
-        case 420: 
-        case 425: 
-        case 430: 
-        case 435: 
-        case 441: 
-        case 447: 
-        case 451: 
-        case 456: 
-        case 461: 
-        case 467: 
-          { 
-	/* JSP directive begun (anywhere)
-	 * A consequence of the start anywhere possibility is that the
-	 *  incoming state must be checked to see if it's erroneous
-	 *  due to the order of precedence generated
-	 */
-	// begin sanity checks
-	if(yystate() == ST_JSP_CONTENT) {
-		// at the beginning?!
-		yypushback(2);
-		return JSP_CONTENT;
-	}
-	else if(yystate() == ST_BLOCK_TAG_SCAN) {
-		yypushback(3);
-		return doBlockTagScan();
-	}
-	else if(yystate() == ST_XML_COMMENT) {
-		yypushback(3);
-		return scanXMLCommentText();
-	}
-	else if(yystate() == ST_JSP_COMMENT) {
-		yypushback(3);
-		return scanJSPCommentText();
-	}
-	// end sanity checks
-	fStateStack.push(yystate());
-	if(fStateStack.peek()==YYINITIAL) {
-		// the simple case, just a declaration out in content
-		if(Debug.debugTokenizer)
-			dump("\nJSP directive start");//$NON-NLS-1$
-		yybegin(ST_JSP_DIRECTIVE_NAME);
-		return JSP_DIRECTIVE_OPEN;
-	}
-	else {
-		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-		}
-		if(Debug.debugTokenizer)
-			dump("JSP declaration start");//$NON-NLS-1$
-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
-		else if(yystate() == ST_CDATA_TEXT) {
-			fEmbeddedPostState = ST_CDATA_TEXT;
-			fEmbeddedHint = XML_CDATA_TEXT;
-		}
-		yybegin(ST_JSP_DIRECTIVE_NAME);
-		assembleEmbeddedContainer(JSP_DIRECTIVE_OPEN, new String[]{JSP_DIRECTIVE_CLOSE, JSP_CLOSE});
-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
-			yybegin(ST_BLOCK_TAG_SCAN);
-			return BLOCK_TEXT;
-		}
-		// required help for successive embedded regions
-		if(yystate() == ST_XML_TAG_NAME) {
-			fEmbeddedHint = XML_TAG_NAME;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-			fEmbeddedPostState = ST_XML_EQUALS;
-		}
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		return PROXY_CONTEXT;
-	}
- }
-        case 682: break;
-        case 355: 
-          { 
-	yybegin(ST_JSP_VBL_DQUOTES_END);
-	return JSP_VBL_QUOTED_CONTENT;
- }
-        case 683: break;
-        case 351: 
-          { 
-	yybegin(ST_JSP_VBL_SQUOTES_END);
-	return JSP_VBL_QUOTED_CONTENT;
- }
-        case 684: break;
-        case 349: 
-          { 
-	fELlevel++;
-	if(fELlevel == 1) {
-		return JSP_VBL_OPEN;
-	}
- }
-        case 685: break;
-        case 339: 
-          { 
-	yybegin(ST_JSP_EL_DQUOTES_END);
-	return JSP_EL_QUOTED_CONTENT;
- }
-        case 686: break;
-        case 335: 
-          { 
-	yybegin(ST_JSP_EL_SQUOTES_END);
-	return JSP_EL_QUOTED_CONTENT;
- }
-        case 687: break;
-        case 333: 
-          { 
-	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
-	return JSP_EL_CONTENT;
- }
-        case 688: break;
-        case 332: 
-          { 
-	fELlevel++;
-	if(fELlevel == 1) {
-		return JSP_EL_OPEN;
-	}
- }
-        case 689: break;
-        case 329: 
-          { 
-	int enterState = yystate();
-	yybegin(ST_JSP_DQUOTED_VBL);
-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
-	// abort early when an unescaped double quote is found in the VBL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
-		yybegin(ST_ABORT_EMBEDDED);
-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	}
-	else {
-		yybegin(enterState);
-	}
-	return PROXY_CONTEXT;
- }
-        case 690: break;
-        case 328: 
-          { 
-	int enterState = yystate();
-	yybegin(ST_JSP_DQUOTED_EL);
-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
-	// abort early when an unescaped double quote is found in the EL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
-		yybegin(ST_ABORT_EMBEDDED);
-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	}
-	else {
-		yybegin(enterState);
-	}
-	return PROXY_CONTEXT;
- }
-        case 691: break;
-        case 326: 
-          { 
-	int enterState = yystate();
-	yybegin(ST_JSP_SQUOTED_VBL);
-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
-	// abort early when an unescaped single quote is found in the VBL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
-		yybegin(ST_ABORT_EMBEDDED);
-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	}
-	else {
-		yybegin(enterState);
-	}
-	return PROXY_CONTEXT;
- }
-        case 692: break;
-        case 325: 
-          { 
-	int enterState = yystate();
-	yybegin(ST_JSP_SQUOTED_EL);
-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
-	// abort early when an unescaped single quote is found in the EL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
-		yybegin(ST_ABORT_EMBEDDED);
-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	}
-	else {
-		yybegin(enterState);
-	}
-	return PROXY_CONTEXT;
- }
-        case 693: break;
-        case 324: 
-          { 
-	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-	}
-	int incomingState = yystate();
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	if(Debug.debugTokenizer)
-		dump("JSP attribute value start - end tag");//$NON-NLS-1$
-	yybegin(ST_XML_TAG_NAME);
-	assembleEmbeddedContainer(XML_END_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
-	if(yystate() != ST_ABORT_EMBEDDED)
-        yybegin(incomingState);
-	return PROXY_CONTEXT;
- }
-        case 694: break;
-        case 283: 
-        case 295: 
-        case 301: 
-          { 
-	return XML_DOCTYPE_INTERNAL_SUBSET;
- }
-        case 695: break;
-        case 271: 
-          { 
-	String tagName = yytext().substring(1);
-	// pushback to just after the opening bracket
-	yypushback(yylength() - 1);
-	/*
-	 * If this tag can not be nested or we're already searching for an
-	 * attribute name, equals, or value, return immediately.
-	 */
-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
-		yybegin(ST_XML_TAG_NAME);
-		return XML_TAG_OPEN;
-	}
-	if(Debug.debugTokenizer)
-		dump("tag in place of attr value");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	fStateStack.push(yystate());
-	// embedded container should be looking for the name (again) next
-	yybegin(ST_XML_TAG_NAME);
-	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
-	fStateStack.pop();
-	yybegin(ST_XML_ATTRIBUTE_NAME);
-	return PROXY_CONTEXT;
- }
-        case 696: break;
-        case 269: 
-          { 
-	String tagName = yytext().substring(1);
-	// pushback to just after the opening bracket
-	yypushback(yylength() - 1);
-	/*
-	 * If this tag can not be nested or we're already searching for an
-	 * attribute name, equals, or value, return immediately.
-	 */
-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
-		yybegin(ST_XML_TAG_NAME);
-		return XML_TAG_OPEN;
-	}
-	if(Debug.debugTokenizer)
-		dump("tag in place of attr name");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	fStateStack.push(yystate());
-	// embedded container should be looking for the name (again) next
-	yybegin(ST_XML_TAG_NAME);
-	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
-	fStateStack.pop();
-	yybegin(ST_XML_EQUALS);
-	return PROXY_CONTEXT;
- }
-        case 697: break;
-        case 267: 
-          { 
-        yybegin(YYINITIAL);
-	fEmbeddedHint = UNDEFINED;
-	if(Debug.debugTokenizer)
-		dump("empty tag close");//$NON-NLS-1$
-        return XML_EMPTY_TAG_CLOSE;
- }
-        case 698: break;
-        case 125: 
-          { 
-	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-	}
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
-	yybegin(ST_XML_ATTRIBUTE_VALUE_DQUOTED);
-	fStateStack.push(yystate());
-	if(Debug.debugTokenizer)
-		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$
-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_DQUOTE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE);
-	fStateStack.pop();
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-	yybegin(ST_XML_ATTRIBUTE_NAME);
-	return PROXY_CONTEXT;
- }
-        case 699: break;
-        case 123: 
-          { 
-	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-	}
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	fStateStack.push(yystate());
-	if(Debug.debugTokenizer)
-		dump("JSP tag embedded name start - start tag");//$NON-NLS-1$
-	yybegin(ST_XML_TAG_NAME);
-	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
-	fStateStack.pop();
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-	return PROXY_CONTEXT;
- }
-        case 700: break;
-        case 122: 
-        case 127: 
-        case 128: 
-        case 273: 
-        case 277: 
-        case 278: 
-        case 387: 
-        case 390: 
-        case 481: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr value");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 701: break;
-        case 121: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("equals");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_XML_ATTRIBUTE_VALUE);
-        return XML_TAG_ATTRIBUTE_EQUALS;
- }
-        case 702: break;
-        case 120: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr name");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_XML_EQUALS);
-        return XML_TAG_ATTRIBUTE_NAME;
- }
-        case 703: break;
-        case 116: 
-        case 117: 
-        case 118: 
-        case 268: 
-        case 386: 
-        case 480: 
-        case 520: 
-        case 521: 
-        case 540: 
-        case 541: 
-        case 559: 
-        case 560: 
-        case 573: 
-        case 582: 
-        case 590: 
-        case 592: 
-        case 594: 
-        case 596: 
-        case 599: 
-        case 605: 
-        case 606: 
-        case 607: 
-        case 608: 
-        case 609: 
-        case 615: 
-        case 616: 
-        case 617: 
-        case 618: 
-        case 619: 
-        case 625: 
-        case 626: 
-        case 628: 
-        case 629: 
-        case 635: 
-        case 636: 
-        case 637: 
-        case 638: 
-        case 644: 
-        case 645: 
-        case 646: 
-        case 647: 
-        case 650: 
-        case 651: 
-        case 653: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("tag name");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 704: break;
-        case 114: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("tag close");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-	if(isBlockMarker()) {
-		fEmbeddedHint = getBlockMarkerContext();
-		fEmbeddedPostState = ST_BLOCK_TAG_SCAN;
-        	yybegin(ST_BLOCK_TAG_SCAN);
-	}
-	else
-        	yybegin(YYINITIAL);
-        return XML_TAG_CLOSE;
- }
-        case 705: break;
-        case 107: 
-        case 111: 
-        case 263: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr value");//$NON-NLS-1$
-        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 706: break;
-        case 106: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("equals");//$NON-NLS-1$
-        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
-        return XML_TAG_ATTRIBUTE_EQUALS;
- }
-        case 707: break;
-        case 105: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr name");//$NON-NLS-1$
-        yybegin(ST_JSP_DIRECTIVE_EQUALS);
-        return XML_TAG_ATTRIBUTE_NAME;
- }
-        case 708: break;
-        case 102: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP directive name");//$NON-NLS-1$
-	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
-	return JSP_DIRECTIVE_NAME;
- }
-        case 709: break;
-        case 98: 
-        case 99: 
-        case 100: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP code content");//$NON-NLS-1$
-	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
- }
-        case 710: break;
-        case 94: 
-        case 96: 
-        case 97: 
-        case 253: 
-        case 254: 
-        case 257: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_DHTML_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 711: break;
-        case 93: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction '='");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_DHTML_ATTRIBUTE_VALUE);
-        return XML_TAG_ATTRIBUTE_EQUALS;
- }
-        case 712: break;
-        case 92: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
-        yybegin(ST_DHTML_EQUALS);
-        return XML_TAG_ATTRIBUTE_NAME;
- }
-        case 713: break;
-        case 90: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction end");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 714: break;
-        case 84: 
-        case 86: 
-        case 244: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction attribute value");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 715: break;
-        case 83: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction '='");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
-        return XML_TAG_ATTRIBUTE_EQUALS;
- }
-        case 716: break;
-        case 49: 
-        case 199: 
-        case 200: 
-        case 203: 
-        case 213: 
-        case 214: 
-        case 217: 
-        case 218: 
-        case 360: 
-        case 363: 
-        case 446: 
-        case 460: 
-        case 466: 
-          { 
-	return JSP_VBL_CONTENT;
- }
-        case 717: break;
-        case 42: 
-        case 178: 
-        case 179: 
-        case 182: 
-        case 192: 
-        case 193: 
-        case 196: 
-        case 197: 
-        case 330: 
-        case 344: 
-        case 347: 
-        case 418: 
-        case 419: 
-        case 434: 
-        case 440: 
-          { 
-	return JSP_EL_CONTENT;
- }
-        case 718: break;
-        case 35: 
-        case 159: 
-        case 160: 
-        case 321: 
-        case 412: 
-        case 416: 
-        case 495: 
-        case 528: 
-        case 548: 
-        case 565: 
-        case 575: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist contentspec");//$NON-NLS-1$
-	return XML_ATTLIST_DECL_CONTENT;
- }
-        case 719: break;
-        case 33: 
-        case 152: 
-        case 153: 
-        case 311: 
-        case 404: 
-        case 408: 
-        case 492: 
-        case 527: 
-        case 547: 
-        case 564: 
-        case 574: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("elementdecl contentspec");//$NON-NLS-1$
-	return XML_ELEMENT_DECL_CONTENT;
- }
-        case 720: break;
-        case 22: 
-        case 112: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("inappropriate tag name");//$NON-NLS-1$
-	if(!fStateStack.empty() && (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED||fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED)) {
-		yybegin(ST_ABORT_EMBEDDED);
-		yypushback(yylength()-1);
-		return XML_TAG_ATTRIBUTE_VALUE;
-	}
-	yybegin(YYINITIAL);
-        return XML_CONTENT;
- }
-        case 721: break;
-        case 18: 
-        case 104: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("white space");//$NON-NLS-1$
-	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
-	return WHITE_SPACE;
- }
-        case 722: break;
-        case 5: 
-        case 8: 
-        case 9: 
-        case 10: 
-        case 12: 
-        case 13: 
-        case 14: 
-        case 15: 
-        case 17: 
-        case 19: 
-        case 20: 
-        case 21: 
-        case 23: 
-        case 24: 
-        case 25: 
-        case 26: 
-        case 27: 
-        case 28: 
-        case 29: 
-        case 30: 
-        case 31: 
-        case 32: 
-        case 34: 
-        case 40: 
-        case 41: 
-        case 72: 
-        case 169: 
-        case 174: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("white space");//$NON-NLS-1$
-        return WHITE_SPACE;
- }
-        case 723: break;
-        case 0: 
-        case 56: 
-        case 59: 
-        case 61: 
-        case 225: 
-        case 227: 
-        case 228: 
-        case 230: 
-        case 232: 
-        case 370: 
-        case 371: 
-        case 372: 
-        case 475: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nXML content");//$NON-NLS-1$
-	return XML_CONTENT;
- }
-        case 724: break;
-        case 57: 
-        case 101: 
-        case 113: 
-        case 119: 
-        case 129: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nstart tag open");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_NAME;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_XML_TAG_NAME);
-        return XML_TAG_OPEN;
- }
-        case 725: break;
-        case 58: 
-        case 60: 
-        case 64: 
-        case 65: 
-        case 66: 
-        case 70: 
-        case 71: 
-        case 81: 
-        case 85: 
-        case 87: 
-        case 88: 
-        case 89: 
-        case 91: 
-        case 95: 
-        case 103: 
-        case 108: 
-        case 109: 
-        case 110: 
-        case 115: 
-        case 124: 
-        case 131: 
-        case 132: 
-        case 133: 
-        case 134: 
-        case 136: 
-        case 137: 
-        case 139: 
-        case 140: 
-        case 141: 
-        case 144: 
-        case 145: 
-        case 146: 
-        case 149: 
-        case 150: 
-        case 151: 
-        case 156: 
-        case 157: 
-        case 158: 
-        case 166: 
-        case 171: 
-        case 172: 
-        case 176: 
-        case 177: 
-        case 184: 
-        case 185: 
-        case 187: 
-        case 188: 
-        case 194: 
-        case 198: 
-        case 205: 
-        case 206: 
-        case 208: 
-        case 209: 
-        case 215: 
-        case 219: 
-          { 
-	if (Debug.debugTokenizer)
-		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
-			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
-	return UNDEFINED;
- }
-        case 726: break;
-        case 62: 
-        case 63: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("CDATA text");//$NON-NLS-1$
-	fEmbeddedPostState = ST_CDATA_TEXT;
-	fEmbeddedHint = XML_CDATA_TEXT;
-	String returnedContext = doScan("]]>", false, true, true, XML_CDATA_TEXT, ST_CDATA_END,  ST_CDATA_END);//$NON-NLS-1$
-	if(returnedContext == XML_CDATA_TEXT)
-		yybegin(ST_CDATA_END);
-	return returnedContext;
- }
-        case 727: break;
-        case 67: 
-        case 186: 
-        case 189: 
-        case 207: 
-        case 210: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("LINE FEED");//$NON-NLS-1$
-	return WHITE_SPACE;
- }
-        case 728: break;
-        case 68: 
-        case 69: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("comment content");//$NON-NLS-1$
-	return scanXMLCommentText();
- }
-        case 729: break;
-        case 73: 
-        case 74: 
-        case 75: 
-        case 76: 
-        case 237: 
-        case 238: 
-        case 239: 
-        case 383: 
-        case 478: 
-        case 479: 
-        case 518: 
-        case 519: 
-        case 538: 
-        case 558: 
-        case 571: 
-        case 581: 
-        case 589: 
-        case 591: 
-        case 593: 
-        case 595: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("processing instruction target");//$NON-NLS-1$
-	fEmbeddedHint = XML_CONTENT;
-        yybegin(ST_PI_WS);
-        return XML_TAG_NAME;
- }
-        case 730: break;
-        case 77: 
-          { 
-        yybegin(ST_PI_CONTENT);
-        return WHITE_SPACE;
- }
-        case 731: break;
-        case 78: 
-        case 79: 
-        case 80: 
-          { 
-		// block scan until close is found
-	return doScan("?>", false, false, false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
- }
-        case 732: break;
-        case 82: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction attribute name");//$NON-NLS-1$
-        yybegin(ST_XML_PI_EQUALS);
-        return XML_TAG_ATTRIBUTE_NAME;
- }
-        case 733: break;
-        case 126: 
-          { 
-	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-	}
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
-	yybegin(ST_XML_ATTRIBUTE_VALUE_SQUOTED);
-	fStateStack.push(yystate());
-	if(Debug.debugTokenizer)
-		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$
-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_SQUOTE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE);
-	fStateStack.pop();
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-	return PROXY_CONTEXT;
- }
-        case 734: break;
-        case 130: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("declaration end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return XML_DECLARATION_CLOSE;
- }
-        case 735: break;
-        case 135: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype type");//$NON-NLS-1$
-	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
-	return XML_DOCTYPE_NAME;
- }
-        case 736: break;
-        case 138: 
-        case 142: 
-        case 288: 
-        case 292: 
-        case 399: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype public reference");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-	fEmbeddedPostState = YYINITIAL;
-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
-	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
- }
-        case 737: break;
-        case 143: 
-        case 147: 
-        case 298: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype system reference");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-	fEmbeddedPostState = YYINITIAL;
-	yybegin(ST_XML_DECLARATION_CLOSE);
-	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
- }
-        case 738: break;
-        case 148: 
-        case 304: 
-        case 308: 
-        case 402: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("elementdecl name");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-	fEmbeddedPostState = YYINITIAL;
-	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
-	return XML_ELEMENT_DECL_NAME;
- }
-        case 739: break;
-        case 154: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("elementdecl close");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return XML_DECLARATION_CLOSE;
- }
-        case 740: break;
-        case 155: 
-        case 314: 
-        case 318: 
-        case 410: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist name");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-	fEmbeddedPostState = YYINITIAL;
-	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
-	return XML_ATTLIST_DECL_NAME;
- }
-        case 741: break;
-        case 161: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist close");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return XML_DECLARATION_CLOSE;
- }
-        case 742: break;
-        case 164: 
-        case 165: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nJSP comment text");//$NON-NLS-1$
-	return scanJSPCommentText();
- }
-        case 743: break;
-        case 167: 
-        case 173: 
-          { 
-	return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 744: break;
-        case 168: 
-          { 
-	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-	}
-	int incomingState = yystate();
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-	if(Debug.debugTokenizer)
-		dump("tag inside of JSP attribute value start");//$NON-NLS-1$
-	yybegin(ST_XML_TAG_NAME);
-	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
-	if(yystate() != ST_ABORT_EMBEDDED)
-        yybegin(incomingState);
-	return PROXY_CONTEXT;
- }
-        case 745: break;
-        case 170: 
-          { 
-	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
- }
-        case 746: break;
-        case 175: 
-          { 
-	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
- }
-        case 747: break;
-        case 180: 
-          { 
-	yybegin(ST_JSP_EL_DQUOTES);
-	return JSP_EL_DQUOTE;
- }
-        case 748: break;
-        case 181: 
-          { 
-	yybegin(ST_JSP_EL_SQUOTES);
-	return JSP_EL_SQUOTE;
- }
-        case 749: break;
-        case 183: 
-          { 
-	fELlevel--;
-	if(fELlevel == 0) {
-		yybegin(YYINITIAL);
-		return JSP_EL_CLOSE;
-	}
-	return JSP_EL_CONTENT;
- }
-        case 750: break;
-        case 190: 
-          { 
-	yybegin(ST_JSP_EL);
-	return JSP_EL_SQUOTE;
- }
-        case 751: break;
-        case 191: 
-          { 
-	yybegin(ST_JSP_EL);
-	return JSP_EL_DQUOTE;
- }
-        case 752: break;
-        case 195: 
-          { 
-	return JSP_EL_CLOSE;
- }
-        case 753: break;
-        case 201: 
-          { 
-	yybegin(ST_JSP_VBL_DQUOTES);
-	return JSP_VBL_DQUOTE;
- }
-        case 754: break;
-        case 202: 
-          { 
-	yybegin(ST_JSP_VBL_SQUOTES);
-	return JSP_VBL_SQUOTE;
- }
-        case 755: break;
-        case 204: 
-          { 
-	fELlevel--;
-	if(fELlevel == 0) {
-		yybegin(YYINITIAL);
-		return JSP_VBL_CLOSE;
-	}
-	return JSP_VBL_CONTENT;
- }
-        case 756: break;
-        case 211: 
-          { 
-	yybegin(ST_JSP_VBL);
-	return JSP_VBL_SQUOTE;
- }
-        case 757: break;
-        case 212: 
-          { 
-	yybegin(ST_JSP_VBL);
-	return JSP_VBL_DQUOTE;
- }
-        case 758: break;
-        case 216: 
-          { 
-	return JSP_VBL_CLOSE;
- }
-        case 759: break;
-        case 220: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nend tag open");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_NAME;
-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_XML_TAG_NAME);
-        return XML_END_TAG_OPEN;
- }
-        case 760: break;
-        case 221: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nprocessing instruction start");//$NON-NLS-1$
-	yybegin(ST_PI);
-        return XML_PI_OPEN;
- }
-        case 761: break;
-        case 222: 
-        case 310: 
-        case 320: 
-        case 331: 
-        case 336: 
-        case 340: 
-        case 343: 
-        case 346: 
-        case 348: 
-        case 352: 
-        case 356: 
-        case 359: 
-        case 362: 
-          { 
-	/* JSP scriptlet begun (anywhere)
-	 * A consequence of the start anywhere possibility is that the
-	 *  incoming state must be checked to see if it's erroneous
-	 *  due to the order of precedence generated
-	 */
-	// begin sanity checks
-	if(yystate() == ST_JSP_CONTENT) {
-		// at the beginning?!
-		yypushback(1);
-		return JSP_CONTENT;
-	}
-	else if(yystate() == ST_BLOCK_TAG_SCAN) {
-		yypushback(2);
-		return doBlockTagScan();
-	}
-	else if(yystate() == ST_XML_COMMENT) {
-		yypushback(2);
-		return scanXMLCommentText();
-	}
-	else if(yystate() == ST_JSP_COMMENT) {
-		yypushback(2);
-		return scanJSPCommentText();
-	}
-	// finished sanity checks
-	fStateStack.push(yystate());
-	if(fStateStack.peek()==YYINITIAL) {
-		// the simple case, just a regular scriptlet out in content
-		if(Debug.debugTokenizer)
-			dump("\nJSP scriptlet start");//$NON-NLS-1$
-		yybegin(ST_JSP_CONTENT);
-		return JSP_SCRIPTLET_OPEN;
-	}
-	else {
-		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
-		}
-		if(Debug.debugTokenizer)
-			dump("JSP scriptlet start");//$NON-NLS-1$
-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
-		else if(yystate() == ST_CDATA_TEXT) {
-			fEmbeddedPostState = ST_CDATA_TEXT;
-			fEmbeddedHint = XML_CDATA_TEXT;
-		}
-		yybegin(ST_JSP_CONTENT);
-		assembleEmbeddedContainer(JSP_SCRIPTLET_OPEN, JSP_CLOSE);
-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
-			yybegin(ST_BLOCK_TAG_SCAN);
-			return BLOCK_TEXT;
-		}
-		// required help for successive embedded regions
-		if(yystate() == ST_XML_TAG_NAME) {
-			fEmbeddedHint = XML_TAG_NAME;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-			fEmbeddedPostState = ST_XML_EQUALS;
-		}
-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-		}
-		return PROXY_CONTEXT;
-	}
- }
-        case 762: break;
-        case 223: 
-          { 
-	fStateStack.push(yystate());
-	if(Debug.debugTokenizer)
-		dump("\ndeclaration start");//$NON-NLS-1$
-        yybegin(ST_XML_DECLARATION);
-	return XML_DECLARATION_OPEN;
- }
-        case 763: break;
-        case 236: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("processing instruction end");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 764: break;
-        case 240: 
-          { 
-		// ended with nothing inside
-		fEmbeddedHint = UNDEFINED;
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 765: break;
-        case 241: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction end");//$NON-NLS-1$
-	fEmbeddedHint = UNDEFINED;
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 766: break;
-        case 258: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return JSP_CLOSE;
- }
-        case 767: break;
-        case 260: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return JSP_DIRECTIVE_CLOSE;
- }
-        case 768: break;
-        case 162: 
-        case 163: 
-          { 
-		return doBlockTagScan();
-	 }
-        case 769: break;
-        default: 
-          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
-            yy_atEOF = true;
-            yy_do_eof();
-              return null;
-          } 
-          else {
-            yy_ScanError(YY_NO_MATCH);
-          }
-      }
-    }
-  }    
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
deleted file mode 100644
index 32fdb7b..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
+++ /dev/null
@@ -1,2701 +0,0 @@
-/*******************************************************************************

- * Copyright (c) 2004, 2007 IBM Corporation and others.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- * 

- * Contributors:

- *     IBM Corporation - initial API and implementation

- *******************************************************************************/

-

-package org.eclipse.jst.jsp.core.internal.parser.internal;

-

-import java.io.CharArrayReader;

-import java.io.IOException;

-import java.util.ArrayList;

-import java.util.Iterator;

-import java.util.List;

-

-import org.eclipse.jst.jsp.core.internal.Logger;

-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;

-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;

-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;

-import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;

-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;

-import org.eclipse.wst.sse.core.internal.util.Debug;

-import org.eclipse.wst.sse.core.utils.StringUtils;

-import org.eclipse.wst.xml.core.internal.parser.ContextRegionContainer;

-import org.eclipse.wst.xml.core.internal.parser.IntStack;

-

-%%

-

-%{

-	private int fTokenCount = 0;

- 

-	// required holders for white-space compacting

-	private boolean fShouldLoadBuffered = false;

-	private String fBufferedContext = null;

-	private int fBufferedStart = 1;

-	private int fBufferedLength = 0;

-	private ContextRegionContainer fBufferedEmbeddedContainer = null;

-	private String f_context = null;

-

-	// state stack for handling embedded regions

-	private IntStack fStateStack = new IntStack();

-	// a "hint" as to what an embedded region should be evaluated

-	private String fEmbeddedHint = UNDEFINED;

-	// a "hint" as to what state to enter once an embedded region has

-	//   been completed

-	private int fEmbeddedPostState = YYINITIAL;

-	// the container used to create embedded regions

-	private ContextRegionContainer fEmbeddedContainer = null;

-	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";

-

-	private String context = null;

-	private int start = 0;

-	private int textLength = 0;

-	private int length = 0;

-

-	// offset for tracking position specific block tags

-	private int fOffset = 0;

-	

-	// the name of the current tag being opened

-	private String fCurrentTagName = null;

-

-	// the name of the current tag inside of an embedded region

-	private String internalTagName = null;

-	private String internalContext = null;

-

-	// the list of tag name BlockMarkers

-	private List fBlockMarkers = new ArrayList(0);

-	private List fNestablePrefixes = new ArrayList(1);

-	

-	// where the last internal container block was found

-	private int fLastInternalBlockStart = -1;

-

-	// required to not seek text blocks on an end tag

-	private boolean fIsBlockingEnabled = false;

-	private boolean fIsCaseSensitiveBlocking = true;

-

-	private static final boolean fForbidJSP = false;

-	

-	private int fELlevel = 0;

-

-	private JSPParserRegionFactory fRegionFactory = new JSPParserRegionFactory();

-

-	/**

-	 * user method 

-	 */

-	public final void addBlockMarker(BlockMarker marker) {

-		if(containsTagName(marker.getTagName()))

-			return;

-		fBlockMarkers.add(marker);

-	}

-	/**

-	 * user method

-	 */

-	public final void addNestablePrefix(TagMarker marker) {

-		fNestablePrefixes.add(marker);

-	}

-	/* user method */

-	public List getNestablePrefixes() {

-		return fNestablePrefixes;

-	}

-	/**

-	 * user method

-	 */

-	private boolean isNestable(String tagName) {

-		//Iterator blocks = fNestablePrefixes.iterator();

-		//while(blocks.hasNext()) {

-		//	TagMarker marker = (TagMarker)blocks.next();

-		//	String markerName = marker.getTagName();

-		//	if(tagName.length() > markerName.length() + 1 && tagName.startsWith(markerName) && tagName.charAt(markerName.length()) == ':') {

-		//		return marker.isGlobal() || getOffset() >= marker.getMarker().getStart();

-		//	}

-		//}

-		//return false;

-		return true;

-	}

-	/**

-	 * user method 

-	 */

-	public final void removeNestablePrefix(String name) {

-		if (fNestablePrefixes != null) {

-			Iterator nestables = fNestablePrefixes.iterator();

-			while (nestables.hasNext()) {

-				if (((TagMarker) nestables.next()).getTagName().equalsIgnoreCase(name))

-					nestables.remove();

-			}

-		}

-	}

-	/**

-	 * user method 

-	 */

-	public final void removeBlockMarker(BlockMarker marker) {

-		fBlockMarkers.remove(marker);

-	}

-	/**

-	 * user method 

-	 */

-	public final void removeBlockMarker(String tagname) {

-		if (fBlockMarkers != null) {

-			Iterator blocks = fBlockMarkers.iterator();

-			while (blocks.hasNext()) {

-				if (((BlockMarker) blocks.next()).getTagName().equals(tagname))

-					blocks.remove();

-			}

-		}

-	}

-	/* user method */

-	private final void assembleEmbeddedTagSequence(String startType, String endTagName) {

-		assembleEmbeddedContainer(startType, null, endTagName);

-	}

-	/* user method */

-	private final void assembleEmbeddedContainer(String startType, String[] endTypes) {

-		assembleEmbeddedContainer(startType, endTypes, null);

-	}

-	/* user method */

-	private final void assembleEmbeddedContainer(String startType, String endType) {

-		assembleEmbeddedContainer(startType, new String[]{endType}, null);

-	}

-	/**

-	 *  user method 

-	 * 

-	 * Assembles an embedded container beginning with the given startType as

-	 * the first ContextRegion within it and of the type fEmbeddedHint.  The

-	 * endTypes[] array contains the context types that will cause a successful

-	 * exit.  Use of the endTagName parameter alters this behavior to force an

-	 * exit on an XML_TAG_CLOSE after seeing an XML_TAG_NAME whose significant

-	 * text matches the endTagName String.  All contents in between are

-	 * insignificant, and yes, this means comments are allowed inside.

-	 **/

-	private final void assembleEmbeddedContainer(String startType, String[] endTypes, String endTagName) {

-		// the context of the region being added to the embedded container

-		internalContext = startType;

-		// keep track of where this container began; to provide relative indeces for the regions

-		int containerStart = yychar;

-		boolean notFinished = true;

-		// keep track of where we seem to be so that the endTagName can be checked

-		boolean isInEndTag = false;

-		boolean isInFirstTag = true;

-		// create the embedded container and setup its "type"

-		if (fEmbeddedContainer == null) {

-			fEmbeddedContainer = new ContextRegionContainer();

-			fEmbeddedContainer.setType(fEmbeddedHint);

-			fEmbeddedContainer.setStart(containerStart);

-			// TODO: parent region needs to be set .... but not sure where to get it from 

-			//		fEmbeddedContainer.setParent(parentRegion);

-		}

-		containerStart = fEmbeddedContainer.getStart();

-		while (notFinished) {

-			// add the region to the container

-			if (internalContext != null && internalContext != PROXY_CONTEXT) {

-				ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());

-				fEmbeddedContainer.getRegions().add(newToken);

-				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());

-				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());

-				// DW, 4/16/2003 token regions no longer have parents

-				//newToken.setParent(fEmbeddedContainer);

-			}

-			try {

-				// longscan determines whether to attempt a blockTagScan within the embedded container

-				boolean longscan = false;

-				// save the tokenizer state in case of a block tag scan

-				int previousState = yystate();

-				String previousCurrentTagName = fCurrentTagName;

-				int previousPostState = fEmbeddedPostState;

-				String previousEmbeddedHint = fEmbeddedHint;

-				// determine if a block tag scan is necessary

-				if (internalContext == XML_TAG_NAME) {

-					internalTagName = yytext();

-					if(!isNestable(internalTagName)) {

-						internalTagName = null;

-						// snagged a tag name we shouldn't have

-						fEmbeddedPostState = ST_ABORT_EMBEDDED;

-						notFinished = false;

-					}

-				}

-				else if (internalContext == XML_TAG_OPEN || internalContext == XML_END_TAG_OPEN) {

-					internalTagName = null;

-				}

-				// do upkeep for endTagName usage; must be here since the next token could be the close

-				if (internalContext == XML_END_TAG_OPEN) {

-					isInEndTag = true;

-				} else if (internalContext == XML_TAG_CLOSE) {

-					isInFirstTag = isInEndTag = false;

-				} else {

-				 	ITextRegionList embeddedRegions = fEmbeddedContainer.getRegions();

-					if (embeddedRegions.size() > 2 && (embeddedRegions.get(embeddedRegions.size()-1)).getType() == XML_TAG_CLOSE && (embeddedRegions.get(embeddedRegions.size() - 3)).getType() == XML_TAG_OPEN && internalTagName != null) {

-						if (containsTagName(internalTagName)) {

-							longscan = true;

-							yybegin(ST_BLOCK_TAG_SCAN);

-						}

-					}

-				}

-				if (longscan)

-					fCurrentTagName = internalTagName;

-				// read the next region and context

-				internalContext = primGetNextToken();

-				if (longscan) {

-					// Returning from a block tag scan requires restoring some state variables

-					// as well as handling the block region and setting up for normal scanning

-					// inside the embedded container

-					ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());

-					fEmbeddedContainer.getRegions().add(newToken);

-					fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());

-					fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());

-					// DW, 4/16/2003 token regions no longer have parents

-					// newToken.setParent(fEmbeddedContainer);

-					longscan = false;

-					fEmbeddedPostState = previousPostState;

-					fEmbeddedHint = previousEmbeddedHint;

-					fCurrentTagName = previousCurrentTagName;

-					yybegin(previousState);

-					internalContext = primGetNextToken();

-				}

-			} catch (IOException e) {

-				// primGetNextToken() calls may throw an IOException

-				// catch and do nothing since the isEOF check below

-				// will properly exit if the input was too short

-			} catch (Exception f) {

-				// some other exception happened; never should

-				Logger.logException(f);

-			}

-			boolean isEndingType = yystate() == ST_ABORT_EMBEDDED;

-			if(!isEndingType) {

-				// check for ending context

-				if (endTagName == null) {

-					for (int i = 0; i < endTypes.length; i++) {

-						isEndingType = isEndingType || (internalContext == endTypes[i]);

-					}

-				}

-				else {

-					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);

-				}

-			}

-			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();

-			notFinished = notFinished && ((!isEndingType) && !isEOF() && (endTagName != null || internalContext != UNDEFINED) && !(internalContext == PROXY_CONTEXT && (embeddedList.get(embeddedList.size()-1)).getType() == UNDEFINED));

-		}

-		// finish adding the last context

-		if (internalContext != null && internalContext != PROXY_CONTEXT) {

-			ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());

-			fEmbeddedContainer.getRegions().add(newToken);

-			// DW, 4/16/2003 token regions no longer have parents

-			//newToken.setParent(fEmbeddedContainer);

-			fEmbeddedContainer.setLength(yychar - containerStart + yylength());

-			fEmbeddedContainer.setTextLength(yychar - containerStart + yylength());

-		}

-		yybegin(fEmbeddedPostState);

-	}

-	/* user method */

-	public final boolean isCaseSensitiveBlocking() {

-		return fIsCaseSensitiveBlocking;

-	}

-	/* user method */

-	public final void setCaseSensitiveBlocking(boolean newValue) {

-		fIsCaseSensitiveBlocking = newValue;

-	}

-	/* user method */

-	public boolean getBlockMarkerAllowsJSP() {

-		return getBlockMarkerAllowsJSP(fCurrentTagName);

-	}

-	/* user method */

-	public boolean getBlockMarkerAllowsJSP(String name) {

-		Iterator iterator = fBlockMarkers.iterator();

-		while(iterator.hasNext()) {

-			BlockMarker marker = (BlockMarker)iterator.next();

-			boolean casesensitive = marker.isCaseSensitive();

-			if(casesensitive && marker.getTagName().equals(name))

-				return marker.allowsJSP();

-			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))

-				return marker.allowsJSP();

-		}

-		return true;

-	}

-	/* user method */

-	public boolean getBlockMarkerCaseSensitivity() {

-		return getBlockMarkerCaseSensitivity(fCurrentTagName);

-	}

-	public boolean getBlockMarkerCaseSensitivity(String name) {

-		Iterator iterator = fBlockMarkers.iterator();

-		while(iterator.hasNext()) {

-			BlockMarker marker = (BlockMarker)iterator.next();

-			boolean casesensitive = marker.isCaseSensitive();

-			if(casesensitive && marker.getTagName().equals(name))

-				return casesensitive;

-			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))

-				return casesensitive;

-		}

-		return true;

-	}

-	/* user method */

-	public String getBlockMarkerContext() {

-		return getBlockMarkerContext(fCurrentTagName);

-	}

-	/* user method */

-	public String getBlockMarkerContext(String name) {

-		Iterator iterator = fBlockMarkers.iterator();

-		while(iterator.hasNext()) {

-			BlockMarker marker = (BlockMarker)iterator.next();

-			if(marker.getTagName().equals(name))

-				return marker.getContext();

-		}

-		return BLOCK_TEXT;

-	}

-	/* user method */

-	public List getBlockMarkers() {

-		return fBlockMarkers;

-	}

-	/* user method */

-	public final int getOffset() {

-		return fOffset + yychar;

-	}

-	private final boolean isBlockMarker() {

-		return isBlockMarker(fCurrentTagName);

-	}

-	private final boolean isBlockMarker(String tagName) {

-		if (!fIsBlockingEnabled)

-			return false;

-		return containsTagName(tagName);

-	}

-	/**

-	 * user method

-	 */

-	public final void beginBlockTagScan(String newTagName) {

-		beginBlockMarkerScan(newTagName, BLOCK_TEXT);

-	}

-	/**

-	 * user method

-	 *

-	 * Special tokenizer setup.  Allows tokenization to be initiated at the

-	 * start of a text block within a "newTagName" tag.

-	 *

-	 * Example: 

-	 *	Tokenizer toker = new Tokenizer();

-	 *	toker.setCaseSensitiveBlocking(false);

-	 *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));

-	 *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);

-	 *	toker.getRegions(); 

-	 *

-	 * Returns:

-	 *	BLOCK_TEXT: 0-40

-	 *	XML_END_TAG_OPEN: 41-42

-	 *	XML_TAG_NAME: 43-48

-	 *	XML_TAG_CLOSE: 49-49

-	 *	XML_CONTENT: 50-57

-	 *

-	 */

-	public final void beginBlockMarkerScan(String newTagName, String blockcontext) {

-		yybegin(ST_BLOCK_TAG_SCAN);

-		fCurrentTagName = newTagName;

-	}

-

-/**

- * Method doScan.

- * 

- * Returns a context region for all of the text from the current position upto the end of input or

- * to right *before* the first occurence of searchString

- * 

- * @param searchString - target string to search for ex.: "-->", "</tagname"

- * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'

- * @param allowJSP - check for and allow for JSP markup <%%>

- * @param context - the context of the scanned region if non-zero length

- * @param exitState - the state to go to if the region was of non-zero length

- * @param abortState - the state to go to if the searchString was found immediately

- * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success

- * @throws IOException

- */

-private final String doScan(String searchString, boolean requireTailSeparator, boolean allowJSP, boolean allowCDATA, String searchContext, int exitState, int immediateFallbackState) throws IOException {

-	boolean stillSearching = true;

-	// Disable further block (probably)

-	fIsBlockingEnabled = false;

-	int searchStringLength = searchString.length();

-	int n = 0;

-	char lastCheckChar;

-	int i;

-	boolean same = false;

-	// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE

-	boolean checkJSPs = allowJSP && !fForbidJSP;

-	boolean checkedForJSPsOnce = !checkJSPs;

-	boolean checkedJSPsAtStartOnce = false;

-	

-	while (stillSearching) {

-		n = 0;

-		// Ensure that enough data from the input exists to compare against the search String.

-		n = yy_advance();

-		while(n != YYEOF && yy_currentPos < searchStringLength)

-			n = yy_advance();

-//		c = (char) n;

-		// If the input was too short or we've exhausted the input, stop immediately.

-		if (n == YYEOF && checkedForJSPsOnce) {

-			stillSearching = false;

-		}

-		else {

-			/**

-			 * Look for starting JSPs "<%"

-			 */

-			checkedForJSPsOnce = true;

-			// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs

-			// ---

-			// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.

-			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and

-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].

-			if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 

-				yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {

-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;

-				yy_currentPos = yy_markedPos + 1;

-				int resumeState = yystate();

-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);

-				if(yy_markedPos == yy_startRead) {

-					String jspContext = primGetNextToken();

-					yybegin(resumeState);

-					return jspContext;

-				}

-				return searchContext;

-			}

-			// 2) yy_currentPos - jspstarter.length : There's not searchStringLength of input available; check for a JSP 2 spots back in what we could read

-			// ---

-			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section

-			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't

-			// spill over the end of the buffer while checking.

-			else if(checkJSPs && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&

-					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {

-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;

-				yy_currentPos = yy_markedPos + 1;

-				int resumeState = yystate();

-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);

-				if(yy_markedPos == yy_startRead) {

-					String jspContext = primGetNextToken();

-					yybegin(resumeState);

-					return jspContext;

-				}

-				return searchContext;

-			}

-			// 3) yy_currentPos..(yy_currentPos+jspStartlength-1) : Check at the start of the block one time

-			// ---

-			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section

-			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.

-			else if(checkJSPs && !checkedJSPsAtStartOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&

-					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {

-				checkedJSPsAtStartOnce = true;

-				fLastInternalBlockStart = yy_markedPos = yy_startRead;

-				yy_currentPos = yy_markedPos + 1;

-				int resumeState = yystate();

-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);

-				if(yy_markedPos == yy_startRead) {

-					String jspContext = primGetNextToken();

-					yybegin(resumeState);

-					return jspContext;

-				}

-				return searchContext;

-			}

-

-

-			/**

-			 * Look for starting CDATA "<![CDATA["

-			 */

-			// 1) yy_currentPos - searchStringLength: There's at least searchStringLength of input available; once that's read, check for CDATA

-			// ---

-			// Look for a CDATA beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.

-			// Ensure that we've not encountered a complete block (<[!CDATA[]]>) that was *shorter* than the closeTagString and

-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].

-/*			if(checkCDATA && yy_currentPos > searchStringLength && yy_currentPos + searchStringLength < yy_buffer.length && yy_currentPos - searchStringLength != fLastInternalBlockStart && 

-				charsMatch(cdataStarter, yy_buffer, 0, yy_currentPos - searchStringLength)) {

-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;

-				yy_currentPos = yy_markedPos + 1;

-				int resumeState = yystate();

-				// go to a state where CDATA can be found

-				if (fEmbeddedContainer == null) {

-					fEmbeddedContainer = new ContextRegionContainer();

-					fEmbeddedContainer.setType(searchContext);

-					fEmbeddedContainer.setStart(yychar);

-				}

-				ITextRegion newToken = fRegionFactory.createToken(searchContext, yychar, yylength(), yylength());

-				fEmbeddedContainer.getRegions().add(newToken);

-				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());

-				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());

-				yybegin(YYINITIAL);

-				String context = primGetNextToken();

-				if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {

-					assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);

-				}

-				yybegin(resumeState);

-				return searchContext;

-			}

-*//*

-			// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read

-			// ---

-			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section

-			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't

-			// spill over the end of the buffer while checking.

-			else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&

-					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {

-				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;

-				yy_currentPos = yy_markedPos + 1;

-				int resumeState = yystate();

-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);

-				if(yy_markedPos == yy_startRead) {

-					String jspContext = primGetNextToken();

-					yybegin(resumeState);

-					return jspContext;

-				}

-				return searchContext;

-			}

-			// 3) yy_currentPos : Check at the start of the block one time

-			// ---

-			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section

-			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.

-			else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&

-					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {

-				checkedForCDATAOnce = true;

-				fLastInternalBlockStart = yy_markedPos = yy_startRead;

-				yy_currentPos = yy_markedPos + 1;

-				int resumeState = yystate();

-				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);

-				if(yy_markedPos == yy_startRead) {

-					String jspContext = primGetNextToken();

-					yybegin(resumeState);

-					return jspContext;

-				}

-				return searchContext;

-			}

-*/

-			// Check the characters in the target versus the last targetLength characters read from the buffer

-			// and see if it matches

-			if (n == YYEOF) {

-				stillSearching = false;

-			}

-			else {

-				same = true;

-				// safety check for array accesses

-				if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {

-					for(i = 0; i < searchStringLength; i++) {

-						if(same && fIsCaseSensitiveBlocking)

-							same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);

-						else if(same && !fIsCaseSensitiveBlocking)

-							same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));

-					}

-				}

-				// safety check failed; no match is possible right now

-				else {

-					same = false;

-				}

-			}

-			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {

-				// Additional check for close tags to ensure that targetString="</script" doesn't match

-				// "</scriptS"

-				lastCheckChar = yy_buffer[yy_currentPos];

-				// Succeed on "</script>" and "</script "

-				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))

-					stillSearching = false;

-			}

-			else {

-				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);

-			}

-		}

-	}

-	if (n != YYEOF || same) {

-		// We've stopped short of the end or definitely found a match

-		yy_markedPos = yy_currentPos - searchStringLength;

-		yy_currentPos = yy_markedPos + 1;

-		// If the searchString occurs at the very beginning of what would have

-		// been a Block, resume scanning normally immediately

-		if (yy_markedPos == yy_startRead) {

-			yybegin(immediateFallbackState);

-			return primGetNextToken();

-		}

-	}

-	else {

-		// We ran through the rest of the input

-		yy_markedPos = yy_currentPos;

-		yy_currentPos++;

-	}

-	yybegin(exitState);

-	// If the ending occurs at the very beginning of what would have

-	// been a Block, resume scanning normally immediately

-	if(yy_markedPos == yy_startRead)

-		return primGetNextToken();

-	return searchContext;

-}

-/**

- * user method 

- * does a lookahead for the current tag name

- */

-private final String doBlockTagScan() throws IOException {

-	fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();

-	return doScan("</" + fCurrentTagName, true, getBlockMarkerAllowsJSP(), true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);

-}

-	/**

-	 * user method

-	 *

-	 * Converts the raw context String returned by the primGetNextToken()

-	 * method into a full ITextRegion by pulling in values for the

-	 * current offset within the scanning text.

-	 *

-	 * Returns null when EOF is encountered and attaches intermittently

-	 * discovered whitespace onto the end of useful regions.

-	 *

-	 * Note that this algorithm caches the token following the one being returned

-	 * so that whitespace can be collapsed.

-	 */

-	public final ITextRegion getNextToken() throws IOException {

-		fEmbeddedContainer = null;

-		// load the starting non-whitespace token (assume that it is so)

-		if (fShouldLoadBuffered) {

-			if (fBufferedEmbeddedContainer != null) {

-				ITextRegion container = fBufferedEmbeddedContainer;

-				fBufferedEmbeddedContainer = null;

-				fShouldLoadBuffered = false;

-				return container;

-			}

-			context = fBufferedContext;

-			start = fBufferedStart;

-			textLength = length = fBufferedLength;

-			fShouldLoadBuffered = false;

-		} else {

-			context = primGetNextToken();

-			if (context == PROXY_CONTEXT) {

-				return fEmbeddedContainer;

-			} else if (context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {

-				if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))

-					fCurrentTagName = yytext();

-				else

-					fCurrentTagName = null;

-			} else if (context == XML_TAG_OPEN) {

-				fIsBlockingEnabled = true;

-			} else if (context == XML_END_TAG_OPEN) {

-				fIsBlockingEnabled = false;

-			}

-			start = yychar;

-			textLength = length = yylength();

-			if (yy_atEOF) {

-				fTokenCount++;

-				return null;

-			}

-		}

-		// store the next token

-		f_context = primGetNextToken();

-		if (f_context == PROXY_CONTEXT) {

-			fBufferedEmbeddedContainer = fEmbeddedContainer;

-			fShouldLoadBuffered = true;

-		} else if (f_context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {

-			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))

-				fCurrentTagName = yytext();

-			else

-				fCurrentTagName = null;

-		} else if (f_context == XML_TAG_OPEN) {

-			fIsBlockingEnabled = true;

-		} else if (f_context == XML_END_TAG_OPEN) {

-			fIsBlockingEnabled = false;

-		}

-		fBufferedContext = f_context;

-		fBufferedStart = yychar;

-		fBufferedLength = yylength();

-		fShouldLoadBuffered = true;

-		if (fBufferedContext == WHITE_SPACE) {

-			fShouldLoadBuffered = false;

-			length += fBufferedLength;

-		}

-		if (context == null) {

-			// EOF

-			if (Debug.debugTokenizer) {

-				System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$

-			}

-			return null;

-		}

-		fTokenCount++;

-		return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);

-	}

-	/* user method */

-	public JSPTokenizer(){

-		super();

-	}

-	/* user method */

-	public JSPTokenizer(char[] charArray){

-			this(new CharArrayReader(charArray));

-	}

-	/* user method */

-	public void reset(char[] charArray) {

-		reset(new CharArrayReader(charArray), 0);

-	}

-	/* user method */

-	public void reset(char[] charArray, int newOffset) {

-		reset(new CharArrayReader(charArray), newOffset);

-	}

-	/* user method */

-	public void reset(java.io.InputStream in) {

-		reset(new java.io.InputStreamReader(in), 0);

-	}

-	/* user method */

-	public void reset(java.io.InputStream in, int newOffset) {

-		reset(new java.io.InputStreamReader(in), newOffset);

-	}

-	/* user method */

-	public void reset(java.io.Reader in) {

-		reset(in, 0);

-	}

-	/**

-	 * user method *

-	 *

-	 * Reset internal counters and vars to "newly created" values, in the hopes

-	 * that resetting a pre-existing tokenizer is faster than creating a new one.

-	 *

-	 * This method contains code blocks that were essentially duplicated from the

-	 * <em>generated</em> output of this specification before this method was

-	 * added.  Those code blocks were under the above copyright.

-	 */

-	public void reset(java.io.Reader in, int newOffset) {

-		if (Debug.debugTokenizer) {

-			System.out.println("resetting tokenizer");//$NON-NLS-1$

-		}

-		fOffset = newOffset;

-	

-		/* the input device */

-		yy_reader = in;

-	

-		/* the current state of the DFA */

-		yy_state = 0;

-	

-		/* the current lexical state */

-		yy_lexical_state = YYINITIAL;

-	

-		/* this buffer contains the current text to be matched and is

-		the source of the yytext() string */

-		java.util.Arrays.fill(yy_buffer, (char)0);

-	

-		/* the textposition at the last accepting state */

-		yy_markedPos = 0;

-	

-		/* the textposition at the last state to be included in yytext */

-		yy_pushbackPos = 0;

-	

-		/* the current text position in the buffer */

-		yy_currentPos = 0;

-	

-		/* startRead marks the beginning of the yytext() string in the buffer */

-		yy_startRead = 0;

-	

-		/** 

-		 * endRead marks the last character in the buffer, that has been read

-		 * from input 

-		 */

-		yy_endRead = 0;

-	

-		/* number of newlines encountered up to the start of the matched text */

-		yyline = 0;

-	

-		/* the number of characters up to the start of the matched text */

-		yychar = 0;

-	

-		/* yy_atEOF == true <=> the scanner has returned a value for EOF */

-		yy_atEOF = false;

-	

-		/* denotes if the user-EOF-code has already been executed */

-		yy_eof_done = false;

-	

-	

-		/* user vars: */

-		fTokenCount = 0;

-	 

-		fShouldLoadBuffered = false;

-		fBufferedContext = null;

-		fBufferedStart = 1;

-		fBufferedLength = 0;

-		fStateStack = new IntStack();

-	

-		fLastInternalBlockStart = -1;

-	

-		context = null;

-		start = 0;

-		textLength = 0;

-		length = 0;

-	

-		fEmbeddedContainer = null;

-		

-		fELlevel = 0;

-	}

-	/**

-	 * user method

-	 *

-	 */

-	public BlockTokenizer newInstance() {

-		JSPTokenizer newInstance = new JSPTokenizer();

-		// global tagmarkers can be shared; they have no state and 

-		// are never destroyed (e.g. 'release')

-		for(int i = 0; i < fBlockMarkers.size(); i++) {

-			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);

-			if(blockMarker.isGlobal())

-				newInstance.addBlockMarker(blockMarker);

-		}

-		for(int i = 0; i < fNestablePrefixes.size(); i++) {

-			TagMarker marker = (TagMarker) fNestablePrefixes.get(i);

-			if(marker.isGlobal())

-				newInstance.addNestablePrefix(marker);

-		}

-		return newInstance;

-	}

-	/* user method */

-	private final String scanXMLCommentText() throws IOException {

-		// Scan for '-->' and return the text up to that point as

-		//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which

-		//  case change to the ST_XML_COMMENT_END state and return the next

-		//  context as usual.

-		return doScan("-->", false, true, true, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);

-	}

-	/* user method */

-	private final String scanJSPCommentText() throws IOException {

-		// Scan for '--%>' and return the text up to that point as

-		//   JSP_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which

-		//  case change to the ST_JSP_COMMENT_END state and return the next

-		//  context as usual.

-		return doScan("--%>", false, false, true, JSP_COMMENT_TEXT, ST_JSP_COMMENT_END, ST_JSP_COMMENT_END);

-	}

-%}

-

-%eof{

-// do nothing, this is the downstream parser's job

-%eof}

-

-%public

-%class JSPTokenizer

-%implements BlockTokenizer, DOMJSPRegionContexts

-%function primGetNextToken

-%type String

-%char

-%line

-%unicode

-%pack

-

-%state ST_CDATA_TEXT

-%state ST_CDATA_END

-%state ST_XML_COMMENT

-%state ST_XML_COMMENT_END

-%state ST_PI

-%state ST_PI_WS

-%state ST_PI_CONTENT

-%state ST_XML_PI_ATTRIBUTE_NAME

-%state ST_XML_PI_EQUALS

-%state ST_XML_PI_ATTRIBUTE_VALUE

-%state ST_XML_PI_TAG_CLOSE

-%state ST_DHTML_ATTRIBUTE_NAME

-%state ST_DHTML_EQUALS

-%state ST_DHTML_ATTRIBUTE_VALUE

-%state ST_DHTML_TAG_CLOSE

-

-// scriptlet state(s)

-%state ST_JSP_CONTENT

-%state ST_JSP_DIRECTIVE_NAME

-%state ST_JSP_DIRECTIVE_NAME_WHITESPACE

-%state ST_JSP_DIRECTIVE_ATTRIBUTE_NAME

-%state ST_JSP_DIRECTIVE_EQUALS

-%state ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE

-

-// normal tag states

-%state ST_XML_TAG_NAME

-%state ST_XML_ATTRIBUTE_NAME

-%state ST_XML_EQUALS

-%state ST_XML_ATTRIBUTE_VALUE

-

-// declaration (DTD) states

-%state ST_XML_DECLARATION

-%state ST_XML_DECLARATION_CLOSE

-

-%state ST_XML_DOCTYPE_DECLARATION

-%state ST_XML_DOCTYPE_EXTERNAL_ID

-%state ST_XML_DOCTYPE_ID_PUBLIC

-%state ST_XML_DOCTYPE_ID_SYSTEM

-

-%state ST_XML_ELEMENT_DECLARATION

-%state ST_XML_ELEMENT_DECLARATION_CONTENT

-

-%state ST_XML_ATTLIST_DECLARATION

-%state ST_XML_ATTLIST_DECLARATION_CONTENT

-

-

-%state ST_BLOCK_TAG_SCAN

-%state ST_BLOCK_TAG_INTERNAL_SCAN

-

-%state ST_JSP_COMMENT

-%state ST_JSP_COMMENT_END

-

-%state ST_XML_ATTRIBUTE_VALUE_SQUOTED

-%state ST_XML_ATTRIBUTE_VALUE_DQUOTED

-

-%state ST_ABORT_EMBEDDED

-

-%state ST_JSP_EL

-%state ST_JSP_EL_SQUOTES

-%state ST_JSP_EL_DQUOTES

-%state ST_JSP_EL_SQUOTES_END

-%state ST_JSP_EL_DQUOTES_END

-

-%state ST_JSP_DQUOTED_EL

-%state ST_JSP_SQUOTED_EL

-

-%state ST_JSP_VBL

-%state ST_JSP_VBL_SQUOTES

-%state ST_JSP_VBL_DQUOTES

-%state ST_JSP_VBL_SQUOTES_END

-%state ST_JSP_VBL_DQUOTES_END

-

-%state ST_JSP_DQUOTED_VBL

-%state ST_JSP_SQUOTED_VBL

-

-// Letter = ([A-Za-z])

-// Digit = ([0-9])

-

-/**

- * smaller tokens

- */

-genericTagOpen       = <

-genericTagClose      = >

-genericEndTagOpen    = <\/

-genericEmptyTagClose = \/>

-

-PIstart = <\?

-PIend   = \?>

-

-

-// [1] document ::= prolog element Misc*

-document = ({prolog} {element} {Misc}*)

-

-// [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

- //Char = (.)

-Char = [\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD] 

-

-// [3] S ::= (0x20 | 0x9 | 0xD | 0xA)+

-S = [\x20\x09\x0D\x0A]+

-

-// [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender

-NameChar = ({Letter} | {Digit} | \. | \- | _ | : | {CombiningChar} | {Extender})

-

-// [5] Name ::= (Letter | '_' | ':') NameChar*

-//Name = ({NameChar}{NameChar}*)

-Name = ({Letter} | _ | :){NameChar}*

-

-// [6] Names ::= {Name} ({S} {Name})*

-Names = ({Name} ({S} {Name})*)

-

-// [7] Nmtoken ::= (NameChar)+

-Nmtoken = ({NameChar}+)

-

-// [8] Nmtokens ::= Nmtoken (S Nmtoken)*

-Nmtokens = ({Nmtoken} ({S} {Nmtoken})*)

-

-// [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' |  "'" ([^%&'] | PEReference | Reference)* "'"

-EntityValue = (\" ([^%&\"] | {PEReference} | {Reference})* \" |  \' ([^%&\'] | {PEReference} | {Reference})* \')

-

-// \x24 = '$', \x7b = '{', \x23 = '#'

-// [10] AttValue ::= '"' ([^<&"] | Reference)* '"' |  "'" ([^<&'] | Reference)* "'"

-AttValue = ( \"([^<"\x24\x23] | [\x24\x23][^\x7b"] | {Reference})*[\x24\x23]*\" | \'([^<'\x24\x23] | [\x24\x23][^\x7b'] | {Reference})*[\x24\x23]*\'  | ([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )*)

-

-// [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") 

-SystemLiteral = ((\" [^\"]* \") | (\' [^\']* \')) 

-

-// [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"

-PubidLiteral = (\" {PubidChar}* \" | \' ({PubidChar}\')* "'")

-

-// [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

-PubidChar = ([\040\015\012] | [a-zA-Z0-9] | [\-\'()\+,.\/:=?;!\*#@\$_%])

-

-// [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

-// implement lookahead behavior during action definition

-CharData = ([^<&(\]\]>)]*)

-

-// [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

-CommentStart = (<!\-\-)

-CommentEnd   = (\-\->)

-Comment = ({CommentStart}.*{CommentEnd})

-

-// [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'

-PI = (<\?{PITarget} {Char}* \?>)

-

-// [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

-PITarget = ({Name}((X|x)(M|m)(L|l)))

-

-// [18] CDSect ::= CDStart CData CDEnd

-CDSect = ({CDStart}{CData}{CDEnd})

-

-// [19] CDStart ::= '<![CDATA['

-CDStart = <!\[CDATA\[

-

-// [20] CData ::= (Char* - (Char* ']]>' Char*)) 

-// implement lookahead behavior during action definition

-CData = ([^(\]\]>)]*)

-

-// [21] CDEnd ::= ']]>'

-CDEnd = (\]\]>)

-

-// [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

-prolog = ({XMLDecl}? {Misc}* ({doctypedecl} {Misc}*)?)

-

-// [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

-XMLDecl = (<\?xml {VersionInfo} {EncodingDecl}? {SDDecl}? {S}? \?>)

-

-// [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")

-VersionInfo = ({S}version{Eq}(\'{VersionNum}\' | \"{VersionNum}\"))

-

-// [25] Eq ::= S? '=' S?

-Eq = (\=)

-

-// [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+

-VersionNum = (([a-zA-Z0-9_.:]|\-)+)

-

-// [27] Misc ::= Comment | PI |  S

-Misc = ({Comment} | {PI} | {S})

-

-// [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)?  S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>'

-doctypedecl = (<\!DOCTYPE{S}{Name} ({S}{ExternalID})? {S}? (\[ ({markupdecl}|{PEReference}|{S})* \]{S}?)?>)

-

-// [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment

-markupdecl = ({elementdecl} | {AttlistDecl} | {EntityDecl} | {NotationDecl} | {PI} | {Comment})

-

-// [30] extSubset ::= TextDecl? extSubsetDecl

-extSubset = ({TextDecl}? {extSubsetDecl})

-

-// [31] extSubsetDecl ::= ( markupdecl | conditionalSect | PEReference | S )*

-extSubsetDecl = (( {markupdecl} | {conditionalSect} | {PEReference} | {S} )*)

-

-// [32]  SDDecl  ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))

-SDDecl  = ({S}standalone{Eq}{S}*((\'(yes|no)\')|(\"(yes|no)\")))

-

-// [33]  LanguageID  ::= Langcode ('-' Subcode)*

-LanguageID  = ({Langcode}(\-{Subcode})*)

-

-// [34]  Langcode ::= ISO639Code |  IanaCode |  UserCode

-Langcode = ({ISO639Code} |  {IanaCode} |  {UserCode})

-

-// [35]  ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])

-ISO639Code = (([a-z]|[A-Z])([a-z]|[A-Z]))

-

-// [36]  IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+

-IanaCode = ((i|I)\-([a-z]|[A-Z])+)

-

-// [37]  UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+

-UserCode = ((x|X)\-([a-z]|[A-Z])+)

-

-// [38]  Subcode ::= ([a-z] | [A-Z])+

-Subcode = (([a-z]|[A-Z])+)

-

-// [39]  element  ::= EmptyElemTag | STag content ETag

-element  = ({EmptyElemTag} | {STag} {content} {ETag})

-

-// [40]  STag  ::= '<' Name (S Attribute)* S? '>'

-STag = (<{Name}({S}{Attribute})*{S}?>)

-

-// [41]  Attribute ::= Name Eq AttValue

-Attribute = ({Name}{S}*{Eq}{S}*{AttValue})

-

-// [42]  ETag  ::= 'Name S? '>'

-ETag = (<\/{Name}{S}?>)

-

-// [43]  content  ::= (element | CharData | Reference | CDSect | PI | Comment)*

-content = (({element} | {CharData} | {Reference} | {CDSect} | {PI} | {Comment})*)

-

-// [44]  EmptyElemTag  ::= '<' Name (S Attribute)* S? '/>'

-EmptyElemTag = (<{Name}({S}{Attribute})*{S}?\/>)

-

-// [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'

-elementdecl = (<\!ELEMENT{S}{Name}{S}{contentspec}{S}?>)

-

-// [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

-contentspec = (EMPTY|ANY|{Mixed}|{children})

-

-// [47] children ::= (choice | seq) ('?' | '*' | '+')?

-children = (({choice}|{seq})(\?|\*|\+)?)

-

-// CAUSES LOOP THROUGH DEFS OF CHOICE AND SEQ

-// [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?

-cp = (({Name} | {choice} | {seq}) (\?|\*|\+)?)

-

-// [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')'

-// choice = \({S}?{cp}({S}?\|{S}?{cp})*{S}?\)

-choice = \({S}?{Name}({S}?\|{S}?{Name})*{S}?\)

-

-// [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'

-// seq = (\({S}?{cp}({S}?\,{S}?{cp})*{S}?\))

-seq = (\({S}?{Name}({S}?\,{S}?{Name})*{S}?\))

-

-// [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S?  ')*' | '(' S? '#PCDATA' S? ')'

-Mixed = ({S}?\#PCDATA({S}?\|{S}?{Name})*{S}?)*\|({S}?\#PCDATA{S}?)

-

-// [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'

-AttlistDecl = (<\!ATTLIST{S}{Name}{AttDef}*{S}?>)

-

-// [53] AttDef ::= S Name S AttType S DefaultDecl

-AttDef = ({S}{Name}{S}{AttType}{S}{DefaultDecl})

-

-// [54] AttType ::= StringType | TokenizedType | EnumeratedType 

-AttType = ({StringType} | {TokenizedType} | {EnumeratedType})

-

-// [55] StringType ::= 'CDATA'

-StringType = (CDATA)

-

-// [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'

-TokenizedType = (ID|IDREF|IDREFS|ENTITY|ENTITIES|NMTOKEN|NMTOKENS)

-

-// [57] EnumeratedType ::= NotationType | Enumeration 

-EnumeratedType = ({NotationType} | {Enumeration})

-

-// [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' 

-NotationType = (NOTATION{S}\({S}?{Name}({S}?\|{S}?{Name})*{S}?\))

-

-// [59] Enumeration ::= '(' S? Nmtoken (S? '|' S?  Nmtoken)* S? ')'

-Enumeration = (\({S}?{Nmtoken}({S}?\|{S}?{Nmtoken})*{S}?\))

-

-// [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)

-DefaultDecl = (\#REQUIRED|\#IMPLIED|((\#FIXED{S})?{AttValue}))

-

-// [61] conditionalSect ::= includeSect | ignoreSect 

-conditionalSect = ({includeSect} | {ignoreSect})

-

-// [62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' 

-includeSect = (<\!\[{S}?INCLUDE{S}?\[{extSubsetDecl}\]\]>)

-

-// [63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'

-ignoreSect = (<\!\[{S}?IGNORE{S}?\[{ignoreSectContents}*\]\]>)

-

-// [64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*

-ignoreSectContents = ({Ignore}(<\!\[{ignoreSectContents}\]\]>{Ignore})*)

-

-// [65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)

-Ignore =  ([^(\<\!\[|\]\]\>)]*)

-

-// [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'

-CharRef = (&#[0-9]+;|&#x[0-9a-fA-F]+;)

-

-// [67] Reference ::= EntityRef | CharRef

-Reference = ({EntityRef} | {CharRef})

-

-// [68] EntityRef = '&' Name ';'

-EntityRef = (&{Name};)

-

-// [69] PEReference ::= '%' Name ';'

-PEReference = (%{Name};)

-

-// [70] EntityDecl ::= GEDecl | PEDecl

-EntityDecl = ({GEDecl} | {PEDecl})

-

-// [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'

-GEDecl = (<\!ENTITY{S}{Name}{S}{EntityDef}{S}?>)

-

-// [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'

-PEDecl = (<\!ENTITY{S}\%{S}{Name}{S}{PEDef}{S}?>)

-

-// [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)

-EntityDef = ({EntityValue} | ({ExternalID}{NDataDecl}?))

-

-// [74] PEDef ::= EntityValue | ExternalID

-PEDef = ({EntityValue} | {ExternalID})

-

-// [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral 

-ExternalID = (SYSTEM{S}{SystemLiteral}|PUBLIC{S}{PubidLiteral}{S}{SystemLiteral} )

-

-// [76] NDataDecl ::= S 'NDATA' S Name

-NDataDecl = ({S}NDATA{S}{Name})

-

-// [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'

-TextDecl = (<\?xml{VersionInfo}?{EncodingDecl}{S}?\?>)

-

-// [78] extParsedEnt ::= TextDecl? content

-extParsedEnt = ({TextDecl}?{content})

-

-// [79] extPE ::= TextDecl? extSubsetDecl

-extPE = ({TextDecl}?{extSubsetDecl})

-

-// [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' |  "'" EncName "'" ) 

-EncodingDecl = ({S}encoding{S}*{Eq}{S}*(\"{EncName}\"|\'{EncName}\'))

-

-// [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*

-EncName = ([A-Za-z]([A-Za-z0-9._]|\-)*)

-

-// [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID |  PublicID) S? '>'

-NotationDecl = (<\!NOTATION{S}{Name}{S}({ExternalID}|{PublicID}){S}?>)

-

-// [83] PublicID ::= 'PUBLIC' S PubidLiteral

-PublicID = (PUBLIC{S}{PubidLiteral})

-

-// [84]  Letter ::= BaseChar | Ideographic

-Letter = ({BaseChar} | {Ideographic})

-

-// [85]  BaseChar ::= [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6]

-// | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131]

-// | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E]

-// | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5]

-// | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386

-// | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE]

-// | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0

-// | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F]

-// | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4]

-// | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB]

-// | [#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559

-// | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2]

-// | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7]

-// | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5

-// | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961]

-// | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8]

-// | [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD]

-// | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A]

-// | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30]

-// | [#x0A32-#x0A33] | [#x0A35-#x0A36] | [#x0A38-#x0A39]

-// | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85-#x0A8B]

-// | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0]

-// | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0

-// | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28]

-// | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D

-// | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A]

-// | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C

-// | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA]

-// | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C]

-// | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33]

-// | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C]

-// | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3]

-// | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C]

-// | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39]

-// | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33]

-// | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88]

-// | #x0E8A | #x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F]

-// | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB]

-// | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD

-// | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69]

-// | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103]

-// | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112]

-// | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150

-// | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165

-// | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175

-// | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8]

-// | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9

-// | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15]

-// | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D]

-// | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D]

-// | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4]

-// | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB]

-// | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126

-// | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094]

-// | [#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]

-BaseChar = [\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4-\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7-\u04C8\u04CB-\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8-\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5-\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0E01-\u0E2E\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EAE\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102-\u1103\u1105-\u1107\u1109\u110B-\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154-\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D-\u116E\u1172-\u1173\u1175\u119E\u11A8\u11AB\u11AE-\u11AF\u11B7-\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u212A-\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3]

-

-// [86]  Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]

-Ideographic = [\u4E00-\u9FA5\u3007\u3021-\u3029]

-

-// [87]      CombiningChar    ::=    [#x0300-#x0345]    | [#x0360-#x0361]

-// | [#x0483-#x0486]          | [#x0591-#x05A1]         | [#x05A3-#x05B9]

-// | [#x05BB-#x05BD]       | #x05BF       | [#x05C1-#x05C2]	 | #x05C4

-// | [#x064B-#x0652]    | #x0670    | [#x06D6-#x06DC]   | [#x06DD-#x06DF]

-// | [#x06E0-#x06E4]          | [#x06E7-#x06E8]         | [#x06EA-#x06ED]

-// | [#x0901-#x0903]       | #x093C       | [#x093E-#x094C]      | #x094D

-// | [#x0951-#x0954]    | [#x0962-#x0963]    | [#x0981-#x0983]   | #x09BC

-// | #x09BE       | #x09BF       | [#x09C0-#x09C4]      | [#x09C7-#x09C8]

-// | [#x09CB-#x09CD]   | #x09D7   | [#x09E2-#x09E3]   | #x0A02   | #x0A3C

-// | #x0A3E       | #x0A3F       | [#x0A40-#x0A42]      | [#x0A47-#x0A48]

-// | [#x0A4B-#x0A4D]    | [#x0A70-#x0A71]    | [#x0A81-#x0A83]   | #x0ABC

-// | [#x0ABE-#x0AC5]          | [#x0AC7-#x0AC9]         | [#x0ACB-#x0ACD]

-// | [#x0B01-#x0B03]    | #x0B3C    | [#x0B3E-#x0B43]   | [#x0B47-#x0B48]

-// | [#x0B4B-#x0B4D]          | [#x0B56-#x0B57]         | [#x0B82-#x0B83]

-// | [#x0BBE-#x0BC2]    | [#x0BC6-#x0BC8]    | [#x0BCA-#x0BCD]   | #x0BD7

-// | [#x0C01-#x0C03]          | [#x0C3E-#x0C44]         | [#x0C46-#x0C48]

-// | [#x0C4A-#x0C4D]          | [#x0C55-#x0C56]         | [#x0C82-#x0C83]

-// | [#x0CBE-#x0CC4]          | [#x0CC6-#x0CC8]         | [#x0CCA-#x0CCD]

-// | [#x0CD5-#x0CD6]          | [#x0D02-#x0D03]         | [#x0D3E-#x0D43]

-// | [#x0D46-#x0D48]       | [#x0D4A-#x0D4D]       | #x0D57      | #x0E31

-// | [#x0E34-#x0E3A]    | [#x0E47-#x0E4E]    | #x0EB1   | [#x0EB4-#x0EB9]

-// | [#x0EBB-#x0EBC]    | [#x0EC8-#x0ECD]    | [#x0F18-#x0F19]   | #x0F35

-// | #x0F37      | #x0F39     | #x0F3E     | #x0F3F     | [#x0F71-#x0F84]

-// | [#x0F86-#x0F8B]    | [#x0F90-#x0F95]    | #x0F97   | [#x0F99-#x0FAD]

-// | [#x0FB1-#x0FB7]       | #x0FB9       | [#x20D0-#x20DC]      | #x20E1

-// | [#x302A-#x302F] | #x3099 | #x309A

-CombiningChar =    [\u0300-\u0345\u0360-\u0361\u0483-\u0486\u0591-\u05A1\u05A3-\u05B9\u05BB-\u05BD\u05BF\u05C1-\u05C2\u05C4\u064B-\u0652\u0670\u06D6-\u06DC\u06DD-\u06DF\u06E0-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0901-\u0903\u093C\u093E-\u094C\u094D\u0951-\u0954\u0962-\u0963\u0981-\u0983\u09BC\u09BE\u09BF\u09C0-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09E2-\u09E3\u0A02\u0A3C\u0A3E\u0A3F\u0A40-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A70-\u0A71\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0B01-\u0B03\u0B3C\u0B3E-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B82-\u0B83\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C01-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C82-\u0C83\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86-\u0F8B\u0F90-\u0F95\u0F97\u0F99-\u0FAD\u0FB1-\u0FB7\u0FB9\u20D0-\u20DC\u20E1\u302A-\u302F\u3099\u309A]

-

-// [88]   Digit  ::=  [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9]

-// | [#x0966-#x096F]          | [#x09E6-#x09EF]         | [#x0A66-#x0A6F]

-// | [#x0AE6-#x0AEF]          | [#x0B66-#x0B6F]         | [#x0BE7-#x0BEF]

-// | [#x0C66-#x0C6F]          | [#x0CE6-#x0CEF]         | [#x0D66-#x0D6F]

-// | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]

-Digit =  [\u0030-\u0039\u0660-\u0669\u06F0-\u06F9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE7-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29]

-

-// [89]  Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46

-// | #x0EC6       | #x3005       | [#x3031-#x3035]      | [#x309D-#x309E]

-// | [#x30FC-#x30FE]

-Extender = [\u00B7\u02D0\u02D1\u0387\u0640\u0E46\u0EC6\u3005\u3031-\u3035\u309D-\u309E\u30FC-\u30FE]

-

-

-

-/**

- * JSP and scripting marker allowances

- */

-

-jspCommentStart = <%--

-jspCommentEnd   = --%>

-

-jspScriptletStart        = <%

-jspExpressionStart       = {jspScriptletStart}=

-jspDeclarationStart      = {jspScriptletStart}\!

-jspScriptletEnd          = %>

-jspDirectiveStart        = {jspScriptletStart}@

-

-%%

-

-/* white space within a tag */

-<ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_PI, ST_XML_PI_EQUALS, ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_ATTRIBUTE_VALUE, ST_XML_DECLARATION, ST_XML_DOCTYPE_DECLARATION, ST_XML_ELEMENT_DECLARATION, ST_XML_ATTLIST_DECLARATION, ST_XML_DECLARATION_CLOSE, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_EXTERNAL_ID, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE,ST_XML_ATTRIBUTE_VALUE_DQUOTED,ST_XML_ATTRIBUTE_VALUE_SQUOTED,ST_DHTML_ATTRIBUTE_NAME,ST_DHTML_EQUALS,ST_DHTML_ATTRIBUTE_VALUE,ST_DHTML_TAG_CLOSE> {S}* {

-	if(Debug.debugTokenizer)

-		dump("white space");//$NON-NLS-1$

-        return WHITE_SPACE;

-}

-

-// BEGIN REGULAR XML

-/* handle opening a new tag almost anywhere */

-

-

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_DECLARATION, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_NAME_WHITESPACE, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE> {genericTagOpen} {

-	if(Debug.debugTokenizer)

-		dump("\nstart tag open");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_NAME;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-        yybegin(ST_XML_TAG_NAME);

-        return XML_TAG_OPEN;

-}

-/* VERY special cases for tags as values */

-/* quoted JSP */

-<ST_XML_ATTRIBUTE_VALUE_DQUOTED> ["] {

-	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;

-}

-<ST_XML_ATTRIBUTE_VALUE_SQUOTED> ['] {

-	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;

-}

-<ST_XML_ATTRIBUTE_VALUE> ["] {

-	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-	}

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;

-	yybegin(ST_XML_ATTRIBUTE_VALUE_DQUOTED);

-	fStateStack.push(yystate());

-	if(Debug.debugTokenizer)

-		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$

-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_DQUOTE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE);

-	fStateStack.pop();

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-	yybegin(ST_XML_ATTRIBUTE_NAME);

-	return PROXY_CONTEXT;

-}

-<ST_XML_ATTRIBUTE_VALUE> ['] {

-	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-	}

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;

-	yybegin(ST_XML_ATTRIBUTE_VALUE_SQUOTED);

-	fStateStack.push(yystate());

-	if(Debug.debugTokenizer)

-		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$

-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_SQUOTE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE);

-	fStateStack.pop();

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-	return PROXY_CONTEXT;

-}

-

-<ST_XML_ATTRIBUTE_VALUE_DQUOTED> ([^<"\x24\x23]|[\x24\x23][^\x7b])+ {

-	return XML_TAG_ATTRIBUTE_VALUE;

-}

-<ST_XML_ATTRIBUTE_VALUE_SQUOTED> ([^<'\x24\x23]|[\x24\x23][^\x7b])+ {

-	return XML_TAG_ATTRIBUTE_VALUE;

-}

-

-<ST_XML_ATTRIBUTE_VALUE_DQUOTED,ST_XML_ATTRIBUTE_VALUE_SQUOTED> {genericTagOpen} {

-	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-	}

-	int incomingState = yystate();

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	if(Debug.debugTokenizer)

-		dump("tag inside of JSP attribute value start");//$NON-NLS-1$

-	yybegin(ST_XML_TAG_NAME);

-	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});

-	if(yystate() != ST_ABORT_EMBEDDED)

-        yybegin(incomingState);

-	return PROXY_CONTEXT;

-}

-<ST_XML_ATTRIBUTE_VALUE_DQUOTED,ST_XML_ATTRIBUTE_VALUE_SQUOTED> {genericEndTagOpen} {

-	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-	}

-	int incomingState = yystate();

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	if(Debug.debugTokenizer)

-		dump("JSP attribute value start - end tag");//$NON-NLS-1$

-	yybegin(ST_XML_TAG_NAME);

-	assembleEmbeddedContainer(XML_END_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});

-	if(yystate() != ST_ABORT_EMBEDDED)

-        yybegin(incomingState);

-	return PROXY_CONTEXT;

-}

-

-/* unquoted */

-<ST_XML_ATTRIBUTE_VALUE> {genericTagOpen} {

-	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-	}

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	fStateStack.push(yystate());

-	if(Debug.debugTokenizer)

-		dump("JSP tag embedded name start - start tag");//$NON-NLS-1$

-	yybegin(ST_XML_TAG_NAME);

-	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});

-	fStateStack.pop();

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-	return PROXY_CONTEXT;

-}

-

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_XML_DECLARATION> {genericEndTagOpen} {

-	if(Debug.debugTokenizer)

-		dump("\nend tag open");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_NAME;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-        yybegin(ST_XML_TAG_NAME);

-        return XML_END_TAG_OPEN;

-}

-/* specially treated JSP tag names */

-<ST_XML_TAG_NAME> jsp:root {

-	if(Debug.debugTokenizer)

-		dump("jsp:root tag name");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-        return JSP_ROOT_TAG_NAME;

-}

-<ST_XML_TAG_NAME> jsp:directive.(page|include|tag|taglib|attribute|variable) {

-	if(Debug.debugTokenizer)

-		dump("jsp directive tag name");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-        return JSP_DIRECTIVE_NAME;

-}

-/* the tag's name was found, start scanning for attributes */

-<ST_XML_TAG_NAME> {Name} {

-	if(Debug.debugTokenizer)

-		dump("tag name");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-

-/* another attribute name was found, resume looking for the equals sign */

-<ST_XML_ATTRIBUTE_NAME, ST_XML_EQUALS> {Name} {

-	if(Debug.debugTokenizer)

-		dump("attr name");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-        yybegin(ST_XML_EQUALS);

-        return XML_TAG_ATTRIBUTE_NAME;

-}

-/* an equal sign was found, what's next is the value */

-<ST_XML_EQUALS> {Eq} {

-	if(Debug.debugTokenizer)

-		dump("equals");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-        yybegin(ST_XML_ATTRIBUTE_VALUE);

-        return XML_TAG_ATTRIBUTE_EQUALS;

-}

-/* the value was found, look for the next name */

-<ST_XML_ATTRIBUTE_VALUE> {AttValue} {

-	if(Debug.debugTokenizer)

-		dump("attr value");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-        return XML_TAG_ATTRIBUTE_VALUE;

-}

-/* the tag's close was found */

-<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("tag close");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-	if(isBlockMarker()) {

-		fEmbeddedHint = getBlockMarkerContext();

-		fEmbeddedPostState = ST_BLOCK_TAG_SCAN;

-        	yybegin(ST_BLOCK_TAG_SCAN);

-	}

-	else

-        	yybegin(YYINITIAL);

-        return XML_TAG_CLOSE;

-}

-/* the tag's close was found, but the tag doesn't need a matching end tag */

-<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericEmptyTagClose} {

-        yybegin(YYINITIAL);

-	fEmbeddedHint = UNDEFINED;

-	if(Debug.debugTokenizer)

-		dump("empty tag close");//$NON-NLS-1$

-        return XML_EMPTY_TAG_CLOSE;

-}

-

-<ST_XML_TAG_NAME> [^</>\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4-\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7-\u04C8\u04CB-\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8-\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5-\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0E01-\u0E2E\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EAE\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102-\u1103\u1105-\u1107\u1109\u110B-\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154-\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D-\u116E\u1172-\u1173\u1175\u119E\u11A8\u11AB\u11AE-\u11AF\u11B7-\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u212A-\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3\u4E00-\u9FA5\u3007\u3021-\u3029]* {

-	if(Debug.debugTokenizer)

-		dump("inappropriate tag name");//$NON-NLS-1$

-	if(!fStateStack.empty() && (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED||fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED)) {

-		yybegin(ST_ABORT_EMBEDDED);

-		yypushback(yylength()-1);

-		return XML_TAG_ATTRIBUTE_VALUE;

-	}

-	yybegin(YYINITIAL);

-        return XML_CONTENT;

-}

-

-// END REGULAR XML

-

-// BEGIN NESTED XML TAGS

-<ST_XML_ATTRIBUTE_NAME, ST_XML_EQUALS> <{Name} {

-	String tagName = yytext().substring(1);

-	// pushback to just after the opening bracket

-	yypushback(yylength() - 1);

-	/*

-	 * If this tag can not be nested or we're already searching for an

-	 * attribute name, equals, or value, return immediately.

-	 */

-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {

-		yybegin(ST_XML_TAG_NAME);

-		return XML_TAG_OPEN;

-	}

-	if(Debug.debugTokenizer)

-		dump("tag in place of attr name");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	fStateStack.push(yystate());

-	// embedded container should be looking for the name (again) next

-	yybegin(ST_XML_TAG_NAME);

-	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?

-	fStateStack.pop();

-	yybegin(ST_XML_EQUALS);

-	return PROXY_CONTEXT;

-}

-<ST_XML_ATTRIBUTE_VALUE> <{Name} {

-	String tagName = yytext().substring(1);

-	// pushback to just after the opening bracket

-	yypushback(yylength() - 1);

-	/*

-	 * If this tag can not be nested or we're already searching for an

-	 * attribute name, equals, or value, return immediately.

-	 */

-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {

-		yybegin(ST_XML_TAG_NAME);

-		return XML_TAG_OPEN;

-	}

-	if(Debug.debugTokenizer)

-		dump("tag in place of attr value");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	fStateStack.push(yystate());

-	// embedded container should be looking for the name (again) next

-	yybegin(ST_XML_TAG_NAME);

-	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?

-	fStateStack.pop();

-	yybegin(ST_XML_ATTRIBUTE_NAME);

-	return PROXY_CONTEXT;

-}

-// END NESTED XML

-

-// XML & JSP Comments

-

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_XML_DECLARATION, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_NAME_WHITESPACE, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE> {CommentStart} {

-	if(Debug.debugTokenizer)

-		dump("\ncomment start");//$NON-NLS-1$

-	fEmbeddedHint = XML_COMMENT_TEXT;

-	fEmbeddedPostState = ST_XML_COMMENT;

-	yybegin(ST_XML_COMMENT);

-	return XML_COMMENT_OPEN;

-}

-<ST_XML_COMMENT> .|\r|\n {

-	if(Debug.debugTokenizer)

-		dump("comment content");//$NON-NLS-1$

-	return scanXMLCommentText();

-}

-

-<ST_XML_COMMENT_END> {CommentEnd} {

-	if(Debug.debugTokenizer)

-		dump("comment end");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-	yybegin(YYINITIAL);

-	return XML_COMMENT_CLOSE;

-}

-

-<ST_JSP_CONTENT> {jspScriptletEnd} {

-	if(Debug.debugTokenizer)

-		dump("JSP end");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return JSP_CLOSE;

-}

-<ST_JSP_CONTENT> .|\n|\r {

-	if(Debug.debugTokenizer)

-		dump("JSP code content");//$NON-NLS-1$

-	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);

-}

-{jspScriptletStart} {

-	/* JSP scriptlet begun (anywhere)

-	 * A consequence of the start anywhere possibility is that the

-	 *  incoming state must be checked to see if it's erroneous

-	 *  due to the order of precedence generated

-	 */

-	// begin sanity checks

-	if(yystate() == ST_JSP_CONTENT) {

-		// at the beginning?!

-		yypushback(1);

-		return JSP_CONTENT;

-	}

-	else if(yystate() == ST_BLOCK_TAG_SCAN) {

-		yypushback(2);

-		return doBlockTagScan();

-	}

-	else if(yystate() == ST_XML_COMMENT) {

-		yypushback(2);

-		return scanXMLCommentText();

-	}

-	else if(yystate() == ST_JSP_COMMENT) {

-		yypushback(2);

-		return scanJSPCommentText();

-	}

-	// finished sanity checks

-	fStateStack.push(yystate());

-	if(fStateStack.peek()==YYINITIAL) {

-		// the simple case, just a regular scriptlet out in content

-		if(Debug.debugTokenizer)

-			dump("\nJSP scriptlet start");//$NON-NLS-1$

-		yybegin(ST_JSP_CONTENT);

-		return JSP_SCRIPTLET_OPEN;

-	}

-	else {

-		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-		}

-		if(Debug.debugTokenizer)

-			dump("JSP scriptlet start");//$NON-NLS-1$

-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;

-		else if(yystate() == ST_CDATA_TEXT) {

-			fEmbeddedPostState = ST_CDATA_TEXT;

-			fEmbeddedHint = XML_CDATA_TEXT;

-		}

-		yybegin(ST_JSP_CONTENT);

-		assembleEmbeddedContainer(JSP_SCRIPTLET_OPEN, JSP_CLOSE);

-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {

-			yybegin(ST_BLOCK_TAG_SCAN);

-			return BLOCK_TEXT;

-		}

-		// required help for successive embedded regions

-		if(yystate() == ST_XML_TAG_NAME) {

-			fEmbeddedHint = XML_TAG_NAME;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-			fEmbeddedPostState = ST_XML_EQUALS;

-		}

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		return PROXY_CONTEXT;

-	}

-}

-{jspExpressionStart} {

-	/* JSP expression begun (anywhere)

-	 * A consequence of the start anywhere possibility is that the

-	 *  incoming state must be checked to see if it's erroneous

-	 *  due to the order of precedence generated

-	 */

-	// begin sanity checks

-	if(yystate() == ST_JSP_CONTENT) {

-		// at the beginning?!

-		yypushback(2);

-		return JSP_CONTENT;

-	}

-	else if(yystate() == ST_BLOCK_TAG_SCAN) {

-		yypushback(3);

-		return doBlockTagScan();

-	}

-	else if(yystate() == ST_XML_COMMENT) {

-		yypushback(3);

-		return scanXMLCommentText();

-	}

-	else if(yystate() == ST_JSP_COMMENT) {

-		yypushback(3);

-		return scanJSPCommentText();

-	}

-	// end sanity checks

-	fStateStack.push(yystate());

-	if(fStateStack.peek()==YYINITIAL) {

-		// the simple case, just an expression out in content

-		if(Debug.debugTokenizer)

-			dump("\nJSP expression start");//$NON-NLS-1$

-		yybegin(ST_JSP_CONTENT);

-		return JSP_EXPRESSION_OPEN;

-	}

-	else {

-		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-		}

-		if(Debug.debugTokenizer)

-			dump("JSP expression start");//$NON-NLS-1$

-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;

-		else if(yystate() == ST_CDATA_TEXT) {

-			fEmbeddedPostState = ST_CDATA_TEXT;

-			fEmbeddedHint = XML_CDATA_TEXT;

-		}

-		yybegin(ST_JSP_CONTENT);

-		assembleEmbeddedContainer(JSP_EXPRESSION_OPEN, JSP_CLOSE);

-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {

-			yybegin(ST_BLOCK_TAG_SCAN);

-			return BLOCK_TEXT;

-		}

-		// required help for successive embedded regions

-		if(yystate() == ST_XML_TAG_NAME) {

-			fEmbeddedHint = XML_TAG_NAME;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-			fEmbeddedPostState = ST_XML_EQUALS;

-		}

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		return PROXY_CONTEXT;

-	}

-}

-{jspDeclarationStart} {

-	/* JSP declaration begun (anywhere)

-	 * A consequence of the start anywhere possibility is that the

-	 *  incoming state must be checked to see if it's erroneous

-	 *  due to the order of precedence generated

-	 */

-	// begin sanity checks

-	if(yystate() == ST_JSP_CONTENT) {

-		// at the beginning?!

-		yypushback(2);

-		return JSP_CONTENT;

-	}

-	else if(yystate() == ST_BLOCK_TAG_SCAN) {

-		yypushback(3);

-		return doBlockTagScan();

-	}

-	else if(yystate() == ST_XML_COMMENT) {

-		yypushback(3);

-		return scanXMLCommentText();

-	}

-	else if(yystate() == ST_JSP_COMMENT) {

-		yypushback(3);

-		return scanJSPCommentText();

-	}

-	// end sanity checks

-	fStateStack.push(yystate());

-	if(fStateStack.peek()==YYINITIAL) {

-		// the simple case, just a declaration out in content

-		if(Debug.debugTokenizer)

-			dump("\nJSP declaration start");//$NON-NLS-1$

-		yybegin(ST_JSP_CONTENT);

-		return JSP_DECLARATION_OPEN;

-	}

-	else {

-		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-		}

-		if(Debug.debugTokenizer)

-			dump("JSP declaration start");//$NON-NLS-1$

-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;

-		else if(yystate() == ST_CDATA_TEXT) {

-			fEmbeddedPostState = ST_CDATA_TEXT;

-			fEmbeddedHint = XML_CDATA_TEXT;

-		}

-		yybegin(ST_JSP_CONTENT);

-		assembleEmbeddedContainer(JSP_DECLARATION_OPEN, JSP_CLOSE);

-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {

-			yybegin(ST_BLOCK_TAG_SCAN);

-			return BLOCK_TEXT;

-		}

-		// required help for successive embedded regions

-		if(yystate() == ST_XML_TAG_NAME) {

-			fEmbeddedHint = XML_TAG_NAME;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-			fEmbeddedPostState = ST_XML_EQUALS;

-		}

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		return PROXY_CONTEXT;

-	}

-}

-{jspCommentStart} {

-	/* JSP comment begun (anywhere)

-	 * A consequence of the start anywhere possibility is that the

-	 *  incoming state must be checked to see if it's erroneous

-	 *  due to the order of precedence generated

-	 */

-	// begin sanity checks

-	if(yystate() == ST_JSP_CONTENT) {

-		// at the beginning?!

-		yypushback(3);

-		return JSP_CONTENT;

-	}

-	else if(yystate() == ST_BLOCK_TAG_SCAN) {

-		yypushback(4);

-		return doBlockTagScan();

-	}

-	else if(yystate() == ST_XML_COMMENT) {

-		yypushback(4);

-		return scanXMLCommentText();

-	}

-	else if(yystate() == ST_JSP_COMMENT) {

-		yypushback(4);

-		return scanJSPCommentText();

-	}

-	else if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)  {

-		yybegin(ST_JSP_COMMENT);

-		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);

-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)

-			yybegin(ST_BLOCK_TAG_SCAN);

-		return PROXY_CONTEXT;

-	}

-	// finished sanity checks

-	if(yystate()==YYINITIAL) {

-		// the simple case, just a regular scriptlet out in content

-		if(Debug.debugTokenizer)

-			dump("\nJSP comment start");//$NON-NLS-1$

-		yybegin(ST_JSP_COMMENT);

-		return JSP_COMMENT_OPEN;

-	}

-	else {

-		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-		}

-		if(Debug.debugTokenizer)

-			dump("JSP comment start");//$NON-NLS-1$

-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;

-		else if(yystate() == ST_CDATA_TEXT) {

-			fEmbeddedPostState = ST_CDATA_TEXT;

-			fEmbeddedHint = XML_CDATA_TEXT;

-		}

-		yybegin(ST_JSP_COMMENT);

-		// the comment container itself will act as comment text

-		fEmbeddedHint = JSP_COMMENT_TEXT;

-		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);

-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {

-			yybegin(ST_BLOCK_TAG_SCAN);

-			return BLOCK_TEXT;

-		}

-		/*

-		 * required help for successive embedded regions; mark this one as a

-		 * comment so it will be otherwise ignored but preserved (which is why

-		 * we can't use white-space)

-		 */

-		if(yystate() == ST_XML_TAG_NAME) {

-			fEmbeddedHint = XML_TAG_NAME;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-			fEmbeddedPostState = ST_XML_EQUALS;

-		}

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		return PROXY_CONTEXT;

-	}

-}

-

-<ST_BLOCK_TAG_INTERNAL_SCAN> {jspCommentStart}  {

-	yybegin(ST_JSP_COMMENT);

-	assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);

-	if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)

-		yybegin(ST_BLOCK_TAG_SCAN);

-	return PROXY_CONTEXT;

-}

-

-{jspDirectiveStart} {

-	/* JSP directive begun (anywhere)

-	 * A consequence of the start anywhere possibility is that the

-	 *  incoming state must be checked to see if it's erroneous

-	 *  due to the order of precedence generated

-	 */

-	// begin sanity checks

-	if(yystate() == ST_JSP_CONTENT) {

-		// at the beginning?!

-		yypushback(2);

-		return JSP_CONTENT;

-	}

-	else if(yystate() == ST_BLOCK_TAG_SCAN) {

-		yypushback(3);

-		return doBlockTagScan();

-	}

-	else if(yystate() == ST_XML_COMMENT) {

-		yypushback(3);

-		return scanXMLCommentText();

-	}

-	else if(yystate() == ST_JSP_COMMENT) {

-		yypushback(3);

-		return scanJSPCommentText();

-	}

-	// end sanity checks

-	fStateStack.push(yystate());

-	if(fStateStack.peek()==YYINITIAL) {

-		// the simple case, just a declaration out in content

-		if(Debug.debugTokenizer)

-			dump("\nJSP directive start");//$NON-NLS-1$

-		yybegin(ST_JSP_DIRECTIVE_NAME);

-		return JSP_DIRECTIVE_OPEN;

-	}

-	else {

-		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-		}

-		if(Debug.debugTokenizer)

-			dump("JSP declaration start");//$NON-NLS-1$

-		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;

-		else if(yystate() == ST_CDATA_TEXT) {

-			fEmbeddedPostState = ST_CDATA_TEXT;

-			fEmbeddedHint = XML_CDATA_TEXT;

-		}

-		yybegin(ST_JSP_DIRECTIVE_NAME);

-		assembleEmbeddedContainer(JSP_DIRECTIVE_OPEN, new String[]{JSP_DIRECTIVE_CLOSE, JSP_CLOSE});

-		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {

-			yybegin(ST_BLOCK_TAG_SCAN);

-			return BLOCK_TEXT;

-		}

-		// required help for successive embedded regions

-		if(yystate() == ST_XML_TAG_NAME) {

-			fEmbeddedHint = XML_TAG_NAME;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-			fEmbeddedPostState = ST_XML_EQUALS;

-		}

-		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {

-			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-		}

-		return PROXY_CONTEXT;

-	}

-}

-

-

-<ST_JSP_DIRECTIVE_NAME> {Name} {

-	if(Debug.debugTokenizer)

-		dump("JSP directive name");//$NON-NLS-1$

-	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);

-	return JSP_DIRECTIVE_NAME;

-}

-<ST_JSP_DIRECTIVE_NAME_WHITESPACE> {S}? {

-	if(Debug.debugTokenizer)

-		dump("white space");//$NON-NLS-1$

-	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);

-	return WHITE_SPACE;

-}

-<ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS> {Name} {

-	if(Debug.debugTokenizer)

-		dump("attr name");//$NON-NLS-1$

-        yybegin(ST_JSP_DIRECTIVE_EQUALS);

-        return XML_TAG_ATTRIBUTE_NAME;

-}

-<ST_JSP_DIRECTIVE_EQUALS> {Eq} {

-	if(Debug.debugTokenizer)

-		dump("equals");//$NON-NLS-1$

-        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);

-        return XML_TAG_ATTRIBUTE_EQUALS;

-}

-<ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE> {AttValue} {

-	if(Debug.debugTokenizer)

-		dump("attr value");//$NON-NLS-1$

-        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);

-        return XML_TAG_ATTRIBUTE_VALUE;

-}

-<ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_NAME_WHITESPACE, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE> {jspScriptletEnd} {

-	if(Debug.debugTokenizer)

-		dump("JSP end");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return JSP_DIRECTIVE_CLOSE;

-}

-

-<YYINITIAL> {jspCommentStart} {

-	if(Debug.debugTokenizer)

-		dump("\nJSP comment start");//$NON-NLS-1$

-	yybegin(ST_JSP_COMMENT);

-	return JSP_COMMENT_OPEN;

-}

-

-<ST_XML_ATTRIBUTE_VALUE_DQUOTED> \x24\x7b {

-	int enterState = yystate();

-	yybegin(ST_JSP_DQUOTED_EL);

-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});

-	// abort early when an unescaped double quote is found in the EL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {

-		yybegin(ST_ABORT_EMBEDDED);

-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	}

-	else {

-		yybegin(enterState);

-	}

-	return PROXY_CONTEXT;

-}

-<ST_XML_ATTRIBUTE_VALUE_DQUOTED> \x23\x7b {

-	int enterState = yystate();

-	yybegin(ST_JSP_DQUOTED_VBL);

-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});

-	// abort early when an unescaped double quote is found in the VBL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {

-		yybegin(ST_ABORT_EMBEDDED);

-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	}

-	else {

-		yybegin(enterState);

-	}

-	return PROXY_CONTEXT;

-}

-<ST_XML_ATTRIBUTE_VALUE_SQUOTED> \x24\x7b {

-	int enterState = yystate();

-	yybegin(ST_JSP_SQUOTED_EL);

-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});

-	// abort early when an unescaped single quote is found in the EL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {

-		yybegin(ST_ABORT_EMBEDDED);

-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	}

-	else {

-		yybegin(enterState);

-	}

-	return PROXY_CONTEXT;

-}

-<ST_XML_ATTRIBUTE_VALUE_SQUOTED> \x23\x7b {

-	int enterState = yystate();

-	yybegin(ST_JSP_SQUOTED_VBL);

-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});

-	// abort early when an unescaped single quote is found in the VBL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {

-		yybegin(ST_ABORT_EMBEDDED);

-		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	}

-	else {

-		yybegin(enterState);

-	}

-	return PROXY_CONTEXT;

-}

-

-// unescaped double quote, return as ending region

-<ST_JSP_DQUOTED_EL,ST_JSP_DQUOTED_VBL> ["] {

-	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;

-}

-// unescaped single quote, return as ending region

-<ST_JSP_SQUOTED_EL,ST_JSP_SQUOTED_VBL> ['] {

-	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;

-}

-

-

-// paired escaped double quotes

-<ST_JSP_DQUOTED_EL> \\\" ([^\\]|\\[^"}]+)* \\\" {

-	return JSP_EL_QUOTED_CONTENT;

-}

-// everything else EL

-<ST_JSP_DQUOTED_EL> ([^\\}"]|\\[^"])+ {

-	return JSP_EL_CONTENT;

-}

-<ST_JSP_DQUOTED_EL> \\\" {

-	return JSP_EL_CONTENT;

-}

-// paired escaped quotes

-<ST_JSP_SQUOTED_EL> \\\' ([^\\]|\\[^'}]+)* \\\' {

-	return JSP_EL_QUOTED_CONTENT;

-}

-// everything else EL

-<ST_JSP_SQUOTED_EL> ([^\\}']|\\[^'])+ {

-	return JSP_EL_CONTENT;

-}

-<ST_JSP_SQUOTED_EL> \\\' {

-	return JSP_EL_CONTENT;

-}

-<ST_JSP_DQUOTED_EL,ST_JSP_SQUOTED_EL> } {

-	return JSP_EL_CLOSE;

-}

-

-

-// paired escaped quotes

-<ST_JSP_DQUOTED_VBL> \\\" ([^\\]|\\[^"}]+)* \\\" {

-	return JSP_VBL_QUOTED_CONTENT;

-}

-// everything else VBL

-<ST_JSP_DQUOTED_VBL> ([^\\}"]|\\[^"])+ {

-	return JSP_VBL_CONTENT;

-}

-<ST_JSP_DQUOTED_VBL> \\\" {

-	return JSP_VBL_CONTENT;

-}

-// paired escaped quotes

-<ST_JSP_SQUOTED_VBL> \\\' ([^\\]|\\[^'}]+)* \\\' {

-	return JSP_VBL_QUOTED_CONTENT;

-}

-// everything else VBL

-<ST_JSP_SQUOTED_VBL> ([^\\}']|\\[^'])+ {

-	return JSP_VBL_CONTENT;

-}

-<ST_JSP_SQUOTED_VBL> \\\' {

-	return JSP_VBL_CONTENT;

-}

-

-<ST_JSP_DQUOTED_VBL,ST_JSP_SQUOTED_VBL> } {

-	return JSP_VBL_CLOSE;

-}

-

-

-// XML content area EL

-<YYINITIAL> \x24\x7b[^\x7d]*/\x7d {

-	yybegin(ST_JSP_EL);

-	if(yylength() > 2)

-		yypushback(yylength() - 2);

-	fELlevel++;

-	fEmbeddedHint = XML_CONTENT;

-	fEmbeddedPostState = YYINITIAL;

-	assembleEmbeddedContainer(JSP_EL_OPEN, JSP_EL_CLOSE);

-	fEmbeddedHint = XML_CONTENT;

-	yybegin(YYINITIAL);

-	return PROXY_CONTEXT;

-}

-<ST_JSP_EL> \x24\x7b {

-	fELlevel++;

-	if(fELlevel == 1) {

-		return JSP_EL_OPEN;

-	}

-}

-// XML content area VBL

-<YYINITIAL> \x23\x7b[^\x7d]*/\x7d {

-	yybegin(ST_JSP_VBL);

-	if(yylength() > 2)

-		yypushback(yylength() - 2);

-	fELlevel++;

-	fEmbeddedHint = XML_CONTENT;

-	fEmbeddedPostState = YYINITIAL;

-	assembleEmbeddedContainer(JSP_VBL_OPEN, JSP_VBL_CLOSE);

-	fEmbeddedHint = XML_CONTENT;

-	yybegin(YYINITIAL);

-	return PROXY_CONTEXT;

-}

-<ST_JSP_VBL> \x23\x7b {

-	fELlevel++;

-	if(fELlevel == 1) {

-		return JSP_VBL_OPEN;

-	}

-}

-// return anything not starting quotes or ending the VBL as content

-<ST_JSP_VBL> [^\x7d\x22\x27]* {

-	return JSP_VBL_CONTENT;

-}

-// return anything not starting quotes or ending the EL as content

-<ST_JSP_EL> [^\x7d\x22\x27]* {

-	return JSP_EL_CONTENT;

-}

-

-

-// quotes

-<ST_JSP_EL> \x22 {

-	yybegin(ST_JSP_EL_DQUOTES);

-	return JSP_EL_DQUOTE;

-}

-<ST_JSP_EL_DQUOTES> [^\x22]+/\x22 {

-	yybegin(ST_JSP_EL_DQUOTES_END);

-	return JSP_EL_QUOTED_CONTENT;

-}

-<ST_JSP_EL_DQUOTES_END> \x22 {

-	yybegin(ST_JSP_EL);

-	return JSP_EL_DQUOTE;

-}

-<ST_JSP_EL> \x27 {

-	yybegin(ST_JSP_EL_SQUOTES);

-	return JSP_EL_SQUOTE;

-}

-<ST_JSP_EL_SQUOTES> [^\x27]+/\x27 {

-	yybegin(ST_JSP_EL_SQUOTES_END);

-	return JSP_EL_QUOTED_CONTENT;

-}

-<ST_JSP_EL_SQUOTES_END> \x27 {

-	yybegin(ST_JSP_EL);

-	return JSP_EL_SQUOTE;

-}

-// quotes

-<ST_JSP_VBL> \x22 {

-	yybegin(ST_JSP_VBL_DQUOTES);

-	return JSP_VBL_DQUOTE;

-}

-<ST_JSP_VBL_DQUOTES> [^\x22]+/\x22 {

-	yybegin(ST_JSP_VBL_DQUOTES_END);

-	return JSP_VBL_QUOTED_CONTENT;

-}

-<ST_JSP_VBL_DQUOTES_END> \x22 {

-	yybegin(ST_JSP_VBL);

-	return JSP_VBL_DQUOTE;

-}

-<ST_JSP_VBL> \x27 {

-	yybegin(ST_JSP_VBL_SQUOTES);

-	return JSP_VBL_SQUOTE;

-}

-<ST_JSP_VBL_SQUOTES> [^\x27]+/\x27 {

-	yybegin(ST_JSP_VBL_SQUOTES_END);

-	return JSP_VBL_QUOTED_CONTENT;

-}

-<ST_JSP_VBL_SQUOTES_END> \x27 {

-	yybegin(ST_JSP_VBL);

-	return JSP_VBL_SQUOTE;

-}

-

-// unquoted content

-<ST_JSP_EL> ([^}\x27\x22\x24]|\x24[^\x7b\x27\x22])+ {

-	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");

-	return JSP_EL_CONTENT;

-}

-<ST_JSP_EL> } {

-	fELlevel--;

-	if(fELlevel == 0) {

-		yybegin(YYINITIAL);

-		return JSP_EL_CLOSE;

-	}

-	return JSP_EL_CONTENT;

-}

-<ST_JSP_VBL> } {

-	fELlevel--;

-	if(fELlevel == 0) {

-		yybegin(YYINITIAL);

-		return JSP_VBL_CLOSE;

-	}

-	return JSP_VBL_CONTENT;

-}

-// EL unquoted in tag (section 2.1 declares it as valid in template text (XML_CONTENT) or attribute values

-<ST_XML_ATTRIBUTE_VALUE> \x24\x7b[^\x7d]+/\x7d {

-	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-	}

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	fStateStack.push(yystate());

-	if(yylength() > 2)

-		yypushback(yylength() -2);

-	if(Debug.debugTokenizer)

-		dump("EL in attr value");//$NON-NLS-1$

-	yybegin(ST_JSP_EL);

-	fELlevel++;

-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE});

-	fStateStack.pop();

-	yybegin(ST_XML_ATTRIBUTE_NAME);

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-	return PROXY_CONTEXT;

-}

-// VBL unquoted in tag or attribute values

-<ST_XML_ATTRIBUTE_VALUE> \x23\x7b[^\x7d]+/\x7d {

-	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

-	}

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-	fStateStack.push(yystate());

-	if(yylength() > 2)

-		yypushback(yylength() -2);

-	if(Debug.debugTokenizer)

-		dump("VBL in attr value");//$NON-NLS-1$

-	yybegin(ST_JSP_VBL);

-	fELlevel++;

-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE});

-	fStateStack.pop();

-	yybegin(ST_XML_ATTRIBUTE_NAME);

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-	return PROXY_CONTEXT;

-}

-

-<ST_JSP_COMMENT> .|\r|\n {

-	if(Debug.debugTokenizer)

-		dump("\nJSP comment text");//$NON-NLS-1$

-	return scanJSPCommentText();

-}

-<ST_JSP_COMMENT_END> {jspCommentEnd} {

-	if(Debug.debugTokenizer)

-		dump("\nJSP comment close");//$NON-NLS-1$

-	yybegin(YYINITIAL);

-	return JSP_COMMENT_CLOSE;

-}

-

-// XML misc

-

-{CDStart} {

-	if(Debug.debugTokenizer)

-		dump("\nCDATA start");//$NON-NLS-1$

-	fStateStack.push(yystate());

-	yybegin(ST_CDATA_TEXT);

-	return XML_CDATA_OPEN;

-}

-<ST_CDATA_TEXT> .|\r|\n {

-	if(Debug.debugTokenizer)

-		dump("CDATA text");//$NON-NLS-1$

-	fEmbeddedPostState = ST_CDATA_TEXT;

-	fEmbeddedHint = XML_CDATA_TEXT;

-	String returnedContext = doScan("]]>", false, true, true, XML_CDATA_TEXT, ST_CDATA_END,  ST_CDATA_END);//$NON-NLS-1$

-	if(returnedContext == XML_CDATA_TEXT)

-		yybegin(ST_CDATA_END);

-	return returnedContext;

-}

-<ST_CDATA_END> {CDEnd} {

-	if(Debug.debugTokenizer)

-		dump("CDATA end");//$NON-NLS-1$

-	yybegin(fStateStack.pop());

-	return XML_CDATA_CLOSE;

-}

-

-<YYINITIAL> {PEReference} {

-	if(Debug.debugTokenizer)

-		dump("\nPEReference");//$NON-NLS-1$

-	return XML_PE_REFERENCE;

-}

-<YYINITIAL> {CharRef} {

-	if(Debug.debugTokenizer)

-		dump("\nCharRef");//$NON-NLS-1$

-	return XML_CHAR_REFERENCE;

-}

-<YYINITIAL> {EntityRef} {

-	if(Debug.debugTokenizer)

-		dump("\nEntityRef");//$NON-NLS-1$

-	return XML_ENTITY_REFERENCE;

-}

-

-<YYINITIAL> {PIstart} {

-	if(Debug.debugTokenizer)

-		dump("\nprocessing instruction start");//$NON-NLS-1$

-	yybegin(ST_PI);

-        return XML_PI_OPEN;

-}

-// the next four are order dependent

-<ST_PI> ((X|x)(M|m)(L|l)) {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction target");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-<ST_PI> ([iI][mM][pP][oO][rR][tT]) {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction target");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_DHTML_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-<ST_PI> xml-stylesheet {

-	if(Debug.debugTokenizer)

-		dump("XSL processing instruction target");//$NON-NLS-1$

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-<ST_PI> {Name} {

-	if(Debug.debugTokenizer)

-		dump("processing instruction target");//$NON-NLS-1$

-	fEmbeddedHint = XML_CONTENT;

-        yybegin(ST_PI_WS);

-        return XML_TAG_NAME;

-}

-<ST_PI_WS> {S}+ {

-        yybegin(ST_PI_CONTENT);

-        return WHITE_SPACE;

-}

-<ST_PI, ST_PI_WS> \?> {

-	if(Debug.debugTokenizer)

-		dump("processing instruction end");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-<ST_PI_CONTENT> . {

-		// block scan until close is found

-	return doScan("?>", false, false, false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);

-}

-<ST_PI_CONTENT,ST_XML_PI_TAG_CLOSE> \?> {

-		// ended with nothing inside

-		fEmbeddedHint = UNDEFINED;

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-

-<ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_EQUALS> {Name} {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction attribute name");//$NON-NLS-1$

-        yybegin(ST_XML_PI_EQUALS);

-        return XML_TAG_ATTRIBUTE_NAME;

-}

-<ST_XML_PI_EQUALS> {Eq} {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction '='");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);

-        return XML_TAG_ATTRIBUTE_EQUALS;

-}

-/* the value was found, look for the next name */

-<ST_XML_PI_ATTRIBUTE_VALUE> {AttValue} {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction attribute value");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);

-        return XML_TAG_ATTRIBUTE_VALUE;

-}

-/* the PI's close was found */

-<ST_XML_PI_EQUALS, ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_ATTRIBUTE_VALUE> {PIend} {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction end");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-// DHTML

-<ST_DHTML_ATTRIBUTE_NAME, ST_DHTML_EQUALS> {Name} {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction attribute name");//$NON-NLS-1$

-        yybegin(ST_DHTML_EQUALS);

-        return XML_TAG_ATTRIBUTE_NAME;

-}

-<ST_DHTML_EQUALS> {Eq} {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction '='");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

-	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-        yybegin(ST_DHTML_ATTRIBUTE_VALUE);

-        return XML_TAG_ATTRIBUTE_EQUALS;

-}

-/* the value was found, look for the next name */

-<ST_DHTML_ATTRIBUTE_VALUE> {AttValue} | ([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction attribute value");//$NON-NLS-1$

-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

-	fEmbeddedPostState = ST_XML_EQUALS;

-        yybegin(ST_DHTML_ATTRIBUTE_NAME);

-        return XML_TAG_ATTRIBUTE_VALUE;

-}

-/* The DHTML PI's close was found */

-<ST_DHTML_EQUALS, ST_DHTML_ATTRIBUTE_NAME, ST_DHTML_ATTRIBUTE_VALUE> [/]*> {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction end");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-

-// XML declarations

-

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericTagOpen}! {

-	fStateStack.push(yystate());

-	if(Debug.debugTokenizer)

-		dump("\ndeclaration start");//$NON-NLS-1$

-        yybegin(ST_XML_DECLARATION);

-	return XML_DECLARATION_OPEN;

-}

-<ST_XML_DECLARATION> [Ee][Ll][Ee][Mm][Ee][Nn][Tt] {

-	if(Debug.debugTokenizer)

-		dump("element");//$NON-NLS-1$

-	yybegin(ST_XML_ELEMENT_DECLARATION);

-	return XML_ELEMENT_DECLARATION;

-}

-<ST_XML_DECLARATION> [Dd][Oo][Cc][Tt][Yy][Pp][Ee] {

-	if(Debug.debugTokenizer)

-		dump("doctype");//$NON-NLS-1$

-	yybegin(ST_XML_DOCTYPE_DECLARATION);

-	return XML_DOCTYPE_DECLARATION;

-}

-<ST_XML_DECLARATION> [Aa][Tt][Tt][Ll][Ii][Ss][Tt] {

-	if(Debug.debugTokenizer)

-		dump("attlist");//$NON-NLS-1$

-	yybegin(ST_XML_ATTLIST_DECLARATION);

-	return XML_ATTLIST_DECLARATION;

-}

-

-// begin DOCTYPE handling procedure

-<ST_XML_DOCTYPE_DECLARATION, ST_XML_DOCTYPE_EXTERNAL_ID, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DECLARATION_CLOSE> \[[^\]]*\] {

-	return XML_DOCTYPE_INTERNAL_SUBSET;

-}

-

-<ST_XML_DOCTYPE_DECLARATION> {Name} {

-	if(Debug.debugTokenizer)

-		dump("doctype type");//$NON-NLS-1$

-	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);

-	return XML_DOCTYPE_NAME;

-}

-<ST_XML_DOCTYPE_EXTERNAL_ID> [Pp][Uu][Bb][Ll][Ii][Cc] {

-	if(Debug.debugTokenizer)

-		dump("doctype external id");//$NON-NLS-1$

-	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_PUBREF;

-	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);

-	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;

-}

-<ST_XML_DOCTYPE_EXTERNAL_ID> [Ss][Yy][Ss][Tt][Ee][Mm] {

-	if(Debug.debugTokenizer)

-		dump("doctype external id");//$NON-NLS-1$

-	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_SYSREF;

-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);

-	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;

-}

-<ST_XML_DOCTYPE_ID_PUBLIC> {AttValue}|{PubidLiteral} {

-	if(Debug.debugTokenizer)

-		dump("doctype public reference");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-	fEmbeddedPostState = YYINITIAL;

-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);

-	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;

-}

-<ST_XML_DOCTYPE_ID_SYSTEM> {AttValue}|{SystemLiteral} {

-	if(Debug.debugTokenizer)

-		dump("doctype system reference");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-	fEmbeddedPostState = YYINITIAL;

-	yybegin(ST_XML_DECLARATION_CLOSE);

-	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;

-}

-// end DOCTYPE handling

-

-// begin ELEMENT handling procedure

-<ST_XML_ELEMENT_DECLARATION> {AttValue}|{PubidLiteral} {

-	if(Debug.debugTokenizer)

-		dump("elementdecl name");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-	fEmbeddedPostState = YYINITIAL;

-	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);

-	return XML_ELEMENT_DECL_NAME;

-}

-<ST_XML_ELEMENT_DECLARATION_CONTENT> [^>]* {

-	if(Debug.debugTokenizer)

-		dump("elementdecl contentspec");//$NON-NLS-1$

-	return XML_ELEMENT_DECL_CONTENT;

-}

-

-<ST_XML_ELEMENT_DECLARATION_CONTENT> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("elementdecl close");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return XML_DECLARATION_CLOSE;

-}

-// end ELEMENT handling

-

-// begin ATTLIST handling procedure

-<ST_XML_ATTLIST_DECLARATION> {AttValue}|{PubidLiteral} {

-	if(Debug.debugTokenizer)

-		dump("attlist name");//$NON-NLS-1$

-	fEmbeddedHint = UNDEFINED;

-	fEmbeddedPostState = YYINITIAL;

-	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);

-	return XML_ATTLIST_DECL_NAME;

-}

-<ST_XML_ATTLIST_DECLARATION_CONTENT> [^>]* {

-	if(Debug.debugTokenizer)

-		dump("attlist contentspec");//$NON-NLS-1$

-	return XML_ATTLIST_DECL_CONTENT;

-}

-

-<ST_XML_ATTLIST_DECLARATION_CONTENT> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("attlist close");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return XML_DECLARATION_CLOSE;

-}

-// end ATTLIST handling

-

-<ST_XML_DECLARATION, ST_XML_DOCTYPE_DECLARATION, ST_XML_DOCTYPE_EXTERNAL_ID, ST_XML_ATTLIST_DECLARATION, ST_XML_ELEMENT_DECLARATION, ST_XML_DECLARATION_CLOSE, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_EXTERNAL_ID> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("declaration end");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return XML_DECLARATION_CLOSE;

-}

-// end DECLARATION handling

-

-<YYINITIAL> ([^<&%\x24\x23]*|\x23+|\x24+|[&%]{S}+{Name}[^&%<]*|[\x24\x23][^\x7b<&%]|[&%]{Name}([^;&%<]*|{S}+;*)) {

-	if(Debug.debugTokenizer)

-		dump("\nXML content");//$NON-NLS-1$

-	return XML_CONTENT;

-}

-

-

-<ST_BLOCK_TAG_SCAN> .|\r|\n {

-		return doBlockTagScan();

-	}

-

-. {

-	if (Debug.debugTokenizer)

-		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$

-			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$

-	return UNDEFINED;

-}

-

-\040 {

-	if(Debug.debugTokenizer)

-		dump("SPACE");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

-\011 {

-	if(Debug.debugTokenizer)

-		dump("0x9");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

-\015 

-{

-	if(Debug.debugTokenizer)

-		dump("CARRIAGE RETURN");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

-\012 {

-	if(Debug.debugTokenizer)

-		dump("LINE FEED");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.java
deleted file mode 100644
index b4607a2..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.java
+++ /dev/null
@@ -1,1937 +0,0 @@
-/* The following code was generated by JFlex 1.2.2 on 10/17/07 4:27 AM */
-
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wst.xml.core.internal.parser;
-
-import java.io.CharArrayReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.util.Debug;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-import org.eclipse.wst.xml.core.internal.Logger;
-import org.eclipse.wst.xml.core.internal.parser.regions.XMLParserRegionFactory;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-
-
-/**
- * This class is a scanner generated by 
- * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 10/17/07 4:27 AM from the specification file
- * <tt>file:/D:/eclipse.wtp/workspace/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.jflex</tt>
- */
-public class XMLTokenizer implements BlockTokenizer, DOMRegionContext {
-
-  /** this character denotes the end of file */
-  final public static int YYEOF = -1;
-
-  /** lexical states */
-  final public static int ST_XML_DOCTYPE_EXTERNAL_ID = 23;
-  final public static int ST_XML_ELEMENT_DECLARATION_CONTENT = 27;
-  final public static int ST_DHTML_ATTRIBUTE_NAME = 12;
-  final public static int ST_XML_PI_TAG_CLOSE = 11;
-  final public static int ST_XML_DECLARATION_CLOSE = 21;
-  final public static int ST_XML_PI_ATTRIBUTE_VALUE = 10;
-  final public static int ST_DHTML_EQUALS = 13;
-  final public static int ST_XML_TAG_NAME = 16;
-  final public static int ST_XML_ATTRIBUTE_VALUE = 19;
-  final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
-  final public static int ST_XML_DOCTYPE_ID_SYSTEM = 25;
-  final public static int ST_XML_ATTRIBUTE_NAME = 17;
-  final public static int ST_XML_ELEMENT_DECLARATION = 26;
-  final public static int ST_XML_DOCTYPE_DECLARATION = 22;
-  final public static int ST_XML_ATTLIST_DECLARATION = 28;
-  final public static int ST_XML_COMMENT_END = 4;
-  final public static int ST_CDATA_TEXT = 1;
-  final public static int ST_DHTML_TAG_CLOSE = 15;
-  final public static int ST_XML_COMMENT = 3;
-  final public static int ST_PI_CONTENT = 7;
-  final public static int ST_PI_WS = 6;
-  final public static int ST_CDATA_END = 2;
-  final public static int ST_XML_ATTLIST_DECLARATION_CONTENT = 29;
-  final public static int ST_BLOCK_TAG_SCAN = 30;
-  final public static int ST_XML_PI_EQUALS = 9;
-  final public static int ST_XML_DECLARATION = 20;
-  final public static int YYINITIAL = 0;
-  final public static int ST_XML_DOCTYPE_ID_PUBLIC = 24;
-  final public static int ST_XML_EQUALS = 18;
-  final public static int ST_PI = 5;
-  final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static String yycmap_packed = 
-    "\11\0\1\5\1\22\2\0\1\14\22\0\1\14\1\21\1\11\1\55"+
-    "\1\16\1\17\1\12\1\13\1\16\1\16\1\16\1\16\1\16\1\7"+
-    "\1\6\1\3\12\15\1\10\1\61\1\1\1\45\1\2\1\4\1\16"+
-    "\1\34\1\62\1\32\1\33\1\50\1\57\1\36\1\36\1\42\1\36"+
-    "\1\36\1\27\1\25\1\44\1\43\1\47\1\36\1\40\1\56\1\35"+
-    "\1\60\2\36\1\23\1\46\1\36\1\31\1\0\1\20\1\0\1\10"+
-    "\1\0\1\52\1\62\1\63\1\53\1\37\1\57\1\36\1\66\1\42"+
-    "\2\36\1\30\1\26\1\44\1\43\1\47\1\36\1\40\1\41\1\51"+
-    "\1\60\1\36\1\36\1\24\1\54\1\36\1\0\1\0\72\0\1\65"+
-    "\10\0\27\64\1\0\37\64\1\0\72\64\2\0\13\64\2\0\10\64"+
-    "\1\0\65\64\1\0\104\64\11\0\44\64\3\0\2\64\4\0\36\64"+
-    "\70\0\131\64\22\0\7\64\16\0\2\65\56\0\106\65\32\0\2\65"+
-    "\44\0\1\64\1\65\3\64\1\0\1\64\1\0\24\64\1\0\54\64"+
-    "\1\0\7\64\3\0\1\64\1\0\1\64\1\0\1\64\1\0\1\64"+
-    "\1\0\22\64\15\0\14\64\1\0\102\64\1\0\14\64\1\0\44\64"+
-    "\1\0\4\65\11\0\65\64\2\0\2\64\2\0\2\64\3\0\34\64"+
-    "\2\0\10\64\2\0\2\64\67\0\46\64\2\0\1\64\7\0\46\64"+
-    "\12\0\21\65\1\0\27\65\1\0\3\65\1\0\1\65\1\0\2\65"+
-    "\1\0\1\65\13\0\33\64\5\0\3\64\56\0\32\64\5\0\1\65"+
-    "\12\64\10\65\15\0\12\65\6\0\1\65\107\64\2\0\5\64\1\0"+
-    "\17\64\1\0\4\64\1\0\1\64\17\65\2\64\2\65\1\0\4\65"+
-    "\2\0\12\65\u0207\0\3\65\1\0\65\64\2\0\1\65\1\64\20\65"+
-    "\3\0\4\65\3\0\12\64\2\65\2\0\12\65\21\0\3\65\1\0"+
-    "\10\64\2\0\2\64\2\0\26\64\1\0\7\64\1\0\1\64\3\0"+
-    "\4\64\2\0\1\65\1\0\7\65\2\0\2\65\2\0\3\65\11\0"+
-    "\1\65\4\0\2\64\1\0\3\64\2\65\2\0\12\65\2\64\20\0"+
-    "\1\65\2\0\6\64\4\0\2\64\2\0\26\64\1\0\7\64\1\0"+
-    "\2\64\1\0\2\64\1\0\2\64\2\0\1\65\1\0\5\65\4\0"+
-    "\2\65\2\0\3\65\13\0\4\64\1\0\1\64\7\0\12\65\2\65"+
-    "\3\64\14\0\3\65\1\0\7\64\1\0\1\64\1\0\3\64\1\0"+
-    "\26\64\1\0\7\64\1\0\2\64\1\0\5\64\2\0\1\65\1\64"+
-    "\10\65\1\0\3\65\1\0\3\65\22\0\1\64\5\0\12\65\21\0"+
-    "\3\65\1\0\10\64\2\0\2\64\2\0\26\64\1\0\7\64\1\0"+
-    "\2\64\2\0\4\64\2\0\1\65\1\64\6\65\3\0\2\65\2\0"+
-    "\3\65\10\0\2\65\4\0\2\64\1\0\3\64\4\0\12\65\22\0"+
-    "\2\65\1\0\6\64\3\0\3\64\1\0\4\64\3\0\2\64\1\0"+
-    "\1\64\1\0\2\64\3\0\2\64\3\0\3\64\3\0\10\64\1\0"+
-    "\3\64\4\0\5\65\3\0\3\65\1\0\4\65\11\0\1\65\17\0"+
-    "\11\65\21\0\3\65\1\0\10\64\1\0\3\64\1\0\27\64\1\0"+
-    "\12\64\1\0\5\64\4\0\7\65\1\0\3\65\1\0\4\65\7\0"+
-    "\2\65\11\0\2\64\4\0\12\65\22\0\2\65\1\0\10\64\1\0"+
-    "\3\64\1\0\27\64\1\0\12\64\1\0\5\64\4\0\7\65\1\0"+
-    "\3\65\1\0\4\65\7\0\2\65\7\0\1\64\1\0\2\64\4\0"+
-    "\12\65\22\0\2\65\1\0\10\64\1\0\3\64\1\0\27\64\1\0"+
-    "\20\64\4\0\6\65\2\0\3\65\1\0\4\65\11\0\1\65\10\0"+
-    "\2\64\4\0\12\65\221\0\56\64\1\0\1\64\1\65\2\64\7\65"+
-    "\5\0\6\64\1\65\10\65\1\0\12\65\47\0\2\64\1\0\1\64"+
-    "\2\0\2\64\1\0\1\64\2\0\1\64\6\0\4\64\1\0\7\64"+
-    "\1\0\3\64\1\0\1\64\1\0\1\64\2\0\2\64\1\0\2\64"+
-    "\1\0\1\64\1\65\2\64\6\65\1\0\2\65\1\64\2\0\5\64"+
-    "\1\0\1\65\1\0\6\65\2\0\12\65\76\0\2\65\6\0\12\65"+
-    "\13\0\1\65\1\0\1\65\1\0\1\65\4\0\2\65\10\64\1\0"+
-    "\41\64\7\0\24\65\1\0\6\65\4\0\6\65\1\0\1\65\1\0"+
-    "\25\65\3\0\7\65\1\0\1\65\346\0\46\64\12\0\47\64\11\0"+
-    "\1\64\1\0\2\64\1\0\3\64\1\0\1\64\1\0\2\64\1\0"+
-    "\5\64\51\0\1\64\1\0\1\64\1\0\1\64\13\0\1\64\1\0"+
-    "\1\64\1\0\1\64\3\0\2\64\3\0\1\64\5\0\3\64\1\0"+
-    "\1\64\1\0\1\64\1\0\1\64\1\0\1\64\3\0\2\64\3\0"+
-    "\2\64\1\0\1\64\50\0\1\64\11\0\1\64\2\0\1\64\2\0"+
-    "\2\64\7\0\2\64\1\0\1\64\1\0\7\64\50\0\1\64\4\0"+
-    "\1\64\10\0\1\64\u0c06\0\234\64\4\0\132\64\6\0\26\64\2\0"+
-    "\6\64\2\0\46\64\2\0\6\64\2\0\10\64\1\0\1\64\1\0"+
-    "\1\64\1\0\1\64\1\0\37\64\2\0\65\64\1\0\7\64\1\0"+
-    "\1\64\3\0\3\64\1\0\7\64\3\0\4\64\2\0\6\64\4\0"+
-    "\15\64\5\0\3\64\1\0\7\64\323\0\15\65\4\0\1\65\104\0"+
-    "\1\64\3\0\2\64\2\0\1\64\121\0\3\64\u0e82\0\1\65\1\0"+
-    "\1\64\31\0\11\64\6\65\1\0\5\65\13\0\124\64\4\0\2\65"+
-    "\2\0\2\65\2\0\132\64\1\0\3\65\6\0\50\64\u1cd3\0\u51a6\64"+
-    "\u0c5a\0\u2ba4\64\134\0\u0800\0\u1ffe\0\2\0";
-
-  /** 
-   * Translates characters to character classes
-   */
-  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);
-
-  /** 
-   * Translates a state to a row index in the transition table
-   */
-  final private static int yy_rowMap [] = { 
-        0,    55,   110,   165,   220,   275,   330,   385,   440,   495, 
-      550,   605,   660,   715,   770,   825,   880,   935,   990,  1045, 
-     1100,  1155,  1210,  1265,  1320,  1375,  1430,  1485,  1540,  1595, 
-     1650,  1705,  1760,  1815,  1870,  1925,  1980,  1925,  1980,  2035, 
-     1925,  1925,  1980,  2090,  2145,  2200,  2255,  2310,  2365,  2420, 
-     2475,  1925,  1980,  2530,  2585,  2640,  1925,  2695,  2695,  2750, 
-     2805,  2860,  2530,  1925,  2915,  2970,  1925,  3025,  3080,  3135, 
-     3190,  3245,  3300,  1925,  3355,  3410,  3465,  3520,  1925,  3575, 
-     3630,  3685,  3740,  3795,  1925,  3850,  3905,  3960,  4015,  4070, 
-     4125,  4180,  4235,  4235,  4290,  4345,  4400,  4455,  4455,  4510, 
-     4565,  4620,  4675,  4675,  4730,  4785,  4840,  4895,  1925,  4950, 
-     4950,  5005,  5060,  5115,  5170,  1925,  1925,  1980,  1925,  1925, 
-     5225,  5280,  5335,  5390,  5445,  5500,  5555,  5610,  1925,  5665, 
-     5720,  5775,  1925,  1925,  2695,  5830,  2805,  1925,  5885,  2860, 
-     2915,  3025,  3080,  5940,  3135,  1925,  5995,  3190,  1925,  3575, 
-     6050,  3685,  1925,  6105,  3740,  5225,  6160,  6215,  6270,  4015, 
-     1925,  6325,  6380,  4235,  6435,  4290,  1925,  6490,  6545,  6600, 
-     6600,  6655,  6710,  4400,  4235,  4455,  6765,  4510,  1925,  6820, 
-     4565,  4620,  4455,  4675,  6875,  4730,  1925,  6930,  6985,  7040, 
-     7040,  7095,  7150,  7205,  4950,  7260,  5005,  1925,  7315,  7370, 
-     7425,  7425,  7480,  7535,  7590,  7645,  7700,  7755,  7810,  1925, 
-     7865,  7920,  1925,  1925,  1925,  2255,  7975,  8030,  8085,  8140, 
-     8195,  8250,  8305,  6490,  8360,  8360,  6930,  8415,  8415,  8470, 
-     7315,  8525,  8525,  8580,  1925,  8635,  8690,  1925,  8745,  8800, 
-     8855,  8910,  8965,  9020,  9075,  9130,  6655,  7095,  9185,  7480, 
-     9240,  9295,  9350,  9405,  9460,  9515,  9570,  9625,  9680,  9735, 
-     9790,  9845,  9900,  9955, 10010, 10065, 10120,  1925,  1925, 10175, 
-    10230, 10285, 10340, 10395,  1925,  1925,  1925, 10450, 10505, 10560, 
-    10615, 10670, 10725,  1925, 10780,  4840,  5115, 10835, 10890, 10945, 
-    11000,  2255
-  };
-
-  /** 
-   * The packed transition table of the DFA
-   */
-  final private static String yy_packed = 
-    "\1\40\1\41\10\40\1\42\4\40\1\43\47\40\1\44"+
-    "\1\45\65\44\1\46\1\47\16\46\1\50\1\46\1\51"+
-    "\44\46\1\52\1\53\65\52\1\46\1\47\5\46\1\54"+
-    "\12\46\1\51\45\46\1\47\2\46\1\55\1\56\2\46"+
-    "\1\57\3\46\1\56\5\46\1\56\1\60\1\61\4\57"+
-    "\1\46\10\57\1\62\2\57\1\46\7\57\1\46\3\57"+
-    "\1\46\3\57\1\46\1\57\1\46\1\47\2\46\1\55"+
-    "\1\63\6\46\1\63\5\46\1\63\44\46\1\64\1\65"+
-    "\2\64\1\66\15\64\1\51\44\64\1\46\1\47\2\46"+
-    "\1\67\1\56\2\46\1\70\3\46\1\56\5\46\1\56"+
-    "\6\70\1\46\13\70\1\46\7\70\1\46\3\70\1\46"+
-    "\3\70\1\46\1\70\1\46\1\47\2\46\1\67\1\56"+
-    "\2\46\1\70\3\46\1\56\5\46\1\56\6\70\1\46"+
-    "\13\70\1\71\7\70\1\46\3\70\1\46\3\70\1\46"+
-    "\1\70\1\72\1\47\1\46\1\73\1\74\1\56\3\72"+
-    "\1\75\1\72\1\76\1\56\5\72\1\56\44\72\1\46"+
-    "\1\47\2\46\1\77\15\46\1\51\45\46\1\47\1\100"+
-    "\1\101\1\46\1\56\2\46\1\102\3\46\1\56\5\46"+
-    "\1\56\6\102\1\46\13\102\1\46\7\102\1\46\3\102"+
-    "\1\46\3\102\1\46\1\102\1\46\1\47\1\100\1\101"+
-    "\1\46\1\56\2\46\1\102\3\46\1\56\5\46\1\56"+
-    "\6\102\1\46\13\102\1\103\7\102\1\46\3\102\1\46"+
-    "\3\102\1\46\1\102\1\104\1\47\1\100\1\105\1\104"+
-    "\1\56\3\104\1\106\1\104\1\107\1\56\5\104\1\56"+
-    "\44\104\1\46\1\47\3\46\1\56\6\46\1\56\5\46"+
-    "\1\56\44\46\1\110\1\111\1\112\1\113\4\110\1\114"+
-    "\12\110\6\115\1\110\13\115\1\110\7\115\1\110\3\115"+
-    "\1\110\3\115\1\110\1\115\1\46\1\111\1\112\1\113"+
-    "\1\46\1\56\2\46\1\116\3\46\1\56\5\46\1\56"+
-    "\6\116\1\46\13\116\1\46\7\116\1\46\3\116\1\46"+
-    "\3\116\1\46\1\116\1\46\1\111\1\112\1\113\1\46"+
-    "\1\56\2\46\1\116\3\46\1\56\5\46\1\56\6\116"+
-    "\1\46\13\116\1\117\7\116\1\46\3\116\1\46\3\116"+
-    "\1\46\1\116\1\120\1\111\1\112\1\121\1\120\1\56"+
-    "\3\120\1\122\1\120\1\123\1\56\5\120\1\56\44\120"+
-    "\1\46\1\124\1\125\2\46\1\56\6\46\1\56\5\46"+
-    "\1\56\10\46\1\126\1\127\2\46\1\130\10\46\1\130"+
-    "\1\46\1\127\1\126\14\46\1\47\1\125\2\46\1\56"+
-    "\6\46\1\56\5\46\1\56\6\46\1\131\36\46\1\47"+
-    "\1\125\2\46\1\56\2\46\1\132\3\46\1\56\5\46"+
-    "\1\56\6\132\1\131\13\132\1\46\7\132\1\46\3\132"+
-    "\1\46\3\132\1\46\1\132\1\46\1\47\1\125\2\46"+
-    "\1\56\6\46\1\56\5\46\1\56\6\46\1\131\7\46"+
-    "\1\133\5\46\1\134\6\46\1\133\10\46\1\135\1\47"+
-    "\1\125\1\136\1\135\1\56\3\135\1\137\1\135\1\140"+
-    "\1\56\5\135\1\56\6\135\1\141\35\135\1\142\1\47"+
-    "\1\125\1\143\1\142\1\56\3\142\1\144\1\142\1\145"+
-    "\1\56\5\142\1\56\6\142\1\146\35\142\1\147\1\47"+
-    "\1\125\1\150\1\147\1\56\3\147\1\151\1\147\1\152"+
-    "\1\56\5\147\1\56\44\147\1\153\1\154\1\155\64\153"+
-    "\1\156\1\47\1\125\1\157\1\156\1\56\3\156\1\160"+
-    "\1\156\1\161\1\56\5\156\1\56\44\156\1\162\1\163"+
-    "\1\164\64\162\1\165\1\166\65\165\1\40\1\0\10\40"+
-    "\1\0\4\40\1\0\47\40\3\0\1\167\1\170\14\0"+
-    "\1\171\52\0\1\172\2\0\1\173\3\0\1\172\5\0"+
-    "\1\172\6\173\1\0\13\173\1\0\7\173\1\174\3\173"+
-    "\1\0\3\173\1\0\1\173\5\0\1\172\2\0\1\175"+
-    "\3\0\1\172\5\0\1\172\6\175\1\0\13\175\1\0"+
-    "\7\175\1\0\3\175\1\0\3\175\1\0\1\175\110\0"+
-    "\1\176\65\0\1\177\55\0\1\200\61\0\1\201\71\0"+
-    "\1\56\6\0\1\56\5\0\1\56\52\0\3\57\4\0"+
-    "\1\57\5\0\6\57\1\0\13\57\1\0\7\57\1\0"+
-    "\3\57\1\0\5\57\6\0\3\57\4\0\1\57\5\0"+
-    "\2\57\2\202\2\57\1\0\13\57\1\0\7\57\1\0"+
-    "\3\57\1\0\5\57\6\0\3\57\4\0\1\57\5\0"+
-    "\2\57\1\202\1\203\2\57\1\0\13\57\1\0\7\57"+
-    "\1\0\3\57\1\0\5\57\6\0\3\57\4\0\1\57"+
-    "\5\0\2\57\2\204\2\57\1\0\13\57\1\0\7\57"+
-    "\1\0\3\57\1\0\5\57\5\0\1\63\6\0\1\63"+
-    "\5\0\1\63\46\0\1\205\66\0\1\206\72\0\3\70"+
-    "\4\0\1\70\5\0\6\70\1\0\13\70\1\0\7\70"+
-    "\1\0\3\70\1\0\5\70\1\72\2\0\1\207\1\72"+
-    "\1\0\3\72\1\0\1\72\2\0\5\72\1\0\45\72"+
-    "\1\0\1\206\1\207\1\72\1\0\3\72\1\0\1\72"+
-    "\2\0\5\72\1\0\44\72\1\75\1\0\1\210\1\211"+
-    "\1\75\1\210\3\75\1\212\1\75\2\210\5\75\1\210"+
-    "\44\75\1\76\1\0\1\213\1\214\1\76\1\213\3\76"+
-    "\1\213\1\76\1\212\1\213\5\76\1\213\44\76\2\0"+
-    "\1\100\1\215\71\0\3\102\4\0\1\102\5\0\6\102"+
-    "\1\0\13\102\1\0\7\102\1\0\3\102\1\0\5\102"+
-    "\1\104\2\0\1\216\1\104\1\0\3\104\1\0\1\104"+
-    "\2\0\5\104\1\0\45\104\1\0\1\100\1\217\1\104"+
-    "\1\0\3\104\1\0\1\104\2\0\5\104\1\0\44\104"+
-    "\1\106\1\0\1\220\1\221\1\106\1\220\3\106\1\222"+
-    "\1\106\2\220\5\106\1\220\44\106\1\107\1\0\1\223"+
-    "\1\224\1\107\1\223\3\107\1\223\1\107\1\222\1\223"+
-    "\5\107\1\223\44\107\1\110\3\0\17\110\6\0\1\110"+
-    "\13\0\1\110\7\0\1\110\3\0\1\110\3\0\1\110"+
-    "\4\0\1\167\15\0\1\171\47\0\1\225\64\0\1\110"+
-    "\3\0\2\110\3\114\4\110\1\114\5\110\6\115\1\110"+
-    "\13\115\1\110\7\115\1\110\3\115\1\110\3\115\1\114"+
-    "\1\115\6\0\3\115\4\0\1\115\5\0\6\115\1\0"+
-    "\13\115\1\0\7\115\1\0\3\115\1\0\5\115\6\0"+
-    "\3\116\4\0\1\116\5\0\6\116\1\0\13\116\1\0"+
-    "\7\116\1\0\3\116\1\0\5\116\1\120\2\0\1\226"+
-    "\1\120\1\0\3\120\1\0\1\120\2\0\5\120\1\0"+
-    "\45\120\1\0\1\225\1\226\1\120\1\0\3\120\1\0"+
-    "\1\120\2\0\5\120\1\0\44\120\1\122\1\0\1\227"+
-    "\1\230\1\122\1\227\3\122\1\231\1\122\2\227\5\122"+
-    "\1\227\44\122\1\123\1\0\1\232\1\233\1\123\1\232"+
-    "\3\123\1\232\1\123\1\231\1\232\5\123\1\232\44\123"+
-    "\3\0\1\167\15\0\1\234\110\0\1\235\60\0\1\236"+
-    "\13\0\1\236\44\0\2\237\36\0\20\240\1\241\46\240"+
-    "\6\0\3\132\4\0\1\132\5\0\6\132\1\0\13\132"+
-    "\1\0\7\132\1\0\3\132\1\0\5\132\46\0\1\242"+
-    "\5\0\1\242\72\0\1\243\6\0\1\135\2\0\1\244"+
-    "\1\135\1\0\3\135\1\0\1\135\2\0\5\135\1\0"+
-    "\44\135\1\137\1\0\1\245\1\246\1\137\1\245\3\137"+
-    "\1\247\1\137\2\245\5\137\1\245\44\137\1\250\1\0"+
-    "\1\251\1\252\1\253\1\251\3\253\1\251\1\250\1\254"+
-    "\1\255\3\253\1\250\1\253\1\255\6\253\1\250\32\253"+
-    "\2\250\1\253\1\141\2\240\1\256\1\141\1\240\3\141"+
-    "\1\240\1\141\2\240\3\141\1\257\1\141\1\240\44\141"+
-    "\1\142\2\0\1\260\1\142\1\0\3\142\1\0\1\142"+
-    "\2\0\5\142\1\0\44\142\1\144\2\261\1\262\1\144"+
-    "\1\261\3\144\1\263\1\144\2\261\5\144\1\261\44\144"+
-    "\1\145\2\264\1\265\1\145\1\264\3\145\1\264\1\145"+
-    "\1\263\1\264\5\145\1\264\44\145\1\146\2\240\1\266"+
-    "\1\146\1\240\3\146\1\240\1\146\2\240\3\146\1\267"+
-    "\1\146\1\240\44\146\1\147\2\0\1\270\1\147\1\0"+
-    "\3\147\1\0\1\147\2\0\5\147\1\0\44\147\1\151"+
-    "\1\0\1\271\1\272\1\151\1\271\3\151\1\273\1\151"+
-    "\2\271\5\151\1\271\44\151\1\274\1\0\1\275\1\276"+
-    "\1\277\1\275\3\277\1\275\1\274\1\300\1\301\3\277"+
-    "\1\274\1\277\1\301\6\277\1\274\32\277\2\274\1\277"+
-    "\2\153\1\0\66\153\1\0\16\153\1\302\45\153\1\156"+
-    "\2\0\1\303\1\156\1\0\3\156\1\0\1\156\2\0"+
-    "\5\156\1\0\44\156\1\160\1\0\1\304\1\305\1\160"+
-    "\1\304\3\160\1\306\1\160\2\304\5\160\1\304\44\160"+
-    "\1\307\1\0\1\310\1\311\1\312\1\310\3\312\1\310"+
-    "\1\307\1\313\1\314\3\312\1\307\1\312\1\314\6\312"+
-    "\1\307\32\312\2\307\1\312\2\162\1\0\66\162\1\0"+
-    "\16\162\1\315\45\162\7\0\1\316\21\0\1\317\42\0"+
-    "\1\172\2\0\1\40\3\0\1\172\5\0\1\172\6\40"+
-    "\1\0\13\40\1\0\7\40\1\0\3\40\1\0\3\40"+
-    "\1\0\1\40\1\320\1\0\3\320\1\321\3\173\1\320"+
-    "\1\0\1\320\1\321\1\173\1\320\1\0\2\320\1\321"+
-    "\6\173\1\320\13\173\1\320\7\173\1\320\3\173\1\322"+
-    "\5\173\15\0\1\323\6\0\1\324\42\0\1\320\1\0"+
-    "\3\320\1\321\3\175\1\320\1\0\1\320\1\321\1\175"+
-    "\1\320\1\0\2\320\1\321\6\175\1\320\13\175\1\320"+
-    "\7\175\1\320\3\175\1\325\5\175\31\0\1\317\37\0"+
-    "\1\326\66\0\1\327\72\0\3\57\4\0\1\57\5\0"+
-    "\4\57\2\330\1\0\13\57\1\0\7\57\1\0\3\57"+
-    "\1\0\5\57\6\0\3\57\4\0\1\57\5\0\4\57"+
-    "\1\330\1\331\1\0\13\57\1\0\7\57\1\0\3\57"+
-    "\1\0\5\57\6\0\3\57\4\0\1\57\5\0\6\57"+
-    "\1\0\13\57\1\0\1\57\1\332\5\57\1\0\3\57"+
-    "\1\0\5\57\1\210\1\0\7\210\1\212\55\210\1\213"+
-    "\1\0\11\213\1\212\53\213\1\220\1\0\7\220\1\222"+
-    "\55\220\1\223\1\0\11\223\1\222\53\223\1\227\1\0"+
-    "\7\227\1\231\55\227\1\232\1\0\11\232\1\231\53\232"+
-    "\32\0\1\333\30\0\1\333\40\0\1\334\13\0\1\334"+
-    "\54\0\1\335\10\0\1\335\57\0\1\336\14\0\1\336"+
-    "\72\0\1\337\4\0\1\245\1\0\7\245\1\247\55\245"+
-    "\1\250\1\0\1\251\1\340\1\250\1\251\3\250\1\251"+
-    "\1\250\1\247\1\251\5\250\1\251\44\250\1\251\1\0"+
-    "\11\251\1\247\53\251\1\250\1\0\1\251\1\340\1\250"+
-    "\1\251\3\250\1\251\1\250\1\341\1\251\5\250\1\251"+
-    "\44\250\13\0\1\342\53\0\1\251\1\0\11\251\1\341"+
-    "\53\251\11\261\1\263\55\261\13\264\1\263\53\264\1\271"+
-    "\1\0\7\271\1\273\55\271\1\274\1\0\1\275\1\343"+
-    "\1\274\1\275\3\274\1\275\1\274\1\273\1\275\5\274"+
-    "\1\275\44\274\1\275\1\0\11\275\1\273\53\275\1\274"+
-    "\1\0\1\275\1\343\1\274\1\275\3\274\1\275\1\274"+
-    "\1\344\1\275\5\274\1\275\44\274\13\0\1\345\53\0"+
-    "\1\275\1\0\11\275\1\344\53\275\2\153\1\0\26\153"+
-    "\1\346\35\153\1\304\1\0\7\304\1\306\55\304\1\307"+
-    "\1\0\1\310\1\347\1\307\1\310\3\307\1\310\1\307"+
-    "\1\306\1\310\5\307\1\310\44\307\1\310\1\0\11\310"+
-    "\1\306\53\310\1\307\1\0\1\310\1\347\1\307\1\310"+
-    "\3\307\1\310\1\307\1\350\1\310\5\307\1\310\44\307"+
-    "\13\0\1\351\53\0\1\310\1\0\11\310\1\350\53\310"+
-    "\2\162\1\0\26\162\1\352\35\162\7\0\1\353\111\0"+
-    "\1\354\34\0\1\320\1\0\10\320\1\0\4\320\1\0"+
-    "\41\320\1\0\6\320\1\0\3\320\1\321\4\320\1\0"+
-    "\1\320\1\321\2\320\1\0\2\320\1\321\36\320\1\355"+
-    "\5\320\15\0\1\323\43\0\1\356\22\0\1\357\14\0"+
-    "\3\357\2\0\1\357\10\0\1\357\1\0\2\357\3\0"+
-    "\1\357\2\0\2\357\11\0\1\57\1\360\1\57\4\0"+
-    "\1\57\5\0\6\57\1\0\13\57\1\0\7\57\1\0"+
-    "\3\57\1\0\5\57\6\0\3\57\4\0\1\57\5\0"+
-    "\6\57\1\0\11\57\1\361\1\57\1\0\7\57\1\0"+
-    "\3\57\1\0\5\57\35\0\1\362\13\0\1\362\44\0"+
-    "\2\363\63\0\2\364\75\0\1\365\13\0\1\365\44\0"+
-    "\2\366\41\0\2\367\1\0\3\367\2\0\1\254\4\367"+
-    "\1\0\10\367\1\0\32\367\2\0\1\367\3\0\2\370"+
-    "\1\0\3\370\2\0\1\300\4\370\1\0\10\370\1\0"+
-    "\32\370\2\0\1\370\2\153\1\0\27\153\1\371\34\153"+
-    "\3\0\2\372\1\0\3\372\2\0\1\313\4\372\1\0"+
-    "\10\372\1\0\32\372\2\0\1\372\2\162\1\0\27\162"+
-    "\1\373\34\162\33\0\1\374\114\0\1\355\22\0\1\357"+
-    "\14\0\3\357\2\0\1\357\10\0\1\357\1\0\2\357"+
-    "\3\0\1\357\1\0\1\356\2\357\11\0\3\57\4\0"+
-    "\1\57\5\0\6\57\1\0\7\57\1\375\3\57\1\0"+
-    "\7\57\1\0\3\57\1\0\5\57\6\0\3\57\4\0"+
-    "\1\57\5\0\6\57\1\0\6\57\1\376\4\57\1\0"+
-    "\7\57\1\0\3\57\1\0\5\57\46\0\1\377\5\0"+
-    "\1\377\54\0\1\u0100\63\0\1\u0101\10\0\1\u0101\55\0"+
-    "\1\u0102\10\0\1\u0102\60\0\1\u0103\24\0\2\153\1\0"+
-    "\30\153\1\u0104\33\153\2\162\1\0\30\162\1\u0105\33\162"+
-    "\34\0\1\u0106\40\0\3\57\4\0\1\57\5\0\6\57"+
-    "\1\0\13\57\1\0\3\57\1\u0107\3\57\1\0\3\57"+
-    "\1\0\5\57\6\0\3\57\4\0\1\57\5\0\6\57"+
-    "\1\0\3\57\1\u0108\7\57\1\0\3\57\1\u0108\3\57"+
-    "\1\0\3\57\1\0\5\57\47\0\1\u0109\60\0\1\u010a"+
-    "\14\0\1\u010a\54\0\1\u010b\47\0\2\u010c\72\0\1\u010d"+
-    "\30\0\1\u010d\3\0\2\153\1\0\31\153\1\u010e\32\153"+
-    "\2\162\1\0\31\162\1\u010f\32\162\35\0\1\u0110\37\0"+
-    "\3\57\4\0\1\57\5\0\6\57\1\0\13\57\1\0"+
-    "\6\57\1\u0111\1\0\3\57\1\0\5\57\5\0\1\u0112"+
-    "\3\57\3\0\1\u0112\1\57\4\0\1\u0112\6\57\1\0"+
-    "\13\57\1\0\7\57\1\0\3\57\1\0\5\57\37\0"+
-    "\1\u0113\10\0\1\u0113\53\0\1\u0114\13\0\1\u0114\52\0"+
-    "\1\u0115\13\0\1\u0115\15\0\2\153\1\0\32\153\1\u0116"+
-    "\31\153\2\162\1\0\32\162\1\u0117\31\162\34\0\1\u0118"+
-    "\40\0\3\57\4\0\1\57\5\0\5\57\1\u0119\1\0"+
-    "\13\57\1\0\7\57\1\0\3\57\1\0\5\57\5\0"+
-    "\1\u0112\6\0\1\u0112\5\0\1\u0112\44\0\2\153\1\0"+
-    "\31\153\1\u011a\32\153\2\162\1\0\31\162\1\u011b\32\162"+
-    "\31\0\1\u011c\43\0\3\57\4\0\1\57\5\0\6\57"+
-    "\1\0\5\57\1\u011d\5\57\1\0\7\57\1\0\3\57"+
-    "\1\0\5\57\2\153\1\0\26\153\1\u011e\35\153\2\162"+
-    "\1\0\26\162\1\u011f\35\162\6\0\3\57\4\0\1\57"+
-    "\5\0\6\57\1\0\7\57\1\u0120\3\57\1\0\7\57"+
-    "\1\0\3\57\1\0\5\57\6\0\3\57\4\0\1\57"+
-    "\5\0\6\57\1\0\13\57\1\0\7\57\1\0\3\57"+
-    "\1\0\4\57\1\u0121\6\0\3\57\4\0\1\57\5\0"+
-    "\6\57\1\0\5\57\1\u0122\5\57\1\0\7\57\1\0"+
-    "\3\57\1\0\5\57\6\0\3\57\4\0\1\57\5\0"+
-    "\6\57\1\0\5\57\1\u0123\5\57\1\0\7\57\1\0"+
-    "\3\57\1\0\5\57\6\0\3\57\4\0\1\57\5\0"+
-    "\6\57\1\0\13\57\1\0\3\57\1\u0124\3\57\1\0"+
-    "\3\57\1\0\5\57";
-
-  /** 
-   * The transition table of the DFA
-   */
-  final private static int yytrans [] = yy_unpack(yy_packed);
-
-
-  /* error codes */
-  final private static int YY_UNKNOWN_ERROR = 0;
-  // final private static int YY_ILLEGAL_STATE = 1;
-  final private static int YY_NO_MATCH = 2;
-  final private static int YY_PUSHBACK_2BIG = 3;
-
-  /* error messages for the codes above */
-  final private static String YY_ERROR_MSG[] = {
-    "Unkown internal scanner error",		//$NON-NLS-1$
-    "Internal error: unknown state",		//$NON-NLS-1$
-    "Error: could not match input",		//$NON-NLS-1$
-    "Error: pushback value was too large"	//$NON-NLS-1$
-  };
-
-  /**
-   * YY_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
-   */
-  private final static byte YY_ATTRIBUTE[] = {
-     1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1, 
-     1,  1,  1,  9,  1,  9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9,  1, 
-     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1, 
-     1,  1,  1,  9,  9,  1,  9,  9,  1,  0,  1,  0,  1,  0,  0,  0, 
-     9,  1,  1,  1,  9,  9,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0, 
-     0,  9,  0,  0,  9,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0, 
-     9,  0,  0,  0,  0,  0,  9,  1,  0,  0,  1,  1,  0,  0,  1,  0, 
-     0,  0,  9,  0,  0,  0,  1,  0,  0,  0,  9,  1,  0,  0,  1,  1, 
-     0,  1,  0,  0,  0,  9,  1,  0,  0,  1,  1,  0,  1,  0,  0,  1, 
-     1,  9,  0,  0,  9,  9,  9,  1,  1,  1,  0,  0,  0,  0,  0,  0, 
-     1,  0,  0,  1,  0,  1,  0,  1,  0,  1,  9,  0,  1,  9,  0,  1, 
-     1,  0,  0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  1,  0,  0, 
-     0,  0,  0,  1,  1,  0,  1,  1,  0,  0,  0,  9,  9,  1,  1,  0, 
-     1,  1,  9,  9,  9,  1,  1,  0,  1,  1,  1,  9,  1,  1,  1,  1, 
-     1,  1,  1,  1
-  };
-
-  /** the input device */
-  private java.io.Reader yy_reader;
-
-  /** the current state of the DFA */
-  private int yy_state;
-
-  /** the current lexical state */
-  private int yy_lexical_state = YYINITIAL;
-
-  /** this buffer contains the current text to be matched and is
-      the source of the yytext() string */
-  private char yy_buffer[] = new char[16384];
-
-  /** the textposition at the last accepting state */
-  private int yy_markedPos;
-
-  /** the textposition at the last state to be included in yytext */
-  private int yy_pushbackPos;
-
-  /** the current text position in the buffer */
-  private int yy_currentPos;
-
-  /** startRead marks the beginning of the yytext() string in the buffer */
-  private int yy_startRead;
-
-  /** endRead marks the last character in the buffer, that has been read
-      from input */
-  private int yy_endRead;
-
-  /** number of newlines encountered up to the start of the matched text */
-  private int yyline;
-
-  /** the number of characters up to the start of the matched text */
-  private int yychar;
-
-  /**
-   * the number of characters from the last newline up to the start of the 
-   * matched text
-   */
-  // private int yycolumn; 
-
-  /** 
-   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
-   */
-  // private boolean yy_atBOL;
-
-  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
-  private boolean yy_atEOF;
-
-  /** denotes if the user-EOF-code has already been executed */
-  private boolean yy_eof_done;
-
-  /* user code: */
-	private int fTokenCount = 0;
- 
-	// required holders for white-space compacting
-	private boolean fShouldLoadBuffered = false;
-	private String fBufferedContext = null;
-	private int fBufferedStart = 1;
-	private int fBufferedLength = 0;
-	private String f_context = null;
-
-	// state stack for handling embedded regions
-	private IntStack fStateStack = new IntStack();
-
-	private String context = null;
-	private int start = 0;
-	private int textLength = 0;
-	private int length = 0;
-
-	// offset for tracking position specific block tags
-	private int fOffset = 0;
-	
-	// the name of the current tag being opened
-	private String fCurrentTagName = null;
-
-	// the list of tag name BlockMarkers
-	private List fBlockMarkers = new ArrayList();
-
-	// required to not seek text blocks on an end tag
-	private boolean fIsBlockingEnabled = false;
-	private boolean fIsCaseSensitiveBlocking = true;
-
-	private XMLParserRegionFactory fRegionFactory = new XMLParserRegionFactory();
-/**
- * user method 
- */
-public final void addBlockMarker(BlockMarker marker) {
-	if(containsTagName(marker.getTagName()))
-		return;
-	fBlockMarkers.add(marker);
-}
-/**
- * user method 
- */
-public final void removeBlockMarker(BlockMarker marker) {
-	fBlockMarkers.remove(marker);
-}
-/**
- * user method 
- */
-public final void removeBlockMarker(String tagname) {
-	if (fBlockMarkers != null) {
-		Iterator blocks = fBlockMarkers.iterator();
-		while (blocks.hasNext()) {
-			if (((BlockMarker) blocks.next()).getTagName().equals(tagname))
-				blocks.remove();
-		}
-	}
-}
-/* user method */
-public final boolean isCaseSensitiveBlocking() {
-	return fIsCaseSensitiveBlocking;
-}
-/* user method */
-public final void setCaseSensitiveBlocking(boolean newValue) {
-	fIsCaseSensitiveBlocking = newValue;
-}
-/* user method */
-public boolean getBlockMarkerCaseSensitivity() {
-        return getBlockMarkerCaseSensitivity(fCurrentTagName);
-}
-/* user method */
-public boolean getBlockMarkerCaseSensitivity(String name) {
-	Iterator iterator = fBlockMarkers.iterator();
-	while(iterator.hasNext()) {
-		BlockMarker marker = (BlockMarker)iterator.next();
-		boolean casesensitive = marker.isCaseSensitive();
-		if(casesensitive && marker.getTagName().equals(name))
-			return casesensitive;
-		else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
-			return casesensitive;
-	}
-	return true;
-}
-/* user method */
-public String getBlockMarkerContext() {
-	return getBlockMarkerContext(fCurrentTagName);
-}
-/* user method */
-public String getBlockMarkerContext(String name) {
-	Iterator iterator = fBlockMarkers.iterator();
-	while(iterator.hasNext()) {
-		BlockMarker marker = (BlockMarker)iterator.next();
-		if(marker.getTagName().equals(name))
-			return marker.getContext();
-	}
-	return BLOCK_TEXT;
-}
-/* user method */
-public List getBlockMarkers() {
-	return fBlockMarkers;
-}
-/* user method */
-public final int getOffset() {
-	return fOffset + yychar;
-}
-private final boolean isBlockMarker() {
-	return isBlockMarker(fCurrentTagName);
-}
-private final boolean isBlockMarker(String tagName) {
-	if (!fIsBlockingEnabled)
-		return false;
-	return containsTagName(tagName);
-}
-/**
- * user method
- */
-public final void beginBlockTagScan(String newTagName) {
-	beginBlockMarkerScan(newTagName, BLOCK_TEXT);
-}
-/**
- * user method
- *
- * Special tokenizer setup.  Allows tokenization to be initiated at the
- * start of a text block within a "newTagName" tag.
- *
- * Example: 
- *	Tokenizer toker = new Tokenizer();
- *	toker.setCaseSensitiveBlocking(false);
- *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));
- *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);
- *	toker.getRegions(); 
- *
- * Returns:
- *	BLOCK_TEXT: 0-40
- *	XML_END_TAG_OPEN: 41-42
- *	XML_TAG_NAME: 43-48
- *	XML_TAG_CLOSE: 49-49
- *	XML_CONTENT: 50-57
- *
- */
-public final void beginBlockMarkerScan(String newTagName, String blockcontext) {
-	yybegin(ST_BLOCK_TAG_SCAN);
-	fCurrentTagName = newTagName;
-}
-/**
- * Method doScan.
- * 
- * Returns a context region for all of the text from the current position upto the end of input or
- * to right *before* the first occurence of searchString
- * 
- * @param searchString - target string to search for ex.: "-->", "</tagname"
- * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'
- * @param context - the context of the scanned region if non-zero length
- * @param exitState - the state to go to if the region was of non-zero length
- * @param abortState - the state to go to if the searchString was found immediately
- * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success
- * @throws IOException
- */
-private final String doScan(String searchString, boolean requireTailSeparator, String searchContext, int exitState, int immediateFallbackState) throws IOException {
-	boolean stillSearching = true;
-	// Disable further block (probably)
-	fIsBlockingEnabled = false;
-	int searchStringLength = searchString.length();
-	int n = 0;
-	char lastCheckChar;
-	int i;
-	boolean same = false;
-	while (stillSearching) {
-		n = 0;
-		// Ensure that enough data from the input exists to compare against the search String.
-		n = yy_advance();
-		while(n != YYEOF && yy_currentPos < searchStringLength)
-			n = yy_advance();
-		// If the input was too short or we've exhausted the input, stop immediately.
-		if (n == YYEOF) {
-			stillSearching = false;
-		}
-		else {
-			same = true;
-			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
-			// Check the characters in the target versus the last targetLength characters read from the buffer
-			// and see if it matches
-			
-			// safety check for array accesses (yy_currentPos is the *last* character we can check against)
-			if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
-				for(i = 0; i < searchStringLength; i++) {
-					if(same && fIsCaseSensitiveBlocking)
-						same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
-					else if(same && !fIsCaseSensitiveBlocking)
-						same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
-				}
-			}
-			// safety check failed; no match is possible right now
-			else {
-				same = false;
-			}
-			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
-				// Additional check for close tags to ensure that targetString="</script" doesn't match
-				// "</scriptS"
-				lastCheckChar = yy_buffer[yy_currentPos];
-				// Succeed on "</script>" and "</script "
-				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
-					stillSearching = false;
-			}
-			else {
-				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
-			}
-		}
-	}
-	if (n != YYEOF || same) {
-		// We've stopped short of the end or definitely found a match
-		yy_markedPos = yy_currentPos - searchStringLength;
-		yy_currentPos = yy_markedPos + 1;
-		// If the searchString occurs at the very beginning of what would have
-		// been a Block, resume scanning normally immediately
-		if (yy_markedPos == yy_startRead) {
-			yybegin(immediateFallbackState);
-			return primGetNextToken();
-		}
-	}
-	else {
-		// We ran through the rest of the input
-		yy_markedPos = yy_currentPos;
-		yy_currentPos++;
-	}
-	yybegin(exitState);
-	// If the ending occurs at the very beginning of what would have
-	// been a Block, resume scanning normally immediately
-	if(yy_markedPos == yy_startRead)
-		return primGetNextToken();
-	return searchContext;
-}
-/**
- * user method
- *
- * A generic lookahead-like operation
- */
-private final String doBlockScan(String target, String targetContext, int immediateFallbackState) throws IOException {
-	return doScan(target, false, targetContext, immediateFallbackState, immediateFallbackState);
-}
-/**
- * user method 
- * does a lookahead for the current tag name
- */
-private final String doBlockTagScan() throws IOException {
-        fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();
-	return doScan("</" + fCurrentTagName, true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);
-}
-/**
- * user method
- *
- * Converts the raw context String returned by the primGetNextToken()
- * method into a full ITextRegion by pulling in values for the
- * current offset within the scanning text.
- *
- * Returns null when EOF is encountered and attaches intermittently
- * discovered whitespace onto the end of useful regions.
- *
- * Note that this algorithm caches the token following the one being returned
- * so that whitespace can be collapsed.
- */
-public final ITextRegion getNextToken() throws IOException {
-	// load the starting non-whitespace token (assume that it is so)
-	if (fShouldLoadBuffered) {
-		context = fBufferedContext;
-		start = fBufferedStart;
-		textLength = length = fBufferedLength;
-		fShouldLoadBuffered = false;
-	}
-	else {
-		context = primGetNextToken();
-		if (context == XML_TAG_NAME) {
-			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
-				fCurrentTagName = yytext();
-			else
-				fCurrentTagName = null;
-		}
-		else if (context == XML_TAG_OPEN) {
-			fIsBlockingEnabled = true;
-		}
-		else if (context == XML_END_TAG_OPEN) {
-			fIsBlockingEnabled = false;
-		}
-		start = yychar;
-		textLength = length = yylength();
-		if (yy_atEOF) {
-			fTokenCount++;
-			return null;
-		}
-	}
-	// store the next token
-	f_context = primGetNextToken();
-	if (f_context == XML_TAG_NAME) {
-		if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
-			fCurrentTagName = yytext();
-		else
-			fCurrentTagName = null;
-	}
-	else if (f_context == XML_TAG_OPEN) {
-		fIsBlockingEnabled = true;
-	}
-	else if (f_context == XML_END_TAG_OPEN) {
-		fIsBlockingEnabled = false;
-	}
-	fBufferedContext = f_context;
-	fBufferedStart = yychar;
-	fBufferedLength = yylength();
-	fShouldLoadBuffered = true;
-	if (fBufferedContext == WHITE_SPACE) {
-		fShouldLoadBuffered = false;
-		length += fBufferedLength;
-	}
-	if (context == null) {
-		// EOF
-		if (Debug.debugTokenizer) {
-			System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$
-		}
-		return null;
-	}
-	fTokenCount++;
-	return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);
-}
-/* user method */
-public XMLTokenizer(){
-	super();
-}
-/* user method */
-public XMLTokenizer(char[] charArray){
-		this(new CharArrayReader(charArray));
-}
-/* user method */
-public void reset(char[] charArray) {
-	reset(new CharArrayReader(charArray), 0);
-}
-/* user method */
-public void reset(char[] charArray, int newOffset) {
-	reset(new CharArrayReader(charArray), newOffset);
-}
-/* user method */
-public void reset(java.io.InputStream in) {
-	reset(new java.io.InputStreamReader(in), 0);
-}
-/* user method */
-public void reset(java.io.InputStream in, int newOffset) {
-	reset(new java.io.InputStreamReader(in), newOffset);
-}
-/* user method */
-public void reset(java.io.Reader in) {
-	reset(in, 0);
-}
-/**
- * user method *
- *
- * Reset internal counters and vars to "newly created" values, in the hopes
- * that resetting a pre-existing tokenizer is faster than creating a new one.
- *
- * This method contains code blocks that were essentially duplicated from the
- * <em>generated</em> output of this specification before this method was
- * added.  Those code blocks were under the above copyright.
- */
-public void reset(java.io.Reader in, int newOffset) {
-	if (Debug.debugTokenizer) {
-		System.out.println("resetting tokenizer");//$NON-NLS-1$
-	}
-	fOffset = newOffset;
-
-	/* the input device */
-	yy_reader = in;
-
-	/* the current state of the DFA */
-	yy_state = 0;
-
-	/* the current lexical state */
-	yy_lexical_state = YYINITIAL;
-
-	/* this buffer contains the current text to be matched and is
-	the source of the yytext() string */
-	java.util.Arrays.fill(yy_buffer, (char)0);
-
-	/* the textposition at the last accepting state */
-	yy_markedPos = 0;
-
-	/* the textposition at the last state to be included in yytext */
-	yy_pushbackPos = 0;
-
-	/* the current text position in the buffer */
-	yy_currentPos = 0;
-
-	/* startRead marks the beginning of the yytext() string in the buffer */
-	yy_startRead = 0;
-
-	/** 
-	 * endRead marks the last character in the buffer, that has been read
-	 * from input 
-	 */
-	yy_endRead = 0;
-
-	/* number of newlines encountered up to the start of the matched text */
-	yyline = 0;
-
-	/* the number of characters up to the start of the matched text */
-	yychar = 0;
-
-	/* yy_atEOF == true <=> the scanner has returned a value for EOF */
-	yy_atEOF = false;
-
-	/* denotes if the user-EOF-code has already been executed */
-	yy_eof_done = false;
-
-
-	/* user vars: */
-	fTokenCount = 0;
- 
-	fShouldLoadBuffered = false;
-	fBufferedContext = null;
-	fBufferedStart = 1;
-	fBufferedLength = 0;
-	fStateStack = new IntStack();
-
-	context = null;
-	start = 0;
-	textLength = 0;
-	length = 0;
-}
-
-	/**
-	 * user method
-	 *
-	 */
-	public BlockTokenizer newInstance() {
-		XMLTokenizer newInstance = new XMLTokenizer();
-		// global tagmarkers can be shared; they have no state and 
-		// are never destroyed (e.g. 'release')
-		for(int i = 0; i < fBlockMarkers.size(); i++) {
-			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);
-			if(blockMarker.isGlobal())
-				newInstance.addBlockMarker(blockMarker);
-		}
-		return newInstance;
-	}
-/* user method */
-private final String scanXMLCommentText() throws IOException {
-	// Scan for '-->' and return the text up to that point as
-	//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
-	//  case change to the ST_XML_COMMENT_END state and return the next
-	//  context as usual.
-	return doScan("-->", false, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);
-}
-
-
-  /**
-   * Creates a new scanner
-   * There is also a java.io.InputStream version of this constructor.
-   *
-   * @param   in  the java.io.Reader to read input from.
-   */
-  public XMLTokenizer(java.io.Reader in) {
-    this.yy_reader = in;
-  }
-
-  /**
-   * Creates a new scanner.
-   * There is also java.io.Reader version of this constructor.
-   *
-   * @param   in  the java.io.Inputstream to read input from.
-   */
-  public XMLTokenizer(java.io.InputStream in) {
-    this(new java.io.InputStreamReader(in));
-  }
-
-  /** 
-   * Unpacks the compressed DFA transition table.
-   *
-   * @param packed   the packed transition table
-   * @return         the unpacked transition table
-   */
-  private static int [] yy_unpack(String packed) {
-    int [] trans = new int[11055];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 3734) {
-      int count = packed.charAt(i++);
-      int value = packed.charAt(i++);
-      value--;
-      do trans[j++] = value; while (--count > 0);
-    }
-    return trans;
-  }
-
-  /** 
-   * Unpacks the compressed character translation table.
-   *
-   * @param packed   the packed character translation table
-   * @return         the unpacked character translation table
-   */
-  private static char [] yy_unpack_cmap(String packed) {
-    char [] map = new char[0x10000];
-    int i = 0;  /* index in packed string  */
-    int j = 0;  /* index in unpacked array */
-    while (i < 1372) {
-      int  count = packed.charAt(i++);
-      char value = packed.charAt(i++);
-      do map[j++] = value; while (--count > 0);
-    }
-    return map;
-  }
-
-
-  /**
-   * Gets the next input character.
-   *
-   * @return      the next character of the input stream, EOF if the
-   *              end of the stream is reached.
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  private int yy_advance() throws java.io.IOException {
-
-    /* standard case */
-    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];
-
-    /* if the eof is reached, we don't need to work hard */ 
-    if (yy_atEOF) return YYEOF;
-
-    /* otherwise: need to refill the buffer */
-
-    /* first: make room (if you can) */
-    if (yy_startRead > 0) {
-      System.arraycopy(yy_buffer, yy_startRead, 
-                       yy_buffer, 0, 
-                       yy_endRead-yy_startRead);
-
-      /* translate stored positions */
-      yy_endRead-= yy_startRead;
-      yy_currentPos-= yy_startRead;
-      yy_markedPos-= yy_startRead;
-      yy_pushbackPos-= yy_startRead;
-      yy_startRead = 0;
-    }
-
-    /* is the buffer big enough? */
-    if (yy_currentPos >= yy_buffer.length) {
-      /* if not: blow it up */
-      char newBuffer[] = new char[yy_currentPos*2];
-      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
-      yy_buffer = newBuffer;
-    }
-
-    /* finally: fill the buffer with new input */
-    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
-                                            yy_buffer.length-yy_endRead);
-
-    if ( numRead == -1 ) return YYEOF;
-
-    yy_endRead+= numRead;
-
-    return yy_buffer[yy_currentPos++];
-  }
-
-    
-  /**
-   * Closes the input stream.
-   */
-  final public void yyclose() throws java.io.IOException {
-    yy_atEOF = true;            /* indicate end of file */
-    yy_endRead = yy_startRead;  /* invalidate buffer    */
-    yy_reader.close();
-  }
-
-
-  /**
-   * Returns the current lexical state.
-   */
-  final public int yystate() {
-    return yy_lexical_state;
-  }
-
-  /**
-   * Enters a new lexical state
-   *
-   * @param newState the new lexical state
-   */
-  final public void yybegin(int newState) {
-    yy_lexical_state = newState;
-  }
-
-
-  /**
-   * Returns the text matched by the current regular expression.
-   */
-  final public String yytext() {
-    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
-  }
-
-  /**
-   * Returns the length of the matched text region.
-   */
-  final public int yylength() {
-    return yy_markedPos-yy_startRead;
-  }
-
-
-  /**
-   * Reports an error that occured while scanning - from the SED JFlex skeleton
-   *
-   * @param   errorCode  the code of the errormessage to display
-   */
-  private void yy_ScanError(int errorCode) {
-    try {
-      Logger.log(Logger.ERROR, YY_ERROR_MSG[errorCode]);
-    }
-    catch (ArrayIndexOutOfBoundsException e) {
-      Logger.log(Logger.ERROR, YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
-    }
-    // DO NOT EXIT the VM on an error
-    // System.exit(1);
-  } 
-
-
-  /**
-   * Pushes the specified amount of characters back into the input stream.
-   *
-   * They will be read again by then next call of the scanning method
-   *
-   * @param number  the number of characters to be read again.
-   *                This number must not be greater than yylength()!
-   */
-  void yypushback(int number) {
-    if ( number > yylength() )
-      yy_ScanError(YY_PUSHBACK_2BIG);
-
-    yy_markedPos -= number;
-  }
-
-	/**
-	 * user method - skeleton.sed
-	 */
-	protected final boolean containsTagName(char[] markerTagName, int offset, int tagnameLength) {
-		for(int j = 0; j < fBlockMarkers.size(); j++) {
-			BlockMarker marker = (BlockMarker)fBlockMarkers.get(j);
-			if(marker.getTagName().length() == tagnameLength) {
-				boolean matchesSoFar = true;
-				for(int i = 0; i < tagnameLength && matchesSoFar; i++) {
-					if(marker.isCaseSensitive()) {
-						if(marker.getTagName().charAt(i) != markerTagName[i + offset])
-							matchesSoFar = false;
-					}
-					else {
-						if(Character.toLowerCase(marker.getTagName().charAt(i)) != Character.toLowerCase(markerTagName[i + offset]))
-							matchesSoFar = false;
-					}
-				}
-				if(matchesSoFar)
-					return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * user method - skeleton.sed
-	 *
-	 * Return ALL of the regions scannable within the remaining text
-	 * Note: for verification use
-	 */
-	public final List getRegions() {
-		List tokens = new ArrayList();
-		ITextRegion region = null;
-		try {
-			region = getNextToken();
-			while(region != null) {
-				if (region != null) {
-					tokens.add(region);
-				}
-				region = getNextToken();
-			}
-		}
-		catch (StackOverflowError e) {
-			Logger.logException(getClass().getName()+": input could not be tokenized correctly at position " + getOffset(), e);//$NON-NLS-1$
-			throw e;
-		}
-		catch (Exception e) {
-			// Since this is convenience method and NOT the recommended 
-			// way of getting tokens, many errors are simply hidden
-			Logger.logException("Exception not handled retrieving regions: " + e.getLocalizedMessage(), e);//$NON-NLS-1$
-		}
-		return tokens;
-	}
-	/**
-	 * user method - skeleton.sed
-	 */
-	private final void dump(String s) {
-		if (Debug.debugTokenizer) {
-			System.out.println(s + " (" + yychar + "-" + //$NON-NLS-2$//$NON-NLS-1$
-				(yylength() + yychar) + "):\'" +//$NON-NLS-1$
-					StringUtils.escape(yytext()) + "\'");//$NON-NLS-1$
-		}
-	}
-	/* user method  - skeleton.sed */
-	public final boolean isEOF() {
-		return yy_atEOF;
-	}
-/* user method - skeleton.sed */
-protected final boolean containsTagName(String markerTagName) {
-	Iterator blocks = fBlockMarkers.iterator();
-	while(blocks.hasNext()) {
-		BlockMarker marker = (BlockMarker)blocks.next();
-		if(marker.isCaseSensitive()) {
-			if(marker.getTagName().equals(markerTagName))
-				return true;
-		}
-		else {
-			if(marker.getTagName().equalsIgnoreCase(markerTagName))
-				return true;
-		}
-	}
-	return false;
-}
-
-  /**
-   * Contains user EOF-code, which will be executed exactly once,
-   * when the end of file is reached
-   */
-  private void yy_do_eof() {
-    if (!yy_eof_done) {
-      yy_eof_done = true;
-    // do nothing, this is the downstream parser's job
-
-    }
-  }
-
-
-  /**
-   * Resumes scanning until the next regular expression is matched,
-   * the end of input is encountered or an I/O-Error occurs.
-   *
-   * @return      the next token
-   * @exception   IOException  if any I/O-Error occurs
-   */
-  public String primGetNextToken() throws java.io.IOException {
-    int yy_input;
-    int yy_action;
-
-
-    while (true) {
-
-      yychar+= yylength();
-
-      boolean yy_counted = false;
-      for (yy_currentPos = yy_startRead; yy_currentPos < yy_markedPos;
-                                                      yy_currentPos++) {
-        switch (yy_buffer[yy_currentPos]) {
-        case '\r':
-          yyline++;
-          yy_counted = true;
-          break;
-        case '\n':
-          if (yy_counted)
-            yy_counted = false;
-          else {
-            yyline++;
-          }
-          break;
-        default:
-          yy_counted = false;
-        }
-      }
-
-      if (yy_counted) {
-        if ( yy_advance() == '\n' ) yyline--;
-        if ( !yy_atEOF ) yy_currentPos--;
-      }
-
-      yy_action = -1;
-
-      yy_currentPos = yy_startRead = yy_markedPos;
-
-      yy_state = yy_lexical_state;
-
-
-      yy_forAction: {
-        while (true) {
-    
-          yy_input = yy_advance();
-
-          if ( yy_input == YYEOF ) break yy_forAction;
-
-          int yy_next = yytrans[ yy_rowMap[yy_state] + yycmap[yy_input] ];
-          if (yy_next == -1) break yy_forAction;
-          yy_state = yy_next;
-
-          int yy_attributes = YY_ATTRIBUTE[yy_state];
-          if ( (yy_attributes & 1) > 0 ) {
-            yy_action = yy_state; 
-            yy_markedPos = yy_currentPos; 
-            if ( (yy_attributes & 8) > 0 ) break yy_forAction;
-          }
-
-        }
-      }
-
-
-      switch (yy_action) {    
-
-        case 291: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XSL processing instruction target");//$NON-NLS-1$
-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 293: break;
-        case 283: 
-        case 285: 
-        case 286: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nCDATA start");//$NON-NLS-1$
-	fStateStack.push(yystate());
-	yybegin(ST_CDATA_TEXT);
-	return XML_CDATA_OPEN;
- }
-        case 294: break;
-        case 276: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("element");//$NON-NLS-1$
-	yybegin(ST_XML_ELEMENT_DECLARATION);
-	return XML_ELEMENT_DECLARATION;
- }
-        case 295: break;
-        case 275: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist");//$NON-NLS-1$
-	yybegin(ST_XML_ATTLIST_DECLARATION);
-	return XML_ATTLIST_DECLARATION;
- }
-        case 296: break;
-        case 274: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype");//$NON-NLS-1$
-	yybegin(ST_XML_DOCTYPE_DECLARATION);
-	return XML_DOCTYPE_DECLARATION;
- }
-        case 297: break;
-        case 268: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype external id");//$NON-NLS-1$
-	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
-	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
- }
-        case 298: break;
-        case 267: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype external id");//$NON-NLS-1$
-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
-	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
- }
-        case 299: break;
-        case 263: 
-        case 273: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction target");//$NON-NLS-1$
-        yybegin(ST_DHTML_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 300: break;
-        case 237: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nCharRef");//$NON-NLS-1$
-	return XML_CHAR_REFERENCE;
- }
-        case 301: break;
-        case 234: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\ncomment start");//$NON-NLS-1$
-	yybegin(ST_XML_COMMENT);
-	return XML_COMMENT_OPEN;
- }
-        case 302: break;
-        case 215: 
-        case 216: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction target");//$NON-NLS-1$
-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 303: break;
-        case 214: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("comment end");//$NON-NLS-1$
-	yybegin(YYINITIAL);
-	return XML_COMMENT_CLOSE;
- }
-        case 304: break;
-        case 213: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("CDATA end");//$NON-NLS-1$
-	yybegin(fStateStack.pop());
-	return XML_CDATA_CLOSE;
- }
-        case 305: break;
-        case 212: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nPEReference");//$NON-NLS-1$
-	return XML_PE_REFERENCE;
- }
-        case 306: break;
-        case 209: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nEntityRef");//$NON-NLS-1$
-	return XML_ENTITY_REFERENCE;
- }
-        case 307: break;
-        case 160: 
-        case 174: 
-        case 182: 
-          { 
-	return XML_DOCTYPE_INTERNAL_SUBSET;
- }
-        case 308: break;
-        case 148: 
-          { 
-        yybegin(YYINITIAL);
-	if(Debug.debugTokenizer)
-		dump("empty tag close");//$NON-NLS-1$
-        return XML_EMPTY_TAG_CLOSE;
- }
-        case 309: break;
-        case 133: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction end");//$NON-NLS-1$
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 310: break;
-        case 132: 
-          { 
-		// ended with nothing inside
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 311: break;
-        case 128: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("processing instruction end");//$NON-NLS-1$
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 312: break;
-        case 120: 
-          { 
-	fStateStack.push(yystate());
-	if(Debug.debugTokenizer)
-		dump("\ndeclaration start");//$NON-NLS-1$
-        yybegin(ST_XML_DECLARATION);
-	return XML_DECLARATION_OPEN;
- }
-        case 313: break;
-        case 119: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nprocessing instruction start");//$NON-NLS-1$
-	yybegin(ST_PI);
-        return XML_PI_OPEN;
- }
-        case 314: break;
-        case 63: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction end");//$NON-NLS-1$
-        yybegin(YYINITIAL);
-        return XML_PI_CLOSE;
- }
-        case 315: break;
-        case 57: 
-        case 59: 
-        case 60: 
-        case 61: 
-        case 137: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction attribute value");//$NON-NLS-1$
-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 316: break;
-        case 56: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction '='");//$NON-NLS-1$
-        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
-        return XML_TAG_ATTRIBUTE_EQUALS;
- }
-        case 317: break;
-        case 55: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("XML processing instruction attribute name");//$NON-NLS-1$
-        yybegin(ST_XML_PI_EQUALS);
-        return XML_TAG_ATTRIBUTE_NAME;
- }
-        case 318: break;
-        case 51: 
-        case 52: 
-        case 53: 
-          { 
-	// block scan until close is found
-	return doScan("?>", false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
- }
-        case 319: break;
-        case 50: 
-          { 
-        yybegin(ST_PI_CONTENT);
-        return WHITE_SPACE;
- }
-        case 320: break;
-        case 46: 
-        case 47: 
-        case 48: 
-        case 49: 
-        case 129: 
-        case 130: 
-        case 131: 
-        case 217: 
-        case 239: 
-        case 240: 
-        case 252: 
-        case 253: 
-        case 262: 
-        case 272: 
-        case 280: 
-        case 284: 
-        case 287: 
-        case 288: 
-        case 289: 
-        case 290: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("processing instruction target");//$NON-NLS-1$
-        yybegin(ST_PI_WS);
-        return XML_TAG_NAME;
- }
-        case 321: break;
-        case 41: 
-        case 42: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("comment content");//$NON-NLS-1$
-	return scanXMLCommentText();
- }
-        case 322: break;
-        case 40: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("LINE FEED");//$NON-NLS-1$
-	return WHITE_SPACE;
- }
-        case 323: break;
-        case 0: 
-        case 31: 
-        case 122: 
-        case 124: 
-        case 207: 
-        case 208: 
-        case 236: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nXML content");//$NON-NLS-1$
-	return XML_CONTENT;
- }
-        case 324: break;
-        case 5: 
-        case 8: 
-        case 9: 
-        case 10: 
-        case 12: 
-        case 13: 
-        case 14: 
-        case 15: 
-        case 17: 
-        case 18: 
-        case 19: 
-        case 20: 
-        case 21: 
-        case 22: 
-        case 23: 
-        case 24: 
-        case 25: 
-        case 26: 
-        case 28: 
-        case 45: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("white space");//$NON-NLS-1$
-        return WHITE_SPACE;
- }
-        case 325: break;
-        case 16: 
-        case 71: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("inappropriate tag name");//$NON-NLS-1$
-	yybegin(YYINITIAL);
-        return XML_CONTENT;
- }
-        case 326: break;
-        case 27: 
-        case 106: 
-        case 107: 
-        case 193: 
-        case 229: 
-        case 248: 
-        case 259: 
-        case 269: 
-        case 277: 
-        case 281: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("elementdecl contentspec");//$NON-NLS-1$
-	return XML_ELEMENT_DECL_CONTENT;
- }
-        case 327: break;
-        case 29: 
-        case 113: 
-        case 114: 
-        case 204: 
-        case 233: 
-        case 250: 
-        case 260: 
-        case 270: 
-        case 278: 
-        case 282: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist contentspec");//$NON-NLS-1$
-	return XML_ATTLIST_DECL_CONTENT;
- }
-        case 328: break;
-        case 32: 
-        case 72: 
-        case 83: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nstart tag open");//$NON-NLS-1$
-        yybegin(ST_XML_TAG_NAME);
-        return XML_TAG_OPEN;
- }
-        case 329: break;
-        case 33: 
-        case 34: 
-        case 37: 
-        case 38: 
-        case 39: 
-        case 43: 
-        case 44: 
-        case 54: 
-        case 58: 
-        case 62: 
-        case 64: 
-        case 68: 
-        case 74: 
-        case 80: 
-        case 85: 
-        case 86: 
-        case 87: 
-        case 88: 
-        case 90: 
-        case 91: 
-        case 93: 
-        case 98: 
-        case 103: 
-        case 110: 
-          { 
-	if (Debug.debugTokenizer)
-		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
-			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
-	return UNDEFINED;
- }
-        case 330: break;
-        case 35: 
-        case 36: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("CDATA text");//$NON-NLS-1$
-	String blockContext = doBlockScan("]]>", XML_CDATA_TEXT, ST_CDATA_END);//$NON-NLS-1$
-	if(blockContext == XML_CDATA_TEXT)
-		yybegin(ST_CDATA_END);
-	return blockContext;
- }
-        case 331: break;
-        case 65: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
-        yybegin(ST_DHTML_EQUALS);
-        return XML_TAG_ATTRIBUTE_NAME;
- }
-        case 332: break;
-        case 66: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction '='");//$NON-NLS-1$
-        yybegin(ST_DHTML_ATTRIBUTE_VALUE);
-        return XML_TAG_ATTRIBUTE_EQUALS;
- }
-        case 333: break;
-        case 67: 
-        case 69: 
-        case 70: 
-        case 145: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
-        yybegin(ST_DHTML_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 334: break;
-        case 73: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("tag close");//$NON-NLS-1$
-	if(isBlockMarker()) {
-        	yybegin(ST_BLOCK_TAG_SCAN);
-	}
-	else
-        	yybegin(YYINITIAL);
-        return XML_TAG_CLOSE;
- }
-        case 335: break;
-        case 75: 
-        case 76: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("tag name");//$NON-NLS-1$
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return XML_TAG_NAME;
- }
-        case 336: break;
-        case 77: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr name");//$NON-NLS-1$
-        yybegin(ST_XML_EQUALS);
-        return XML_TAG_ATTRIBUTE_NAME;
- }
-        case 337: break;
-        case 78: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("equals");//$NON-NLS-1$
-        yybegin(ST_XML_ATTRIBUTE_VALUE);
-        return XML_TAG_ATTRIBUTE_EQUALS;
- }
-        case 338: break;
-        case 79: 
-        case 81: 
-        case 82: 
-        case 152: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr value");//$NON-NLS-1$
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 339: break;
-        case 84: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("declaration end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return XML_DECLARATION_CLOSE;
- }
-        case 340: break;
-        case 89: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype type");//$NON-NLS-1$
-	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
-	return XML_DOCTYPE_NAME;
- }
-        case 341: break;
-        case 92: 
-        case 94: 
-        case 95: 
-        case 96: 
-        case 166: 
-        case 167: 
-        case 170: 
-        case 171: 
-        case 224: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype public reference");//$NON-NLS-1$
-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
-	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
- }
-        case 342: break;
-        case 97: 
-        case 99: 
-        case 100: 
-        case 101: 
-        case 178: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("doctype system reference");//$NON-NLS-1$
-	yybegin(ST_XML_DECLARATION_CLOSE);
-	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
- }
-        case 343: break;
-        case 102: 
-        case 104: 
-        case 105: 
-        case 186: 
-        case 187: 
-        case 190: 
-        case 191: 
-        case 227: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("elementdecl name");//$NON-NLS-1$
-	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
-	return XML_ELEMENT_DECL_NAME;
- }
-        case 344: break;
-        case 108: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("elementdecl close");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return XML_DECLARATION_CLOSE;
- }
-        case 345: break;
-        case 109: 
-        case 111: 
-        case 112: 
-        case 197: 
-        case 198: 
-        case 201: 
-        case 202: 
-        case 231: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist name");//$NON-NLS-1$
-	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
-	return XML_ATTLIST_DECL_NAME;
- }
-        case 346: break;
-        case 115: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attlist close");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return XML_DECLARATION_CLOSE;
- }
-        case 347: break;
-        case 118: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("\nend tag open");//$NON-NLS-1$
-        yybegin(ST_XML_TAG_NAME);
-        return XML_END_TAG_OPEN;
- }
-        case 348: break;
-        case 116: 
-        case 117: 
-          { 
-		return doBlockTagScan();
-	 }
-        case 349: break;
-        default: 
-          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
-            yy_atEOF = true;
-            yy_do_eof();
-              return null;
-          } 
-          else {
-            yy_ScanError(YY_NO_MATCH);
-          }
-      }
-    }
-  }    
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.jflex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.jflex
deleted file mode 100644
index f4ef7b0..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.jflex
+++ /dev/null
@@ -1,1328 +0,0 @@
-/*******************************************************************************

- * Copyright (c) 2004, 2007 IBM Corporation and others.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- * 

- * Contributors:

- *     IBM Corporation - initial API and implementation

- *******************************************************************************/

-

-package org.eclipse.wst.xml.core.internal.parser;

-

-import java.io.CharArrayReader;

-import java.io.IOException;

-import java.util.ArrayList;

-import java.util.Iterator;

-import java.util.List;

-

-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;

-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;

-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

-import org.eclipse.wst.sse.core.internal.util.Debug;

-import org.eclipse.wst.sse.core.utils.StringUtils;

-import org.eclipse.wst.xml.core.internal.Logger;

-import org.eclipse.wst.xml.core.internal.parser.regions.XMLParserRegionFactory;

-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;

-

-%%

-

-%{

-	private int fTokenCount = 0;

- 

-	// required holders for white-space compacting

-	private boolean fShouldLoadBuffered = false;

-	private String fBufferedContext = null;

-	private int fBufferedStart = 1;

-	private int fBufferedLength = 0;

-	private String f_context = null;

-

-	// state stack for handling embedded regions

-	private IntStack fStateStack = new IntStack();

-

-	private String context = null;

-	private int start = 0;

-	private int textLength = 0;

-	private int length = 0;

-

-	// offset for tracking position specific block tags

-	private int fOffset = 0;

-	

-	// the name of the current tag being opened

-	private String fCurrentTagName = null;

-

-	// the list of tag name BlockMarkers

-	private List fBlockMarkers = new ArrayList();

-

-	// required to not seek text blocks on an end tag

-	private boolean fIsBlockingEnabled = false;

-	private boolean fIsCaseSensitiveBlocking = true;

-

-	private XMLParserRegionFactory fRegionFactory = new XMLParserRegionFactory();

-/**

- * user method 

- */

-public final void addBlockMarker(BlockMarker marker) {

-	if(containsTagName(marker.getTagName()))

-		return;

-	fBlockMarkers.add(marker);

-}

-/**

- * user method 

- */

-public final void removeBlockMarker(BlockMarker marker) {

-	fBlockMarkers.remove(marker);

-}

-/**

- * user method 

- */

-public final void removeBlockMarker(String tagname) {

-	if (fBlockMarkers != null) {

-		Iterator blocks = fBlockMarkers.iterator();

-		while (blocks.hasNext()) {

-			if (((BlockMarker) blocks.next()).getTagName().equals(tagname))

-				blocks.remove();

-		}

-	}

-}

-/* user method */

-public final boolean isCaseSensitiveBlocking() {

-	return fIsCaseSensitiveBlocking;

-}

-/* user method */

-public final void setCaseSensitiveBlocking(boolean newValue) {

-	fIsCaseSensitiveBlocking = newValue;

-}

-/* user method */

-public boolean getBlockMarkerCaseSensitivity() {

-        return getBlockMarkerCaseSensitivity(fCurrentTagName);

-}

-/* user method */

-public boolean getBlockMarkerCaseSensitivity(String name) {

-	Iterator iterator = fBlockMarkers.iterator();

-	while(iterator.hasNext()) {

-		BlockMarker marker = (BlockMarker)iterator.next();

-		boolean casesensitive = marker.isCaseSensitive();

-		if(casesensitive && marker.getTagName().equals(name))

-			return casesensitive;

-		else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))

-			return casesensitive;

-	}

-	return true;

-}

-/* user method */

-public String getBlockMarkerContext() {

-	return getBlockMarkerContext(fCurrentTagName);

-}

-/* user method */

-public String getBlockMarkerContext(String name) {

-	Iterator iterator = fBlockMarkers.iterator();

-	while(iterator.hasNext()) {

-		BlockMarker marker = (BlockMarker)iterator.next();

-		if(marker.getTagName().equals(name))

-			return marker.getContext();

-	}

-	return BLOCK_TEXT;

-}

-/* user method */

-public List getBlockMarkers() {

-	return fBlockMarkers;

-}

-/* user method */

-public final int getOffset() {

-	return fOffset + yychar;

-}

-private final boolean isBlockMarker() {

-	return isBlockMarker(fCurrentTagName);

-}

-private final boolean isBlockMarker(String tagName) {

-	if (!fIsBlockingEnabled)

-		return false;

-	return containsTagName(tagName);

-}

-/**

- * user method

- */

-public final void beginBlockTagScan(String newTagName) {

-	beginBlockMarkerScan(newTagName, BLOCK_TEXT);

-}

-/**

- * user method

- *

- * Special tokenizer setup.  Allows tokenization to be initiated at the

- * start of a text block within a "newTagName" tag.

- *

- * Example: 

- *	Tokenizer toker = new Tokenizer();

- *	toker.setCaseSensitiveBlocking(false);

- *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));

- *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);

- *	toker.getRegions(); 

- *

- * Returns:

- *	BLOCK_TEXT: 0-40

- *	XML_END_TAG_OPEN: 41-42

- *	XML_TAG_NAME: 43-48

- *	XML_TAG_CLOSE: 49-49

- *	XML_CONTENT: 50-57

- *

- */

-public final void beginBlockMarkerScan(String newTagName, String blockcontext) {

-	yybegin(ST_BLOCK_TAG_SCAN);

-	fCurrentTagName = newTagName;

-}

-/**

- * Method doScan.

- * 

- * Returns a context region for all of the text from the current position upto the end of input or

- * to right *before* the first occurence of searchString

- * 

- * @param searchString - target string to search for ex.: "-->", "</tagname"

- * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'

- * @param context - the context of the scanned region if non-zero length

- * @param exitState - the state to go to if the region was of non-zero length

- * @param abortState - the state to go to if the searchString was found immediately

- * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success

- * @throws IOException

- */

-private final String doScan(String searchString, boolean requireTailSeparator, String searchContext, int exitState, int immediateFallbackState) throws IOException {

-	boolean stillSearching = true;

-	// Disable further block (probably)

-	fIsBlockingEnabled = false;

-	int searchStringLength = searchString.length();

-	int n = 0;

-	char lastCheckChar;

-	int i;

-	boolean same = false;

-	while (stillSearching) {

-		n = 0;

-		// Ensure that enough data from the input exists to compare against the search String.

-		n = yy_advance();

-		while(n != YYEOF && yy_currentPos < searchStringLength)

-			n = yy_advance();

-		// If the input was too short or we've exhausted the input, stop immediately.

-		if (n == YYEOF) {

-			stillSearching = false;

-		}

-		else {

-			same = true;

-			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and

-			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].

-			// Check the characters in the target versus the last targetLength characters read from the buffer

-			// and see if it matches

-			

-			// safety check for array accesses (yy_currentPos is the *last* character we can check against)

-			if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {

-				for(i = 0; i < searchStringLength; i++) {

-					if(same && fIsCaseSensitiveBlocking)

-						same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);

-					else if(same && !fIsCaseSensitiveBlocking)

-						same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));

-				}

-			}

-			// safety check failed; no match is possible right now

-			else {

-				same = false;

-			}

-			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {

-				// Additional check for close tags to ensure that targetString="</script" doesn't match

-				// "</scriptS"

-				lastCheckChar = yy_buffer[yy_currentPos];

-				// Succeed on "</script>" and "</script "

-				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))

-					stillSearching = false;

-			}

-			else {

-				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);

-			}

-		}

-	}

-	if (n != YYEOF || same) {

-		// We've stopped short of the end or definitely found a match

-		yy_markedPos = yy_currentPos - searchStringLength;

-		yy_currentPos = yy_markedPos + 1;

-		// If the searchString occurs at the very beginning of what would have

-		// been a Block, resume scanning normally immediately

-		if (yy_markedPos == yy_startRead) {

-			yybegin(immediateFallbackState);

-			return primGetNextToken();

-		}

-	}

-	else {

-		// We ran through the rest of the input

-		yy_markedPos = yy_currentPos;

-		yy_currentPos++;

-	}

-	yybegin(exitState);

-	// If the ending occurs at the very beginning of what would have

-	// been a Block, resume scanning normally immediately

-	if(yy_markedPos == yy_startRead)

-		return primGetNextToken();

-	return searchContext;

-}

-/**

- * user method

- *

- * A generic lookahead-like operation

- */

-private final String doBlockScan(String target, String targetContext, int immediateFallbackState) throws IOException {

-	return doScan(target, false, targetContext, immediateFallbackState, immediateFallbackState);

-}

-/**

- * user method 

- * does a lookahead for the current tag name

- */

-private final String doBlockTagScan() throws IOException {

-        fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();

-	return doScan("</" + fCurrentTagName, true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);

-}

-/**

- * user method

- *

- * Converts the raw context String returned by the primGetNextToken()

- * method into a full ITextRegion by pulling in values for the

- * current offset within the scanning text.

- *

- * Returns null when EOF is encountered and attaches intermittently

- * discovered whitespace onto the end of useful regions.

- *

- * Note that this algorithm caches the token following the one being returned

- * so that whitespace can be collapsed.

- */

-public final ITextRegion getNextToken() throws IOException {

-	// load the starting non-whitespace token (assume that it is so)

-	if (fShouldLoadBuffered) {

-		context = fBufferedContext;

-		start = fBufferedStart;

-		textLength = length = fBufferedLength;

-		fShouldLoadBuffered = false;

-	}

-	else {

-		context = primGetNextToken();

-		if (context == XML_TAG_NAME) {

-			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))

-				fCurrentTagName = yytext();

-			else

-				fCurrentTagName = null;

-		}

-		else if (context == XML_TAG_OPEN) {

-			fIsBlockingEnabled = true;

-		}

-		else if (context == XML_END_TAG_OPEN) {

-			fIsBlockingEnabled = false;

-		}

-		start = yychar;

-		textLength = length = yylength();

-		if (yy_atEOF) {

-			fTokenCount++;

-			return null;

-		}

-	}

-	// store the next token

-	f_context = primGetNextToken();

-	if (f_context == XML_TAG_NAME) {

-		if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))

-			fCurrentTagName = yytext();

-		else

-			fCurrentTagName = null;

-	}

-	else if (f_context == XML_TAG_OPEN) {

-		fIsBlockingEnabled = true;

-	}

-	else if (f_context == XML_END_TAG_OPEN) {

-		fIsBlockingEnabled = false;

-	}

-	fBufferedContext = f_context;

-	fBufferedStart = yychar;

-	fBufferedLength = yylength();

-	fShouldLoadBuffered = true;

-	if (fBufferedContext == WHITE_SPACE) {

-		fShouldLoadBuffered = false;

-		length += fBufferedLength;

-	}

-	if (context == null) {

-		// EOF

-		if (Debug.debugTokenizer) {

-			System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$

-		}

-		return null;

-	}

-	fTokenCount++;

-	return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);

-}

-/* user method */

-public XMLTokenizer(){

-	super();

-}

-/* user method */

-public XMLTokenizer(char[] charArray){

-		this(new CharArrayReader(charArray));

-}

-/* user method */

-public void reset(char[] charArray) {

-	reset(new CharArrayReader(charArray), 0);

-}

-/* user method */

-public void reset(char[] charArray, int newOffset) {

-	reset(new CharArrayReader(charArray), newOffset);

-}

-/* user method */

-public void reset(java.io.InputStream in) {

-	reset(new java.io.InputStreamReader(in), 0);

-}

-/* user method */

-public void reset(java.io.InputStream in, int newOffset) {

-	reset(new java.io.InputStreamReader(in), newOffset);

-}

-/* user method */

-public void reset(java.io.Reader in) {

-	reset(in, 0);

-}

-/**

- * user method *

- *

- * Reset internal counters and vars to "newly created" values, in the hopes

- * that resetting a pre-existing tokenizer is faster than creating a new one.

- *

- * This method contains code blocks that were essentially duplicated from the

- * <em>generated</em> output of this specification before this method was

- * added.  Those code blocks were under the above copyright.

- */

-public void reset(java.io.Reader in, int newOffset) {

-	if (Debug.debugTokenizer) {

-		System.out.println("resetting tokenizer");//$NON-NLS-1$

-	}

-	fOffset = newOffset;

-

-	/* the input device */

-	yy_reader = in;

-

-	/* the current state of the DFA */

-	yy_state = 0;

-

-	/* the current lexical state */

-	yy_lexical_state = YYINITIAL;

-

-	/* this buffer contains the current text to be matched and is

-	the source of the yytext() string */

-	java.util.Arrays.fill(yy_buffer, (char)0);

-

-	/* the textposition at the last accepting state */

-	yy_markedPos = 0;

-

-	/* the textposition at the last state to be included in yytext */

-	yy_pushbackPos = 0;

-

-	/* the current text position in the buffer */

-	yy_currentPos = 0;

-

-	/* startRead marks the beginning of the yytext() string in the buffer */

-	yy_startRead = 0;

-

-	/** 

-	 * endRead marks the last character in the buffer, that has been read

-	 * from input 

-	 */

-	yy_endRead = 0;

-

-	/* number of newlines encountered up to the start of the matched text */

-	yyline = 0;

-

-	/* the number of characters up to the start of the matched text */

-	yychar = 0;

-

-	/* yy_atEOF == true <=> the scanner has returned a value for EOF */

-	yy_atEOF = false;

-

-	/* denotes if the user-EOF-code has already been executed */

-	yy_eof_done = false;

-

-

-	/* user vars: */

-	fTokenCount = 0;

- 

-	fShouldLoadBuffered = false;

-	fBufferedContext = null;

-	fBufferedStart = 1;

-	fBufferedLength = 0;

-	fStateStack = new IntStack();

-

-	context = null;

-	start = 0;

-	textLength = 0;

-	length = 0;

-}

-

-	/**

-	 * user method

-	 *

-	 */

-	public BlockTokenizer newInstance() {

-		XMLTokenizer newInstance = new XMLTokenizer();

-		// global tagmarkers can be shared; they have no state and 

-		// are never destroyed (e.g. 'release')

-		for(int i = 0; i < fBlockMarkers.size(); i++) {

-			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);

-			if(blockMarker.isGlobal())

-				newInstance.addBlockMarker(blockMarker);

-		}

-		return newInstance;

-	}

-/* user method */

-private final String scanXMLCommentText() throws IOException {

-	// Scan for '-->' and return the text up to that point as

-	//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which

-	//  case change to the ST_XML_COMMENT_END state and return the next

-	//  context as usual.

-	return doScan("-->", false, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);

-}

-%}

-

-%eof{

-// do nothing, this is the downstream parser's job

-%eof}

-

-%public

-%class XMLTokenizer

-%implements BlockTokenizer, DOMRegionContext

-%function primGetNextToken

-%type String

-%char

-%line

-%unicode

-%pack

-

-%state ST_CDATA_TEXT

-%state ST_CDATA_END

-%state ST_XML_COMMENT

-%state ST_XML_COMMENT_END

-%state ST_PI

-%state ST_PI_WS

-%state ST_PI_CONTENT

-%state ST_XML_PI_ATTRIBUTE_NAME

-%state ST_XML_PI_EQUALS

-%state ST_XML_PI_ATTRIBUTE_VALUE

-%state ST_XML_PI_TAG_CLOSE

-%state ST_DHTML_ATTRIBUTE_NAME

-%state ST_DHTML_EQUALS

-%state ST_DHTML_ATTRIBUTE_VALUE

-%state ST_DHTML_TAG_CLOSE

-

-// normal tag states

-%state ST_XML_TAG_NAME

-%state ST_XML_ATTRIBUTE_NAME

-%state ST_XML_EQUALS

-%state ST_XML_ATTRIBUTE_VALUE

-

-// declaration (DTD) states

-%state ST_XML_DECLARATION

-%state ST_XML_DECLARATION_CLOSE

-

-%state ST_XML_DOCTYPE_DECLARATION

-%state ST_XML_DOCTYPE_EXTERNAL_ID

-%state ST_XML_DOCTYPE_ID_PUBLIC

-%state ST_XML_DOCTYPE_ID_SYSTEM

-

-%state ST_XML_ELEMENT_DECLARATION

-%state ST_XML_ELEMENT_DECLARATION_CONTENT

-

-%state ST_XML_ATTLIST_DECLARATION

-%state ST_XML_ATTLIST_DECLARATION_CONTENT

-

-%state ST_BLOCK_TAG_SCAN

-

-// Letter = ([A-Za-z])

-// Digit = ([0-9])

-

-/**

- * smaller tokens

- */

-genericTagOpen       = <

-genericTagClose      = >

-genericEndTagOpen    = <\/

-genericEmptyTagClose = \/>

-

-PIstart = <\?

-PIend   = \?>

-

-

-// [1] document ::= prolog element Misc*

-document = ({prolog} {element} {Misc}*)

-

-// [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

- //Char = (.)

-Char = [\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD] 

-

-// [3] S ::= (0x20 | 0x9 | 0xD | 0xA)+

-S = [\x20\x09\x0D\x0A]+

-

-// [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender

-NameChar = ({Letter} | {Digit} | \. | \- | _ | : | {CombiningChar} | {Extender})

-

-// [5] Name ::= (Letter | '_' | ':') NameChar*

-//Name = ({NameChar}{NameChar}*)

-Name = ({Letter} | _ | :){NameChar}*

-

-// [6] Names ::= {Name} ({S} {Name})*

-Names = ({Name} ({S} {Name})*)

-

-// [7] Nmtoken ::= (NameChar)+

-Nmtoken = ({NameChar}+)

-

-// [8] Nmtokens ::= Nmtoken (S Nmtoken)*

-Nmtokens = ({Nmtoken} ({S} {Nmtoken})*)

-

-// [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' |  "'" ([^%&'] | PEReference | Reference)* "'"

-EntityValue = (\" ([^%&\"] | {PEReference} | {Reference})* \" |  \' ([^%&\'] | {PEReference} | {Reference})* \')

-

-// [10] AttValue ::= '"' ([^<&"] | Reference)* '"' |  "'" ([^<&'] | Reference)* "'"

-AttValue = ( \" ([^<\"] | {Reference})* \" | \' ([^<\'] | {Reference})* \'  | ([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* )

-

-// [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") 

-SystemLiteral = ((\" [^\"]* \") | (\' [^\']* \')) 

-

-// [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"

-PubidLiteral = (\" {PubidChar}* \" | \' ({PubidChar}\')* "'")

-

-// [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

-PubidChar = ([\040\015\012] | [a-zA-Z0-9] | [\-\'()\+,.\/:=?;!\*#@\$_%])

-

-// [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

-// implement lookahead behavior during action definition

-CharData = ([^<&(\]\]>)]*)

-

-// [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

-CommentStart = (<!\-\-)

-CommentEnd   = (\-\->)

-Comment = ({CommentStart}.*{CommentEnd})

-

-// [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'

-PI = (<\?{PITarget} {Char}* \?>)

-

-// [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

-PITarget = ({Name}((X|x)(M|m)(L|l)))

-

-// [18] CDSect ::= CDStart CData CDEnd

-CDSect = ({CDStart}{CData}{CDEnd})

-

-// [19] CDStart ::= '<![CDATA['

-CDStart = <!\[CDATA\[

-

-// [20] CData ::= (Char* - (Char* ']]>' Char*)) 

-// implement lookahead behavior during action definition

-CData = ([^(\]\]>)]*)

-

-// [21] CDEnd ::= ']]>'

-CDEnd = (\]\]>)

-

-// [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

-prolog = ({XMLDecl}? {Misc}* ({doctypedecl} {Misc}*)?)

-

-// [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

-XMLDecl = (<\?xml {VersionInfo} {EncodingDecl}? {SDDecl}? {S}? \?>)

-

-// [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")

-VersionInfo = ({S}version{Eq}(\'{VersionNum}\' | \"{VersionNum}\"))

-

-// [25] Eq ::= S? '=' S?

-Eq = (\=)

-

-// [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+

-VersionNum = (([a-zA-Z0-9_.:]|\-)+)

-

-// [27] Misc ::= Comment | PI |  S

-Misc = ({Comment} | {PI} | {S})

-

-// [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)?  S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>'

-doctypedecl = (<\!DOCTYPE{S}{Name} ({S}{ExternalID})? {S}? (\[ ({markupdecl}|{PEReference}|{S})* \]{S}?)?>)

-

-// [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment

-markupdecl = ({elementdecl} | {AttlistDecl} | {EntityDecl} | {NotationDecl} | {PI} | {Comment})

-

-// [30] extSubset ::= TextDecl? extSubsetDecl

-extSubset = ({TextDecl}? {extSubsetDecl})

-

-// [31] extSubsetDecl ::= ( markupdecl | conditionalSect | PEReference | S )*

-extSubsetDecl = (( {markupdecl} | {conditionalSect} | {PEReference} | {S} )*)

-

-// [32]  SDDecl  ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))

-SDDecl  = ({S}standalone{Eq}{S}*((\'(yes|no)\')|(\"(yes|no)\")))

-

-// [33]  LanguageID  ::= Langcode ('-' Subcode)*

-LanguageID  = ({Langcode}(\-{Subcode})*)

-

-// [34]  Langcode ::= ISO639Code |  IanaCode |  UserCode

-Langcode = ({ISO639Code} |  {IanaCode} |  {UserCode})

-

-// [35]  ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])

-ISO639Code = (([a-z]|[A-Z])([a-z]|[A-Z]))

-

-// [36]  IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+

-IanaCode = ((i|I)\-([a-z]|[A-Z])+)

-

-// [37]  UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+

-UserCode = ((x|X)\-([a-z]|[A-Z])+)

-

-// [38]  Subcode ::= ([a-z] | [A-Z])+

-Subcode = (([a-z]|[A-Z])+)

-

-// [39]  element  ::= EmptyElemTag | STag content ETag

-element  = ({EmptyElemTag} | {STag} {content} {ETag})

-

-// [40]  STag  ::= '<' Name (S Attribute)* S? '>'

-STag = (<{Name}({S}{Attribute})*{S}?>)

-

-// [41]  Attribute ::= Name Eq AttValue

-Attribute = ({Name}{S}*{Eq}{S}*{AttValue})

-

-// [42]  ETag  ::= 'Name S? '>'

-ETag = (<\/{Name}{S}?>)

-

-// [43]  content  ::= (element | CharData | Reference | CDSect | PI | Comment)*

-content = (({element} | {CharData} | {Reference} | {CDSect} | {PI} | {Comment})*)

-

-// [44]  EmptyElemTag  ::= '<' Name (S Attribute)* S? '/>'

-EmptyElemTag = (<{Name}({S}{Attribute})*{S}?\/>)

-

-// [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'

-elementdecl = (<\!ELEMENT{S}{Name}{S}{contentspec}{S}?>)

-

-// [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

-contentspec = (EMPTY|ANY|{Mixed}|{children})

-

-// [47] children ::= (choice | seq) ('?' | '*' | '+')?

-children = (({choice}|{seq})(\?|\*|\+)?)

-

-// CAUSES LOOP THROUGH DEFS OF CHOICE AND SEQ

-// [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?

-cp = (({Name} | {choice} | {seq}) (\?|\*|\+)?)

-

-// [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')'

-// choice = \({S}?{cp}({S}?\|{S}?{cp})*{S}?\)

-choice = \({S}?{Name}({S}?\|{S}?{Name})*{S}?\)

-

-// [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'

-// seq = (\({S}?{cp}({S}?\,{S}?{cp})*{S}?\))

-seq = (\({S}?{Name}({S}?\,{S}?{Name})*{S}?\))

-

-// [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S?  ')*' | '(' S? '#PCDATA' S? ')'

-Mixed = ({S}?\#PCDATA({S}?\|{S}?{Name})*{S}?)*\|({S}?\#PCDATA{S}?)

-

-// [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'

-AttlistDecl = (<\!ATTLIST{S}{Name}{AttDef}*{S}?>)

-

-// [53] AttDef ::= S Name S AttType S DefaultDecl

-AttDef = ({S}{Name}{S}{AttType}{S}{DefaultDecl})

-

-// [54] AttType ::= StringType | TokenizedType | EnumeratedType 

-AttType = ({StringType} | {TokenizedType} | {EnumeratedType})

-

-// [55] StringType ::= 'CDATA'

-StringType = (CDATA)

-

-// [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'

-TokenizedType = (ID|IDREF|IDREFS|ENTITY|ENTITIES|NMTOKEN|NMTOKENS)

-

-// [57] EnumeratedType ::= NotationType | Enumeration 

-EnumeratedType = ({NotationType} | {Enumeration})

-

-// [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' 

-NotationType = (NOTATION{S}\({S}?{Name}({S}?\|{S}?{Name})*{S}?\))

-

-// [59] Enumeration ::= '(' S? Nmtoken (S? '|' S?  Nmtoken)* S? ')'

-Enumeration = (\({S}?{Nmtoken}({S}?\|{S}?{Nmtoken})*{S}?\))

-

-// [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)

-DefaultDecl = (\#REQUIRED|\#IMPLIED|((\#FIXED{S})?{AttValue}))

-

-// [61] conditionalSect ::= includeSect | ignoreSect 

-conditionalSect = ({includeSect} | {ignoreSect})

-

-// [62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' 

-includeSect = (<\!\[{S}?INCLUDE{S}?\[{extSubsetDecl}\]\]>)

-

-// [63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'

-ignoreSect = (<\!\[{S}?IGNORE{S}?\[{ignoreSectContents}*\]\]>)

-

-// [64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*

-ignoreSectContents = ({Ignore}(<\!\[{ignoreSectContents}\]\]>{Ignore})*)

-

-// [65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)

-Ignore =  ([^(\<\!\[|\]\]\>)]*)

-

-// [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'

-CharRef = (&#[0-9]+;|&#x[0-9a-fA-F]+;)

-

-// [67] Reference ::= EntityRef | CharRef

-Reference = ({EntityRef} | {CharRef})

-

-// [68] EntityRef = '&' Name ';'

-EntityRef = (&{Name};)

-

-// [69] PEReference ::= '%' Name ';'

-PEReference = (%{Name};)

-

-// [70] EntityDecl ::= GEDecl | PEDecl

-EntityDecl = ({GEDecl} | {PEDecl})

-

-// [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'

-GEDecl = (<\!ENTITY{S}{Name}{S}{EntityDef}{S}?>)

-

-// [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'

-PEDecl = (<\!ENTITY{S}\%{S}{Name}{S}{PEDef}{S}?>)

-

-// [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)

-EntityDef = ({EntityValue} | ({ExternalID}{NDataDecl}?))

-

-// [74] PEDef ::= EntityValue | ExternalID

-PEDef = ({EntityValue} | {ExternalID})

-

-// [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral 

-ExternalID = (SYSTEM{S}{SystemLiteral}|PUBLIC{S}{PubidLiteral}{S}{SystemLiteral} )

-

-// [76] NDataDecl ::= S 'NDATA' S Name

-NDataDecl = ({S}NDATA{S}{Name})

-

-// [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'

-TextDecl = (<\?xml{VersionInfo}?{EncodingDecl}{S}?\?>)

-

-// [78] extParsedEnt ::= TextDecl? content

-extParsedEnt = ({TextDecl}?{content})

-

-// [79] extPE ::= TextDecl? extSubsetDecl

-extPE = ({TextDecl}?{extSubsetDecl})

-

-// [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' |  "'" EncName "'" ) 

-EncodingDecl = ({S}encoding{S}*{Eq}{S}*(\"{EncName}\"|\'{EncName}\'))

-

-// [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*

-EncName = ([A-Za-z]([A-Za-z0-9._]|\-)*)

-

-// [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID |  PublicID) S? '>'

-NotationDecl = (<\!NOTATION{S}{Name}{S}({ExternalID}|{PublicID}){S}?>)

-

-// [83] PublicID ::= 'PUBLIC' S PubidLiteral

-PublicID = (PUBLIC{S}{PubidLiteral})

-

-// [84]  Letter ::= BaseChar | Ideographic

-Letter = ({BaseChar} | {Ideographic})

-

-// [85]  BaseChar ::= [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6]

-// | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131]

-// | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E]

-// | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5]

-// | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386

-// | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE]

-// | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0

-// | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F]

-// | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4]

-// | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB]

-// | [#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559

-// | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2]

-// | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7]

-// | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5

-// | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961]

-// | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8]

-// | [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD]

-// | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A]

-// | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30]

-// | [#x0A32-#x0A33] | [#x0A35-#x0A36] | [#x0A38-#x0A39]

-// | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85-#x0A8B]

-// | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0]

-// | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0

-// | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28]

-// | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D

-// | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A]

-// | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C

-// | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA]

-// | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C]

-// | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33]

-// | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C]

-// | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3]

-// | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C]

-// | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39]

-// | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33]

-// | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88]

-// | #x0E8A | #x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F]

-// | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB]

-// | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD

-// | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69]

-// | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103]

-// | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112]

-// | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150

-// | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165

-// | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175

-// | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8]

-// | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9

-// | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15]

-// | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D]

-// | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D]

-// | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4]

-// | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB]

-// | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126

-// | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094]

-// | [#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]

-BaseChar = [\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4-\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7-\u04C8\u04CB-\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8-\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5-\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0E01-\u0E2E\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EAE\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102-\u1103\u1105-\u1107\u1109\u110B-\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154-\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D-\u116E\u1172-\u1173\u1175\u119E\u11A8\u11AB\u11AE-\u11AF\u11B7-\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u212A-\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3]

-

-// [86]  Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]

-Ideographic = [\u4E00-\u9FA5\u3007\u3021-\u3029]

-

-// [87]      CombiningChar    ::=    [#x0300-#x0345]    | [#x0360-#x0361]

-// | [#x0483-#x0486]          | [#x0591-#x05A1]         | [#x05A3-#x05B9]

-// | [#x05BB-#x05BD]       | #x05BF       | [#x05C1-#x05C2]	 | #x05C4

-// | [#x064B-#x0652]    | #x0670    | [#x06D6-#x06DC]   | [#x06DD-#x06DF]

-// | [#x06E0-#x06E4]          | [#x06E7-#x06E8]         | [#x06EA-#x06ED]

-// | [#x0901-#x0903]       | #x093C       | [#x093E-#x094C]      | #x094D

-// | [#x0951-#x0954]    | [#x0962-#x0963]    | [#x0981-#x0983]   | #x09BC

-// | #x09BE       | #x09BF       | [#x09C0-#x09C4]      | [#x09C7-#x09C8]

-// | [#x09CB-#x09CD]   | #x09D7   | [#x09E2-#x09E3]   | #x0A02   | #x0A3C

-// | #x0A3E       | #x0A3F       | [#x0A40-#x0A42]      | [#x0A47-#x0A48]

-// | [#x0A4B-#x0A4D]    | [#x0A70-#x0A71]    | [#x0A81-#x0A83]   | #x0ABC

-// | [#x0ABE-#x0AC5]          | [#x0AC7-#x0AC9]         | [#x0ACB-#x0ACD]

-// | [#x0B01-#x0B03]    | #x0B3C    | [#x0B3E-#x0B43]   | [#x0B47-#x0B48]

-// | [#x0B4B-#x0B4D]          | [#x0B56-#x0B57]         | [#x0B82-#x0B83]

-// | [#x0BBE-#x0BC2]    | [#x0BC6-#x0BC8]    | [#x0BCA-#x0BCD]   | #x0BD7

-// | [#x0C01-#x0C03]          | [#x0C3E-#x0C44]         | [#x0C46-#x0C48]

-// | [#x0C4A-#x0C4D]          | [#x0C55-#x0C56]         | [#x0C82-#x0C83]

-// | [#x0CBE-#x0CC4]          | [#x0CC6-#x0CC8]         | [#x0CCA-#x0CCD]

-// | [#x0CD5-#x0CD6]          | [#x0D02-#x0D03]         | [#x0D3E-#x0D43]

-// | [#x0D46-#x0D48]       | [#x0D4A-#x0D4D]       | #x0D57      | #x0E31

-// | [#x0E34-#x0E3A]    | [#x0E47-#x0E4E]    | #x0EB1   | [#x0EB4-#x0EB9]

-// | [#x0EBB-#x0EBC]    | [#x0EC8-#x0ECD]    | [#x0F18-#x0F19]   | #x0F35

-// | #x0F37      | #x0F39     | #x0F3E     | #x0F3F     | [#x0F71-#x0F84]

-// | [#x0F86-#x0F8B]    | [#x0F90-#x0F95]    | #x0F97   | [#x0F99-#x0FAD]

-// | [#x0FB1-#x0FB7]       | #x0FB9       | [#x20D0-#x20DC]      | #x20E1

-// | [#x302A-#x302F] | #x3099 | #x309A

-CombiningChar =    [\u0300-\u0345\u0360-\u0361\u0483-\u0486\u0591-\u05A1\u05A3-\u05B9\u05BB-\u05BD\u05BF\u05C1-\u05C2\u05C4\u064B-\u0652\u0670\u06D6-\u06DC\u06DD-\u06DF\u06E0-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0901-\u0903\u093C\u093E-\u094C\u094D\u0951-\u0954\u0962-\u0963\u0981-\u0983\u09BC\u09BE\u09BF\u09C0-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09E2-\u09E3\u0A02\u0A3C\u0A3E\u0A3F\u0A40-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A70-\u0A71\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0B01-\u0B03\u0B3C\u0B3E-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B82-\u0B83\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C01-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C82-\u0C83\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86-\u0F8B\u0F90-\u0F95\u0F97\u0F99-\u0FAD\u0FB1-\u0FB7\u0FB9\u20D0-\u20DC\u20E1\u302A-\u302F\u3099\u309A]

-

-// [88]   Digit  ::=  [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9]

-// | [#x0966-#x096F]          | [#x09E6-#x09EF]         | [#x0A66-#x0A6F]

-// | [#x0AE6-#x0AEF]          | [#x0B66-#x0B6F]         | [#x0BE7-#x0BEF]

-// | [#x0C66-#x0C6F]          | [#x0CE6-#x0CEF]         | [#x0D66-#x0D6F]

-// | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]

-Digit =  [\u0030-\u0039\u0660-\u0669\u06F0-\u06F9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE7-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29]

-

-// [89]  Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46

-// | #x0EC6       | #x3005       | [#x3031-#x3035]      | [#x309D-#x309E]

-// | [#x30FC-#x30FE]

-Extender = [\u00B7\u02D0\u02D1\u0387\u0640\u0E46\u0EC6\u3005\u3031-\u3035\u309D-\u309E\u30FC-\u30FE]

-

-%%

-

-

-/* white space within a tag */

-<ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_PI, ST_XML_PI_EQUALS, ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_ATTRIBUTE_VALUE, ST_XML_DECLARATION, ST_XML_DOCTYPE_DECLARATION, ST_XML_ELEMENT_DECLARATION, ST_XML_ATTLIST_DECLARATION, ST_XML_DECLARATION_CLOSE, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_EXTERNAL_ID,ST_DHTML_ATTRIBUTE_NAME,ST_DHTML_EQUALS,ST_DHTML_ATTRIBUTE_VALUE,ST_DHTML_TAG_CLOSE> {S}* {

-	if(Debug.debugTokenizer)

-		dump("white space");//$NON-NLS-1$

-        return WHITE_SPACE;

-}

-

-// BEGIN REGULAR XML

-/* handle opening a new tag almost anywhere */

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_DECLARATION, ST_XML_ATTRIBUTE_VALUE> {genericTagOpen} {

-	if(Debug.debugTokenizer)

-		dump("\nstart tag open");//$NON-NLS-1$

-        yybegin(ST_XML_TAG_NAME);

-        return XML_TAG_OPEN;

-}

-

-/* unquoted */

-

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_XML_DECLARATION> {genericEndTagOpen} {

-	if(Debug.debugTokenizer)

-		dump("\nend tag open");//$NON-NLS-1$

-        yybegin(ST_XML_TAG_NAME);

-        return XML_END_TAG_OPEN;

-}

-/* the tag's name was found, start scanning for attributes */

-<ST_XML_TAG_NAME> {Name} {

-	if(Debug.debugTokenizer)

-		dump("tag name");//$NON-NLS-1$

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-/* another attribute name was found, resume looking for the equals sign */

-<ST_XML_ATTRIBUTE_NAME, ST_XML_EQUALS> {Name} {

-	if(Debug.debugTokenizer)

-		dump("attr name");//$NON-NLS-1$

-        yybegin(ST_XML_EQUALS);

-        return XML_TAG_ATTRIBUTE_NAME;

-}

-/* an equal sign was found, what's next is the value */

-<ST_XML_EQUALS> {Eq} {

-	if(Debug.debugTokenizer)

-		dump("equals");//$NON-NLS-1$

-        yybegin(ST_XML_ATTRIBUTE_VALUE);

-        return XML_TAG_ATTRIBUTE_EQUALS;

-}

-/* the value was found, look for the next name */

-/* allow for unbalanced quotes, mostly a duplicate of the AttValue rule */

-<ST_XML_ATTRIBUTE_VALUE> {AttValue} | ([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("attr value");//$NON-NLS-1$

-        yybegin(ST_XML_ATTRIBUTE_NAME);

-        return XML_TAG_ATTRIBUTE_VALUE;

-}

-

-

-/* the tag's close was found */

-<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("tag close");//$NON-NLS-1$

-	if(isBlockMarker()) {

-        	yybegin(ST_BLOCK_TAG_SCAN);

-	}

-	else

-        	yybegin(YYINITIAL);

-        return XML_TAG_CLOSE;

-}

-/* the tag's close was found, but the tag doesn't need a matching end tag */

-<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericEmptyTagClose} {

-        yybegin(YYINITIAL);

-	if(Debug.debugTokenizer)

-		dump("empty tag close");//$NON-NLS-1$

-        return XML_EMPTY_TAG_CLOSE;

-}

-

-<ST_XML_TAG_NAME> [^</>\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4-\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7-\u04C8\u04CB-\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8-\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5-\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0E01-\u0E2E\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EAE\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102-\u1103\u1105-\u1107\u1109\u110B-\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154-\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D-\u116E\u1172-\u1173\u1175\u119E\u11A8\u11AB\u11AE-\u11AF\u11B7-\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u212A-\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3\u4E00-\u9FA5\u3007\u3021-\u3029]* {

-	if(Debug.debugTokenizer)

-		dump("inappropriate tag name");//$NON-NLS-1$

-	yybegin(YYINITIAL);

-        return XML_CONTENT;

-}

-

-// END REGULAR XML

-

-

-// XML Comments

-

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_XML_DECLARATION> {CommentStart} {

-	if(Debug.debugTokenizer)

-		dump("\ncomment start");//$NON-NLS-1$

-	yybegin(ST_XML_COMMENT);

-	return XML_COMMENT_OPEN;

-}

-<ST_XML_COMMENT> .|\r|\n {

-	if(Debug.debugTokenizer)

-		dump("comment content");//$NON-NLS-1$

-	return scanXMLCommentText();

-}

-

-<ST_XML_COMMENT_END> {CommentEnd} {

-	if(Debug.debugTokenizer)

-		dump("comment end");//$NON-NLS-1$

-	yybegin(YYINITIAL);

-	return XML_COMMENT_CLOSE;

-}

-

-// XML misc

-

-{CDStart} {

-	if(Debug.debugTokenizer)

-		dump("\nCDATA start");//$NON-NLS-1$

-	fStateStack.push(yystate());

-	yybegin(ST_CDATA_TEXT);

-	return XML_CDATA_OPEN;

-}

-<ST_CDATA_TEXT> .|\r|\n {

-	if(Debug.debugTokenizer)

-		dump("CDATA text");//$NON-NLS-1$

-	String blockContext = doBlockScan("]]>", XML_CDATA_TEXT, ST_CDATA_END);//$NON-NLS-1$

-	if(blockContext == XML_CDATA_TEXT)

-		yybegin(ST_CDATA_END);

-	return blockContext;

-}

-<ST_CDATA_END> {CDEnd} {

-	if(Debug.debugTokenizer)

-		dump("CDATA end");//$NON-NLS-1$

-	yybegin(fStateStack.pop());

-	return XML_CDATA_CLOSE;

-}

-

-<YYINITIAL> {PEReference} {

-	if(Debug.debugTokenizer)

-		dump("\nPEReference");//$NON-NLS-1$

-	return XML_PE_REFERENCE;

-}

-<YYINITIAL> {CharRef} {

-	if(Debug.debugTokenizer)

-		dump("\nCharRef");//$NON-NLS-1$

-	return XML_CHAR_REFERENCE;

-}

-<YYINITIAL> {EntityRef} {

-	if(Debug.debugTokenizer)

-		dump("\nEntityRef");//$NON-NLS-1$

-	return XML_ENTITY_REFERENCE;

-}

-

-<YYINITIAL> {PIstart} {

-	if(Debug.debugTokenizer)

-		dump("\nprocessing instruction start");//$NON-NLS-1$

-	yybegin(ST_PI);

-        return XML_PI_OPEN;

-}

-// the next four are order dependent

-<ST_PI> ((X|x)(M|m)(L|l)) {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction target");//$NON-NLS-1$

-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-<ST_PI> ([iI][mM][pP][oO][rR][tT]{S}*) {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction target");//$NON-NLS-1$

-        yybegin(ST_DHTML_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-<ST_PI> xml-stylesheet {

-	if(Debug.debugTokenizer)

-		dump("XSL processing instruction target");//$NON-NLS-1$

-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);

-        return XML_TAG_NAME;

-}

-<ST_PI> {Name} {

-	if(Debug.debugTokenizer)

-		dump("processing instruction target");//$NON-NLS-1$

-        yybegin(ST_PI_WS);

-        return XML_TAG_NAME;

-}

-<ST_PI_WS> {S}+ {

-        yybegin(ST_PI_CONTENT);

-        return WHITE_SPACE;

-}

-<ST_PI, ST_PI_WS> \?> {

-	if(Debug.debugTokenizer)

-		dump("processing instruction end");//$NON-NLS-1$

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-<ST_PI_CONTENT> . {

-	// block scan until close is found

-	return doScan("?>", false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);

-}

-<ST_PI_CONTENT,ST_XML_PI_TAG_CLOSE> \?> {

-		// ended with nothing inside

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-<ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_EQUALS> {Name} {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction attribute name");//$NON-NLS-1$

-        yybegin(ST_XML_PI_EQUALS);

-        return XML_TAG_ATTRIBUTE_NAME;

-}

-<ST_XML_PI_EQUALS> {Eq} {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction '='");//$NON-NLS-1$

-        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);

-        return XML_TAG_ATTRIBUTE_EQUALS;

-}

-/* the value was found, look for the next name */

-<ST_XML_PI_ATTRIBUTE_VALUE> {AttValue} | ([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction attribute value");//$NON-NLS-1$

-        yybegin(ST_XML_PI_ATTRIBUTE_NAME);

-        return XML_TAG_ATTRIBUTE_VALUE;

-}

-/* the PI's close was found */

-<ST_XML_PI_EQUALS, ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_ATTRIBUTE_VALUE> {PIend} {

-	if(Debug.debugTokenizer)

-		dump("XML processing instruction end");//$NON-NLS-1$

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-// DHTML

-<ST_DHTML_ATTRIBUTE_NAME, ST_DHTML_EQUALS> {Name} {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction attribute name");//$NON-NLS-1$

-        yybegin(ST_DHTML_EQUALS);

-        return XML_TAG_ATTRIBUTE_NAME;

-}

-<ST_DHTML_EQUALS> {Eq} {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction '='");//$NON-NLS-1$

-        yybegin(ST_DHTML_ATTRIBUTE_VALUE);

-        return XML_TAG_ATTRIBUTE_EQUALS;

-}

-/* the value was found, look for the next name */

-<ST_DHTML_ATTRIBUTE_VALUE> {AttValue} | ([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction attribute value");//$NON-NLS-1$

-        yybegin(ST_DHTML_ATTRIBUTE_NAME);

-        return XML_TAG_ATTRIBUTE_VALUE;

-}

-/* The DHTML PI's close was found */

-<ST_DHTML_EQUALS, ST_DHTML_ATTRIBUTE_NAME, ST_DHTML_ATTRIBUTE_VALUE> [/]*> {

-	if(Debug.debugTokenizer)

-		dump("DHTML processing instruction end");//$NON-NLS-1$

-        yybegin(YYINITIAL);

-        return XML_PI_CLOSE;

-}

-

-// XML declarations

-

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericTagOpen}! {

-	fStateStack.push(yystate());

-	if(Debug.debugTokenizer)

-		dump("\ndeclaration start");//$NON-NLS-1$

-        yybegin(ST_XML_DECLARATION);

-	return XML_DECLARATION_OPEN;

-}

-<ST_XML_DECLARATION> [Ee][Ll][Ee][Mm][Ee][Nn][Tt] {

-	if(Debug.debugTokenizer)

-		dump("element");//$NON-NLS-1$

-	yybegin(ST_XML_ELEMENT_DECLARATION);

-	return XML_ELEMENT_DECLARATION;

-}

-<ST_XML_DECLARATION> [Dd][Oo][Cc][Tt][Yy][Pp][Ee] {

-	if(Debug.debugTokenizer)

-		dump("doctype");//$NON-NLS-1$

-	yybegin(ST_XML_DOCTYPE_DECLARATION);

-	return XML_DOCTYPE_DECLARATION;

-}

-<ST_XML_DECLARATION> [Aa][Tt][Tt][Ll][Ii][Ss][Tt] {

-	if(Debug.debugTokenizer)

-		dump("attlist");//$NON-NLS-1$

-	yybegin(ST_XML_ATTLIST_DECLARATION);

-	return XML_ATTLIST_DECLARATION;

-}

-

-// begin DOCTYPE handling procedure

-<ST_XML_DOCTYPE_DECLARATION, ST_XML_DOCTYPE_EXTERNAL_ID, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DECLARATION_CLOSE> \[[^\]]*\] {

-	return XML_DOCTYPE_INTERNAL_SUBSET;

-}

-

-<ST_XML_DOCTYPE_DECLARATION> {Name} {

-	if(Debug.debugTokenizer)

-		dump("doctype type");//$NON-NLS-1$

-	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);

-	return XML_DOCTYPE_NAME;

-}

-<ST_XML_DOCTYPE_EXTERNAL_ID> [Pp][Uu][Bb][Ll][Ii][Cc] {

-	if(Debug.debugTokenizer)

-		dump("doctype external id");//$NON-NLS-1$

-	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);

-	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;

-}

-<ST_XML_DOCTYPE_EXTERNAL_ID> [Ss][Yy][Ss][Tt][Ee][Mm] {

-	if(Debug.debugTokenizer)

-		dump("doctype external id");//$NON-NLS-1$

-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);

-	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;

-}

-<ST_XML_DOCTYPE_ID_PUBLIC> {AttValue}|{PubidLiteral}|([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("doctype public reference");//$NON-NLS-1$

-	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);

-	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;

-}

-<ST_XML_DOCTYPE_ID_SYSTEM> {AttValue}|{SystemLiteral}|([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("doctype system reference");//$NON-NLS-1$

-	yybegin(ST_XML_DECLARATION_CLOSE);

-	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;

-}

-// end DOCTYPE handling

-

-// begin ELEMENT handling procedure

-<ST_XML_ELEMENT_DECLARATION> {AttValue}|{PubidLiteral}|([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("elementdecl name");//$NON-NLS-1$

-	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);

-	return XML_ELEMENT_DECL_NAME;

-}

-<ST_XML_ELEMENT_DECLARATION_CONTENT> [^>]* {

-	if(Debug.debugTokenizer)

-		dump("elementdecl contentspec");//$NON-NLS-1$

-	return XML_ELEMENT_DECL_CONTENT;

-}

-

-<ST_XML_ELEMENT_DECLARATION_CONTENT> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("elementdecl close");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return XML_DECLARATION_CLOSE;

-}

-// end ELEMENT handling

-

-// begin ATTLIST handling procedure

-<ST_XML_ATTLIST_DECLARATION> {AttValue}|{PubidLiteral}|([\'\"]([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )* ) {

-	if(Debug.debugTokenizer)

-		dump("attlist name");//$NON-NLS-1$

-	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);

-	return XML_ATTLIST_DECL_NAME;

-}

-<ST_XML_ATTLIST_DECLARATION_CONTENT> [^>]* {

-	if(Debug.debugTokenizer)

-		dump("attlist contentspec");//$NON-NLS-1$

-	return XML_ATTLIST_DECL_CONTENT;

-}

-

-<ST_XML_ATTLIST_DECLARATION_CONTENT> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("attlist close");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return XML_DECLARATION_CLOSE;

-}

-// end ATTLIST handling

-

-<ST_XML_DECLARATION, ST_XML_DOCTYPE_DECLARATION, ST_XML_DOCTYPE_EXTERNAL_ID, ST_XML_ATTLIST_DECLARATION, ST_XML_ELEMENT_DECLARATION, ST_XML_DECLARATION_CLOSE, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_EXTERNAL_ID> {genericTagClose} {

-	if(Debug.debugTokenizer)

-		dump("declaration end");//$NON-NLS-1$

-	if (Debug.debugTokenizer) {

-		if(fStateStack.peek()!=YYINITIAL)

-			System.out.println("end embedded region");//$NON-NLS-1$

-	}

-	yybegin(fStateStack.pop());

-	return XML_DECLARATION_CLOSE;

-}

-// end DECLARATION handling

-

-<YYINITIAL> [^<&%]*|[&%]{S}+{Name}[^&%<]*|[&%]{Name}([^;&%<]*|{S}+;*) {

-	if(Debug.debugTokenizer)

-		dump("\nXML content");//$NON-NLS-1$

-	return XML_CONTENT;

-}

-

-

-<ST_BLOCK_TAG_SCAN> .|\r|\n {

-		return doBlockTagScan();

-	}

-

-. {

-	if (Debug.debugTokenizer)

-		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$

-			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$

-	return UNDEFINED;

-}

-

-\040 {

-	if(Debug.debugTokenizer)

-		dump("SPACE");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

-\011 {

-	if(Debug.debugTokenizer)

-		dump("0x9");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

-\015 

-{

-	if(Debug.debugTokenizer)

-		dump("CARRIAGE RETURN");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

-\012 {

-	if(Debug.debugTokenizer)

-		dump("LINE FEED");//$NON-NLS-1$

-	return WHITE_SPACE;

-}

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flex.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flex.cmd
deleted file mode 100644
index 59e811c..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flex.cmd
+++ /dev/null
@@ -1,3 +0,0 @@
-@echo off

-cmd /c flexx.cmd

-cmd /c flexj.cmd

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flex.sh b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flex.sh
deleted file mode 100644
index 5cb6e3b..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flex.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh

-export PATH=$PATH:/opt/IBMJava2-131/bin/:/opt/IBMJava2-13/bin/:/opt/jdk1.4

-java -Xmx470000000 -cp JFlex/lib/sed-jflex.jar;. JFlex.Main JSPTokenizer.jflex -skel skeleton.sse

-java -Xmx470000000 -cp JFlex/lib/sed-jflex.jar;. JFlex.Main XMLTokenizer.jflex -skel skeleton.sse

-rm -f JSPTokenizer.java~ JSPTokenizer~ XMLTokenizer.java~ XMLTokenizer~

-cp -v XMLTokenizer.java ../../../../sedmodel/com/ibm/sed/parser/internal

-cp -v JSPTokenizer.java ../../../../sedmodel/com/ibm/sed/parser/internal

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flexj.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flexj.cmd
deleted file mode 100644
index e010e35..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flexj.cmd
+++ /dev/null
@@ -1,3 +0,0 @@
-@echo off

-PATH=%PATH%;d:\jdk6_01\bin

-java -Xmx470000000 -cp d:\JFlex\1.2.2\lib\JFlex.jar;. JFlex.Main JSPTokenizer.jflex -skel skeleton.sse && rm -f JSPTokenizer.java~ JSPTokenizer~ && copy JSPTokenizer.java ..\..\..\..\..\org.eclipse.jst.jsp.core\src\org\eclipse\jst\jsp\core\internal\parser\\internal\JSPTokenizer.java

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flexx.cmd b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flexx.cmd
deleted file mode 100644
index fcb1f81..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/flexx.cmd
+++ /dev/null
@@ -1,3 +0,0 @@
-@echo off

-PATH=%PATH%;c:\jdk1.4.2_08\bin

-java -Xmx470000000 -cp d:\JFlex\1.2.2\lib\JFlex.jar;. JFlex.Main XMLTokenizer.jflex -skel skeleton.sse && rm -f XMLTokenizer.java~ XMLTokenizer~ && copy XMLTokenizer.java ..\..\..\..\..\org.eclipse.wst.xml.core\src\org\eclipse\wst\xml\core\internal\parser\XMLTokenizer.java

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/skeleton.sse b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/skeleton.sse
deleted file mode 100644
index 92b7634..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/skeleton.sse
+++ /dev/null
@@ -1,351 +0,0 @@
-

-  /** this character denotes the end of file */

-  final public static int YYEOF = -1;

-

-  /** lexical states */

----  lexical states, charmap

-

-  /* error codes */

-  final private static int YY_UNKNOWN_ERROR = 0;

-  // final private static int YY_ILLEGAL_STATE = 1;

-  final private static int YY_NO_MATCH = 2;

-  final private static int YY_PUSHBACK_2BIG = 3;

-

-  /* error messages for the codes above */

-  final private static String YY_ERROR_MSG[] = {

-    "Unkown internal scanner error",		//$NON-NLS-1$

-    "Internal error: unknown state",		//$NON-NLS-1$

-    "Error: could not match input",		//$NON-NLS-1$

-    "Error: pushback value was too large"	//$NON-NLS-1$

-  };

-

---- isFinal list

-  /** the input device */

-  private java.io.Reader yy_reader;

-

-  /** the current state of the DFA */

-  private int yy_state;

-

-  /** the current lexical state */

-  private int yy_lexical_state = YYINITIAL;

-

-  /** this buffer contains the current text to be matched and is

-      the source of the yytext() string */

-  private char yy_buffer[] = new char[16384];

-

-  /** the textposition at the last accepting state */

-  private int yy_markedPos;

-

-  /** the textposition at the last state to be included in yytext */

-  private int yy_pushbackPos;

-

-  /** the current text position in the buffer */

-  private int yy_currentPos;

-

-  /** startRead marks the beginning of the yytext() string in the buffer */

-  private int yy_startRead;

-

-  /** endRead marks the last character in the buffer, that has been read

-      from input */

-  private int yy_endRead;

-

-  /** number of newlines encountered up to the start of the matched text */

-  private int yyline;

-

-  /** the number of characters up to the start of the matched text */

-  private int yychar;

-

-  /**

-   * the number of characters from the last newline up to the start of the 

-   * matched text

-   */

-  // private int yycolumn; 

-

-  /** 

-   * yy_atBOL == true <=> the scanner is currently at the beginning of a line

-   */

-  // private boolean yy_atBOL;

-

-  /** yy_atEOF == true <=> the scanner has returned a value for EOF */

-  private boolean yy_atEOF;

-

---- user class code

-

-  /**

-   * Creates a new scanner

-   * There is also a java.io.InputStream version of this constructor.

-   *

-   * @param   in  the java.io.Reader to read input from.

-   */

---- constructor declaration

-

-

-  /**

-   * Gets the next input character.

-   *

-   * @return      the next character of the input stream, EOF if the

-   *              end of the stream is reached.

-   * @exception   IOException  if any I/O-Error occurs

-   */

-  private int yy_advance() throws java.io.IOException {

-

-    /* standard case */

-    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];

-

-    /* if the eof is reached, we don't need to work hard */ 

-    if (yy_atEOF) return YYEOF;

-

-    /* otherwise: need to refill the buffer */

-

-    /* first: make room (if you can) */

-    if (yy_startRead > 0) {

-      System.arraycopy(yy_buffer, yy_startRead, 

-                       yy_buffer, 0, 

-                       yy_endRead-yy_startRead);

-

-      /* translate stored positions */

-      yy_endRead-= yy_startRead;

-      yy_currentPos-= yy_startRead;

-      yy_markedPos-= yy_startRead;

-      yy_pushbackPos-= yy_startRead;

-      yy_startRead = 0;

-    }

-

-    /* is the buffer big enough? */

-    if (yy_currentPos >= yy_buffer.length) {

-      /* if not: blow it up */

-      char newBuffer[] = new char[yy_currentPos*2];

-      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);

-      yy_buffer = newBuffer;

-    }

-

-    /* finally: fill the buffer with new input */

-    int numRead = yy_reader.read(yy_buffer, yy_endRead, 

-                                            yy_buffer.length-yy_endRead);

-

-    if ( numRead == -1 ) return YYEOF;

-

-    yy_endRead+= numRead;

-

-    return yy_buffer[yy_currentPos++];

-  }

-

-    

-  /**

-   * Closes the input stream.

-   */

-  final public void yyclose() throws java.io.IOException {

-    yy_atEOF = true;            /* indicate end of file */

-    yy_endRead = yy_startRead;  /* invalidate buffer    */

-    yy_reader.close();

-  }

-

-

-  /**

-   * Returns the current lexical state.

-   */

-  final public int yystate() {

-    return yy_lexical_state;

-  }

-

-  /**

-   * Enters a new lexical state

-   *

-   * @param newState the new lexical state

-   */

-  final public void yybegin(int newState) {

-    yy_lexical_state = newState;

-  }

-

-

-  /**

-   * Returns the text matched by the current regular expression.

-   */

-  final public String yytext() {

-    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );

-  }

-

-  /**

-   * Returns the length of the matched text region.

-   */

-  final public int yylength() {

-    return yy_markedPos-yy_startRead;

-  }

-

-

-  /**

-   * Reports an error that occured while scanning - from the SED JFlex skeleton

-   *

-   * @param   errorCode  the code of the errormessage to display

-   */

-  private void yy_ScanError(int errorCode) {

-    try {

-      Logger.log(Logger.ERROR, YY_ERROR_MSG[errorCode]);

-    }

-    catch (ArrayIndexOutOfBoundsException e) {

-      Logger.log(Logger.ERROR, YY_ERROR_MSG[YY_UNKNOWN_ERROR]);

-    }

-    // DO NOT EXIT the VM on an error

-    // System.exit(1);

-  } 

-

-

-  /**

-   * Pushes the specified amount of characters back into the input stream.

-   *

-   * They will be read again by then next call of the scanning method

-   *

-   * @param number  the number of characters to be read again.

-   *                This number must not be greater than yylength()!

-   */

-  void yypushback(int number) {

-    if ( number > yylength() )

-      yy_ScanError(YY_PUSHBACK_2BIG);

-

-    yy_markedPos -= number;

-  }

-

-	/**

-	 * user method - skeleton.sed

-	 */

-	protected final boolean containsTagName(char[] markerTagName, int offset, int tagnameLength) {

-		for(int j = 0; j < fBlockMarkers.size(); j++) {

-			BlockMarker marker = (BlockMarker)fBlockMarkers.get(j);

-			if(marker.getTagName().length() == tagnameLength) {

-				boolean matchesSoFar = true;

-				for(int i = 0; i < tagnameLength && matchesSoFar; i++) {

-					if(marker.isCaseSensitive()) {

-						if(marker.getTagName().charAt(i) != markerTagName[i + offset])

-							matchesSoFar = false;

-					}

-					else {

-						if(Character.toLowerCase(marker.getTagName().charAt(i)) != Character.toLowerCase(markerTagName[i + offset]))

-							matchesSoFar = false;

-					}

-				}

-				if(matchesSoFar)

-					return true;

-			}

-		}

-		return false;

-	}

-

-	/**

-	 * user method - skeleton.sed

-	 *

-	 * Return ALL of the regions scannable within the remaining text

-	 * Note: for verification use

-	 */

-	public final List getRegions() {

-		List tokens = new ArrayList();

-		ITextRegion region = null;

-		try {

-			region = getNextToken();

-			while(region != null) {

-				if (region != null) {

-					tokens.add(region);

-				}

-				region = getNextToken();

-			}

-		}

-		catch (StackOverflowError e) {

-			Logger.logException(getClass().getName()+": input could not be tokenized correctly at position " + getOffset(), e);//$NON-NLS-1$

-			throw e;

-		}

-		catch (Exception e) {

-			// Since this is convenience method and NOT the recommended 

-			// way of getting tokens, many errors are simply hidden

-			Logger.logException("Exception not handled retrieving regions: " + e.getLocalizedMessage(), e);//$NON-NLS-1$

-		}

-		return tokens;

-	}

-	/**

-	 * user method - skeleton.sed

-	 */

-	private final void dump(String s) {

-		if (Debug.debugTokenizer) {

-			System.out.println(s + " (" + yychar + "-" + //$NON-NLS-2$//$NON-NLS-1$

-				(yylength() + yychar) + "):\'" +//$NON-NLS-1$

-					StringUtils.escape(yytext()) + "\'");//$NON-NLS-1$

-		}

-	}

-	/* user method  - skeleton.sed */

-	public final boolean isEOF() {

-		return yy_atEOF;

-	}

-/* user method - skeleton.sed */

-protected final boolean containsTagName(String markerTagName) {

-	Iterator blocks = fBlockMarkers.iterator();

-	while(blocks.hasNext()) {

-		BlockMarker marker = (BlockMarker)blocks.next();

-		if(marker.isCaseSensitive()) {

-			if(marker.getTagName().equals(markerTagName))

-				return true;

-		}

-		else {

-			if(marker.getTagName().equalsIgnoreCase(markerTagName))

-				return true;

-		}

-	}

-	return false;

-}

-

---- yy_doEof

-  /**

-   * Resumes scanning until the next regular expression is matched,

-   * the end of input is encountered or an I/O-Error occurs.

-   *

-   * @return      the next token

-   * @exception   IOException  if any I/O-Error occurs

-   */

---- yylex declaration

-    int yy_input;

-    int yy_action;

-

---- local declarations

-

-    while (true) {

-

---- start admin (line, char, col count)

-      yy_action = -1;

-

-      yy_currentPos = yy_startRead = yy_markedPos;

-

---- start admin (lexstate etc)

-

-      yy_forAction: {

-        while (true) {

-    

-          yy_input = yy_advance();

-

-          if ( yy_input == YYEOF ) break yy_forAction;

-

---- line, col, char count, next transition, isFinal action

-            yy_action = yy_state; 

-            yy_markedPos = yy_currentPos; 

---- line count update

-          }

-

-        }

-      }

-

---- char count update

-

-      switch (yy_action) {    

-

---- actions

-        default: 

-          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {

-            yy_atEOF = true;

---- eofvalue

-          } 

-          else {

---- no match

-          }

-      }

-    }

-  }    

-

---- main

-

-}

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/skeleton.sse.readme b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/skeleton.sse.readme
deleted file mode 100644
index eb89700..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/skeleton.sse.readme
+++ /dev/null
@@ -1,6 +0,0 @@
-The skeleton.sed file contains the modified JFlex 1.2.2 skeleton file with

-changes for use with the tokenizers within the org.eclipse.wst.sse.core.xml and

-org.eclipse.wst.sse.core.jsp plugins.

-

-The skeleton file's method definitions are copied into the generated output

-directly.

diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/build.xml b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/build.xml
deleted file mode 100644
index bfd83de..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/build.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="tokenizer" default="CSSTokenizer">
-	<target name="init" depends="properties">
-		<property name="workspace.dir" value="../.."/>
-		<property name="jflex.jar" value="/DevTimeSupport/JFlex/lib/sed-jflex.jar"/>
-		<property name="jflex.maxmemory" value="470000000"/>
-		<property name="jflex.opt" value="-skel SedModel/HTMLTokenizer/devel/skeleton.sse"/>
-	</target>
-
-	<target name="properties" if="eclipse.running">
-		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
-	</target>
-
-	<target name="CSSTokenizer" depends="init">
-		<property name="src.dir" value="SedModel/CSSTokenizer/devel"/>
-		<property name="src.file" value="CSSTokenizer.jflex"/>			
-		<property name="dest.dir" value="org.eclipse.wst.sse.core.css/src/com/ibm/sse/model/css/internal/parser"/>
-		<property name="finaldest.dir" value="org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/parser"/>
-		<antcall target="build-tokenizer">
-			<param name="jflex.opt" value=""/>
-		</antcall>
-	</target>
-
-	<target name="XMLTokenizer" depends="init">
-		<property name="src.dir" value="SedModel/HTMLTokenizer/devel"/>
-		<property name="src.file" value="XMLTokenizer"/>			
-		<property name="dest.dir" value="org.eclipse.wst.sse.core.xml/src/com/ibm/sse/model/xml/internal/parser"/>
-		<antcall target="build-tokenizer"/>
-	</target>
-
-	<target name="JSPTokenizer" depends="init">
-		<property name="src.dir" value="SedModel/HTMLTokenizer/devel"/>
-		<property name="src.file" value="JSPTokenizer.jflex"/>			
-		<property name="dest.dir" value="org.eclipse.wst.sse.core.jsp/src/com/ibm/sse/model/jsp/parser/internal"/>
-		<antcall target="build-tokenizer"/>
-	</target>
-
-	<target name="build-tokenizer" depends="init">
-		<antcall target="run-jflex"/>
-		<antcall target="copy"/>
-		<antcall target="clean"/>
-	</target>
-
-	<target name="run-jflex" depends="init">
-		<java classname="JFlex.Main" maxmemory="${jflex.maxmemory}" fork="yes" >
-			<arg line="${src.dir}/${src.file} ${jflex.opt}"/>
-			<classpath>
-				<pathelement location="${jflex.jar}"/>
-			</classpath>
-		</java>
-	</target>
-	
-	<target name="copy" depends="init">
-		<copy todir="${workspace.dir}/${dest.dir}" overwrite="true" verbose="true">
-			<fileset dir="${src.dir}">
-				<include name="*.java"/>
-			</fileset>
-		</copy>
-		<copy todir="${workspace.dir}/${finaldest.dir}" overwrite="true" verbose="true">
-			<fileset dir="${src.dir}">
-				<include name="*.java"/>
-			</fileset>
-		</copy>
-	</target>
-	
-	<target name="clean" depends="init">
-		<delete verbose="true">
-			<fileset dir="${src.dir}" defaultexcludes="no">
-				<include name="*~"/>
-			</fileset>
-		</delete>
-	</target>
-	
-
-</project>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/devTimeSupportInfo.txt b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/devTimeSupportInfo.txt
deleted file mode 100644
index a6d7aeb..0000000
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/devTimeSupportInfo.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-This directory, DevTimeSupport, normally contains
-the source for some of our parser generators. 
-
-See wst/components/sse/plugins/
-org.eclipse.wst.sse.core\DevTimeSupport
-
-This particular text file you are reading 
-is the only one shipped 
-with an SDK build, since the other files 
-are seldom needed during development or debugging, 
-and some of those files cause problems with long 
-filename or paths that end up being too long for 
-some platforms, and some unzip programs. 
-
diff --git a/bundles/org.eclipse.wst.sse.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.sse.core/META-INF/MANIFEST.MF
deleted file mode 100644
index c96eb0c..0000000
--- a/bundles/org.eclipse.wst.sse.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,50 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.wst.sse.core; singleton:=true
-Bundle-Version: 1.1.301.qualifier
-Bundle-Activator: org.eclipse.wst.sse.core.internal.SSECorePlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.wst.sse.core,
- org.eclipse.wst.sse.core.internal;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.cleanup;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.document;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.encoding;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.encoding.util;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.exceptions;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.filebuffers;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.format;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.ltk.modelhandler;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.ltk.parser;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.model;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.modelhandler;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.parser;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.preferences;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.provisional;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.provisional.document;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.provisional.events;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.provisional.exceptions;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.provisional.model;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.provisional.tasks;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.provisional.text;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.tasks;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.text;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.text.rules;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.undo;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.util;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.internal.validate;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
- org.eclipse.wst.sse.core.text,
- org.eclipse.wst.sse.core.utils,
- org.eclipse.wst.sse.internal.contentproperties;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.sse.ui,org.eclipse.wst.xml.core,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui"
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.text;bundle-version="[3.4.0,4.0.0)";visibility:=reexport,
- org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.filebuffers;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.301,1.2.0)",
- org.eclipse.emf.common;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.wst.validation;bundle-version="[1.2.0,2.0.0)";resolution:=optional,
- com.ibm.icu;bundle-version="[3.8.1,4.0.0)",
- org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)"
-Bundle-ActivationPolicy: lazy;exclude:="org.eclipse.wst.sse.core.internal.propertytester"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.sse.core/README.txt b/bundles/org.eclipse.wst.sse.core/README.txt
deleted file mode 100644
index 4eb3ccf..0000000
--- a/bundles/org.eclipse.wst.sse.core/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-The core model of the sse framework. It provides the base document classes,
-builders and parsers.
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.core/build.properties b/bundles/org.eclipse.wst.sse.core/build.properties
deleted file mode 100644
index 37541b2..0000000
--- a/bundles/org.eclipse.wst.sse.core/build.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Jens Lukowski/Innoopract - initial renaming/restructuring
-#     
-###############################################################################
-source.. = src-encoding/,\
-           src/,\
-           src-tasktags/,\
-           src-contentproperties/
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               .options,\
-               config/,\
-               META-INF/,\
-               .,\
-               about.html
-bin.excludes = bin/**,\
-               @dot/**,\
-               temp.folder/**
-src.includes = schema/,\
-               doc/,\
-               component.xml,\
-               DevTimeSupport/
-output.. = bin/
-src.excludes = DevTimeSupport/build.xml,\
-               DevTimeSupport/SedModel/,\
-               DevTimeSupport/HeadParsers/
diff --git a/bundles/org.eclipse.wst.sse.core/component.xml b/bundles/org.eclipse.wst.sse.core/component.xml
deleted file mode 100644
index dae223c..0000000
--- a/bundles/org.eclipse.wst.sse.core/component.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.wst.sse">
-	<description url="http://eclipse.org/webtools/wst/components/sse/overview.html"></description>
-	<component-depends unrestricted="true"></component-depends>
-	<plugin id="org.eclipse.wst.sse.core" fragment="false" />
-	<plugin id="org.eclipse.wst.sse.doc.user" fragment="false" />
-	<plugin id="org.eclipse.wst.sse.ui" fragment="false" />
-	<package name="org.eclipse.wst.sse.ui.views.properties" api="false">
-		<type name="PropertySheetConfiguration" subclass="true" instantiate="true" />
-		<type name="IPropertySourceExtension" implement="true" />
-	</package>
-	<package name="org.eclipse.wst.sse.ui" api="false">
-		<type name="StructuredTextEditor" subclass="false" instantiate="true" />
-		<type name="StructuredTextViewerConfiguration" subclass="true" instantiate="true" />
-	</package>
-	<package name="org.eclipse.wst.sse.ui.views.contentoutline" api="false">
-		<type name="ContentOutlineConfiguration" subclass="true" instantiate="true" />
-	</package>
-	<plugin id="org.eclipse.wst.sse.ui.infopop" fragment="false" />
-</component>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.core/config/charset.properties b/bundles/org.eclipse.wst.sse.core/config/charset.properties
deleted file mode 100644
index 004a070..0000000
--- a/bundles/org.eclipse.wst.sse.core/config/charset.properties
+++ /dev/null
@@ -1,96 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-! the number of codeset names
-totalnumber=25
-
-! Only translate the xx.label strings.  Do not translate the xx.iana or xx.java strings.
-
-codeset.0.label=ISO 10646/Unicode(UTF-8)
-codeset.0.iana=UTF-8
-
-codeset.1.label=ISO 10646/Unicode(UTF-16) Big Endian
-codeset.1.iana=UTF-16
-
-codeset.2.label=ISO 10646/Unicode(UTF-16BE) Big Endian
-codeset.2.iana=UTF-16BE
-
-codeset.3.label=ISO 10646/Unicode(UTF-16LE) Little Endian
-codeset.3.iana=UTF-16LE
-
-codeset.4.label=US ASCII
-codeset.4.iana=US-ASCII
-
-codeset.5.label=ISO Latin-1
-codeset.5.iana=ISO-8859-1
-
-! (Slavic: Czech, Croat, German, Hungarian, Polish, Romanian, Slovak, Slovenian)
-codeset.6.label=Central/East European (Slavic) 
-codeset.6.iana=ISO-8859-2
-
-! (Esperanto, Galician, Maltese, Turkish)
-codeset.7.label=Southern European
-codeset.7.iana=ISO-8859-3
-
-codeset.8.label=Arabic, Logical
-codeset.8.iana=ISO-8859-6
-
-codeset.9.label=Arabic
-codeset.9.iana=windows-1256
-
-codeset.10.label=Chinese, National Standard
-codeset.10.iana=GB18030
-
-codeset.11.label=Traditional Chinese, Big5
-codeset.11.iana=BIG5
-
-! (Estonian, Latvian, Lithuanian)
-codeset.12.label=Cyrillic, ISO-8859-4
-codeset.12.iana=ISO-8859-4
-
-! (Bulgarian, Byelorussian, Macedonian, Serbian, Ukrainian)
-codeset.13.label=Cyrillic, ISO-8859-5
-codeset.13.iana=ISO-8859-5
-
-codeset.14.label=Greek
-codeset.14.iana=ISO-8859-7
-
-codeset.15.label=Hebrew, Visual
-codeset.15.iana=ISO-8859-8
-
-! label=Hebrew, Logical
-! iana=ISO-8859-8-I
-
-codeset.16.label=Hebrew
-codeset.16.iana=windows-1255
-
-codeset.17.label=Japanese, EUC-JP
-codeset.17.iana=EUC-JP
-
-codeset.18.label=Japanese, ISO 2022
-codeset.18.iana=ISO-2022-JP
-
-codeset.19.label=Japanese, Shift-JIS
-codeset.19.iana=Shift_JIS
-
-codeset.20.label=Japanese, Windows-31J
-codeset.20.iana=windows-31j
-
-codeset.21.label=Korean, EUC-KR
-codeset.21.iana=EUC-KR
-
-codeset.22.label=Korean, ISO 2022
-codeset.22.iana=ISO-2022-KR
-
-codeset.23.label=Thai, TISI
-codeset.23.iana=TIS-620
-
-codeset.24.label=Turkish
-codeset.24.iana=ISO-8859-9
diff --git a/bundles/org.eclipse.wst.sse.core/config/defaultIANA.properties b/bundles/org.eclipse.wst.sse.core/config/defaultIANA.properties
deleted file mode 100644
index f47ed6e..0000000
--- a/bundles/org.eclipse.wst.sse.core/config/defaultIANA.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# This file lists charset mappings between an encoding and its default
-# equivalent encoding listed in charset.properties
-# format: anyname=iana name listed in charset.properties
-
-# No translation necessary
-windows-1252=ISO-8859-1
-windows-932=Shift_JIS
-x-euc-jp-linux=EUC-JP 
-windows-949=EUC-KR
-x-windows-949=EUC-KR
-windows-950=BIG5
-x-windows-950=BIG5
-windows-936=GB18030
-x-mswin-936=GB18030
-GB2312=GB18030
-x-EUC-CN=GB18030
diff --git a/bundles/org.eclipse.wst.sse.core/config/override.properties b/bundles/org.eclipse.wst.sse.core/config/override.properties
deleted file mode 100644
index ae703ba..0000000
--- a/bundles/org.eclipse.wst.sse.core/config/override.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Jens Lukowski/Innoopract - initial renaming/restructuring
-#     
-###############################################################################
-# This file lists charset mappings which supplement or override those
-# provided by the VM. There are few cases where this should be required.
-# Note: there is no integrety checking to see if the validCharsetName is indeed
-# valid for a given VM, so errors would only show up when attempted to 
-# be used.
-
-# No translation necessary
-
-# format: anyname=validjavaCharsetName
-ISO-8859-8-I=ISO-8859-8
-X-SJIS=Shift_JIS
-X-EUC-JP=Shift_JIS
diff --git a/bundles/org.eclipse.wst.sse.core/doc/book.css b/bundles/org.eclipse.wst.sse.core/doc/book.css
deleted file mode 100644
index 9278cd8..0000000
--- a/bundles/org.eclipse.wst.sse.core/doc/book.css
+++ /dev/null
@@ -1,106 +0,0 @@
-P.Code {

-	display: block;

-	text-align: left;

-	text-indent: 0.00pt;

-	margin-top: 0.000000pt;

-	margin-bottom: 0.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 15pt;

-	font-size: 10.000000pt;

-	font-weight: medium;

-	font-style: Regular;

-	color: #4444CC;

-	text-decoration: none;

-	vertical-align: baseline;

-	text-transform: none;

-	font-family: "Courier New";

-}

-H6.CaptionFigColumn {

-	display: block;

-	text-align: left;

-	text-indent: 0.000000pt;

-	margin-top: 3.000000pt;

-	margin-bottom: 11.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 0.000000pt;

-	font-size: 9.000000pt;

-	font-weight: medium;

-	font-style: Italic;

-	color: #000000;

-	text-decoration: none;

-	vertical-align: baseline;

-	text-transform: none;

-	font-family: "Arial";

-}

-P.Note {

-	display: block;

-	text-align: left;

-	text-indent: 0pt;

-	margin-top: 19.500000pt;

-	margin-bottom: 19.500000pt;

-	margin-right: 0.000000pt;

-	margin-left: 30pt;

-	font-size: 11.000000pt;

-	font-weight: medium;

-	font-style: Italic;

-	color: #000000;

-	text-decoration: none;

-	vertical-align: baseline;

-	text-transform: none;

-	font-family: "Arial";

-}

-EM.UILabel {

-	font-weight: Bold;

-	font-style: Regular;

-	text-decoration: none;

-	vertical-align: baseline;

-	text-transform: none;

-}

-EM.CodeName {

-	font-weight: Bold;

-	font-style: Regular;

-	text-decoration: none;

-	vertical-align: baseline;

-	text-transform: none;

-	font-family:"Courier New";

-}

-

-

-

-

-/* following font face declarations need to be removed for DBCS */

-

-body, h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-family: Arial, Helvetica, sans-serif; color: #000000}

-pre				{ font-family: Courier, monospace}

-

-/* end font face declarations */

-

-/* following font size declarations should be OK for DBCS */

-body, h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-size: 10pt; }

-pre				{ font-size: 10pt}

-

-/* end font size declarations */

-

-body	     { background: #FFFFFF}

-h1           { font-size: 18pt; margin-top: 5; margin-bottom: 1 }	

-h2           { font-size: 14pt; margin-top: 25; margin-bottom: 3 }

-h3           { font-size: 11pt; margin-top: 20; margin-bottom: 3 }

-h4           { font-size: 10pt; margin-top: 20; margin-bottom: 3; font-style: italic }

-p            { margin-top: 10px; margin-bottom: 10px }

-pre	     { margin-left: 6; font-size: 9pt }

-a:link	     { color: #0000FF }

-a:hover	     { color: #000080 }

-a:visited    { text-decoration: underline }

-ul	     { margin-top: 0; margin-bottom: 10 }

-li	     { margin-top: 0; margin-bottom: 0 } 

-li p	     { margin-top: 0; margin-bottom: 0 } 

-ol	     { margin-top: 0; margin-bottom: 10 }

-dl	     { margin-top: 0; margin-bottom: 10 }

-dt	     { margin-top: 0; margin-bottom: 0; font-weight: bold }

-dd	     { margin-top: 0; margin-bottom: 0 }

-strong	     { font-weight: bold}

-em	     { font-style: italic}

-var	     { font-style: italic}

-div.revision { border-left-style: solid; border-left-width: thin; 

-				   border-left-color: #7B68EE; padding-left:5 }

-th	     { font-weight: bold }

diff --git a/bundles/org.eclipse.wst.sse.core/doc/schema.css b/bundles/org.eclipse.wst.sse.core/doc/schema.css
deleted file mode 100644
index 4efbf26..0000000
--- a/bundles/org.eclipse.wst.sse.core/doc/schema.css
+++ /dev/null
@@ -1,66 +0,0 @@
-H6.CaptionFigColumn#header {

-	font-size:16px; 

-	display:inline

-}

-

-P.Note#copyright {

-	font-size: smaller; 

-	font-style: normal;

-	color: #336699; 

-	display:inline;

-	margin-top: 3.000000pt;

-	margin-bottom: 11.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 0.000000pt;

-}

-

-P.Code#dtd {

-	color: #800000; 

-	margin-top: 0.000000pt;

-	margin-bottom: 0.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 10.000000pt;

-}

-

-P.Code#dtdAttlist {

-	color: #800000; 

-	margin-top: 0.000000pt;

-	margin-bottom: 0.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 20.000000pt;

-}

-

-P.Code#tag {

-	color: #000080; 

-	display:inline;

-	margin-top: 0.000000pt;

-	margin-bottom: 0.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 0.000000pt;

-}

-

-P.Code#cstring {

-	color: #008000; 

-	display:inline;

-	margin-top: 0.000000pt;

-	margin-bottom: 0.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 0.000000pt;	

-}

-

-.ConfigMarkup#elementDesc {

-	color: black;

-	margin-top: 0.000000pt;

-	margin-bottom: 0.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 10.000000pt;

-}

-

-.ConfigMarkup#attlistDesc {

-	color: black;

-	margin-top: 0.000000pt;

-	margin-bottom: 0.000000pt;

-	margin-right: 0.000000pt;

-	margin-left: 32.000000pt;

-}

-

diff --git a/bundles/org.eclipse.wst.sse.core/handyStuff.jpage b/bundles/org.eclipse.wst.sse.core/handyStuff.jpage
deleted file mode 100644
index 6447b4e..0000000
--- a/bundles/org.eclipse.wst.sse.core/handyStuff.jpage
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.core/plugin.properties b/bundles/org.eclipse.wst.sse.core/plugin.properties
deleted file mode 100644
index 651ffcc..0000000
--- a/bundles/org.eclipse.wst.sse.core/plugin.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Jens Lukowski/Innoopract - initial renaming/restructuring
-#     
-###############################################################################
-providerName=Eclipse.org
-pluginName=Structured Text Model
-# extension names
-Adapt_On_Create_Factory_Extension.name=Adapt On Create Factory Extension
-Document_Types_Extension.name=Document Types Extension
-JSP_Embedded_Content_Type_Handler_Extension.name=JSP Embedded Content Type Handler Extension
-Content_Type_Factory_Contribution_Extension.name=Content Type Factory Contribution Extension
-CSS_Profile_Extension.name=CSS Profile Extension
-Comment_Element_Handler_Extension.name=Comment Element Handler Extension
-Model_Handler_Extension.name=Model Handler Extension
-Format_Processors_Extension_Point.name=Format Processors Extension Point
-Task_Scanner_Extension_Point.name=Task Scanner Extension Point
-Structured_Sources_Task_Extension.name=Detected Task
diff --git a/bundles/org.eclipse.wst.sse.core/plugin.xml b/bundles/org.eclipse.wst.sse.core/plugin.xml
deleted file mode 100644
index 0036500..0000000
--- a/bundles/org.eclipse.wst.sse.core/plugin.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-
-	<!-- deprecated -->
-	<extension-point id="adaptOnCreateFactory" name="%Adapt_On_Create_Factory_Extension.name" schema="schema/adaptOnCreateFactory.exsd"/>
-	<!-- not for use by clients (internal)-->
-	<extension-point id="documentTypes" name="%Document_Types_Extension.name" schema="schema/documentTypes.exsd"/>
-	<!-- not for use by clients (internal)-->
-	<extension-point id="embeddedTypeHandler" name="%JSP_Embedded_Content_Type_Handler_Extension.name" schema="schema/embeddedTypeHandler.exsd"/>
-	<!-- deprecated -->
-	<extension-point id="contentTypeFactoryContribution" name="%Content_Type_Factory_Contribution_Extension.name" schema="schema/contentTypeFactoryContribution.exsd"/>
-	<!-- I commented out ... clients should just use the normal platform way of registering these 
-		adapterFactories. At worst, they'd need a small plugin with 'startup' specified ... but that's 
-		better than us getting hit with the performance impact (of loading plugins and pre-reqs, etc.). 
-		<extension-point id="uriResolverAdapterFactory" name="Resource Adapter Factory for Creating URIResolvers"/>
-	-->
-	<!-- not for use by clients (internal)-->
-	<extension-point id="cssprofile" name="%CSS_Profile_Extension.name" schema="schema/cssprofile.exsd"/>
-	<!-- not for use by clients (internal)-->
-	<extension-point id="commentElementHandler" name="%Comment_Element_Handler_Extension.name" schema="schema/commentElementHandler.exsd"/>
-
-	<!-- not for use by clients (internal)-->
-	<extension-point id="modelHandler" name="%Model_Handler_Extension.name" schema="schema/modelHandler.exsd"/>
-	<!-- not for use by clients (internal)-->
-	<extension-point
-		id="formatProcessors"
-		name="%Format_Processors_Extension_Point.name"
-		schema="schema/formatProcessors.exsd" />
-
-	<!-- not for use by clients (internal)-->
-	<extension-point id="taskscanner" name="%Task_Scanner_Extension_Point.name" schema="schema/taskscanner.exsd"/>
-
-	<!-- Make sure default preference values are set at runtime -->
-	<extension point="org.eclipse.core.runtime.preferences">
-		<initializer
-			class="org.eclipse.wst.sse.core.internal.preferences.PreferenceInitializer" />
-	</extension>
-
-	<extension point="org.eclipse.wst.validation.validatorGroup">
-		<group id="structuredModelGroup">
-			<listener class="org.eclipse.wst.sse.core.internal.validate.ValidatorGroupListener"/>
-		</group>
-	</extension>
-	
-	<!-- Define the StructuredFilePropertyTester as it will handle tracing the entire -->
-	<!-- content type hierarchy for a file. Only operates on IFiles                   -->
-	<extension point="org.eclipse.core.expressions.propertyTesters">
-		<propertyTester
-			class="org.eclipse.wst.sse.core.internal.propertytester.StructuredFilePropertyTester"
-			id="org.eclipse.wst.sse.core.expressions.propertyTester.StructuredFilePropertyTester"
-			namespace="org.eclipse.wst.sse.core.resources"
-			properties="contentTypeId"
-			type="org.eclipse.core.resources.IFile">
-    </propertyTester>
- </extension>
-</plugin>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/adaptOnCreateFactory.exsd b/bundles/org.eclipse.wst.sse.core/schema/adaptOnCreateFactory.exsd
deleted file mode 100644
index ddbf899..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/adaptOnCreateFactory.exsd
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="adaptOnCreateFactory" name="Adapt On Create Factory Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is deprecated and should not be used.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2000, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/commentElementHandler.exsd b/bundles/org.eclipse.wst.sse.core/schema/commentElementHandler.exsd
deleted file mode 100644
index 1441736..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/commentElementHandler.exsd
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="commentElementHandler" name="Comment Element Handler Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="handler-custom"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="handler-custom">
-      <complexType>
-         <sequence>
-            <element ref="startwith"/>
-         </sequence>
-         <attribute name="commenttype" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="startwith">
-      <complexType>
-         <attribute name="prefix" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/contentTypeFactoryContribution.exsd b/bundles/org.eclipse.wst.sse.core/schema/contentTypeFactoryContribution.exsd
deleted file mode 100644
index cf8418e..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/contentTypeFactoryContribution.exsd
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="contentTypeFactoryContribution" name="Content Type Factory Contribution Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is deprecated and should not be used.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt; 
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/cssprofile.exsd b/bundles/org.eclipse.wst.sse.core/schema/cssprofile.exsd
deleted file mode 100644
index 923e853..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/cssprofile.exsd
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="cssprofile" name="CSS Profile Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="profile" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="profile">
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/documentTypes.exsd b/bundles/org.eclipse.wst.sse.core/schema/documentTypes.exsd
deleted file mode 100644
index b90f35f..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/documentTypes.exsd
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="documentTypes" name="Document Types Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="documentType" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="documentType">
-      <complexType>
-         <attribute name="elementName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="displayName" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="namespaceURI" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isXHTML" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hasFrameset" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="publicID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="systemID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="defaultXHTML" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isWML" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="defaultWML" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/embeddedTypeHandler.exsd b/bundles/org.eclipse.wst.sse.core/schema/embeddedTypeHandler.exsd
deleted file mode 100644
index bbcde8d..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/embeddedTypeHandler.exsd
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="embeddedTypeHandler" name="JSP Embedded Content Type Handler Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="embeddedTypeHandler"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="embeddedTypeHandler">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/formatProcessors.exsd b/bundles/org.eclipse.wst.sse.core/schema/formatProcessors.exsd
deleted file mode 100644
index 8ed7304..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/formatProcessors.exsd
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>

-<!-- Schema file written by PDE -->

-<schema targetNamespace="org.eclipse.wst.sse.core">

-<annotation>

-      <appInfo>

-         <meta.schema plugin="org.eclipse.wst.sse.core" id="formatProcessors" name="Format Processors Extension Point"/>

-      </appInfo>

-      <documentation>

-         &lt;b&gt;This extension point is deprecated and should not be used.&lt;/b&gt;

-      </documentation>

-   </annotation>

-

-   <element name="extension">

-      <complexType>

-         <sequence>

-            <element ref="processor"/>

-         </sequence>

-         <attribute name="point" type="string" use="required">

-            <annotation>

-               <documentation>

-                  a fully qualified identifier of the target extension point

-               </documentation>

-            </annotation>

-         </attribute>

-         <attribute name="id" type="string">

-            <annotation>

-               <documentation>

-                  an optional identifier of the extension instance

-               </documentation>

-            </annotation>

-         </attribute>

-         <attribute name="name" type="string">

-            <annotation>

-               <documentation>

-                  an optional name of the extension instance

-               </documentation>

-               <appInfo>

-                  <meta.attribute translatable="true"/>

-               </appInfo>

-            </annotation>

-         </attribute>

-      </complexType>

-   </element>

-

-   <element name="processor">

-      <complexType>

-         <attribute name="class" type="string" use="required">

-            <annotation>

-               <documentation>

-                  

-               </documentation>

-               <appInfo>

-                  <meta.attribute kind="java"/>

-               </appInfo>

-            </annotation>

-         </attribute>

-         <attribute name="contentTypeId" type="string" use="required">

-            <annotation>

-               <documentation>

-                  

-               </documentation>

-            </annotation>

-         </attribute>

-      </complexType>

-   </element>

-

-   <annotation>

-      <appInfo>

-         <meta.section type="since"/>

-      </appInfo>

-      <documentation>

-         &lt;b&gt;This extension point is deprecated and should not be used.&lt;/b&gt;

-      </documentation>

-   </annotation>

-

-   <annotation>

-      <appInfo>

-         <meta.section type="examples"/>

-      </appInfo>

-      <documentation>

-         &lt;pre&gt;

-   &lt;extension

-         point=&quot;org.eclipse.wst.sse.core.formatProcessors&quot;&gt;

-      &lt;processor

-            class=&quot;org.eclipse.wst.sse.core.xml.format.FormatProcessorXML&quot;

-            contentTypeId=&quot;org.eclipse.core.runtime.xml&quot;&gt;

-      &lt;/processor&gt;

-   &lt;/extension&gt;

-&lt;/pre&gt;

-      </documentation>

-   </annotation>

-

-

-

-   <annotation>

-      <appInfo>

-         <meta.section type="copyright"/>

-      </appInfo>

-      <documentation>

-         Copyright (c) 2005, 2007 IBM Corporation and others.&lt;br&gt;

-All rights reserved. This program and the accompanying materials are made 

-available under the terms of the Eclipse Public License v1.0 which accompanies 

-this distribution, and is available at &lt;a

-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;

-      </documentation>

-   </annotation>

-

-</schema>

diff --git a/bundles/org.eclipse.wst.sse.core/schema/modelHandler.exsd b/bundles/org.eclipse.wst.sse.core/schema/modelHandler.exsd
deleted file mode 100644
index 1c375bb..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/modelHandler.exsd
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="modelHandler" name="Model Handler Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="modelHandler"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="modelHandler">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="associatedContentTypeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/schema/taskscanner.exsd b/bundles/org.eclipse.wst.sse.core/schema/taskscanner.exsd
deleted file mode 100644
index 46c03fb..0000000
--- a/bundles/org.eclipse.wst.sse.core/schema/taskscanner.exsd
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.sse.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.sse.core" id="taskscanner" name="Task Scanner Extension Point"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="scanner"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="scanner">
-      <complexType>
-         <attribute name="contentTypeIds" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/AbstractContentSettingsHandler.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/AbstractContentSettingsHandler.java
deleted file mode 100644
index 420e3a0..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/AbstractContentSettingsHandler.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-import org.eclipse.core.resources.IResourceDelta;
-
-/**
- * @deprecated This is package protected so no one cares anyways.
- */
-abstract class AbstractContentSettingsHandler implements IContentSettingsHandler {
-
-
-	private IContentSettings contentSettings = ContentSettingsCreator.create();
-	private IResourceDelta fDelta;
-
-	private void commonWithRespectToKind() {
-		getContentSettings().releaseCache();
-	}
-
-	protected final IContentSettings getContentSettings() {
-		return contentSettings;
-	}
-
-	protected final IResourceDelta getDelta() {
-		return fDelta;
-	}
-
-
-	/*
-	 * @see IContentSettingsHandler#handle(IResourceDelta)
-	 */
-	public void handle(final IResourceDelta delta) {
-		this.fDelta = delta;
-		// get Resource delta kind
-		final int kind = delta.getKind();
-		// never used!?
-		//IResource resource = delta.getResource();
-
-
-		switch (kind) {
-			case IResourceDelta.CHANGED : {
-				handleChanged();
-			}
-				break;
-			case IResourceDelta.REMOVED : {
-				handleRemoved();
-			}
-				break;
-			case IResourceDelta.ADDED : {
-				handleAdded();
-			}
-				break;
-
-
-		}
-
-
-
-	}
-
-	protected void handleAdded() {
-		commonWithRespectToKind();
-	}
-
-	protected void handleChanged() {
-		commonWithRespectToKind();
-	}
-
-	protected void handleRemoved() {
-		commonWithRespectToKind();
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/AbstractSubject.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/AbstractSubject.java
deleted file mode 100644
index fcc98bc..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/AbstractSubject.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public abstract class AbstractSubject implements INotify, ISubject {
-
-
-
-	private static Map listenerList = new Hashtable();
-
-	public synchronized void addListener(IContentSettingsListener listener) {
-		listenerList.put(listener, listener);
-	}
-
-	/*
-	 * @see IContentSettingsEventSubject#notifyContentSettingsListeners(Object)
-	 */
-	public synchronized void notifyListeners(org.eclipse.core.resources.IResource changedResource) {
-
-		Set keys = listenerList.keySet();
-		Iterator iter = keys.iterator();
-
-		while (iter.hasNext()) {
-			IContentSettingsListener csl = (IContentSettingsListener) iter.next();
-			csl.contentSettingsChanged(changedResource);
-		}
-	}
-
-	public synchronized void removeListener(IContentSettingsListener listener) {
-		listenerList.remove(listener);
-	}
-
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettings.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettings.java
deleted file mode 100644
index 0c797e3..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettings.java
+++ /dev/null
@@ -1,689 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public class ContentSettings implements IContentSettings {
-	private static final String contentSettingsName = ".contentsettings";//$NON-NLS-1$
-
-	private static SimpleNodeOperator domOperator;
-
-	private static IProject preProject;
-
-	private static final IContentSettings singleton = new ContentSettings();
-
-	public static final String getContentSettingsName() {
-		return contentSettingsName;
-	}
-
-	public synchronized static IContentSettings getInstance() {
-		return singleton;
-	}
-
-	private String contentSettingsPath;
-	private IProject currProject;
-	private final String fileElementName = "file";//$NON-NLS-1$
-	private final String PATHATTR = "path"; //$NON-NLS-1$
-	private final String projectElementName = "project";//$NON-NLS-1$
-
-
-
-	private final String rootElementName = "contentsettings";//$NON-NLS-1$
-
-
-
-	private ContentSettings() {
-		currProject = null;
-		contentSettingsPath = null;
-	}
-
-
-	private void _setProperties(final IResource resource, final Map properties) {
-		if (resource == null || properties == null || properties.isEmpty())
-			return;
-		if (!(resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE))
-			return;
-
-		contentSettingsPath = getContentSettingsPath(resource);
-		if (contentSettingsPath == null)
-			return;
-
-		try {
-
-			if (!existsContentSettings()) {
-				// create DOM tree for new XML Document
-				createNewDOMTree();
-			}
-			else {
-				// create DOM tree from existing contentsettings.
-				createDOMTree();
-			}
-
-		}
-		catch (SimpleNodeOperator.ReadContentSettingsFailureException e) {
-			Logger.logException(e);
-			try {
-				createNewDOMTree();
-				writeDOMDocument();
-			}
-			catch (SimpleNodeOperator.CreateContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return;
-			}
-			catch (SimpleNodeOperator.WriteContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return;
-			}
-
-		}
-		catch (SimpleNodeOperator.CreateContentSettingsFailureException e) {
-			Logger.logException(e);
-			preProject = currProject;
-			return;
-		}
-
-		Element e = null;
-		if (resource.getType() == IResource.PROJECT) {
-			e = (Element) domOperator.getElementWithNodeName(this.projectElementName);
-			if (e == null) {
-				// create project Element and add it into tree
-				e = (Element) domOperator.addElementUnderRoot(this.projectElementName);
-			}
-		}
-		else if (resource.getType() == IResource.FILE) {
-			// check exists file Element
-			e = (Element) domOperator.getElementWithAttribute(getPathAttr(), getRelativePathFromProject(resource));
-			if (e == null) {
-				// create file Element and add path into it.
-				e = (Element) domOperator.addElementUnderRoot(this.fileElementName);
-				domOperator.addAttributeAt(e, getPathAttr(), getRelativePathFromProject(resource));
-			}
-		}
-
-		// check exists propertyName attribute
-		Map attrList = domOperator.getAttributesOf(e);
-		boolean hasAttr = true;
-		if (attrList == null || attrList.isEmpty())
-			hasAttr = false;
-		Set keys = properties.keySet();
-		Iterator ii = keys.iterator();
-		while (ii.hasNext()) {
-			String propertyName = (String) ii.next();
-			String propertyValue = (String) properties.get(propertyName);
-
-
-			if (!hasAttr || (String) attrList.get(propertyName) == null)
-				// create propertyName attribute and add
-				domOperator.addAttributeAt(e, propertyName, propertyValue);
-			else
-				// set attribute value
-				domOperator.updateAttributeAt(e, propertyName, propertyValue);
-		}
-
-		// write dom tree into .contentsettings
-		try {
-			writeDOMDocument();
-		}
-		catch (SimpleNodeOperator.WriteContentSettingsFailureException ex) {
-			Logger.logException(ex);
-			preProject = currProject;
-			return;
-		}
-
-		preProject = currProject;
-
-
-	}
-
-
-	private void _setProperty(final IResource resource, final String propertyName, final String propertyValue) {
-		if (resource == null || propertyName == null)
-			return;
-		if (!(resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE))
-			return;
-
-		contentSettingsPath = getContentSettingsPath(resource);
-		if (contentSettingsPath == null)
-			return;
-
-		try {
-
-			if (!existsContentSettings()) {
-				// create DOM tree for new XML Document
-				createNewDOMTree();
-			}
-			else {
-				// create DOM tree from existing contentsettings.
-				createDOMTree();
-			}
-
-		}
-		catch (SimpleNodeOperator.ReadContentSettingsFailureException e) {
-			Logger.logException(e);
-			try {
-				createNewDOMTree();
-				writeDOMDocument();
-			}
-			catch (SimpleNodeOperator.CreateContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return;
-			}
-			catch (SimpleNodeOperator.WriteContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return;
-			}
-
-		}
-		catch (SimpleNodeOperator.CreateContentSettingsFailureException e) {
-			Logger.logException(e);
-			preProject = currProject;
-			return;
-		}
-
-		Element e = null;
-		if (resource.getType() == IResource.PROJECT) {
-			e = (Element) domOperator.getElementWithNodeName(this.projectElementName);
-			if (e == null) {
-				// create project Element and add it into tree
-				e = (Element) domOperator.addElementUnderRoot(this.projectElementName);
-			}
-		}
-		else if (resource.getType() == IResource.FILE) {
-			// check exists file Element
-			e = (Element) domOperator.getElementWithAttribute(getPathAttr(), getRelativePathFromProject(resource));
-			if (e == null) {
-				// create file Element and add path into it.
-				e = (Element) domOperator.addElementUnderRoot(this.fileElementName);
-				domOperator.addAttributeAt(e, getPathAttr(), getRelativePathFromProject(resource));
-			}
-		}
-
-		// check exists propertyName attribute
-
-		Map attrList = domOperator.getAttributesOf(e);
-		if (attrList == null || attrList.isEmpty() || (String) attrList.get(propertyName) == null)
-			// create propertyName attribute and add
-			domOperator.addAttributeAt(e, propertyName, propertyValue);
-		else
-			// set attribute value
-			domOperator.updateAttributeAt(e, propertyName, propertyValue);
-
-
-		// write dom tree into .contentsettings
-		try {
-			writeDOMDocument();
-		}
-		catch (SimpleNodeOperator.WriteContentSettingsFailureException ex) {
-			Logger.logException(ex);
-			preProject = currProject;
-			return;
-		}
-
-		preProject = currProject;
-
-
-	}
-
-
-	private void createDOMTree() throws SimpleNodeOperator.ReadContentSettingsFailureException {
-		if (domOperator == null || (currProject != null && (!currProject.equals(preProject)) && contentSettingsPath != null))
-			domOperator = new SimpleNodeOperator(contentSettingsPath);
-
-
-	}
-
-	/*
-	 * private void createNewDOMTree() throws
-	 * SimpleNodeOperator.CreateContentSettingsFailureException{ // create New
-	 * document when no file exists. DOMImplementation impl =
-	 * DOMImplementationImpl.getDOMImplementation(); Document document =
-	 * impl.createDocument(null,rootElementName,null); domOperator = new
-	 * SimpleNodeOperator(document); }
-	 */
-	private void createNewDOMTree() throws SimpleNodeOperator.CreateContentSettingsFailureException {
-		Document document = null;
-		try {
-			document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
-		}
-		catch (ParserConfigurationException e) {
-			Logger.logException("exception creating document", e); //$NON-NLS-1$
-		}
-		catch (FactoryConfigurationError e) {
-			Logger.logException("exception creating document", e); //$NON-NLS-1$
-		}
-		if (document != null) {
-			document.appendChild(document.createElement(rootElementName));
-			domOperator = new SimpleNodeOperator(document);
-		}
-	}
-
-
-	/**
-	 * 
-	 */
-	public synchronized void deleteAllProperties(final IResource deletedFile) {
-		if (deletedFile == null)
-			return;
-		// if (deletedFile.exists()) return;
-		if ((deletedFile).getType() != IResource.FILE && (deletedFile).getType() != IResource.PROJECT)
-			return;
-
-
-		contentSettingsPath = getContentSettingsPath(deletedFile);// getProjectOf((IResource)deletedFile)
-		// +
-		// IPath.SEPARATOR
-		// +
-		// contentSettingsName;
-		if (contentSettingsPath == null)
-			return;
-		if (!existsContentSettings())
-			return;
-
-		try {
-			createDOMTree();
-		}
-		catch (SimpleNodeOperator.ReadContentSettingsFailureException e) {
-			Logger.logException(e);
-			return;
-		}
-
-		Element e = null;
-		if (deletedFile.getType() == IResource.PROJECT)
-			// select project element and get attribute
-			e = (Element) domOperator.getElementWithNodeName(this.projectElementName);
-		else if (deletedFile.getType() == IResource.FILE)
-			e = (Element) domOperator.getElementWithAttribute(getPathAttr(), getRelativePathFromProject(deletedFile));
-		if (e == null) {
-			preProject = currProject;
-			return;
-		}
-
-
-		// when deletedFile entry exists.
-		if (deletedFile.getType() == IResource.PROJECT)
-			domOperator.removeElementWith(this.projectElementName);
-		else if (deletedFile.getType() == IResource.FILE)
-			domOperator.removeElementWith(getPathAttr(), getRelativePathFromProject(deletedFile));
-
-
-		// write dom tree into .contentsettings
-		try {
-			writeDOMDocument();
-		}
-		catch (SimpleNodeOperator.WriteContentSettingsFailureException ex) {
-			Logger.logException(ex);
-			preProject = currProject;
-			return;
-		}
-
-		preProject = currProject;
-
-
-	}
-
-	public synchronized void deleteProperty(final IResource resource, final String propertyName) {
-		if (resource == null)
-			return;
-		if (!(resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE))
-			return;
-		contentSettingsPath = getContentSettingsPath(resource);
-		if (contentSettingsPath == null)
-			return;
-
-		if (!existsContentSettings()) {
-			return; // when .contentsettings.xml is NOT exist.
-		}
-		try {
-			createDOMTree();
-		}
-		catch (SimpleNodeOperator.ReadContentSettingsFailureException e) {
-			Logger.logException(e);
-			try {
-				createNewDOMTree();
-				writeDOMDocument();
-			}
-			catch (SimpleNodeOperator.CreateContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return;
-			}
-			catch (SimpleNodeOperator.WriteContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return;
-			}
-		}
-
-		Element e = null;
-		if (resource.getType() == IResource.PROJECT)
-			// select project element and get attribute
-			e = (Element) domOperator.getElementWithNodeName(this.projectElementName);
-		else if (resource.getType() == IResource.FILE)
-			e = (Element) domOperator.getElementWithAttribute(getPathAttr(), getRelativePathFromProject(resource));
-
-
-		if (e != null) {
-			domOperator.removeAttributeAt(e, propertyName);
-			// write dom tree into .contentsettings
-			try {
-				writeDOMDocument();
-			}
-			catch (SimpleNodeOperator.WriteContentSettingsFailureException ex) {
-				Logger.logException(ex);
-				preProject = currProject;
-				return;
-			}
-		}
-
-		preProject = currProject;
-
-	}
-
-
-	private boolean existsContentSettings() {
-		if (contentSettingsPath == null)
-			return false;
-
-		IResource file = currProject.getFile(contentSettingsName);
-		if (file == null)
-			return false;
-		if (file.isAccessible())
-			return true;
-		else
-			return false;
-
-	}
-
-	public boolean existsProperties(IResource resource) {
-		if (resource == null)
-			return false;
-
-		if (!(resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE))
-			return false;
-
-		contentSettingsPath = getContentSettingsPath(resource);
-		if (contentSettingsPath == null)
-			return false;
-
-		if (!existsContentSettings())
-			return false; // when .contentsettings.xml is NOT exist.
-
-		try {
-			createDOMTree();
-		}
-		catch (SimpleNodeOperator.ReadContentSettingsFailureException e1) {
-			return false;
-		}
-
-		Element e = null;
-		if (resource.getType() == IResource.PROJECT)
-			// select project element and get attribute
-			e = (Element) domOperator.getElementWithNodeName(this.projectElementName);
-		else if (resource.getType() == IResource.FILE)
-			e = (Element) domOperator.getElementWithAttribute(getPathAttr(), getRelativePathFromProject(resource));
-
-		preProject = currProject;
-		if (e == null)
-			return false;
-
-		Map properties = domOperator.getAttributesOf(e);
-		if (properties == null)
-			return false;
-		properties.remove(getPathAttr());// if IFile,removed
-		if (properties.isEmpty())
-			return false;
-		return true;
-
-	}
-
-	private String getContentSettingsPath(IResource resource) {
-		IProject project = null;
-		if (resource.getType() == IResource.PROJECT)
-			project = (IProject) resource;
-		else
-			project = resource.getProject();
-
-		IPath projectLocation = project.getLocation();
-		if (projectLocation == null) {
-			/**
-			 * As a deprecated class, perfect operation in new scenarios such
-			 * as with EFS is not promised.
-			 */
-			return SSECorePlugin.getDefault().getStateLocation().append(rootElementName).append(project.getName()).toString();
-		}
-
-		return projectLocation.addTrailingSeparator().append(contentSettingsName).toString();
-	}
-
-	public final String getPathAttr() {
-		return PATHATTR;
-	}
-
-	public synchronized Map getProperties(final IResource resource) {
-		if (resource == null)
-			return null;
-
-		if (!(resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE))
-			return null;
-
-		contentSettingsPath = getContentSettingsPath(resource);
-		if (contentSettingsPath == null)
-			return null;
-
-		if (!existsContentSettings()) {
-			return null; // when .contentsettings.xml is NOT exist.
-		}
-
-
-		try {
-			createDOMTree();
-		}
-		catch (SimpleNodeOperator.ReadContentSettingsFailureException e1) {
-			Logger.logException(e1);
-			// create DOM tree for new XML Document
-			try {
-				createNewDOMTree();
-				writeDOMDocument();
-			}
-			catch (SimpleNodeOperator.CreateContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return null;
-			}
-			catch (SimpleNodeOperator.WriteContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return null;
-			}
-
-		}
-
-
-		Element e = null;
-		if (resource.getType() == IResource.PROJECT)
-			// select project element and get attribute
-			e = (Element) domOperator.getElementWithNodeName(this.projectElementName);
-		else if (resource.getType() == IResource.FILE)
-			e = (Element) domOperator.getElementWithAttribute(getPathAttr(), getRelativePathFromProject(resource));
-
-
-		if (e != null) {
-
-			Map properties = domOperator.getAttributesOf(e);
-			preProject = currProject;
-			if (properties == null)
-				return null;
-			if (properties.isEmpty())
-				return null;
-			properties.remove(getPathAttr());
-			return properties;
-		}
-		else {
-			preProject = currProject;
-			return null;// when project or file element is NOT exist.
-		}
-	}
-
-	public synchronized String getProperty(final IResource resource, final String propertyName) {
-		if (resource == null)
-			return null;
-
-		if (!(resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE))
-			return null;
-
-		contentSettingsPath = getContentSettingsPath(resource);
-		if (contentSettingsPath == null)
-			return null;
-
-		if (!existsContentSettings()) {
-			return null; // when .contentsettings.xml is NOT exist.
-		}
-
-
-		try {
-			createDOMTree();
-		}
-		catch (SimpleNodeOperator.ReadContentSettingsFailureException e1) {
-			Logger.logException(e1);
-			// create DOM tree for new XML Document
-			try {
-				createNewDOMTree();
-				writeDOMDocument();
-			}
-			catch (SimpleNodeOperator.CreateContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return null;
-			}
-			catch (SimpleNodeOperator.WriteContentSettingsFailureException e2) {
-				Logger.logException(e2);
-				preProject = currProject;
-				return null;
-			}
-
-		}
-
-
-		Element e = null;
-		if (resource.getType() == IResource.PROJECT)
-			// select project element and get attribute
-			e = (Element) domOperator.getElementWithNodeName(this.projectElementName);
-		else if (resource.getType() == IResource.FILE)
-			e = (Element) domOperator.getElementWithAttribute(getPathAttr(), getRelativePathFromProject(resource));
-
-
-		if (e != null) {
-			String result = e.getAttribute(propertyName);
-			preProject = currProject;
-			return result;
-		}
-		else {
-			preProject = currProject;
-			return null;// when project or file element is NOT exist.
-		}
-	}
-
-	private String getRelativePathFromProject(IResource resource) {
-		if (resource == null)
-			return null;
-
-		IPath path = resource.getProjectRelativePath();
-		if (path == null)
-			return null; // if resource is project or workspace root
-		String resourcePath = path.toString();
-
-		return resourcePath;
-
-	}
-
-	public synchronized void releaseCache() {
-		domOperator = null;
-	}
-
-	public synchronized void setProperties(final IResource resource, final Map properties) {
-		// deny to set "path" attribute value.
-		Set keys = properties.keySet();
-		Iterator ii = keys.iterator();
-		while (ii.hasNext()) {
-			if (this.getPathAttr().equals(ii.next()))
-				return;
-		}
-		this._setProperties(resource, properties);
-	}
-
-	public synchronized void setProperty(final IResource resource, final String propertyName, final String propertyValue) {
-		// deny to set "path" attribute value.
-		if (this.getPathAttr().equals(propertyName))
-			return;
-		this._setProperty(resource, propertyName, propertyValue);
-	}
-
-	private void writeDOMDocument() throws SimpleNodeOperator.WriteContentSettingsFailureException {
-		try {
-
-			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-			domOperator.writeDocument(outputStream);
-			outputStream.flush();
-			outputStream.close();
-
-			ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
-
-			IFile outputFile = currProject.getFile(contentSettingsName);
-			if (outputFile.exists())
-				outputFile.setContents(inputStream, true, true, null);
-			else
-				outputFile.create(inputStream, true, null);
-
-			inputStream.close();
-		}
-		catch (CoreException e) {
-			Logger.logException(e);
-			throw new SimpleNodeOperator.WriteContentSettingsFailureException("invalid outputFile in writeDOMDocument()");//$NON-NLS-1$
-		}
-		catch (IOException e) {
-			Logger.logException(e);
-			throw new SimpleNodeOperator.WriteContentSettingsFailureException("invalid outputStream or inputStream in writeDOMDocument()");//$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsChangeSubject.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsChangeSubject.java
deleted file mode 100644
index 7bc580b..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsChangeSubject.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public class ContentSettingsChangeSubject extends AbstractSubject {
-
-
-	private static INotify notify;
-	private static ISubject subject;
-
-	protected static INotify getNotify() {
-		if (notify == null && subject == null) {
-			synchronized (ContentSettingsChangeSubject.class) {
-				if (notify == null && subject == null) {
-					notify = new ContentSettingsChangeSubject();
-					subject = (ISubject) notify;
-				}
-			}
-		}
-
-		return notify;
-	}
-
-	public static ISubject getSubject() {
-		if (subject == null && notify == null) {
-			synchronized (ContentSettingsChangeSubject.class) {
-				if (subject == null && notify == null) {
-					subject = new ContentSettingsChangeSubject();
-					notify = (INotify) subject;
-				}
-			}
-		}
-		return subject;
-	}
-
-	public synchronized void addListener(IContentSettingsListener listener) {
-		super.addListener(listener);
-	}
-
-	public synchronized void notifyListeners(org.eclipse.core.resources.IResource changedResource) {
-		super.notifyListeners(changedResource);
-	}
-
-	public synchronized void removeListener(IContentSettingsListener listener) {
-		super.removeListener(listener);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsCreator.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsCreator.java
deleted file mode 100644
index 9dd355c..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsCreator.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public class ContentSettingsCreator {
-
-	public final static IContentSettings create() {
-		return ContentSettings.getInstance();
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsFileHandler.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsFileHandler.java
deleted file mode 100644
index 0c52604..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsFileHandler.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-
-/**
-* @deprecated This is package protected so no one cares anyways.
-*/
-class ContentSettingsFileHandler extends AbstractContentSettingsHandler {
-
-
-
-	private Map properties;
-
-
-	private void getProperties(IResource file) {
-		properties = getContentSettings().getProperties(file);
-	}
-
-	/*
-	 * @see AbstractContentSettingsHandler#handleAdded()
-	 */
-	protected void handleAdded() {
-		super.handleAdded();
-
-		if (super.getDelta().getFlags() == 0) {
-			// pulldown memu->copy->create file without override, new file,
-			// import without override
-			// copy,new,import has same kind(=1) and flag(=0).
-
-		} else if ((getDelta().getFlags() & IResourceDelta.MOVED_FROM) != 0) {
-			// pulldown menu-> rename without override,pulldown menu->move
-			// without override
-			// instead of this method,handleRemoved() works for this delta
-
-		}
-
-	}
-
-
-	/*
-	 * @see AbstractContentSettingsHandler#handleChanged()
-	 */
-	protected void handleChanged() {
-		// edit
-		if (getDelta().getFlags() == IResourceDelta.CONTENT && (getDelta().getFlags() & IResourceDelta.REPLACED) == 0) {
-			super.handleChanged();
-
-		} else if (getDelta().getFlags() == IResourceDelta.CONTENT && (getDelta().getFlags() & IResourceDelta.REPLACED) != 0) {
-			// override as a result of copy or import
-			// in Web project, copy with override doesn't happen
-
-			// override as move or rename
-			// handleRemoved() works for this delta
-			super.handleChanged();
-
-		}
-
-
-	}
-
-	/*
-	 * @see AbstractContentSettingsHandler#handleRemoved()
-	 */
-	protected void handleRemoved() {
-		super.handleRemoved();
-		IFile deletedFile = null;
-
-		// if entry exists then remove it.
-		if (getDelta().getFlags() == 0) {
-			// pulldown menu->delete
-			deletedFile = (IFile) getDelta().getResource();
-
-			if (deletedFile == null)
-				return;
-			getContentSettings().deleteAllProperties(deletedFile);
-
-			getContentSettings().releaseCache();
-		}
-
-		else if ((getDelta().getFlags() & IResourceDelta.MOVED_TO) != 0) {
-
-			// pulldown menu-> rename, pulldown menu->move
-			deletedFile = (IFile) getDelta().getResource();
-			getProperties(deletedFile);
-
-			// get destination IResource
-			IPath targetPath = getDelta().getMovedToPath();
-			IWorkspaceRoot iwr = ResourcesPlugin.getWorkspace().getRoot();
-			IResource targetFile = iwr.getFile(targetPath);//iwr.findMember(targetPath);
-
-			// set property of destination file
-			getContentSettings().deleteAllProperties(targetFile);
-			setProperties(targetFile);
-			if (properties != null)
-				properties.clear();
-			properties = null;
-		}
-
-		if (deletedFile == null)
-			return;
-		getContentSettings().deleteAllProperties(deletedFile);
-
-		getContentSettings().releaseCache();
-
-	}
-
-	private void setProperties(IResource file) {
-		if (file.getFileExtension() == null)
-			return;
-		if (!(file.getFileExtension().equalsIgnoreCase("shtml")//$NON-NLS-1$
-					|| file.getFileExtension().equalsIgnoreCase("htm")//$NON-NLS-1$
-					|| file.getFileExtension().equalsIgnoreCase("html")//$NON-NLS-1$
-					|| file.getFileExtension().equalsIgnoreCase("jhtml")//$NON-NLS-1$
-					|| file.getFileExtension().equalsIgnoreCase("xhtml")//$NON-NLS-1$
-					|| file.getFileExtension().equalsIgnoreCase("jsp")//$NON-NLS-1$
-					|| file.getFileExtension().equalsIgnoreCase("css")//$NON-NLS-1$
-					|| file.getFileExtension().equalsIgnoreCase("jsf")//$NON-NLS-1$
-		|| file.getFileExtension().equalsIgnoreCase("jspf")))//$NON-NLS-1$
-			return;
-		if (properties == null || properties.isEmpty())
-			return;
-		getContentSettings().setProperties(file, properties);
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsSelfHandler.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsSelfHandler.java
deleted file mode 100644
index 27aa2b8..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsSelfHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-
-import org.eclipse.core.resources.IResourceDelta;
-
-/**
-* @deprecated This is package protected so no one cares anyways.
-*/
-final class ContentSettingsSelfHandler extends AbstractContentSettingsHandler {
-
-	private static INotify notify;// = new ContentSettingsChangedSubject();
-
-
-	private final void getSubject() {
-		notify = ContentSettingsChangeSubject.getNotify();
-	}
-
-	/*
-	 * @see AbstractContentSettingsHandler#handleAdded()
-	 */
-	protected void handleAdded() {
-		getSubject();
-		if (super.getDelta().getFlags() == 0) {
-			// pulldown memu->copy->create file without override, new file,
-			// property page create .contentsettings
-			super.handleAdded();
-			notify.notifyListeners(getDelta().getResource());
-
-		} else if ((getDelta().getFlags() & IResourceDelta.MOVED_FROM) != 0) {
-			// pulldown menu-> rename without override,pulldown menu->move
-			// without override
-			super.handleAdded();
-			notify.notifyListeners(getDelta().getResource());
-
-		}
-
-	}
-
-
-	/*
-	 * @see AbstractContentSettingsHandler#handleChanged()
-	 */
-	protected void handleChanged() {
-		getSubject();
-		if ((getDelta().getFlags() & IResourceDelta.CONTENT) != 0 && (getDelta().getFlags() & IResourceDelta.REPLACED) == 0) {
-			// result of edit, property page operate setProperty(apply or ok
-			// button) in .contentsettings
-			super.handleChanged();
-
-			notify.notifyListeners(getDelta().getResource());
-
-		} else if ((getDelta().getFlags() & IResourceDelta.CONTENT) != 0 && (getDelta().getFlags() & IResourceDelta.REPLACED) != 0) {
-			super.handleChanged();
-			notify.notifyListeners(getDelta().getResource());
-
-		}
-
-
-	}
-
-	/*
-	 * @see AbstractContentSettingsHandler#handleRemoved()
-	 */
-	protected void handleRemoved() {
-		getSubject();
-		if (getDelta().getFlags() == 0) {
-			// pulldown menu->delete
-			super.handleRemoved();
-			notify.notifyListeners(getDelta().getResource());
-
-		} else if ((getDelta().getFlags() & IResourceDelta.MOVED_TO) != 0) {
-			// pulldown menu-> rename, pulldown menu->move
-			super.handleRemoved();
-			notify.notifyListeners(getDelta().getResource());
-
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsSynchronizer.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsSynchronizer.java
deleted file mode 100644
index 0dc38b1..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ContentSettingsSynchronizer.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.sse.core.internal.Logger;
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public class ContentSettingsSynchronizer implements IResourceChangeListener {
-	class ContentSettingsVisitor implements IResourceDeltaVisitor {
-		// redefinition in ContentSettings.java
-		private String contentSettingsName = ContentSettings.getContentSettingsName(); //$NON-NLS-1$
-		private IResourceChangeEvent fEvent;
-		private IContentSettingsHandler handler;
-
-		public ContentSettingsVisitor(IResourceChangeEvent event) {
-			this.fEvent = event;
-		}
-
-		/**
-		 * @see IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			if (delta == null)
-				return false;
-			IResource resource = delta.getResource();
-			if (resource == null)
-				return false;
-			// parent folder or project
-			if (delta.getKind() == IResourceDelta.CHANGED && delta.getFlags() == 0)
-				return true;
-			final int resourceType = resource.getType();
-			switch (resourceType) {
-				case IResource.PROJECT :
-					return false;
-				case IResource.FILE :
-					// whether resource is .contentsettings file or not
-					IProject project = delta.getResource().getProject();
-					if (this.fEvent.getType() == IResourceChangeEvent.POST_CHANGE && resource.equals(project.getFile(this.contentSettingsName))) {
-						// new object for .contentsettings
-						handler = new ContentSettingsSelfHandler();
-					}
-					else if (this.fEvent.getType() == IResourceChangeEvent.PRE_BUILD && resource.getFileExtension() != null) {
-						// TODO change to content type!
-						if (resource.getFileExtension().equalsIgnoreCase("shtml") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("htm") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("html") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("jhtml") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("xhtml") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("jsp") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("css") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("jsf") //$NON-NLS-1$
-									|| resource.getFileExtension().equalsIgnoreCase("jspf")) { //$NON-NLS-1$
-							// new object for IFile
-							handler = new ContentSettingsFileHandler();
-							handler.handle(delta);
-							handler = null;
-							return true;
-						}
-					}
-					else
-						return false; // true or false;motomoto true;
-					break;
-				case IResource.FOLDER :
-					return true;
-				default :
-					return true;
-			}
-//			final IResourceDelta fDelta = delta;
-//			final IContentSettingsHandler deltaHandler = this.handler;
-			// XXX FIXME
-			// I commented out following to move this to "model" 
-			// packages. Since wasnt't hooked up/working anyway, I think 
-			// ok for now, but need to re-work as Job, once we do implement 
-			// settings for resources again. 
-//			Display display = getDisplay();
-//			if (display != null && !display.isDisposed()) {
-//				display.asyncExec(new Runnable() {
-//					public void run() {
-//						if (deltaHandler != null) {
-//							deltaHandler.handle(fDelta);
-//						}
-//					}
-//				});
-//			}
-//			else if (deltaHandler != null) {
-//				deltaHandler.handle(fDelta);
-//			}
-			handler = null;
-			return true; // true or false;motomoto true;
-		}
-	}
-
-	private static ContentSettingsSynchronizer instance = null;
-
-	public synchronized static ContentSettingsSynchronizer getInstance() {
-		if (instance == null)
-			instance = new ContentSettingsSynchronizer();
-		return instance;
-	}
-
-	private ContentSettingsVisitor csVisitor;
-	private boolean fListening = false;
-	private IProject fProject;
-
-
-	private final IProject getProject() {
-		return fProject;
-	}
-
-	private final IWorkspace getWorkspace() {
-		if (getProject() == null)
-			return ResourcesPlugin.getWorkspace();
-		return getProject().getWorkspace();
-	}
-
-	public synchronized void install() {
-		if (!fListening) {
-			getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_BUILD | IResourceChangeEvent.POST_CHANGE);
-			fListening = true;
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	public synchronized boolean isListening() {
-		return fListening;
-	}
-
-	/*
-	 * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		if (delta != null) {
-			try {
-				if (csVisitor == null)
-					csVisitor = new ContentSettingsVisitor(event);
-				delta.accept(csVisitor);
-			}
-			catch (CoreException e) {
-				Logger.logException(e);
-			}
-		}
-		csVisitor = null;
-	}
-
-	public synchronized void unInstall() {
-		getWorkspace().removeResourceChangeListener(this);
-		fListening = false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettings.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettings.java
deleted file mode 100644
index 058dd5c..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettings.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public interface IContentSettings {
-	/**
-	 * 
-	 */
-	public final String CSS_PROFILE = "css-profile"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public final String DEVICE_PROFILE = "target-device"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final String DOCUMENT_TYPE = "document-type"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public final String HTML_DOCUMENT_TYPE = "html-document-type"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public void deleteAllProperties(final IResource deletedFile);
-
-	/**
-	 * 
-	 */
-	public void deleteProperty(final IResource resource, final String propertyName);
-
-	/**
-	 * 
-	 */
-	public boolean existsProperties(IResource resource);
-
-	/**
-	 * 
-	 */
-	public Map getProperties(final IResource resource);
-
-	/**
-	 * 
-	 */
-	public String getProperty(final IResource resource, final String propertyName);
-
-	/**
-	 * release cache of DOM tree in .contentsettings
-	 */
-	public void releaseCache();
-
-	/**
-	 * 
-	 */
-	public void setProperties(final IResource resource, final Map properties);
-
-	/**
-	 * 
-	 */
-	public void setProperty(final IResource resource, final String propertyName, final String propertyValue);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettingsHandler.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettingsHandler.java
deleted file mode 100644
index 8ef8b45..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettingsHandler.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-
-import org.eclipse.core.resources.IResourceDelta;
-
-/**
-* @deprecated This is package protected so no one cares anyways.
-*/
-interface IContentSettingsHandler {
-
-	public void handle(final IResourceDelta delta);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettingsListener.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettingsListener.java
deleted file mode 100644
index 41151f8..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/IContentSettingsListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public interface IContentSettingsListener {
-
-	void contentSettingsChanged(org.eclipse.core.resources.IResource e);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/INotify.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/INotify.java
deleted file mode 100644
index 4dcf5fe..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/INotify.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-/**
-* @deprecated This is package protected so no one cares anyways.
-*/
-interface INotify {
-
-	void notifyListeners(org.eclipse.core.resources.IResource resource);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ISubject.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ISubject.java
deleted file mode 100644
index 4ff4030..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/ISubject.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-/**
- * @deprecated See
- *             org.eclipse.html.core.internal.contentproperties.HTMLContentProperties
- */
-public interface ISubject {
-
-	void addListener(IContentSettingsListener listener);
-
-	void removeListener(IContentSettingsListener listener);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/SimpleNodeOperator.java b/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/SimpleNodeOperator.java
deleted file mode 100644
index 16da926..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-contentproperties/org/eclipse/wst/sse/internal/contentproperties/SimpleNodeOperator.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.internal.contentproperties;
-
-
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.traversal.NodeIterator;
-import org.xml.sax.SAXException;
-
-/**
-* @deprecated This is package protected so no one cares anyways.
-*/
-class SimpleNodeOperator {
-
-	class CreateContentSettingsFailureException extends Exception {
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public CreateContentSettingsFailureException(String reason) {
-			super(reason);
-		}
-	}
-
-
-	class ReadContentSettingsFailureException extends Exception {
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public ReadContentSettingsFailureException(String reason) {
-			super(reason);
-		}
-	}
-
-	static class WriteContentSettingsFailureException extends Exception {
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public WriteContentSettingsFailureException(String reason) {
-			super(reason);
-		}
-	}
-
-	// writer class for .contentSettings.
-	class XMLDocumentWriter {
-		OutputStream fOut;
-
-		protected XMLDocumentWriter(OutputStream out) {
-			this.fOut = out;
-		}
-
-		protected final void close() {
-			try {
-				fOut.close();
-			} catch (IOException e) {
-				// do nothing, shouldn't matter
-			}
-		}
-
-		protected void serialize(Document sourceDocument) throws WriteContentSettingsFailureException {
-			// JAXP transformation
-			Source domSource = new DOMSource(sourceDocument);
-			try {
-				Transformer serializer = TransformerFactory.newInstance().newTransformer();
-				try {
-					serializer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-					serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
-				} catch (IllegalArgumentException e) {
-					// unsupported properties
-				}
-				serializer.transform(domSource, new StreamResult(fOut));
-			} catch (TransformerConfigurationException e) {
-				throw new WriteContentSettingsFailureException(e.getMessage());
-			} catch (TransformerFactoryConfigurationError e) {
-				throw new WriteContentSettingsFailureException(e.getMessage());
-			} catch (TransformerException e) {
-				throw new WriteContentSettingsFailureException(e.getMessage());
-			}
-		}
-	}
-
-	public static void main(String[] args) {
-		SimpleNodeOperator a = null;
-		try {
-			a = new SimpleNodeOperator("workspace/org.eclipse.examples.contentsettings/.contentsettings.xml");//$NON-NLS-1$
-		} catch (Exception e) {
-			System.exit(0);
-		}
-
-		// print all Elements
-		//a.printTree(iter);
-
-		// add Element
-		Map attMap = new Hashtable();
-		attMap.put("path", "hogepath");//$NON-NLS-1$ //$NON-NLS-2$
-		attMap.put("fDocument-type", "documenthogehoge");//$NON-NLS-1$ //$NON-NLS-2$
-		a.addElementUnderRoot("file", attMap);//$NON-NLS-1$
-
-		try {
-			a.writeDocument(System.out);
-		} catch (Exception e) {
-			System.err.println(e.toString());
-		}
-
-	}
-
-	//never used
-	//private DOMParser parser;
-	private Document fDocument;
-	private Node root;
-
-	private String settingsFileName;
-
-
-	public SimpleNodeOperator(Document doc) throws CreateContentSettingsFailureException {
-
-		if (doc == null)
-			throw new CreateContentSettingsFailureException("Document doc==null");//$NON-NLS-1$
-		fDocument = doc;
-		root = fDocument.getLastChild();
-		if (root == null)
-			throw new CreateContentSettingsFailureException("Node root==null");//$NON-NLS-1$
-	}
-
-	public SimpleNodeOperator(String fullPath) throws ReadContentSettingsFailureException {
-		this.settingsFileName = fullPath;
-		createObjectOfDocument();
-	}
-
-	// add attribute(attName=attValue) of ele without checking overlapping of
-	// another attributes of ele.
-	// if overlapping ,override
-	protected Node addAttributeAt(Element ele, String attName, String attValue) {
-		Attr att = fDocument.createAttribute(attName);
-		att.setValue(attValue);
-		if (ele != null)
-			ele.setAttributeNode(att);
-		return ele;
-	}
-
-	protected Node addElementUnder(Node parent, String tagName, Map attMap) {
-		if (parent == null || tagName == null)
-			return null;
-		Element e = fDocument.createElement(tagName);
-		if (attMap != null) {
-			if (!attMap.isEmpty()) {
-				Set attKeys = attMap.keySet();
-				Iterator iter = attKeys.iterator();
-				while (iter.hasNext()) {
-					String key = (String) iter.next();
-					e.setAttribute(key, (String) attMap.get(key));
-				}
-			}
-		}
-		parent.appendChild(e);
-		return e;
-	}
-
-	protected final Node addElementUnderRoot(String tagName) {
-		return addElementUnder(root, tagName, null);
-	}
-
-	// add element with attMap as attribute without checking overlapping.
-	protected final Node addElementUnderRoot(String tagName, Map attMap) {
-		return addElementUnder(root, tagName, attMap);
-	}
-
-	private void createObjectOfDocument() throws ReadContentSettingsFailureException {
-		try {
-			fDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(settingsFileName));
-		} catch (SAXException e) {
-			Logger.logException("exception parsing" + settingsFileName, e); //$NON-NLS-1$
-		} catch (IOException e) {
-			Logger.logException("I/O exception parsing" + settingsFileName, e); //$NON-NLS-1$
-		} catch (ParserConfigurationException e) {
-			Logger.logException("exception accessing DOMImplementation", e); //$NON-NLS-1$
-		} catch (FactoryConfigurationError e) {
-			Logger.logException("exception accessing DOMImplementation", e); //$NON-NLS-1$
-		}
-		//get the root of the XML fDocument
-		root = fDocument.getLastChild();
-		if (root == null) {
-			throw new ReadContentSettingsFailureException("Error: Node root==null");//$NON-NLS-1$
-		}
-	}
-
-	protected Map getAttributesOf(Node node) {
-		if (!node.hasAttributes())
-			return null;
-		Map map = new HashMap();
-		NamedNodeMap attrs = node.getAttributes();
-		int size = attrs.getLength();
-		for (int i = 0; i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			map.put(attr.getName(), attr.getValue());
-		}
-		return (map);
-	}
-
-	private Node getElementWithAttribute(Node first, String attName, String attValue) {
-		Node navpoint = first;
-		while (navpoint != null) {
-			if (navpoint.getNodeType() == Node.ELEMENT_NODE) {
-				NamedNodeMap m = navpoint.getAttributes();
-				if (m == null)
-					continue;
-				if (m.getNamedItem(attName) != null) {
-					if (attValue.equals(((Attr) m.getNamedItem(attName)).getNodeValue()))
-						return navpoint;
-				}
-				NodeList childNodes = navpoint.getChildNodes();
-				if (childNodes != null && childNodes.getLength() > 0) {
-					Node holdNode = getElementWithAttribute(navpoint.getFirstChild(), attName, attValue);
-					if (holdNode != null) {
-						return holdNode;
-					}
-				}
-			}
-			navpoint = navpoint.getNextSibling();
-		}
-		return null;
-	}
-
-
-	// return a (first) Element with attr(attName=attValue) it if exists,
-	// otherwise return null
-	protected Node getElementWithAttribute(String attName, String attValue) {
-		if (attName == null || attValue == null || !fDocument.hasChildNodes())
-			return null;
-		return getElementWithAttribute(fDocument.getFirstChild(), attName, attValue);
-	}
-
-	// retrun Element which has nodeName as Node Name
-	protected Node getElementWithNodeName(String nodeName) {
-		if (nodeName == null)
-			return null;
-		NodeList nodes = fDocument.getElementsByTagName(nodeName);
-		if (nodes.getLength() > 0) {
-			return nodes.item(0);
-		}
-		return null;
-	}
-
-	public void printTree(NodeIterator iter) {
-		Node n;
-		while ((n = iter.nextNode()) != null) {
-			System.out.println(n.getNodeName() + ":");//$NON-NLS-1$
-			NamedNodeMap m = n.getAttributes();
-			if (m == null)
-				continue;
-			for (int i = 0; i < m.getLength(); i++) {
-				String attName = m.item(i).getNodeName();
-				System.out.print(" " + attName + "=" + m.item(i).getNodeValue());//$NON-NLS-1$ //$NON-NLS-2$
-			}
-			System.out.println("");//$NON-NLS-1$
-		}
-	}
-
-
-	// remove attribute(attName) at ele.
-	protected Attr removeAttributeAt(Element ele, String attName) {
-		if (ele == null || attName == null)
-			return null;
-		Attr att = ele.getAttributeNode(attName);
-		ele.removeAttribute(attName);
-		return att;
-	}
-
-	protected Element removeElementWith(String nodeName) {
-		NodeList nodes = fDocument.getElementsByTagName(nodeName);
-		for (int i = 0; i < nodes.getLength(); i++) {
-			nodes.item(i).getParentNode().removeChild(nodes.item(i));
-		}
-		return null;
-	}
-
-	// remove a (first) Element with attr(attName=attValue) and return it if
-	// exists, otherwise return null
-	protected Element removeElementWith(String attName, String attValue) {
-		if (fDocument.hasChildNodes()) {
-			Node element = getElementWithAttribute(attName, attValue);
-			if (element != null && element.getNodeType() == Node.ELEMENT_NODE) {
-				element.getParentNode().removeChild(element);
-				return (Element) element;
-			}
-		}
-		return null;
-
-	}
-
-	// update attribute(attName=newValue) at ele if both ele and attribute of
-	// ele exist
-	protected void updateAttributeAt(Element ele, String attName, String newValue) {
-		Attr att = null;
-		if (ele != null)
-			if ((att = ele.getAttributeNode(attName)) != null)
-				att.setValue(newValue);
-	}
-
-	protected void writeDocument(OutputStream out) throws WriteContentSettingsFailureException {
-		XMLDocumentWriter writer = new XMLDocumentWriter(out);
-		try {
-			writer.serialize(fDocument);
-		} finally {
-			writer.close();
-		}
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedIO.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedIO.java
deleted file mode 100644
index 1f31829..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedIO.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.wst.sse.core.internal.encoding.util.Assert;
-import org.eclipse.wst.sse.core.internal.encoding.util.Logger;
-import org.osgi.framework.Bundle;
-
-
-public abstract class CodedIO {
-
-	private final boolean DEBUG = false;
-	
-	public static final int MAX_BUF_SIZE = 1024 * 8;
-
-	public static final int MAX_MARK_SIZE = MAX_BUF_SIZE;
-
-	public static final String NO_SPEC_DEFAULT = "NoSpecDefault"; //$NON-NLS-1$
-
-	private static Properties overridenCharsets = null;
-
-	/**
-	 * <p>
-	 * There are two well known understood cases where the standard/default
-	 * Java Mappings are not sufficient. (Thanks to Hirotaka Matsumoto for
-	 * providing these two). I believe there are others that individual
-	 * customers have requested to override on a case by case basis, but I've
-	 * lost the details. TODO-future: document some of those use-cases.
-	 * </p>
-	 * <ul>
-	 * <li>ISO-8859-8-I</li>
-	 * <p>
-	 * In the code conversion point of view, ISO-9959-8 and ISO-8859-8-I are
-	 * the same. However. the representation on the browser is different. (
-	 * It's very very hard to explain this into the words, but once you will
-	 * see, you will understand it :) Many BiDi HTML/JSPs use ISO-8859-8-I in
-	 * META/page directive. So WSAD needs to support this encoding.
-	 * </p>
-	 * <li>X-SJIS</li>
-	 * <p>
-	 * Because Mosaic/Navigator 2.0 supported only X-SJIS/X-EUC-JP, lots of
-	 * old HTML files used X-SJIS/X-EUC-JP so that the customers still want us
-	 * to support this code conversion for HTML files.
-	 * </p>
-	 * </ul>
-	 * 
-	 * @param detectedCharsetName
-	 * @return the detectedCharsetName, if no overrides, otherwise the charset
-	 *         name that should be used instead of detectedCharsetName
-	 */
-	/**
-	 * This method is deliberatly 'default access' since clients should not
-	 * need to access this information directly.
-	 */
-	static public String checkMappingOverrides(String detectedCharsetName) {
-		// This method MUST return what was passed in, if
-		// there are no
-		// overrides.
-		String result = detectedCharsetName;
-		String newResult = getOverridenCharsets().getProperty(detectedCharsetName);
-		if (newResult != null) {
-			result = newResult;
-		}
-		return result;
-	}
-
-	/**
-	 * Note: once this instance is created, trace info still needs to be
-	 * appended by caller, depending on the context its created.
-	 */
-	public static EncodingMemento createEncodingMemento(byte[] detectedBom, String javaCharsetName, String detectedCharsetName, String unSupportedName, String specDefaultEncoding, String reason) {
-		EncodingMemento result = new EncodingMemento();
-		result.setJavaCharsetName(javaCharsetName);
-		result.setDetectedCharsetName(detectedCharsetName);
-		// TODO: if detectedCharset and spec default is
-		// null, need to use "work
-		// bench based" defaults.
-		if (specDefaultEncoding == null)
-			result.setAppropriateDefault(NO_SPEC_DEFAULT);
-		else
-			result.setAppropriateDefault(specDefaultEncoding);
-		if (unSupportedName != null) {
-			result.setInvalidEncoding(unSupportedName);
-		}
-		// check if valid
-		try {
-			Charset.isSupported(javaCharsetName);
-		} catch (IllegalCharsetNameException e) {
-			result.setInvalidEncoding(javaCharsetName);
-		}
-
-		// check UTF83ByteBOMUsed and UnicodeStream
-		if (detectedBom != null) {
-			if (detectedBom.length == 2)
-				result.setUnicodeStream(true);
-			else if (detectedBom.length == 3)
-				result.setUTF83ByteBOMUsed(true);
-			result.setUnicodeBOM(detectedBom);
-		}
-		return result;
-	}
-
-	/**
-	 * Note: once this instance is created, trace info still needs to be
-	 * appended by caller, depending on the context its created.
-	 */
-	public static EncodingMemento createEncodingMemento(String detectedCharsetName) {
-		return createEncodingMemento(detectedCharsetName, null);
-	}
-
-	/**
-	 * Note: once this instance is created, trace info still needs to be
-	 * appended by caller, depending on the context its created.
-	 */
-	public static EncodingMemento createEncodingMemento(String detectedCharsetName, String reason) {
-		return createEncodingMemento(detectedCharsetName, reason, null);
-	}
-
-	/**
-	 * Note: once this instance is created, trace info still needs to be
-	 * appended by caller, depending on the context its created.
-	 */
-	public static EncodingMemento createEncodingMemento(String detectedCharsetName, String reason, String specDefaultEncoding) {
-		EncodingMemento result = new EncodingMemento();
-		result = new EncodingMemento();
-		String javaCharset = getAppropriateJavaCharset(detectedCharsetName);
-		result.setJavaCharsetName(javaCharset);
-		result.setDetectedCharsetName(detectedCharsetName);
-		// TODO: if detectedCharset and spec default is
-		// null, need to use "work
-		// bench based" defaults.
-		if (specDefaultEncoding == null)
-			result.setAppropriateDefault(NO_SPEC_DEFAULT);
-		else
-			result.setAppropriateDefault(specDefaultEncoding);
-		// check if valid
-		try {
-			Charset.isSupported(javaCharset);
-		} catch (IllegalCharsetNameException e) {
-			result.setInvalidEncoding(javaCharset);
-		}
-
-		return result;
-	}
-
-	/**
-	 * This method can return null, if invalid charset name (in which case
-	 * "appropriateDefault" should be used, if a name is really need for some
-	 * "save anyway" cases).
-	 * 
-	 * @param detectedCharsetName
-	 * @return
-	 */
-	public static String getAppropriateJavaCharset(String detectedCharsetName) {
-		// we don't allow null argument (or risk NPE or
-		// IllegalArgumentException later at several
-		// points.
-		Assert.isNotNull(detectedCharsetName, "illegal charset argument. it can not be null"); //$NON-NLS-1$
-		String result = detectedCharsetName;
-		// 1. Check explicit mapping overrides from
-		// property file
-		result = CodedIO.checkMappingOverrides(detectedCharsetName);
-		// 2. Use the "canonical" name from JRE mappings
-		// Note: see Charset JavaDoc, the name you get one
-		// with can be alias,
-		// the name you get back is "standard" name.
-		Charset javaCharset = null;
-		// Note: this will immediatly throw
-		// "UnsuppotedCharsetException" if it
-		// invalid. Issue: Is it more client friendly to
-		// eat that exception and return null?
-		javaCharset = Charset.forName(result);
-		if (javaCharset != null) {
-			result = javaCharset.name();
-		}
-		return result;
-	}
-
-	/**
-	 * @return Returns the overridenCharsets.
-	 */
-	private static Properties getOverridenCharsets() {
-		if (overridenCharsets == null) {
-			overridenCharsets = new Properties();
-			Bundle keyBundle = Platform.getBundle(ICodedResourcePlugin.ID);
-			IPath keyPath = new Path("config/override.properties"); //$NON-NLS-1$
-			URL location = Platform.find(keyBundle, keyPath);
-			InputStream propertiesInputStream = null;
-			try {
-				propertiesInputStream = location.openStream();
-				overridenCharsets.load(propertiesInputStream);
-			} catch (IOException e) {
-				// if can't read, just assume there's no
-				// overrides
-				// and repeated attempts will not occur,
-				// since they
-				// will be represented by an empty
-				// Properties object
-			}
-		}
-		return overridenCharsets;
-	}
-
-	/**
-	 * This class need not be instantiated (though its subclasses can be).
-	 */
-	protected CodedIO() {
-		super();
-	}
-
-	protected EncodingMemento createMemento(IContentDescription contentDescription) {
-		EncodingMemento result;
-		String appropriateDefault = contentDescription.getContentType().getDefaultCharset();
-		String detectedCharset = (String) contentDescription.getProperty(IContentDescriptionExtended.DETECTED_CHARSET);
-		String unSupportedCharset = (String) contentDescription.getProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET);
-		String javaCharset = contentDescription.getCharset();
-		// integrity checks for debugging
-		if (javaCharset == null) {
-			Logger.log(Logger.INFO_DEBUG, "charset equaled null!"); //$NON-NLS-1$
-		} else if (javaCharset.length() == 0) {
-			Logger.log(Logger.INFO_DEBUG, "charset equaled emptyString!"); //$NON-NLS-1$
-		}
-		byte[] BOM = (byte[]) contentDescription.getProperty(IContentDescription.BYTE_ORDER_MARK);
-		//result = (EncodingMemento)
-		// contentDescription.getProperty(IContentDescriptionExtended.ENCODING_MEMENTO);
-		result = createEncodingMemento(BOM, javaCharset, detectedCharset, unSupportedCharset, appropriateDefault, null);
-		if (!result.isValid()) {
-			result.setAppropriateDefault(appropriateDefault);
-			// integrity check for debugging "invalid" cases.
-			// the apprriate default we have, should equal what's in the
-			// detected field. (not sure this is always required)
-			if (DEBUG && appropriateDefault != null && !appropriateDefault.equals(detectedCharset)) {
-				Logger.log(Logger.INFO_DEBUG, "appropriate did not equal detected, as expected for invalid charset case"); //$NON-NLS-1$
-			}
-		}
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedReaderCreator.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedReaderCreator.java
deleted file mode 100644
index 155ccdb..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedReaderCreator.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CodingErrorAction;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.wst.sse.core.internal.SSECoreMessages;
-import org.eclipse.wst.sse.core.internal.encoding.util.Assert;
-import org.eclipse.wst.sse.core.internal.encoding.util.BufferedLimitedStream;
-import org.eclipse.wst.sse.core.internal.encoding.util.Logger;
-import org.eclipse.wst.sse.core.internal.encoding.util.NullInputStream;
-import org.eclipse.wst.sse.core.internal.encoding.util.UnicodeBOMEncodingDetector;
-import org.eclipse.wst.sse.core.internal.exceptions.UnsupportedCharsetExceptionWithDetail;
-
-
-/**
- * The purpose of this class is to centralize analysis of a file to determine
- * the most appropriate rules of decoding it. The intended use is to set the
- * input, then get the reader for that input which will have its encoding set
- * appropriately. Additionally, there is an EncodingMemento provided, which
- * will be required, in some cases, to later determine the most appropriate
- * form of encoded output.
- */
-public class CodedReaderCreator extends CodedIO {
-
-
-	private boolean fClientSuppliedStream;
-
-
-	private EncodingMemento fEncodingMemento;
-
-	private EncodingRule fEncodingRule;
-
-	private String fFilename;
-
-	private IFile fIFile;
-
-
-	private InputStream fInputStream;
-	
-	private static final String CHARSET_UTF_16= "UTF-16"; //$NON-NLS-1$
-	
-	private static final String CHARSET_UTF_16LE= "UTF-16LE"; //$NON-NLS-1$
-
-	public CodedReaderCreator() {
-
-		super();
-	}
-
-	public CodedReaderCreator(IFile file) throws CoreException, IOException {
-
-		this();
-		set(file);
-		setEncodingRule(EncodingRule.CONTENT_BASED);
-	}
-
-	public CodedReaderCreator(IFile file, EncodingRule encodingRule) throws CoreException, IOException {
-
-		this();
-		set(file);
-		setEncodingRule(encodingRule);
-	}
-
-	public CodedReaderCreator(String filename, InputStream inputStream) {
-
-		this();
-		set(filename, inputStream);
-		setEncodingRule(EncodingRule.CONTENT_BASED);
-	}
-
-	public CodedReaderCreator(String filename, InputStream inputStream, EncodingRule encodingRule) {
-
-		this();
-		set(filename, inputStream);
-		setEncodingRule(encodingRule);
-	}
-
-	private EncodingMemento checkForEncodingInContents(InputStream limitedStream) throws CoreException, IOException {
-		EncodingMemento result = null;
-
-		// if encoding memento already set, then iFile must
-		// have been set, and no need to get again.
-		if (fEncodingMemento != null) {
-			result = fEncodingMemento;
-		}
-		else {
-			if (fClientSuppliedStream) {
-				try {
-					limitedStream.reset();
-					IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-					IContentDescription contentDescription = contentTypeManager.getDescriptionFor(limitedStream, fFilename, IContentDescription.ALL);
-					if (contentDescription != null) {
-						fEncodingMemento = createMemento(contentDescription);
-					}
-					result = fEncodingMemento;
-				}
-				finally {
-					limitedStream.reset();
-				}
-			}
-			else {
-				// throw new IllegalStateException("unexpected state:
-				// encodingMemento was null but no input stream supplied by
-				// client"); //$NON-NLS-1$
-				result = null;
-			}
-		}
-
-		if (result != null && !result.isValid() && !forceDefault()) {
-			throw new UnsupportedCharsetExceptionWithDetail(result);
-		}
-
-		return result;
-	}
-
-	/**
-	 * @param resettableLimitedStream
-	 */
-	private EncodingMemento checkStreamForBOM(InputStream resettableLimitedStream) {
-		EncodingMemento result = null;
-		UnicodeBOMEncodingDetector unicodeBOMEncodingDetector = new UnicodeBOMEncodingDetector();
-		unicodeBOMEncodingDetector.set(resettableLimitedStream);
-		result = unicodeBOMEncodingDetector.getEncodingMemento();
-		return result;
-	}
-
-	/**
-	 * @param iFile
-	 * @throws CoreException
-	 * @throws IOException
-	 */
-	private EncodingMemento findMementoFromFileCase() throws CoreException, IOException {
-		EncodingMemento result = null;
-		IContentDescription contentDescription = null;
-		try {
-			// This method provides possible improved performance at the
-			// cost of sometimes returning null
-			if (fIFile.exists())
-				contentDescription = fIFile.getContentDescription();
-		}
-		catch (CoreException e) {
-			// Assume if core exception occurs, we can still try more
-			// expensive
-			// discovery options.
-			Logger.logException(e);
-		}
-		if (contentDescription == null && fIFile.isAccessible()) {
-			InputStream contents = null;
-			try {
-				contents = fIFile.getContents();
-				contentDescription = Platform.getContentTypeManager().getDescriptionFor(contents, fIFile.getName(), IContentDescription.ALL);
-			}
-			catch (CoreException e1) {
-				// Assume if core exception occurs, we can't really do much
-				// with
-				// determining encoding, etc.
-				Logger.logException(e1);
-				throw e1;
-			}
-			catch (IOException e2) {
-				// We likely couldn't get the contents of the file, something
-				// is really wrong
-				Logger.logException(e2);
-				throw e2;
-			}
-			if (contents != null) {
-				try {
-					contents.close();
-				}
-				catch (IOException e2) {
-					Logger.logException(e2);
-				}
-			}
-		}
-		if (contentDescription != null) {
-			result = createMemento(contentDescription);
-		}
-
-		return result;
-	}
-
-	/**
-	 * The primary method which contains the highest level rules for how to
-	 * decide appropriate decoding rules: 1. first check for unicode stream 2.
-	 * then looked for encoding specified in content (according to the type of
-	 * content that is it ... xml, html, jsp, etc. 3. then check for various
-	 * settings: file settings first, if null check project settings, if null,
-	 * check user preferences. 4. lastly (or, what is the last user
-	 * preference) is to use "workbench defaults".
-	 * 
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-	private EncodingMemento findMementoFromStreamCase() throws CoreException, IOException {
-
-		EncodingMemento result = null;
-		InputStream resettableLimitedStream = null;
-		try {
-			resettableLimitedStream = getLimitedStream(getResettableStream());
-			if (resettableLimitedStream != null) {
-				// first check for unicode stream
-				result = checkStreamForBOM(resettableLimitedStream);
-				// if not that, then check contents
-				if (result == null) {
-					resettableLimitedStream.reset();
-					result = checkForEncodingInContents(resettableLimitedStream);
-				}
-
-			}
-			else {
-				// stream null, may name's not.
-				if (fFilename != null) {
-					// filename not null
-					IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-					IContentDescription contentDescription = contentTypeManager.getDescriptionFor(new NullInputStream(), fFilename, IContentDescription.ALL);
-					if (contentDescription != null) {
-						result = createMemento(contentDescription);
-					}
-				}
-			}
-		}
-		finally {
-			if (resettableLimitedStream != null) {
-				handleStreamClose(resettableLimitedStream);
-			}
-		}
-		return result;
-	}
-
-	private boolean forceDefault() {
-
-		boolean result = false;
-		if (fEncodingRule != null && fEncodingRule == EncodingRule.FORCE_DEFAULT)
-			result = true;
-		return result;
-	}
-
-	public Reader getCodedReader() throws CoreException, IOException {
-
-		Reader result = null;
-		// we make a local copy of encoding memento so
-		// stream won't
-		// be accessed simultaneously.
-		EncodingMemento encodingMemento = getEncodingMemento();
-		Assert.isNotNull(encodingMemento, "Appears reader requested before file or stream set"); //$NON-NLS-1$
-		InputStream streamToReturn = getResettableStream();
-		streamToReturn.reset();
-		// if UTF 3 byte BOM is used (or UTF-16LE), the
-		// built in converters
-		// don't
-		// correct skip all three bytes ... so skip
-		// remaining one to leave
-		// stream transparently ready for client.
-		// see ... TODO look up bug number
-		if (encodingMemento.isUnicodeStream()) {
-			streamToReturn.skip(2);
-		}
-		else if (encodingMemento.isUTF83ByteBOMUsed()) {
-			streamToReturn.skip(3);
-		}
-		String charsetName = encodingMemento.getJavaCharsetName();
-		if (charsetName == null) {
-			charsetName = encodingMemento.getDetectedCharsetName();
-		}
-		if (!encodingMemento.isValid() && !forceDefault()) {
-			throw new UnsupportedCharsetExceptionWithDetail(encodingMemento);
-		}
-
-		if (fEncodingRule == EncodingRule.FORCE_DEFAULT) {
-			charsetName = encodingMemento.getAppropriateDefault();
-		}
-		
-		// [228366] For files that have a unicode BOM, and a charset name of UTF-16, the charset decoder needs "UTF-16LE"
-		if(CHARSET_UTF_16.equals(charsetName) && encodingMemento.getUnicodeBOM() == IContentDescription.BOM_UTF_16LE)
-			charsetName = CHARSET_UTF_16LE;
-		
-		Charset charset = Charset.forName(charsetName);
-		CharsetDecoder charsetDecoder = charset.newDecoder();
-		if (fEncodingRule == EncodingRule.IGNORE_CONVERSION_ERROR) {
-			charsetDecoder.onMalformedInput(CodingErrorAction.REPLACE);
-			charsetDecoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
-		}
-		else {
-			charsetDecoder.onMalformedInput(CodingErrorAction.REPORT);
-			charsetDecoder.onUnmappableCharacter(CodingErrorAction.REPORT);
-		}
-		// more efficient to be buffered, and I know of no
-		// reason not to return
-		// that directly.
-		result = new BufferedReader(new InputStreamReader(streamToReturn, charsetDecoder), CodedIO.MAX_BUF_SIZE);
-		result.mark(CodedIO.MAX_BUF_SIZE);
-		return result;
-	}
-
-	public EncodingMemento getEncodingMemento() throws CoreException, IOException {
-		// figure out encoding memento from encoding strategy
-		if (fEncodingMemento == null) {
-			if (fClientSuppliedStream) {
-				fEncodingMemento = findMementoFromStreamCase();
-			}
-			else if (fIFile != null) {
-				fEncodingMemento = findMementoFromFileCase();
-			}
-		}
-
-		// if encoding stratagy doesn't provide answer,
-		// then try file settings, project settings,
-		// user preferences, and
-		// finally workbench default.
-		//
-		if (fEncodingMemento == null || fEncodingMemento.getDetectedCharsetName() == null) {
-			fEncodingMemento = getEncodingMementoFromResourceAndPreference();
-		}
-
-		// use DefaultNameRules from NonContentBasedEncodingRules as the final
-		// default
-		if (fEncodingMemento == null) {
-			fEncodingMemento = handleNotProvidedFromContentCase();
-		}
-
-		return fEncodingMemento;
-	}
-
-	/*
-	 * This method is called only when encoding is not detected in the file.
-	 * 
-	 * Here is encoding lookup order we will try: - try resource content
-	 * description (Eclipse Text file encoding) - try resource content
-	 * properties (for JSP only) - try content type encoding preferences (for
-	 * HTML only) - try resource content description (Eclipse Text file
-	 * encoding, implicit check)
-	 * 
-	 * Note: This method appears in both CodedReaderCreator and
-	 * CodedStreamCreator (with just a minor difference). They should be kept
-	 * the same.
-	 */
-	private EncodingMemento getEncodingMementoFromResourceAndPreference() throws IOException, CoreException {
-		EncodingMemento encodingMemento = fEncodingMemento;
-
-		// Follow Eclipse Platform's direction. Get the charset from IFile.
-		if (fIFile != null) {
-			String charset = fIFile.getCharset();
-			encodingMemento = CodedIO.createEncodingMemento(charset);
-		}
-
-		return encodingMemento;
-	}
-
-	/**
-	 * Ensures that an InputStream has mark/reset support, is readlimit is
-	 * set, and that the stream is "limitable" (that is, reports "end of
-	 * input" rather than allow going past mark). This is very specialized
-	 * stream introduced to overcome
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=67211. See also
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=68565
-	 */
-	private InputStream getLimitedStream(InputStream original) {
-		if (original == null)
-			return null;
-		if (original instanceof BufferedLimitedStream)
-			return original;
-		InputStream s = new BufferedLimitedStream(original, CodedIO.MAX_MARK_SIZE);
-		s.mark(CodedIO.MAX_MARK_SIZE);
-		return s;
-	}
-
-	private InputStream getResettableStream() throws CoreException, IOException {
-
-		InputStream resettableStream = null;
-
-		if (fIFile != null) {
-			InputStream inputStream = null;
-			try {
-				// note we always get contents, even if out of synch
-				inputStream = fIFile.getContents(true);
-			}
-			catch (CoreException e) {
-				// SHOULD actually check for existence of
-				// fIStorage, but
-				// for now will just assume core exception
-				// means it
-				// doesn't exist on file system, yet.
-				// and we'll log, just in case its a noteable error
-				Logger.logException(e);
-				inputStream = new NullInputStream();
-			}
-			resettableStream = new BufferedInputStream(inputStream, CodedIO.MAX_BUF_SIZE);
-		}
-		else {
-			if (fInputStream != null) {
-				if (fInputStream.markSupported()) {
-					resettableStream = fInputStream;
-					// try {
-					resettableStream.reset();
-					// }
-					// catch (IOException e) {
-					// // assumed just hasn't been marked yet, so ignore
-					// }
-				}
-				else {
-					resettableStream = new BufferedInputStream(fInputStream, CodedIO.MAX_BUF_SIZE);
-				}
-			}
-		}
-
-		if (resettableStream == null) {
-			resettableStream = new NullInputStream();
-		}
-
-		// mark this once, stream at "zero" position
-		resettableStream.mark(MAX_MARK_SIZE);
-		return resettableStream;
-	}
-
-	private EncodingMemento handleNotProvidedFromContentCase() {
-
-		EncodingMemento result = null;
-		String specDefault = null;
-		// try {
-		// specDefault = getEncodingDetector().getSpecDefaultEncoding();
-		// }
-		// catch (CoreException e) {
-		// // If this exception occurs, assumes there is
-		// // no specDefault
-		// }
-		// catch (IOException e) {
-		// // If this exception occurs, assumes there is
-		// // no specDefault
-		// }
-		// finally {
-		// try {
-		// handleStreamClose(fEncodingDetectorStream);
-		// }
-		// catch (IOException e1) {
-		// // severe error, not much to do here
-		// }
-		// }
-		// this logic should be moved to 'detection' if not already
-		String charset = NonContentBasedEncodingRules.useDefaultNameRules(specDefault);
-		Assert.isNotNull(charset, "post condition failed"); //$NON-NLS-1$
-		result = CodedIO.createEncodingMemento(charset);
-		return result;
-	}
-
-	/**
-	 * @param resettableInputStream
-	 * @throws IOException
-	 */
-	private void handleStreamClose(InputStream resettableInputStream) throws IOException {
-
-		if (resettableInputStream != null) {
-			if (fClientSuppliedStream) {
-				resettableInputStream.reset();
-			}
-			else {
-
-				resettableInputStream.close();
-			}
-		}
-	}
-
-	// TODO We just copy the content properties encoding to current resource's
-	// encoding for now. May improve the UI later by setting an informational
-	// message and/or disable the content properties encoding field.
-	// TODO: remake private else remove
-	void migrateContentPropertiesEncoding(String encoding) throws CoreException {
-		final IFile file = fIFile;
-		final String charset = encoding;
-		// TODO: externalize string later
-		Job migrater = new Job(SSECoreMessages.Migrate_Charset) { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				if (file != null) {
-					try {
-						file.setCharset(charset, null);
-					}
-					catch (CoreException e) {
-						Logger.logException(e);
-					}
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		migrater.setSystem(true);
-		migrater.schedule();
-	}
-
-	private void resetAll() {
-
-		fEncodingRule = null;
-		fIFile = null;
-		fFilename = null;
-		fInputStream = null;
-		fEncodingMemento = null;
-		fClientSuppliedStream = false;
-	}
-
-	public void set(IFile iFile) throws CoreException, IOException {
-		Assert.isNotNull(iFile, "illegal argument"); //$NON-NLS-1$
-		resetAll();
-		fIFile = iFile;
-	}
-
-	public void set(String filename, InputStream inputStream) {
-
-		resetAll();
-		fFilename = filename;
-		fInputStream = inputStream;
-		fClientSuppliedStream = true;
-	}
-
-	public void setEncodingRule(EncodingRule encodingRule) {
-
-		fEncodingRule = encodingRule;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedStreamCreator.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedStreamCreator.java
deleted file mode 100644
index ac1224c..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedStreamCreator.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.CharArrayReader;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.StringReader;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CodingErrorAction;
-import java.nio.charset.UnmappableCharacterException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.wst.sse.core.internal.SSECoreMessages;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.internal.encoding.util.Assert;
-import org.eclipse.wst.sse.core.internal.encoding.util.Logger;
-import org.eclipse.wst.sse.core.internal.exceptions.CharConversionErrorWithDetail;
-import org.eclipse.wst.sse.core.internal.exceptions.MalformedOutputExceptionWithDetail;
-import org.eclipse.wst.sse.core.internal.exceptions.UnsupportedCharsetExceptionWithDetail;
-
-
-public class CodedStreamCreator extends CodedIO {
-
-	private final static int INITIAL_BUFFER_SIZE = 1024 * 16;
-
-	// the 32 bytes used by default by ByteOutputStream is
-	// a little small
-	private static final String PROGRAM_ERROR__FAILED_TO_FIND_ANY_CHARSET_ANYWHERE_ = "Program error: failed to find any charset anywhere!"; //$NON-NLS-1$
-
-	private static final String UTF_16BE_CHARSET_NAME = "UTF-16BE"; //$NON-NLS-1$
-	private static final String UTF_16LE_CHARSET_NAME = "UTF-16LE"; //$NON-NLS-1$
-	//	private static final String UTF_16_CHARSET_NAME = "UTF-16";
-	// //$NON-NLS-1$
-
-	private static final String UTF_8_CHARSET_NAME = "UTF-8"; //$NON-NLS-1$
-
-	private boolean fClientSuppliedReader;
-
-	// future_TODO: this 'checkConversion' can be a little
-	// pricey for large
-	// files, chould be a user preference, or something.
-	// private static final boolean checkConversion = true;
-	private EncodingMemento fCurrentEncodingMemento;
-
-	private EncodingMemento fEncodingMemento;
-
-	private String fFilename;
-
-	private boolean fHasBeenAnalyzed;
-
-	private IFile fIFile;
-
-	private EncodingMemento fPreviousEncodingMemento;
-
-	private Reader fReader;
-
-	private Reader fResettableReader;
-	private byte[] UTF16BEBOM = new byte[]{(byte) 0xFE, (byte) 0xFF};
-
-	private byte[] UTF16LEBOM = new byte[]{(byte) 0xFF, (byte) 0xFE};
-	private byte[] UTF3BYTEBOM = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
-
-	public CodedStreamCreator() {
-		super();
-	}
-
-	public CodedStreamCreator(String filename, char[] characterArray) {
-		super();
-		fFilename = filename;
-		fReader = new CharArrayReader(characterArray);
-	}
-
-	public CodedStreamCreator(String filename, Reader reader) {
-		super();
-		fFilename = filename;
-		fReader = reader;
-	}
-
-	public CodedStreamCreator(String filename, String textString) {
-		super();
-		fFilename = filename;
-		fReader = new StringReader(textString);
-	}
-
-	/**
-	 * The primary method which contains the highest level rules for how to
-	 * decide appropriate decoding rules: 1. first check for unicode stream 2.
-	 * then looked for encoding specified in content (according to the type of
-	 * content that is it ... xml, html, jsp, etc. 3. then check for various
-	 * settings: file settings first, if null check project settings, if null,
-	 * check user preferences. 4. lastly (or, what is the last user
-	 * preference) is to use "workbench defaults".
-	 */
-	private void analyze() throws CoreException, IOException {
-		Reader resettableReader = getResettableReader();
-		try {
-			if (fCurrentEncodingMemento == null) {
-				resettableReader.reset();
-				fCurrentEncodingMemento = checkForEncodingInContents();
-			}
-			// if encoding stratagy doesn't provide answer,
-			// then try file settings, project settings,
-			// user preferences, and
-			// finally workbench default.
-			//
-			if (fCurrentEncodingMemento == null || fCurrentEncodingMemento.getDetectedCharsetName() == null) {
-				resettableReader.reset();
-				fCurrentEncodingMemento = getEncodingMementoFromResourceAndPreference();
-			}
-
-			// use DefaultNameRules from NonContentBasedEncodingRules as the
-			// final default
-			if (fEncodingMemento == null) {
-				handleNotProvidedFromContentCase();
-			}
-
-			fHasBeenAnalyzed = true;
-		} finally {
-			if (resettableReader != null) {
-				resettableReader.reset();
-			}
-		}
-	}
-
-	/**
-	 * Need to check conversion early on. There's some danger than old
-	 * contents of a file are set to empty, if an exception occurs.
-	 * 
-	 * @param allText
-	 * @param encoding
-	 * @param encodingRule
-	 * @throws java.io.UnsupportedEncodingException
-	 * @throws MalformedOutputExceptionWithDetail
-	 * @deprecated - we need to find "cheaper" way to to this functionality so
-	 *             likely to go away in future
-	 */
-	private void checkConversion(EncodingMemento memento, EncodingRule encodingRule) throws IOException {
-		String javaEncoding = memento.getJavaCharsetName();
-		String detectedEncoding = memento.getDetectedCharsetName();
-		Charset charset = Charset.forName(javaEncoding);
-		CharsetEncoder charsetEncoder = charset.newEncoder();
-		charsetEncoder.onMalformedInput(CodingErrorAction.REPORT);
-		charsetEncoder.onUnmappableCharacter(CodingErrorAction.REPORT);
-		Reader reader = getResettableReader();
-		reader.reset();
-		int currentChar = reader.read();
-		int currentPos = 1;
-		try {
-			while (currentChar != -1) {
-				// note: this can probably be made more
-				// efficient later to
-				// check buffer by buffer, instead of
-				// character by character.
-				try {
-					boolean canConvert = charsetEncoder.canEncode((char) currentChar);
-					if (!canConvert) {
-						if (encodingRule == EncodingRule.IGNORE_CONVERSION_ERROR) {
-							// if we're told to ignore the
-							// encoding conversion
-							// error,
-							// notice we still want to detect
-							// and log it. We simply
-							// don't throw the exception, and
-							// we do continue with
-							// the
-							// save.
-							Logger.log(Logger.ERROR, "Encoding Conversion Error during save"); //$NON-NLS-1$
-						} else {
-							throw new MalformedOutputExceptionWithDetail(javaEncoding, detectedEncoding, currentPos);
-						}
-					}
-					currentChar = reader.read();
-					currentPos++;
-				}
-				// IBM's JRE seems to throw NPE when DBCS char is given to
-				// SBCS charsetEncoder
-				catch (NullPointerException e) {
-					throw new CharConversionErrorWithDetail(javaEncoding); //$NON-NLS-1$
-				}
-			}
-			// if we get all the way through loop without throwing exception,
-			// then there must
-			// be an error not detectable when going character by character.
-			throw new CharConversionErrorWithDetail(javaEncoding); //$NON-NLS-1$
-		} finally {
-			reader.reset();
-		}
-	}
-
-	private EncodingMemento checkForEncodingInContents() throws CoreException, IOException {
-		EncodingMemento result = null;
-
-		// if encoding memento already set, and no need to get again.
-		if (fEncodingMemento != null) {
-			result = fEncodingMemento;
-		} else {
-			if (fClientSuppliedReader) {
-				fReader.reset();
-				IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-				try {
-					IContentDescription contentDescription = contentTypeManager.getDescriptionFor(fReader, fFilename, IContentDescription.ALL);
-					if (contentDescription != null) {
-						fEncodingMemento = createMemento(contentDescription);
-					} else {
-						fEncodingMemento = CodedIO.createEncodingMemento("UTF-8"); //$NON-NLS-1$
-					}
-				} catch (NullPointerException e) {
-					// TODO: work around for 5/14 bug in base, should be
-					// removed when move up to 5/21
-					// just created a simple default one
-					fEncodingMemento = CodedIO.createEncodingMemento("UTF-8"); //$NON-NLS-1$
-				}
-				result = fEncodingMemento;
-			} else {
-				throw new IllegalStateException("unexpected state: encodingMemento was null but no input stream supplied"); //$NON-NLS-1$
-			}
-		}
-		//		try {
-		//			result = getEncodingDetector().getEncodingMemento();
-		//			if (result != null && !result.isValid() && !forceDefault()) {
-		//				throw new UnsupportedCharsetExceptionWithDetail(result);
-		//			}
-		//		}
-		//		finally {
-		//			handleStreamClose(fEncodingDetectorStream);
-		//		}
-		return result;
-	}
-
-
-	private void dump(OutputStream outputStream, EncodingRule encodingRule, boolean use3ByteBOMifUTF8) throws CoreException, IOException {
-		getCurrentEncodingMemento();
-		String javaEncodingName = null;
-		if (encodingRule == EncodingRule.CONTENT_BASED) {
-			if (fCurrentEncodingMemento.isValid()) {
-				javaEncodingName = fCurrentEncodingMemento.getJavaCharsetName();
-			} else {
-				throw new UnsupportedCharsetExceptionWithDetail(fCurrentEncodingMemento);
-			}
-		} else if (encodingRule == EncodingRule.IGNORE_CONVERSION_ERROR)
-			javaEncodingName = fCurrentEncodingMemento.getJavaCharsetName();
-		else if (encodingRule == EncodingRule.FORCE_DEFAULT)
-			javaEncodingName = fCurrentEncodingMemento.getAppropriateDefault();
-		// write appropriate "header" unicode BOM bytes
-		// Note: Java seems to write appropriate header for
-		// UTF-16, but not
-		// UTF-8 nor UTF-16BE. This
-		// may vary by JRE version, so need to test well.
-		// Note: javaEncodingName can be null in invalid
-		// cases, so we no hard
-		// to skip whole check if that's the case.
-		if (javaEncodingName != null) {
-			if ((javaEncodingName.equals(UTF_8_CHARSET_NAME) && use3ByteBOMifUTF8) || (javaEncodingName.equals(UTF_8_CHARSET_NAME) && fCurrentEncodingMemento.isUTF83ByteBOMUsed())) {
-				outputStream.write(UTF3BYTEBOM);
-			} else if (javaEncodingName.equals(UTF_16LE_CHARSET_NAME)) {
-				outputStream.write(UTF16LEBOM);
-			} else if (javaEncodingName.equals(UTF_16BE_CHARSET_NAME)) {
-				outputStream.write(UTF16BEBOM);
-			}
-		}
-		// TODO add back in line delimiter handling the
-		// "right" way (updating
-		// markers, not requiring string, etc. .. may need
-		// to move to document
-		// level)
-		//allTextBuffer =
-		// handleLineDelimiter(allTextBuffer, document);
-		Reader reader = getResettableReader();
-		// be sure to test large "readers" ... we'll need
-		// to make sure they all
-		// can reset to initial position (StringReader,
-		// CharArrayReader, and
-		// DocumentReader should all work ok).
-		reader.reset();
-		// There must be cleaner logic somehow, but the
-		// idea is that
-		// javaEncodingName can be null
-		// if original detected encoding is not valid (and
-		// if FORCE_DEFAULT was
-		// not specified). Hence, we WANT the first
-		// Charset.forName to
-		// throw appropriate exception.
-		Charset charset = null;
-
-		// this call checks "override" properties file
-		javaEncodingName = CodedIO.getAppropriateJavaCharset(javaEncodingName);
-
-		if (javaEncodingName == null) {
-			charset = Charset.forName(fCurrentEncodingMemento.getDetectedCharsetName());
-		} else {
-			charset = Charset.forName(javaEncodingName);
-		}
-		CharsetEncoder charsetEncoder = charset.newEncoder();
-		if (!(encodingRule == EncodingRule.IGNORE_CONVERSION_ERROR)) {
-			charsetEncoder.onMalformedInput(CodingErrorAction.REPORT);
-			charsetEncoder.onUnmappableCharacter(CodingErrorAction.REPORT);
-		} else {
-			charsetEncoder.onMalformedInput(CodingErrorAction.REPLACE);
-			charsetEncoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
-
-		}
-		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, charsetEncoder);
-		//TODO: this may no longer be needed (and is at
-		// least wrong spot for
-		// it).
-		//		if (checkConversion && (!(encodingRule ==
-		// EncodingRule.IGNORE_CONVERSION_ERROR))) {
-		//			checkConversion(fCurrentEncodingMemento,
-		// encodingRule);
-		//		}
-		char[] charbuf = new char[CodedIO.MAX_BUF_SIZE];
-		int nRead = 0;
-		try {
-			while (nRead != -1) {
-				nRead = reader.read(charbuf, 0, MAX_BUF_SIZE);
-				if (nRead > 0) {
-					outputStreamWriter.flush();
-					outputStreamWriter.write(charbuf, 0, nRead);
-				}
-			}
-		} catch (UnmappableCharacterException e) {
-			checkConversion(fCurrentEncodingMemento, encodingRule);
-		} finally {
-			// since we don't own the original output stream, we
-			// won't close it ours.
-			// the caller who passed it to us must close original one
-			// when appropriate.
-			// (but we do flush to be sure all up-to-date)
-			outputStreamWriter.flush();
-		}
-	}
-
-	private boolean get3ByteBOMPreference() {
-		return SSECorePlugin.getDefault().getPluginPreferences().getBoolean(CommonEncodingPreferenceNames.USE_3BYTE_BOM_WITH_UTF8);
-	}
-
-	public ByteArrayOutputStream getCodedByteArrayOutputStream() throws CoreException, IOException {
-		return getCodedByteArrayOutputStream(EncodingRule.CONTENT_BASED);
-	}
-
-	public ByteArrayOutputStream getCodedByteArrayOutputStream(EncodingRule encodingRule) throws CoreException, IOException {
-		//Assert.isNotNull(fPreviousEncodingMemento,
-		// "previousEncodingMemento
-		// needs to be set first");
-		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(INITIAL_BUFFER_SIZE);
-		dump(byteArrayOutputStream, encodingRule, get3ByteBOMPreference());
-		return byteArrayOutputStream;
-	}
-
-	public EncodingMemento getCurrentEncodingMemento() throws CoreException, IOException {
-		//Assert.isNotNull(fPreviousEncodingMemento,
-		// "previousEncodingMemento
-		// needs to be set first");
-		if (!fHasBeenAnalyzed) {
-			analyze();
-		}
-		// post condition
-		Assert.isNotNull(fCurrentEncodingMemento, "illegal post condition state"); //$NON-NLS-1$
-		// be sure to carry over appropriate encoding
-		// "state" that may be
-		// relevent.
-		if (fPreviousEncodingMemento != null) {
-			fCurrentEncodingMemento.setUTF83ByteBOMUsed(fPreviousEncodingMemento.isUTF83ByteBOMUsed());
-		}
-		return fCurrentEncodingMemento;
-	}
-
-	/*
-	 * This method is called only when encoding is not detected in the file.
-	 * 
-	 * Here is encoding lookup order we will try: - try resource content
-	 * description (Eclipse Text file encoding) - try resource content
-	 * properties (for JSP only) - try content type encoding preferences (for
-	 * HTML only) - try resource content description (Eclipse Text file
-	 * encoding, implicit check)
-	 * 
-	 * Note: This method appears in both CodedReaderCreator and
-	 * CodedStreamCreator (with just a minor difference). They should be kept
-	 * the same.
-	 */
-	private EncodingMemento getEncodingMementoFromResourceAndPreference() throws IOException, CoreException {
-		EncodingMemento encodingMemento = fEncodingMemento;
-
-		// Follow Eclipse Platform's direction. Get the charset from IFile.
-		if (fIFile != null) {
-			String charset = fIFile.getCharset();
-			encodingMemento = CodedIO.createEncodingMemento(charset);
-		}
-
-		return encodingMemento;
-	}
-
-	private Reader getResettableReader() {
-		if (fResettableReader == null) {
-			if (fReader.markSupported()) {
-				fResettableReader = fReader;
-			} else {
-				fResettableReader = new BufferedReader(fReader);
-				try {
-					fResettableReader.mark(MAX_MARK_SIZE);
-				} catch (IOException e) {
-					// impossible, since we just checked if
-					// markable
-					throw new Error(e);
-				}
-
-			}
-		}
-		return fResettableReader;
-	}
-
-	protected void handleNotProvidedFromContentCase() {
-		// move to "detectors" if not already
-		String specDefault = null;
-		//specDefault = getEncodingDetector().getSpecDefaultEncoding();
-		String charset = NonContentBasedEncodingRules.useDefaultNameRules(specDefault);
-		Assert.isNotNull(charset, PROGRAM_ERROR__FAILED_TO_FIND_ANY_CHARSET_ANYWHERE_);
-		fCurrentEncodingMemento = CodedIO.createEncodingMemento(charset);
-	}
-
-	// TODO We just copy the content properties encoding to current resource's
-	// encoding for now. May improve the UI later by setting an informational
-	// message and/or disable the content properties encoding field.
-	// TODO make priviate if needed, else remove
-	void migrateContentPropertiesEncoding(String encoding) throws CoreException {
-		if (fIFile != null)
-			fIFile.setCharset(encoding, null);
-		final IFile file = fIFile;
-		final String charset = encoding;
-		// TODO: externalize string later
-		Job migrater = new Job(SSECoreMessages.Migrate_Charset) { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				if (file != null) {
-					try {
-						file.setCharset(charset, null);
-					} catch (CoreException e) {
-						Logger.logException(e);
-					}
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		migrater.setSystem(true);
-		migrater.schedule();
-
-	}
-
-	/**
-	 *  
-	 */
-	private void resetAll() {
-		fFilename = null;
-		fReader = null;
-		fPreviousEncodingMemento = null;
-		fCurrentEncodingMemento = null;
-		fHasBeenAnalyzed = false;
-		fClientSuppliedReader = false;
-	}
-
-	public void set(IFile file, Reader reader) {
-		fIFile = file;
-		set(file.getName(), reader);
-	}
-
-	public void set(String filename, char[] characterArray) {
-		resetAll();
-		fFilename = filename;
-		fReader = new CharArrayReader(characterArray);
-	}
-
-	public void set(String filename, Reader reader) {
-		resetAll();
-		fFilename = filename;
-		fReader = reader;
-		fClientSuppliedReader = true;
-	}
-
-	public void set(String filename, String textString) {
-		set(filename, new StringReader(textString));
-	}
-
-	public void setPreviousEncodingMemento(EncodingMemento previousEncodingMemento) {
-		fPreviousEncodingMemento = previousEncodingMemento;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CommonCharsetNames.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CommonCharsetNames.java
deleted file mode 100644
index 518c7b4..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CommonCharsetNames.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.UnsupportedCharsetException;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Properties;
-import java.util.PropertyResourceBundle;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.encoding.util.Logger;
-import org.osgi.framework.Bundle;
-
-/**
- * CommonCharsets is a utility class to provide a central place to map some
- * IANA charset name to a Java charset name. In 1.4 JRE's this mostly is a
- * thin wrapper of existing Charset functionality. It does, however, allow
- * some "overriding" of the built in JRE mappings in the event they are
- * necessary. See CodedIO.checkMappingOverrides.
- * <p>
- * This class also provides some convenient human readable description for the
- * charset names which can be used in user interfaces. The description is NL
- * aware based on locale. The data is populated via the charset.properties
- * file only once, based on static initialization of the hashtables.
- * <p>
- * The IANA tags are based on reference information found at the
- * http://www.iana.org site. Specifically see
- * http://www.iana.org/assignments/character-sets
- */
-public final class CommonCharsetNames {
-
-	private static Properties defaultIANAmappings = null;
-
-	private static ArrayList encodings = null;
-
-	private static Hashtable supportedEncodingDisplayNames = null;
-
-	/**
-	 * Returns list of commonly available encoding names. Suitable for
-	 * populating a UI dialog or drop down. This list would be a subset of all
-	 * possible charsets the VM supports (which can get into the hundreds).
-	 * For the VM supported charsets, use
-	 * <code>Charset.availableCharsets()</code>
-	 * 
-	 * @return String[]
-	 */
-	public static String[] getCommonCharsetNames() {
-		String[] enc = new String[getEncodings().size()];
-		getEncodings().toArray(enc);
-		return enc;
-	}
-
-	/**
-	 * @return Returns the defaultIANAmappings.
-	 */
-	private static Properties getDefaultIANAMappings() {
-		if (defaultIANAmappings == null) {
-			defaultIANAmappings = new Properties();
-			Bundle keyBundle = Platform.getBundle(ICodedResourcePlugin.ID);
-			IPath keyPath = new Path("config/defaultIANA.properties"); //$NON-NLS-1$
-			URL location = Platform.find(keyBundle, keyPath);
-			InputStream propertiesInputStream = null;
-			try {
-				propertiesInputStream = location.openStream();
-				defaultIANAmappings.load(propertiesInputStream);
-			}
-			catch (IOException e) {
-				// if can't read, just assume there's no
-				// default IANA mappings
-				// and repeated attempts will not occur,
-				// since they
-				// will be represented by an empty
-				// Properties object
-			}
-		}
-		return defaultIANAmappings;
-	}
-
-	/**
-	 * Returns display (translated) string for encoding name. If there is no
-	 * "custom" translated version available, it defers to ther VM's Charset
-	 * support. It will return null if no display name is available.
-	 * 
-	 * @param String
-	 *            charset name
-	 * @return Human friendly display name
-	 */
-	public static String getDisplayString(String charsetName) {
-		if (charsetName == null)
-			return null;
-		String result = (String) getSupportedEncodingDisplayNames().get(charsetName);
-		if (result == null) {
-			// if we don't have a special one, just return
-			// what's provided by Charset
-
-			try {
-				Charset charset = Charset.forName(charsetName);
-				result = charset.displayName();
-			}
-			catch (UnsupportedCharsetException e) {
-				// if not supported, the display name is
-				// the least of clients concerns :)
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @return Returns the javaEncodings.
-	 */
-	private static ArrayList getEncodings() {
-		if (encodings == null) {
-			initHashTables();
-		}
-		return encodings;
-	}
-
-	public static String getIanaPreferredCharsetName(String charsetName) {
-		String preferredName = charsetName;
-
-		try {
-			Charset charset = Charset.forName(charsetName);
-			if (charset.name() != null) {
-				preferredName = charset.name();
-			}
-		}
-		catch (IllegalCharsetNameException e) {
-			// just return input if illegal
-		}
-		catch (UnsupportedCharsetException e) {
-			// just return input if illegal
-		}
-		return preferredName;
-	}
-
-	/**
-	 * Returns a default IANA name that is listed in CommonCharsetNames. Here
-	 * is how it checks: 1. check to see if charsetName is in the
-	 * CommonCharsetNames list and if so, just return it. 2. check to see if
-	 * charsetName is listed in defaultIANAmappings which contains a mapping
-	 * of more common encodings and the default IANA name they should map to.
-	 * 3. return defaultIanaName if all else fails
-	 */
-	public static String getPreferredDefaultIanaName(String charsetName, String defaultIanaName) {
-		String preferredName = defaultIanaName;
-		String guessedName = charsetName;
-		try {
-			guessedName = CodedIO.getAppropriateJavaCharset(charsetName);
-		}
-		catch (IllegalCharsetNameException e) {
-			// just ignore if illegal
-		}
-		catch (UnsupportedCharsetException e) {
-			// just ignore if illegal
-		}
-		if (getEncodings().contains(guessedName))
-			preferredName = guessedName;
-		else {
-			preferredName = getDefaultIANAMappings().getProperty(guessedName, preferredName);
-		}
-
-		return preferredName;
-	}
-
-	/**
-	 * @return
-	 */
-	private static Hashtable getSupportedEncodingDisplayNames() {
-		if (supportedEncodingDisplayNames == null) {
-			initHashTables();
-		}
-		return supportedEncodingDisplayNames;
-	}
-
-	private static void initHashTables() {
-		if (supportedEncodingDisplayNames == null) {
-			// Initialize hash table for encoding table
-			supportedEncodingDisplayNames = new Hashtable();
-			encodings = new ArrayList();
-
-			ResourceBundle bundle = null;
-			InputStream bundleStream = null;
-			try {
-				URL bundleURL = Platform.find(Platform.getBundle(ICodedResourcePlugin.ID), Path.fromOSString("$nl$/config/charset.properties")); //$NON-NLS-1$
-				if (bundleURL != null) {
-					bundleStream = bundleURL.openStream();
-					bundle = new PropertyResourceBundle(bundleStream);
-				}
-
-				String totalNumString = bundle.getString("totalnumber");//$NON-NLS-1$
-				int totalNum = 0;
-				if (totalNumString.length() != 0) {
-					try {
-						totalNum = Integer.valueOf(totalNumString).intValue();
-					}
-					catch (NumberFormatException e) {
-						totalNum = 0;
-					}
-				}
-
-				for (int i = 0; i < totalNum; i++) {
-					String iana = bundle.getString("codeset." + i + ".iana");//$NON-NLS-2$//$NON-NLS-1$
-					String displayName = bundle.getString("codeset." + i + ".label");//$NON-NLS-2$//$NON-NLS-1$
-
-					encodings.add(iana);
-					supportedEncodingDisplayNames.put(iana, displayName);
-				}
-			}
-			catch (IOException e) {
-				Logger.logException("invalid install or configuration", e); //$NON-NLS-1$
-			}
-			finally {
-				try {
-					if (bundleStream != null)
-						bundleStream.close();
-				}
-				catch (IOException x) {
-				}
-			}
-		}
-	}
-
-	public static void main(String[] args) {
-		// unit test only
-		String test = "Cp1252"; //$NON-NLS-1$
-		String result = CommonCharsetNames.getIanaPreferredCharsetName(test);
-		System.out.println(test + " --> " + result); //$NON-NLS-1$
-
-		test = "MS932"; //$NON-NLS-1$
-		result = CommonCharsetNames.getIanaPreferredCharsetName(test);
-		System.out.println(test + " --> " + result); //$NON-NLS-1$
-
-	}
-
-	public CommonCharsetNames() {
-		super();
-		initHashTables();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CommonEncodingPreferenceNames.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CommonEncodingPreferenceNames.java
deleted file mode 100644
index 087e03a..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CommonEncodingPreferenceNames.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-/**
- * Common preference keys used to specify encoding and end of line.
- */
-public class CommonEncodingPreferenceNames {
-	
-	private CommonEncodingPreferenceNames() {
-		// empty private constructor so users cannot instantiate class
-	}
-
-	/**
-	 * Constant to be used when referring to CR/MAC line delimiter
-	 * @deprecated - no longer used
-	 */
-	public static final String CR = "EOL_Mac"; //$NON-NLS-1$
-	/**
-	 * Constant to be used when referring to CRLF/WINDOWS line delimiter
-	 * @deprecated - no longer used
-	 */
-	public static final String CRLF = "EOL_Windows"; //$NON-NLS-1$
-	/**
-	 * The end-of-line character(s) to use.
-	 * @deprecated - no longer used
-	 */
-	public static final String END_OF_LINE_CODE = "endOfLineCode";//$NON-NLS-1$
-	/**
-	 * The character code to use when reading a file.
-	 */
-	public static final String INPUT_CODESET = "inputCodeset";//$NON-NLS-1$
-
-	/**
-	 * Constant to be used when referring to LF/UNIX line delimiter
-	 * @deprecated - no longer used
-	 */
-	public static final String LF = "EOL_Unix"; //$NON-NLS-1$
-	/**
-	 * Constant to be used when referring to No translation of line delimiters
-	 * @deprecated - no longer used
-	 */
-	public static final String NO_TRANSLATION = ""; //$NON-NLS-1$
-	/**
-	 * The character code to use when writing a file.
-	 */
-	public static final String OUTPUT_CODESET = "outputCodeset";//$NON-NLS-1$
-
-	/**
-	 * String representation of CR/MAC line delimiter
-	 * @deprecated - no longer used
-	 */
-	public static final String STRING_CR = "\r";//$NON-NLS-1$
-
-	/**
-	 * String representation of CRLF/WINDOWS line delimiter
-	 * @deprecated - no longer used
-	 */
-	public static final String STRING_CRLF = "\r\n";//$NON-NLS-1$
-
-	/**
-	 * String representation of LF/UNIX line delimiter
-	 * @deprecated - no longer used
-	 */
-	public static final String STRING_LF = "\n";//$NON-NLS-1$
-
-	/**
-	 * String Use 3 byte BOM (Byte Order Mark) when saving UTF-8 encoded files
-	 */
-	public static final String USE_3BYTE_BOM_WITH_UTF8 = "Use3ByteBOMWithUTF8"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ContentBasedPreferenceGateway.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ContentBasedPreferenceGateway.java
deleted file mode 100644
index cd28db3..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ContentBasedPreferenceGateway.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.osgi.framework.Bundle;
-import org.osgi.service.prefs.Preferences;
-
-
-public class ContentBasedPreferenceGateway {
-	private static String DEFAULT_LOCATION = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
-	private static String RUNTIME_XML_ID = "org.eclipse.core.runtime.xml"; //$NON-NLS-1$
-	private static String SSE_XML_ID = "org.eclipse.wst.xml.core.xmlsource"; //$NON-NLS-1$
-
-	/**
-	 * @param pluginId
-	 * @return
-	 */
-	private static boolean bundleExists(String pluginId) {
-
-		// this just verifies there's really a plugin with this ID in "stack"
-		Bundle bundle = Platform.getBundle(pluginId);
-		return (!(bundle == null));
-	}
-
-	/**
-	 * @param contentType
-	 * @return
-	 */
-	private static String getContributorPluginId(IContentType contentType) {
-		// TODO: need to have registration info here, but for now, we'll use
-		// simple heuristic to cover the cases we know about.
-		String fullId = null;
-		if (contentType == null) {
-			fullId = DEFAULT_LOCATION;
-		} else {
-			fullId = contentType.getId();
-		}
-		// only one known case, so far, of hard coded re-direction
-		// (not sure this is even needed, but just in case).
-		// We don't want to store/change runtime.xml preferences
-		if (RUNTIME_XML_ID.equals(fullId)) {
-			fullId = SSE_XML_ID;
-		}
-		String pluginId = inferPluginId(fullId);
-		return pluginId;
-	}
-
-	private static Preferences getDefaultPreferences(IContentType contentType) {
-		IEclipsePreferences eclipsePreferences = Platform.getPreferencesService().getRootNode();
-		// TODO: eventaully need extension mechanism to avoid these hard coded
-		// mechanism.
-		// The idea is to load/store based on plugin's preferences, where the
-		// content type was contributed
-		// Eventually, too, we could do more "dynamic lookup" to get parent
-		// types for defaults, etc.
-
-		// Get default plugin preferences
-		String pluginPreferenceLocation = DefaultScope.SCOPE + IPath.SEPARATOR + getContributorPluginId(contentType);
-		Preferences pluginPreferences = eclipsePreferences.node(pluginPreferenceLocation);
-
-		// the below code does not work at this time because content type
-		// preferences are stored in the place as plugin preferences
-
-		//		Preferences contentPreferences = null;
-		//		if (contentType != null) {
-		//			contentPreferences = pluginPreferences.node(contentType.getId());
-		//		}
-		//		else {
-		//			contentPreferences = pluginPreferences.node(DEFAULT_LOCATION );
-		//		}
-		//
-		//		return contentPreferences;
-
-		return pluginPreferences;
-
-	}
-
-	private static Preferences getDefaultPreferences(String contentTypeId) {
-		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeId);
-		return getDefaultPreferences(contentType);
-	}
-
-	public static Preferences getPreferences(IContentType contentType) {
-		IEclipsePreferences eclipsePreferences = Platform.getPreferencesService().getRootNode();
-		// TODO: eventaully need extension mechanism to avoid these hard coded
-		// mechanism.
-		// The idea is to load/store based on plugin's preferences, where the
-		// content type was contributed
-		// Eventually, too, we could do more "dynamic lookup" to get parent
-		// types for defaults, etc.
-
-		// Get instance plugin preferences
-		String pluginPreferenceLocation = Plugin.PLUGIN_PREFERENCE_SCOPE + IPath.SEPARATOR + getContributorPluginId(contentType);
-		Preferences pluginPreferences = eclipsePreferences.node(pluginPreferenceLocation);
-
-		// the below code does not work at this time because content type
-		// preferences are stored in the place as plugin preferences
-
-		//		Preferences contentPreferences = null;
-		//		if (contentType != null) {
-		//			contentPreferences = pluginPreferences.node(contentType.getId());
-		//		}
-		//		else {
-		//			contentPreferences = pluginPreferences.node(DEFAULT_LOCATION );
-		//		}
-		//
-		//		return contentPreferences;
-		return pluginPreferences;
-
-	}
-
-	public static Preferences getPreferences(String contentTypeId) {
-		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeId);
-		return getPreferences(contentType);
-	}
-
-	public static String getPreferencesString(IContentType contentType, String key) {
-		Preferences preferences = getPreferences(contentType);
-		String value = preferences.get(key, getDefaultPreferences(contentType).get(key, null));
-		return value;
-	}
-
-	public static String getPreferencesString(String contentTypeId, String key) {
-		Preferences preferences = getPreferences(contentTypeId);
-		String value = preferences.get(key, getDefaultPreferences(contentTypeId).get(key, null));
-		return value;
-	}
-
-	/**
-	 * @param fullId
-	 * @return
-	 */
-	private static String inferPluginId(String fullId) {
-		// simply trim off last "segment" from full ID.
-		int lastSegmentPos = fullId.lastIndexOf('.');
-		String pluginId = null;
-		if (lastSegmentPos != -1) {
-			pluginId = fullId.substring(0, lastSegmentPos);
-		} else {
-			// weird case? We'll at least put/get them somewhere
-			pluginId = DEFAULT_LOCATION;
-		}
-		if (!bundleExists(pluginId)) {
-			// use default location
-			pluginId = DEFAULT_LOCATION;
-		}
-		return pluginId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ContentTypeEncodingPreferences.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ContentTypeEncodingPreferences.java
deleted file mode 100644
index 4c82676..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ContentTypeEncodingPreferences.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.wst.sse.core.internal.encoding.util.Assert;
-
-
-/**
- * A convenience class to statically get preferenences.
- */
-
-public abstract class ContentTypeEncodingPreferences {
-
-	// actually a null/empty string also means use workbench default so this
-	// constant might not really be necessary
-	public static final String WORKBENCH_DEFAULT = "WORKBENCH_DEFAULT"; //$NON-NLS-1$
-
-
-	private static final String getJavaPlatformDefaultEncoding() {
-		// note: its important to use this system property,
-		// instead
-		// of
-		// ByteToCharConverter.getDefault().getCharacterEncoding()
-		// inorder to handle changes "on the fly". the
-		// ByteToCharConverter
-		// default is apparently set only when VM starts.
-		// There's not really any "cusomter scnererios"
-		// that change the
-		// default encoding "on the fly", but its at least
-		// used during
-		// our automated tests.
-		String enc = System.getProperty("file.encoding"); //$NON-NLS-1$
-		// return blank as null
-		if (enc != null && enc.trim().length() == 0) {
-			enc = null;
-		}
-		return enc;
-	}
-
-
-	public static final String getPreferredNewLineDelimiter(String contentTypeId) {
-		String result = null;
-		String newLineCode = null;
-		newLineCode = ContentBasedPreferenceGateway.getPreferencesString(contentTypeId, CommonEncodingPreferenceNames.END_OF_LINE_CODE);
-		if (newLineCode == null)
-			result = null;
-		else if (newLineCode.equals(CommonEncodingPreferenceNames.CR))
-			result = CommonEncodingPreferenceNames.STRING_CR;
-		else if (newLineCode.equals(CommonEncodingPreferenceNames.LF))
-			result = CommonEncodingPreferenceNames.STRING_LF;
-		else if (newLineCode.equals(CommonEncodingPreferenceNames.CRLF))
-			result = CommonEncodingPreferenceNames.STRING_CRLF;
-		return result;
-	}
-
-	/**
-	 * Returns current output encoding preference for contentTypeIdentifier
-	 * (unique IANA encoding)
-	 */
-	public static final String getUserPreferredCharsetName(String contentTypeId) {
-		String prefEncoding = ContentBasedPreferenceGateway.getPreferencesString(contentTypeId, CommonEncodingPreferenceNames.OUTPUT_CODESET);
-		String encoding = prefEncoding;
-		// get workbench encoding preference if preference
-		// requests it
-		if (prefEncoding == null || prefEncoding.trim().length() == 0 || prefEncoding.equals(ContentTypeEncodingPreferences.WORKBENCH_DEFAULT)) {
-			encoding = ContentTypeEncodingPreferences.getWorkbenchPreferredCharsetName();
-		}
-		return encoding;
-	}
-
-	/**
-	 * Utility method to get specified preference. Subclasses can't override,
-	 * since we expect this to work in a consistent way. Note: this is
-	 * specific to HTML and CSS and is intended to supply a "default spec"
-	 * other than the workbench platform's default, only for those cases where
-	 * there is no encoding specified anywhere else, e.g. in the file, or as a
-	 * file or folder property.
-	 */
-	public static final String getUserSpecifiedDefaultEncodingPreference() {
-		String ContentTypeID_HTML = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
-		return getUserSpecifiedDefaultEncodingPreference(ContentTypeID_HTML);
-	}
-
-	public static final String getUserSpecifiedDefaultEncodingPreference(String contentTypeID) {
-		String enc = null;
-
-		// first try to get base's default encoding for content type
-		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID);
-		if (contentType != null) {
-			enc = contentType.getDefaultCharset();
-		}
-		
-		// next try to get sse's default encoding for content type
-		if (enc == null || enc.trim().length() == 0) {
-			enc = ContentBasedPreferenceGateway.getPreferencesString(contentTypeID, CommonEncodingPreferenceNames.INPUT_CODESET);
-		}
-		
-		// next, just try and use workbench encoding
-		if (enc == null || enc.trim().length() == 0) {
-			enc = getWorkbenchSpecifiedDefaultEncoding();
-		}
-		
-		// return blank as null
-		if (enc != null && enc.trim().length() == 0) {
-			enc = null;
-		}
-		return enc;
-	}
-
-	/**
-	 * Returns Workbench encoding preference. Note: if workbench encoding is
-	 * null, platform encoding will be returned.
-	 */
-	private static final String getWorkbenchPreferredCharsetName() {
-		String charset = ResourcesPlugin.getEncoding();
-		charset = CommonCharsetNames.getIanaPreferredCharsetName(charset);
-		return charset;
-	}
-
-	/**
-	 * Returns Workbench encoding preference. Will return null if none
-	 * specified.
-	 */
-	private static final String getWorkbenchSpecifiedDefaultEncoding() {
-		ResourcesPlugin resourcePlugin = ResourcesPlugin.getPlugin();
-		String enc = resourcePlugin.getPluginPreferences().getString(ResourcesPlugin.PREF_ENCODING);
-		// return blank as null
-		if (enc != null && enc.trim().length() == 0) {
-			enc = null;
-		}
-		return enc;
-	}
-
-	public static final String useDefaultNameRules(IResourceCharsetDetector encodingProvider) {
-		String result = null;
-		String enc = null;
-		enc = encodingProvider.getSpecDefaultEncoding();
-		if (enc != null) {
-			result = enc;
-		} else {
-			enc = getUserSpecifiedDefaultEncodingPreference();
-			if (enc != null && enc.trim().length() > 0) {
-				result = enc;
-			} else {
-				if (enc == null || enc.trim().length() == 0) {
-					enc = getWorkbenchSpecifiedDefaultEncoding();
-					if (enc != null) {
-						result = enc;
-					}
-				}
-				if (enc == null || enc.trim().length() == 0) {
-					enc = getJavaPlatformDefaultEncoding();
-					// enc should never be null (but we'll
-					// check anyway)
-					if (enc != null) {
-						result = enc;
-					}
-				}
-			}
-		}
-		Assert.isNotNull(enc, "post condition invalid"); //$NON-NLS-1$
-		result = CodedIO.checkMappingOverrides(enc);
-		return result;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/EncodingMemento.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/EncodingMemento.java
deleted file mode 100644
index c195a84..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/EncodingMemento.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import org.eclipse.core.runtime.content.IContentDescription;
-
-
-/**
- * This class is to simply hold information and data about the type of
- * encoding found for a resource. It not only includes names, etc., but also
- * gives hints about the algorithm, or rule, that the encodng was determined.
- * Having all this info in a central object, associated with the Document
- * (technically, IStructuredDocument), allows for better user error messages,
- * and better handling of knowing how to dump a file, given we know how it was
- * loaded.
- * 
- * Note: the data in this class is only valid if its has actually gone through
- * the loading or dumping sequence. It is not accurate, for example, if a
- * structuredDocument is simply created and then setText called. In this type
- * of case, accuracy for loading and dumping is not required, since its all
- * re-discovered. One limitation is that structuredDocument's created "from
- * scratch" this way, don't have any encoding information to count on, and
- * would have to arrange the processing to be done. (And it is done,
- * automatically if going through loader or dumper, but perhaps not in future
- * new uses. TODO: this can be inproved in future versions.)
- * 
- * isInitialized is set when the loader or dumper processes have been used,
- * but even this can't be counted on 100% if the document has been modified
- * since.
- * 
- */
-public class EncodingMemento implements Cloneable {
-
-	public final static String CLONED = "cloned"; //$NON-NLS-1$
-	public final static String DEFAULTS_ASSUMED_FOR_EMPTY_INPUT = "DefaultsAssumedForEmptyInput"; //$NON-NLS-1$
-	public final static String DEFAULTS_USED_DUE_TO_SMALL_STREAM = "defaultsUsedDueToSmallStream"; //$NON-NLS-1$
-
-
-	/*
-	 * Strings to be used for tracing. TODO: need to clean this up, we no
-	 * longer use all of them
-	 */
-	public final static String DETECTED_STANDARD_UNICODE_BYTES = "detectedStandardUnicodeBytes"; //$NON-NLS-1$
-	public final static String FOUND_ENCODING_IN_CONTENT = "foundEncodingInContent"; //$NON-NLS-1$
-	public final static String FOUND_ENCODING_IN_STREAM = "foundEncodingInStream"; //$NON-NLS-1$
-	public final static String FOUND_ENCODING_IN_STRUCTURED_DOCUMENT = "foundEncodingInStructuredDocument"; //$NON-NLS-1$
-	public final static String GUESSED_ENCODING_FROM_STREAM = "GuessEncodingFromStream"; //$NON-NLS-1$
-	public final static String JAVA_NAME_FOUND_AS_IANA_NAME = "noMappingFoundButJavaNameFoundToBeIANAName"; //$NON-NLS-1$
-	public final static String JAVA_NAME_FOUND_IN_ALIAS_NAME = "noMappingFoundButJavaNameFoundInAliasTable"; //$NON-NLS-1$
-	public final static String NO_IANA_NAME_FOUND = "noMappingFoundFromJavaNameToIANAName"; //$NON-NLS-1$
-	public final static String USED_CONTENT_TYPE_DEFAULT = "UsedContentTypeDefault"; //$NON-NLS-1$
-	public final static String USED_JAVA_DEFAULT = "UsedJavaDefault"; //$NON-NLS-1$
-	public final static String USED_MEMENTO_FROM_LOAD = "usedMementoFromLoad"; //$NON-NLS-1$
-	public final static String USED_PROPERTY_SETTINGS = "USED_PROPERTY_SETTINGS"; //$NON-NLS-1$
-	public final static String USED_USER_SPECIFIED_PREFERENCE = "UsedUserSpecifiedPreference"; //$NON-NLS-1$
-	public final static String USED_WORKSPACE_DEFAULT = "UsedWorkspaceDefault"; //$NON-NLS-1$
-	public final static String USER_IS_USING_JAVA_ENCODING = "UserIsUsingJavaEncoding"; //$NON-NLS-1$
-	private String fAppropriateDefault;
-	private String fDetectedCharsetName;
-	private String fInvalidEncoding;
-
-
-	private String fJavaCharsetName;
-	private boolean fUnicodeStream;
-	private boolean fUTF83ByteBOMUsed;
-	
-	private byte[] fBOM;
-
-	public EncodingMemento() {
-		super();
-	}
-
-	/**
-	 * Returns a clone of this object.
-	 */
-	public Object clone() {
-		EncodingMemento object = null;
-		try {
-			object = (EncodingMemento) super.clone();
-		}
-		catch (CloneNotSupportedException e) {
-			// impossible, since we're implementing here
-		}
-
-		return object;
-
-	}
-
-	/**
-	 * Returns the appropriateDefault. This is only set if an invalid encoding
-	 * was found, and contains an charset appropriate to use as a default
-	 * value, if, for example, the user decides to load the document anyway,
-	 * even though the charset was found to be invalid.
-	 * 
-	 * @return String
-	 */
-	public String getAppropriateDefault() {
-		if (fAppropriateDefault == null) {
-			fAppropriateDefault = NonContentBasedEncodingRules.useDefaultNameRules(null);
-		}
-		return fAppropriateDefault;
-	}
-
-	/**
-	 * Returns the charset name, if it is different from the charset name
-	 * found in getJavaCharsetName. This can happen, for example, if there are
-	 * differences in case. This method might return SHIFT_JIS, and the the
-	 * getJavaCharsetName might return Shift_JIS -- if SHIFT_JIS was detected
-	 * in file/document. If the original file contained the correct case, then
-	 * this method would return null. The getJavaCharsetName is typically the
-	 * one that should always be used, and this one only used for certain
-	 * error conditions, or or if when creating a "duplicate" resource, it was
-	 * desired to use exactly the charset name as in the original document. As
-	 * an example of this later case, the original document might contain
-	 * ISO-8859-9, but the detected charset name might contain ISO-8859-9-I.
-	 * 
-	 * @return String
-	 */
-	public String getDetectedCharsetName() {
-		return fDetectedCharsetName;
-	}
-
-	/**
-	 * Returns a charset name that was detected, but not found to be a charset
-	 * suppoorted by the VM.
-	 * 
-	 * @return String
-	 */
-	public String getInvalidEncoding() {
-		return fInvalidEncoding;
-	}
-
-	/**
-	 * Returns the java cononical charset name.
-	 * 
-	 * @return String
-	 */
-	public String getJavaCharsetName() {
-		return fJavaCharsetName;
-	}
-
-	/**
-	 * Note: we may be able to remove this method, if it turns out this work
-	 * is done by "text" type.
-	 * 
-	 * @deprecated -
-	 */
-	public byte[] getUnicodeBOM() {
-		byte[] bom = null;
-		if (isUTF83ByteBOMUsed())
-			bom = IContentDescription.BOM_UTF_8;
-		else if (isUnicodeStream())
-			bom = fBOM;
-		return bom;
-	}
-
-	/**
-	 * Note: in our implementation, the stream is a unicode stream if the
-	 * charset is UTF-16, UTF-16LE, or UTF-16BE. A stream with 3 byte BOM is
-	 * not considered unicode stream here.
-	 * 
-	 * @return returns true if is a unicode (UTF-16) stream
-	 */
-	public boolean isUnicodeStream() {
-		return fUnicodeStream;
-	}
-
-	/**
-	 * Note: in our implementation, the stream is a unicode stream if the
-	 * charset is UTF-16, UTF-16LE, or UTF-16BE. A stream with 3 byte BOM is
-	 * not considered unicode stream here.
-	 * 
-	 * Set during load, can be used by dumper to write 3 byte BOM, which Java
-	 * does not normally do. This helps maintain compatibility with other
-	 * programs (those that wrote the 3 byte BOM there to begin with.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isUTF83ByteBOMUsed() {
-		return fUTF83ByteBOMUsed;
-	}
-
-	public boolean isValid() {
-		return getInvalidEncoding() == null;
-	}
-
-	/**
-	 * Sets the appropriateDefault.
-	 * 
-	 * @param appropriateDefault
-	 *            The appropriateDefault to set
-	 */
-	public void setAppropriateDefault(String appropriateDefault) {
-		fAppropriateDefault = appropriateDefault;
-	}
-
-
-	public void setDetectedCharsetName(String detectedCharsetName) {
-		fDetectedCharsetName = detectedCharsetName;
-	}
-
-	public void setInvalidEncoding(String invalidEncoding) {
-		fInvalidEncoding = invalidEncoding;
-	}
-
-	/**
-	 * Sets the javaEncodingName.
-	 * 
-	 * @param javaEncodingName
-	 *            The javaEncodingName to set
-	 */
-	public void setJavaCharsetName(String javaCharsetName) {
-		fJavaCharsetName = javaCharsetName;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setUnicodeStream(boolean unicodeStream) {
-		fUnicodeStream = unicodeStream;
-
-	}
-
-	/**
-	 * Sets the uTF83ByteBOMfound.
-	 * 
-	 * @param uTF83ByteBOMfound
-	 *            The uTF83ByteBOMfound to set
-	 */
-	public void setUTF83ByteBOMUsed(boolean uTF83ByteBOMUsed) {
-		fUTF83ByteBOMUsed = uTF83ByteBOMUsed;
-	}
-
-	public void setUnicodeBOM(byte[] bom) {
-		fBOM = bom;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/EncodingRule.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/EncodingRule.java
deleted file mode 100644
index 2d2988f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/EncodingRule.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-
-/**
- * Class to provided "enumerated types" for encoding rule parameter. This is
- * to be used by client to have some control over how encoding is determined.
- */
-public class EncodingRule {
-	/**
-	 * CONTENT_BASED means the class which uses the parameter (such as
-	 * contentType Loaders) should use what ever rules it normally would.
-	 * (Note, some content type loaders may not always literally use the file
-	 * content to determine encoding, but the point is they should use what
-	 * ever rules they normally would.)
-	 */
-	public static final EncodingRule CONTENT_BASED = new EncodingRule("CONTENT_BASED"); //$NON-NLS-1$
-	/**
-	 * FORCE_DEFAULT means the class which uses the parameter (such as
-	 * contentType Loaders) should use what ever it defines as the default
-	 * encoding.
-	 */
-	public static final EncodingRule FORCE_DEFAULT = new EncodingRule("FORCE_DEFAULT"); //$NON-NLS-1$
-
-	/**
-	 * IGNORE_CONVERSION_ERROR means that the save operation should save even
-	 * if it encounters conversion errors. This will result in some data loss,
-	 * so should only be used after the user confirms that is indeed what they
-	 * want to do.
-	 */
-	public static final EncodingRule IGNORE_CONVERSION_ERROR = new EncodingRule("IGNORE_CONVERSION_ERROR"); //$NON-NLS-1$
-
-
-	private final String encodingRule;
-
-	/**
-	 * Constructor for EncodingRule is private, so no one can instantiate
-	 * except this class itself.
-	 */
-	private EncodingRule(String ruleName) {
-		super();
-		encodingRule = ruleName;
-	}
-
-	public String toString() {
-		return encodingRule;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ICodedResourcePlugin.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ICodedResourcePlugin.java
deleted file mode 100644
index 4b4900f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/ICodedResourcePlugin.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-
-public interface ICodedResourcePlugin {
-	String ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IContentDescriptionExtended.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IContentDescriptionExtended.java
deleted file mode 100644
index db2e0a4..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IContentDescriptionExtended.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import org.eclipse.core.runtime.QualifiedName;
-
-
-public interface IContentDescriptionExtended {
-	/**
-	 * The APPROPRIATE_DEFAULT field is used only when the
-	 * IContentType.getDefaultCharset returns null. Its typically set from
-	 * user preferences. Known uses cases are HTML and CSS, where there is no
-	 * "spec default" for those content types.
-	 */
-	public static final QualifiedName APPROPRIATE_DEFAULT = new QualifiedName(ICodedResourcePlugin.ID, "appropriateDefault"); //$NON-NLS-1$
-	/**
-	 * The DETECTED_CHARSET property should be set when the "detected" charset
-	 * is different from the java charset, even though functionally
-	 * equivelent. This can occur, for example, when the cases are different,
-	 * or when an alias name is used instead of the conanical name.
-	 */
-	public final static QualifiedName DETECTED_CHARSET = new QualifiedName(ICodedResourcePlugin.ID, "detectedCharset"); //$NON-NLS-1$
-	/**
-	 * The UNSUPPORTED_CHARSET property holds the charset value, if its been
-	 * found to be an unsuppoted charset. This is helpful in error messages,
-	 * or in cases when even though the charset is invalid, the java charset
-	 * is assumed to be the default.
-	 */
-	public final static QualifiedName UNSUPPORTED_CHARSET = new QualifiedName(ICodedResourcePlugin.ID, "unsupportedCharset"); //$NON-NLS-1$
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IResourceCharsetDetector.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IResourceCharsetDetector.java
deleted file mode 100644
index 20dcbbf..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IResourceCharsetDetector.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-
-public interface IResourceCharsetDetector extends IStreamCharsetDetector {
-	void set(IStorage iStorage) throws CoreException;
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IStreamCharsetDetector.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IStreamCharsetDetector.java
deleted file mode 100644
index a2508f1..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/IStreamCharsetDetector.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-public interface IStreamCharsetDetector {
-	String getEncoding() throws IOException;
-
-	String getSpecDefaultEncoding();
-
-	void set(InputStream inputStream);
-
-	void set(Reader reader);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/NonContentBasedEncodingRules.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/NonContentBasedEncodingRules.java
deleted file mode 100644
index dd7158d..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/NonContentBasedEncodingRules.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-
-public class NonContentBasedEncodingRules {
-
-	private static final String getJavaPlatformDefaultEncoding() {
-		String enc = System.getProperty("file.encoding"); //$NON-NLS-1$
-		// return blank as null
-		if (enc != null && enc.trim().length() == 0) {
-			enc = null;
-		}
-		return enc;
-	}
-
-
-	public static String getUserSpecifiedDefaultForContentType(IFile iFile) {
-		String enc = null;
-		
-		IContentType contentType = null;
-		try {
-			contentType = iFile.getContentDescription().getContentType();
-			
-			// first try to get base's default encoding for content type 
-			if (contentType != null) {
-				enc = contentType.getDefaultCharset();
-			}
-
-			// next try to get sse's default encoding for content type
-			if (enc == null || enc.trim().length() == 0) {
-				enc = ContentBasedPreferenceGateway.getPreferencesString(contentType, CommonEncodingPreferenceNames.INPUT_CODESET);
-			}
-			
-			// return blank as null
-			if (enc != null && enc.trim().length() == 0) {
-				enc = null;
-			}
-		} catch (CoreException e) {
-			// if core exception occurs, assume no preference!
-			enc = null;
-		}
-		return enc;
-	}
-
-	public static String getUserSpecifiedDefaultForContentType(String contentTypeId) {
-		String enc = null;
-		
-		// first try to get base's default encoding for content type
-		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeId);
-		if (contentType != null) {
-			enc = contentType.getDefaultCharset();
-		}
-		
-		// next try to get sse's default encoding for content type
-		if (enc == null || enc.trim().length() == 0) {
-			enc = ContentBasedPreferenceGateway.getPreferencesString(contentTypeId, CommonEncodingPreferenceNames.INPUT_CODESET);
-		}
-		
-		// return blank as null
-		if (enc != null && enc.trim().length() == 0) {
-			enc = null;
-		}
-		return enc;
-	}
-
-	private static final String getWorkbenchSpecifiedDefaultEncoding() {
-		ResourcesPlugin resourcePlugin = ResourcesPlugin.getPlugin();
-		String enc = resourcePlugin.getPluginPreferences().getString(ResourcesPlugin.PREF_ENCODING);
-		// return blank as null
-		if (enc != null && enc.trim().length() == 0) {
-			enc = null;
-		}
-		return enc;
-	}
-
-	/**
-	 * @param specDefault
-	 *            This is the default charset name that would ordinarily be
-	 *            used for a particular type of content. Null may be
-	 *            specififed for those types with no spec default. If the spec
-	 *            default is known (and passed in), then it will be returned
-	 *            after being checked to see if there's be any user specified
-	 *            "override" for that charset (which would be rare). In other
-	 *            words, if the spec is known, there's little reason to use
-	 *            this method.
-	 * @return the charset that should be used according to the rules
-	 *         established by this class.
-	 */
-	public static final String useDefaultNameRules(String specDefault) {
-		String enc = null;
-		String result = null;
-		enc = specDefault;
-		if (enc != null) {
-			result = enc;
-		} else {
-			enc = ContentTypeEncodingPreferences.getUserSpecifiedDefaultEncodingPreference();
-			if (enc != null && enc.trim().length() > 0) {
-				result = enc.trim();
-			} else {
-				if (enc == null || enc.trim().length() == 0) {
-					enc = getWorkbenchSpecifiedDefaultEncoding();
-					if (enc != null) {
-						result = enc.trim();
-					}
-				}
-				if (enc == null || enc.trim().length() == 0) {
-					enc = getJavaPlatformDefaultEncoding();
-					// enc should never be null (but we'll
-					// check anyway)
-					if (enc != null) {
-						result = enc;
-					}
-				}
-			}
-		}
-		result = CodedIO.checkMappingOverrides(result);
-		return result;
-	}
-
-	private NonContentBasedEncodingRules() {
-		super();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/Assert.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/Assert.java
deleted file mode 100644
index 4e1b370..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/Assert.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-/**
- * <code>Assert</code> is useful for for embedding runtime sanity checks in
- * code. The predicate methods all test a condition and throw some type of
- * unchecked exception if the condition does not hold.
- * <p>
- * Assertion failure exceptions, like most runtime exceptions, are thrown when
- * something is misbehaving. Assertion failures are invariably unspecified
- * behavior; consequently, clients should never rely on these being thrown
- * (and certainly should not being catching them specifically).
- * </p>
- */
-public final class Assert {
-
-	/**
-	 * <code>AssertionFailedException</code> is a runtime exception thrown
-	 * by some of the methods in <code>Assert</code>.
-	 * <p>
-	 * This class is not declared public to prevent some misuses; programs
-	 * that catch or otherwise depend on assertion failures are susceptible to
-	 * unexpected breakage when assertions in the code are added or removed.
-	 * </p>
-	 */
-	static class AssertionFailedException extends RuntimeException {
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 1L;
-
-		/**
-		 * Constructs a new exception.
-		 */
-		public AssertionFailedException() {
-			super();
-		}
-
-		/**
-		 * Constructs a new exception with the given message.
-		 */
-		public AssertionFailedException(String detail) {
-			super(detail);
-		}
-	}
-
-	/**
-	 * Asserts that an argument is legal. If the given boolean is not
-	 * <code>true</code>, an <code>IllegalArgumentException</code> is
-	 * thrown. The given message is included in that exception, to aid
-	 * debugging.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @param message
-	 *            the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return if the
-	 *         check fails)
-	 * @exception IllegalArgumentException
-	 *                if the legality test failed
-	 */
-	public static boolean isLegal(boolean expression, String message) {
-		if (!expression)
-			throw new AssertionFailedException(message);
-		return expression;
-	}
-
-	/**
-	 * Asserts that the given object is not <code>null</code>. If this is
-	 * not the case, some kind of unchecked exception is thrown. The given
-	 * message is included in that exception, to aid debugging.
-	 * 
-	 * @param object
-	 *            the value to test
-	 * @param message
-	 *            the message to include in the exception
-	 * @exception IllegalArgumentException
-	 *                if the object is <code>null</code>
-	 */
-	public static void isNotNull(Object object, String message) {
-		if (object == null) {
-			throw new AssertionFailedException();
-		}
-	}
-
-	/**
-	 * Asserts that the given boolean is <code>true</code>. If this is not
-	 * the case, some kind of unchecked exception is thrown. The given message
-	 * is included in that exception, to aid debugging.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @param message
-	 *            the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return if the
-	 *         check fails)
-	 */
-	public static boolean isTrue(boolean expression, String message) {
-		if (!expression) {
-			throw new AssertionFailedException();
-		}
-		return expression;
-	}
-
-	/* This class is not intended to be instantiated. */
-	private Assert() {
-		super();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedReader.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedReader.java
deleted file mode 100644
index f026bda..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedReader.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * This is a pretty limited implementation, sort of specific 
- * to the way its used by tokenizers (JFlex). To really 
- * be general purpose, would need more work. 
- *
- */
-
-
-public class BufferedLimitedReader extends BufferedReader {
-	private int limitedCount;
-	private int nRead;
-
-	public BufferedLimitedReader(Reader reader, int size) {
-		super(reader, size);
-		if (reader.markSupported()) {
-			try {
-				mark(size);
-			}
-			catch (IOException e) {
-				// impossible
-				e.printStackTrace();
-			}
-		}
-		limitedCount = size;
-	}
-
-	public int read() throws IOException {
-		int result = 0;
-		nRead++;
-		if (nRead > limitedCount) {
-			result = -1;
-		}
-		else {
-			result = super.read();
-		}
-		return result;
-
-	}
-
-	public int read(char cbuf[], int off, int len) throws IOException {
-		int result = 0;
-		if (nRead + len > limitedCount) {
-			result = -1;
-		}
-		else {
-			result = super.read(cbuf, off, len);
-			nRead = nRead + result;
-		}
-		return result;
-	}
-	
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedStream.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedStream.java
deleted file mode 100644
index 8928655..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedStream.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class BufferedLimitedStream extends BufferedInputStream {
-
-	private int limitedCount;
-
-	public BufferedLimitedStream(InputStream inStream, int size) {
-		super(inStream, size);
-		mark(size);
-		try {
-			limitedCount = Math.min(size, inStream.available());
-		} catch (IOException e) {
-			// unlikely
-			limitedCount = 0;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#available()
-	 */
-	public synchronized int available() throws IOException {
-
-		return limitedCount - pos;
-	}
-
-	/**
-	 * copied down from super class
-	 */
-	private void ensureOpen() throws IOException {
-		if (in == null)
-			throw new IOException("Stream closed"); //$NON-NLS-1$
-	}
-
-	/**
-	 * copied down from super class then, changed to simiulate EOF if goes
-	 * beyond buffered amount
-	 */
-	public synchronized int read() throws IOException {
-		ensureOpen();
-		// for this special stream, indicate "end of file" when buffer is
-		// full
-		if (pos >= limitedCount) {
-			return -1;
-		}
-		return super.read();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#read(byte[], int, int)
-	 */
-	public synchronized int read(byte[] b, int off, int len) throws IOException {
-		// for this special stream, indicate "end of file" when buffer is
-		// full
-		if (pos >= limitedCount) {
-			return -1;
-		}
-		return super.read(b, off, len);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/ByteReader.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/ByteReader.java
deleted file mode 100644
index 35046e2..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/ByteReader.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-
-/**
- * This is an "adapter" class, simply to get in input stream to act like a
- * reader. We could not use InputStreamReader directly because its internal
- * buffers are not controllable, and it sometimes pulls too much out of input
- * stream (even when it wasn't needed for our purposes).
- * 
- * The use of this class is highly specialized and by not means meant to be
- * general purpose. Its use is restricted to those cases where the input
- * stream can be regarded as ascii just long enough to determine what the real
- * encoding should be.
- */
-
-public class ByteReader extends Reader {
-
-	
-	public static final int DEFAULT_BUFFER_SIZE = CodedIO.MAX_BUF_SIZE;
-
-	protected byte[] fBuffer;
-
-	protected InputStream fInputStream;
-
-	protected ByteReader() {
-		super();
-	}
-
-	public ByteReader(InputStream inputStream) {
-		this(inputStream, DEFAULT_BUFFER_SIZE);
-		if (!inputStream.markSupported()) {
-			throw new IllegalArgumentException("ByteReader is required to have a resettable stream"); //$NON-NLS-1$
-		}
-	}
-
-	public ByteReader(InputStream inputStream, int size) {
-		this.fInputStream = inputStream;
-		if (!inputStream.markSupported()) {
-			throw new IllegalArgumentException("ByteReader is required to have a resettable stream"); //$NON-NLS-1$
-		}
-		this.fBuffer = new byte[size];
-
-	}
-
-	public void close() throws IOException {
-		this.fInputStream.close();
-	}
-
-	public void mark(int readAheadLimit) {
-		this.fInputStream.mark(readAheadLimit);
-	}
-
-	public boolean markSupported() {
-		return true;
-	}
-
-	public int read() throws IOException {
-		int b0 = this.fInputStream.read();
-		return (b0 & 0x00FF);
-	}
-
-	public int read(char ch[], int offset, int length) throws IOException {
-		if (length > this.fBuffer.length) {
-			length = this.fBuffer.length;
-		}
-
-		int count = this.fInputStream.read(this.fBuffer, 0, length);
-
-		for (int i = 0; i < count; i++) {
-			int b0 = this.fBuffer[i];
-			// the 0x00FF is to "lose" the negative bits filled in the byte to
-			// int conversion
-			// (and which would be there if cast directly from byte to char).
-			char c0 = (char) (b0 & 0x00FF);
-			ch[offset + i] = c0;
-		}
-		return count;
-	}
-
-	public boolean ready() throws IOException {
-		return this.fInputStream.available() > 0;
-	}
-
-	public void reset() throws IOException {
-		this.fInputStream.reset();
-	}
-
-	public long skip(long n) throws IOException {
-		return this.fInputStream.skip(n);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/CodedResourcePlugin.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/CodedResourcePlugin.java
deleted file mode 100644
index 0c928cd..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/CodedResourcePlugin.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
-import org.eclipse.wst.sse.core.internal.encoding.ICodedResourcePlugin;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class CodedResourcePlugin extends Plugin implements ICodedResourcePlugin {
-	//The shared instance.
-	private static CodedResourcePlugin plugin;
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static CodedResourcePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public CodedResourcePlugin() {
-		super();
-		plugin = this;
-	}
-
-	protected void initializeDefaultPluginPreferences() {
-		Preferences prefs = getPluginPreferences();
-		prefs.setDefault(CommonEncodingPreferenceNames.USE_3BYTE_BOM_WITH_UTF8, false);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/Logger.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/Logger.java
deleted file mode 100644
index 9e911b9..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/Logger.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import com.ibm.icu.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.Bundle;
-
-
-/**
- * Small convenience class to log messages to plugin's log file and also, if
- * desired, the console. This class should only be used by classes in this
- * plugin. Other plugins should make their own copy, with appropriate ID.
- */
-public class Logger {
-	private static final String PLUGIN_ID = "org.eclipse.wst.sse.core.internal.encoding"; //$NON-NLS-1$
-	
-	public static final int ERROR = IStatus.ERROR; // 4
-	public static final int ERROR_DEBUG = 200 + ERROR;
-	public static final int INFO = IStatus.INFO; // 1
-	public static final int INFO_DEBUG = 200 + INFO;
-
-	public static final int OK = IStatus.OK; // 0
-
-	public static final int OK_DEBUG = 200 + OK;
-
-	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
-	public static final int WARNING = IStatus.WARNING; // 2
-	public static final int WARNING_DEBUG = 200 + WARNING;
-
-	/**
-	 * Adds message to log.
-	 * 
-	 * @param level
-	 *            severity level of the message (OK, INFO, WARNING, ERROR,
-	 *            OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
-	 * @param message
-	 *            text to add to the log
-	 * @param exception
-	 *            exception thrown
-	 */
-	protected static void _log(int level, String message, Throwable exception) {
-		if (level == OK_DEBUG || level == INFO_DEBUG || level == WARNING_DEBUG || level == ERROR_DEBUG) {
-			if (!isDebugging())
-				return;
-		}
-
-		int severity = IStatus.OK;
-		switch (level) {
-			case INFO_DEBUG :
-			case INFO :
-				severity = IStatus.INFO;
-				break;
-			case WARNING_DEBUG :
-			case WARNING :
-				severity = IStatus.WARNING;
-				break;
-			case ERROR_DEBUG :
-			case ERROR :
-				severity = IStatus.ERROR;
-		}
-		message = (message != null) ? message : "null"; //$NON-NLS-1$
-		Status statusObj = new Status(severity, PLUGIN_ID, severity, message, exception);
-		Bundle bundle = Platform.getBundle(PLUGIN_ID);
-		if (bundle != null) 
-			Platform.getLog(bundle).log(statusObj);
-	}
-
-	/**
-	 * Prints message to log if category matches /debug/tracefilter option.
-	 * 
-	 * @param message
-	 *            text to print
-	 * @param category
-	 *            category of the message, to be compared with
-	 *            /debug/tracefilter
-	 */
-	protected static void _trace(String category, String message, Throwable exception) {
-		if (isTracing(category)) {
-			message = (message != null) ? message : "null"; //$NON-NLS-1$
-			Status statusObj = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, exception);
-			Bundle bundle = Platform.getBundle(PLUGIN_ID);
-			if (bundle != null) 
-				Platform.getLog(bundle).log(statusObj);
-		}
-	}
-
-	/**
-	 * @return true if the platform is debugging
-	 */
-	public static boolean isDebugging() {
-		return Platform.inDebugMode();
-	}
-
-	/**
-	 * Determines if currently tracing a category
-	 * 
-	 * @param category
-	 * @return true if tracing category, false otherwise
-	 */
-	public static boolean isTracing(String category) {
-		if (!isDebugging())
-			return false;
-
-		String traceFilter = Platform.getDebugOption(PLUGIN_ID + TRACEFILTER_LOCATION);
-		if (traceFilter != null) {
-			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
-			while (tokenizer.hasMoreTokens()) {
-				String cat = tokenizer.nextToken().trim();
-				if (category.equals(cat)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	public static void log(int level, String message) {
-		_log(level, message, null);
-	}
-
-	public static void log(int level, String message, Throwable exception) {
-		_log(level, message, exception);
-	}
-
-	public static void logException(String message, Throwable exception) {
-		_log(ERROR, message, exception);
-	}
-
-	public static void logException(Throwable exception) {
-		_log(ERROR, exception.getMessage(), exception);
-	}
-
-	public static void trace(String category, String message) {
-		_trace(category, message, null);
-	}
-
-	public static void traceException(String category, String message, Throwable exception) {
-		_trace(category, message, exception);
-	}
-
-	public static void traceException(String category, Throwable exception) {
-		_trace(category, exception.getMessage(), exception);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/NullInputStream.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/NullInputStream.java
deleted file mode 100644
index 6b44f2f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/NullInputStream.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-
-public class NullInputStream extends InputStream {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#mark(int)
-	 */
-	public synchronized void mark(int readlimit) {
-		// nothing to do
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#markSupported()
-	 */
-	public boolean markSupported() {
-		// we can mark nothing.
-		// and, we are using this Null class specifically for
-		// a "fake" resettable stream.
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#read()
-	 */
-	public int read() throws IOException {
-
-		return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#reset()
-	 */
-	public synchronized void reset() throws IOException {
-		// nothing to do
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#skip(long)
-	 */
-	public long skip(long n) throws IOException {
-		return 0;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/ResourceBundleHelper.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/ResourceBundleHelper.java
deleted file mode 100644
index 14aaa1f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/ResourceBundleHelper.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.Platform;
-
-//TODO: rework this with new platform/runtime APIs (if still needed).
-
-public class ResourceBundleHelper {
-
-	public static ResourceBundle getResourceBundle(String resourceURI) throws MalformedURLException, IOException {
-		return getResourceBundle(resourceURI, Locale.getDefault());
-	}
-
-	public static ResourceBundle getResourceBundle(String resourceURI, Locale targetLocale) throws MalformedURLException, IOException {
-		// try to load bundle from the location specified in the resourceURI
-		// we make the assumption that the resourceURI points to the local
-		// file system
-
-		int index = resourceURI.lastIndexOf("/"); //$NON-NLS-1$
-		if (index == -1) {
-			throw new IllegalArgumentException("Invalid resourceURI"); //$NON-NLS-1$
-		}
-
-		// Below we set 'resourceDirectory' so that it ends with a '/'.
-		// Here's an excerpt from the ClassLoader Javadoc ...
-		// Any URL that ends with a '/' is assumed to refer to a directory.
-		// Otherwise, the URL is assumed
-		// to refer to a JAR file which will be opened as needed.
-		//
-		String resourceDirectory = resourceURI.substring(0, index + 1);
-		String resourceBundleName = resourceURI.substring(index + 1);
-
-		// create a class loader with a class path that points to the resource
-		// bundle's location
-		//         
-		URL[] classpath = new URL[1];
-		classpath[0] = Platform.resolve(new URL(resourceDirectory));
-		ClassLoader resourceLoader = new URLClassLoader(classpath, null);
-
-		return ResourceBundle.getBundle(resourceBundleName, targetLocale, resourceLoader);
-	}
-}
-
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/UnicodeBOMEncodingDetector.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/UnicodeBOMEncodingDetector.java
deleted file mode 100644
index e3c9d99..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/UnicodeBOMEncodingDetector.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.encoding.util;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.nio.charset.Charset;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-
-
-/**
- * This is a "common function" class to decide if an input stream, is a
- * unicode stream.
- */
-public class UnicodeBOMEncodingDetector implements IResourceCharsetDetector {
-
-	//private static final String UTF_16_CHARSET_NAME = "UTF-16";
-	// //$NON-NLS-1$
-
-	public static class NotEnoughInputForBOMException extends IOException {
-
-		/**
-		 * Default <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public NotEnoughInputForBOMException() {
-			super();
-		}
-
-		public NotEnoughInputForBOMException(String s) {
-			super(s);
-		}
-
-	}
-
-	private final static byte BB = (byte) 0xBB;
-	private final static byte BF = (byte) 0xBF;
-	private final static byte EF = (byte) 0xEF;
-	private final static byte FE = (byte) -2;
-
-	private final static byte FF = (byte) -1;
-	private static final String UTF_16BE_CHARSET_NAME = "UTF-16BE"; //$NON-NLS-1$
-	private static final String UTF_16LE_CHARSET_NAME = "UTF-16LE"; //$NON-NLS-1$
-
-	private static final String UTF_8_CHARSET_NAME = "UTF-8"; //$NON-NLS-1$
-
-	private InputStream fInputStream = null;
-	private boolean fNoBOMPossible;
-
-	private EncodingMemento checkForBOM(InputStream inputStream) {
-		EncodingMemento result = null;
-
-		try {
-			byte b1 = getNextByte(inputStream);
-			byte b2 = getNextByte(inputStream);
-			if (b1 == FE && b2 == FF) {
-				result = createEncodingMemento(UTF_16BE_CHARSET_NAME);
-				result.setUnicodeStream(true);
-			} else {
-				if (b1 == FF && b2 == FE) {
-					result = createEncodingMemento(UTF_16LE_CHARSET_NAME);
-					result.setUnicodeStream(true);
-				} else {
-					byte b3 = getNextByte((inputStream));
-					if (b1 == EF && b2 == BB && b3 == BF) {
-						result = createEncodingMemento(UTF_8_CHARSET_NAME);
-						result.setUTF83ByteBOMUsed(true);
-					}
-				}
-			}
-		} catch (NotEnoughInputForBOMException e) {
-			// This is sort of unexpected for normal cases, but can occur for
-			// empty
-			// streams. And, this can occur "normally" for non-BOM streams
-			// that
-			// have only two
-			// bytes, and for which those two bytes match the first two bytes
-			// of UTF-8
-			// BOM In any case, we'll simply return null;
-			result = null;
-		} catch (IOException e) {
-			// other errors should be impossible
-			throw new Error(e);
-		}
-
-		return result;
-	}
-
-	private EncodingMemento createEncodingMemento(String javaEncodingName) {
-		EncodingMemento encodingMemento = new EncodingMemento();
-		encodingMemento.setJavaCharsetName(javaEncodingName);
-		String ianaName = Charset.forName(javaEncodingName).name();
-		encodingMemento.setDetectedCharsetName(ianaName);
-		if (javaEncodingName.equals(UTF_8_CHARSET_NAME)) {
-			encodingMemento.setUTF83ByteBOMUsed(true);
-		}
-		return encodingMemento;
-	}
-
-	public String getEncoding() throws IOException {
-
-		return getEncodingMemento().getDetectedCharsetName();
-	}
-
-	/**
-	 * Returns IANA encoding name if BOM detected in stream. If a BOM is
-	 * detected, the stream is left positioned after readying the BOM. If a
-	 * BOM is not detected, the steam is reset.
-	 * 
-	 * 0xFEFF UTF-16, big-endian 0xFFFE UTF-16, little-endian 0xEFBBBF UTF-8
-	 * (BOM is optional)
-	 * 
-	 * @param inputStream -
-	 *            must be a resetable (mark supported) stream so it can be
-	 *            reset, if not BOM encoded stream
-	 * @return String - IANA encodingname (may not work well on 1.3, but 1.4
-	 *         seems to have good support for IANA names)
-	 */
-	public EncodingMemento getEncodingMemento() {
-
-		EncodingMemento result = null;
-		if (!fNoBOMPossible) {
-
-			if (fInputStream == null)
-				throw new IllegalStateException("input must be set before use"); //$NON-NLS-1$
-
-			if (!fInputStream.markSupported()) {
-				throw new IllegalArgumentException("inputStream must be resetable"); //$NON-NLS-1$
-			}
-
-			result = checkForBOM(fInputStream);
-		}
-
-		return result;
-
-	}
-
-	private byte getNextByte(InputStream inputStream) throws IOException {
-
-		int byteCharAsInt = -1;
-		// be sure we won't block
-		if (inputStream.available() > 0) {
-			byteCharAsInt = inputStream.read();
-			byteCharAsInt = byteCharAsInt & 0XFF;
-		}
-		// to avoid confustion over meaning of returned byte,
-		// throw exception if EOF reached.
-		if (byteCharAsInt == -1)
-			throw new NotEnoughInputForBOMException("typically not an error"); //$NON-NLS-1$
-		return (byte) byteCharAsInt;
-	}
-
-	/**
-	 *  
-	 */
-
-	public String getSpecDefaultEncoding() {
-		// There is no default for this case
-		return null;
-	}
-
-	/**
-	 *  
-	 */
-	private void resetAll() {
-		fNoBOMPossible = false;
-		fInputStream = null;
-
-	}
-
-	/**
-	 *  
-	 */
-
-	public void set(InputStream inputStream) {
-		resetAll();
-		fInputStream = inputStream;
-	}
-
-	public void set(IStorage iStorage) throws CoreException {
-		set(new BufferedInputStream(iStorage.getContents(), CodedIO.MAX_BUF_SIZE));
-
-	}
-
-	public void set(Reader reader) {
-		if (reader instanceof ByteReader) {
-			ByteReader byteReader = (ByteReader) reader;
-			fInputStream = byteReader.fInputStream;
-		} else {
-			fNoBOMPossible = true;
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/CharConversionErrorWithDetail.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/CharConversionErrorWithDetail.java
deleted file mode 100644
index 1f19444..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/CharConversionErrorWithDetail.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.exceptions;
-
-import java.nio.charset.CharacterCodingException;
-
-
-public class CharConversionErrorWithDetail extends CharacterCodingException {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
-	private String fCharsetName;
-
-	public CharConversionErrorWithDetail() {
-		super();
-	}
-
-	/**
-	 * @param s
-	 */
-	public CharConversionErrorWithDetail(String charsetName) {
-		super();
-		fCharsetName = charsetName;
-	}
-
-	/**
-	 * @return Returns the fCharsetName.
-	 */
-	public String getCharsetName() {
-		return fCharsetName;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/MalformedInputExceptionWithDetail.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/MalformedInputExceptionWithDetail.java
deleted file mode 100644
index ff31bbd..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/MalformedInputExceptionWithDetail.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.exceptions;
-
-import java.nio.charset.CharacterCodingException;
-
-
-/**
- * Intended to be a more precise form of the MalformedInputException, where
- * character position and attempted encoding can be attempted.
- */
-public class MalformedInputExceptionWithDetail extends CharacterCodingException {
-
-	/**
-	 * Default <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
-	private int fCharPosition;
-	private String fDetectedCharsetName;
-	private boolean fExceededMax = false;
-	private String fJavaCharsetName;
-	private int fMaxBuffer;
-
-	/**
-	 * Disallow default constructor. If attemptedEncoding and charPostion can
-	 * not be provided, use one of java's MalformedException.
-	 */
-	protected MalformedInputExceptionWithDetail() {
-		// Nothing to do
-	}
-
-	public MalformedInputExceptionWithDetail(String encodingName, int charPostion) {
-		this.fJavaCharsetName = encodingName;
-		this.fDetectedCharsetName = encodingName;
-		this.fCharPosition = charPostion;
-	}
-
-	public MalformedInputExceptionWithDetail(String attemptedJavaEncoding, String attemptedIANAEncoding, int charPostion) {
-		this.fJavaCharsetName = attemptedJavaEncoding;
-		this.fDetectedCharsetName = attemptedIANAEncoding;
-		this.fCharPosition = charPostion;
-	}
-
-	/**
-	 * If charPosition = -1 this could be because the character position
-	 * exceeded the maximum buffer size, maxBuffer, then exceededMax = true.
-	 */
-	public MalformedInputExceptionWithDetail(String attemptedJavaEncoding, String attemptedIANAEncoding, int charPostion, boolean exceededMax, int maxBuffer) {
-		this.fJavaCharsetName = attemptedJavaEncoding;
-		this.fDetectedCharsetName = attemptedIANAEncoding;
-		this.fCharPosition = charPostion;
-		this.fExceededMax = exceededMax;
-		this.fMaxBuffer = maxBuffer;
-	}
-
-	/**
-	 */
-	public java.lang.String getAttemptedIANAEncoding() {
-		return fDetectedCharsetName;
-	}
-
-	/**
-	 */
-	public java.lang.String getAttemptedJavaEncoding() {
-		return fJavaCharsetName;
-	}
-
-	/**
-	 * @return int
-	 */
-	public int getCharPosition() {
-		return fCharPosition;
-	}
-
-	/**
-	 * Returns the maxBuffer.
-	 * 
-	 * @return int
-	 */
-	public int getMaxBuffer() {
-		return fMaxBuffer;
-	}
-
-	/**
-	 * Returns the exceededMax.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isExceededMax() {
-		return fExceededMax;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/MalformedOutputExceptionWithDetail.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/MalformedOutputExceptionWithDetail.java
deleted file mode 100644
index 6eec680..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/MalformedOutputExceptionWithDetail.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.exceptions;
-
-
-public class MalformedOutputExceptionWithDetail extends MalformedInputExceptionWithDetail {
-
-	/**
-	 * Default <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Constructor for MalformedOutputExceptionWithDetail. If attemptedEncoding and charPostion can
-	 * not be provided, use sun.io.MalformedException.
-	 * 
-	 * @param attemptedJavaEncoding
-	 * @param attemptedIANAEncoding
-	 * @param charPostion
-	 */
-	public MalformedOutputExceptionWithDetail(String attemptedJavaEncoding, String attemptedIANAEncoding, int charPostion) {
-		super(attemptedJavaEncoding, attemptedIANAEncoding, charPostion);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/UnsupportedCharsetExceptionWithDetail.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/UnsupportedCharsetExceptionWithDetail.java
deleted file mode 100644
index 123af87..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/exceptions/UnsupportedCharsetExceptionWithDetail.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.exceptions;
-
-import java.nio.charset.UnsupportedCharsetException;
-
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-
-
-/**
- * This is intended for same purpose as it super class, but simply provides
- * more information about than the name in error. This is especially useful
- * for "UIs" which can present users with the error, and the
- * "appropriateDefault" that can be used for a particular input.
- */
-public class UnsupportedCharsetExceptionWithDetail extends UnsupportedCharsetException {
-
-	/**
-	 * Default <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
-	private EncodingMemento fEncodingMementio;
-
-	public UnsupportedCharsetExceptionWithDetail(EncodingMemento encodingMemento) {
-		this(encodingMemento.getDetectedCharsetName());
-		fEncodingMementio = encodingMemento;
-	}
-
-	protected UnsupportedCharsetExceptionWithDetail(String charsetName) {
-		super(charsetName);
-	}
-
-	public EncodingMemento getEncodingMemento() {
-		return fEncodingMementio;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/provisional/tasks/IFileTaskScanner.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/provisional/tasks/IFileTaskScanner.java
deleted file mode 100644
index d1655b2..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/provisional/tasks/IFileTaskScanner.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.tasks;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-
-/**
- * Scanners for the main Task Scanner. Scanners may be contributed using the
- * org.eclipse.wst.sse.core.taskscanner extension point. For resources and
- * resource deltas with matching content types, the main scanner will first
- * call the startup() method, scan(), and then shutdown() in sequence. Scanner
- * instances will be reused across projects but are not shared per content
- * type. Scanners should not hold on to references to models or resources
- * after shutdown() and should take care not to leak memory or resources.
- */
-public interface IFileTaskScanner {
-	/**
-	 * Default marker type ID of task markers that are created.
-	 */
-	String TASK_MARKER_ID = SSECorePlugin.ID + ".task"; //$NON-NLS-1$;
-
-	/**
-	 * @return the task marker type that should be removed each time tasks are
-	 *         rescanned and used by default when creating task markers.
-	 *         Children of this marker type will be removed automatically.
-	 */
-	String getMarkerType();
-
-	/**
-	 * Requests that the list of automatically discovered tasks for the given
-	 * file be updated. Once completed, the list of tasks should correspond
-	 * exactly to the file's contents.
-	 * 
-	 * @param file -
-	 *            the file to be scanned
-	 * @param taskTags -
-	 *            the list of task tags for which to scan
-	 * @param monitor -
-	 *            a progress monitor
-	 * @return an array of maps containing the attributes of task markers to
-	 *         be created
-	 *         <p>
-	 *         The reserved attribute name
-	 *         <b>org.eclipse.core.resources.taskmarker</b> may be used to
-	 *         specify a type to use when creating the task marker.
-	 *         </p>
-	 */
-	Map[] scan(IFile file, TaskTag[] taskTags, IProgressMonitor monitor);
-
-	/**
-	 * Notifies the scanner that scanning is done for now. Resources held from
-	 * startup should now be released.
-	 * 
-	 * @param project -
-	 *            the project that was just scanned
-	 */
-	void shutdown(IProject project);
-
-	/**
-	 * Notifies the scanner that a sequence of scans is about to be requested.
-	 * Ideally the time to load preferences and perform any expensive
-	 * configuration for the given project.
-	 * 
-	 * @param project -
-	 *            the project that is about to be scanned
-	 * 
-	 */
-	void startup(IProject project);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/provisional/tasks/TaskTag.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/provisional/tasks/TaskTag.java
deleted file mode 100644
index cab7258..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/provisional/tasks/TaskTag.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.tasks;
-
-import org.eclipse.core.resources.IMarker;
-
-/**
- * Simple representation of the values that make up a Task Tag
- */
-public final class TaskTag {
-
-	public static final int PRIORITY_HIGH = IMarker.PRIORITY_HIGH;
-	public static final int PRIORITY_LOW = IMarker.PRIORITY_LOW;
-	public static final int PRIORITY_NORMAL = IMarker.PRIORITY_NORMAL;
-
-	/**
-	 * this task tag's priority
-	 */
-	private int fPriority = PRIORITY_NORMAL;
-	
-	/**
-	 * this task tag's "tagging" text
-	 */
-	private String fTag = null;
-
-	public TaskTag(String tag, int priority) {
-		super();
-		fTag = tag;
-		fPriority = priority;
-	}
-
-	public int getPriority() {
-		return fPriority;
-	}
-
-	public String getTag() {
-		return fTag;
-	}
-
-	public String toString() {
-		return getTag() + ":" + getPriority(); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/FileTaskScannerRegistryReader.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/FileTaskScannerRegistryReader.java
deleted file mode 100644
index d191e71..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/FileTaskScannerRegistryReader.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.tasks;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.internal.provisional.tasks.IFileTaskScanner;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-
-public class FileTaskScannerRegistryReader {
-	private class ScannerInfo {
-		String fId;
-		IFileTaskScanner fScanner;
-
-		ScannerInfo(String id, IFileTaskScanner scanner) {
-			super();
-			fId = id;
-			fScanner = scanner;
-		}
-
-		public boolean equals(Object obj) {
-			return obj instanceof ScannerInfo && fId.equals(((ScannerInfo) obj).fId);
-		}
-
-		public String getId() {
-			return fId;
-		}
-
-		public IFileTaskScanner getScanner() {
-			return fScanner;
-		}
-	}
-
-	private static FileTaskScannerRegistryReader _instance = null;
-
-	public static FileTaskScannerRegistryReader getInstance() {
-		if (_instance == null) {
-			_instance = new FileTaskScannerRegistryReader();
-		}
-		return _instance;
-	}
-
-	private String ATT_CLASS = "class"; //$NON-NLS-1$
-
-	private String ATT_CONTENT_TYPES = "contentTypeIds"; //$NON-NLS-1$
-
-	private String ATT_ID = "id"; //$NON-NLS-1$
-
-	private IConfigurationElement[] fScannerElements;
-
-	// a mapping from content types to ScannerInfo instances
-	private Map fScannerInfos = null;
-
-	private String NAME_SCANNER = "scanner"; //$NON-NLS-1$
-
-	private String SCANNER_EXTENSION_POINT_ID = SSECorePlugin.ID + ".taskscanner"; //$NON-NLS-1$
-
-	private FileTaskScannerRegistryReader() {
-		super();
-	}
-
-	IFileTaskScanner[] getFileTaskScanners(IContentType[] contentTypes) {
-		if (fScannerElements == null) {
-			readRegistry();
-		}
-
-		List scannerInfos = new ArrayList(1);
-
-		for (int i = 0; i < contentTypes.length; i++) {
-			ScannerInfo[] scannerInfosForContentType = (ScannerInfo[]) fScannerInfos.get(contentTypes[i].getId());
-			if (scannerInfosForContentType == null) {
-				scannerInfosForContentType = loadScanners(contentTypes[i]);
-			}
-			// only add non-duplicate scanners
-			for (int j = 0; j < scannerInfosForContentType.length; j++) {
-				if (!scannerInfos.contains(scannerInfosForContentType[j])) {
-					scannerInfos.add(scannerInfosForContentType[j]);
-				}
-			}
-		}
-		IFileTaskScanner[] scanners = new IFileTaskScanner[scannerInfos.size()];
-		for (int i = 0; i < scanners.length; i++) {
-			scanners[i] = ((ScannerInfo) scannerInfos.get(i)).getScanner();
-		}
-		return scanners;
-	}
-
-	public String[] getSupportedContentTypeIds() {
-		if (fScannerElements == null) {
-			readRegistry();
-		}
-
-		// find the relevant extensions
-		List types = new ArrayList(0);
-		IConfigurationElement[] scannerElements = fScannerElements;
-		for (int j = 0; j < scannerElements.length; j++) {
-			if (!scannerElements[j].getName().equals(NAME_SCANNER))
-				continue;
-			String[] contentTypeIds = StringUtils.unpack(scannerElements[j].getAttribute(ATT_CONTENT_TYPES));
-			for (int i = 0; i < contentTypeIds.length; i++) {
-				if (!types.contains(contentTypeIds[i])) {
-					types.add(contentTypeIds[i]);
-				}
-			}
-		}
-
-		return (String[]) types.toArray(new String[types.size()]);
-	}
-
-	private ScannerInfo[] loadScanners(IContentType contentType) {
-		List elements = new ArrayList(0);
-		ScannerInfo[] scannerInfos = null;
-		IConfigurationElement[] delegateElements = fScannerElements;
-		if (contentType != null) {
-			IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-			for (int j = 0; j < delegateElements.length; j++) {
-				if (!delegateElements[j].getName().equals(NAME_SCANNER))
-					continue;
-				String[] supportedContentTypeIds = StringUtils.unpack(delegateElements[j].getAttribute(ATT_CONTENT_TYPES));
-				IContentType[] supportedContentTypes = new IContentType[supportedContentTypeIds.length];
-				for (int k = 0; k < supportedContentTypeIds.length; k++) {
-					supportedContentTypes[k] = contentTypeManager.getContentType(supportedContentTypeIds[k].trim());
-				}
-				for (int k = 0; k < supportedContentTypeIds.length; k++) {
-					// allow subtypes to be returned as well
-					if (supportedContentTypes[k] != null && contentType.isKindOf(supportedContentTypes[k])) {
-						elements.add(delegateElements[j]);
-					}
-				}
-			}
-			// instantiate and save the scanners
-			List scannerInfoList = new ArrayList(elements.size());
-			for (int i = 0; i < elements.size(); i++) {
-				try {
-					IFileTaskScanner scanner = (IFileTaskScanner) ((IConfigurationElement) elements.get(i)).createExecutableExtension(ATT_CLASS);
-					if (scanner != null) {
-						scannerInfoList.add(new ScannerInfo(((IConfigurationElement) elements.get(i)).getAttribute(ATT_ID), scanner));
-					}
-				}
-				catch (CoreException e) {
-					Logger.logException("Non-fatal exception creating task scanner for " + contentType.getId(), e); //$NON-NLS-1$
-				}
-			}
-			scannerInfos = (ScannerInfo[]) scannerInfoList.toArray(new ScannerInfo[scannerInfoList.size()]);
-			fScannerInfos.put(contentType.getId(), scannerInfos);
-			if (Logger.DEBUG_TASKSREGISTRY) {
-				System.out.println("Created " + scannerInfos.length + " task scanner for " + contentType.getId()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return scannerInfos;
-	}
-
-	private void readRegistry() {
-		fScannerInfos = new HashMap();
-		// Just remember the elements, so plugins don't have to be activated,
-		// unless extension attributes match those of interest
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(SCANNER_EXTENSION_POINT_ID);
-		if (point != null) {
-			fScannerElements = point.getConfigurationElements();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/StructuredFileTaskScanner.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/StructuredFileTaskScanner.java
deleted file mode 100644
index 42271b4..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/StructuredFileTaskScanner.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.tasks;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.CharacterCodingException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.document.DocumentReader;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
-import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionParser;
-import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerRegistry;
-import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;
-import org.eclipse.wst.sse.core.internal.provisional.tasks.IFileTaskScanner;
-import org.eclipse.wst.sse.core.internal.provisional.tasks.TaskTag;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-
-/**
- * A delegate to create IMarker.TASKs for "todos" and similar comments.
- */
-public abstract class StructuredFileTaskScanner implements IFileTaskScanner, IExecutableExtension {
-	// the list of attributes for the new tasks for the current file
-	protected List fNewMarkerAttributeMaps = null;
-
-	List oldMarkers = null;
-	private long time0;
-	private String runtimeMarkerType;
-
-	public StructuredFileTaskScanner() {
-		super();
-		fNewMarkerAttributeMaps = new ArrayList();
-		if (Logger.DEBUG_TASKS) {
-			System.out.println(getClass().getName() + " instance created"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Returns the attributes with which a newly created marker will be
-	 * initialized. Modified from the method in MarkerRulerAction
-	 * 
-	 * @return the initial marker attributes
-	 */
-	protected Map createInitialMarkerAttributes(String text, int documentLine, int startOffset, int length, int priority) {
-		Map attributes = new HashMap(6);
-		// marker line numbers are 1-based
-		attributes.put(IMarker.LINE_NUMBER, new Integer(documentLine + 1));
-		attributes.put(IMarker.TASK, getMarkerType());
-		attributes.put(IMarker.CHAR_START, new Integer(startOffset));
-		attributes.put(IMarker.CHAR_END, new Integer(startOffset + length));
-		attributes.put(IMarker.MESSAGE, text);
-		attributes.put(IMarker.USER_EDITABLE, Boolean.FALSE);
-
-		switch (priority) {
-			case IMarker.PRIORITY_HIGH : {
-				attributes.put(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_HIGH));
-			}
-				break;
-			case IMarker.PRIORITY_LOW : {
-				attributes.put(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_LOW));
-			}
-				break;
-			default : {
-				attributes.put(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_NORMAL));
-			}
-		}
-
-		return attributes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.tasks.IFileTaskScanner#getMarkerType()
-	 */
-	public String getMarkerType() {
-		if (runtimeMarkerType != null)
-			return runtimeMarkerType;
-
-		return org.eclipse.core.resources.IMarker.TASK;
-	}
-
-	private String detectCharset(IFile file) {
-		if (file.getType() == IResource.FILE && file.isAccessible()) {
-			try {
-				return file.getCharset(true);
-			}
-			catch (CoreException e) {
-				Logger.logException(e);
-			}
-		}
-		return ResourcesPlugin.getEncoding();
-	}
-
-	/**
-	 * @param document
-	 * @param documentRegion
-	 * @param comment
-	 */
-	protected void findTasks(IDocument document, TaskTag[] taskTags, IStructuredDocumentRegion documentRegion, ITextRegion comment) {
-		if (isCommentRegion(documentRegion, comment)) {
-			int startOffset = documentRegion.getStartOffset(comment);
-			int endOffset = documentRegion.getTextEndOffset(comment);
-			try {
-				int startLine = document.getLineOfOffset(startOffset);
-				int endLine = document.getLineOfOffset(endOffset);
-				for (int lineNumber = startLine; lineNumber <= endLine; lineNumber++) {
-					IRegion line = document.getLineInformation(lineNumber);
-					int begin = Math.max(startOffset, line.getOffset());
-					int end = Math.min(endOffset, line.getOffset() + line.getLength());
-					int length = end - begin;
-
-					/* XXX: This generates a lot of garbage objects */
-
-					String commentedText = getCommentedText(document, begin, length);
-					String comparisonText = commentedText.toLowerCase(Locale.ENGLISH);
-
-					for (int i = 0; i < taskTags.length; i++) {
-						int tagIndex = comparisonText.indexOf(taskTags[i].getTag().toLowerCase(Locale.ENGLISH));
-						if (tagIndex >= 0) {
-							String markerDescription = commentedText.substring(tagIndex);
-							int markerOffset = begin + tagIndex;
-							int markerLength = end - markerOffset;
-							fNewMarkerAttributeMaps.add(createInitialMarkerAttributes(markerDescription, lineNumber, markerOffset, markerLength, taskTags[i].getPriority()));
-						}
-					}
-				}
-			}
-			catch (BadLocationException e) {
-				Logger.logException(e);
-			}
-		}
-	}
-
-	private void findTasks(IFile file, final TaskTag[] taskTags, final IProgressMonitor monitor) {
-		try {
-			IModelHandler handler = ModelHandlerRegistry.getInstance().getHandlerFor(file);
-
-			// records if the optimized streamish parse was possible
-			boolean didStreamParse = false;
-			final IEncodedDocument defaultDocument = handler.getDocumentLoader().createNewStructuredDocument();
-			if (defaultDocument instanceof IStructuredDocument) {
-				RegionParser parser = ((IStructuredDocument) defaultDocument).getParser();
-				if (parser instanceof StructuredDocumentRegionParser) {
-					didStreamParse = true;
-					String charset = detectCharset(file);
-					StructuredDocumentRegionParser documentParser = (StructuredDocumentRegionParser) parser;
-					final IDocument textDocument = new Document();
-					setDocumentContent(textDocument, file.getContents(true), charset);
-					monitor.beginTask("", textDocument.getLength());
-					documentParser.reset(new DocumentReader(textDocument));
-					documentParser.addStructuredDocumentRegionHandler(new StructuredDocumentRegionHandler() {
-						public void nodeParsed(IStructuredDocumentRegion documentRegion) {
-							ITextRegionList regions = documentRegion.getRegions();
-							for (int j = 0; j < regions.size(); j++) {
-								ITextRegion comment = regions.get(j);
-								findTasks(textDocument, taskTags, documentRegion, comment);
-							}
-							// disconnect the document regions
-							if (documentRegion.getPrevious() != null) {
-								documentRegion.getPrevious().setPrevious(null);
-								documentRegion.getPrevious().setNext(null);
-							}
-							if (monitor.isCanceled()) {
-								textDocument.set(""); //$NON-NLS-1$
-							}
-							monitor.worked(documentRegion.getLength());
-						}
-
-						public void resetNodes() {
-						}
-					});
-					documentParser.getDocumentRegions();
-				}
-			}
-			if (!didStreamParse) {
-				// Use a StructuredDocument
-				IEncodedDocument document = handler.getDocumentLoader().createNewStructuredDocument(file);
-				monitor.beginTask("", document.getLength());
-				if (document instanceof IStructuredDocument) {
-					IStructuredDocumentRegion documentRegion = ((IStructuredDocument) document).getFirstStructuredDocumentRegion();
-					while (documentRegion != null) {
-						ITextRegionList regions = documentRegion.getRegions();
-						for (int j = 0; j < regions.size(); j++) {
-							ITextRegion comment = regions.get(j);
-							findTasks(document, taskTags, documentRegion, comment);
-						}
-						monitor.worked(documentRegion.getLength());
-						documentRegion = documentRegion.getNext();
-					}
-				}
-			}
-		}
-		catch (CoreException e) {
-			Logger.logException("Exception with " + file.getFullPath().toString(), e); //$NON-NLS-1$
-		}
-		catch (CharacterCodingException e) {
-			Logger.log(Logger.INFO, "StructuredFileTaskScanner encountered CharacterCodingException reading " + file.getFullPath()); //$NON-NLS-1$
-		}
-		catch (Exception e) {
-			Logger.logException("Exception with " + file.getFullPath().toString(), e); //$NON-NLS-1$
-		}
-		monitor.done();
-	}
-
-	protected String getCommentedText(IDocument document, int begin, int length) throws BadLocationException {
-		return document.get(begin, length);
-	}
-
-	protected abstract boolean isCommentRegion(IStructuredDocumentRegion region, ITextRegion textRegion);
-
-	public synchronized Map[] scan(IFile file, TaskTag[] taskTags, IProgressMonitor monitor) {
-		fNewMarkerAttributeMaps.clear();
-		if (monitor.isCanceled() || !shouldScan(file)) {
-			return new Map[0];
-		}
-		if (Logger.DEBUG_TASKSPERF) {
-			time0 = System.currentTimeMillis();
-		}
-		if (taskTags.length > 0) {
-			findTasks(file, taskTags, monitor);
-		}
-		if (Logger.DEBUG_TASKSPERF) {
-			System.out.println("" + (System.currentTimeMillis() - time0) + "ms for " + file.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return (Map[]) fNewMarkerAttributeMaps.toArray(new Map[fNewMarkerAttributeMaps.size()]);
-	}
-
-	/**
-	 * Sets the document content from this stream and closes the stream
-	 */
-	protected void setDocumentContent(IDocument document, InputStream contentStream, String charset) {
-		Reader in = null;
-		try {
-			in = new BufferedReader(new InputStreamReader(contentStream, charset), 2048);
-			StringBuffer buffer = new StringBuffer(2048);
-			char[] readBuffer = new char[2048];
-			int n = in.read(readBuffer);
-			while (n > 0) {
-				buffer.append(readBuffer, 0, n);
-				n = in.read(readBuffer);
-			}
-			document.set(buffer.toString());
-		}
-		catch (IOException x) {
-		}
-		finally {
-			if (in != null) {
-				try {
-					in.close();
-				}
-				catch (IOException x) {
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
-		if (data != null && data instanceof String) {
-			runtimeMarkerType = data.toString();
-		}
-	}
-
-	boolean shouldScan(IResource r) {
-		// skip "dot" files
-		String s = r.getName();
-		return s.length() == 0 || s.charAt(0) != '.';
-	}
-
-	public void shutdown(IProject project) {
-		if (Logger.DEBUG_TASKS) {
-			System.out.println(this + " shutdown for " + project.getName()); //$NON-NLS-1$
-		}
-	}
-
-	public void startup(IProject project) {
-		if (Logger.DEBUG_TASKS) {
-			System.out.println(this + " startup for " + project.getName()); //$NON-NLS-1$
-		}
-		if (Logger.DEBUG_TASKSPERF) {
-			time0 = System.currentTimeMillis();
-		}
-		if (Logger.DEBUG_TASKSPERF) {
-			System.out.println("" + (System.currentTimeMillis() - time0) + "ms loading prefs for " + project.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskScanningJob.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskScanningJob.java
deleted file mode 100644
index 1183beb..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskScanningJob.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.tasks;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IPreferencesService;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.SSECoreMessages;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-import org.osgi.framework.Bundle;
-
-/**
- * Queueing Job for processing deltas and projects.
- */
-class TaskScanningJob extends Job {
-	static final int JOB_DELAY_DELTA = 400;
-	private static final int JOB_DELAY_PROJECT = 2000;
-	static final String TASK_TAG_PROJECTS_ALREADY_SCANNED = "task-tag-projects-already-scanned"; //$NON-NLS-1$
-	private List fQueue = null;
-
-	/** symbolic name for OSGI framework */
-	private final String OSGI_FRAMEWORK_ID = "org.eclipse.osgi"; //$NON-NLS-1$
-
-	TaskScanningJob() {
-		super(SSECoreMessages.TaskScanner_0);
-		fQueue = new ArrayList();
-		setPriority(Job.DECORATE);
-		setSystem(true);
-		setUser(false);
-
-		SSECorePlugin.getDefault().getPluginPreferences().setDefault(TASK_TAG_PROJECTS_ALREADY_SCANNED, ""); //$NON-NLS-1$
-	}
-
-	synchronized void addProjectDelta(IResourceDelta delta) {
-		IResource projectResource = delta.getResource();
-
-		if (projectResource.getType() == IResource.PROJECT) {
-			if (isEnabledOnProject((IProject) projectResource)) {
-				fQueue.add(delta);
-				if (Logger.DEBUG_TASKSJOB) {
-					String kind = null;
-					switch (delta.getKind()) {
-						case IResourceDelta.ADDED :
-							kind = " [IResourceDelta.ADDED]"; //$NON-NLS-1$
-							break;
-						case IResourceDelta.CHANGED :
-							kind = " [IResourceDelta.CHANGED]"; //$NON-NLS-1$
-							break;
-						case IResourceDelta.REMOVED :
-							kind = " [IResourceDelta.REMOVED]"; //$NON-NLS-1$
-							break;
-						case IResourceDelta.ADDED_PHANTOM :
-							kind = " [IResourceDelta.ADDED_PHANTOM]"; //$NON-NLS-1$
-							break;
-						case IResourceDelta.REMOVED_PHANTOM :
-							kind = " [IResourceDelta.REMOVED_PHANTOM]"; //$NON-NLS-1$
-							break;
-					}
-					System.out.println("Adding delta " + delta.getFullPath() + kind); //$NON-NLS-1$
-				}
-				schedule(JOB_DELAY_DELTA);
-			}
-		}
-	}
-
-	synchronized void addProject(IProject project) {
-		if (projectHasNotBeenFullyScanned(project)) {
-			fQueue.add(project);
-			if (Logger.DEBUG_TASKSJOB) {
-				System.out.println("Adding project " + project.getName()); //$NON-NLS-1$
-			}
-			schedule(JOB_DELAY_PROJECT);
-		}
-	}
-
-	/**
-	 * A check to see if the OSGI framework is shutting down.
-	 * 
-	 * @return true if the System Bundle is stopped (ie. the framework is
-	 *         shutting down)
-	 */
-	boolean frameworkIsShuttingDown() {
-		// in the Framework class there's a note:
-		// set the state of the System Bundle to STOPPING.
-		// this must be done first according to section 4.19.2 from the OSGi
-		// R3 spec.
-		boolean shuttingDown = !Platform.isRunning() || Platform.getBundle(OSGI_FRAMEWORK_ID).getState() == Bundle.STOPPING;
-		if (Logger.DEBUG_TASKSJOB && shuttingDown) {
-			System.out.println("TaskScanningJob: system is shutting down!"); //$NON-NLS-1$
-		}
-		return shuttingDown;
-	}
-	
-	private boolean isEnabledOnProject(IProject p) {
-		IPreferencesService preferencesService = Platform.getPreferencesService();
-		IScopeContext[] lookupOrder = new IScopeContext[]{new ProjectScope(p), new InstanceScope(), new DefaultScope()};
-		return preferencesService.getBoolean(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_ENABLE, false, lookupOrder);
-	}
-
-	private boolean projectHasNotBeenFullyScanned(IResource project) {
-		String[] projectsScanned = StringUtils.unpack(SSECorePlugin.getDefault().getPluginPreferences().getString(TASK_TAG_PROJECTS_ALREADY_SCANNED));
-
-		boolean shouldScan = true;
-		String name = project.getName();
-		for (int j = 0; shouldScan && j < projectsScanned.length; j++) {
-			if (projectsScanned[j].equals(name)) {
-				if (Logger.DEBUG_TASKSJOB)
-					System.out.println("Scanning Job skipping " + project.getName()); //$NON-NLS-1$
-				shouldScan = false;
-			}
-		}
-		return shouldScan;
-	}
-
-	synchronized List retrieveQueue() {
-		List queue = fQueue;
-		fQueue = new ArrayList();
-		return queue;
-	}
-
-	protected IStatus run(IProgressMonitor monitor) {
-		if (frameworkIsShuttingDown())
-			return Status.CANCEL_STATUS;
-
-		cleanupRememberedProjectList(TASK_TAG_PROJECTS_ALREADY_SCANNED);
-
-		IStatus status = null;
-		List currentQueue = retrieveQueue();
-		List errors = null;
-		int ticks = currentQueue.size();
-		String taskName = null;
-		if (Logger.DEBUG_TASKSJOB) {
-			taskName = SSECoreMessages.TaskScanningJob_0 + " (" + ticks + " work items)"; //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		else {
-			taskName = SSECoreMessages.TaskScanningJob_0;
-		}
-		monitor.beginTask(taskName, ticks);
-
-		IProgressMonitor scanMonitor = null;
-		while (!currentQueue.isEmpty()) {
-			Object o = currentQueue.remove(0);
-			if (frameworkIsShuttingDown())
-				return Status.CANCEL_STATUS;
-			try {
-				scanMonitor = new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
-				if (o instanceof IResourceDelta) {
-					WorkspaceTaskScanner.getInstance().scan((IResourceDelta) o, scanMonitor);
-				}
-				else if (o instanceof IProject) {
-					WorkspaceTaskScanner.getInstance().scan((IProject) o, scanMonitor);
-					if(!scanMonitor.isCanceled() ) {
-						String[] projectsPreviouslyScanned = StringUtils.unpack(SSECorePlugin.getDefault().getPluginPreferences().getString(TASK_TAG_PROJECTS_ALREADY_SCANNED));
-						String[] updatedProjects = new String[projectsPreviouslyScanned.length + 1];
-						updatedProjects[projectsPreviouslyScanned.length] = ((IResource) o).getName();
-						System.arraycopy(projectsPreviouslyScanned, 0, updatedProjects, 0, projectsPreviouslyScanned.length);
-						SSECorePlugin.getDefault().getPluginPreferences().setValue(TASK_TAG_PROJECTS_ALREADY_SCANNED, StringUtils.pack(updatedProjects));
-					}
-				}
-			}
-			catch (Exception e) {
-				if (errors == null) {
-					errors = new ArrayList();
-				}
-				errors.add(new Status(IStatus.ERROR, SSECorePlugin.ID, IStatus.ERROR, "", e)); //$NON-NLS-1$
-			}
-		}
-		monitor.done();
-
-		if (errors == null || errors.isEmpty()) {
-			status = Status.OK_STATUS;
-		}
-		else {
-			if (errors.size() == 1) {
-				status = (IStatus) errors.get(0);
-			}
-			else {
-				IStatus[] statii = (IStatus[]) errors.toArray(new IStatus[errors.size()]);
-				status = new MultiStatus(SSECorePlugin.ID, IStatus.ERROR, statii, SSECoreMessages.TaskScanningJob_1, null);
-			}
-		}
-
-		SSECorePlugin.getDefault().savePluginPreferences();
-		return status;
-	}
-
-	private void cleanupRememberedProjectList(String preferenceName) {
-		String[] rememberedProjectNames = StringUtils.unpack(SSECorePlugin.getDefault().getPluginPreferences().getString(preferenceName));
-		IResource[] workspaceProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-		String[] projectNames = new String[workspaceProjects.length];
-		for (int i = 0; i < projectNames.length; i++) {
-			projectNames[i] = workspaceProjects[i].getName();
-		}
-
-		List projectNamesToRemember = new ArrayList(rememberedProjectNames.length);
-		for (int i = 0; i < rememberedProjectNames.length; i++) {
-			boolean rememberedProjectExists = false;
-			for (int j = 0; !rememberedProjectExists && j < projectNames.length; j++) {
-				if (rememberedProjectNames[i].equals(projectNames[j])) {
-					rememberedProjectExists = true;
-				}
-			}
-			if (rememberedProjectExists) {
-				projectNamesToRemember.add(rememberedProjectNames[i]);
-			}
-			else if (Logger.DEBUG_TASKSJOB) {
-				System.out.println("Removing " + rememberedProjectNames[i] + " removed from " + preferenceName); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		if (projectNamesToRemember.size() != rememberedProjectNames.length) {
-			SSECorePlugin.getDefault().getPluginPreferences().setValue(preferenceName, StringUtils.pack((String[]) projectNamesToRemember.toArray(new String[projectNamesToRemember.size()])));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskScanningScheduler.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskScanningScheduler.java
deleted file mode 100644
index 1ae5680..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskScanningScheduler.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.tasks;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-
-public class TaskScanningScheduler {
-	private class ListenerVisitor implements IResourceChangeListener, IResourceDeltaVisitor {
-		public void resourceChanged(IResourceChangeEvent event) {
-			IResourceDelta delta = event.getDelta();
-			if (delta.getResource() != null) {
-				int resourceType = delta.getResource().getType();
-				if (resourceType == IResource.PROJECT || resourceType == IResource.ROOT) {
-					try {
-						delta.accept(this);
-					}
-					catch (CoreException e) {
-						Logger.logException("Exception handling resource change", e); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-
-		public boolean visit(IResourceDelta delta) throws CoreException {
-			if ((delta.getKind() & IResourceDelta.MARKERS) > 0 || (delta.getKind() & IResourceDelta.ENCODING) > 0 || (delta.getKind() & IResourceDelta.NO_CHANGE) > 0)
-				return false;
-
-			IResource resource = delta.getResource();
-			if (resource != null) {
-				if (resource.getType() == IResource.ROOT)
-					return true;
-				else if (resource.getType() == IResource.PROJECT) {
-					fJob.addProjectDelta(delta);
-					return false;
-				}
-			}
-			return false;
-		}
-
-	}
-
-	private static TaskScanningScheduler scheduler;
-
-	public static void refresh() {
-		SSECorePlugin.getDefault().getPluginPreferences().setValue(TaskScanningJob.TASK_TAG_PROJECTS_ALREADY_SCANNED, ""); //$NON-NLS-1$
-		scheduler.enqueue(ResourcesPlugin.getWorkspace().getRoot());
-	}
-
-	public static void refresh(IProject project) {
-		String[] projectNames = StringUtils.unpack(SSECorePlugin.getDefault().getPluginPreferences().getString(TaskScanningJob.TASK_TAG_PROJECTS_ALREADY_SCANNED)); //$NON-NLS-1$
-		List freshProjectList = new ArrayList();
-		for (int i = 0; i < projectNames.length; i++) {
-			if (!projectNames[i].equals(project.getName())) {
-				freshProjectList.add(projectNames[i]);
-			}
-		}
-		String freshProjects = StringUtils.pack((String[]) freshProjectList.toArray(new String[freshProjectList.size()]));
-		SSECorePlugin.getDefault().getPluginPreferences().setValue(TaskScanningJob.TASK_TAG_PROJECTS_ALREADY_SCANNED, freshProjects); //$NON-NLS-1$
-
-		scheduler.enqueue(project);
-	}
-
-
-	/**
-	 * Only for use by SSECorePlugin class
-	 */
-	public static void shutdown() {
-		if (scheduler != null) {
-			scheduler.fJob.cancel();
-			ResourcesPlugin.getWorkspace().removeResourceChangeListener(scheduler.visitor);
-		}
-	}
-
-	/**
-	 * Only for use by SSECorePlugin class
-	 */
-	public static void startup() {
-		scheduler = new TaskScanningScheduler();
-
-		/*
-		 * According to
-		 * http://www.eclipse.org/eclipse/development/performance/bloopers.html,
-		 * POST_CHANGE listeners add a trivial performance cost.
-		 * 
-		 * Always add listener since we might be enabled per-project even if disabled workspace-wide.
-		 */
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(scheduler.visitor, IResourceChangeEvent.POST_CHANGE);
-
-		scheduler.enqueue(ResourcesPlugin.getWorkspace().getRoot());
-	}
-
-	TaskScanningJob fJob = null;
-
-	ListenerVisitor visitor = null;
-
-	private TaskScanningScheduler() {
-		super();
-		fJob = new TaskScanningJob();
-		visitor = new ListenerVisitor();
-	}
-
-	void enqueue(IProject project) {
-		fJob.addProject(project);
-	}
-
-	void enqueue(IWorkspaceRoot root) {
-		IProject[] allProjects = root.getProjects();
-		for (int i = 0; i < allProjects.length; i++) {
-			fJob.addProject(allProjects[i]);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskTagPreferenceKeys.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskTagPreferenceKeys.java
deleted file mode 100644
index bb3e305..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/TaskTagPreferenceKeys.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.tasks;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-
-public final class TaskTagPreferenceKeys {
-	public static final String TASK_TAG_CONTENTTYPES_IGNORED = "ignored-contentTypes"; //$NON-NLS-1$
-	public static final String TASK_TAG_ENABLE = "enabled"; //$NON-NLS-1$
-	public static final String TASK_TAG_NODE = SSECorePlugin.ID + IPath.SEPARATOR + "task-tags"; //$NON-NLS-1$
-	public static final String TASK_TAG_PER_PROJECT = "use-project-settings"; //$NON-NLS-1$
-	public static final String TASK_TAG_PRIORITIES = "taskPriorities"; //$NON-NLS-1$
-	public static final String TASK_TAG_TAGS = "taskTags"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/WorkspaceTaskScanner.java b/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/WorkspaceTaskScanner.java
deleted file mode 100644
index ad34bad..0000000
--- a/bundles/org.eclipse.wst.sse.core/src-tasktags/org/eclipse/wst/sse/core/internal/tasks/WorkspaceTaskScanner.java
+++ /dev/null
@@ -1,460 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.tasks;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IPreferencesService;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.tasks.IFileTaskScanner;
-import org.eclipse.wst.sse.core.internal.provisional.tasks.TaskTag;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-
-/**
- * Dispatcher for scanning based on deltas and requested projects
- */
-class WorkspaceTaskScanner {
-	private static WorkspaceTaskScanner _instance = null;
-	static final String SYNTHETIC_TASK = "org.eclipse.wst.sse.task-synthetic";
-	static final String MODIFICATION_STAMP = "org.eclipse.wst.sse.modification-stamp";
-
-	static synchronized WorkspaceTaskScanner getInstance() {
-		if (_instance == null) {
-			_instance = new WorkspaceTaskScanner();
-		}
-		return _instance;
-	}
-
-	final String DEFAULT_MARKER_TYPE = IFileTaskScanner.TASK_MARKER_ID;
-	private List fActiveScanners = null;
-	private IContentType[] fCurrentIgnoreContentTypes = null;
-	private TaskTag[] fCurrentTaskTags = null;
-
-	private FileTaskScannerRegistryReader registry = null;
-
-	private long time0;
-
-	/**
-	 * 
-	 */
-	private WorkspaceTaskScanner() {
-		super();
-		registry = FileTaskScannerRegistryReader.getInstance();
-		fActiveScanners = new ArrayList();
-		fCurrentTaskTags = new TaskTag[0];
-		fCurrentIgnoreContentTypes = new IContentType[0];
-	}
-
-	private IContentType[] detectContentTypes(IResource resource) {
-		IContentType[] types = null;
-		if (resource.getType() == IResource.FILE && resource.isAccessible()) {
-			types = Platform.getContentTypeManager().findContentTypesFor(resource.getName());
-			if (types.length == 0) {
-				IContentDescription d = null;
-				try {
-					// optimized description lookup, might not succeed
-					d = ((IFile) resource).getContentDescription();
-					if (d != null) {
-						types = new IContentType[]{d.getContentType()};
-					}
-				}
-				catch (CoreException e) {
-					/*
-					 * should not be possible given the accessible and file
-					 * type check above
-					 */
-				}
-			}
-			if (types == null) {
-				types = Platform.getContentTypeManager().findContentTypesFor(resource.getName());
-			}
-			if (Logger.DEBUG_TASKSCONTENTTYPE) {
-				if (types.length > 0) {
-					if (types.length > 1) {
-						System.out.println(resource.getFullPath() + ": " + "multiple based on name (probably hierarchical)"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					for (int i = 0; i < types.length; i++) {
-						System.out.println(resource.getFullPath() + " matched: " + types[i].getId()); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		return types;
-	}
-
-	/**
-	 * @param resource
-	 * @return
-	 */
-	private IProject getProject(IResource resource) {
-		IProject project = null;
-		if (resource.getType() == IResource.PROJECT) {
-			project = (IProject) resource;
-		}
-		else {
-			project = resource.getProject();
-		}
-		return project;
-	}
-
-	private boolean init(IResource resource) {
-		IProject project = getProject(resource);
-
-		IPreferencesService preferencesService = Platform.getPreferencesService();
-		IScopeContext[] lookupOrder = new IScopeContext[]{new ProjectScope(project), new InstanceScope(), new DefaultScope()};
-
-		boolean proceed = preferencesService.getBoolean(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_ENABLE, false, lookupOrder);
-
-		if (Logger.DEBUG_TASKSPREFS) {
-			System.out.println(getClass().getName() + " scan of " + resource.getFullPath() + ":" + proceed); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (proceed) {
-			String[] tags = StringUtils.unpack(preferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_TAGS, null, lookupOrder));
-			String[] priorities = StringUtils.unpack(preferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, null, lookupOrder));
-			String[] currentIgnoreContentTypeIDs = StringUtils.unpack(preferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED, null, lookupOrder));
-			if (Logger.DEBUG_TASKSPREFS) {
-				System.out.print(getClass().getName() + " tags: "); //$NON-NLS-1$
-				for (int i = 0; i < tags.length; i++) {
-					if (i > 0) {
-						System.out.print(","); //$NON-NLS-1$
-					}
-					System.out.print(tags[i]);
-				}
-				System.out.println();
-				System.out.print(getClass().getName() + " priorities: "); //$NON-NLS-1$
-				for (int i = 0; i < priorities.length; i++) {
-					if (i > 0) {
-						System.out.print(","); //$NON-NLS-1$
-					}
-					System.out.print(priorities[i]);
-				}
-				System.out.println();
-				System.out.print(getClass().getName() + " ignored content types: "); //$NON-NLS-1$
-				for (int i = 0; i < currentIgnoreContentTypeIDs.length; i++) {
-					if (i > 0) {
-						System.out.print(","); //$NON-NLS-1$
-					}
-					System.out.print(currentIgnoreContentTypeIDs[i]);
-				}
-				System.out.println();
-			}
-			fCurrentIgnoreContentTypes = new IContentType[currentIgnoreContentTypeIDs.length];
-			IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-			for (int i = 0; i < currentIgnoreContentTypeIDs.length; i++) {
-				fCurrentIgnoreContentTypes[i] = contentTypeManager.getContentType(currentIgnoreContentTypeIDs[i]);
-			}
-			int max = Math.min(tags.length, priorities.length);
-			fCurrentTaskTags = new TaskTag[max];
-			for (int i = 0; i < max; i++) {
-				int priority = TaskTag.PRIORITY_NORMAL;
-				try {
-					priority = Integer.parseInt(priorities[i]);
-				}
-				catch (NumberFormatException e) {
-					// default to normal priority
-				}
-				fCurrentTaskTags[i] = new TaskTag(tags[i], priority);
-			}
-		}
-		return proceed;
-	}
-
-	void internalScan(final IProject project, final IResource resource, final IProgressMonitor scanMonitor) {
-		if (scanMonitor.isCanceled())
-			return;
-		try {
-			String name = resource.getName();
-			if (resource.isAccessible() && !resource.isDerived() && !resource.isPhantom() && !resource.isTeamPrivateMember() && name.length() != 0 && name.charAt(0) != '.') {
-				if ((resource.getType() & IResource.FOLDER) > 0 || (resource.getType() & IResource.PROJECT) > 0) {
-					IResource[] children = ((IContainer) resource).members();
-					scanMonitor.beginTask("", children.length); //$NON-NLS-1$
-					for (int i = 0; i < children.length; i++) {
-						internalScan(project, children[i], new SubProgressMonitor(scanMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-					}
-					scanMonitor.done();
-				}
-				else if ((resource.getType() & IResource.FILE) > 0) {
-					scanFile(project, fCurrentTaskTags, (IFile) resource, scanMonitor);
-				}
-			}
-		}
-		catch (CoreException e) {
-			Logger.logException(e);
-		}
-	}
-
-	void internalScan(IResourceDelta delta, final IProgressMonitor monitor) {
-		if (monitor.isCanceled())
-			return;
-		try {
-			String name = delta.getFullPath().lastSegment();
-			IResource resource = delta.getResource();
-			if (!resource.isDerived() && !resource.isPhantom() && !resource.isTeamPrivateMember() && name.length() != 0 && name.charAt(0) != '.') {
-				if ((resource.getType() & IResource.FOLDER) > 0 || (resource.getType() & IResource.PROJECT) > 0) {
-					IResourceDelta[] children = delta.getAffectedChildren();
-					monitor.beginTask("", children.length);
-					if (name.length() != 0 && name.charAt(0) != '.' && children.length > 0) {
-						for (int i = children.length - 1; i >= 0; i--) {
-							internalScan(children[i], new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-						}
-					}
-					monitor.done();
-				}
-				else if ((resource.getType() & IResource.FILE) > 0) {
-					if ((delta.getKind() & IResourceDelta.ADDED) > 0 || ((delta.getKind() & IResourceDelta.CHANGED) > 0 && (delta.getFlags() & IResourceDelta.CONTENT) > 0)) {
-						IFile file = (IFile) resource;
-						scanFile(file.getProject(), fCurrentTaskTags, file, monitor);
-					}
-				}
-			}
-		}
-		catch (Exception e) {
-			Logger.logException(e);
-		}
-	}
-
-	private void replaceTaskMarkers(final IFile file, final String[] markerTypes, final Map markerAttributeMaps[], IProgressMonitor monitor) {
-		final IFile finalFile = file;
-		if (file.isAccessible()) {
-			try {
-				IWorkspaceRunnable r = new IWorkspaceRunnable() {
-					public void run(IProgressMonitor progressMonitor) throws CoreException {
-						progressMonitor.beginTask("", 2);//$NON-NLS-1$
-						try {
-							/*
-							 * Delete old Task markers (don't delete regular
-							 * Tasks since that includes user-defined ones)
-							 */
-							for (int i = 0; i < markerTypes.length; i++) {
-								if (IMarker.TASK.equals(markerTypes[i])) {
-									// only remove if synthetic
-									IMarker[] foundMarkers = file.findMarkers(markerTypes[i], true, IResource.DEPTH_ZERO);
-									for (int j = 0; j < foundMarkers.length; j++) {
-										if (foundMarkers[j].getAttribute(SYNTHETIC_TASK) != null) {
-											foundMarkers[j].delete();
-										}
-									}
-								}
-								else {
-									file.deleteMarkers(markerTypes[i], true, IResource.DEPTH_ZERO);
-								}
-							}
-						}
-						catch (CoreException e) {
-							Logger.logException("exception deleting old tasks", e); //$NON-NLS-1$ 
-						}
-						finally {
-							progressMonitor.worked(1);
-						}
-						if (markerAttributeMaps != null && markerAttributeMaps.length > 0) {
-							if (Logger.DEBUG_TASKS) {
-								System.out.println("" + markerAttributeMaps.length + " tasks for " + file.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$
-							}
-							for (int i = 0; i < markerAttributeMaps.length; i++) {
-								String specifiedMarkerType = (String) markerAttributeMaps[i].get(IMarker.TASK);
-								IMarker marker = finalFile.createMarker(specifiedMarkerType);
-								marker.setAttributes(markerAttributeMaps[i]);
-								marker.setAttribute(IMarker.USER_EDITABLE, Boolean.FALSE);
-								marker.setAttribute(MODIFICATION_STAMP, Long.toString(file.getModificationStamp()));
-								if (IMarker.TASK.equals(specifiedMarkerType)) {
-									// set to synthetic and make user editable
-									marker.setAttribute(SYNTHETIC_TASK, true);
-								}
-							}
-						}
-						progressMonitor.worked(1);
-						progressMonitor.done();
-					}
-				};
-				if (file.isAccessible()) {
-					finalFile.getWorkspace().run(r, ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(file), IWorkspace.AVOID_UPDATE, monitor);
-				}
-			}
-			catch (CoreException e1) {
-				Logger.logException(e1);
-			}
-			catch(OperationCanceledException e) {
-				// not an error condition
-			}
-		}
-	}
-
-	void scan(final IProject project, final IProgressMonitor scanMonitor) {
-		if (scanMonitor.isCanceled())
-			return;
-		if (Logger.DEBUG_TASKS) {
-			System.out.println(getClass().getName() + " scanning project " + project.getName()); //$NON-NLS-1$
-		}
-		if (!project.isAccessible()) {
-			if (Logger.DEBUG_TASKS) {
-				System.out.println(getClass().getName() + " skipping inaccessible project " + project.getName()); //$NON-NLS-1$
-			}
-			return;
-		}
-
-		if (Logger.DEBUG_TASKSOVERALLPERF) {
-			time0 = System.currentTimeMillis();
-		}
-		if (init(project)) {
-			internalScan(project, project, scanMonitor);
-			shutdownDelegates(project);
-		}
-		if (Logger.DEBUG_TASKSOVERALLPERF) {
-			System.out.println("" + (System.currentTimeMillis() - time0) + "ms for " + project.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-
-	void scan(IResourceDelta delta, final IProgressMonitor monitor) {
-		if (monitor.isCanceled())
-			return;
-		if (Logger.DEBUG_TASKSOVERALLPERF) {
-			time0 = System.currentTimeMillis();
-		}
-		if (init(delta.getResource())) {
-			internalScan(delta, monitor);
-			shutdownDelegates(delta.getResource().getProject());
-		}
-		if (Logger.DEBUG_TASKSOVERALLPERF) {
-			System.out.println("" + (System.currentTimeMillis() - time0) + "ms for " + delta.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	void scanFile(IProject project, TaskTag[] taskTags, IFile file, IProgressMonitor monitor) {
-		if (monitor.isCanceled())
-			return;
-
-		// 3 "stages"
-		monitor.beginTask("", 8);//$NON-NLS-1$
-		monitor.subTask(file.getFullPath().toString().substring(1));
-
-		List markerAttributes = null;
-		IContentType[] types = detectContentTypes(file);
-		Set markerTypes = new HashSet(3);
-		// Always included for safety and migration
-		markerTypes.add(DEFAULT_MARKER_TYPE);
-		monitor.worked(1);
-
-		IFileTaskScanner[] fileScanners = null;
-		if (types != null) {
-			if (fCurrentIgnoreContentTypes.length == 0) {
-				fileScanners = registry.getFileTaskScanners(types);
-			}
-			else {
-				List validTypes = new ArrayList();
-				// obtain a filtered list of delegates
-				for (int i = 0; i < types.length; i++) {
-					boolean ignoreContentType = false;
-					for (int j = 0; j < fCurrentIgnoreContentTypes.length; j++) {
-						ignoreContentType = ignoreContentType || types[i].isKindOf(fCurrentIgnoreContentTypes[j]);
-					}
-					if (!ignoreContentType) {
-						validTypes.add(types[i]);
-					}
-				}
-				fileScanners = registry.getFileTaskScanners((IContentType[]) validTypes.toArray(new IContentType[validTypes.size()]));
-			}
-			monitor.worked(1);
-
-			if (fileScanners.length > 0) {
-				IProgressMonitor scannerMonitor = new SubProgressMonitor(monitor, 3, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
-				scannerMonitor.beginTask("", fileScanners.length); //$NON-NLS-1$
-				for (int j = 0; fileScanners != null && j < fileScanners.length; j++) {
-					if (monitor.isCanceled())
-						continue;
-					try {
-						if (!fActiveScanners.contains(fileScanners[j]) && !monitor.isCanceled()) {
-							fileScanners[j].startup(file.getProject());
-							fActiveScanners.add(fileScanners[j]);
-						}
-						markerTypes.add(fileScanners[j].getMarkerType());
-						Map[] taskMarkerAttributes = fileScanners[j].scan(file, taskTags, new SubProgressMonitor(scannerMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-						/*
-						 * TODO: pool the marker results so there's only one
-						 * operation creating them
-						 */
-						for (int i = 0; i < taskMarkerAttributes.length; i++) {
-							if (markerAttributes == null) {
-								markerAttributes = new ArrayList();
-							}
-							if (!taskMarkerAttributes[i].containsKey(IMarker.TASK)) {
-								taskMarkerAttributes[i].put(IMarker.TASK, fileScanners[j].getMarkerType());
-							}
-							taskMarkerAttributes[i].put(IMarker.SOURCE_ID, fileScanners[j].getClass().getName());
-							markerAttributes.add(taskMarkerAttributes[i]);
-						}
-					}
-					catch (Exception e) {
-						Logger.logException(file.getFullPath().toString(), e);
-					}
-				}
-				scannerMonitor.done();
-			}
-		}
-		else {
-			monitor.worked(4);
-		}
-
-		if (monitor.isCanceled())
-			return;
-		// only update markers if we ran a scanner on this file
-		if (fileScanners != null && fileScanners.length > 0) {
-			IProgressMonitor markerUpdateMonitor = new SubProgressMonitor(monitor, 3, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
-			if (markerAttributes != null) {
-				replaceTaskMarkers(file, (String[]) markerTypes.toArray(new String[markerTypes.size()]), (Map[]) markerAttributes.toArray(new Map[markerAttributes.size()]), markerUpdateMonitor);
-			}
-		}
-		else {
-			monitor.worked(3);
-		}
-		monitor.done();
-	}
-
-	private void shutdownDelegates(IProject project) {
-		for (int j = 0; j < fActiveScanners.size(); j++) {
-			try {
-				((IFileTaskScanner) fActiveScanners.get(j)).shutdown(project);
-			}
-			catch (Exception e) {
-				Logger.logException(project.getFullPath().toString(), e);
-			}
-		}
-		fActiveScanners = new ArrayList(1);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/StructuredModelManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/StructuredModelManager.java
deleted file mode 100644
index 346f987..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/StructuredModelManager.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.internal.model.ModelManagerImpl;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.osgi.framework.Bundle;
-
-/**
- * Class to allow access to ModelManager. Not intended to be subclassed.
- * 
- * @since  1.5  org.eclipse.wst.sse.core
- */
-final public class StructuredModelManager {
-	/**
-	 * Do not allow instances to be created.
-	 */
-	private StructuredModelManager() {
-		super();
-	}
-
-	/**
-	 * Provides access to the instance of IModelManager. Returns null if model
-	 * manager can not be created or is not valid (such as, when workbench is
-	 * shutting down).
-	 * 
-	 * @return IModelManager - returns the one model manager for structured
-	 *         model
-	 */
-	public static IModelManager getModelManager() {
-		boolean isReady = false;
-		IModelManager modelManager = null;
-		while (!isReady) {
-			Bundle localBundle = Platform.getBundle(SSECorePlugin.ID);
-			int state = localBundle.getState();
-			if (state == Bundle.ACTIVE) {
-				isReady = true;
-				// getInstance is a synchronized static method.
-				modelManager = ModelManagerImpl.getInstance();
-			}
-			else if (state == Bundle.STARTING) {
-				try {
-					Thread.sleep(100);
-				}
-				catch (InterruptedException e) {
-					// ignore, just loop again
-				}
-			}
-			else if (state == Bundle.STOPPING || state == Bundle.UNINSTALLED) {
-				isReady = true;
-				modelManager = null;
-			}
-			else {
-				// not sure about other states, 'resolved', 'installed'
-				isReady = true;
-				modelManager = null;
-			}
-		}
-		return modelManager;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
deleted file mode 100644
index 0de5ec0..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
+++ /dev/null
@@ -1,808 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.eclipse.core.filebuffers.FileBuffers;
-import org.eclipse.core.filebuffers.IFileBuffer;
-import org.eclipse.core.filebuffers.IFileBufferListener;
-import org.eclipse.core.filebuffers.ITextFileBuffer;
-import org.eclipse.core.filebuffers.ITextFileBufferManager;
-import org.eclipse.core.filebuffers.LocationKind;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
-import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.model.AbstractStructuredModel;
-import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerRegistry;
-import org.eclipse.wst.sse.core.internal.provisional.IModelLoader;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-
-/**
- * Not intended to be subclassed, referenced or instantiated by clients.
- * 
- * This class is responsible for coordinating the creation and disposal of
- * structured models built on structured documents found in FileBuffers. It
- * allows the SSE Model Manager to act as a client to the
- * TextFileBufferManager.
- */
-public class FileBufferModelManager {
-
-	static class DocumentInfo {
-		/**
-		 * The ITextFileBuffer
-		 */
-		ITextFileBuffer buffer = null;
-
-		/**
-		 * The platform content-type ID of this document
-		 */
-		String contentTypeID = null;
-
-		/**
-		 * The IStructureModel containing this document; might be null at
-		 * points in the ITextFileBuffer's lifecycle
-		 */
-		IStructuredModel model = null;
-
-		/**
-		 * Whether FileBufferModelManager called connect() for this
-		 * DocumentInfo's text filebuffer
-		 */
-		boolean selfConnected = false;
-
-		int bufferReferenceCount = 0;
-		int modelReferenceCount = 0;
-
-		/**
-		 * The default value is the "compatibility" kind from before there was
-		 * a LocationKind hint object--this is expected to be overridden at
-		 * runtime.
-		 */
-		LocationKind locationKind = LocationKind.NORMALIZE;
-	}
-
-	/**
-	 * A URIResolver instance of models built on java.io.Files
-	 */
-	class ExternalURIResolver implements URIResolver {
-		IPath fLocation;
-
-		ExternalURIResolver(IPath location) {
-			fLocation = location;
-		}
-
-		public String getFileBaseLocation() {
-			return fLocation.toString();
-		}
-
-		public String getLocationByURI(String uri) {
-			return getLocationByURI(uri, getFileBaseLocation(), false);
-		}
-
-		public String getLocationByURI(String uri, boolean resolveCrossProjectLinks) {
-			return getLocationByURI(uri, getFileBaseLocation(), resolveCrossProjectLinks);
-		}
-
-		public String getLocationByURI(String uri, String baseReference) {
-			return getLocationByURI(uri, baseReference, false);
-		}
-
-		public String getLocationByURI(String uri, String baseReference, boolean resolveCrossProjectLinks) {
-			// ignore resolveCrossProjectLinks value
-			if (uri == null)
-				return null;
-			if (uri.startsWith("file:")) { //$NON-NLS-1$
-				try {
-					URL url = new URL(uri);
-					return url.getFile();
-				}
-				catch (MalformedURLException e) {
-				}
-			}
-			return URIHelper.normalize(uri, baseReference, Path.ROOT.toString());
-		}
-
-		public IProject getProject() {
-			return null;
-		}
-
-		public IContainer getRootLocation() {
-			return ResourcesPlugin.getWorkspace().getRoot();
-		}
-
-		public InputStream getURIStream(String uri) {
-			return null;
-		}
-
-		public void setFileBaseLocation(String newLocation) {
-			fLocation = new Path(newLocation);
-		}
-
-		public void setProject(IProject newProject) {
-		}
-	}
-
-	/**
-	 * A URIResolver instance of models built on the extensible WST URI
-	 * resolver
-	 */
-	class CommonURIResolver implements URIResolver {
-		String fLocation;
-		IPath fPath;
-		private IProject fProject;
-		final static String SEPARATOR = "/"; //$NON-NLS-1$ 
-		final static String FILE_PREFIX = "file://"; //$NON-NLS-1$
-
-		CommonURIResolver(IFile workspaceFile) {
-			fPath = workspaceFile.getFullPath();
-			fProject = workspaceFile.getProject();
-		}
-
-		public String getFileBaseLocation() {
-			return fLocation;
-		}
-
-		public String getLocationByURI(String uri) {
-			return getLocationByURI(uri, getFileBaseLocation(), false);
-		}
-
-		public String getLocationByURI(String uri, boolean resolveCrossProjectLinks) {
-			return getLocationByURI(uri, getFileBaseLocation(), resolveCrossProjectLinks);
-		}
-
-		public String getLocationByURI(String uri, String baseReference) {
-			return getLocationByURI(uri, baseReference, false);
-		}
-
-		public String getLocationByURI(String uri, String baseReference, boolean resolveCrossProjectLinks) {
-			boolean baseHasPrefix = baseReference != null && baseReference.startsWith(FILE_PREFIX);
-			String reference = null;
-			if (baseHasPrefix) {
-				reference = baseReference;
-			}
-			else {
-				reference = FILE_PREFIX + baseReference;
-			}
-			String result = URIResolverPlugin.createResolver().resolve(reference, null, uri);
-			// Logger.log(Logger.INFO_DEBUG,
-			// "URIResolverPlugin.createResolver().resolve("
-			// + reference + ", null, " +uri+") = " + result);
-			if (!baseHasPrefix && result.startsWith(FILE_PREFIX) && result.length() > FILE_PREFIX.length()) {
-				result = result.substring(FILE_PREFIX.length());
-			}
-			return result;
-		}
-
-		public IProject getProject() {
-			return fProject;
-		}
-
-		public IContainer getRootLocation() {
-			String root = URIResolverPlugin.createResolver().resolve(FILE_PREFIX + getFileBaseLocation(), null, SEPARATOR);
-			IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(root));
-			for (int i = 0; i < files.length; i++) {
-				if ((files[i].getType() & IResource.FOLDER) == IResource.FOLDER) {
-					if (fPath.isPrefixOf(((IFolder) files[i]).getFullPath())) {
-						return (IFolder) files[i];
-					}
-				}
-			}
-			return getProject();
-		}
-
-		public InputStream getURIStream(String uri) {
-			return null;
-		}
-
-		public void setFileBaseLocation(String newLocation) {
-			fLocation = newLocation;
-		}
-
-		public void setProject(IProject newProject) {
-			fProject = newProject;
-		}
-	}
-
-	/**
-	 * Maps interesting documents in file buffers to those file buffers.
-	 * Required to allows us to go from documents to complete models.
-	 */
-	class FileBufferMapper implements IFileBufferListener {
-		public void bufferContentAboutToBeReplaced(IFileBuffer buffer) {
-		}
-
-		public void bufferContentReplaced(IFileBuffer buffer) {
-		}
-
-		public void bufferCreated(IFileBuffer buffer) {
-			if (buffer instanceof ITextFileBuffer) {
-				ITextFileBuffer textBuffer = (ITextFileBuffer) buffer;
-				if (!(textBuffer.getDocument() instanceof IStructuredDocument))
-					return;
-				if (Logger.DEBUG_TEXTBUFFERLIFECYCLE) {
-					Logger.log(Logger.INFO, "Learned new buffer: " + buffer.getLocation().toString() + " " + buffer + " " + ((ITextFileBuffer) buffer).getDocument()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				DocumentInfo info = new DocumentInfo();
-				info.buffer = textBuffer;
-				info.contentTypeID = detectContentType(buffer.getLocation()).getId();
-				info.bufferReferenceCount++;
-				fDocumentMap.put(textBuffer.getDocument(), info);
-			}
-		}
-
-		public void bufferDisposed(IFileBuffer buffer) {
-			if (buffer instanceof ITextFileBuffer) {
-				ITextFileBuffer textBuffer = (ITextFileBuffer) buffer;
-				if (!(textBuffer.getDocument() instanceof IStructuredDocument))
-					return;
-				if (Logger.DEBUG_TEXTBUFFERLIFECYCLE) {
-					Logger.log(Logger.INFO, "Discarded buffer: " + buffer.getLocation().toString() + " " + buffer + " " + ((ITextFileBuffer) buffer).getDocument()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				DocumentInfo info = (DocumentInfo) fDocumentMap.get(textBuffer.getDocument());
-				if (info != null) {
-					info.bufferReferenceCount--;
-					if (info.bufferReferenceCount == 0 && info.modelReferenceCount == 0)
-						fDocumentMap.remove(textBuffer.getDocument());
-				}
-			}
-		}
-
-		public void dirtyStateChanged(IFileBuffer buffer, boolean isDirty) {
-			if (buffer instanceof ITextFileBuffer) {
-				if (Logger.DEBUG_TEXTBUFFERLIFECYCLE) {
-					Logger.log(Logger.INFO, "Buffer dirty state changed: (" + isDirty + ") " + buffer.getLocation().toString() + " " + buffer + " " + ((ITextFileBuffer) buffer).getDocument()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				}
-				ITextFileBuffer textBuffer = (ITextFileBuffer) buffer;
-				if (!(textBuffer.getDocument() instanceof IStructuredDocument))
-					return;
-				DocumentInfo info = (DocumentInfo) fDocumentMap.get(textBuffer.getDocument());
-				if (info != null && info.model != null) {
-					String msg = "Updating model dirty state for" + info.buffer.getLocation(); //$NON-NLS-1$
-					if (Logger.DEBUG_FILEBUFFERMODELMANAGEMENT || Logger.DEBUG_TEXTBUFFERLIFECYCLE) {
-						Logger.log(Logger.INFO, msg);
-					}
-					info.model.setDirtyState(isDirty);
-
-					IFile workspaceFile = FileBuffers.getWorkspaceFileAtLocation(info.buffer.getLocation());
-					if (!isDirty && workspaceFile != null) {
-						info.model.resetSynchronizationStamp(workspaceFile);
-					}
-				}
-			}
-		}
-
-		public void stateChangeFailed(IFileBuffer buffer) {
-		}
-
-		public void stateChanging(IFileBuffer buffer) {
-		}
-
-		public void stateValidationChanged(IFileBuffer buffer, boolean isStateValidated) {
-		}
-
-		public void underlyingFileDeleted(IFileBuffer buffer) {
-			if (buffer instanceof ITextFileBuffer) {
-				if (Logger.DEBUG_TEXTBUFFERLIFECYCLE) {
-					Logger.log(Logger.INFO, "Deleted buffer: " + buffer.getLocation().toOSString() + " " + buffer); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-
-		public void underlyingFileMoved(IFileBuffer buffer, IPath path) {
-			if (buffer instanceof ITextFileBuffer) {
-				if (Logger.DEBUG_TEXTBUFFERLIFECYCLE) {
-					Logger.log(Logger.INFO, "Moved buffer from: " + buffer.getLocation().toOSString() + " " + buffer); //$NON-NLS-1$ //$NON-NLS-2$
-					Logger.log(Logger.INFO, "Moved buffer to: " + path.toOSString() + " " + buffer); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-	}
-
-	private static FileBufferModelManager instance;
-
-	public static FileBufferModelManager getInstance() {
-		if (instance == null) {
-			instance = new FileBufferModelManager();
-		}
-		return instance;
-	}
-
-	static final void shutdown() {
-		if (instance != null) {
-			if (Logger.DEBUG_FILEBUFFERMODELMANAGEMENT) {
-				IDocument[] danglingDocuments = (IDocument[]) instance.fDocumentMap.keySet().toArray(new IDocument[0]);
-				for (int i = 0; i < danglingDocuments.length; i++) {
-					DocumentInfo info = (DocumentInfo) instance.fDocumentMap.get(danglingDocuments[i]);
-					if (info.modelReferenceCount > 0)
-						System.err.println("LEAKED MODEL: " + info.buffer.getLocation() + " " + (info.model != null ? info.model.getId() : null)); //$NON-NLS-1$ //$NON-NLS-2$
-					if (info.bufferReferenceCount > 0)
-						System.err.println("LEAKED BUFFER: " + info.buffer.getLocation() + " " + info.buffer.getDocument()); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			FileBuffers.getTextFileBufferManager().removeFileBufferListener(instance.fFileBufferListener);
-			instance = null;
-		}
-	}
-
-	static final void startup() {
-		getInstance();
-	}
-
-	// a map of IStructuredDocuments to DocumentInfo objects
-	Map fDocumentMap = null;
-
-	IFileBufferListener fFileBufferListener = null;
-
-	FileBufferModelManager() {
-		super();
-		fDocumentMap = new Hashtable(4);
-		FileBuffers.getTextFileBufferManager().addFileBufferListener(fFileBufferListener = new FileBufferMapper());
-	}
-
-	public String calculateId(IFile file) {
-		if (file == null) {
-			Exception iae = new IllegalArgumentException("can not calculate a model ID without an IFile"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return null;
-		}
-
-		String id = null;
-		IPath path = file.getFullPath();
-		if (path != null) {
-			/*
-			 * The ID of models must be the same as the normalized paths
-			 * stored in the underlying FileBuffers to retrieve them by common
-			 * ID later on. We chose the FileBuffer normalized path over the
-			 * previously used absolute IFile path because the buffers should
-			 * already exist before we build a model and we can't retrieve a
-			 * FileBuffer using the ID of a model that doesn't yet exist.
-			 */
-			id = FileBuffers.normalizeLocation(path).toString();
-		}
-		return id;
-
-	}
-
-
-	public String calculateId(IDocument document) {
-		if (document == null) {
-			Exception iae = new IllegalArgumentException("can not calculate a model ID without a document reference"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return null;
-		}
-
-		String id = null;
-		ITextFileBuffer buffer = getBuffer(document);
-		if (buffer != null) {
-			id = buffer.getLocation().toString();
-		}
-		return id;
-	}
-
-	/**
-	 * Registers "interest" in a document, or rather the file buffer that
-	 * backs it. Intentionally used to alter the reference count of the file
-	 * buffer so it is not accidentally disposed of.
-	 */
-	public boolean connect(IDocument document) {
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		if( info == null)
-			return false;
-		ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
-		IPath bufferLocation = info.buffer.getLocation();
-		boolean isOK = true;
-		try {
-			bufferManager.connect(bufferLocation, info.locationKind, null);
-		}
-		catch (CoreException e) {
-			Logger.logException(e);
-			isOK = false;
-		}
-		return isOK;
-	}
-
-	URIResolver createURIResolver(ITextFileBuffer buffer) {
-		IPath location = buffer.getLocation();
-		IFile workspaceFile = FileBuffers.getWorkspaceFileAtLocation(location);
-		URIResolver resolver = null;
-		if (workspaceFile != null) {
-			IProject project = workspaceFile.getProject();
-			resolver = (URIResolver) project.getAdapter(URIResolver.class);
-			if (resolver == null) {
-				resolver = new CommonURIResolver(workspaceFile);
-			}
-			
-			String baseLocation = null;
-			if (workspaceFile.getLocation() != null) {
-				baseLocation = workspaceFile.getLocation().toString();
-			}
-			if (baseLocation == null && workspaceFile.getLocationURI() != null) {
-				baseLocation = workspaceFile.getLocationURI().toString();
-			}
-			if (baseLocation == null) {
-				baseLocation = workspaceFile.getFullPath().toString();
-			}
-			resolver.setFileBaseLocation(baseLocation);
-		}
-		else {
-			resolver = new ExternalURIResolver(location);
-		}
-		return resolver;
-	}
-
-
-	IContentType detectContentType(IPath location) {
-		IContentType type = null;
-
-		IResource resource = FileBuffers.getWorkspaceFileAtLocation(location);
-		if (resource != null) {
-			if (resource.getType() == IResource.FILE && resource.isAccessible()) {
-				IContentDescription d = null;
-				try {
-					// Optimized description lookup, might not succeed
-					d = ((IFile) resource).getContentDescription();
-					if (d != null) {
-						type = d.getContentType();
-					}
-				}
-				catch (CoreException e) {
-					// Should not be possible given the accessible and file
-					// type check above
-				}
-				if (type == null) {
-					type = Platform.getContentTypeManager().findContentTypeFor(resource.getName());
-				}
-			}
-		}
-		else {
-			File file = FileBuffers.getSystemFileAtLocation(location);
-			if (file != null) {
-				InputStream input = null;
-				try {
-					input = new FileInputStream(file);
-					type = Platform.getContentTypeManager().findContentTypeFor(input, location.toOSString());
-				}
-				catch (FileNotFoundException e) {
-				}
-				catch (IOException e) {
-				}
-				finally {
-					if (input != null) {
-						try {
-							input.close();
-						}
-						catch (IOException e1) {
-						}
-					}
-				}
-				if (type == null) {
-					type = Platform.getContentTypeManager().findContentTypeFor(file.getName());
-				}
-			}
-		}
-		if (type == null) {
-			type = Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT);
-		}
-		return type;
-	}
-
-	/**
-	 * Deregisters "interest" in a document, or rather the file buffer that
-	 * backs it. Intentionally used to alter the reference count of the file
-	 * buffer so that it knows it can safely be disposed of.
-	 */
-	public boolean disconnect(IDocument document) {
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		if( info == null)
-			return false;
-		ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
-		IPath bufferLocation = info.buffer.getLocation();
-		boolean isOK = true;
-		try {
-			bufferManager.disconnect(bufferLocation, info.locationKind, null);
-		}
-		catch (CoreException e) {
-			Logger.logException(e);
-			isOK = false;
-		}
-		return isOK;
-	}
-
-	public ITextFileBuffer getBuffer(IDocument document) {
-		if (document == null) {
-			Exception iae = new IllegalArgumentException("can not get a buffer without a document reference"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return null;
-		}
-
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		if (info != null)
-			return info.buffer;
-		return null;
-	}
-
-	String getContentTypeID(IDocument document) {
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		if (info != null)
-			return info.contentTypeID;
-		return null;
-	}
-
-	IStructuredModel getModel(File file) {
-		if (file == null) {
-			Exception iae = new IllegalArgumentException("can not get/create a model without a java.io.File"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return null;
-		}
-
-		IStructuredModel model = null;
-		ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
-		try {
-			IPath location = new Path(file.getAbsolutePath());
-			if (Logger.DEBUG_FILEBUFFERMODELMANAGEMENT) {
-				Logger.log(Logger.INFO, "FileBufferModelManager connecting to File " + location); //$NON-NLS-1$
-			}
-			bufferManager.connect(location, LocationKind.LOCATION, getProgressMonitor());
-			ITextFileBuffer buffer = bufferManager.getTextFileBuffer(location, LocationKind.LOCATION);
-			if (buffer != null) {
-				DocumentInfo info = (DocumentInfo) fDocumentMap.get(buffer.getDocument());
-				if (info != null) {
-					/*
-					 * Note: "info" being null at this point is a slight
-					 * error.
-					 * 
-					 * The connect call from above (or at some time earlier in
-					 * the session) would have notified the FileBufferMapper
-					 * of the creation of the corresponding text buffer and
-					 * created the DocumentInfo object for
-					 * IStructuredDocuments.
-					 */
-					info.locationKind = LocationKind.LOCATION;
-					info.selfConnected = true;
-				}
-				/*
-				 * Check the document type. Although returning null for
-				 * unknown documents would be fair, try to get a model if
-				 * the document is at least a valid type.
-				 */
-				IDocument bufferDocument = buffer.getDocument();
-				if (bufferDocument instanceof IStructuredDocument) {
-					model = getModel((IStructuredDocument) bufferDocument);
-				}
-				else {
-					/*
-					 * 190768 - Quick diff marks do not disappear in the
-					 * vertical ruler of JavaScript editor and
-					 * 
-					 * 193805 - Changes are not thrown away when close
-					 * with no save for files with no structured model
-					 * associated with them (text files, javascript files,
-					 * etc) in web project
-					 */
-					bufferManager.disconnect(location, LocationKind.IFILE, getProgressMonitor());
-				}
-			}
-		}
-		catch (CoreException e) {
-			Logger.logException("Error getting model for " + file.getPath(), e); //$NON-NLS-1$
-		}
-		return model;
-	}
-
-	public IStructuredModel getModel(IFile file) {
-		if (file == null) {
-			Exception iae = new IllegalArgumentException("can not get/create a model without an IFile"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return null;
-		}
-
-		IStructuredModel model = null;
-		ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
-		try {
-			if (Logger.DEBUG_FILEBUFFERMODELMANAGEMENT) {
-				Logger.log(Logger.INFO, "FileBufferModelManager connecting to IFile " + file.getFullPath()); //$NON-NLS-1$
-			}
-			// see TextFileDocumentProvider#createFileInfo about why we use
-			// IFile#getFullPath
-			// here, not IFile#getLocation.
-			IPath location = file.getFullPath();
-			if (location != null) {
-				bufferManager.connect(location, LocationKind.IFILE, getProgressMonitor());
-				ITextFileBuffer buffer = bufferManager.getTextFileBuffer(location, LocationKind.IFILE);
-				if (buffer != null) {
-					DocumentInfo info = (DocumentInfo) fDocumentMap.get(buffer.getDocument());
-					if (info != null) {
-						/*
-						 * Note: "info" being null at this point is a slight
-						 * error.
-						 * 
-						 * The connect call from above (or at some time
-						 * earlier in the session) would have notified the
-						 * FileBufferMapper of the creation of the
-						 * corresponding text buffer and created the
-						 * DocumentInfo object for IStructuredDocuments.
-						 */
-						info.selfConnected = true;
-						info.locationKind = LocationKind.IFILE;
-					}
-					/*
-					 * Check the document type. Although returning null for
-					 * unknown documents would be fair, try to get a model if
-					 * the document is at least a valid type.
-					 */
-					IDocument bufferDocument = buffer.getDocument();
-					if (bufferDocument instanceof IStructuredDocument) {
-						model = getModel((IStructuredDocument) bufferDocument);
-					}
-					else {
-						/*
-						 * 190768 - Quick diff marks do not disappear in the
-						 * vertical ruler of JavaScript editor and
-						 * 
-						 * 193805 - Changes are not thrown away when close
-						 * with no save for files with no structured model
-						 * associated with them (text files, javascript files,
-						 * etc) in web project
-						 */
-						bufferManager.disconnect(location, LocationKind.IFILE, getProgressMonitor());
-					}
-				}
-			}
-		}
-		catch (CoreException e) {
-			Logger.logException("Error getting model for " + file.getFullPath(), e); //$NON-NLS-1$
-		}
-		return model;
-	}
-
-	public IStructuredModel getModel(IStructuredDocument document) {
-		if (document == null) {
-			Exception iae = new IllegalArgumentException("can not get/create a model without a document reference"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return null;
-		}
-
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		if (info != null && info.model == null) {
-			if (Logger.DEBUG_FILEBUFFERMODELMANAGEMENT) {
-				Logger.log(Logger.INFO, "FileBufferModelManager creating model for " + info.buffer.getLocation() + " " + info.buffer.getDocument()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			info.modelReferenceCount++;
-
-			IStructuredModel model = null;
-			IModelHandler handler = ModelHandlerRegistry.getInstance().getHandlerForContentTypeId(info.contentTypeID);
-			IModelLoader loader = handler.getModelLoader();
-			model = loader.createModel(document, info.buffer.getLocation().toString(), handler);
-			try {
-				info.model = model;
-				model.setId(info.buffer.getLocation().toString());
-				// handler now set by loader, for now
-				// model.setModelHandler(handler);
-				if (model instanceof AbstractStructuredModel) {
-					((AbstractStructuredModel) model).setContentTypeIdentifier(info.contentTypeID);
-				}
-				model.setResolver(createURIResolver(getBuffer(document)));
-				if (info.buffer.isDirty()) {
-					model.setDirtyState(true);
-				}
-			}
-			catch (ResourceInUse e) {
-				Logger.logException("attempted to create new model with existing ID", e); //$NON-NLS-1$
-				model = null;
-			}
-		}
-		if (info != null) {
-			return info.model;
-		}
-		return null;
-	}
-
-	/**
-	 * @return
-	 */
-	private IProgressMonitor getProgressMonitor() {
-		return new NullProgressMonitor();
-	}
-
-	public boolean isExistingBuffer(IDocument document) {
-		if (document == null) {
-			Exception iae = new IllegalArgumentException("can not check for an existing buffer without a document reference"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return false;
-		}
-
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		return info != null;
-	}
-
-	public void releaseModel(IDocument document) {
-		if (document == null) {
-			Exception iae = new IllegalArgumentException("can not release a model without a document reference"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return;
-		}
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		if (info != null) {
-			if (Logger.DEBUG_FILEBUFFERMODELMANAGEMENT) {
-				Logger.log(Logger.INFO, "FileBufferModelManager noticed full release of model for " + info.buffer.getLocation() + " " + info.buffer.getDocument()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			info.model = null;
-			info.modelReferenceCount--;
-			if (info.selfConnected) {
-				if (Logger.DEBUG_FILEBUFFERMODELMANAGEMENT) {
-					Logger.log(Logger.INFO, "FileBufferModelManager disconnecting from " + info.buffer.getLocation() + " " + info.buffer.getDocument()); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				IPath location = info.buffer.getLocation();
-				try {
-					FileBuffers.getTextFileBufferManager().disconnect(location, info.locationKind, getProgressMonitor());
-				}
-				catch (CoreException e) {
-					Logger.logException("Error releasing model for " + location, e); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	public void revert(IDocument document) {
-		if (document == null) {
-			Exception iae = new IllegalArgumentException("can not release a model without a document reference"); //$NON-NLS-1$ 
-			Logger.logException(iae);
-			return;
-		}
-		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
-		if (info == null) {
-			Logger.log(Logger.ERROR, "FileBufferModelManager was asked to revert a document but was not being managed"); //$NON-NLS-1$
-		}
-		else {
-			// get path just for potential error message
-			IPath location = info.buffer.getLocation();
-			try {
-				// ISSUE: in future, clients should provide progress monitor
-				info.buffer.revert(getProgressMonitor());
-			}
-			catch (CoreException e) {
-				// ISSUE: shoudl we not be re-throwing CoreExceptions? Or
-				// not catch them at all?
-				Logger.logException("Error reverting model for " + location, e); //$NON-NLS-1$
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/IExecutionDelegate.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/IExecutionDelegate.java
deleted file mode 100644
index 097eb6d..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/IExecutionDelegate.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-
-package org.eclipse.wst.sse.core.internal;
-
-
-public interface IExecutionDelegate {
-
-	void execute(Runnable runnable);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ILockable.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ILockable.java
deleted file mode 100644
index c8aa500..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ILockable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-
-package org.eclipse.wst.sse.core.internal;
-
-import org.eclipse.core.runtime.jobs.ILock;
-
-/**
- * 
- * Not API: not to be used or implemented by clients. This is a special
- * purpose interface to help guard some threading issues betweeen model and
- * document. Will be changed soon.
- *  
- */
-
-public interface ILockable {
-
-	ILock getLockObject();
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/JSPAwareAdapterFactory.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/JSPAwareAdapterFactory.java
deleted file mode 100644
index a9e2292..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/JSPAwareAdapterFactory.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-
-
-public interface JSPAwareAdapterFactory extends INodeAdapterFactory {
-
-	void initializeWith(EmbeddedTypeHandler embeddedContentType);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/Logger.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/Logger.java
deleted file mode 100644
index 6219ddc..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/Logger.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.Bundle;
-
-/**
- * Small convenience class to log messages to plugin's log file and also, if
- * desired, the console. This class should only be used by classes in this
- * plugin. Other plugins should make their own copy, with appropriate ID.
- */
-public class Logger {
-	private static final String PLUGIN_ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
-	/**
-	 * true if both platform and this plugin are in debug mode
-	 */
-	public static final boolean DEBUG = Platform.inDebugMode() && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/debug")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging adapter
-	 * notification time
-	 */
-	public static final boolean DEBUG_ADAPTERNOTIFICATIONTIME = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/dom/adapter/notification/time")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging structured
-	 * document
-	 */
-	public static final boolean DEBUG_DOCUMENT = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/structureddocument")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging file buffer
-	 * model management
-	 */
-	public static final boolean DEBUG_FILEBUFFERMODELMANAGEMENT = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/filebuffers/modelmanagement")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging formatting
-	 */
-	public static final boolean DEBUG_FORMAT = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/format")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging text buffer
-	 * lifecycle
-	 */
-	public static final boolean DEBUG_TEXTBUFFERLIFECYCLE = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/filebuffers/lifecycle")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging model
-	 * lifecycle
-	 */
-	public static final boolean DEBUG_LIFECYCLE = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/structuredmodel/lifecycle")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging model state
-	 */
-	public static final boolean DEBUG_MODELSTATE = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/structuredmodel/state")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging model lock
-	 * state
-	 */
-	public static final boolean DEBUG_MODELLOCK = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/structuredmodel/locks")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging model
-	 * manager
-	 */
-	public static final boolean DEBUG_MODELMANAGER = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/structuredmodel/modelmanager")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging task tags
-	 */
-	public static final boolean DEBUG_TASKS = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging task tags
-	 * content type detection
-	 */
-	public static final boolean DEBUG_TASKSCONTENTTYPE = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/detection")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging task tags
-	 * jobs
-	 */
-	public static final boolean DEBUG_TASKSJOB = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/job")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging task tags
-	 * overall performance
-	 */
-	public static final boolean DEBUG_TASKSOVERALLPERF = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/overalltime")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging task tags
-	 * performance
-	 */
-	public static final boolean DEBUG_TASKSPERF = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/time")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging task tags
-	 * preferences
-	 */
-	public static final boolean DEBUG_TASKSPREFS = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/preferences")); //$NON-NLS-1$ //$NON-NLS-2$
-	/**
-	 * true if platform and plugin are in debug mode and debugging task tags
-	 * registry
-	 */
-	public static final boolean DEBUG_TASKSREGISTRY = DEBUG && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/registry")); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/*
-	 * Keep our own copy in case we want to add other severity levels
-	 */
-	public static final int OK = IStatus.OK;
-	public static final int INFO = IStatus.INFO;
-	public static final int WARNING = IStatus.WARNING;
-	public static final int ERROR = IStatus.ERROR;
-
-	/**
-	 * Adds message to log.
-	 * 
-	 * @param level
-	 *            severity level of the message (OK, INFO, WARNING, ERROR,
-	 * @param message
-	 *            text to add to the log
-	 * @param exception
-	 *            exception thrown
-	 */
-	private static void _log(int level, String message, Throwable exception) {
-		message = (message != null) ? message : ""; //$NON-NLS-1$
-		Status statusObj = new Status(level, PLUGIN_ID, level, message, exception);
-		Bundle bundle = Platform.getBundle(PLUGIN_ID);
-		if (bundle != null)
-			Platform.getLog(bundle).log(statusObj);
-	}
-
-	/**
-	 * Write a message to the log with the given severity level
-	 * 
-	 * @param level
-	 *            ERROR, WARNING, INFO, OK
-	 * @param message
-	 *            message to add to the log
-	 */
-	public static void log(int level, String message) {
-		_log(level, message, null);
-	}
-
-	/**
-	 * Writes a message and exception to the log with the given severity level
-	 * 
-	 * @param level
-	 *            ERROR, WARNING, INFO, OK
-	 * @param message
-	 *            message to add to the log
-	 * @param exception
-	 *            exception to add to the log
-	 */
-	public static void log(int level, String message, Throwable exception) {
-		_log(level, message, exception);
-	}
-
-	/**
-	 * Writes the exception as an error in the log along with an accompanying
-	 * message
-	 * 
-	 * @param message
-	 *            message to add to the log
-	 * @param exception
-	 *            exception to add to the log
-	 */
-	public static void logException(String message, Throwable exception) {
-		_log(IStatus.ERROR, message, exception);
-	}
-
-	/**
-	 * Writes the exception as an error in the log
-	 * 
-	 * @param exception
-	 *            exception to add to the log
-	 */
-	public static void logException(Throwable exception) {
-		_log(IStatus.ERROR, exception.getMessage(), exception);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java
deleted file mode 100644
index 2b9025f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ModelManagerPluginRegistryReader.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.osgi.framework.Bundle;
-
-
-public class ModelManagerPluginRegistryReader {
-	private static ModelManagerPluginRegistryReader reader = null;
-
-	public synchronized static ModelManagerPluginRegistryReader getInstance() {
-		if (reader == null) {
-			reader = new ModelManagerPluginRegistryReader();
-		}
-		return reader;
-	}
-
-	protected final String ATTR_ADAPTERKEY = "adapterKeyClass"; //$NON-NLS-1$
-	protected final String ATTR_CLASS = "class"; //$NON-NLS-1$
-	protected final String ATTR_CONTENTTYPE = "type"; //$NON-NLS-1$
-	protected final String ATTR_REGISTERADAPTER = "registerAdapters"; //$NON-NLS-1$
-
-	protected final String EXTENSION_POINT_ID = "adaptOnCreateFactory"; //$NON-NLS-1$
-	protected final String TAG_NAME = "AdaptOnCreateFactory"; //$NON-NLS-1$
-
-	/**
-	 * XMLEditorPluginRegistryReader constructor comment.
-	 */
-	protected ModelManagerPluginRegistryReader() {
-		super();
-	}
-
-	public List getFactories(IDocumentTypeHandler handler) {
-		return loadRegistry(handler.getId());
-	}
-
-	public List getFactories(String type) {
-		return loadRegistry(type);
-	}
-
-	protected INodeAdapterFactory loadFactoryFromConfigurationElement(IConfigurationElement element, Object requesterType) {
-		INodeAdapterFactory factory = null;
-		if (element.getName().equals(TAG_NAME)) {
-			String contentType = element.getAttribute(ATTR_CONTENTTYPE);
-			if (!contentType.equals(requesterType))
-				return null;
-			String className = element.getAttribute(ATTR_CLASS);
-			String adapterKeyClass = element.getAttribute(ATTR_ADAPTERKEY);
-			String registerAdapters = element.getAttribute(ATTR_REGISTERADAPTER);
-
-			// if className is null, then no one defined the extension point
-			// for adapter factories
-			if (className != null) {
-				String name = element.getDeclaringExtension().getNamespace();
-				Bundle bundle = null;
-				try {
-					bundle = Platform.getBundle(name);
-				}
-				catch (Exception e) {
-					// if an error occurs here, its probably that the plugin
-					// could not be found/loaded
-					Logger.logException("Could not find bundle: " + name, e); //$NON-NLS-1$
-
-				}
-				if (bundle != null) {
-					boolean useExtendedConstructor = false;
-					boolean doRegisterAdapters = false;
-					Object adapterKey = null;
-
-					if (registerAdapters != null && registerAdapters.length() > 0 && Boolean.valueOf(registerAdapters).booleanValue()) {
-						doRegisterAdapters = true;
-					}
-					if (adapterKeyClass != null) {
-						try {
-							Class aClass = null;
-							// aClass = classLoader != null ?
-							// classLoader.loadClass(adapterKeyClass) :
-							// Class.forName(adapterKeyClass);
-							if (bundle.getState() != Bundle.UNINSTALLED) {
-								aClass = bundle.loadClass(adapterKeyClass);
-							}
-							else {
-								aClass = Class.forName(adapterKeyClass);
-							}
-							if (aClass != null) {
-								useExtendedConstructor = true;
-								adapterKey = aClass;
-							}
-							else {
-								adapterKey = adapterKeyClass;
-							}
-						}
-						catch (Exception anyErrors) {
-							adapterKey = adapterKeyClass;
-						}
-					}
-
-					try {
-						Class theClass = null;
-						// Class theClass = classLoader != null ?
-						// classLoader.loadClass(className) :
-						// Class.forName(className);
-						if (bundle.getState() != Bundle.UNINSTALLED) {
-							theClass = bundle.loadClass(className);
-						}
-						else {
-							theClass = Class.forName(className);
-						}
-						if (useExtendedConstructor) {
-							java.lang.reflect.Constructor[] ctors = theClass.getConstructors();
-							for (int i = 0; i < ctors.length; i++) {
-								Class[] paramTypes = ctors[i].getParameterTypes();
-								if (ctors[i].isAccessible() && paramTypes.length == 2 && paramTypes[0].equals(Object.class) && paramTypes[1].equals(boolean.class)) {
-									try {
-										factory = (INodeAdapterFactory) ctors[i].newInstance(new Object[]{adapterKey, new Boolean(doRegisterAdapters)});
-									}
-									catch (IllegalAccessException e) {
-										// log for now, unless we find reason
-										// not to
-										Logger.log(Logger.INFO, e.getMessage());
-									}
-									catch (IllegalArgumentException e) {
-										// log for now, unless we find reason
-										// not to
-										Logger.log(Logger.INFO, e.getMessage());
-									}
-									catch (InstantiationException e) {
-										// log for now, unless we find reason
-										// not to
-										Logger.log(Logger.INFO, e.getMessage());
-									}
-									catch (InvocationTargetException e) {
-										// log for now, unless we find reason
-										// not to
-										Logger.log(Logger.INFO, e.getMessage());
-									}
-									catch (ExceptionInInitializerError e) {
-										// log or now, unless we find reason
-										// not to
-										Logger.log(Logger.INFO, e.getMessage());
-									}
-								}
-							}
-						}
-						if (factory == null) {
-							factory = (INodeAdapterFactory) element.createExecutableExtension(ATTR_CLASS);
-						}
-					}
-					catch (ClassNotFoundException e) {
-						// log or now, unless we find reason not to
-						Logger.log(Logger.INFO, e.getMessage());
-					}
-					catch (CoreException e) {
-						// log or now, unless we find reason not to
-						Logger.log(Logger.INFO, e.getMessage());
-					}
-				}
-			}
-		}
-		return factory;
-	}
-
-	protected List loadRegistry(Object contentType) {
-		List factoryList = new Vector();
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(SSECorePlugin.ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				INodeAdapterFactory factory = loadFactoryFromConfigurationElement(elements[i], contentType);
-				if (factory != null)
-					factoryList.add(factory);
-			}
-		}
-		return factoryList;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NoCancelProgressMonitor.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NoCancelProgressMonitor.java
deleted file mode 100644
index c9f129f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NoCancelProgressMonitor.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-
-package org.eclipse.wst.sse.core.internal;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-
-public class NoCancelProgressMonitor extends NullProgressMonitor {
-
-
-	public NoCancelProgressMonitor() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IProgressMonitor#isCanceled()
-	 */
-	public boolean isCanceled() {
-
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NotImplementedException.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NotImplementedException.java
deleted file mode 100644
index 3a0b985..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NotImplementedException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-
-public class NotImplementedException extends RuntimeException {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
-
-	public NotImplementedException() {
-		super();
-	}
-
-	public NotImplementedException(String message) {
-		super(message);
-	}
-
-	public NotImplementedException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	public NotImplementedException(Throwable cause) {
-		super(cause);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NullMemento.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NullMemento.java
deleted file mode 100644
index 9da4305..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/NullMemento.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.NonContentBasedEncodingRules;
-
-
-
-/**
- * This class can be used in place of an EncodingMemento (its super class),
- * when there is not in fact ANY encoding information. For example, when a
- * structuredDocument is created directly from a String
- */
-public class NullMemento extends EncodingMemento {
-	/**
-	 *  
-	 */
-	public NullMemento() {
-		super();
-		String defaultCharset = NonContentBasedEncodingRules.useDefaultNameRules(null);
-		setJavaCharsetName(defaultCharset);
-		setAppropriateDefault(defaultCharset);
-		setDetectedCharsetName(null);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/PropagatingAdapter.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/PropagatingAdapter.java
deleted file mode 100644
index 401c484..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/PropagatingAdapter.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-public interface PropagatingAdapter extends INodeAdapter {
-
-	void addAdaptOnCreateFactory(INodeAdapterFactory factory);
-
-	List getAdaptOnCreateFactories();
-
-	/**
-	 * This method should be called immediately after adding a factory,
-	 * typically on the document (top level) node, so all nodes can be
-	 * adapted, if needed. This is needed for those occasions when a factory
-	 * is addeded after some nodes may have already been created at the time
-	 * the factory is added.
-	 */
-	void initializeForFactory(INodeAdapterFactory factory, INodeNotifier node);
-
-	// dmw: should have getFactoryFor?
-	void release();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/PropagatingAdapterFactory.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/PropagatingAdapterFactory.java
deleted file mode 100644
index 70c84da..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/PropagatingAdapterFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-
-
-import java.util.ArrayList;
-
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-
-
-
-public interface PropagatingAdapterFactory extends INodeAdapterFactory {
-
-	void addContributedFactories(INodeAdapterFactory factory);
-
-	void setContributedFactories(ArrayList list);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECoreMessages.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECoreMessages.java
deleted file mode 100644
index 15fd1aa..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECoreMessages.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Strings used by SSE Core
- * 
- * @plannedfor 1.0
- */
-public class SSECoreMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.sse.core.internal.SSECorePluginResources";//$NON-NLS-1$
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, SSECoreMessages.class);
-	}
-
-	private SSECoreMessages() {
-		// cannot create new instance
-	}
-
-	public static String A_model_s_id_can_not_be_nu_EXC_;
-	public static String Program_Error__ModelManage_EXC_;
-	public static String Original_Error__UI_;
-	public static String Text_Change_UI_;
-	public static String TaskScanner_0;
-	public static String TaskScanningJob_0;
-	public static String TaskScanningJob_1;
-	public static String Migrate_Charset;
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECorePlugin.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECorePlugin.java
deleted file mode 100644
index bb4e8f3..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECorePlugin.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal;
-
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
-import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerRegistry;
-import org.eclipse.wst.sse.core.internal.preferences.CommonModelPreferenceNames;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * SSE Core Plugin.
- */
-public class SSECorePlugin extends Plugin {
-	static SSECorePlugin instance = null;
-
-	public static final String ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
-
-	public static SSECorePlugin getDefault() {
-		return instance;
-	}
-
-	public SSECorePlugin() {
-		super();
-		instance = this;
-	}
-
-	/**
-	 * Set default non-UI
-	 */
-	protected void initializeDefaultPluginPreferences() {
-		Preferences prefs = getDefault().getPluginPreferences();
-		// set model preference defaults
-
-		prefs.setDefault(CommonEncodingPreferenceNames.USE_3BYTE_BOM_WITH_UTF8, false);
-		
-		prefs.setDefault(CommonModelPreferenceNames.TASK_TAG_ENABLE, false);
-		prefs.setDefault(CommonModelPreferenceNames.TASK_TAG_TAGS, "TODO,FIXME,XXX"); //$NON-NLS-1$
-		prefs.setDefault(CommonModelPreferenceNames.TASK_TAG_PRIORITIES, "1,2,1"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		savePluginPreferences();
-		FileBufferModelManager.shutdown();
-
-		super.stop(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		// initialize FileBuffer handling
-		FileBufferModelManager.startup();
-	}
-
-	/**
-	 * @deprecated
-	 */
-	public ModelHandlerRegistry getModelHandlerRegistry() {
-		return ModelHandlerRegistry.getInstance();
-	}
-
-	/**
-	 * @deprecated - use StructuredModelManager.getModelManager();
-	 */
-	public IModelManager getModelManager() {
-		return StructuredModelManager.getModelManager();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECorePluginResources.properties b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECorePluginResources.properties
deleted file mode 100644
index b6f01f8..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/SSECorePluginResources.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Jens Lukowski/Innoopract - initial renaming/restructuring
-#
-###############################################################################
-A_model_s_id_can_not_be_nu_EXC_=A model's id can not be null
-Program_Error__ModelManage_EXC_=Program Error: ModelManagerImpl::saveModel. Model should be in the cache
-Original_Error__UI_=Original Error:
-Text_Change_UI_=Text Change
-TaskScanner_0=Scanning for Tasks
-TaskScanningJob_0=Scanning
-TaskScanningJob_1=Errors while detecting Tasks
-###############################################################################
-Migrate_Charset=Migrate Charset
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/AbstractStructuredCleanupProcessor.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/AbstractStructuredCleanupProcessor.java
deleted file mode 100644
index f525d5f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/AbstractStructuredCleanupProcessor.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.cleanup;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Map;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.DocumentRewriteSession;
-import org.eclipse.jface.text.DocumentRewriteSessionType;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension4;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.TextUtilities;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
-
-
-public abstract class AbstractStructuredCleanupProcessor implements IStructuredCleanupProcessor {
-	public boolean refreshCleanupPreferences = true; // special flag for JUnit
-
-	// tests to skip refresh
-	// of cleanup preferences
-	// when it's set to false
-
-	public String cleanupContent(String input) throws IOException, CoreException {
-		IStructuredModel structuredModel = null;
-		InputStream inputStream = null;
-		try {
-			// setup structuredModel
-			inputStream = new ByteArrayInputStream(input.getBytes("UTF8")); //$NON-NLS-1$
-			String id = inputStream.toString() + getContentType();
-			structuredModel = StructuredModelManager.getModelManager().getModelForRead(id, inputStream, null);
-
-			// cleanup
-			cleanupModel(structuredModel, 0, structuredModel.getStructuredDocument().getLength());
-
-			// return output
-			return structuredModel.getStructuredDocument().get();
-		} finally {
-			ensureClosed(null, inputStream);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromRead();
-		}
-	}
-
-	public String cleanupContent(String input, int start, int length) throws IOException, CoreException {
-		IStructuredModel structuredModel = null;
-		InputStream inputStream = null;
-		try {
-			// setup structuredModel
-			inputStream = new ByteArrayInputStream(input.getBytes("UTF8")); //$NON-NLS-1$
-			String id = inputStream.toString() + getContentType();
-			structuredModel = StructuredModelManager.getModelManager().getModelForRead(id, inputStream, null);
-
-			// cleanup
-			cleanupModel(structuredModel, start, length);
-
-			// return output
-			return structuredModel.getStructuredDocument().get();
-		} finally {
-			ensureClosed(null, inputStream);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromRead();
-		}
-	}
-
-	public void cleanupDocument(IDocument document) throws IOException, CoreException {
-		if (document == null)
-			return;
-
-		IStructuredModel structuredModel = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			// Note: We are getting model for edit. Will save model if model
-			// changed.
-			structuredModel = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
-
-			// cleanup
-			cleanupModel(structuredModel);
-
-			// save model if needed
-			if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-				structuredModel.save();
-		} finally {
-			// ensureClosed(outputStream, null);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromEdit();
-		}
-	}
-
-	public void cleanupDocument(IDocument document, int start, int length) throws IOException, CoreException {
-		if (document == null)
-			return;
-
-		if (start >= 0 && length >= 0 && start + length <= document.getLength()) {
-			IStructuredModel structuredModel = null;
-			// OutputStream outputStream = null;
-			try {
-				// setup structuredModel
-				// Note: We are getting model for edit. Will save model if
-				// model changed.
-				structuredModel = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
-
-				// cleanup
-				cleanupModel(structuredModel, start, length);
-
-				// save model if needed
-				if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-					structuredModel.save();
-			} finally {
-				// ensureClosed(outputStream, null);
-				// release from model manager
-				if (structuredModel != null)
-					structuredModel.releaseFromEdit();
-			}
-		}
-	}
-
-	public void cleanupFile(IFile file) throws IOException, CoreException {
-		IStructuredModel structuredModel = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			structuredModel = StructuredModelManager.getModelManager().getModelForRead(file);
-
-			// cleanup
-			cleanupModel(structuredModel, 0, structuredModel.getStructuredDocument().getLength());
-
-			// save output to file
-			// outputStream = new
-			// FileOutputStream(file.getLocation().toString());
-			structuredModel.save(file);
-		} finally {
-			// ensureClosed(outputStream, null);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromRead();
-		}
-	}
-
-	public void cleanupFile(IFile file, int start, int length) throws IOException, CoreException {
-		IStructuredModel structuredModel = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			structuredModel = StructuredModelManager.getModelManager().getModelForRead(file);
-
-			// cleanup
-			cleanupModel(structuredModel, start, length);
-
-			// save output to file
-			// outputStream = new
-			// FileOutputStream(file.getLocation().toString());
-			structuredModel.save(file);
-		} finally {
-			// ensureClosed(outputStream, null);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromRead();
-		}
-	}
-
-	public void cleanupFileName(String fileName) throws IOException, CoreException {
-		IStructuredModel structuredModel = null;
-		InputStream inputStream = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			inputStream = new FileInputStream(fileName);
-			structuredModel = StructuredModelManager.getModelManager().getModelForRead(fileName, inputStream, null);
-
-			// cleanup
-			cleanupModel(structuredModel, 0, structuredModel.getStructuredDocument().getLength());
-
-			// save output to file
-			// outputStream = new FileOutputStream(fileName);
-			structuredModel.save();
-		} finally {
-			// ensureClosed(outputStream, inputStream);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromRead();
-		}
-	}
-
-	public void cleanupFileName(String fileName, int start, int length) throws IOException, CoreException {
-		IStructuredModel structuredModel = null;
-		InputStream inputStream = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			inputStream = new FileInputStream(fileName);
-			structuredModel = StructuredModelManager.getModelManager().getModelForRead(fileName, inputStream, null);
-
-			// cleanup
-			cleanupModel(structuredModel, start, length);
-
-			// save output to file
-			// outputStream = new FileOutputStream(fileName);
-			structuredModel.save();
-		} finally {
-			// ensureClosed(outputStream, inputStream);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromRead();
-		}
-	}
-
-	public void cleanupModel(IStructuredModel structuredModel) {
-
-		int start = 0;
-		int length = structuredModel.getStructuredDocument().getLength();
-		cleanupModel(structuredModel, start, length);
-	}
-
-	public void cleanupModel(IStructuredModel structuredModel, int start, int length) {
-
-		if (structuredModel != null) {
-			if ((start >= 0) && (length <= structuredModel.getStructuredDocument().getLength())) {
-				Vector activeNodes = getActiveNodes(structuredModel, start, length);
-				if (activeNodes.size() > 0) {
-					Node firstNode = (Node) activeNodes.firstElement();
-					Node lastNode = (Node) activeNodes.lastElement();
-					boolean done = false;
-					Node eachNode = firstNode;
-					Node nextNode = null;
-
-					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=123621
-					// if doing any sort of cleanup, set up rewrite session/modelchanged
-					IDocumentExtension4 docExt4 = null;
-					if (structuredModel.getStructuredDocument() instanceof IDocumentExtension4) {
-						docExt4 = (IDocumentExtension4) structuredModel.getStructuredDocument();
-					}
-					DocumentRewriteSession rewriteSession = null;
-
-					try {
-						// whenever formatting model, fire
-						// abouttochange/modelchanged
-						structuredModel.aboutToChangeModel();
-						rewriteSession = (docExt4 == null || docExt4.getActiveRewriteSession() != null) ? null : docExt4.startRewriteSession(DocumentRewriteSessionType.UNRESTRICTED);
-
-						while (!done) {
-							// update "done"
-							done = (eachNode == lastNode);
-
-						// get next sibling before cleanup because eachNode
-							// may
-							// be deleted,
-							// for example when it's an empty text node
-							nextNode = eachNode.getNextSibling();
-
-							// cleanup selected node(s)
-							cleanupNode(eachNode);
-
-							// update each node
-							if (nextNode != null && nextNode.getParentNode() == null)
-								// nextNode is deleted during cleanup
-								eachNode = eachNode.getNextSibling();
-							else
-								eachNode = nextNode;
-
-							// This should not be needed, but just in case
-							// something went wrong with with eachNode.
-							// We don't want an infinite loop here.
-							if (eachNode == null)
-								done = true;
-						}
-
-						// format source
-						if (getFormatSourcePreference(structuredModel)) {
-							// format the document
-							IStructuredFormatProcessor formatProcessor = getFormatProcessor();
-							formatProcessor.formatModel(structuredModel);
-						}
-					}
-					finally {
-						// we need two finally's, just in case first fails
-						try {
-							if ((docExt4 != null) && (rewriteSession != null))
-								docExt4.stopRewriteSession(rewriteSession);
-						}
-						finally {
-							// always make sure to fire changedmodel when done
-							structuredModel.changedModel();
-						}
-					}
-				}
-			}
-		}
-	}
-
-	public void cleanupNode(Node node) {
-		if (node != null) {
-			Node cleanupNode = node;
-
-			// cleanup the owner node if it's an attribute node
-			if (cleanupNode.getNodeType() == Node.ATTRIBUTE_NODE)
-				cleanupNode = ((Attr) cleanupNode).getOwnerElement();
-
-			// refresh cleanup preferences before getting cleanup handler
-			if (refreshCleanupPreferences)
-				refreshCleanupPreferences();
-
-			// get cleanup handler
-			IStructuredCleanupHandler cleanupHandler = getCleanupHandler(cleanupNode);
-			if (cleanupHandler != null) {
-				// cleanup each node
-				cleanupHandler.cleanup(cleanupNode);
-			}
-		}
-	}
-
-	protected void convertLineDelimiters(IDocument document, String newDelimiter) {
-		final int lineCount = document.getNumberOfLines();
-		Map partitioners = TextUtilities.removeDocumentPartitioners(document);
-		try {
-			for (int i = 0; i < lineCount; i++) {
-				final String delimiter = document.getLineDelimiter(i);
-				if (delimiter != null && delimiter.length() > 0 && !delimiter.equals(newDelimiter)) {
-					IRegion region = document.getLineInformation(i);
-					document.replace(region.getOffset() + region.getLength(), delimiter.length(), newDelimiter);
-				}
-			}
-		} catch (BadLocationException e) {
-			Logger.logException(e);
-		} finally {
-			TextUtilities.addDocumentPartitioners(document, partitioners);
-		}
-	}
-
-	protected void ensureClosed(OutputStream outputStream, InputStream inputStream) {
-		try {
-			if (inputStream != null) {
-				inputStream.close();
-			}
-		} catch (IOException e) {
-			Logger.logException(e); // hopeless
-		}
-		try {
-			if (outputStream != null) {
-				outputStream.close();
-			}
-		} catch (IOException e) {
-			Logger.logException(e); // hopeless
-		}
-	}
-
-	protected Vector getActiveNodes(IStructuredModel structuredModel, int startNodeOffset, int length) {
-		Vector activeNodes = new Vector();
-
-		if (structuredModel != null) {
-			Node startNode = (Node) structuredModel.getIndexedRegion(startNodeOffset);
-			Node endNode = (Node) structuredModel.getIndexedRegion(startNodeOffset + length);
-
-			// make sure it's an non-empty document
-			if (startNode != null) {
-				while (isSiblingOf(startNode, endNode) == false) {
-					if (endNode != null)
-						endNode = endNode.getParentNode();
-					if (endNode == null) {
-						startNode = startNode.getParentNode();
-						endNode = (Node) structuredModel.getIndexedRegion(startNodeOffset + length);
-					}
-				}
-
-				while (startNode != endNode) {
-					activeNodes.addElement(startNode);
-					startNode = startNode.getNextSibling();
-				}
-				if (startNode != null)
-					activeNodes.addElement(startNode);
-			}
-		}
-
-		return activeNodes;
-	}
-
-	abstract protected IStructuredCleanupHandler getCleanupHandler(Node node);
-
-	abstract protected String getContentType();
-
-	protected boolean getConvertEOLCodesPreference(IStructuredModel structuredModel) {
-
-		boolean convertEOLCodes = true;
-		IStructuredCleanupHandler cleanupHandler = getCleanupHandler((Node) structuredModel.getIndexedRegion(0));
-		if (cleanupHandler != null) {
-			IStructuredCleanupPreferences cleanupPreferences = cleanupHandler.getCleanupPreferences();
-			convertEOLCodes = cleanupPreferences.getConvertEOLCodes();
-		}
-		return convertEOLCodes;
-	}
-
-	protected String getEOLCodePreference(IStructuredModel structuredModel) {
-
-		IScopeContext[] scopeContext = new IScopeContext[]{new InstanceScope()};
-		String eolCode = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, null, scopeContext);
-
-		IStructuredCleanupHandler cleanupHandler = getCleanupHandler((Node) structuredModel.getIndexedRegion(0));
-		if (cleanupHandler != null) {
-			IStructuredCleanupPreferences cleanupPreferences = cleanupHandler.getCleanupPreferences();
-			eolCode = cleanupPreferences.getEOLCode();
-		}
-		return eolCode;
-	}
-
-	abstract protected IStructuredFormatProcessor getFormatProcessor();
-
-	protected boolean getFormatSourcePreference(IStructuredModel structuredModel) {
-
-		boolean formatSource = true;
-		IStructuredCleanupHandler cleanupHandler = getCleanupHandler((Node) structuredModel.getIndexedRegion(0));
-		if (cleanupHandler != null) {
-			IStructuredCleanupPreferences cleanupPreferences = cleanupHandler.getCleanupPreferences();
-			formatSource = cleanupPreferences.getFormatSource();
-		}
-		return formatSource;
-	}
-
-	protected boolean isSiblingOf(Node node, Node endNode) {
-		if (endNode == null) {
-			return true;
-		} else {
-			Node siblingNode = node;
-			while (siblingNode != null) {
-				if (siblingNode == endNode)
-					return true;
-				else
-					siblingNode = siblingNode.getNextSibling();
-			}
-			return false;
-		}
-	}
-
-	abstract protected void refreshCleanupPreferences();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupHandler.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupHandler.java
deleted file mode 100644
index 4f98956..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupHandler.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.cleanup;
-
-import org.w3c.dom.Node;
-
-public interface IStructuredCleanupHandler {
-	Node cleanup(Node node);
-
-	IStructuredCleanupPreferences getCleanupPreferences();
-
-	void setCleanupPreferences(IStructuredCleanupPreferences cleanupPreferences);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupPreferences.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupPreferences.java
deleted file mode 100644
index 7f5058d..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupPreferences.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.cleanup;
-
-import org.eclipse.core.runtime.Preferences;
-
-public interface IStructuredCleanupPreferences {
-
-	int getAttrNameCase();
-
-	boolean getCompressEmptyElementTags();
-
-	boolean getConvertEOLCodes();
-
-	String getEOLCode();
-
-	boolean getFormatSource();
-
-	boolean getInsertMissingTags();
-
-	boolean getInsertRequiredAttrs();
-
-	boolean getQuoteAttrValues();
-
-	int getTagNameCase();
-
-	void setAttrNameCase(int attrNameCase);
-
-	void setCompressEmptyElementTags(boolean compressEmptyElementTags);
-
-	void setConvertEOLCodes(boolean convertEOLCodes);
-
-	void setEOLCode(String EOLCode);
-
-	void setFormatSource(boolean formatSource);
-
-	void setInsertMissingTags(boolean insertMissingTags);
-
-	void setInsertRequiredAttrs(boolean insertRequiredAttrs);
-
-	void setPreferences(Preferences preferences);
-
-	void setQuoteAttrValues(boolean quoteAttrValues);
-
-	void setTagNameCase(int tagNameCase);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupProcessor.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupProcessor.java
deleted file mode 100644
index 27bce4c..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/IStructuredCleanupProcessor.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.cleanup;
-
-import java.io.IOException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Node;
-
-/**
- * This interface and related classes are 'internal' and should not 
- * be treated as API, even though used across components in WTP. 
- * Consider it a work in progress.
- */
-
-public interface IStructuredCleanupProcessor {
-	/**
-	 * This form of the CleanupProcessor takes an input string as input,
-	 * creates an InputStream from the input string, create a temporary model
-	 * of the content type specified, cleanups the whole model, then returns
-	 * the cleaned up input string.
-	 */
-	String cleanupContent(String content) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes an input string as input,
-	 * creates an InputStream from the input string, create a temporary model
-	 * of the content type specified, cleanups the model within start and
-	 * length, then returns the cleaned up input string.
-	 */
-	String cleanupContent(String content, int start, int length) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes an IDocument as input, creates
-	 * a temporary model of content type calculated using the IDocument's file
-	 * extension, cleanups the whole model, then releases the model.
-	 */
-	void cleanupDocument(IDocument document) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes an IDocument as input, creates
-	 * a temporary model of content type calculated using the IDocument's file
-	 * extension, cleanups the model within start and length, then releases
-	 * the model.
-	 */
-	void cleanupDocument(IDocument document, int start, int length) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes an IFile as input, creates a
-	 * temporary model of content type calculated using the IFile's file
-	 * extension, cleanups the whole model, then releases the model. The IFile
-	 * is updated when the last reference of the model is released in the
-	 * model manager.
-	 */
-	void cleanupFile(IFile file) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes an IFile as input, creates a
-	 * temporary model of content type calculated using the IFile's file
-	 * extension, cleanups the model within start and length, then releases
-	 * the model. The IFile is updated when the last reference of the model is
-	 * released in the model manager.
-	 */
-	void cleanupFile(IFile file, int start, int length) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes a file name as input,creates an
-	 * InputStream from the file, create a temporary model of content type
-	 * calculated using the file name's file extension, cleanups the whole
-	 * model, then releases the model. The file is updated when the last
-	 * reference of the model is released in the model manager.
-	 */
-	void cleanupFileName(String fileName) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes a file name as input,creates an
-	 * InputStream from the file, create a temporary model of content type
-	 * calculated using the file name's file extension, cleanups the model
-	 * within start and length, then releases the model. The file is updated
-	 * when the last reference of the model is released in the model manager.
-	 */
-	void cleanupFileName(String fileName, int start, int length) throws IOException, CoreException;
-
-	/**
-	 * This form of the CleanupProcessor takes a model as input, and cleanups
-	 * the whole model.
-	 */
-	void cleanupModel(IStructuredModel structuredModel);
-
-	/**
-	 * This form of the CleanupProcessor takes a model as input, and cleanups
-	 * the model within start and length.
-	 */
-	void cleanupModel(IStructuredModel structuredModel, int start, int length);
-
-	/**
-	 * This form of the CleanupProcessor takes a node as input, and formats
-	 * the node and all its children.
-	 */
-	void cleanupNode(Node node);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredCleanupPreferences.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredCleanupPreferences.java
deleted file mode 100644
index a834418..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredCleanupPreferences.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.cleanup;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-
-
-public class StructuredCleanupPreferences implements IStructuredCleanupPreferences {
-	private int fAttrNameCase;
-	private boolean fCompressEmptyElementTags;
-	private boolean fConvertEOLCodes;
-	private String fEOLCode;
-	private boolean fFormatSource;
-	private boolean fInsertMissingTags;
-	private boolean fInsertRequiredAttrs;
-	//private IPreferenceStore fPreferenceStore = null;
-	private Preferences fPreferences = null;
-	private boolean fQuoteAttrValues;
-
-	private int fTagNameCase;
-
-	public int getAttrNameCase() {
-
-		return fAttrNameCase;
-	}
-
-	public boolean getCompressEmptyElementTags() {
-
-		return fCompressEmptyElementTags;
-	}
-
-	public boolean getConvertEOLCodes() {
-
-		return fConvertEOLCodes;
-	}
-
-	public String getEOLCode() {
-
-		return fEOLCode;
-	}
-
-	public boolean getFormatSource() {
-
-		return fFormatSource;
-	}
-
-	public boolean getInsertMissingTags() {
-
-		return fInsertMissingTags;
-	}
-
-	public boolean getInsertRequiredAttrs() {
-
-		return fInsertRequiredAttrs;
-	}
-
-	public Preferences getPreferences() {
-
-		if (fPreferences == null) {
-			fPreferences = SSECorePlugin.getDefault().getPluginPreferences();
-		}
-		return fPreferences;
-	}
-
-	public boolean getQuoteAttrValues() {
-
-		return fQuoteAttrValues;
-	}
-
-	public int getTagNameCase() {
-
-		return fTagNameCase;
-	}
-
-	public void setAttrNameCase(int attrNameCase) {
-
-		fAttrNameCase = attrNameCase;
-	}
-
-	public void setCompressEmptyElementTags(boolean compressEmptyElementTags) {
-
-		fCompressEmptyElementTags = compressEmptyElementTags;
-	}
-
-	public void setConvertEOLCodes(boolean convertEOLCodes) {
-
-		fConvertEOLCodes = convertEOLCodes;
-	}
-
-	public void setEOLCode(String EOLCode) {
-
-		fEOLCode = EOLCode;
-	}
-
-	public void setFormatSource(boolean formatSource) {
-
-		fFormatSource = formatSource;
-	}
-
-	public void setInsertMissingTags(boolean insertMissingTags) {
-
-		fInsertMissingTags = insertMissingTags;
-	}
-
-	public void setInsertRequiredAttrs(boolean insertRequiredAttrs) {
-
-		fInsertRequiredAttrs = insertRequiredAttrs;
-	}
-
-	public void setPreferences(Preferences prefs) {
-
-		fPreferences = prefs;
-	}
-
-	public void setQuoteAttrValues(boolean quoteAttrValues) {
-
-		fQuoteAttrValues = quoteAttrValues;
-	}
-
-	public void setTagNameCase(int tagNameCase) {
-
-		fTagNameCase = tagNameCase;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredContentCleanupHandler.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredContentCleanupHandler.java
deleted file mode 100644
index 6c06ca0..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredContentCleanupHandler.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.cleanup;
-
-public interface StructuredContentCleanupHandler {
-
-	IStructuredCleanupProcessor getCleanupProcessor(String contentType);
-
-	void setCleanupProcessor(IStructuredCleanupProcessor cleanupProcessor, String contentType);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredContentCleanupHandlerImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredContentCleanupHandlerImpl.java
deleted file mode 100644
index 27a6246..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/cleanup/StructuredContentCleanupHandlerImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.cleanup;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.text.Assert;
-
-public class StructuredContentCleanupHandlerImpl implements StructuredContentCleanupHandler {
-	protected Map fCleanupProcessors;
-
-	public IStructuredCleanupProcessor getCleanupProcessor(String contentType) {
-		Assert.isNotNull(contentType);
-
-		if (fCleanupProcessors == null)
-			return null;
-
-		return (IStructuredCleanupProcessor) fCleanupProcessors.get(contentType);
-	}
-
-	public void setCleanupProcessor(IStructuredCleanupProcessor cleanupProcessor, String contentType) {
-		Assert.isNotNull(contentType);
-
-		if (fCleanupProcessors == null)
-			fCleanupProcessors = new HashMap();
-
-		if (fCleanupProcessors == null)
-			fCleanupProcessors.remove(contentType);
-		else
-			fCleanupProcessors.put(contentType, cleanupProcessor);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/AbstractDocumentLoader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/AbstractDocumentLoader.java
deleted file mode 100644
index ea9959e..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/AbstractDocumentLoader.java
+++ /dev/null
@@ -1,438 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.document;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.MalformedInputException;
-import java.nio.charset.UnmappableCharacterException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension3;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-import org.eclipse.wst.sse.core.internal.encoding.CodedReaderCreator;
-import org.eclipse.wst.sse.core.internal.encoding.ContentTypeEncodingPreferences;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.exceptions.MalformedInputExceptionWithDetail;
-import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
-
-
-
-/**
- * This class reads a file and creates an Structured Model.
- */
-public abstract class AbstractDocumentLoader implements IDocumentLoader {
-
-	private CodedReaderCreator fCodedReaderCreator;
-	protected IDocumentCharsetDetector fDocumentEncodingDetector;
-	// private boolean fPropertiesObtained;
-
-	protected EncodingMemento fEncodingMemento;
-	protected Reader fFullPreparedReader;
-
-	/**
-	 * AbstractLoader constructor also initializes encoding converter/mapper
-	 */
-	public AbstractDocumentLoader() {
-		super();
-	}
-
-	protected final StringBuffer convertLineDelimiters(StringBuffer allTextBuffer, String lineDelimiterToUse) {
-		// TODO: avoid use of String instance
-		String allText = allTextBuffer.toString();
-		IDocument tempDoc = new Document(allText);
-		if (lineDelimiterToUse == null)
-			lineDelimiterToUse = System.getProperty("line.separator"); //$NON-NLS-1$
-		StringBuffer newText = new StringBuffer();
-		int lineCount = tempDoc.getNumberOfLines();
-		for (int i = 0; i < lineCount; i++) {
-			try {
-				org.eclipse.jface.text.IRegion lineInfo = tempDoc.getLineInformation(i);
-				int lineStartOffset = lineInfo.getOffset();
-				int lineLength = lineInfo.getLength();
-				int lineEndOffset = lineStartOffset + lineLength;
-				newText.append(allText.substring(lineStartOffset, lineEndOffset));
-				if ((i < lineCount - 1) && (tempDoc.getLineDelimiter(i) != null))
-					newText.append(lineDelimiterToUse);
-			}
-			catch (org.eclipse.jface.text.BadLocationException exception) {
-				// should fix up to either throw nothing, or the right thing,
-				// but
-				// in the course of refactoring, this was easiest "quick fix".
-				throw new RuntimeException(exception);
-			}
-		}
-		return newText;
-	}
-
-	/**
-	 * This method must return a new instance of IEncodedDocument, that has
-	 * been initialized with appropriate parser. For many loaders, the
-	 * (default) parser used is known for any input. For others, the correct
-	 * parser (and its initialization) is normally dependent on the content of
-	 * the file. This no-argument method should assume "empty input" and would
-	 * therefore return the default parser for the default contentType.
-	 */
-	public IEncodedDocument createNewStructuredDocument() {
-		IEncodedDocument structuredDocument = newEncodedDocument();
-		// Make sure every structuredDocument has an Encoding Memento,
-		// which is the default one for "empty" structuredDocuments
-		String charset = ContentTypeEncodingPreferences.useDefaultNameRules(getDocumentEncodingDetector());
-		String specDefaultCharset = getDocumentEncodingDetector().getSpecDefaultEncoding();
-		structuredDocument.setEncodingMemento(CodedIO.createEncodingMemento(charset, EncodingMemento.DEFAULTS_ASSUMED_FOR_EMPTY_INPUT, specDefaultCharset));
-
-		String lineDelimiter = getPreferredNewLineDelimiter(null);
-		if (lineDelimiter != null)
-			structuredDocument.setPreferredLineDelimiter(lineDelimiter);
-
-		IDocumentPartitioner defaultPartitioner = getDefaultDocumentPartitioner();
-		if (structuredDocument instanceof IDocumentExtension3) {
-			((IDocumentExtension3) structuredDocument).setDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, defaultPartitioner);
-		}
-		else {
-			structuredDocument.setDocumentPartitioner(defaultPartitioner);
-		}
-		defaultPartitioner.connect(structuredDocument);
-
-		return structuredDocument;
-	}
-
-	/**
-	 * This abstract version should handle most cases, but won't if
-	 * contentType is sensitive to encoding, and/or embedded types
-	 */
-	public IEncodedDocument createNewStructuredDocument(IFile iFile) throws IOException, CoreException {
-		IEncodedDocument structuredDocument = createNewStructuredDocument();
-
-		String lineDelimiter = getPreferredNewLineDelimiter(iFile);
-		if (lineDelimiter != null)
-			structuredDocument.setPreferredLineDelimiter(lineDelimiter);
-
-		try {
-
-			CodedReaderCreator creator = getCodedReaderCreator();
-			creator.set(iFile);
-			fEncodingMemento = creator.getEncodingMemento();
-			structuredDocument.setEncodingMemento(fEncodingMemento);
-			fFullPreparedReader = getCodedReaderCreator().getCodedReader();
-
-			setDocumentContentsFromReader(structuredDocument, fFullPreparedReader);
-		}
-		finally {
-			if (fFullPreparedReader != null) {
-				fFullPreparedReader.close();
-			}
-		}
-		return structuredDocument;
-	}
-
-	public IEncodedDocument createNewStructuredDocument(String filename, InputStream inputStream) throws UnsupportedEncodingException, IOException {
-		return createNewStructuredDocument(filename, inputStream, EncodingRule.CONTENT_BASED);
-	}
-
-	public IEncodedDocument createNewStructuredDocument(String filename, InputStream inputStream, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException {
-		if (filename == null && inputStream == null) {
-			throw new IllegalArgumentException("can not have both null filename and inputstream"); //$NON-NLS-1$
-		}
-		IEncodedDocument structuredDocument = createNewStructuredDocument();
-		CodedReaderCreator codedReaderCreator = getCodedReaderCreator();
-		try {
-			codedReaderCreator.set(filename, inputStream);
-			codedReaderCreator.setEncodingRule(encodingRule);
-			fEncodingMemento = codedReaderCreator.getEncodingMemento();
-			fFullPreparedReader = codedReaderCreator.getCodedReader();
-			structuredDocument.setEncodingMemento(fEncodingMemento);
-			setDocumentContentsFromReader(structuredDocument, fFullPreparedReader);
-		}
-		catch (CoreException e) {
-			// impossible in this context
-			throw new Error(e);
-		}
-		finally {
-			if (fFullPreparedReader != null) {
-				fFullPreparedReader.close();
-			}
-		}
-
-		return structuredDocument;
-	}
-
-	private int getCharPostionOfFailure(BufferedReader inputStream) {
-		int charPosition = 1;
-		int charRead = -1;
-		boolean errorFound = false;
-		do {
-			try {
-				charRead = inputStream.read();
-				charPosition++;
-			}
-			catch (IOException e) {
-				// this is expected, since we're expecting failure,
-				// so no need to do anything.
-				errorFound = true;
-				break;
-			}
-		}
-		while (!(charRead == -1 || errorFound));
-
-		if (errorFound)
-			// dmw, blindly modified to +1 to get unit tests to work, moving
-			// from Java 1.3, to 1.4
-			// not sure how/why this behavior would have changed. (Its as if
-			// 'read' is reporting error
-			// one character early).
-			return charPosition + 1;
-		else
-			return -1;
-	}
-
-	/**
-	 * @return Returns the codedReaderCreator.
-	 */
-	protected CodedReaderCreator getCodedReaderCreator() {
-		if (fCodedReaderCreator == null) {
-			fCodedReaderCreator = new CodedReaderCreator();
-		}
-		return fCodedReaderCreator;
-	}
-
-	/**
-	 * Creates the partitioner to be used with the
-	 * IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING partitioning
-	 * 
-	 * @return IDocumentPartitioner
-	 */
-	public abstract IDocumentPartitioner getDefaultDocumentPartitioner();
-
-	/**
-	 * Returns the encodingMemento.
-	 * 
-	 * @return EncodingMemento
-	 */
-	public EncodingMemento getEncodingMemento() {
-		if (fEncodingMemento == null) {
-			throw new IllegalStateException("Program Error: encodingMemento was accessed before it was set"); //$NON-NLS-1$
-		}
-		return fEncodingMemento;
-	}
-
-	/**
-	 * @return Returns the fullPreparedReader.
-	 */
-	protected Reader getFullPreparedReader() throws UnsupportedEncodingException, CoreException, IOException {
-		if (fFullPreparedReader == null) {
-			fFullPreparedReader = getCodedReaderCreator().getCodedReader();
-		}
-		return fFullPreparedReader;
-	}
-
-	/**
-	 * Returns the default line delimiter preference for the given file.
-	 * 
-	 * @param file
-	 *            the file
-	 * @return the default line delimiter
-	 * @since 3.1
-	 */
-	private String getPlatformLineDelimiterPreference(IFile file) {
-		IScopeContext[] scopeContext;
-		if (file != null && file.getProject() != null) {
-			// project preference
-			scopeContext = new IScopeContext[]{new ProjectScope(file.getProject())};
-			String lineDelimiter = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, null, scopeContext);
-			if (lineDelimiter != null)
-				return lineDelimiter;
-		}
-		// workspace preference
-		scopeContext = new IScopeContext[]{new InstanceScope()};
-		return Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, null, scopeContext);
-	}
-
-	/**
-	 * @deprecated use getPreferredNewLineDelimiter(IFile) instead
-	 */
-	protected String getPreferredNewLineDelimiter() {
-		return getPreferredNewLineDelimiter(null);
-	}
-
-	/**
-	 * If subclass doesn't implement, return platform default
-	 */
-	protected String getPreferredNewLineDelimiter(IFile file) {
-		return getPlatformLineDelimiterPreference(file);
-	}
-
-	/**
-	 * A utility method, but depends on subclasses to impliment the preferred
-	 * end of line for a particular content type. Note: subclasses should not
-	 * re-implement this method (there's no reason to, even though its part of
-	 * interface). This method not only converts end-of-line characters, if
-	 * needed, but sets the correct end-of-line delimiter in
-	 * structuredDocument. Minor note: can't use this exact method in dumpers,
-	 * since the decision to change or not is a little different, and since
-	 * there we have to change text of structuredDocument if found to need
-	 * conversion. (Where as for loading, we assume we haven't yet set text in
-	 * structuredDocument, but will be done by other method just a tiny biy
-	 * later). Needs to be public to handle interface. It is in the interface
-	 * just so ModelManagerImpl can use it in a special circumstance.
-	 */
-	public StringBuffer handleLineDelimiter(StringBuffer originalString, IEncodedDocument theFlatModel) {
-		// TODO: need to handle line delimiters so Marker Positions are
-		// updated
-		StringBuffer convertedText = null;
-		// based on text, make a guess on what's being used as
-		// line delimiter
-		String probableLineDelimiter = TextUtilities.determineLineDelimiter(originalString, theFlatModel.getLegalLineDelimiters(), System.getProperty("line.separator")); //$NON-NLS-1$
-		String preferredLineDelimiter = getPreferredNewLineDelimiter(null);
-		if (preferredLineDelimiter == null) {
-			// when preferredLineDelimiter is null, it means "leave alone"
-			// so no conversion needed.
-			// set here, only if null (should already be set, but if not,
-			// we'll set so any subsequent editing inserts what we're
-			// assuming)
-			if (!theFlatModel.getPreferredLineDelimiter().equals(probableLineDelimiter)) {
-				theFlatModel.setPreferredLineDelimiter(probableLineDelimiter);
-			}
-			convertedText = originalString;
-		}
-		else {
-			if (!preferredLineDelimiter.equals(probableLineDelimiter)) {
-				// technically, wouldn't have to convert line delimiters
-				// here at beginning, but when we save, if the preferred
-				// line delimter is "leave alone" then we do leave alone,
-				// so best to be right from beginning.
-				convertedText = convertLineDelimiters(originalString, preferredLineDelimiter);
-				theFlatModel.setPreferredLineDelimiter(preferredLineDelimiter);
-			}
-			else {
-				// they are already the same, no conversion needed
-				theFlatModel.setPreferredLineDelimiter(preferredLineDelimiter);
-				convertedText = originalString;
-			}
-		}
-		return convertedText;
-	}
-
-	protected abstract IEncodedDocument newEncodedDocument();
-
-	/**
-	 * Very mechanical method, just to read the characters, once the reader is
-	 * correctly created. Can throw MalFormedInputException.
-	 */
-	private StringBuffer readInputStream(Reader reader) throws IOException {
-
-		int fBlocksRead = 0;
-		StringBuffer buffer = new StringBuffer();
-		int numRead = 0;
-		try {
-			char tBuff[] = new char[CodedIO.MAX_BUF_SIZE];
-			while (numRead != -1) {
-				numRead = reader.read(tBuff, 0, tBuff.length);
-				if (numRead > 0) {
-					buffer.append(tBuff, 0, numRead);
-					fBlocksRead++;
-				}
-			}
-		}
-		catch (MalformedInputException e) {
-			throw new MalformedInputExceptionWithDetail(fEncodingMemento.getJavaCharsetName(), fBlocksRead * CodedIO.MAX_BUF_SIZE + numRead + e.getInputLength());
-		}
-		catch (UnmappableCharacterException e) {
-			throw new MalformedInputExceptionWithDetail(fEncodingMemento.getJavaCharsetName(), fBlocksRead * CodedIO.MAX_BUF_SIZE + numRead + e.getInputLength());
-
-		}
-		return buffer;
-	}
-
-	public void reload(IEncodedDocument encodedDocument, Reader inputStreamReader) throws IOException {
-		if (inputStreamReader == null) {
-			throw new IllegalArgumentException("stream reader can not be null"); //$NON-NLS-1$
-		}
-		int READ_BUFFER_SIZE = 8192;
-		int MAX_BUFFERED_SIZE_FOR_RESET_MARK = 200000;
-		// temp .... eventually we'lll only read as needed
-		BufferedReader bufferedReader = new BufferedReader(inputStreamReader, MAX_BUFFERED_SIZE_FOR_RESET_MARK);
-		bufferedReader.mark(MAX_BUFFERED_SIZE_FOR_RESET_MARK);
-		StringBuffer buffer = new StringBuffer();
-		try {
-			int numRead = 0;
-			char tBuff[] = new char[READ_BUFFER_SIZE];
-			while ((numRead = bufferedReader.read(tBuff, 0, tBuff.length)) != -1) {
-				buffer.append(tBuff, 0, numRead);
-			}
-			// remember -- we didn't open stream ... so we don't close it
-		}
-		catch (MalformedInputException e) {
-			// int pos = e.getInputLength();
-			EncodingMemento localEncodingMemento = getEncodingMemento();
-			boolean couldReset = true;
-			String encodingNameInError = localEncodingMemento.getJavaCharsetName();
-			if (encodingNameInError == null) {
-				encodingNameInError = localEncodingMemento.getDetectedCharsetName();
-			}
-			try {
-				bufferedReader.reset();
-			}
-			catch (IOException resetException) {
-				// the only errro that can occur during reset is an
-				// IOException
-				// due to already being past the rest mark. In that case, we
-				// throw more generic message
-				couldReset = false;
-			}
-			// -1 can be used by UI layer as a code that "position could not
-			// be
-			// determined"
-			int charPostion = -1;
-			if (couldReset) {
-
-				charPostion = getCharPostionOfFailure(bufferedReader);
-				// getCharPostionOfFailure(new InputStreamReader(inStream,
-				// javaEncodingNameInError));
-			}
-			// all of that just to throw more accurate error
-			// note: we do the conversion to ianaName, instead of using the
-			// local
-			// variable,
-			// because this is ultimately only for the user error message
-			// (that
-			// is,
-			// the error occurred
-			// in context of javaEncodingName no matter what ianaEncodingName
-			// is
-			throw new MalformedInputExceptionWithDetail(encodingNameInError, CodedIO.getAppropriateJavaCharset(encodingNameInError), charPostion, !couldReset, MAX_BUFFERED_SIZE_FOR_RESET_MARK);
-		}
-		StringBuffer stringbuffer = buffer;
-		encodedDocument.set(stringbuffer.toString());
-
-	}
-
-	protected void setDocumentContentsFromReader(IEncodedDocument structuredDocument, Reader reader) throws IOException {
-
-		StringBuffer allText = readInputStream(reader);
-		structuredDocument.set(allText.toString());
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/DocumentReader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/DocumentReader.java
deleted file mode 100644
index ae28004..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/DocumentReader.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.document;
-
-import java.io.IOException;
-import java.io.Reader;
-
-import org.eclipse.jface.text.IDocument;
-
-/**
- * A java.io.Reader that can operate off of an IDocument.
- */
-public class DocumentReader extends Reader {
-	private IDocument fDocument = null;
-	private int mark = 0;
-	private int position = 0;
-
-	public DocumentReader() {
-		super();
-	}
-
-	public DocumentReader(IDocument document) {
-		this(document, 0);
-	}
-
-	public DocumentReader(IDocument document, int initialPosition) {
-		super();
-		fDocument = document;
-		position = initialPosition;
-	}
-
-	public void close() throws IOException {
-		fDocument = null;
-	}
-
-	/**
-	 * @return
-	 */
-	public IDocument getDocument() {
-		return fDocument;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.Reader#mark(int)
-	 */
-	public void mark(int readAheadLimit) throws IOException {
-		mark = position;
-	}
-
-	public boolean markSupported() {
-		return true;
-	}
-
-	public int read(char[] cbuf, int off, int len) throws IOException {
-		if(fDocument == null)
-			return -1;
-		
-		char[] readChars = null;
-		try {
-			if (position >= fDocument.getLength())
-				return -1;
-			// the IDocument is likely using a GapTextStore, so we can't
-			// retrieve a char[] directly
-			if (position + len > fDocument.getLength())
-				readChars = fDocument.get(position, fDocument.getLength() - position).toCharArray();
-			else
-				readChars = fDocument.get(position, len).toCharArray();
-			System.arraycopy(readChars, 0, cbuf, off, readChars.length);
-			//				System.out.println("" + position + ":" + readChars.length + " "
-			// + StringUtils.escape(new String(readChars)));
-			position += readChars.length;
-			return readChars.length;
-		} catch (Exception e) {
-			throw new IOException("Exception while reading from IDocument: " + e); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.Reader#reset()
-	 */
-	public void reset() throws IOException {
-		position = mark;
-	}
-
-	public void reset(IDocument document, int initialPosition) {
-		fDocument = document;
-		position = initialPosition;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.Reader#reset()
-	 */
-	public void reset(int pos) throws IOException {
-		position = pos;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.Reader#skip(long)
-	 */
-	public long skip(long n) throws IOException {
-		if(fDocument == null)
-			return 0;
-
-		long skipped = n;
-		if (position + n > fDocument.getLength()) {
-			skipped = fDocument.getLength() - position;
-			position = fDocument.getLength();
-		} else {
-			position += n;
-		}
-		return skipped;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/IDocumentCharsetDetector.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/IDocumentCharsetDetector.java
deleted file mode 100644
index 4ea8b04..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/IDocumentCharsetDetector.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.document;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-
-
-
-public interface IDocumentCharsetDetector extends IResourceCharsetDetector {
-	void set(IDocument document);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/IDocumentLoader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/IDocumentLoader.java
deleted file mode 100644
index 20a99d6..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/IDocumentLoader.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.document;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;
-
-
-public interface IDocumentLoader {
-
-	IEncodedDocument createNewStructuredDocument();
-
-	/**
-	 * This API is like createNewStructuredDocument, except it should populate
-	 * the structuredDocument with the contents of IFile. Also, those
-	 * StructuredDocuments which are sensitive to the input (that is, the
-	 * parser or parser initialization my require the input) should
-	 * additionally initialize the parser, etc., appropriate to the input.
-	 * 
-	 * As always, the appropriate decoding should be used.
-	 */
-	IEncodedDocument createNewStructuredDocument(IFile iFile) throws java.io.IOException, CoreException;
-
-	/**
-	 * This method must return a new instance of IEncodedDocument, that has
-	 * been initialized with appropriate parser. For many loaders, the
-	 * (default) parser used is known for any input. For others, the correct
-	 * parser (and its initialization) is normally dependent on the content of
-	 * the file. This no-argument method should assume "empty input" and would
-	 * therefore return the default parser for the default contentType.
-	 */
-	IEncodedDocument createNewStructuredDocument(String filename, InputStream istream) throws java.io.IOException;
-
-	IEncodedDocument createNewStructuredDocument(String filename, InputStream istream, EncodingRule encodingRule) throws java.io.IOException;
-
-	IDocumentPartitioner getDefaultDocumentPartitioner();
-
-	IDocumentCharsetDetector getDocumentEncodingDetector();
-
-	/**
-	 * A utility method, but depends on subclasses to impliment the preferred
-	 * end of line for a particular content type. Note: subclasses should not
-	 * re-implement this method (there's no reason to, even though its part of
-	 * interface). This method not only converts end-of-line characters, if
-	 * needed, but sets the correct end-of-line delimiter in
-	 * structuredDocument. The returned value is either the original string,
-	 * if no conversion is needed, or a new string with end-of-lines
-	 * converted.
-	 */
-	StringBuffer handleLineDelimiter(StringBuffer originalString, IEncodedDocument theStructuredDocument);
-
-	void reload(IEncodedDocument document, Reader reader) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/StructuredDocumentFactory.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/StructuredDocumentFactory.java
deleted file mode 100644
index 41618fa..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/StructuredDocumentFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.document;
-
-import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument;
-import org.eclipse.wst.sse.core.internal.text.JobSafeStructuredDocument;
-
-
-/**
- * At the moment, this is primarily intended as a convenience to help switch
- * between various types of threading models in the document, all in a central
- * piece of code.
- */
-public class StructuredDocumentFactory {
-	private static final int WRITE_SYNCHRONIZED = 3;
-	private static final int DEFAULT = WRITE_SYNCHRONIZED;
-	private static final int UNSYNCHRONIZED = 1;
-
-	private static IStructuredDocument getNewStructuredDocumentInstance(int type, RegionParser parser) {
-		IStructuredDocument result = null;
-		switch (type) {
-			case UNSYNCHRONIZED :
-				result = new BasicStructuredDocument(parser);
-				break;
-			case WRITE_SYNCHRONIZED :
-				result = new JobSafeStructuredDocument(parser);
-				break;
-
-			default :
-				throw new IllegalArgumentException("request document type was not known"); //$NON-NLS-1$
-
-		}
-		return result;
-	}
-
-	/**
-	 * Provides the (system default) structured document initialized with the
-	 * parser.
-	 * 
-	 * @param parser
-	 * @return
-	 */
-	public static IStructuredDocument getNewStructuredDocumentInstance(RegionParser parser) {
-		return getNewStructuredDocumentInstance(DEFAULT, parser);
-	}
-
-	/**
-	 * Not intended to be instantiated
-	 * 
-	 */
-	private StructuredDocumentFactory() {
-		super();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/TextUtilities.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/TextUtilities.java
deleted file mode 100644
index 91ec598..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/document/TextUtilities.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.document;
-
-
-/**
- * Collection of text functions.
- * 
- * @deprecated - marked as deprecated to remind us to phase this out (and/or
- *             move to "finished" version).
- */
-public class TextUtilities {
-
-	/**
-	 * @deprecated if possible, its best to use
-	 *             IDocument.getLegalLineDelimiters()
-	 */
-	public final static String[] fgDelimiters = new String[]{"\n", "\r", "\r\n"};//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
-
-	/**
-	 * Determines which one of fgDelimiters appears first in the text. If none
-	 * of them the hint is returned.
-	 */
-	public static String determineLineDelimiter(StringBuffer textBuffer, String[] possibles, String hint) {
-		try {
-			// TODO: avoid use of String instance
-			String text = textBuffer.toString();
-			int[] info = indexOf(possibles, text, 0);
-			return possibles[info[1]];
-		} catch (ArrayIndexOutOfBoundsException x) {
-		}
-		return hint;
-	}
-
-	/**
-	 * Returns the position in the string greater than offset of the longest
-	 * matching search string.
-	 */
-	private static int[] indexOf(String[] searchStrings, String text, int offset) {
-
-		int[] result = {-1, -1};
-
-		for (int i = 0; i < searchStrings.length; i++) {
-			int index = text.indexOf(searchStrings[i], offset);
-			if (index >= 0) {
-
-				if (result[0] == -1) {
-					result[0] = index;
-					result[1] = i;
-				} else if (index < result[0]) {
-					result[0] = index;
-					result[1] = i;
-				} else if (index == result[0] && searchStrings[i].length() > searchStrings[result[1]].length()) {
-					result[0] = index;
-					result[1] = i;
-				}
-			}
-		}
-
-		return result;
-
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/filebuffers/BasicStructuredDocumentFactory.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/filebuffers/BasicStructuredDocumentFactory.java
deleted file mode 100644
index 16467b6..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/filebuffers/BasicStructuredDocumentFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.filebuffers;
-
-import org.eclipse.core.filebuffers.IDocumentFactory;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerRegistry;
-import org.eclipse.wst.sse.core.internal.text.JobSafeStructuredDocument;
-
-
-/**
- * Generic IDocumentFactory for IStructuredDocuments to be used by the
- * org.eclipse.core.filebuffers.documentCreation extension point. This class
- * is not meant to be subclassed.
- * 
- * @plannedfor 1.0
- */
-public class BasicStructuredDocumentFactory implements IDocumentFactory, IExecutableExtension {
-
-	/*
-	 * The content type ID used to declare this factory; it is used to find
-	 * the corresponding support for creating the document
-	 */
-	private String fContentTypeIdentifier = null;
-
-	/**
-	 * Constructor, only to be used by the
-	 * org.eclipse.core.filebuffers.documentCreation extension point.
-	 */
-	public BasicStructuredDocumentFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.filebuffers.IDocumentFactory#createDocument()
-	 */
-	public IDocument createDocument() {
-		IDocument document = null;
-		IContentType contentType = Platform.getContentTypeManager().getContentType(getContentTypeIdentifier());
-		IModelHandler handler = null;
-		while (handler == null && !IContentTypeManager.CT_TEXT.equals(contentType.getId())) {
-			handler = ModelHandlerRegistry.getInstance().getHandlerForContentTypeId(contentType.getId());
-			contentType = contentType.getBaseType();
-		}
-		if (handler != null) {
-			document = handler.getDocumentLoader().createNewStructuredDocument();
-		}
-		else {
-			document = new JobSafeStructuredDocument();
-		}
-		return document;
-	}
-
-	private String getContentTypeIdentifier() {
-		return fContentTypeIdentifier;
-	}
-
-	/*
-	 * Loads the content type ID to be used when creating the Structured Document. 
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
-		fContentTypeIdentifier = config.getAttribute("contentTypeId"); //$NON-NLS-1$
-		if (data != null) {
-			if (data instanceof String && data.toString().length() > 0) {
-				fContentTypeIdentifier = (String) data;
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/AbstractStructuredFormatProcessor.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/AbstractStructuredFormatProcessor.java
deleted file mode 100644
index 4b554be..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/AbstractStructuredFormatProcessor.java
+++ /dev/null
@@ -1,523 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Jesper Steen Møller - initial IDocumentExtension4 support - #102822
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.format;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.DocumentRewriteSession;
-import org.eclipse.jface.text.DocumentRewriteSessionType;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension4;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
-
-
-public abstract class AbstractStructuredFormatProcessor implements IStructuredFormatProcessor {
-	protected IStructuredFormatContraints fFormatContraints = null;
-	protected IProgressMonitor fProgressMonitor = null;
-	public boolean refreshFormatPreferences = true; // special flag for JUnit
-	/*
-	 * Max length of text to be formatted to be considered a "small change"
-	 * Used for document rewrite session type.
-	 */
-	private final int MAX_SMALL_FORMAT_SIZE = 1000;
-
-	protected void ensureClosed(OutputStream outputStream, InputStream inputStream) {
-
-		try {
-			if (inputStream != null) {
-				inputStream.close();
-			}
-		}
-		catch (IOException e) {
-			Logger.logException(e); // hopeless
-		}
-		try {
-			if (outputStream != null) {
-				outputStream.close();
-			}
-		}
-		catch (IOException e) {
-			Logger.logException(e); // hopeless
-		}
-	}
-
-	public String formatContent(String input) throws IOException, CoreException {
-		if (input == null)
-			return input;
-
-		IStructuredModel structuredModel = null;
-		InputStream inputStream = null;
-		try {
-			// setup structuredModel
-			// Note: We are getting model for read. Will return formatted
-			// string and NOT save model.
-			inputStream = new ByteArrayInputStream(input.getBytes("UTF8")); //$NON-NLS-1$
-			String id = inputStream.toString() + "." + getFileExtension(); //$NON-NLS-1$
-			structuredModel = StructuredModelManager.getModelManager().getModelForRead(id, inputStream, null);
-
-			// format
-			formatModel(structuredModel);
-
-			// return output
-			return structuredModel.getStructuredDocument().get();
-		}
-		finally {
-			ensureClosed(null, inputStream);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromRead();
-		}
-	}
-
-	public String formatContent(String input, int start, int length) throws IOException, CoreException {
-		if (input == null)
-			return input;
-
-		if ((start >= 0) && (length >= 0) && (start + length <= input.length())) {
-			IStructuredModel structuredModel = null;
-			InputStream inputStream = null;
-			try {
-				// setup structuredModel
-				// Note: We are getting model for read. Will return formatted
-				// string and NOT save model.
-				inputStream = new ByteArrayInputStream(input.getBytes("UTF8")); //$NON-NLS-1$
-				String id = inputStream.toString() + "." + getFileExtension(); //$NON-NLS-1$
-				structuredModel = StructuredModelManager.getModelManager().getModelForRead(id, inputStream, null);
-
-				// format
-				formatModel(structuredModel, start, length);
-
-				// return output
-				return structuredModel.getStructuredDocument().get();
-			}
-			finally {
-				ensureClosed(null, inputStream);
-				// release from model manager
-				if (structuredModel != null)
-					structuredModel.releaseFromRead();
-			}
-		}
-		else
-			return input;
-	}
-
-	public void formatDocument(IDocument document) throws IOException, CoreException {
-		if (document == null)
-			return;
-
-		IStructuredModel structuredModel = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			// Note: We are getting model for edit. Will save model if model
-			// changed.
-			structuredModel = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
-
-			// format
-			formatModel(structuredModel);
-
-			// save model if needed
-			if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-				structuredModel.save();
-		}
-		finally {
-			// ensureClosed(outputStream, null);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromEdit();
-		}
-	}
-
-	public void formatDocument(IDocument document, int start, int length) throws IOException, CoreException {
-		if (document == null)
-			return;
-
-		if ((start >= 0) && (length >= 0) && (start + length <= document.getLength())) {
-			IStructuredModel structuredModel = null;
-			// OutputStream outputStream = null;
-			try {
-				// setup structuredModel
-				// Note: We are getting model for edit. Will save model if
-				// model changed.
-				structuredModel = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
-
-				if (structuredModel != null) {
-					// format
-					formatModel(structuredModel, start, length);
-
-					// save model if needed
-					if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-						structuredModel.save();
-				}
-			}
-			finally {
-				// ensureClosed(outputStream, null);
-				// release from model manager
-				if (structuredModel != null)
-					structuredModel.releaseFromEdit();
-			}
-		}
-	}
-
-	public void formatFile(IFile file) throws IOException, CoreException {
-		if (file == null)
-			return;
-
-		IStructuredModel structuredModel = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			// Note: We are getting model for edit. Will save model if model
-			// changed.
-			structuredModel = StructuredModelManager.getModelManager().getModelForEdit(file);
-
-			// format
-			formatModel(structuredModel);
-
-			// save model if needed
-			if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-				structuredModel.save();
-		}
-		finally {
-			// ensureClosed(outputStream, null);
-			// release from model manager
-			if (structuredModel != null) {
-				structuredModel.releaseFromEdit();
-			}
-
-		}
-	}
-
-	public void formatFile(IFile file, int start, int length) throws IOException, CoreException {
-		if (file == null)
-			return;
-
-		IStructuredModel structuredModel = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			// Note: We are getting model for edit. Will save model if model
-			// changed.
-			structuredModel = StructuredModelManager.getModelManager().getModelForEdit(file);
-
-			// format
-			formatModel(structuredModel, start, length);
-
-			// save model if needed
-			if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-				structuredModel.save();
-		}
-		finally {
-			// ensureClosed(outputStream, null);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromEdit();
-		}
-	}
-
-	public void formatFileName(String fileName) throws IOException, CoreException {
-		if (fileName == null)
-			return;
-
-		IStructuredModel structuredModel = null;
-		InputStream inputStream = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			// Note: We are getting model for edit. Will save model if model
-			// changed.
-			inputStream = new FileInputStream(fileName);
-			structuredModel = StructuredModelManager.getModelManager().getModelForEdit(fileName, inputStream, null);
-
-			// format
-			formatModel(structuredModel);
-
-			// save model if needed
-			if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-				structuredModel.save();
-		}
-		finally {
-			// ensureClosed(outputStream, inputStream);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromEdit();
-		}
-	}
-
-	public void formatFileName(String fileName, int start, int length) throws IOException, CoreException {
-		if (fileName == null)
-			return;
-
-		IStructuredModel structuredModel = null;
-		InputStream inputStream = null;
-		// OutputStream outputStream = null;
-		try {
-			// setup structuredModel
-			// Note: We are getting model for edit. Will save model if model
-			// changed.
-			inputStream = new FileInputStream(fileName);
-			structuredModel = StructuredModelManager.getModelManager().getModelForEdit(fileName, inputStream, null);
-
-			// format
-			formatModel(structuredModel, start, length);
-
-			// save model if needed
-			if (!structuredModel.isSharedForEdit() && structuredModel.isSaveNeeded())
-				structuredModel.save();
-		}
-		finally {
-			// ensureClosed(outputStream, inputStream);
-			// release from model manager
-			if (structuredModel != null)
-				structuredModel.releaseFromEdit();
-		}
-	}
-
-	public void formatModel(IStructuredModel structuredModel) {
-		int start = 0;
-		int length = structuredModel.getStructuredDocument().getLength();
-
-		formatModel(structuredModel, start, length);
-	}
-
-	public void formatModel(IStructuredModel structuredModel, int start, int length) {
-		if (structuredModel != null) {
-			// for debugging purposes
-			long startTime = System.currentTimeMillis();
-
-			IDocumentExtension4 docExt4 = null;
-			if (structuredModel.getStructuredDocument() instanceof IDocumentExtension4) {
-				docExt4 = (IDocumentExtension4) structuredModel.getStructuredDocument();
-			}
-			DocumentRewriteSession rewriteSession = null;
-
-			try {
-				// whenever formatting model, fire abouttochange/modelchanged
-				structuredModel.aboutToChangeModel();
-				DocumentRewriteSessionType rewriteType = (length > MAX_SMALL_FORMAT_SIZE) ? DocumentRewriteSessionType.UNRESTRICTED : DocumentRewriteSessionType.UNRESTRICTED_SMALL;
-				rewriteSession = (docExt4 == null || docExt4.getActiveRewriteSession() != null) ? null : docExt4.startRewriteSession(rewriteType);
-
-				if ((start == 0) && (length == structuredModel.getStructuredDocument().getLength()))
-					setFormatWithSiblingIndent(structuredModel, false);
-				else
-					setFormatWithSiblingIndent(structuredModel, true);
-
-				if ((start >= 0) && (length >= 0) && (start + length <= structuredModel.getStructuredDocument().getLength())) {
-					List activeNodes = getAllActiveNodes(structuredModel, start, length);
-					if (activeNodes.size() > 0) {
-						Node firstNode = (Node) activeNodes.get(0);
-						Node lastNode = (Node) activeNodes.get(activeNodes.size() - 1);
-
-						boolean done = false;
-						Node eachNode = firstNode;
-						Node nextNode = null;
-						while (!done) {
-							// update "done"
-							done = (eachNode == lastNode);
-
-							/*
-							 * get next sibling before format because eachNode
-							 * may be deleted, for example when it's an empty
-							 * text node
-							 */
-							nextNode = eachNode.getNextSibling();
-
-							// format each node
-							formatNode(eachNode);
-
-							// update each node
-							if ((nextNode != null) && (nextNode.getParentNode() == null))
-								// nextNode is deleted during format
-								eachNode = eachNode.getNextSibling();
-							else
-								eachNode = nextNode;
-
-							// This should not be needed, but just in case
-							// something went wrong with with eachNode.
-							// We don't want an infinite loop here.
-							if (eachNode == null)
-								done = true;
-						}
-
-					}
-				}
-			}
-			finally {
-				// we need two finally's, just in case first fails
-				try {
-					if ((docExt4 != null) && (rewriteSession != null))
-						docExt4.stopRewriteSession(rewriteSession);
-				}
-				finally {
-					// always make sure to fire changedmodel when done
-					structuredModel.changedModel();
-				}
-			}
-
-			if (Logger.DEBUG_FORMAT) {
-				long endTime = System.currentTimeMillis();
-				System.out.println("formatModel time: " + (endTime - startTime)); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public void formatNode(Node node) {
-		if (node != null) {
-			Node newNode = node;
-
-			// format the owner node if it's an attribute node
-			if (node.getNodeType() == Node.ATTRIBUTE_NODE)
-				newNode = ((Attr) node).getOwnerElement();
-
-			// refresh format preferences before getting formatter
-			if (refreshFormatPreferences)
-				refreshFormatPreferences();
-
-			// get formatter and format contraints
-			IStructuredFormatter formatter = getFormatter(newNode);
-			// TODO_future: added assert to replace "redundant null check".
-			// if formatter is ever null, we should provide some
-			// default formatter to serve as place holder.
-			Assert.isNotNull(formatter, "formatter was null for a node, "); //$NON-NLS-1$
-			IStructuredFormatContraints formatContraints = formatter.getFormatContraints();
-			formatContraints.setFormatWithSiblingIndent(true);
-			// format each node
-			formatter.format(newNode, formatContraints);
-		}
-	}
-
-	/**
-	 * @deprecated Use getAllActiveNodes instead
-	 */
-	protected Vector getActiveNodes(IStructuredModel structuredModel, int startNodeOffset, int length) {
-		List allActiveNodes = getAllActiveNodes(structuredModel, startNodeOffset, length);
-		return new Vector(allActiveNodes);
-	}
-
-	protected List getAllActiveNodes(IStructuredModel structuredModel, int startNodeOffset, int length) {
-		List activeNodes = new ArrayList();
-
-		if (structuredModel != null) {
-			Node startNode = (Node) structuredModel.getIndexedRegion(startNodeOffset);
-			// see https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=4711
-			//
-			// We have to watch for selection boundary conditions. Use this as
-			// an example: <a>text</a><b>text</b>,
-			// If the whole <a> node is selected, like:
-			// |<a>text</a>|<b>text</b>, we need to substract the length by 1
-			// to find
-			// the node at the end of the selection:
-			// structuredModel.getIndexedRegion(startNodeOffset + length - 1),
-			// or else
-			// we'd find the next adjacent node.
-			//
-			// However, when the selection length is 0 (meaning no text is
-			// selected), the cursor is at the beginning
-			// of the node we want to format: |<a>text</a><b>text</b>, the
-			// node at the end of the selection is:
-			// structuredModel.getIndexedRegion(startNodeOffset + length).
-			int endNodeOffset = length > 0 ? startNodeOffset + length - 1 : startNodeOffset + length;
-			Node endNode = (Node) structuredModel.getIndexedRegion(endNodeOffset);
-
-			// make sure it's an non-empty document
-			if (startNode != null) {
-				while (isSiblingOf(startNode, endNode) == false) {
-					if (endNode != null)
-						endNode = endNode.getParentNode();
-					if (endNode == null) {
-						startNode = startNode.getParentNode();
-						// see
-						// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=4711
-						// and notes above
-						endNodeOffset = length > 0 ? startNodeOffset + length - 1 : startNodeOffset + length;
-						endNode = (Node) structuredModel.getIndexedRegion(endNodeOffset);
-					}
-				}
-
-				while (startNode != endNode) {
-					activeNodes.add(startNode);
-					startNode = startNode.getNextSibling();
-				}
-				if (startNode != null)
-					activeNodes.add(startNode);
-			}
-		}
-
-		return activeNodes;
-	}
-
-	abstract protected String getFileExtension();
-
-	protected IStructuredFormatContraints getFormatContraints(IStructuredModel structuredModel) {
-		// 262135 - NPE during format of empty document
-		if ((fFormatContraints == null) && (structuredModel != null)) {
-			Node node = (Node) structuredModel.getIndexedRegion(0);
-
-			if (node != null) {
-				IStructuredFormatter formatter = getFormatter(node);
-				if (formatter != null) {
-					fFormatContraints = formatter.getFormatContraints();
-				}
-			}
-		}
-
-		return fFormatContraints;
-	}
-
-	abstract protected IStructuredFormatter getFormatter(Node node);
-
-	protected boolean isSiblingOf(Node node, Node endNode) {
-		if (endNode == null)
-			return true;
-		else {
-			Node siblingNode = node;
-			while (siblingNode != null) {
-				if (siblingNode == endNode)
-					return true;
-				else
-					siblingNode = siblingNode.getNextSibling();
-			}
-			return false;
-		}
-	}
-
-	abstract protected void refreshFormatPreferences();
-
-	protected void setFormatWithSiblingIndent(IStructuredModel structuredModel, boolean formatWithSiblingIndent) {
-		// 262135 - NPE during format of empty document
-		IStructuredFormatContraints formatContraints = getFormatContraints(structuredModel);
-
-		if (formatContraints != null)
-			formatContraints.setFormatWithSiblingIndent(formatWithSiblingIndent);
-	}
-
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		fProgressMonitor = monitor;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatContraints.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatContraints.java
deleted file mode 100644
index 2730043..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatContraints.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.format;
-
-/**
- * These are items that change from element to element.
- * Passed from node to node in a recursive call.
- * eg. current indent is 2 deep, but for the next node might be 3...
- */
-public interface IStructuredFormatContraints {
-	boolean getClearAllBlankLines();
-
-	String getCurrentIndent();
-
-	boolean getFormatWithSiblingIndent();
-
-	boolean getInPreserveSpaceElement();
-
-	/** 
-	 * some special elements can ignore clearing blank lines
-	 * */
-	void setClearAllBlankLines(boolean clearAllBlankLines);
-
-	void setCurrentIndent(String currentIndent);
-
-	void setFormatWithSiblingIndent(boolean formatWithSiblingIndent);
-	
-	void setInPreserveSpaceElement(boolean inPreserveSpaceElement);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatPreferences.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatPreferences.java
deleted file mode 100644
index 2cef142..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatPreferences.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.format;
-
-/**
- * These are items that do not change from element to element.
- * Passed from node to node in a recursive call because sometimes
- * child nodes don't have access to the preferences
- */
-public interface IStructuredFormatPreferences {
-	
-	boolean getClearAllBlankLines();
-
-	String getIndent();
-
-	int getLineWidth();
-
-	void setClearAllBlankLines(boolean clearAllBlankLines);
-
-	void setIndent(String indent);
-
-	void setLineWidth(int lineWidth);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatProcessor.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatProcessor.java
deleted file mode 100644
index b83aac3..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatProcessor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.format;
-
-import java.io.IOException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Node;
-
-/**
- * The main formatting engine.  
- * Loops through all the nodes in an IStructuredModel.
- */
-public interface IStructuredFormatProcessor {
-
-	/**
-	 * This form of the FormatProcessor takes an IDocument as input, creates a
-	 * temporary model of content type calculated using the IDocument's file
-	 * extension, formats the model within start and length, then releases the
-	 * model.
-	 */
-	void formatDocument(IDocument document, int start, int length) throws IOException, CoreException;
-
-	/**
-	 * This form of the FormatProcessor takes an IFile as input, creates a
-	 * temporary model of content type calculated using the IFile's file
-	 * extension, formats the whole model, then releases the model.
-	 */
-	void formatFile(IFile file) throws IOException, CoreException;
-
-	/**
-	 * This form of the FormatProcessor takes a model as input, and formats
-	 * the whole model.
-	 */
-	void formatModel(IStructuredModel structuredModel);
-
-	/**
-	 * This form of the FormatProcessor takes a model as input, and formats
-	 * the model within start and length.
-	 */
-	void formatModel(IStructuredModel structuredModel, int start, int length);
-
-	/**
-	 * This form of the FormatProcessor takes a node as input, and formats the
-	 * node and all its children.
-	 */
-	void formatNode(Node node);
-
-	/**
-	 * Sets the progress monitor for this <code>IStructuredFormatProcessor</code>.
-	 * The monitor is used to display progress or cancel if the formatter is run 
-	 * in a background job.
-	 * @param monitor
-	 */
-	void setProgressMonitor(IProgressMonitor monitor);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatter.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatter.java
deleted file mode 100644
index 6c23d12..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/IStructuredFormatter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.format;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.w3c.dom.Node;
-
-/**
- * Knows how to format a particular node.
- * 
- * eg. generic node, text node, document node, comment, etc...
- */
-public interface IStructuredFormatter {
-	
-	void format(Node node);
-
-	void format(Node node, IStructuredFormatContraints formatContraints);
-
-	IStructuredFormatContraints getFormatContraints();
-
-	IStructuredFormatPreferences getFormatPreferences();
-
-	void setFormatPreferences(IStructuredFormatPreferences formatPreferences);
-
-	void setProgressMonitor(IProgressMonitor monitor);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/StructuredFormatContraints.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/StructuredFormatContraints.java
deleted file mode 100644
index ca47e41..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/StructuredFormatContraints.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Jesper Steen Møller - xml:space='preserve' support
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.format;
-
-public class StructuredFormatContraints implements IStructuredFormatContraints {
-	private boolean fClearAllBlankLines;
-	private String fCurrentIndent = ""; //$NON-NLS-1$
-	private boolean fFormatWithSiblingIndent = false;
-	private boolean fInPreserveSpaceElement = false;
-
-	public boolean getClearAllBlankLines() {
-		return fClearAllBlankLines;
-	}
-
-	public String getCurrentIndent() {
-		return fCurrentIndent;
-	}
-
-	public boolean getFormatWithSiblingIndent() {
-		return fFormatWithSiblingIndent;
-	}
-
-	public void setClearAllBlankLines(boolean clearAllBlankLines) {
-		fClearAllBlankLines = clearAllBlankLines;
-	}
-
-	public void setCurrentIndent(String currentIndent) {
-		fCurrentIndent = currentIndent;
-	}
-
-	public void setFormatWithSiblingIndent(boolean formatWithSiblingIndent) {
-		fFormatWithSiblingIndent = formatWithSiblingIndent;
-	}
-
-	public boolean getInPreserveSpaceElement() {
-		return fInPreserveSpaceElement;
-	}
-
-	public void setInPreserveSpaceElement(boolean inPreserveSpaceElement) {
-		fInPreserveSpaceElement = inPreserveSpaceElement;		
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/StructuredFormatPreferences.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/StructuredFormatPreferences.java
deleted file mode 100644
index 96f1b92..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/format/StructuredFormatPreferences.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.format;
-
-public class StructuredFormatPreferences implements IStructuredFormatPreferences {
-	private boolean fClearAllBlankLines;
-	private String fIndent;
-	private int fLineWidth;
-
-	public boolean getClearAllBlankLines() {
-		return fClearAllBlankLines;
-	}
-
-	public String getIndent() {
-		return fIndent;
-	}
-
-	public int getLineWidth() {
-		return fLineWidth;
-	}
-
-	public void setClearAllBlankLines(boolean clearAllBlankLines) {
-		fClearAllBlankLines = clearAllBlankLines;
-	}
-
-	public void setIndent(String indent) {
-		fIndent = indent;
-	}
-
-	public void setLineWidth(int lineWidth) {
-		fLineWidth = lineWidth;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/AbstractModelHandler.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/AbstractModelHandler.java
deleted file mode 100644
index 6c45577..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/AbstractModelHandler.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.modelhandler;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector;
-import org.eclipse.wst.sse.core.internal.modelhandler.PluginContributedFactoryReader;
-
-/**
- * ISSUE: need to provide this functionality in improved API.
- */
-
-public abstract class AbstractModelHandler implements IModelHandler {
-	private String associatedContentTypeId;
-	private boolean defaultSetting;
-	private String modelHandlerID;
-
-	public AbstractModelHandler() {
-		super();
-	}
-
-	/**
-	 * These factories are added automatically by model manager
-	 */
-	public List getAdapterFactories() {
-		List result = new ArrayList();
-		Collection holdFactories = PluginContributedFactoryReader.getInstance().getFactories(this);
-		if (holdFactories != null) {
-			result.addAll(holdFactories);
-		}
-		return result;
-	}
-
-	public String getAssociatedContentTypeId() {
-		return associatedContentTypeId;
-	}
-
-	public abstract IDocumentCharsetDetector getEncodingDetector();
-
-	public String getId() {
-		return modelHandlerID;
-	}
-
-	public boolean isDefault() {
-		return defaultSetting;
-	}
-
-	protected void setAssociatedContentTypeId(String contentTypeId) {
-		associatedContentTypeId = contentTypeId;
-	}
-
-	public void setDefault(boolean defaultParam) {
-		defaultSetting = defaultParam;
-	}
-
-	protected void setId(String id) {
-		modelHandlerID = id;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/EmbeddedTypeHandler.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/EmbeddedTypeHandler.java
deleted file mode 100644
index 2e4d314..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/EmbeddedTypeHandler.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.modelhandler;
-
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
-import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
-
-
-/**
- */
-public interface EmbeddedTypeHandler {
-
-	/**
-	 * These AdapterFactories are NOT added to IStructuredModel's
-	 * IAdapterFactory Registry ... they are for use by "JSP Aware
-	 * AdapterFactories" The are added to the "registry" in the
-	 * PageDirectiveAdapter.
-	 */
-	List getAdapterFactories();
-
-	/**
-	 * Returns the unique identifier for the content type family this
-	 * ContentTypeDescription belongs to.
-	 */
-	String getFamilyId();
-
-	/**
-	 * Returns a list of mime types (as Strings) this handler is appropriate
-	 * for
-	 */
-	List getSupportedMimeTypes();
-	
-	/**
-	 * If this hander can handle a given mimeType.
-	 * 
-	 * This is a looser check than simply checking if a give mimeType
-	 * in the list of supported types, so it should be used with that
-	 * in mind.  That is, the supported mimeType list should ideally be
-	 * checked first.
-	 * 
-	 * eg. if a mime type ends with "+xml", like voice+xml
-	 *     the EmbeddedXML handler should be able to handle it
-	 *     
-	 * @return true if this handler thinks can handle the given mimeType
-	 */
-	boolean canHandleMimeType(String mimeType);
-	/**
-	 * This method is to give the EmbeddedContentType an opportunity to add
-	 * factories directly to the IStructuredModel's IAdapterFactory registry.
-	 */
-	void initializeFactoryRegistry(FactoryRegistry registry);
-
-	/**
-	 * initializeParser Its purpose is to setBlockTags
-	 */
-	void initializeParser(JSPCapableParser parser);
-
-	boolean isDefault();
-
-	EmbeddedTypeHandler newInstance();
-
-	void uninitializeFactoryRegistry(FactoryRegistry registry);
-
-	void uninitializeParser(JSPCapableParser parser);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/IDocumentTypeHandler.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/IDocumentTypeHandler.java
deleted file mode 100644
index d4862a4..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/IDocumentTypeHandler.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.modelhandler;
-
-import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector;
-import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
-
-/**
- * Interface to allow custom content types to be defined as extension points
- * in plugins.
- */
-public interface IDocumentTypeHandler {
-
-	/**
-	 * The Loader is reponsible for decoding the Resource,
-	 */
-	IDocumentLoader getDocumentLoader();
-
-	/**
-	 * @deprecated - likely to go away, so I marked as deprecated to
-	 *             discoursage use
-	 */
-	IDocumentCharsetDetector getEncodingDetector();
-
-	/**
-	 * Must return unique ID that is the same as identified in plugin registry
-	 */
-	String getId();
-
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/IModelHandler.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/IModelHandler.java
deleted file mode 100644
index c2947d4..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/modelhandler/IModelHandler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.modelhandler;
-
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.provisional.IModelLoader;
-
-
-public interface IModelHandler extends IDocumentTypeHandler {
-	/**
-	 * This method should return Factories which are added automatically by
-	 * IModelManager. This can and will often be an empty List (or null),
-	 * since some AdapterFactories must be added by Loader directly, and most
-	 * should be added by Editors. FormatAdapterFactory is an example of one
-	 * that can be returned here, since the timing of adding it is not
-	 * critical, but it may be needed even when an editor is not being used.
-	 */
-	List getAdapterFactories();
-
-	/**
-	 * Returns the ID for the associated ContentTypeHandler But is needed for
-	 * now.
-	 */
-	String getAssociatedContentTypeId();
-
-	/**
-	 * The Loader is reponsible for decoding the Resource,
-	 */
-	IModelLoader getModelLoader();
-
-	boolean isDefault();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockMarker.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockMarker.java
deleted file mode 100644
index 468b360..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockMarker.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-
-
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-
-
-/**
- * ISSUE: need to provide functionality in improved API. 
- */
-public class BlockMarker extends TagMarker {
-
-	// allow for JSP expressions within the block
-	protected boolean fAllowJSP = true;
-
-	protected boolean fCaseSensitive = false;
-
-	// the context for the contents of this tag (BLOCK_TEXT, JSP_CONTENT,
-	// etc.)
-	protected String fContext;
-
-	public BlockMarker(String tagName, ITextRegion marker, String context) {
-		this(tagName, marker, context, true);
-	}
-
-	public BlockMarker(String tagName, ITextRegion marker, String context, boolean caseSensitive) {
-		this(tagName, marker, context, caseSensitive, true);
-	}
-
-	public BlockMarker(String tagName, ITextRegion marker, String context, boolean caseSensitive, boolean allowJSP) {
-		super(tagName, marker);
-		setContext(context);
-		setCaseSensitive(caseSensitive);
-		setAllowJSP(allowJSP);
-	}
-
-	public BlockMarker(String tagName, String regionContext, boolean caseSensitive) {
-		this(tagName, null, regionContext, caseSensitive, false);
-	}
-
-	/**
-	 * Gets the allowJSP.
-	 * 
-	 * @return Returns a boolean
-	 */
-	public boolean allowsJSP() {
-		return fAllowJSP;
-	}
-
-	/**
-	 * Gets the context.
-	 * 
-	 * @return Returns a String
-	 */
-	public String getContext() {
-		return fContext;
-	}
-
-	/**
-	 * 
-	 * @return boolean
-	 */
-	public final boolean isCaseSensitive() {
-		return fCaseSensitive;
-	}
-
-	/**
-	 * Sets the allowJSP.
-	 * 
-	 * @param allowJSP
-	 *            The allowJSP to set
-	 */
-	public void setAllowJSP(boolean allowJSP) {
-		fAllowJSP = allowJSP;
-	}
-
-	public final void setCaseSensitive(boolean sensitive) {
-		fCaseSensitive = sensitive;
-	}
-
-	/**
-	 * Sets the context.
-	 * 
-	 * @param context
-	 *            The context to set
-	 */
-	public void setContext(String context) {
-		fContext = context;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockTagParser.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockTagParser.java
deleted file mode 100644
index 6bd6b70..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockTagParser.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-
-
-import java.util.List;
-
-public interface BlockTagParser {
-
-	void addBlockMarker(BlockMarker marker);
-
-	void beginBlockScan(String tagName);
-
-	BlockMarker getBlockMarker(String tagName);
-
-	List getBlockMarkers();
-
-	void removeBlockMarker(BlockMarker marker);
-
-	void removeBlockMarker(String tagName);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockTokenizer.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockTokenizer.java
deleted file mode 100644
index b5ad534..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/BlockTokenizer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-
-
-public interface BlockTokenizer {
-
-	void addBlockMarker(BlockMarker marker);
-
-	void beginBlockMarkerScan(String newTagName, String context);
-
-	void beginBlockTagScan(String newTagName);
-
-	List getBlockMarkers();
-
-	ITextRegion getNextToken() throws IOException;
-
-	int getOffset();
-
-	boolean isEOF();
-
-	BlockTokenizer newInstance();
-
-	void removeBlockMarker(BlockMarker marker);
-
-	void removeBlockMarker(String tagname);
-
-	void reset(char[] charArray);
-
-	void reset(char[] charArray, int newOffset);
-
-	void reset(InputStream in);
-
-	void reset(InputStream in, int newOffset);
-
-	void reset(Reader in);
-
-	void reset(Reader in, int newOffset);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/IBlockedStructuredDocumentRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/IBlockedStructuredDocumentRegion.java
deleted file mode 100644
index 30eab0c..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/IBlockedStructuredDocumentRegion.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-
-/**
- * IBlockedStructuredDocumentRegion is just like an IStructuredDocumentRegion
- * except results from parsing a "block tag" (such as SCRIPT or STYLE).
- * Because these are "variable" partition types, its often handy (efficient)
- * to keep track of the partition type.
- * 
- * @plannedfor 1.0
- */
-public interface IBlockedStructuredDocumentRegion extends IStructuredDocumentRegion {
-	/**
-	 * Return the partion type for this region.
-	 * 
-	 * @return the partion type.
-	 */
-	String getPartitionType();
-
-	/**
-	 * Sets the partion type.
-	 * 
-	 * For use by parsers and re-parsers only.
-	 * 
-	 * @param partitionType
-	 */
-	void setPartitionType(String partitionType);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/JSPCapableParser.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/JSPCapableParser.java
deleted file mode 100644
index 3d55973..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/JSPCapableParser.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-import java.util.List;
-
-public interface JSPCapableParser extends RegionParser, BlockTagParser {
-	void addNestablePrefix(TagMarker marker);
-
-	/**
-	 * returns the TagMarkers for prefixes that are allowed to be nestable
-	 * 
-	 * @return
-	 */
-	List getNestablePrefixes();
-
-	void removeNestablePrefix(String tagName);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/RegionParser.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/RegionParser.java
deleted file mode 100644
index 628dfc6..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/RegionParser.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-
-
-import java.io.Reader;
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-
-
-public interface RegionParser {
-
-	IStructuredDocumentRegion getDocumentRegions();
-
-	List getRegions();
-
-	/**
-	 * The 'newInstance' method is similar to 'clone', but does not include
-	 * the copying of any content. For a pure RegionParser itself, there would
-	 * be little state to "clone", but for some subtypes, such as
-	 * StructuredDocumentRegionParser and JSPCapableParser, there could the
-	 * more internal data to "clone", such as the internal tokenizer should be
-	 * cloned (including block tags, etc).
-	 */
-	RegionParser newInstance();
-
-	void reset(Reader reader);
-
-	/**
-	 * An additional offset for use with any position-dependant parsing rules
-	 */
-	void reset(Reader reader, int offset);
-
-	void reset(String input);
-
-	/**
-	 * An additional offset for use with any position-dependant parsing rules
-	 */
-	void reset(String input, int offset);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionHandler.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionHandler.java
deleted file mode 100644
index 31e5cba..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-
-public interface StructuredDocumentRegionHandler {
-
-	// Sent when a IStructuredDocumentRegion is first parsed
-	public void nodeParsed(IStructuredDocumentRegion aCoreStructuredDocumentRegion);
-
-	// Sent when the calling parser's model undergoes a full reset
-	//   and any information based upon the old model should be
-	//   cleared
-	public void resetNodes();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionHandlerExtension.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionHandlerExtension.java
deleted file mode 100644
index 85f2d7b..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionHandlerExtension.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-
-public interface StructuredDocumentRegionHandlerExtension extends StructuredDocumentRegionHandler {
-	void setStructuredDocument(IStructuredDocument newDocument);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionParser.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionParser.java
deleted file mode 100644
index d4bbe5d..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionParser.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-
-
-public interface StructuredDocumentRegionParser extends RegionParser {
-
-	void addStructuredDocumentRegionHandler(StructuredDocumentRegionHandler handler);
-
-	void removeStructuredDocumentRegionHandler(StructuredDocumentRegionHandler handler);
-
-	void resetHandlers();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionParserExtension.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionParserExtension.java
deleted file mode 100644
index 474950e..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/StructuredDocumentRegionParserExtension.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-import java.util.List;
-
-
-
-public interface StructuredDocumentRegionParserExtension extends StructuredDocumentRegionParser {
-	/**
-	 * Returns the current list of StructuredDocumentRegionHandlers listening
-	 * to this parser.
-	 * 
-	 * @return List - the list of listeners, the list may not be null and each
-	 *         element in it must implement StructuredDocumentRegionHandler
-	 */
-	List getStructuredDocumentRegionHandlers();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/TagMarker.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/TagMarker.java
deleted file mode 100644
index 3de225d..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/ltk/parser/TagMarker.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.ltk.parser;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-
-/**
- * ISSUE: need to provide functionality in improved API. 
- */
-
-public class TagMarker {
-
-	// a ITextRegion (meant to be updated with the model) marking the position
-	// where this tagname becomes effective
-	protected ITextRegion fMarker = null;
-
-	// the tagname
-	protected String fTagName = null;
-
-	/**
-	 *  
-	 */
-	public TagMarker() {
-		super();
-	}
-
-	public TagMarker(String tagname) {
-		super();
-		setTagName(tagname);
-	}
-
-	public TagMarker(String tagname, ITextRegion marker) {
-		super();
-		setTagName(tagname);
-		setMarker(marker);
-	}
-
-	public final ITextRegion getMarker() {
-		return fMarker;
-	}
-
-	/**
-	 * @return java.lang.String
-	 */
-	public final String getTagName() {
-		return fTagName;
-	}
-
-	/**
-	 * @return boolean
-	 */
-	public boolean isGlobal() {
-		return fMarker == null;
-	}
-
-	/**
-	 * @param newMarker
-	 */
-	public final void setMarker(ITextRegion newMarker) {
-		fMarker = newMarker;
-	}
-
-	/**
-	 * @param newTagname
-	 *            java.lang.String
-	 */
-	public final void setTagName(String newTagName) {
-		fTagName = newTagName;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractModelLoader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractModelLoader.java
deleted file mode 100644
index caafaaf..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractModelLoader.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.model;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocumentExtension3;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTagParser;
-import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
-import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandlerExtension;
-import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionParser;
-import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionParserExtension;
-import org.eclipse.wst.sse.core.internal.provisional.IModelLoader;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
-import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument;
-import org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-
-
-/**
- * This class reads a file and creates an Structured Model.
- */
-public abstract class AbstractModelLoader implements IModelLoader {
-	protected static final int encodingNameSearchLimit = 1000;
-
-	private static long computeMem() {
-		for (int i = 0; i < 5; i++) {
-			System.gc();
-			System.runFinalization();
-		}
-		return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
-	}
-
-	private boolean DEBUG = false;
-	protected IDocumentLoader documentLoaderInstance;
-
-	/**
-	 * AbstractLoader constructor also initializes encoding converter/mapper
-	 */
-	public AbstractModelLoader() {
-		super();
-	}
-
-	protected void addFactories(IStructuredModel model, List factoryList) {
-		Assert.isNotNull(model);
-		FactoryRegistry registry = model.getFactoryRegistry();
-		Assert.isNotNull(registry, "IStructuredModel " + model.getId() + " has a null FactoryRegistry"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (factoryList != null) {
-			Iterator iterator = factoryList.iterator();
-			while (iterator.hasNext()) {
-				INodeAdapterFactory factory = (INodeAdapterFactory) iterator.next();
-				registry.addFactory(factory);
-			}
-		}
-	}
-
-	/**
-	 * This method should perform all the model initialization required before
-	 * it contains content, namely, it should call newModel, the
-	 * createNewStructuredDocument(), then add those adapter factories which
-	 * must be set before content is applied. This method should be called by
-	 * "load" method. (this is tentative API)
-	 */
-	public IStructuredModel createModel() {
-		documentLoaderInstance = null;
-		IStructuredModel model = newModel();
-		IEncodedDocument structuredDocument = getDocumentLoader().createNewStructuredDocument();
-		if (structuredDocument instanceof IStructuredDocument) {
-			model.setStructuredDocument((IStructuredDocument) structuredDocument);
-			addFactories(model, getAdapterFactories());
-			//
-			initEmbeddedTypePre(model, (IStructuredDocument) structuredDocument);
-			initEmbeddedTypePost(model);
-			// For types with propagating adapters, its important
-			// that the propagating adapter be in place before the contents
-			// are set.
-			preLoadAdapt(model);
-		}
-		return model;
-	}
-
-	public IStructuredModel createModel(IStructuredDocument structuredDocument, String baseLocation, IModelHandler handler) {
-		documentLoaderInstance = null;
-		IStructuredModel model = newModel();
-		model.setBaseLocation(baseLocation);
-		
-		// handler must be set early, incase a re-init is 
-		// required during creation.
-		model.setModelHandler(handler);
-		
-		addFactories(model, getAdapterFactories());
-		// For types with propagating adapters, it's important
-		// that the propagating adapter be in place before the contents
-		// are set.
-		preLoadAdapt(model);
-		initEmbeddedTypePre(model, structuredDocument);
-
-		model.setStructuredDocument(structuredDocument);
-		//
-		initEmbeddedTypePost(model);
-
-		return model;
-	}
-
-	/**
-	 * This method is used for cloning models.
-	 */
-	public IStructuredModel createModel(IStructuredModel oldModel) {
-		documentLoaderInstance = null;
-		IStructuredModel newModel = newModel();
-		IStructuredDocument oldStructuredDocument = oldModel.getStructuredDocument();
-		IStructuredDocument newStructuredDocument = oldStructuredDocument.newInstance();
-		newModel.setStructuredDocument(newStructuredDocument);
-		// NOTE: we DO NOT simply add the standard ones to the new model
-		// addFactories(newModel, getAdapterFactories());
-		// Now, we take the opportunity to add Factories from the oldModel's
-		// registry to the new model's registry .. if they do not already
-		// exist there.
-		duplicateFactoryRegistry(newModel, oldModel);
-		if (newModel instanceof AbstractStructuredModel) {
-			((AbstractStructuredModel) newModel).setContentTypeIdentifier(oldModel.getContentTypeIdentifier());
-		}
-		// addFactories(newModel, oldModel);
-		initEmbeddedType(oldModel, newModel);
-		// For types with propagating adapters, its important
-		// that the propagating adapter be in place before the contents
-		// are set.
-		preLoadAdapt(newModel);
-		return newModel;
-	}
-
-	private void duplicateFactoryRegistry(IStructuredModel newModel, IStructuredModel oldModel) {
-		List oldAdapterFactories = oldModel.getFactoryRegistry().getFactories();
-		List newAdapterFactories = new ArrayList();
-		Iterator oldListIterator = oldAdapterFactories.iterator();
-		while (oldListIterator.hasNext()) {
-			INodeAdapterFactory oldAdapterFactory = (INodeAdapterFactory) oldListIterator.next();
-			// now "clone" the adapterfactory
-			newAdapterFactories.add(oldAdapterFactory.copy());
-		}
-		// now that we have the "cloned" list, add to new model
-		addFactories(newModel, newAdapterFactories);
-	}
-
-	/**
-	 * This method must return those factories which must be attached to the
-	 * structuredModel before content is applied.
-	 */
-	public List getAdapterFactories() {
-		// abstract method returns none
-		return new ArrayList(0);
-	}
-
-	abstract public IDocumentLoader getDocumentLoader();
-
-	/**
-	 * Method initEmbeddedType, "pre"-stage. Nothing to do here in super class.
-	 * 
-	 * @param model
-	 */
-	protected void initEmbeddedTypePre(IStructuredModel model) {
-	}
-
-	/**
-	 * Method initEmbeddedType, "pre"-stage. By default simply calls the
-	 * version of this method that uses only the structured model.
-	 * 
-	 * @param model
-	 *            the model for which to initialize
-	 * @param structuredDocument
-	 *            The structured document containing the text content for the
-	 *            model, which may be a different instance than what is in the
-	 *            model at this stage.
-	 */
-	protected void initEmbeddedTypePre(IStructuredModel model, IStructuredDocument structuredDocument) {
-		initEmbeddedTypePre(model);
-	}
-		
-	protected void initEmbeddedTypePost(IStructuredModel model) {
-	}
-
-	/**
-	 * Method initEmbeddedType. Nothing to do here in super class.
-	 * 
-	 * @param oldModel
-	 * @param newModel
-	 */
-	protected void initEmbeddedType(IStructuredModel oldModel, IStructuredModel newModel) {
-	}
-
-	public void load(IFile file, IStructuredModel model) throws IOException, CoreException {
-		IEncodedDocument structuredDocument = model.getStructuredDocument();
-		if (file == null)
-			structuredDocument = getDocumentLoader().createNewStructuredDocument();
-		else
-			structuredDocument = getDocumentLoader().createNewStructuredDocument(file);
-
-		// TODO: need to straighten out IEncodedDocument mess
-		if (structuredDocument instanceof IStructuredDocument)
-			transformInstance(model.getStructuredDocument(), (IStructuredDocument) structuredDocument);
-		else
-			model.getStructuredDocument().set(structuredDocument.get());
-
-		// original hack
-		// model.setStructuredDocument((IStructuredDocument)
-		// structuredDocument);
-		// ((IStructuredDocument) structuredDocument).fireNewDocument(this);
-		documentLoaderInstance = null;
-		// technicq of future
-		// model.setStructuredDocument((IStructuredDocument)
-		// structuredDocument);
-		// documentLoaderInstance = null;
-	}
-
-	public void load(InputStream inputStream, IStructuredModel model, EncodingRule encodingRule) throws UnsupportedEncodingException, java.io.IOException {
-		// note we don't open the stream, so we don't close it
-		IEncodedDocument structuredDocument = model.getStructuredDocument();
-		if (inputStream == null) {
-			structuredDocument = getDocumentLoader().createNewStructuredDocument();
-		}
-		else {
-			// assume's model has been initialized already with base location
-			structuredDocument = getDocumentLoader().createNewStructuredDocument(model.getBaseLocation(), inputStream, encodingRule);
-			// TODO: model's not designed for this!
-			// we want to move to this "set" method, but the 'fire' was needed
-			// as
-			// a work around for strucutredModel not handling 'set' right, but
-			// that 'fireNewDocument' method was causing unbalance
-			// "aboutToChange" and "changed"
-			// events.
-			// model.setStructuredDocument((IStructuredDocument)
-			// structuredDocument);
-			// ((IStructuredDocument)
-			// structuredDocument).fireNewDocument(this);
-			model.getStructuredDocument().set(structuredDocument.get());
-
-		}
-		documentLoaderInstance = null;
-
-	}
-
-	/**
-	 * deprecated -- use EncodingRule form
-	 */
-	synchronized public void load(InputStream inputStream, IStructuredModel model, String encodingName, String lineDelimiter) throws UnsupportedEncodingException, java.io.IOException {
-		// note we don't open the stream, so we don't close it
-		// TEMP work around to maintain previous function,
-		// until everyone can change to EncodingRule.FORCE_DEFAULT
-		if (encodingName != null && encodingName.trim().length() == 0) {
-			// redirect to new method
-			load(inputStream, model, EncodingRule.FORCE_DEFAULT);
-		}
-		else {
-			load(inputStream, model, EncodingRule.CONTENT_BASED);
-		}
-	}
-
-	public void load(String filename, InputStream inputStream, IStructuredModel model, String junk, String dummy) throws UnsupportedEncodingException, java.io.IOException {
-
-		long memoryUsed = 0;
-		if (DEBUG) {
-			memoryUsed = computeMem();
-			System.out.println("measuring heap memory for " + filename); //$NON-NLS-1$
-			// System.out.println("heap memory used before load: " +
-			// memoryUsed);
-		}
-
-		// during an initial load, we expect the olddocument to be empty
-		// during re-load, however, it would be full.
-		IEncodedDocument newstructuredDocument = null;
-		IEncodedDocument oldStructuredDocument = model.getStructuredDocument();
-
-		// get new document
-		if (inputStream == null) {
-			newstructuredDocument = getDocumentLoader().createNewStructuredDocument();
-		}
-		else {
-			newstructuredDocument = getDocumentLoader().createNewStructuredDocument(filename, inputStream);
-		}
-		if (DEBUG) {
-			long memoryAtEnd = computeMem();
-			// System.out.println("heap memory used after loading new
-			// document: " + memoryAtEnd);
-			System.out.println("    heap memory implied used by document: " + (memoryAtEnd - memoryUsed)); //$NON-NLS-1$
-		}
-
-
-		// TODO: need to straighten out IEncodedDocument mess
-		if (newstructuredDocument instanceof IStructuredDocument) {
-			transformInstance((IStructuredDocument) oldStructuredDocument, (IStructuredDocument) newstructuredDocument);
-		}
-		else {
-			// we don't really expect this case, just included for safety
-			oldStructuredDocument.set(newstructuredDocument.get());
-		}
-		// original hack
-		// model.setStructuredDocument((IStructuredDocument)
-		// structuredDocument);
-		// ((IStructuredDocument) structuredDocument).fireNewDocument(this);
-		documentLoaderInstance = null;
-		// technicq of future
-		// model.setStructuredDocument((IStructuredDocument)
-		// structuredDocument);
-		// documentLoaderInstance = null;
-		if (DEBUG) {
-			long memoryAtEnd = computeMem();
-			// System.out.println("heap memory used after setting to model: "
-			// + memoryAtEnd);
-			System.out.println("    heap memory implied used by document and model: " + (memoryAtEnd - memoryUsed)); //$NON-NLS-1$
-		}
-
-	}
-
-	/**
-	 * required by interface, being declared here abstractly just as another
-	 * reminder.
-	 */
-	abstract public IStructuredModel newModel();
-
-	/**
-	 * There's nothing to do here in abstract class for initializing adapters.
-	 * Subclasses can and should override this method and provide proper
-	 * intialization (For example, to get DOM document and 'getAdapter' on it,
-	 * so that the first node/notifier has the adapter on it.)
-	 */
-	protected void preLoadAdapt(IStructuredModel structuredModel) {
-
-
-	}
-
-	/**
-	 * Normally, here in the abstact class, there's nothing to do, but we will
-	 * reset text, since this MIGHT end up being called to recover from error
-	 * conditions (e.g. IStructuredDocument exceptions) And, can be called by
-	 * subclasses.
-	 */
-	public IStructuredModel reinitialize(IStructuredModel model) {
-		// Note: the "minimumization" routines
-		// of 'replaceText' allow many old nodes to pass through, when
-		// really its assumed they are created anew.
-		// so we need to use 'setText' (I think "setText' ends up
-		// throwing a 'newModel' event though, that may have some
-		// implications.
-		model.getStructuredDocument().setText(this, model.getStructuredDocument().get());
-		return model;
-	}
-
-	/**
-	 * This method gets a fresh copy of the data, and repopulates the models
-	 * ... by a call to setText on the structuredDocument. This method is
-	 * needed in some cases where clients are sharing a model and then changes
-	 * canceled. Say for example, one editor and several "displays" are
-	 * sharing a model, if the editor is closed without saving changes, then
-	 * the displays still need a model, but they should revert to the original
-	 * unsaved version.
-	 */
-	synchronized public void reload(InputStream inputStream, IStructuredModel structuredModel) {
-		documentLoaderInstance = null;
-		try {
-			// temp solution ... we should be able to do better (more
-			// efficient) in future.
-			// Adapters will (probably) need to be sensitive to the fact that
-			// the document instance changed
-			// (by being life cycle listeners)
-			load(inputStream, structuredModel, EncodingRule.CONTENT_BASED);
-
-			// // Note: we apparently read the data (and encoding) correctly
-			// // before, we just need to make sure we followed the same rule
-			// as
-			// // before.
-			// EncodingMemento previousMemento =
-			// structuredModel.getStructuredDocument().getEncodingMemento();
-			// EncodingRule previousRule = previousMemento.getEncodingRule();
-			// //IFile file = ResourceUtil.getFileFor(structuredModel);
-			// // Note: there's opportunity here for some odd behavior, if the
-			// // settings have changed from the first load to the reload.
-			// But,
-			// // hopefully,
-			// // will result in the intended behavior.
-			// Reader allTextReader =
-			// getDocumentLoader().readInputStream(inputStream, previousRule);
-			//
-			// // TODO: avoid use of String instance
-			// getDocumentLoader().reload(structuredModel.getStructuredDocument(),
-			// allTextReader);
-			// // and now "reset" encoding memento to keep it current with the
-			// // one
-			// // that was just determined.
-			// structuredModel.getStructuredDocument().setEncodingMemento(getDocumentLoader().getEncodingMemento());
-			// structuredModel.setDirtyState(false);
-			// StructuredTextUndoManager undoMgr =
-			// structuredModel.getUndoManager();
-			// if (undoMgr != null) {
-			// undoMgr.reset();
-			// }
-		}
-		catch (UnsupportedEncodingException e) {
-			// couldn't happen. The program has apparently
-			// read the model once, and there'd be no reason the encoding
-			// could not be used again.
-			Logger.logException("Warning:  XMLLoader::reload.  This exception really should not have happened!! But will attemp to continue after dumping stack trace", e); //$NON-NLS-1$
-			throw new Error("Program Error", e); //$NON-NLS-1$
-		}
-		catch (IOException e) {
-			// couldn't happen. The program has apparently
-			// read the model once, and there'd be no (common) reason it
-			// couldn't be loaded again.
-			Logger.logException("Warning:  XMLLoader::reload.  This exception really should not have happened!! But will attemp to continue after dumping stack trace", e); //$NON-NLS-1$
-			throw new Error("Program Error", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * this work is done better elsewhere, but done here for this version to
-	 * reduce changes. especially since the need for it should go away once we
-	 * no longer need to re-use old document instance.
-	 */
-	private void transformInstance(IStructuredDocument oldInstance, IStructuredDocument newInstance) {
-		/**
-		 * https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=4920
-		 * 
-		 * JSP taglib support broken, correct by duplicating extended setup
-		 * information (BlockTagParser extension,
-		 * StructuredDocumentRegionParser extensions)
-		 */
-		RegionParser oldParser = oldInstance.getParser();
-		RegionParser newParser = newInstance.getParser().newInstance();
-		// Register all of the old StructuredDocumentRegionHandlers on the new
-		// parser
-		if (oldParser instanceof StructuredDocumentRegionParserExtension && newParser instanceof StructuredDocumentRegionParserExtension) {
-			List oldHandlers = ((StructuredDocumentRegionParserExtension) oldParser).getStructuredDocumentRegionHandlers();
-			for (int i = 0; i < oldHandlers.size(); i++) {
-				StructuredDocumentRegionHandler handler = ((StructuredDocumentRegionHandler) oldHandlers.get(i));
-				if (handler instanceof StructuredDocumentRegionHandlerExtension) {
-					/**
-					 * Skip the transferring here, the handler will do this
-					 * after everything else but the source is transferred.
-					 */
-				}
-				else {
-					((StructuredDocumentRegionParser) oldParser).removeStructuredDocumentRegionHandler(handler);
-					((StructuredDocumentRegionParser) newParser).addStructuredDocumentRegionHandler(handler);
-					handler.resetNodes();
-				}
-			}
-		}
-		// Add any global BlockMarkers to the new parser
-		if (oldParser instanceof BlockTagParser && newParser instanceof BlockTagParser) {
-			List oldBlockMarkers = ((BlockTagParser) oldParser).getBlockMarkers();
-			for (int i = 0; i < oldBlockMarkers.size(); i++) {
-				BlockMarker blockMarker = ((BlockMarker) oldBlockMarkers.get(i));
-				if (blockMarker.isGlobal()) {
-					((BlockTagParser) newParser).addBlockMarker(blockMarker);
-				}
-			}
-		}
-
-		((BasicStructuredDocument) oldInstance).setParser(newParser);
-
-		((BasicStructuredDocument) oldInstance).setReParser(newInstance.getReParser().newInstance());
-
-		if (newInstance.getDocumentPartitioner() instanceof StructuredTextPartitioner) {
-			StructuredTextPartitioner partitioner = null;
-			if (oldInstance instanceof IDocumentExtension3 && newInstance instanceof IDocumentExtension3) {
-				partitioner = ((StructuredTextPartitioner) ((IDocumentExtension3) newInstance).getDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING));
-				if (partitioner != null) {
-					partitioner = (StructuredTextPartitioner) partitioner.newInstance();
-				}
-				((IDocumentExtension3) oldInstance).setDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, partitioner);
-			}
-			if (partitioner == null) {
-				partitioner = (StructuredTextPartitioner) ((StructuredTextPartitioner) newInstance.getDocumentPartitioner()).newInstance();
-				oldInstance.setDocumentPartitioner(partitioner);
-			}
-			if (partitioner != null) {
-				partitioner.connect(oldInstance);
-			}
-		}
-
-		String existingLineDelimiter = null;
-		try {
-			existingLineDelimiter = newInstance.getLineDelimiter(0);
-		}
-		catch (BadLocationException e) {
-			// if empty file, assume platform default
-			// TODO: should be using user set preference, per content type?
-			existingLineDelimiter = System.getProperty("line.separator"); //$NON-NLS-1$
-		}
-
-		oldInstance.setLineDelimiter(existingLineDelimiter); //$NON-NLS-1$);
-		if (newInstance.getEncodingMemento() != null) {
-			oldInstance.setEncodingMemento((EncodingMemento) newInstance.getEncodingMemento().clone());
-		}
-
-		/**
-		 * https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=4920
-		 * 
-		 * JSP taglib support broken, correct by duplicating extended setup
-		 * information (BlockTagParser extension,
-		 * StructuredDocumentRegionParser extensions)
-		 */
-		if (oldParser instanceof StructuredDocumentRegionParserExtension && newParser instanceof StructuredDocumentRegionParserExtension) {
-			List oldHandlers = ((StructuredDocumentRegionParserExtension) oldParser).getStructuredDocumentRegionHandlers();
-			for (int i = 0; i < oldHandlers.size(); i++) {
-				StructuredDocumentRegionHandler handler = ((StructuredDocumentRegionHandler) oldHandlers.get(i));
-				if (handler instanceof StructuredDocumentRegionHandlerExtension) {
-					StructuredDocumentRegionHandlerExtension handlerExtension = (StructuredDocumentRegionHandlerExtension) handler;
-					handlerExtension.setStructuredDocument(oldInstance);
-				}
-			}
-		}
-		String holdString = newInstance.get();
-		newInstance = null;
-		oldInstance.set(holdString);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractStructuredModel.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractStructuredModel.java
deleted file mode 100644
index 06e54162..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractStructuredModel.java
+++ /dev/null
@@ -1,1565 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.model;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.ILockable;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.SSECoreMessages;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.provisional.DocumentChanged;
-import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.events.AboutToBeChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.IModelAboutToBeChangedListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.NewDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-
-
-public abstract class AbstractStructuredModel implements IStructuredModel {
-
-	private static final String MODEL_MANAGER_NULL = "Warning: AbstractStructuredModel::close:  model manager was null during a close of a model (which should be impossible)"; //$NON-NLS-1$
-
-	class DirtyStateWatcher implements IStructuredDocumentListener {
-
-		public void newModel(NewDocumentEvent structuredDocumentEvent) {
-
-			// I don't think its safe to assume a new model
-			// is always "fresh", so we'll leave dirty state
-			// unchanged;
-			// but we'll tell everyone about it.
-			setDirtyState(fDirtyState);
-		}
-
-		public void noChange(NoChangeEvent structuredDocumentEvent) {
-
-			// don't change dirty state
-		}
-
-		public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {
-
-			setDirtyState(true);
-			// no need to listen any more
-			if (fStructuredDocument != null) {
-				fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);
-			}
-		}
-
-		public void regionChanged(RegionChangedEvent structuredDocumentEvent) {
-
-			setDirtyState(true);
-			// no need to listen any more
-			if (fStructuredDocument != null) {
-				fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);
-			}
-		}
-
-		public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {
-
-			setDirtyState(true);
-			// no need to listen any more
-			if (fStructuredDocument != null) {
-				fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);
-			}
-		}
-	}
-
-	class DocumentToModelNotifier implements IStructuredDocumentListener, IModelAboutToBeChangedListener {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.wst.sse.core.events.IModelAboutToBeChangedListener#modelAboutToBeChanged(org.eclipse.wst.sse.core.events.AboutToBeChangedEvent)
-		 */
-		public void modelAboutToBeChanged(AboutToBeChangedEvent structuredDocumentEvent) {
-			// If we didn't originate the change, take note we are about to
-			// change based on our underlying document changing.
-			// If we did originate the change, we, or client, should have
-			// already called aboutToChangeModel.
-			if (structuredDocumentEvent.getOriginalRequester() != this) {
-				aboutToChangeModel();
-			}
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#newModel(org.eclipse.wst.sse.core.events.NewDocumentEvent)
-		 */
-		public void newModel(NewDocumentEvent structuredDocumentEvent) {
-			// if we didn't originate the change, take note we have changed
-			if (structuredDocumentEvent.getOriginalRequester() != this) {
-				changedModel();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#noChange(org.eclipse.wst.sse.core.events.NoChangeEvent)
-		 */
-		public void noChange(NoChangeEvent structuredDocumentEvent) {
-			// if we didn't originate the change, take note we have changed
-			if (structuredDocumentEvent.getOriginalRequester() != this) {
-				changedModel();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#nodesReplaced(org.eclipse.wst.sse.core.events.StructuredDocumentRegionsReplacedEvent)
-		 */
-		public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {
-			// if we didn't originate the change, take note we have changed
-			if (structuredDocumentEvent.getOriginalRequester() != this) {
-				changedModel();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#regionChanged(org.eclipse.wst.sse.core.events.RegionChangedEvent)
-		 */
-		public void regionChanged(RegionChangedEvent structuredDocumentEvent) {
-			// if we didn't originate the change, take note we have changed
-			if (structuredDocumentEvent.getOriginalRequester() != this) {
-				changedModel();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#regionsReplaced(org.eclipse.wst.sse.core.events.RegionsReplacedEvent)
-		 */
-		public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {
-			// if we didn't originate the change, take note we have changed
-			if (structuredDocumentEvent.getOriginalRequester() != this) {
-				changedModel();
-			}
-		}
-
-	}
-
-	private FactoryRegistry factoryRegistry;
-	private String fBaseLocation;
-	boolean fDirtyState;
-	DirtyStateWatcher fDirtyStateWatcher;
-	DocumentToModelNotifier fDocumentToModelNotifier;
-	private String fExplicitContentTypeIdentifier;
-	private String fId;
-
-	private LifecycleNotificationManager fLifecycleNotificationManager;
-
-	private final Object fListenerLock = new byte[0];
-	protected ILock fLockObject;
-	// private String fLineDelimiter;
-	// private Object fType;
-	private IModelHandler fModelHandler;
-	// issue: we should not "hold on" to model manager, can 
-	// easily get with StructuredModelManager.getModelManager();
-	// but will need to add more null checks.
-	private IModelManager fModelManager;
-	private int fModelStateChanging;
-	private Object[] fModelStateListeners;
-	private boolean fNewState = false;
-	private URIResolver fResolver;
-	protected IStructuredDocument fStructuredDocument;
-	/**
-	 * The time stamp of the underlying resource's modification date, at the
-	 * time this model was created, or the last time it was saved. Note: for
-	 * this version, this variable is not set automatically, be needs to be
-	 * managed by client. The FileModelProvider does this for most cases, but
-	 * if client do not use FileModelProvider, they must set this variable
-	 */
-	public long fSynchronizationStamp = IResource.NULL_STAMP;
-	private boolean reinitializationNeeded;
-	private Object reinitializeStateData;
-
-	/**
-	 * AbstractStructuredModel constructor comment.
-	 */
-	public AbstractStructuredModel() {
-
-		super();
-		fDirtyStateWatcher = new DirtyStateWatcher();
-		fDocumentToModelNotifier = new DocumentToModelNotifier();
-	}
-
-
-	/**
-	 * This method is just for getting an instance of the model manager of the
-	 * right Impl type, to be used "internally" for making protected calls
-	 * directly to the impl class.
-	 */
-	private ModelManagerImpl _getModelManager() {
-		// TODO_future: redesign so we don't need this 'Impl' version
-		if (fModelManager == null) {
-			fModelManager = StructuredModelManager.getModelManager();
-		}
-
-		return (ModelManagerImpl) fModelManager;
-	}
-
-	/**
-	 * This API allows clients to declare that they are about to make a
-	 * "large" change to the model. This change might be in terms of content
-	 * or it might be in terms of the model id or base location. Note that in
-	 * the case of embedded calls, notification to listeners is sent only
-	 * once. Note that the client who is making these changes has the
-	 * responsibility to restore the models state once finished with the
-	 * changes. See getMemento and restoreState. The method
-	 * isModelStateChanging can be used by a client to determine if the model
-	 * is already in a change sequence.
-	 */
-	public void aboutToChangeModel() {
-
-
-		// notice this is just a public avenue to our protected method
-		internalAboutToBeChanged();
-	}
-
-
-	public void aboutToReinitializeModel() {
-
-
-
-		// notice this is just a public avenue to our protected method
-		fireModelAboutToBeReinitialized();
-	}
-
-
-	public void addModelLifecycleListener(IModelLifecycleListener listener) {
-
-		synchronized (fListenerLock) {
-			if (fLifecycleNotificationManager == null) {
-				fLifecycleNotificationManager = new LifecycleNotificationManager();
-			}
-			fLifecycleNotificationManager.addListener(listener);
-		}
-	}
-
-	public void addModelStateListener(IModelStateListener listener) {
-
-		synchronized (fListenerLock) {
-
-			if (!Utilities.contains(fModelStateListeners, listener)) {
-				int oldSize = 0;
-				if (fModelStateListeners != null) {
-					// normally won't be null, but we need to be sure, for
-					// first
-					// time through
-					oldSize = fModelStateListeners.length;
-				}
-				int newSize = oldSize + 1;
-				Object[] newListeners = new Object[newSize];
-				if (fModelStateListeners != null) {
-					System.arraycopy(fModelStateListeners, 0, newListeners, 0, oldSize);
-				}
-				// add listener to last position
-				newListeners[newSize - 1] = listener;
-				//
-				// now switch new for old
-				fModelStateListeners = newListeners;
-			}
-		}
-	}
-
-	/**
-	 * This lock to lock the small bits of data and operations in the models
-	 * themselfes. this lock is "shared" with document, so, eventually,
-	 * changes can be made safefly from either side.
-	 */
-	protected final void beginLock() {
-
-		// if we get a different lock object
-		// than we had before, besure to release
-		// old one first before losing it.
-		// ISSUE: this smells like an error condition,
-		// when would this happen? better to check in set document?
-		ILock documentLock = getLockObjectFromDocument();
-
-		if (fLockObject != null && fLockObject != documentLock) {
-			fLockObject.release();
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "Model lock released early" + fLockObject + " apparently document switched?"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-		}
-		fLockObject = documentLock;
-		if (fLockObject != null) {
-			fLockObject.acquire();
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "Model lock acquired: " + fLockObject); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public void beginRecording(Object requester) {
-
-		beginRecording(requester, null, null);
-	}
-
-	public void beginRecording(Object requester, int cursorPosition, int selectionLength) {
-
-		beginRecording(requester, null, null, cursorPosition, selectionLength);
-	}
-
-	public void beginRecording(Object requester, String label) {
-
-		beginRecording(requester, label, null);
-	}
-
-	public void beginRecording(Object requester, String label, int cursorPosition, int selectionLength) {
-
-		beginRecording(requester, label, null, cursorPosition, selectionLength);
-	}
-
-	public void beginRecording(Object requester, String label, String description) {
-
-		if (getUndoManager() != null)
-			getUndoManager().beginRecording(requester, label, description);
-	}
-
-	public void beginRecording(Object requester, String label, String description, int cursorPosition, int selectionLength) {
-
-		if (getUndoManager() != null)
-			getUndoManager().beginRecording(requester, label, description, cursorPosition, selectionLength);
-	}
-
-	/**
-	 * This API allows a client controlled way of notifying all ModelEvent
-	 * listners that the model has been changed. This method is a matched pair
-	 * to aboutToChangeModel, and *must* be called after aboutToChangeModel
-	 * ... or some listeners could be left waiting indefinitely for the
-	 * changed event. So, its suggested that changedModel always be in a
-	 * finally clause. Likewise, a client should never call changedModel
-	 * without calling aboutToChangeModel first. In the case of embedded
-	 * calls, the notification is just sent once.
-	 */
-	public void changedModel() {
-
-
-		// notice this is just a public avenue to our protected method
-		internalModelChanged();
-		// also note!
-		// if we've been "changed" by a client, we might still need
-		// to be re-initialized, so we'll check and handle that here.
-		// Note only does this provide a solution to some "missed"
-		// re-inits, in provides a built in way for clients to
-		// "force" the model to handle itself, by bracketing any
-		// changes with aboutToChange and changed, the model itself
-		// will check. But only call re-init if all other pending
-		// modelChanged states have been handled.
-		if (fModelStateChanging == 0 && isReinitializationNeeded()) {
-			reinit();
-		}
-	}
-
-
-	/**
-	 * Based on similar method in FileDocumentProvider. It will provide what
-	 * the modificationStamp would be if resetSynchronzationStamp(resource)
-	 * were used, although for this 'compute' API, no changes to the instance
-	 * are made.
-	 */
-	public long computeModificationStamp(IResource resource) {
-
-
-		long modificationStamp = resource.getModificationStamp();
-		IPath path = resource.getLocation();
-		if (path == null) {
-			return modificationStamp;
-		}
-		// Note: checking existence of file is a little different than
-		// impl in
-		// the FileDocumentProvider. See defect number 223790.
-		File file = path.toFile();
-		if (!file.exists()) {
-			return modificationStamp;
-		}
-		modificationStamp = file.lastModified();
-		return modificationStamp;
-	}
-
-
-	/**
-	 * Provides a copy of the model, but a new ID must be provided. The
-	 * principle of this copy is not to copy fields, etc., as is typically
-	 * done in a clone method, but to return a model with the same content in
-	 * the structuredDocument. Note: It is the callers responsibility to
-	 * setBaseLocation, listners, etc., as appropriate. Type and Encoding are
-	 * the only fields set by this method. If the newId provided already exist
-	 * in the model manager, a ResourceInUse exception is thrown.
-	 */
-	public IStructuredModel copy(String newId) throws ResourceInUse {
-
-
-		IStructuredModel newModel = null;
-		// this first one should fail, if not, its treated as an error
-		// If the caller wants to use an existing one, they can call
-		// getExisting
-		// after this failure
-		newModel = getModelManager().getExistingModelForEdit(newId);
-		if (newModel != null) {
-			// be sure to release the reference we got "by accident" (and
-			// no
-			// longer need)
-			newModel.releaseFromEdit();
-			throw new ResourceInUse();
-		}
-		newModel = getModelManager().copyModelForEdit(getId(), newId);
-		return newModel;
-	}
-
-
-	/**
-	 * Disable undo management.
-	 */
-	public void disableUndoManagement() {
-
-		if (getUndoManager() != null)
-			getUndoManager().disableUndoManagement();
-	}
-
-	/**
-	 * Enable undo management.
-	 */
-	public void enableUndoManagement() {
-
-		if (getUndoManager() != null)
-			getUndoManager().enableUndoManagement();
-	}
-
-	/**
-	 * endLock is protected only for a very special purpose. So subclasses can
-	 * call it to end the lock after updates have been made, but before
-	 * notifications are sent
-	 * 
-	 */
-	protected final void endLock() {
-		if (fLockObject != null) {
-			fLockObject.release();
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "Model lock released: " + fLockObject); //$NON-NLS-1$
-			}
-
-		}
-	}
-
-	public void endRecording(Object requester) {
-
-		if (getUndoManager() != null)
-			getUndoManager().endRecording(requester);
-	}
-
-	public void endRecording(Object requester, int cursorPosition, int selectionLength) {
-
-		if (getUndoManager() != null)
-			getUndoManager().endRecording(requester, cursorPosition, selectionLength);
-	}
-
-	/**
-	 * Informs all registered model state listeners that the the model is
-	 * about to under go a change. This change might be in terms of contents
-	 * or might be in terms of the model's id or base location.
-	 */
-	private void fireModelAboutToBeChanged() {
-
-		// we must assign listeners to local variable, since the add and
-		// remove listner
-		// methods can change the actual instance of the listener array
-		// from another thread
-		if (fModelStateListeners != null) {
-			Object[] holdListeners = fModelStateListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				((IModelStateListener) holdListeners[i]).modelAboutToBeChanged(this);
-			}
-		}
-
-	}
-
-	protected void fireModelAboutToBeReinitialized() {
-
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (fModelStateListeners != null) {
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "IModelStateListener event for " + getId() + " : modelAboutToBeReinitialized"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			Object[] holdListeners = fModelStateListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				// NOTE: trick for transition. We actual use the same
-				// listeners
-				// as modelState, but only send this to those that have
-				// implemented ModelStateExtended.
-				IModelStateListener listener = (IModelStateListener) holdListeners[i];
-				listener.modelAboutToBeReinitialized(this);
-			}
-		}
-	}
-
-	private void fireModelChanged() {
-		// we must assign listeners
-		// to local variable, since the add
-		// and remove listner
-		// methods can change the actual instance of the listener
-		// array from another thread
-		if (fModelStateListeners != null) {
-			Object[] holdListeners = fModelStateListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				try {
-					((IModelStateListener) holdListeners[i]).modelChanged(this);
-				}
-				// its so criticial that the begin/end arrive in
-				// pairs,
-				// if there happends to be an error in one of the
-				// modelChanged,
-				// they we want to be sure rest complete ok.
-				catch (Exception e) {
-					Logger.logException(e);
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * Informs all registered model state listeners about a change in the
-	 * dirty state of the model. The dirty state is entirely about changes in
-	 * the content of the model (not, for example, about changes to id, or
-	 * base location -- see modelMoved).
-	 */
-	protected void fireModelDirtyStateChanged(IStructuredModel element, boolean isDirty) {
-
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (fModelStateListeners != null) {
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "IModelStateListener event for " + getId() + " : modelDirtyStateChanged"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			Object[] holdListeners = fModelStateListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				((IModelStateListener) holdListeners[i]).modelDirtyStateChanged(element, isDirty);
-			}
-		}
-	}
-
-	protected void fireModelReinitialized() {
-
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (fModelStateListeners != null) {
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "IModelStateListener event for " + getId() + " : modelReinitialized"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			Object[] holdListeners = fModelStateListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				IModelStateListener listener = (IModelStateListener) holdListeners[i];
-				listener.modelReinitialized(this);
-			}
-		}
-	}
-
-	/**
-	 * Informs all registered model state listeners about the deletion of a
-	 * model's underlying resource.
-	 */
-	protected void fireModelResourceDeleted(IStructuredModel element) {
-
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (fModelStateListeners != null) {
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "IModelStateListener event for " + getId() + " : modelResourceDeleted"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			Object[] holdListeners = fModelStateListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				((IModelStateListener) holdListeners[i]).modelResourceDeleted(element);
-			}
-		}
-	}
-
-	/**
-	 * Informs all registered model state listeners that the resource
-	 * underlying a model has been moved. This is typically reflected in a
-	 * change to the id, baseLocation, or both.
-	 */
-	protected void fireModelResourceMoved(IStructuredModel originalElement, IStructuredModel movedElement) {
-
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (fModelStateListeners != null) {
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "IModelStateListener event for " + getId() + " : modelResourceMoved"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			Object[] holdListeners = fModelStateListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				((IModelStateListener) holdListeners[i]).modelResourceMoved(originalElement, movedElement);
-			}
-		}
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		return Platform.getAdapterManager().getAdapter(this, adapter);
-	}
-
-	/**
-	 * @return java.lang.String
-	 */
-	public java.lang.String getBaseLocation() {
-
-		return fBaseLocation;
-	}
-
-	/**
-	 * @see org.eclipse.wst.sse.core.internal.provisional.IStructuredModel#getContentTypeIdentifier()
-	 */
-	public String getContentTypeIdentifier() {
-		if (fExplicitContentTypeIdentifier != null)
-			return fExplicitContentTypeIdentifier;
-		return fModelHandler.getAssociatedContentTypeId();
-	}
-
-	/**
-	 * 
-	 */
-	public FactoryRegistry getFactoryRegistry() {
-		if (factoryRegistry == null) {
-			factoryRegistry = new FactoryRegistry();
-		}
-		return factoryRegistry;
-	}
-
-	/**
-	 * The id is the id that the model manager uses to identify this model
-	 * 
-	 * @ISSUE - no one should need to know ID, so this should be default access eventually. 
-	 * If clients believe they do need ID, be sure to let us know (open a bug). 
-	 */
-	public String getId() {
-
-		return fId;
-	}
-
-	public abstract IndexedRegion getIndexedRegion(int offset);
-
-	/**
-	 * @return
-	 */
-	private ILock getLockObjectFromDocument() {
-
-		// we always "get afresh" the lock object from our document,
-		// just in case the instance of the document changes.
-		ILock result = null;
-		IStructuredDocument doc = fStructuredDocument;
-		if (doc != null) {
-			if (doc instanceof ILockable) {
-				// remember, more than one client can get the
-				// lock object, its during the aquire that the
-				// lock on the thread is obtained.
-				result = ((ILockable) doc).getLockObject();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Gets the contentTypeDescription.
-	 * 
-	 * @return Returns a ContentTypeDescription
-	 */
-	public IModelHandler getModelHandler() {
-
-		return fModelHandler;
-	}
-
-
-	public IModelManager getModelManager() {
-
-		return _getModelManager();
-	}
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 */
-	// TODO: try to refine the design not to use this function
-	public int getReferenceCount() {
-
-
-		if (getModelManager() == null)
-			return 0;
-		return getModelManager().getReferenceCount(getId());
-	}
-
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 */
-	// TODO: try to refine the design not to use this function
-	public int getReferenceCountForEdit() {
-
-
-
-		if (getModelManager() == null)
-			return 0;
-		return getModelManager().getReferenceCountForEdit(getId());
-	}
-
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 */
-	// TODO: try to refine the design not to use this function
-	public int getReferenceCountForRead() {
-
-
-
-		if (getModelManager() == null)
-			return 0;
-		return getModelManager().getReferenceCountForRead(getId());
-	}
-
-	public Object getReinitializeStateData() {
-
-		return reinitializeStateData;
-	}
-
-
-
-	public URIResolver getResolver() {
-
-		return fResolver;
-	}
-
-
-	public IStructuredDocument getStructuredDocument() {
-
-		IStructuredDocument result = null;
-		result = fStructuredDocument;
-		return result;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (9/7/2001 2:30:26
-	 * PM)
-	 * 
-	 * @return long
-	 */
-	public long getSynchronizationStamp() {
-
-		return fSynchronizationStamp;
-	}
-
-	public IStructuredTextUndoManager getUndoManager() {
-
-		IStructuredTextUndoManager structuredTextUndoManager = null;
-		IStructuredDocument structuredDocument = getStructuredDocument();
-		if (structuredDocument == null) {
-			structuredTextUndoManager = null;
-		}
-		else {
-			structuredTextUndoManager = structuredDocument.getUndoManager();
-		}
-		return structuredTextUndoManager;
-	}
-
-	public void initId(String id) {
-		fId = id;
-	}
-
-	final protected void internalAboutToBeChanged() {
-
-		// notice we only fire this event if we are not
-		// already in a model state changing sequence
-		if (fModelStateChanging == 0) {
-
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "IModelStateListener event for " + getId() + " : modelAboutToBeChanged"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			try {
-				fireModelAboutToBeChanged();
-			}
-			catch (Exception e) {
-				Logger.logException("Exception while notifying model state listers of about to change", e); //$NON-NLS-1$
-			}
-			finally {
-				// begin lock after listeners notified, otherwise
-				// deadlock could occur if they call us back.
-				beginLock();
-			}
-
-		}
-		// we always increment counter, for every request (so *must* receive
-		// corresponding number of 'changedModel' requests)
-		fModelStateChanging++;
-	}
-
-	/**
-	 * Informs all registered model state listeners that an impending change
-	 * is now complete. This method must only be called by 'modelChanged'
-	 * since it keeps track of counts.
-	 */
-	final protected void internalModelChanged() {
-
-		// always decrement
-		fModelStateChanging--;
-
-
-		// Check integrity
-		// to be less than zero is a programming error,
-		// but we'll reset to zero
-		// and try to continue
-		if (fModelStateChanging < 0) {
-			fModelStateChanging = 0;
-			// should not be locked, but just in case
-			endLock();
-			throw new IllegalStateException("Program Error: modelStateChanging was less than zero"); //$NON-NLS-1$
-		}
-
-
-		// We only fire this event if all pending requests are done.
-		// That is, if we've received the same number of modelChanged as
-		// we have aboutToChangeModel.
-		if (fModelStateChanging == 0) {
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "IModelStateListener event for " + getId() + " : modelChanged"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			endLock();
-			// notifify listeners outside of locked state (or deadlock
-			// can occur if one of them calls us back.
-			fireModelChanged();
-		}
-	}
-
-	public boolean isDirty() {
-
-		return fDirtyState;
-	}
-
-	/**
-	 * This method has very special purpose, its used in subclass
-	 * 'changedModel' to know when to do "ending" sorts of things, right
-	 * before a call to super.ChangedModel would in deed put the model in
-	 * 'end' state. Put another way, at the beginning of the subclasses's
-	 * changedModel, the isModelStateChanging is true, but at end, it will be
-	 * false. So, this method allows a small "peek ahead".
-	 */
-	protected boolean isModelChangeStateOnVergeOfEnding() {
-
-
-		return fModelStateChanging == 1;
-	}
-
-	/**
-	 * This method can be called to determine if the model is within a
-	 * "aboutToChange" and "changed" sequence.
-	 */
-	public boolean isModelStateChanging() {
-
-
-		return fModelStateChanging > 0;
-	}
-
-	public boolean isNew() {
-
-		return fNewState;
-	}
-
-	public boolean isReinitializationNeeded() {
-
-		return reinitializationNeeded;
-	}
-
-	public boolean isSaveNeeded() {
-
-
-		if (!isSharedForEdit())
-			return isDirty();
-		else
-			return false;
-	}
-
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 */
-	public boolean isShared() {
-		if (getModelManager() == null)
-			return false;
-		return getModelManager().isShared(getId());
-	}
-
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 */
-	public boolean isSharedForEdit() {
-
-
-		if (getModelManager() == null)
-			return false;
-		return getModelManager().isSharedForEdit(getId());
-	}
-
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 */
-	public boolean isSharedForRead() {
-
-
-		if (getModelManager() == null)
-			return false;
-		return getModelManager().isSharedForRead(getId());
-	}
-
-
-	public void modelReinitialized() {
-
-
-		// notice this is just a public avenue to our protected method
-		fireModelReinitialized();
-	}
-
-	public IStructuredModel newInstance() throws IOException {
-
-		IStructuredModel newModel = null;
-		// we delegate to the model manager, so loader, etc., can be
-		// used.
-		newModel = getModelManager().createNewInstance(this);
-		return newModel;
-	}
-
-	public IStructuredModel reinit() {
-
-
-		IStructuredModel result = null;
-		if (fModelStateChanging == 0) {
-			try {
-				aboutToChangeModel();
-				aboutToReinitializeModel();
-				result = _getModelManager().reinitialize(this);
-			}
-			finally {
-				setReinitializeNeeded(false);
-				setReinitializeStateData(null);
-				modelReinitialized();
-				changedModel();
-			}
-		}
-		else {
-			if (Logger.DEBUG_MODELSTATE) {
-				Logger.log(Logger.INFO, "indeed!!!"); //$NON-NLS-1$
-			}
-		}
-		return result;
-	}
-
-
-	/**
-	 * This function allows the model to free up any resources it might be
-	 * using. In particular, itself, as stored in the IModelManager.
-	 */
-	public void releaseFromEdit() {
-
-
-		if (getModelManager() == null) {
-			throw new IllegalStateException(MODEL_MANAGER_NULL); //$NON-NLS-1$
-		}
-		else {
-			/*
-			 * Be sure to check the shared state before releasing. (Since
-			 * isShared assumes a count of 1 means not shared ... and we want
-			 * our '1' to be that one.) The problem, of course, is that
-			 * between pre-cycle notification and post-release notification,
-			 * the model could once again have become shared, rendering the
-			 * release notification incorrect.
-			 */
-			boolean isShared = isShared();
-
-			if (!isShared) {
-				signalPreLifeCycleEventRelease(this);
-			}
-
-			_getModelManager().releaseFromEdit(this);
-			if (!isShared) {
-				signalPostLifeCycleListenerRelease(this);
-			}
-		}
-
-	}
-
-	/**
-	 * This function allows the model to free up any resources it might be
-	 * using. In particular, itself, as stored in the IModelManager.
-	 */
-	public void releaseFromRead() {
-
-		if (getModelManager() == null) {
-			throw new IllegalStateException(MODEL_MANAGER_NULL); //$NON-NLS-1$
-		}
-		else {
-			/*
-			 * Be sure to check the shared state before releasing. (Since
-			 * isShared assumes a count of 1 means not shared ... and we want
-			 * our '1' to be that one.) The problem, of course, is that
-			 * between pre-cycle notification and post-release notification,
-			 * the model could once again have become shared, rendering the
-			 * release notification incorrect.
-			 */
-			boolean isShared = isShared();
-
-			if (!isShared) {
-				signalPreLifeCycleEventRelease(this);
-			}
-
-			_getModelManager().releaseFromRead(this);
-
-			if (!isShared) {
-				signalPostLifeCycleListenerRelease(this);
-			}
-		}
-	}
-
-
-	/**
-	 * This function replenishes the model with the resource without saving
-	 * any possible changes. It is used when one editor may be closing, and
-	 * specifially says not to save the model, but another "display" of the
-	 * model still needs to hang on to some model, so needs a fresh copy.
-	 */
-	public IStructuredModel reload(InputStream inputStream) throws IOException {
-		IStructuredModel result = null;
-		try {
-			aboutToChangeModel();
-			result = _getModelManager().reloadModel(getId(), inputStream);
-		}
-		catch (UnsupportedEncodingException e) {
-			// log for now, unless we find reason not to
-			Logger.log(Logger.INFO, e.getMessage());
-		}
-		finally {
-			changedModel();
-		}
-		return result;
-	}
-
-	public void removeModelLifecycleListener(IModelLifecycleListener listener) {
-
-		// if manager is null, then none have been added, so
-		// no need to remove any
-		if (fLifecycleNotificationManager == null)
-			return;
-		synchronized (fListenerLock) {
-			fLifecycleNotificationManager.removeListener(listener);
-		}
-	}
-
-
-	public void removeModelStateListener(IModelStateListener listener) {
-
-		if (listener == null)
-			return;
-		if (fModelStateListeners == null)
-			return;
-		// if its not in the listeners, we'll ignore the request
-		synchronized (fListenerLock) {
-			if (Utilities.contains(fModelStateListeners, listener)) {
-				int oldSize = fModelStateListeners.length;
-				int newSize = oldSize - 1;
-				Object[] newListeners = new Object[newSize];
-				int index = 0;
-				for (int i = 0; i < oldSize; i++) {
-					if (fModelStateListeners[i] == listener) { // ignore
-					}
-					else {
-						// copy old to new if its not the one we are
-						// removing
-						newListeners[index++] = fModelStateListeners[i];
-					}
-				}
-				// now that we have a new array, let's switch it for the
-				// old
-				// one
-				fModelStateListeners = newListeners;
-			}
-		}
-	}
-
-
-	/**
-	 * A method that modifies the model's synchronization stamp to match the
-	 * resource. Turns out there's several ways of doing it, so this ensures a
-	 * common algorithm.
-	 */
-	public void resetSynchronizationStamp(IResource resource) {
-
-
-		setSynchronizationStamp(computeModificationStamp(resource));
-	}
-
-
-	/**
-	 * This API allows a client to initiate notification to all interested
-	 * parties that a model's underlying resource has been deleted.
-	 */
-	public void resourceDeleted() {
-
-
-		// notice this is just a public avenue to our protected method
-		fireModelResourceDeleted(this);
-	}
-
-
-	/**
-	 * This method allows a model client to initiate notification to all
-	 * interested parties that a model's underlying resource location has
-	 * changed. Note: we assume caller has already changed baseLocation, Id,
-	 * etc., since its really up to the client to determine what's "new" about
-	 * a moved model. Caution: 'this' and 'newModel' may be the same object.
-	 * This is the case for current working with FileModelProvider, but have
-	 * left the dual argument for future possibilities.
-	 */
-	public void resourceMoved(IStructuredModel newModel) {
-
-
-		// notice this is just a public avenue to our protected method
-		fireModelResourceMoved(this, newModel);
-	}
-
-
-	public void save() throws UnsupportedEncodingException, IOException, CoreException {
-
-		int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;
-		ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-		signalLifecycleEvent(modelLifecycleEvent);
-
-		try {
-			String stringId = getId();
-			_getModelManager().saveModel(stringId, EncodingRule.CONTENT_BASED);
-		}
-
-		finally {
-			// we put end notification in finally block, so even if
-			// error occurs during save, listeners are still notified,
-			// since their code could depend on receiving, to clean up
-			// some state, or coordinate other resources.
-			type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;
-			modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-	}
-
-
-	public void save(EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {
-
-		int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;
-		ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-		signalLifecycleEvent(modelLifecycleEvent);
-
-		try {
-			String stringId = getId();
-			_getModelManager().saveModel(stringId, encodingRule);
-		}
-		finally {
-			// we put end notification in finally block, so even if
-			// error occurs during save, listeners are still notified,
-			// since their code could depend on receiving, to clean up
-			// some state, or coordinate other resources.
-			type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;
-			modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-	}
-
-
-	public void save(IFile iFile) throws UnsupportedEncodingException, IOException, CoreException {
-
-		int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;
-		ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-		signalLifecycleEvent(modelLifecycleEvent);
-
-		try {
-			String stringId = getId();
-			_getModelManager().saveModel(iFile, stringId, EncodingRule.CONTENT_BASED);
-		}
-
-		finally {
-			// we put end notification in finally block, so even if
-			// error occurs during save, listeners are still notified,
-			// since their code could depend on receiving, to clean up
-			// some state, or coordinate other resources.
-			type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;
-			modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-	}
-
-
-	public void save(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {
-
-		int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;
-		ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-		signalLifecycleEvent(modelLifecycleEvent);
-
-		try {
-			String stringId = getId();
-			_getModelManager().saveModel(iFile, stringId, encodingRule);
-		}
-		finally {
-			// we put end notificatioon in finally block, so even if
-			// error occurs during save, listeners are still notified,
-			// since their code could depend on receiving, to clean up
-			// some state, or coordinate other resources.
-			type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;
-			modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-	}
-
-
-	public void save(OutputStream outputStream) throws UnsupportedEncodingException, CoreException, IOException {
-
-		int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;
-		ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-		signalLifecycleEvent(modelLifecycleEvent);
-
-		try {
-			String stringId = getId();
-			_getModelManager().saveModel(stringId, outputStream, EncodingRule.CONTENT_BASED);
-		}
-
-		finally {
-			// we put end notification in finally block, so even if
-			// error occurs during save, listeners are still notified,
-			// since their code could depend on receiving, to clean up
-			// some state, or coordinate other resources.
-			type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;
-			modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-	}
-
-
-	/**
-	 * This attribute is typically used to denote the model's underlying
-	 * resource.
-	 */
-	public void setBaseLocation(java.lang.String newBaseLocation) {
-
-		fBaseLocation = newBaseLocation;
-	}
-
-	public void setContentTypeIdentifier(String contentTypeIdentifier) {
-		fExplicitContentTypeIdentifier = contentTypeIdentifier;
-	}
-
-	/**
-	 * 
-	 */
-	public void setDirtyState(boolean dirtyState) {
-
-		// no need to process (set or fire event), if same value
-		if (fDirtyState != dirtyState) {
-			// pre-change notification
-			int type = ModelLifecycleEvent.MODEL_DIRTY_STATE | ModelLifecycleEvent.PRE_EVENT;
-			ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-			signalLifecycleEvent(modelLifecycleEvent);
-
-
-			// the actual change
-			fDirtyState = dirtyState;
-
-			// old notification
-			// TODO: C3 remove old notification
-			if (fDirtyState == false) {
-				// if we are being set to not dirty (such as just been saved)
-				// then we need to start listening for changes
-				// again to know when to set state to true;
-				getStructuredDocument().addDocumentChangedListener(fDirtyStateWatcher);
-			}
-			fireModelDirtyStateChanged(this, dirtyState);
-
-
-			// post change notification
-			type = ModelLifecycleEvent.MODEL_DIRTY_STATE | ModelLifecycleEvent.POST_EVENT;
-			modelLifecycleEvent = new ModelLifecycleEvent(this, type);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-	}
-
-	/**
-	 * @deprecated - will likely be deprecated soon, in favor of direct 'adds'
-	 *             ... but takes some redesign.
-	 */
-	public void setFactoryRegistry(FactoryRegistry factoryRegistry) {
-		this.factoryRegistry = factoryRegistry;
-	}
-
-	/**
-	 * The id is the id that the model manager uses to identify this model. If
-	 * it is being set here, it means the model manger is already managing the
-	 * model with another id, so we have to keep it in sync. This method calls
-	 * notifies listners, if they haven't been notified already, that a "model
-	 * state change" is about to occur.
-	 */
-	public void setId(String newId) throws ResourceInUse {
-
-
-		// It makes no sense, I don't think, to have an id of null, so
-		// we'll throw an illegal argument exception if someone trys. Note:
-		// the IModelManager could not manage a model with an id of null,
-		// since it uses hashtables, and you can't have a null id for a
-		// hashtable.
-		if (newId == null)
-			throw new IllegalArgumentException(SSECoreMessages.A_model_s_id_can_not_be_nu_EXC_); //$NON-NLS-1$ = "A model's id can not be null"
-		// To guard against throwing a spurious ResourceInUse exception,
-		// which can occur when two pieces of code both want to change the id,
-		// so the second request is spurious, we'll ignore any requests that
-		// attempt to change the id to what it already is ... note, we use
-		// 'equals', not identity ('==') so that things like
-		// strings can be used. This is the same criteria that ids are
-		// found in model manager -- well, actually, I just checked, and for
-		// the hashtable impl, the criteria uses .equals AND the condition
-		// that the hash values be identical (I'm assuming this is always
-		// true, if equals is true, for now, I'm not sure
-		// we can assume that hashtable will always be used, but in
-		// general, should match.)
-		//
-		if (newId.equals(fId))
-			return;
-		// we must guard against reassigning an id to one that we already
-		// are managing.
-		if (getModelManager() != null) {
-			boolean inUse = ((ModelManagerImpl)getModelManager()).isIdInUse(newId);
-			if (inUse) {
-				throw new ResourceInUse();
-			}
-		}
-		try {
-			// normal code path
-			aboutToChangeModel();
-			String oldId = fId;
-			fId = newId;
-			if (getModelManager() != null) {
-				// if managed and the id has changed, notify to
-				// IModelManager
-				// TODO: try to refine the design not to do that
-				if (oldId != null && newId != null && !newId.equals(oldId)) {
-					getModelManager().moveModel(oldId, newId);
-				}
-			}
-		}
-		finally {
-			// make sure this finally is only executed if 'about to Change
-			// model' has
-			// been executed.
-			changedModel();
-		}
-	}
-
-	/**
-	 * Sets the contentTypeDescription.
-	 * 
-	 * @param contentTypeDescription
-	 *            The contentTypeDescription to set
-	 */
-	public void setModelHandler(IModelHandler modelHandler) {
-
-		// no need to fire events if modelHandler has been null
-		// for this model --
-		// this is an attempt at initialization optimization and may need
-		// to change in future.
-		boolean trueChange = false;
-		if (fModelHandler != null)
-			trueChange = true;
-		if (trueChange) {
-			internalAboutToBeChanged();
-		}
-		fModelHandler = modelHandler;
-		if (trueChange) {
-			internalModelChanged();
-		}
-	}
-
-
-
-	public void setModelManager(IModelManager newModelManager) {
-
-		fModelManager = newModelManager;
-	}
-
-	/**
-	 * 
-	 */
-	public void setNewState(boolean newState) {
-
-		fNewState = newState;
-	}
-
-	/**
-	 * Sets a "flag" that reinitialization is needed.
-	 */
-	public void setReinitializeNeeded(boolean needed) {
-
-		reinitializationNeeded = needed;
-	}
-
-	/**
-	 * Holds any data that the reinit procedure might find useful in
-	 * reinitializing the model. This is handy, since the reinitialization may
-	 * not take place at once, and some "old" data may be needed to properly
-	 * undo previous settings. Note: the parameter was intentionally made to
-	 * be of type 'Object' so different models can use in different ways.
-	 */
-	public void setReinitializeStateData(Object object) {
-
-		reinitializeStateData = object;
-	}
-
-
-	public void setResolver(URIResolver newResolver) {
-
-		fResolver = newResolver;
-	}
-
-
-	public void setStructuredDocument(IStructuredDocument newStructuredDocument) {
-		boolean lifeCycleNotification = false;
-		if (fStructuredDocument != null) {
-			fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);
-			fStructuredDocument.removeDocumentAboutToChangeListener(fDocumentToModelNotifier);
-			fStructuredDocument.removeDocumentChangedListener(fDocumentToModelNotifier);
-			// prechange notification
-			lifeCycleNotification = true;
-			ModelLifecycleEvent modelLifecycleEvent = new DocumentChanged(ModelLifecycleEvent.PRE_EVENT, this, fStructuredDocument, newStructuredDocument);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-
-		// hold for life cycle notification
-		IStructuredDocument previousDocument = fStructuredDocument;
-		// the actual change
-		fStructuredDocument = newStructuredDocument;
-
-
-		// at the super class level, we'll listen for structuredDocument
-		// changes
-		// so we can set our dirty state flag
-		if (fStructuredDocument != null) {
-			fStructuredDocument.addDocumentChangedListener(fDirtyStateWatcher);
-			fStructuredDocument.addDocumentAboutToChangeListener(fDocumentToModelNotifier);
-			fStructuredDocument.addDocumentChangedListener(fDocumentToModelNotifier);
-		}
-
-		if (lifeCycleNotification) {
-			// post change notification
-			ModelLifecycleEvent modelLifecycleEvent = new DocumentChanged(ModelLifecycleEvent.POST_EVENT, this, previousDocument, newStructuredDocument);
-			signalLifecycleEvent(modelLifecycleEvent);
-		}
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (9/7/2001 2:30:26
-	 * PM)
-	 * 
-	 * @param newSynchronizationStamp
-	 *            long
-	 */
-	protected void setSynchronizationStamp(long newSynchronizationStamp) {
-
-		fSynchronizationStamp = newSynchronizationStamp;
-	}
-
-	public void setUndoManager(IStructuredTextUndoManager undoManager) {
-
-		IStructuredDocument structuredDocument = getStructuredDocument();
-		if (structuredDocument == null) {
-			throw new IllegalStateException("document was null when undo manager set on model"); //$NON-NLS-1$
-		}
-		structuredDocument.setUndoManager(undoManager);
-	}
-
-	/**
-	 * To be called only by "friendly" classes, such as ModelManager, and
-	 * subclasses.
-	 */
-	void signalLifecycleEvent(ModelLifecycleEvent event) {
-		if (fLifecycleNotificationManager == null)
-			return;
-		fLifecycleNotificationManager.signalLifecycleEvent(event);
-	}
-
-	private void signalPostLifeCycleListenerRelease(IStructuredModel structuredModel) {
-		int type = ModelLifecycleEvent.MODEL_RELEASED | ModelLifecycleEvent.POST_EVENT;
-		// what's wrong with this design that a cast is needed here!?
-		ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);
-		((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);
-	}
-
-	private void signalPreLifeCycleEventRelease(IStructuredModel structuredModel) {
-		int type = ModelLifecycleEvent.MODEL_RELEASED | ModelLifecycleEvent.PRE_EVENT;
-		// what's wrong with this design that a cast is needed here!?
-		ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);
-		((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/FactoryRegistry.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/FactoryRegistry.java
deleted file mode 100644
index d0303903..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/FactoryRegistry.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.model;
-
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-
-
-/**
- * This class simply maintains the list of factories and returns singleton
- * instances of them. Some "built in" types are automatically created form
- * FactoryConfig, if not found registerd, but normally clients can/should
- * register their own factories.
- * 
- * Not intended for clients to subclass or instantiate.
- * 
- */
-public final class FactoryRegistry {
-
-	private List factories;
-
-	/**
-	 * intentionally default access
-	 */
-	FactoryRegistry() {
-		super();
-
-	}
-
-	private List _getFactories() {
-
-		if (factories == null) {
-			// may need to use java.util.Collections.synchronizedList() if
-			// syncronization becomes
-			// necessary (and if so, remember to synchronize on factories)
-			factories = new ArrayList();
-		}
-		return factories;
-
-	}
-
-	public void addFactory(INodeAdapterFactory factory) {
-		_getFactories().add(factory);
-	}
-
-	public void clearFactories() {
-		factories.clear();
-	}
-
-	/*
-	 * @see FactoryRegistry#contains(Object)
-	 */
-	public boolean contains(Object type) {
-		boolean result = false;
-		// note: we're not using cloned list, so strictly speaking
-		// is not thread safe.
-		List internalList = _getFactories();
-		for (int i = 0; i < internalList.size(); i++) {
-			INodeAdapterFactory factory = (INodeAdapterFactory) internalList.get(i);
-			if (factory.isFactoryForType(type)) {
-				result = true;
-				break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a shallow copy of the list of factories in the registry. Note:
-	 * this can not be used to add/remove factories. Its primarily provided
-	 * for those few cases where a list of factories must be copied from one
-	 * model and added to another.
-	 */
-	public List getFactories() {
-		// note: for object integrity, we don't let anyone get
-		// our main list (so they have to add through addFactory),
-		// but we will return a shallow "cloned" list.
-		List factoryList = new ArrayList(_getFactories());
-		return factoryList;
-	}
-
-	/**
-	 * This method is a not a pure resistry. Factories retrieved based on
-	 * their response to "isFactoryForType(type)". Note that if there is more
-	 * than one factory that can answer 'true' that the most recently added
-	 * factory is used.
-	 */
-	public INodeAdapterFactory getFactoryFor(Object type) {
-
-		INodeAdapterFactory result = null;
-		if (factories == null)
-			return null;
-		int listSize = factories.size();
-		for (int i = listSize - 1; i >= 0; i--) {
-			// It is the adapter factories responsibility to answer
-			// isFactoryForType so it gets choosen.
-			// Notice we are going through the list backwards to get the
-			// factory added last.
-			INodeAdapterFactory a = (INodeAdapterFactory) factories.get(i);
-			if (a.isFactoryForType(type)) {
-				result = a;
-				break;
-			}
-		}
-		return result;
-
-	}
-
-	/**
-	 * 
-	 */
-	public void release() {
-		// modified to work on copy of list, for V5PTF1
-		// send release to local copy of list
-		// of factories, since some factories, during
-		// their release function, may remove
-		// themselves from the registry.
-		List localList = getFactories();
-		for (int i = 0; i < localList.size(); i++) {
-			INodeAdapterFactory a = (INodeAdapterFactory) localList.get(i);
-			// To help bullet proof code, we'll catch and log
-			// any messages thrown by factories during release,
-			// but we'll attempt to keep going.
-			// In nearly all cases, though, such errors are
-			// severe for product/client, and need to be fixed.
-			try {
-				a.release();
-			}
-			catch (Exception e) {
-				Logger.logException("Program problem releasing factory" + a, e); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * Removes a factory if it can be retrieved by getFactoryFor(type). If
-	 * there is more than one, all are removed. If there is none, the call
-	 * simply returns (that is, it is not considered an error).
-	 */
-	public void removeFactoriesFor(java.lang.Object type) {
-		if (factories != null) {
-			int listSize = factories.size();
-			// we'll go backwards through list, since we're removing, so
-			// 'size' change won't matter.
-			// Note: I'm assuming other items in the collection do not change
-			// position
-			// simply because another was removed.
-			for (int i = listSize - 1; i >= 0; i--) {
-				// It is the adapter factories responsibility to answer
-				// isFactoryForType so it gets choosen.
-				INodeAdapterFactory a = (INodeAdapterFactory) factories.get(i);
-				if (a.isFactoryForType(type)) {
-					factories.remove(a);
-				}
-			}
-		}
-	}
-
-	public void removeFactory(INodeAdapterFactory factory) {
-		_getFactories().remove(factory);
-
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/LifecycleNotificationManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/LifecycleNotificationManager.java
deleted file mode 100644
index adcf010..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/LifecycleNotificationManager.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.model;
-
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-
-
-/**
- * For "internal use" only by AbstractStructuredModel
- */
-
-class LifecycleNotificationManager {
-	private Object[] fListeners;
-
-	LifecycleNotificationManager() {
-		super();
-	}
-
-	/**
-	 * Adds a new copy of the given listener to the list of Life Cycle
-	 * Listeners.
-	 * 
-	 * Multiple copies of the same listener are allowed. This is required to
-	 * support threaded listener management properly and for model-driven move
-	 * to work. For example, two adds and a single remove should result in the
-	 * listener still listening for events.
-	 * 
-	 * @param listener
-	 */
-	void addListener(IModelLifecycleListener listener) {
-		if (Logger.DEBUG && Utilities.contains(fListeners, listener)) {
-			Logger.log(Logger.WARNING, "IModelLifecycleListener " + listener + " listening more than once"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		int oldSize = 0;
-		if (fListeners != null) {
-			// normally won't be null, but we need to be sure, for first
-			// time through
-			oldSize = fListeners.length;
-		}
-		int newSize = oldSize + 1;
-		Object[] newListeners = new Object[newSize];
-		if (fListeners != null) {
-			System.arraycopy(fListeners, 0, newListeners, 0, oldSize);
-		}
-		// add listener to last position
-		newListeners[newSize - 1] = listener;
-		//
-		// now switch new for old
-		fListeners = newListeners;
-	}
-
-	/**
-	 * Removes a single copy of the given listener from the list of Life Cycle
-	 * Listeners.
-	 * 
-	 * @param listener
-	 */
-	void removeListener(IModelLifecycleListener listener) {
-		if (Utilities.contains(fListeners, listener)) {
-			// if its not in the listeners, we'll ignore the request
-			int oldSize = fListeners.length;
-			int newSize = oldSize - 1;
-			Object[] newListeners = new Object[newSize];
-			int index = 0;
-			boolean removedOnce = false;
-			for (int i = 0; i < oldSize; i++) {
-				if (fListeners[i] == listener && !removedOnce) {
-					// ignore on the first match
-					removedOnce = true;
-				} else {
-					// copy old to new if it's not the one we are removing
-					newListeners[index++] = fListeners[i];
-				}
-			}
-			// now that we have a new array, let's switch it for the old
-			// one
-			fListeners = newListeners;
-		}
-		if (Logger.DEBUG && Utilities.contains(fListeners, listener)) {
-			Logger.log(Logger.WARNING, "IModelLifecycleListener " + listener + " removed once but still listening"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	void signalLifecycleEvent(ModelLifecycleEvent event) {
-		if (Logger.DEBUG_LIFECYCLE) {
-			Logger.log(Logger.INFO, "ModelLifecycleEvent fired for " + event.getModel().getId() + ": " + event.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-			System.out.println("ModelLifecycleEvent fired for " + event.getModel().getId() + ": " + event.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		// We must assign listeners to local variable, since the add and
-		// remove listener methods can change the actual instance of the
-		// listener array from another thread
-		if (fListeners != null) {
-			Object[] holdListeners = fListeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				IModelLifecycleListener listener = (IModelLifecycleListener) holdListeners[i];
-				// only one type of listener for now ... this could become
-				// more complex
-				if ((event.getInternalType() & ModelLifecycleEvent.PRE_EVENT) == ModelLifecycleEvent.PRE_EVENT) {
-					listener.processPreModelEvent(event);
-				}
-				if ((event.getInternalType() & ModelLifecycleEvent.POST_EVENT) == ModelLifecycleEvent.POST_EVENT) {
-					listener.processPostModelEvent(event);
-				}
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelLifecycleEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelLifecycleEvent.java
deleted file mode 100644
index def66d0..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelLifecycleEvent.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.model;
-
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * This is an early version of a class that may change over the next few
- * milestones.
- */
-
-
-public class ModelLifecycleEvent {
-
-
-	// this list is for "public" consumption
-	public static final int MODEL_SAVED = 0x0001;
-	public static final int MODEL_RELEASED = 0x00002;
-	public static final int MODEL_DOCUMENT_CHANGED = 0x0003;
-	public static final int MODEL_DIRTY_STATE = 0x0004;
-	public static final int MODEL_REVERT= 0x0005;
-
-	// TODO: finish support for these
-	// following not implemented yet
-	public static final int MODEL_REINITIALIZED = 0x0006;
-	//public static final int ADAPTERS_NOTIFIED = 0x0007;
-	//public static final int MODEL_RESOURCE_MOVED = 0x0008;
-	//public static final int MODEL_RESOURCE_DELETED = 0x0009;
-
-	// This list (upper two bytes) is for only internal mechanisms and
-	// subclasses
-	// For simplicity they are "masked out" when client calls getType()
-	protected static final int PRE_EVENT = 0x0100;
-	private final static int MASK = 0x00FF;
-	protected static final int POST_EVENT = 0x0200;
-
-
-	private IStructuredModel fModel;
-	private int fType;
-
-	public ModelLifecycleEvent() {
-		super();
-	}
-
-	public ModelLifecycleEvent(int type) {
-		this();
-		fType = type;
-	}
-
-	public ModelLifecycleEvent(IStructuredModel structuredModel, int type) {
-		this(type);
-		fModel = structuredModel;
-	}
-
-	private String debugString(int type) {
-		String result = null;
-		switch (type & MASK) {
-			case MODEL_SAVED :
-				result = "MODEL_SAVED"; //$NON-NLS-1$
-				break;
-			case MODEL_RELEASED :
-				result = "MODEL_RELEASED"; //$NON-NLS-1$
-				break;
-			case MODEL_DOCUMENT_CHANGED :
-				result = "MODEL_DOCUMENT_CHANGED"; //$NON-NLS-1$
-				break;
-			case MODEL_DIRTY_STATE :
-				result = "MODEL_DIRTY_STATE"; //$NON-NLS-1$
-				break;
-			/*
-			 * case MODEL_REINITIALIZED : result = "MODEL_REINITIALIZED";
-			 * break; case MODEL_RELOADED : result = "MODEL_RELOADED"; break;
-			 * case ADAPTERS_NOTIFIED : result = "ADAPTERS_NOTIFIED"; break;
-			 * case MODEL_RESOURCE_MOVED : result = "MODEL_RESOURCE_MOVED";
-			 * break; case MODEL_RESOURCE_DELETED : result =
-			 * "MODEL_RESOURCE_DELETED"; break;
-			 */
-			default :
-				throw new IllegalStateException("ModelLifecycleEvent did not have valid type"); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	protected int getInternalType() {
-
-		return fType;
-	}
-
-	public IStructuredModel getModel() {
-
-		return fModel;
-	}
-
-	public int getType() {
-
-		// for now, we'll mask type to "public" ones this easy
-		// way ... but I know there must be a better way
-		return fType & MASK;
-	}
-
-	public String toString() {
-		String result = null;
-		result = "ModelLifecycleEvent: " + debugString(fType); //$NON-NLS-1$
-		return result;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
deleted file mode 100644
index 06f6906..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
+++ /dev/null
@@ -1,2074 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.model;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-
-import org.eclipse.core.filebuffers.FileBuffers;
-import org.eclipse.core.filebuffers.ITextFileBuffer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.internal.FileBufferModelManager;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.NullMemento;
-import org.eclipse.wst.sse.core.internal.SSECoreMessages;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.internal.document.DocumentReader;
-import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-import org.eclipse.wst.sse.core.internal.encoding.CodedStreamCreator;
-import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
-import org.eclipse.wst.sse.core.internal.encoding.ContentBasedPreferenceGateway;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.exceptions.MalformedOutputExceptionWithDetail;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerRegistry;
-import org.eclipse.wst.sse.core.internal.provisional.IModelLoader;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceAlreadyExists;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-import org.eclipse.wst.sse.core.internal.util.ProjectResolver;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-
-/**
- * Not intended to be subclassed, referenced or instantiated by clients.
- * 
- * This class is responsible for creating, retrieving, and caching
- * StructuredModels It retrieves the cached objects by an id which is
- * typically a String representing the resources URI. Note: Its important that
- * all clients that share a resource do so using <b>identical </b>
- * identifiers, or else different instances will be created and retrieved,
- * even if they all technically point to the same resource on the file system.
- * This class also provides a convenient place to register Model Loaders and
- * Dumpers based on 'type'.
- */
-public class ModelManagerImpl implements IModelManager {
-
-	static class ReadEditType {
-		ReadEditType(String type) {
-		}
-	}
-
-	/**
-	 * A Data class to track our shared objects
-	 */
-	 static class SharedObject {
-		int referenceCountForEdit;
-		int referenceCountForRead;
-		IStructuredModel theSharedModel;
-		boolean initializing = true;
-		boolean doWait = true;
-		
-		SharedObject(IStructuredModel sharedModel) {
-			theSharedModel = sharedModel;
-			referenceCountForRead = 0;
-			referenceCountForEdit = 0;
-		}
-		
-		/**
-		 * Waits until this shared object has been attempted to be loaded. 
-		 * The load is "attempted" because not all loads result in a model. 
-		 * However, upon leaving this method, theShareModel variable
-		 * is up-to-date.
-		 */
-		public synchronized void waitForLoadAttempt() {
-			while(initializing) {
-				try {
-					wait();
-				}
-				catch (InterruptedException e) {
-					// ignore interruption!
-				}
-			}
-		}
-		
-		/**
-		 * Flags this model as loaded. All waiting methods on 
-		 * {@link #waitForLoadAttempt()} will proceed after this 
-		 * method returns. 
-		 */
-		public synchronized void setLoaded() {
-			initializing = false;
-			notifyAll();
-		}
-	}
-
-	private Exception debugException = null;
-
-	/**
-	 * Our singleton instance
-	 */
-	private static ModelManagerImpl instance;
-	private final static int READ_BUFFER_SIZE = 4096;
-
-	/**
-	 * Not to be called by clients, will be made restricted access.
-	 * 
-	 * @return
-	 */
-	public synchronized static IModelManager getInstance() {
-
-		if (instance == null) {
-			instance = new ModelManagerImpl();
-		}
-		return instance;
-	}
-
-	/**
-	 * Our cache of managed objects
-	 */
-	private Map fManagedObjects;
-
-	private ModelHandlerRegistry fModelHandlerRegistry;
-	private final ReadEditType READ = new ReadEditType("read"); //$NON-NLS-1$
-	private final ReadEditType EDIT = new ReadEditType("edit"); //$NON-NLS-1$
-	
-	private final ILock SYNC = Job.getJobManager().newLock();
-	/**
-	 * Intentionally default access only.
-	 * 
-	 */
-	ModelManagerImpl() {
-		super();
-		fManagedObjects = new HashMap();
-		// To prevent deadlocks:  always acquire multiple locks in this order: SYNC, sharedObject. 
-		// DO NOT acquire a SYNC within a sharedObject lock, unless you already own the SYNC lock
-		// Tip: Try to hold the smallest number of locks you can
-	}
-
-	private IStructuredModel _commonCreateModel(IFile file, String id, IModelHandler handler, URIResolver resolver, ReadEditType rwType, EncodingRule encodingRule) throws IOException,CoreException {
-		SharedObject sharedObject = null;
-		
-		SYNC.acquire();
-		sharedObject = (SharedObject) fManagedObjects.get(id);
-		SYNC.release();
-		
-		while(true) {
-			if (sharedObject!=null) {
-				sharedObject.waitForLoadAttempt();
-			}
-			SYNC.acquire();
-			// we know this object's model has passed the load, however, we don't know 
-			// it's reference count status. It might have already been disposed. Or it could have 
-			// been disposed and a concurrent thread has already begun loading it, in which case
-			// we should use the sharedobject they are loading. 
-			// NOTE: This pattern is applied 3 times in this class, but only doc'd once. The logic is 
-			// exactly the same. 
-			SharedObject testObject = (SharedObject) fManagedObjects.get(id);
-			if (testObject==null) {
-				// null means it's been disposed, we need to do the work to reload it.
-				sharedObject = new SharedObject(null);
-				fManagedObjects.put(id, sharedObject);
-				SYNC.release();
-				_doCommonCreateModel(file, id, handler, resolver, rwType, encodingRule,
-						sharedObject);
-				break;
-			} else if (sharedObject == testObject) {
-				// if nothing happened, just increment the could and return the shared model
-				synchronized(sharedObject) {
-					if (sharedObject.theSharedModel!=null) {
-						_incrCount(sharedObject, rwType);
-					}
-				}
-				SYNC.release();
-				break;
-			} else {
-				// sharedObject != testObject which means the object we were waiting on has been disposed
-				// a replacement has already been placed in the managedObjects table. Through away our
-				// stale sharedObject and continue on with the one we got from the queue. Note: We don't know its
-				// state, so continue the waitForLoad-check loop. 
-				SYNC.release();
-				sharedObject = testObject;
-			}
-		}
-		
-		// we expect to always return something
-		if (sharedObject == null) {
-			debugException = new Exception("instance only for stack trace"); //$NON-NLS-1$
-			Logger.logException("Program Error: no model recorded for id " + id, debugException); //$NON-NLS-1$
-		}
-		
-		// note: clients must call release for each time they call get.
-		return sharedObject==null ? null : sharedObject.theSharedModel;
-	}
-
-	private void _decrCount(SharedObject sharedObject, ReadEditType type) {
-		if (type == READ) {
-			sharedObject.referenceCountForRead--;
-			FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());
-		}
-		else if (type == EDIT) {
-			sharedObject.referenceCountForEdit--;
-			FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());
-		}
-		else
-			throw new IllegalArgumentException();
-	}
-
-	private void _doCommonCreateModel(IFile file, String id, IModelHandler handler,
-			URIResolver resolver, ReadEditType rwType, EncodingRule encodingRule,
-			SharedObject sharedObject) throws CoreException, IOException {
-		boolean doRemove = false;
-		synchronized(sharedObject) {
-			InputStream inputStream = null;
-			IStructuredModel model = null;
-			try {
-				model = _commonCreateModel(id, handler, resolver);
-				IModelLoader loader = handler.getModelLoader();
-				inputStream = Utilities.getMarkSupportedStream(file.getContents(true));
-				loader.load(Utilities.getMarkSupportedStream(inputStream), model, encodingRule);
-			}
-			catch (ResourceInUse e) {
-				// impossible, since we've already found
-				handleProgramError(e);
-			} finally {
-				if (inputStream!=null) {
-					try { 
-						inputStream.close();
-					} catch(IOException e) {
-					}
-				}
-			}
-			if (model != null) {
-				// add to our cache
-				sharedObject.theSharedModel=model;
-				_initCount(sharedObject, rwType);
-			} else {
-				doRemove = true;
-			}
-		}
-		if (doRemove) {
-			SYNC.acquire();	
-			fManagedObjects.remove(id);	
-			SYNC.release();
-		}
-		sharedObject.setLoaded();
-	}
-
-	private IStructuredModel _commonCreateModel(InputStream inputStream, String id, IModelHandler handler, URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter) throws IOException {
-		
-		if (id == null) {
-			throw new IllegalArgumentException("Program Error: id may not be null"); //$NON-NLS-1$
-		}
-		SharedObject sharedObject = null;
-	
-		SYNC.acquire();
-		sharedObject = (SharedObject) fManagedObjects.get(id);
-		SYNC.release();
-		
-		while(true) {
-			if (sharedObject!=null) {
-				sharedObject.waitForLoadAttempt();
-			}
-			SYNC.acquire();
-			SharedObject testObject = (SharedObject) fManagedObjects.get(id);
-			if (testObject==null) {
-				// it was removed ,so lets create it
-				sharedObject = new SharedObject(null);
-				fManagedObjects.put(id, sharedObject);
-				SYNC.release();
-				_doCommonCreateModel(inputStream, id, handler, resolver, rwType,
-						encoding, lineDelimiter, sharedObject);
-				break;
-			} else if (sharedObject == testObject) {
-				synchronized(sharedObject) {
-					if (sharedObject.theSharedModel!=null) {
-						_incrCount(sharedObject, rwType);
-					}
-				}
-				SYNC.release();
-				break;
-			} else {
-				SYNC.release();
-				sharedObject = testObject;
-			}
-		}
-		
-		// we expect to always return something
-		Assert.isNotNull(sharedObject, "Program Error: no model recorded for id " + id); //$NON-NLS-1$
-		// note: clients must call release for each time they call get.
-		return sharedObject.theSharedModel;
-	
-	}
-
-	private void _doCommonCreateModel(InputStream inputStream, String id, IModelHandler handler,
-			URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter,
-			SharedObject sharedObject) throws IOException {
-		boolean doRemove = false;
-		synchronized(sharedObject) {
-			IStructuredModel model = null;
-			try {
-				model = _commonCreateModel(id, handler, resolver);
-				IModelLoader loader = handler.getModelLoader();
-				if (inputStream == null) {
-					Logger.log(Logger.WARNING, "model was requested for id " + id + " without a content InputStream"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				loader.load(id, Utilities.getMarkSupportedStream(inputStream), model, encoding, lineDelimiter);
-			}
-			catch (ResourceInUse e) {
-				// impossible, since we've already found
-				handleProgramError(e);
-			}
-			if (model != null) {
-				sharedObject.theSharedModel = model;
-				_initCount(sharedObject, rwType);
-			} else {
-				doRemove = true;
-			}
-		}
-		if (doRemove) {
-			SYNC.acquire();
-			// remove it if we didn't get one back
-			fManagedObjects.remove(id);
-			SYNC.release();
-		}
-		sharedObject.setLoaded();
-	}
-
-	private IStructuredModel _commonCreateModel(String id, IModelHandler handler, URIResolver resolver) throws ResourceInUse {
-
-		IModelLoader loader = handler.getModelLoader();
-		IStructuredModel result = loader.createModel();
-		// in the past, id was null for "unmanaged" case, so we won't
-		// try and set it
-		if (id != null) {
-			result.setId(id);
-		}
-		result.setModelHandler(handler);
-		result.setResolver(resolver);
-		// some obvious redunancy here that maybe could be improved
-		// in future, but is necessary for now
-		result.setBaseLocation(id);
-		if (resolver != null) {
-			resolver.setFileBaseLocation(id);
-		}
-		addFactories(result, handler);
-		return result;
-	}
-
-	private IStructuredModel _commonGetModel(IFile iFile, ReadEditType rwType, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {
-		IStructuredModel model = null;
-
-		if (iFile != null && iFile.exists()) {
-			String id = calculateId(iFile);
-			IModelHandler handler = calculateType(iFile);
-			URIResolver resolver = calculateURIResolver(iFile);
-			model = _commonCreateModel(iFile, id, handler, resolver, rwType, encodingRule);
-		}
-
-		return model;
-	}
-
-	private IStructuredModel _commonGetModel(IFile iFile, ReadEditType rwType, String encoding, String lineDelimiter) throws UnsupportedEncodingException, IOException, CoreException {
-		String id = calculateId(iFile);
-		IModelHandler handler = calculateType(iFile);
-		URIResolver resolver = calculateURIResolver(iFile);
-		IStructuredModel model = _commonGetModel(iFile, id, handler, resolver, rwType, encoding, lineDelimiter);
-
-		return model;
-	}
-
-	private IStructuredModel _commonGetModel(IFile file, String id, IModelHandler handler, URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter) throws IOException, CoreException {
-		if (id == null)
-			throw new IllegalArgumentException("Program Error: id may not be null"); //$NON-NLS-1$
-
-		SharedObject sharedObject = null;
-		if (file != null && file.exists()) {
-			SYNC.acquire();
-			sharedObject = (SharedObject) fManagedObjects.get(id);
-			SYNC.release();
-			
-			while(true) {
-				if (sharedObject!=null) {
-					sharedObject.waitForLoadAttempt();
-				}
-				SYNC.acquire();
-				SharedObject testObject = (SharedObject) fManagedObjects.get(id);
-				if (testObject==null) {
-					// it was removed ,so lets create it
-					sharedObject = new SharedObject(null);
-					fManagedObjects.put(id, sharedObject);
-					
-					SYNC.release();
-					_doCommonGetModel(file, id, sharedObject,rwType);
-					break;
-				} else if (sharedObject == testObject) {
-					synchronized(sharedObject) {
-						if (sharedObject.theSharedModel!=null) {
-							_incrCount(sharedObject, rwType);
-						}
-					}
-					SYNC.release();
-					break;
-				} else {
-					// we got a different object than what we were expecting
-					SYNC.release();
-					// two threads were interested in models for the same id. 
-					// The other thread one, so lets back off and try again. 
-					sharedObject = testObject; 
-				}
-			}
-		}
-		
-		// if we don't know how to create a model
-		// for this type of file, return null
-	
-		// note: clients must call release for each time they call
-		// get.
-			
-		return sharedObject==null ? null : sharedObject.theSharedModel;
-	}
-
-	private void _doCommonGetModel(IFile file, String id, SharedObject sharedObject,ReadEditType rwType) {
-		boolean doRemove = false;
-		synchronized(sharedObject) {
-			sharedObject.doWait=false;
-			IStructuredModel model = FileBufferModelManager.getInstance().getModel(file);
-			sharedObject.doWait=true;
-			if (model != null) {
-				sharedObject.theSharedModel=model;
-				_initCount(sharedObject, rwType);
-			} else {
-				doRemove = true;
-			}
-		}
-		if (doRemove) {
-			SYNC.acquire();
-			fManagedObjects.remove(id);
-			SYNC.release();
-		}
-		sharedObject.setLoaded();
-	}
-
-	private SharedObject _commonNewModel(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException {
-		IStructuredModel aSharedModel = null;
-		// First, check if resource already exists on file system.
-		// if is does, then throw Resource in Use iff force==false
-
-		if (iFile.exists() && !force) {
-			throw new ResourceAlreadyExists();
-		}
-		
-		SharedObject sharedObject = null;
-		String id = calculateId(iFile);
-		try {
-			SYNC.acquire();
-		
-			 sharedObject = (SharedObject) fManagedObjects.get(id);
-	
-			if (sharedObject != null && !force) {
-				// if in cache already, and force is not true, then this is an
-				// error
-				// in call
-				throw new ResourceInUse();
-			}
-			
-			sharedObject = new SharedObject(null);
-			fManagedObjects.put(id, sharedObject);
-			
-		} finally {
-			SYNC.release();
-		}
-		
-		// if we get to here without above exceptions, then all is ok
-		// to get model like normal, but set 'new' attribute (where the
-		// 'new' attribute means this is a model without a corresponding
-		// underlying resource.
-		aSharedModel = FileBufferModelManager.getInstance().getModel(iFile);
-		aSharedModel.setNewState(true);
-		
-		sharedObject.theSharedModel=aSharedModel;
-		// when resource is provided, we can set
-		// synchronization stamp ... otherwise client should
-		// Note: one client which does this is FileModelProvider.
-		aSharedModel.resetSynchronizationStamp(iFile);
-		return sharedObject;
-	}
-
-	public IStructuredModel _getModelFor(IStructuredDocument document, ReadEditType accessType) {
-
-		String id = FileBufferModelManager.getInstance().calculateId(document);
-		Assert.isNotNull(id, "unknown IStructuredDocument " + document); //$NON-NLS-1$
-		
-		SharedObject sharedObject = null;
-		SYNC.acquire();
-		sharedObject = (SharedObject) fManagedObjects.get(id);
-		SYNC.release();
-		
-		while(true) {
-			if (sharedObject!=null) {
-				sharedObject.waitForLoadAttempt();
-			}
-			SYNC.acquire();
-			SharedObject testObject = (SharedObject) fManagedObjects.get(id);
-			if (testObject==null) {
-				sharedObject = new SharedObject(null);
-				fManagedObjects.put(id, sharedObject);
-				SYNC.release();
-				synchronized(sharedObject) {
-					sharedObject.theSharedModel = FileBufferModelManager.getInstance().getModel(document);
-					_initCount(sharedObject, accessType);
-					sharedObject.setLoaded();
-				}
-				break;
-			} else if (sharedObject == testObject) {
-				synchronized(sharedObject) {
-					Assert.isTrue(sharedObject.referenceCountForEdit + sharedObject.referenceCountForRead > 0);
-					if (sharedObject.theSharedModel!=null) {
-						_incrCount(sharedObject, accessType);
-					}
-				}
-				SYNC.release();
-				break;
-			} else {
-				SYNC.release();
-				sharedObject = testObject;
-			}
-		}
-		
-		return sharedObject==null ? null : sharedObject.theSharedModel;
-	}
-
-	private void _incrCount(SharedObject sharedObject, ReadEditType type) {
-		synchronized(sharedObject) {
-			if (type == READ) {
-				sharedObject.referenceCountForRead++;
-				FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
-			}
-			else if (type == EDIT) {
-				sharedObject.referenceCountForEdit++;
-				FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
-			}
-			else
-				throw new IllegalArgumentException();
-		}
-	}
-
-	private void _initCount(SharedObject sharedObject, ReadEditType type) {
-		synchronized(sharedObject) {
-			if (type == READ) {
-				FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
-				sharedObject.referenceCountForRead = 1;
-			}
-			else if (type == EDIT) {
-				FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
-				sharedObject.referenceCountForEdit = 1;
-			}
-			else
-				throw new IllegalArgumentException();
-		}
-	}
-
-	private void addFactories(IStructuredModel model, IModelHandler handler) {
-		Assert.isNotNull(model, "model can not be null"); //$NON-NLS-1$
-		FactoryRegistry registry = model.getFactoryRegistry();
-		Assert.isNotNull(registry, "Factory Registry can not be null"); //$NON-NLS-1$
-		List factoryList = handler.getAdapterFactories();
-		addFactories(model, factoryList);
-	}
-
-	private void addFactories(IStructuredModel model, List factoryList) {
-		Assert.isNotNull(model, "model can not be null"); //$NON-NLS-1$
-		FactoryRegistry registry = model.getFactoryRegistry();
-		Assert.isNotNull(registry, "Factory Registry can not be null"); //$NON-NLS-1$
-		// Note: we add all of them from handler, even if
-		// already exists. May need to reconsider this.
-		if (factoryList != null) {
-			Iterator iterator = factoryList.iterator();
-			while (iterator.hasNext()) {
-				INodeAdapterFactory factory = (INodeAdapterFactory) iterator.next();
-				registry.addFactory(factory);
-			}
-		}
-	}
-
-
-	/**
-	 * Calculate id provides a common way to determine the id from the input
-	 * ... needed to get and save the model. It is a simple class utility, but
-	 * is an instance method so can be accessed via interface.
-	 */
-	public String calculateId(IFile file) {
-		return FileBufferModelManager.getInstance().calculateId(file);
-	}
-
-	private IModelHandler calculateType(IFile iFile) throws CoreException {
-		// IModelManager mm = ((ModelManagerPlugin)
-		// Platform.getPlugin(ModelManagerPlugin.ID)).getModelManager();
-		ModelHandlerRegistry cr = getModelHandlerRegistry();
-		IModelHandler cd = cr.getHandlerFor(iFile);
-		return cd;
-	}
-
-	private IModelHandler calculateType(String filename, InputStream inputStream) throws IOException {
-		ModelHandlerRegistry cr = getModelHandlerRegistry();
-		IModelHandler cd = cr.getHandlerFor(filename, inputStream);
-		return cd;
-	}
-
-	/**
-	 * 
-	 */
-	private URIResolver calculateURIResolver(IFile file) {
-		// Note: see comment in plugin.xml for potentially
-		// breaking change in behavior.
-
-		IProject project = file.getProject();
-		URIResolver resolver = (URIResolver) project.getAdapter(URIResolver.class);
-		if (resolver == null)
-			resolver = new ProjectResolver(project);
-		Object location = file.getLocation();
-		if (location == null)
-			location = file.getLocationURI();
-		if (location != null)
-			resolver.setFileBaseLocation(location.toString());
-		return resolver;
-	}
-
-	/*
-	 * Note: This method appears in both ModelManagerImpl and JSEditor (with
-	 * just a minor difference). They should be kept the same.
-	 * 
-	 * @deprecated - handled by platform
-	 */
-	private void convertLineDelimiters(IDocument document, IFile iFile) throws CoreException {
-		// Note: calculateType(iFile) returns a default xml model handler if
-		// content type is null.
-		String contentTypeId = calculateType(iFile).getAssociatedContentTypeId();
-		String endOfLineCode = ContentBasedPreferenceGateway.getPreferencesString(contentTypeId, CommonEncodingPreferenceNames.END_OF_LINE_CODE);
-		// endOfLineCode == null means the content type does not support this
-		// function (e.g. DTD)
-		// endOfLineCode == "" means no translation
-		if (endOfLineCode != null && endOfLineCode.length() > 0) {
-			String lineDelimiterToUse = System.getProperty("line.separator"); //$NON-NLS-1$
-			if (endOfLineCode.equals(CommonEncodingPreferenceNames.CR))
-				lineDelimiterToUse = CommonEncodingPreferenceNames.STRING_CR;
-			else if (endOfLineCode.equals(CommonEncodingPreferenceNames.LF))
-				lineDelimiterToUse = CommonEncodingPreferenceNames.STRING_LF;
-			else if (endOfLineCode.equals(CommonEncodingPreferenceNames.CRLF))
-				lineDelimiterToUse = CommonEncodingPreferenceNames.STRING_CRLF;
-
-			TextEdit multiTextEdit = new MultiTextEdit();
-			int lineCount = document.getNumberOfLines();
-			try {
-				for (int i = 0; i < lineCount; i++) {
-					IRegion lineInfo = document.getLineInformation(i);
-					int lineStartOffset = lineInfo.getOffset();
-					int lineLength = lineInfo.getLength();
-					int lineEndOffset = lineStartOffset + lineLength;
-
-					if (i < lineCount - 1) {
-						String currentLineDelimiter = document.getLineDelimiter(i);
-						if (currentLineDelimiter != null && currentLineDelimiter.compareTo(lineDelimiterToUse) != 0)
-							multiTextEdit.addChild(new ReplaceEdit(lineEndOffset, currentLineDelimiter.length(), lineDelimiterToUse));
-					}
-				}
-
-				if (multiTextEdit.getChildrenSize() > 0)
-					multiTextEdit.apply(document);
-			}
-			catch (BadLocationException exception) {
-				// just adding generic runtime here, until whole method
-				// deleted.
-				throw new RuntimeException(exception.getMessage());
-			}
-		}
-	}
-
-	/**
-	 * this used to be in loader, but has been moved here
-	 */
-	private IStructuredModel copy(IStructuredModel model, String newId) throws ResourceInUse {
-		IStructuredModel newModel = null;
-		IStructuredModel oldModel = model;
-		IModelHandler modelHandler = oldModel.getModelHandler();
-		IModelLoader loader = modelHandler.getModelLoader();
-		// newModel = loader.newModel();
-		newModel = loader.createModel(oldModel);
-		// newId, oldModel.getResolver(), oldModel.getModelManager());
-		newModel.setModelHandler(modelHandler);
-		// IStructuredDocument oldStructuredDocument =
-		// oldModel.getStructuredDocument();
-		// IStructuredDocument newStructuredDocument =
-		// oldStructuredDocument.newInstance();
-		// newModel.setStructuredDocument(newStructuredDocument);
-		newModel.setResolver(oldModel.getResolver());
-		newModel.setModelManager(oldModel.getModelManager());
-		// duplicateFactoryRegistry(newModel, oldModel);
-		newModel.setId(newId);
-		// set text of new one after all initialization is done
-		String contents = oldModel.getStructuredDocument().getText();
-		newModel.getStructuredDocument().setText(this, contents);
-		return newModel;
-	}
-
-	/**
-	 */
-	public IStructuredModel copyModelForEdit(String oldId, String newId) throws ResourceInUse {
-		IStructuredModel newModel = null;
-		// get the existing model associated with this id
-		IStructuredModel model = getExistingModel(oldId);
-		// if it doesn't exist, ignore request (though this would normally
-		// be a programming error.
-		if (model == null)
-			return null;
-		SharedObject sharedObject = null;
-		try {
-			SYNC.acquire();
-			// now be sure newModel does not exist
-			sharedObject = (SharedObject) fManagedObjects.get(newId);
-			if (sharedObject != null) {
-				throw new ResourceInUse();
-			}
-			sharedObject = new SharedObject(null);
-			fManagedObjects.put(newId,sharedObject);
-		} finally {
-			SYNC.release();
-		}
-		// get loader based on existing type (note the type assumption)
-		// Object type = ((IStructuredModel) model).getType();
-		// IModelHandler type = model.getModelHandler();
-		// IModelLoader loader = (IModelLoader) getModelLoaders().get(type);
-		// IModelLoader loader = (IModelLoader) getModelLoaders().get(type);
-		// ask the loader to copy
-		synchronized(sharedObject) {
-			sharedObject.doWait = false;
-			newModel = copy(model, newId);
-			sharedObject.doWait = true;
-		}
-		if (newModel != null) {
-			// add to our cache
-			synchronized(sharedObject) {
-				sharedObject.theSharedModel=newModel;
-				sharedObject.referenceCountForEdit = 1;
-				trace("copied model", newId, sharedObject.referenceCountForEdit); //$NON-NLS-1$
-			}
-		} else {
-			SYNC.acquire();
-			fManagedObjects.remove(newId);
-			SYNC.release();
-		}
-		sharedObject.setLoaded();
-		return newModel;
-	}
-
-	/**
-	 * Similar to clone, except the new instance has no content. Note: this
-	 * produces an unmanaged model, for temporary use. If a true shared model
-	 * is desired, use "copy".
-	 */
-	public IStructuredModel createNewInstance(IStructuredModel oldModel) throws IOException {
-		IModelHandler handler = oldModel.getModelHandler();
-		IModelLoader loader = handler.getModelLoader();
-		IStructuredModel newModel = loader.createModel(oldModel);
-		newModel.setModelHandler(handler);
-		if (newModel instanceof AbstractStructuredModel) {
-			((AbstractStructuredModel) newModel).setContentTypeIdentifier(oldModel.getContentTypeIdentifier());
-		}
-		URIResolver oldResolver = oldModel.getResolver();
-		newModel.setResolver(oldResolver);
-		try {
-			newModel.setId(DUPLICATED_MODEL);
-		}
-		catch (ResourceInUse e) {
-			// impossible, since this is an unmanaged model
-		}
-		// base location should be null, but we'll set to
-		// null to be sure.
-		newModel.setBaseLocation(null);
-		return newModel;
-	}
-
-	/**
-	 * Factory method, since a proper IStructuredDocument must have a proper
-	 * parser assigned. Note: its assume that IFile does not actually exist as
-	 * a resource yet. If it does, ResourceAlreadyExists exception is thrown.
-	 * If the resource does already exist, then createStructuredDocumentFor is
-	 * the right API to use.
-	 * 
-	 * @throws ResourceInUse
-	 * 
-	 */
-	public  IStructuredDocument createNewStructuredDocumentFor(IFile iFile) throws ResourceAlreadyExists, IOException, CoreException {
-		if (iFile.exists()) {
-			throw new ResourceAlreadyExists(iFile.getFullPath().toOSString());
-		}
-		// Will reconsider in future version
-		// String id = calculateId(iFile);
-		// if (isResourceInUse(id)) {
-		// throw new ResourceInUse(iFile.getFullPath().toOSString());
-		// }
-		IDocumentLoader loader = null;
-		IModelHandler handler = calculateType(iFile);
-		loader = handler.getDocumentLoader();
-		// for this API, "createNew" we assume the IFile does not exist yet
-		// as checked above, so just create empty document.
-		IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument();
-		return result;
-	}
-
-	/**
-	 * Factory method, since a proper IStructuredDocument must have a proper
-	 * parser assigned. Note: clients should verify IFile exists before using
-	 * this method. If this IFile does not exist, then
-	 * createNewStructuredDocument is the correct API to use.
-	 * 
-	 * @throws ResourceInUse
-	 */
-	public  IStructuredDocument createStructuredDocumentFor(IFile iFile) throws IOException, CoreException {
-		if (!iFile.exists()) {
-			throw new FileNotFoundException(iFile.getFullPath().toOSString());
-		}
-		// Will reconsider in future version
-		// String id = calculateId(iFile);
-		// if (isResourceInUse(id)) {
-		// throw new ResourceInUse(iFile.getFullPath().toOSString());
-		// }
-		IDocumentLoader loader = null;
-		IModelHandler handler = calculateType(iFile);
-		loader = handler.getDocumentLoader();
-		IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument(iFile);
-		return result;
-	}
-
-	/**
-	 * Conveience method, since a proper IStructuredDocument must have a
-	 * proper parser assigned. It should only be used when an empty
-	 * structuredDocument is needed. Otherwise, use IFile form.
-	 * 
-	 * @deprecated - TODO: to be removed by C4 do we really need this? I
-	 *             recommend to - use createStructuredDocumentFor(filename,
-	 *             null, null) - the filename does not need to represent a
-	 *             real - file, but can take for form of dummy.jsp, test.xml,
-	 *             etc. - That way we don't hard code the handler, but specify
-	 *             we - want the handler that "goes with" a certain type of -
-	 *             file.
-	 */
-	public  IStructuredDocument createStructuredDocumentFor(String contentTypeId) {
-		IDocumentLoader loader = null;
-		ModelHandlerRegistry cr = getModelHandlerRegistry();
-		IModelHandler handler = cr.getHandlerForContentTypeId(contentTypeId);
-		if (handler == null)
-			Logger.log(Logger.ERROR, "Program error: no model handler found for " + contentTypeId); //$NON-NLS-1$
-		loader = handler.getDocumentLoader();
-		IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument();
-		return result;
-	}
-
-	/**
-	 * Conveience method, since a proper IStructuredDocument must have a
-	 * proper parser assigned.
-	 * 
-	 * @deprecated -- - TODO: to be removed by C4 I marked as deprecated to
-	 *             discouage use of this method. It does not really work for
-	 *             JSP fragments, since JSP Fragments need an IFile to
-	 *             correctly look up the content settings. Use IFile form
-	 *             instead.
-	 */
-	public IStructuredDocument createStructuredDocumentFor(String filename, InputStream inputStream, URIResolver resolver) throws IOException {
-		IDocumentLoader loader = null;
-		InputStream istream = Utilities.getMarkSupportedStream(inputStream);
-		if (istream != null) {
-			istream.reset();
-		}
-		IModelHandler handler = calculateType(filename, istream);
-		loader = handler.getDocumentLoader();
-		IStructuredDocument result = null;
-		if (inputStream == null) {
-			result = (IStructuredDocument) loader.createNewStructuredDocument();
-		}
-		else {
-			result = (IStructuredDocument) loader.createNewStructuredDocument(filename, istream);
-		}
-		return result;
-	}
-
-	/**
-	 * Special case method. This method was created for the special case where
-	 * there is an encoding for input stream that should override all the
-	 * normal rules for encoding. For example, if there is an encoding
-	 * (charset) specified in HTTP response header, then that encoding is used
-	 * to translate the input stream to a string, but then the normal encoding
-	 * rules are ignored, so that the string is not translated twice (for
-	 * example, if its an HTML "file", then even if it contains a charset in
-	 * meta tag, its ignored since its assumed its all correctly decoded by
-	 * the HTTP charset.
-	 */
-	public  IStructuredDocument createStructuredDocumentFor(String filename, InputStream inputStream, URIResolver resolver, String encoding) throws IOException {
-		String content = readInputStream(inputStream, encoding);
-		IStructuredDocument result = createStructuredDocumentFor(filename, content, resolver);
-		return result;
-	}
-
-	/**
-	 * Convenience method. This method can be used when the resource does not
-	 * really exist (e.g. when content is being created, but hasn't been
-	 * written to disk yet). Note that since the content is being provided as
-	 * a String, it is assumed to already be decoded correctly so no
-	 * transformation is done.
-	 */
-	public  IStructuredDocument createStructuredDocumentFor(String filename, String content, URIResolver resolver) throws IOException {
-		// TODO: avoid all these String instances
-		StringBuffer contentBuffer = new StringBuffer(content);
-		IDocumentLoader loader = null;
-		IModelHandler handler = calculateType(filename, null);
-		loader = handler.getDocumentLoader();
-		IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument();
-		StringBuffer convertedContent = loader.handleLineDelimiter(contentBuffer, result);
-		result.setEncodingMemento(new NullMemento());
-		result.setText(this, convertedContent.toString());
-		return result;
-	}
-
-	/**
-	 * @param iFile
-	 * @param result
-	 * @return
-	 * @throws CoreException
-	 */
-	private IStructuredModel createUnManagedEmptyModelFor(IFile iFile) throws CoreException {
-		IStructuredModel result = null;
-		IModelHandler handler = calculateType(iFile);
-		String id = calculateId(iFile);
-		URIResolver resolver = calculateURIResolver(iFile);
-
-		try {
-			result = _commonCreateModel(id, handler, resolver);
-		}
-		catch (ResourceInUse e) {
-			// impossible, since we're not sharing
-			// (even if it really is in use ... we don't care)
-			// this may need to be re-examined.
-			if (Logger.DEBUG_MODELMANAGER)
-				Logger.log(Logger.INFO, "ModelMangerImpl::createUnManagedStructuredModelFor. Model unexpectedly in use."); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return result;
-	}
-
-	/**
-	 * Conveience method. It depends on the loaders newModel method to return
-	 * an appropriate StrucuturedModel appropriately initialized.
-	 */
-	public IStructuredModel createUnManagedStructuredModelFor(IFile iFile) throws IOException, CoreException {
-		IStructuredModel result = null;
-		result = createUnManagedEmptyModelFor(iFile);
-
-		IDocumentLoader loader = result.getModelHandler().getDocumentLoader();
-		IEncodedDocument document = loader.createNewStructuredDocument(iFile);
-
-		result.getStructuredDocument().setText(this, document.get());
-
-		return result;
-	}
-
-	/**
-	 * Conveience method. It depends on the loaders newModel method to return
-	 * an appropriate StrucuturedModel appropriately initialized.
-	 */
-	public  IStructuredModel createUnManagedStructuredModelFor(String contentTypeId) {
-		return createUnManagedStructuredModelFor(contentTypeId, null);
-	}
-
-	/**
-	 * Conveience method. It depends on the loaders newModel method to return
-	 * an appropriate StrucuturedModel appropriately initialized.
-	 */
-	public  IStructuredModel createUnManagedStructuredModelFor(String contentTypeId, URIResolver resolver) {
-		IStructuredModel result = null;
-		ModelHandlerRegistry cr = getModelHandlerRegistry();
-		IModelHandler handler = cr.getHandlerForContentTypeId(contentTypeId);
-		try {
-			result = _commonCreateModel(UNMANAGED_MODEL, handler, resolver); //$NON-NLS-1$
-		}
-		catch (ResourceInUse e) {
-			// impossible, since we're not sharing
-			// (even if it really is in use ... we don't care)
-			// this may need to be re-examined.
-			if (Logger.DEBUG_MODELMANAGER)
-				Logger.log(Logger.INFO, "ModelMangerImpl::createUnManagedStructuredModelFor. Model unexpectedly in use."); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return result;
-	}
-
-	private IStructuredModel getExistingModel(Object id) {
-		IStructuredModel result = null;
-		
-		SYNC.acquire();
-		/**
-		 * While a good check in theory, it's possible for an event fired to
-		 * cause a listener to access a method that calls this one.
-		 */
-		//Assert.isTrue(SYNC.getDepth()==1, "depth not equal to 1");
-		// let's see if we already have it in our cache
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		// if not, then we'll simply return null
-		if (sharedObject != null) {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			result = sharedObject.theSharedModel;
-		} else {
-			SYNC.release();
-		}
-		
-		return result;
-	}
-
-	/**
-	 * Note: users of this 'model' must still release it when finished.
-	 * Returns null if there's not a model corresponding to document.
-	 */
-	public IStructuredModel getExistingModelForEdit(IDocument document) {
-		IStructuredModel result = null;
-		
-		SYNC.acquire();		
-		// create a snapshot
-		Set ids = new HashSet(fManagedObjects.keySet());
-		SYNC.release();
-		for (Iterator iterator = ids.iterator(); iterator.hasNext();) {
-			Object potentialId = iterator.next();
-			SYNC.acquire();	
-			if (fManagedObjects.containsKey(potentialId)) {
-				// check to see if still valid
-				SYNC.release();
-				IStructuredModel tempResult = getExistingModel(potentialId);
-				if (tempResult!=null && document == tempResult.getStructuredDocument()) {
-					result = getExistingModelForEdit(potentialId);
-					break;
-				}
-			} else {
-				SYNC.release();
-			}
-		}
-		
-		return result;
-	}
-
-	/**
-	 * This is similar to the getModel method, except this method does not
-	 * create a model. This method does increment the reference count (if it
-	 * exists). If the model does not already exist in the cache of models,
-	 * null is returned.
-	 */
-	public  IStructuredModel getExistingModelForEdit(IFile iFile) {
-
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		Object id = calculateId(iFile);
-		IStructuredModel result = getExistingModelForEdit(id);
-		return result;
-	}
-
-	/**
-	 * This is similar to the getModel method, except this method does not
-	 * create a model. This method does increment the reference count (if it
-	 * exists). If the model does not already exist in the cache of models,
-	 * null is returned.
-	 * 
-	 * @deprecated use IFile form - this one will become protected or private
-	 */
-	public IStructuredModel getExistingModelForEdit(Object id) {
-
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		IStructuredModel result = null;
-		boolean doRelease = true;
-		// let's see if we already have it in our cache
-		try {
-			SYNC.acquire();
-			SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-			// if not, then we'll simply return null
-			if (sharedObject != null) {
-				// if shared object is in our cache, then simply increment its ref
-				// count,
-				// and return the object.
-				SYNC.release();
-				doRelease=false;
-				synchronized(sharedObject) {
-					if (sharedObject.doWait) {
-						sharedObject.waitForLoadAttempt();
-					}
-					if (sharedObject.theSharedModel!=null) {
-						_incrCount(sharedObject, EDIT);
-					}
-					result = sharedObject.theSharedModel;
-				}
-				trace("got existing model for Edit: ", id); //$NON-NLS-1$
-				trace("   incremented referenceCountForEdit ", id, sharedObject.referenceCountForEdit); //$NON-NLS-1$
-			}
-		} finally {
-			if (doRelease) {
-				SYNC.release();
-			}
-		}
-		
-		return result;
-	}
-
-	/**
-	 * Note: users of this 'model' must still release it when finished.
-	 * Returns null if there's not a model corresponding to document.
-	 */
-	public IStructuredModel getExistingModelForRead(IDocument document) {
-		IStructuredModel result = null;
-		
-		SYNC.acquire();		
-		// create a snapshot
-		Set ids = new HashSet(fManagedObjects.keySet());
-		SYNC.release();
-		for (Iterator iterator = ids.iterator(); iterator.hasNext();) {
-			Object potentialId = iterator.next();
-			SYNC.acquire();	
-			if (fManagedObjects.containsKey(potentialId)) {
-				// check to see if still valid
-				SYNC.release();
-				IStructuredModel tempResult = getExistingModel(potentialId);
-				if (tempResult!=null && document == tempResult.getStructuredDocument()) {
-					result = getExistingModelForRead(potentialId);
-					break;
-				}
-			} else {
-				SYNC.release();
-			}
-		}
-		
-		return result;
-	}
-
-	public IStructuredModel getExistingModelForRead(IFile iFile) {
-
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		Object id = calculateId(iFile);
-		IStructuredModel result = getExistingModelForRead(id);
-		return result;
-	}
-
-	/**
-	 * This is similar to the getModel method, except this method does not
-	 * create a model. This method does increment the reference count (if it
-	 * exists). If the model does not already exist in the cache of models,
-	 * null is returned.
-	 * 
-	 * @deprecated use IFile form - this one will become protected or private
-	 */
-	public  IStructuredModel getExistingModelForRead(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		IStructuredModel result = null;
-		boolean doRelease = true;
-		// let's see if we already have it in our cache
-		try {
-			SYNC.acquire();
-			SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-			// if not, then we'll simply return null
-			if (sharedObject != null) {
-				// if shared object is in our cache, then simply increment its ref
-				// count,
-				// and return the object.
-				SYNC.release();
-				doRelease=false;
-
-				synchronized(sharedObject) {
-					if (sharedObject.doWait) {
-						sharedObject.waitForLoadAttempt();
-					}
-					if (sharedObject.theSharedModel!=null) {
-						_incrCount(sharedObject, READ);
-					}
-					result = sharedObject.theSharedModel;
-				}
-			}
-		} finally {
-			if (doRelease)
-				SYNC.release();
-		}
-		return result;
-	}
-
-	/**
-	 * @deprecated DMW: Tom, this is "special" for links builder Assuming its
-	 *             still needed, wouldn't it be better to change to
-	 *             getExistingModels()? -- will be removed. Its not thread
-	 *             safe for one thread to get the Enumeration, when underlying
-	 *             data could be changed in another thread.
-	 */
-	public  Enumeration getExistingModelIds() {
-		try {
-			SYNC.acquire();
-			// create a copy
-			Vector keys = new Vector( fManagedObjects.keySet() );
-			return keys.elements();
-		} finally {
-			SYNC.release();
-		}
-	}
-
-	// TODO: replace (or supplement) this is a "model info" association to the
-	// IFile that created the model
-	private IFile getFileFor(IStructuredModel model) {
-		if (model == null)
-			return null;
-		String path = model.getBaseLocation();
-		if (path == null || path.length() == 0) {
-			Object id = model.getId();
-			if (id == null)
-				return null;
-			path = id.toString();
-		}
-		// TOODO needs rework for linked resources
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IFile file = root.getFileForLocation(new Path(path));
-		return file;
-	}
-
-	/**
-	 * One of the primary forms to get a managed model
-	 */
-	public  IStructuredModel getModelForEdit(IFile iFile) throws IOException, CoreException {
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		return _commonGetModel(iFile, EDIT, null, null);
-	}
-
-	public  IStructuredModel getModelForEdit(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {
-
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		return _commonGetModel(iFile, EDIT, encodingRule);
-	}
-
-	public  IStructuredModel getModelForEdit(IFile iFile, String encoding, String lineDelimiter) throws java.io.UnsupportedEncodingException, IOException, CoreException {
-
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		return _commonGetModel(iFile, EDIT, encoding, lineDelimiter);
-	}
-
-	public  IStructuredModel getModelForEdit(IStructuredDocument document) {
-		return _getModelFor(document, EDIT);
-	}
-
-	/**
-	 * @see IModelManager
-	 * @deprecated use IFile or String form
-	 */
-	public  IStructuredModel getModelForEdit(Object id, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {
-
-		Assert.isNotNull(id, "IFile parameter can not be null"); //$NON-NLS-1$
-		String stringId = id.toString();
-		return getModelForEdit(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);
-	}
-
-	/**
-	 * @see IModelManager
-	 * @deprecated - use IFile or String form
-	 */
-	public  IStructuredModel getModelForEdit(Object id, Object modelType, String encodingName, String lineDelimiter, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {
-
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		String stringId = id.toString();
-		return getModelForEdit(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);
-	}
-
-	public  IStructuredModel getModelForEdit(String id, InputStream inputStream, URIResolver resolver) throws IOException {
-		if (id == null) {
-			throw new IllegalArgumentException("Program Error: id may not be null"); //$NON-NLS-1$
-		}
-		IStructuredModel result = null;
-
-		InputStream istream = Utilities.getMarkSupportedStream(inputStream);
-		IModelHandler handler = calculateType(id, istream);
-		if (handler != null) {
-			result = _commonCreateModel(istream, id, handler, resolver, EDIT, null, null);
-		}
-		else {
-			Logger.log(Logger.INFO, "no model handler found for id"); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * One of the primary forms to get a managed model
-	 */
-	public  IStructuredModel getModelForRead(IFile iFile) throws IOException, CoreException {
-
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		return _commonGetModel(iFile, READ, null, null);
-	}
-
-	public  IStructuredModel getModelForRead(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		return _commonGetModel(iFile, READ, encodingRule);
-	}
-
-	public  IStructuredModel getModelForRead(IFile iFile, String encodingName, String lineDelimiter) throws java.io.UnsupportedEncodingException, IOException, CoreException {
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		return _commonGetModel(iFile, READ, encodingName, lineDelimiter);
-	}
-
-	public  IStructuredModel getModelForRead(IStructuredDocument document) {
-		return _getModelFor(document, READ);
-	}
-
-	/**
-	 * @see IModelManager
-	 * @deprecated use IFile or String form
-	 */
-	public  IStructuredModel getModelForRead(Object id, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		String stringId = id.toString();
-		return getModelForRead(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);
-	}
-
-	/**
-	 * @see IModelManager
-	 * @deprecated use IFile form
-	 */
-	public  IStructuredModel getModelForRead(Object id, Object modelType, String encodingName, String lineDelimiter, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		String stringId = id.toString();
-		return getModelForRead(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);
-	}
-
-	public  IStructuredModel getModelForRead(String id, InputStream inputStream, URIResolver resolver) throws IOException {
-		InputStream istream = Utilities.getMarkSupportedStream(inputStream);
-		IModelHandler handler = calculateType(id, istream);
-		IStructuredModel result = null;
-		result = _commonCreateModel(istream, id, handler, resolver, READ, null, null);
-		return result;
-	}
-
-	/**
-	 * @deprecated - only temporarily visible
-	 */
-	public ModelHandlerRegistry getModelHandlerRegistry() {
-		if (fModelHandlerRegistry == null) {
-			fModelHandlerRegistry = ModelHandlerRegistry.getInstance();
-		}
-		return fModelHandlerRegistry;
-	}
-
-	/**
-	 * @see IModelManager#getNewModelForEdit(IFile, boolean)
-	 */
-	public  IStructuredModel getNewModelForEdit(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException {
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		SharedObject sharedObject = _commonNewModel(iFile, force);
-		synchronized(sharedObject) {
-			sharedObject.referenceCountForEdit = 1;
-		}
-		sharedObject.setLoaded();
-		return sharedObject.theSharedModel;
-	}
-
-	/**
-	 * @see IModelManager#getNewModelForRead(IFile, boolean)
-	 */
-	public  IStructuredModel getNewModelForRead(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException {
-
-		Assert.isNotNull(iFile, "IFile parameter can not be null"); //$NON-NLS-1$
-		SharedObject sharedObject = _commonNewModel(iFile, force);
-		SYNC.acquire();
-		synchronized(sharedObject) {
-			if (sharedObject.theSharedModel!=null) {
-				sharedObject.referenceCountForRead = 1;
-			}
-		}
-		SYNC.release();
-		sharedObject.setLoaded();
-		return sharedObject.theSharedModel;
-	}
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 */
-	public  int getReferenceCount(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		int count = 0;
-	
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject != null) {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			SYNC.acquire();
-			synchronized (sharedObject) {
-				count = sharedObject.referenceCountForRead + sharedObject.referenceCountForEdit;
-			}
-		}
-		SYNC.release();
-		return count;
-	}
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 */
-	public int getReferenceCountForEdit(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		int count = 0;
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject != null) {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			synchronized(sharedObject) {
-				count = sharedObject.referenceCountForEdit;
-			}
-		} else {
-			SYNC.release();
-		}
-		return count;
-	}
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 */
-	public int getReferenceCountForRead(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		int count = 0;
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject != null) {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			SYNC.acquire();
-			synchronized(sharedObject) {
-				count = sharedObject.referenceCountForRead;
-			}
-		}
-		SYNC.release();
-		return count;
-	}
-
-	private void handleConvertLineDelimiters(IStructuredDocument structuredDocument, IFile iFile, EncodingRule encodingRule, EncodingMemento encodingMemento) throws CoreException, MalformedOutputExceptionWithDetail, UnsupportedEncodingException {
-		if (structuredDocument.getNumberOfLines() > 1) {
-			convertLineDelimiters(structuredDocument, iFile);
-		}
-	}
-
-	private void handleProgramError(Throwable t) {
-
-		Logger.logException("Impossible Program Error", t); //$NON-NLS-1$
-	}
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 */
-	public  boolean isShared(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		int count = 0;
-		boolean result = false;
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject != null) {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			SYNC.acquire();
-			synchronized(sharedObject) {
-				count = sharedObject.referenceCountForRead + sharedObject.referenceCountForEdit;
-			}
-		}
-		SYNC.release();
-		result = count > 1;
-		return result;
-	}
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model
-	 */
-	public  boolean isSharedForEdit(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		int count = 0;
-		boolean result = false;
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject != null) {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			synchronized(sharedObject) {
-				count = sharedObject.referenceCountForEdit;
-			}
-		} else {
-			SYNC.release();
-		}
-		result = count > 1;
-		return result;
-	}
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model
-	 */
-	public  boolean isSharedForRead(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		int count = 0;
-		boolean result = false;
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject != null) {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			SYNC.acquire();
-			synchronized(sharedObject) {
-				count = sharedObject.referenceCountForRead;
-			}
-		}
-		SYNC.release();
-		result = count > 1;
-		return result;
-	}
-
-	/**
-	 * This method can be called to determine if the model manager is within a
-	 * "aboutToChange" and "changed" sequence.
-	 * 
-	 * @deprecated the manager does not otherwise interact with these states
-	 * @return false
-	 */
-	public boolean isStateChanging() {
-		// doesn't seem to be used anymore
-		return false;
-	}
-
-	/**
-	 * This method changes the id of the model. TODO: try to refine the design
-	 * not to use this function
-	 */
-	public void moveModel(Object oldId, Object newId) {
-		org.eclipse.wst.sse.core.internal.util.Assert.isNotNull(oldId, "id parameter can not be null"); //$NON-NLS-1$
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(oldId);
-		// if not found in cache, ignore request.
-		// this would normally be a program error
-		if (sharedObject != null) {
-			fManagedObjects.remove(oldId);
-			fManagedObjects.put(newId, sharedObject);
-		}
-		SYNC.release();
-	}
-
-	private String readInputStream(InputStream inputStream, String ianaEncodingName) throws UnsupportedEncodingException, IOException {
-
-		String allText = null;
-		if ((ianaEncodingName != null) && (ianaEncodingName.length() != 0)) {
-			String enc = CodedIO.getAppropriateJavaCharset(ianaEncodingName);
-			if (enc == null) {
-				// if no conversion was possible, let's assume that
-				// the encoding is already a java encoding name, so we'll
-				// proceed with that assumption. This is the case, for
-				// example,
-				// for the reload() procedure.
-				// If in fact it is not a valid java encoding, then
-				// the "allText=" line will cause an
-				// UnsupportedEncodingException
-				enc = ianaEncodingName;
-			}
-			allText = readInputStream(new InputStreamReader(inputStream, enc));
-		}
-		else {
-			// we normally assume encoding is provided for this method, but if
-			// not,
-			// we'll use platform default
-			allText = readInputStream(new InputStreamReader(inputStream));
-		}
-		return allText;
-	}
-
-	private String readInputStream(InputStreamReader inputStream) throws IOException {
-
-		int numRead = 0;
-		StringBuffer buffer = new StringBuffer();
-		char tBuff[] = new char[READ_BUFFER_SIZE];
-		while ((numRead = inputStream.read(tBuff, 0, tBuff.length)) != -1) {
-			buffer.append(tBuff, 0, numRead);
-		}
-		// remember -- we didn't open stream ... so we don't close it
-		return buffer.toString();
-	}
-
-	/*
-	 * @see IModelManager#reinitialize(IStructuredModel)
-	 */
-	public IStructuredModel reinitialize(IStructuredModel model) {
-
-		// getHandler (assume its the "new one")
-		IModelHandler handler = model.getModelHandler();
-		// getLoader for that new one
-		IModelLoader loader = handler.getModelLoader();
-		// ask it to reinitialize
-		model = loader.reinitialize(model);
-		// the loader should check to see if the one it received
-		// is the same type it would normally create.
-		// if not, it must "start from scratch" and create a whole
-		// new one.
-		// if it is of the same type, it should just 'replace text'
-		// replacing all the existing text with the new text.
-		// the important one is the JSP loader ... it should go through
-		// its embedded content checking and initialization
-		return model;
-	}
-
-	 void releaseFromEdit(IStructuredModel structuredModel) {
-		Object id = structuredModel.getId();
-		if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {
-			cleanupDiscardedModel(structuredModel);
-		}
-		else {
-			releaseFromEdit(id);
-		}
-
-	}
-	
-	 void releaseFromRead(IStructuredModel structuredModel) {
-		Object id = structuredModel.getId();
-		if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {
-			cleanupDiscardedModel(structuredModel);
-		}
-		else {
-			releaseFromRead(id);
-		}
-
-	}
-	/**
-	 * default for use in same package, not subclasses
-	 * 
-	 */
-	 private void releaseFromEdit(Object id) {
-		// ISSUE: many of these asserts should be changed to "logs"
-		// and continue to limp along?
-
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		SharedObject sharedObject = null;
-
-		// ISSUE: here we need better "spec" what to do with
-		// unmanaged or duplicated models. Release still needs
-		// to be called on them, for now, but the model manager
-		// doesn't need to do anything.
-		if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {
-			throw new IllegalArgumentException("Ids of UNMANAGED_MODEL or DUPLICATED_MODEL are illegal here");
-		}
-		else {
-			SYNC.acquire();
-			sharedObject = (SharedObject) fManagedObjects.get(id);
-			SYNC.release();
-			
-			Assert.isNotNull(sharedObject, "release was requested on a model that was not being managed"); //$NON-NLS-1$
-			sharedObject.waitForLoadAttempt();
-			
-			SYNC.acquire();
-			synchronized(sharedObject) {
-				_decrCount(sharedObject, EDIT);
-				if ((sharedObject.referenceCountForRead == 0) && (sharedObject.referenceCountForEdit == 0)) {
-					discardModel(id, sharedObject);
-				}
-			}
-			SYNC.release();
-			// if edit goes to zero, but still open for read,
-			// then we should reload here, so we are in synch with
-			// contents on disk.
-			// ISSUE: should we check isDirty here?
-			// ANSWER: here, for now now. model still has its own dirty
-			// flag for some reason.
-			// we need to address * that * too.
-
-			synchronized(sharedObject) {
-				if ((sharedObject.referenceCountForRead > 0) && (sharedObject.referenceCountForEdit == 0) && sharedObject.theSharedModel.isDirty()) {
-					signalPreLifeCycleListenerRevert(sharedObject.theSharedModel);
-					revertModel(id, sharedObject);
-					/*
-					 * Because model events are fired to notify about the
-					 * revert's changes, and listeners can still get/release
-					 * the model from this thread (locking prevents it being
-					 * done from other threads), the reference counts could
-					 * have changed since we entered this if block, and the
-					 * model could have been discarded.  Check the counts again.
-					 */
-					if (sharedObject.referenceCountForRead > 0 && sharedObject.referenceCountForEdit == 0) {
-						sharedObject.theSharedModel.setDirtyState(false);
-					}
-					signalPostLifeCycleListenerRevert(sharedObject.theSharedModel);
-				}
-			}
-			
-		}
-	}
-
-	// private for now, though public forms have been requested, in past.
-	private void revertModel(Object id, SharedObject sharedObject) {
-		IStructuredDocument structuredDocument = sharedObject.theSharedModel.getStructuredDocument();
-		FileBufferModelManager.getInstance().revert(structuredDocument);
-	}
-
-	private void signalPreLifeCycleListenerRevert(IStructuredModel structuredModel) {
-		int type = ModelLifecycleEvent.MODEL_REVERT | ModelLifecycleEvent.PRE_EVENT;
-		// what's wrong with this design that a cast is needed here!?
-		ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);
-		((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);
-	}
-
-	private void signalPostLifeCycleListenerRevert(IStructuredModel structuredModel) {
-		int type = ModelLifecycleEvent.MODEL_REVERT | ModelLifecycleEvent.POST_EVENT;
-		// what's wrong with this design that a cast is needed here!?
-		ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);
-		((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);
-	}
-
-	private void discardModel(Object id, SharedObject sharedObject) {
-		SYNC.acquire();
-		fManagedObjects.remove(id);
-		SYNC.release();
-		IStructuredDocument structuredDocument = sharedObject.theSharedModel.getStructuredDocument();
-
-		if (structuredDocument == null) {
-			Platform.getLog(SSECorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, SSECorePlugin.ID, IStatus.ERROR, "Attempted to discard a structured model but the underlying document has already been set to null: " + sharedObject.theSharedModel.getBaseLocation(), null));
-		}
-
-		cleanupDiscardedModel(sharedObject.theSharedModel);
-	}
-
-	private void cleanupDiscardedModel(IStructuredModel structuredModel) {
-		IStructuredDocument structuredDocument = structuredModel.getStructuredDocument();
-		/*
-		 * This call (and setting the StructuredDocument to null) were
-		 * previously done within the model itself, but for concurrency it
-		 * must be done here during a synchronized release.
-		 */
-		structuredModel.getFactoryRegistry().release();
-
-		/*
-		 * For structured documents originating from file buffers, disconnect
-		 * us from the file buffer, now.
-		 */
-		FileBufferModelManager.getInstance().releaseModel(structuredDocument);
-
-		/*
-		 * Setting the document to null is required since some subclasses of
-		 * model might have "cleanup" of listeners, etc., to remove, which
-		 * were initialized during the initial setStructuredDocument.
-		 * 
-		 * The model itself in particular may have internal listeners used to
-		 * coordinate the document with its own "structure".
-		 */
-		structuredModel.setStructuredDocument(null);
-	}
-
-	
-	/**
-	 * default for use in same package, not subclasses
-	 * 
-	 */
-	 private void releaseFromRead(Object id) {
-		Assert.isNotNull(id, "id parameter can not be null"); //$NON-NLS-1$
-		SharedObject sharedObject = null;
-
-		if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {
-			throw new IllegalArgumentException("Ids of UNMANAGED_MODEL or DUPLICATED_MODEL are illegal here");
-		}
-		else {
-			SYNC.acquire();
-			sharedObject = (SharedObject) fManagedObjects.get(id);
-			SYNC.release();
-			Assert.isNotNull(sharedObject, "release was requested on a model that was not being managed"); //$NON-NLS-1$
-			sharedObject.waitForLoadAttempt();
-		}
-		SYNC.acquire();
-		synchronized(sharedObject) {
-			_decrCount(sharedObject, READ);
-			if ((sharedObject.referenceCountForRead == 0) && (sharedObject.referenceCountForEdit == 0)) {
-				discardModel(id, sharedObject);
-			}
-		}
-		SYNC.release();
-	}
-
-	/**
-	 * This is similar to the getModel method, except this method does not use
-	 * the cached version, but forces the cached version to be replaced with a
-	 * fresh, unchanged version. Note: this method does not change any
-	 * reference counts. Also, if there is not already a cached version of the
-	 * model, then this call is essentially ignored (that is, it does not put
-	 * a model in the cache) and returns null.
-	 * 
-	 * @deprecated - will become protected, use reload directly on model
-	 */
-	public  IStructuredModel reloadModel(Object id, java.io.InputStream inputStream) throws java.io.UnsupportedEncodingException {
-
-		// get the existing model associated with this id
-		IStructuredModel structuredModel = getExistingModel(id);
-		// for the model to be null is probably an error (that is,
-		// reload should not have been called, but we'll guard against
-		// a null pointer example and return null if we are no longer managing
-		// that model.
-		if (structuredModel != null) {
-			// get loader based on existing type
-			// dmwTODO evaluate when reload should occur
-			// with potentially new type (e.g. html 'save as' jsp).
-			IModelHandler handler = structuredModel.getModelHandler();
-			IModelLoader loader = handler.getModelLoader();
-			// ask the loader to re-load
-			loader.reload(Utilities.getMarkSupportedStream(inputStream), structuredModel);
-			trace("re-loading model", id); //$NON-NLS-1$
-		}
-		return structuredModel;
-	}
-
-	public void saveModel(IFile iFile, String id, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {
-
-		// let's see if we already have it in our cache
-	
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject == null || sharedObject.theSharedModel == null) {
-			SYNC.release();
-			throw new IllegalStateException(SSECoreMessages.Program_Error__ModelManage_EXC_); //$NON-NLS-1$ = "Program Error: ModelManagerImpl::saveModel. Model should be in the cache"
-		} 
-		else {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			
-			/**
-			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=221610
-			 * 
-			 * Sync removed from here to prevent deadlock. Although the model
-			 * instance may disappear or be made invalid while the save is
-			 * happening, the document itself still has the contents we're
-			 * trying to save. Simultaneous saves should be throttled by
-			 * resource locking without our intervention.
-			 */
-			boolean saved = false;
-			// if this model was based on a File Buffer and we're writing back
-			// to the same location, use the buffer to do the writing
-			if (FileBufferModelManager.getInstance().isExistingBuffer(sharedObject.theSharedModel.getStructuredDocument())) {
-				ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(sharedObject.theSharedModel.getStructuredDocument());
-				IPath fileLocation = FileBuffers.normalizeLocation(iFile.getFullPath());
-				if (fileLocation.equals(buffer.getLocation())) {
-					buffer.commit(new NullProgressMonitor(), true);
-					saved = true;
-				}
-			}
-			if (!saved) {
-				IStructuredModel model = sharedObject.theSharedModel;
-				IStructuredDocument document = model.getStructuredDocument();
-				saveStructuredDocument(document, iFile, encodingRule);
-				trace("saving model", id); //$NON-NLS-1$
-			}
-			sharedObject.theSharedModel.setDirtyState(false);
-			sharedObject.theSharedModel.setNewState(false);
-		}	
-	}
-
-	/**
-	 * Saving the model really just means to save it's structured document.
-	 * 
-	 * @param id
-	 * @param outputStream
-	 * @param encodingRule
-	 * @throws UnsupportedEncodingException
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-	public void saveModel(String id, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {
-
-		// let's see if we already have it in our cache
-
-		SYNC.acquire();
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject == null) {
-			SYNC.release();
-			throw new IllegalStateException(SSECoreMessages.Program_Error__ModelManage_EXC_); //$NON-NLS-1$ = "Program Error: ModelManagerImpl::saveModel. Model should be in the cache"
-		}
-		else {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			/**
-			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=221610
-			 * 
-			 * Sync removed from here to prevent deadlock. Although the model
-			 * instance may disappear or be made invalid while the save is
-			 * happening, the document itself still has the contents we're
-			 * trying to save. Simultaneous saves should be throttled by
-			 * resource locking without our intervention.
-			 */
-			/*
-			 * if this model was based on a File Buffer and we're writing back
-			 * to the same location, use the buffer to do the writing
-			 */
-			if (FileBufferModelManager.getInstance().isExistingBuffer(sharedObject.theSharedModel.getStructuredDocument())) {
-				ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(sharedObject.theSharedModel.getStructuredDocument());
-				buffer.commit(new NullProgressMonitor(), true);
-			}
-			else {
-				IFile iFile = getFileFor(sharedObject.theSharedModel);
-				IStructuredModel model = sharedObject.theSharedModel;
-				IStructuredDocument document = model.getStructuredDocument();
-				saveStructuredDocument(document, iFile);
-				trace("saving model", id); //$NON-NLS-1$
-			}
-			sharedObject.theSharedModel.setDirtyState(false);
-			sharedObject.theSharedModel.setNewState(false);
-		}
-	}
-
-	/**
-	 * @deprecated - this method is less efficient than IFile form, since it
-	 *             requires an extra "copy" of byte array, and should be avoid
-	 *             in favor of the IFile form.
-	 */
-	public void saveModel(String id, OutputStream outputStream, EncodingRule encodingRule) throws UnsupportedEncodingException, CoreException, IOException {
-		SYNC.acquire();
-		// let's see if we already have it in our cache
-		SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);
-		if (sharedObject == null) {
-			SYNC.release();
-			throw new IllegalStateException(SSECoreMessages.Program_Error__ModelManage_EXC_); //$NON-NLS-1$ = "Program Error: ModelManagerImpl::saveModel. Model should be in the cache"
-		}
-		else {
-			SYNC.release();
-			sharedObject.waitForLoadAttempt();
-			synchronized(sharedObject) {
-				CodedStreamCreator codedStreamCreator = new CodedStreamCreator();
-				codedStreamCreator.set(sharedObject.theSharedModel.getId(), new DocumentReader(sharedObject.theSharedModel.getStructuredDocument()));
-				codedStreamCreator.setPreviousEncodingMemento(sharedObject.theSharedModel.getStructuredDocument().getEncodingMemento());
-				ByteArrayOutputStream byteArrayOutputStream = codedStreamCreator.getCodedByteArrayOutputStream(encodingRule);
-				byte[] outputBytes = byteArrayOutputStream.toByteArray();
-				outputStream.write(outputBytes);
-				trace("saving model", id); //$NON-NLS-1$
-				sharedObject.theSharedModel.setDirtyState(false);
-				sharedObject.theSharedModel.setNewState(false);
-			}
-		}
-	}
-
-	public void saveStructuredDocument(IStructuredDocument structuredDocument, IFile iFile) throws UnsupportedEncodingException, CoreException, IOException {
-		saveStructuredDocument(structuredDocument, iFile, EncodingRule.CONTENT_BASED);
-	}
-
-	public void saveStructuredDocument(IStructuredDocument structuredDocument, IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, CoreException, IOException {
-		if (FileBufferModelManager.getInstance().isExistingBuffer(structuredDocument)) {
-			ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(structuredDocument);
-			if (buffer.getLocation().equals(iFile.getFullPath()) || buffer.getLocation().equals(iFile.getLocation())) {
-				buffer.commit(new NullProgressMonitor(), true);
-			}
-		}
-		else {
-			// IModelHandler handler = calculateType(iFile);
-			// IDocumentDumper dumper = handler.getDocumentDumper();
-			CodedStreamCreator codedStreamCreator = new CodedStreamCreator();
-			Reader reader = new DocumentReader(structuredDocument);
-			codedStreamCreator.set(iFile, reader);
-			codedStreamCreator.setPreviousEncodingMemento(structuredDocument.getEncodingMemento());
-			EncodingMemento encodingMemento = codedStreamCreator.getCurrentEncodingMemento();
-
-			// be sure document's is updated, in case exception is thrown in
-			// getCodedByteArrayOutputStream
-			structuredDocument.setEncodingMemento(encodingMemento);
-
-			// Convert line delimiters after encoding memento is figured out,
-			// but
-			// before writing to output stream.
-			handleConvertLineDelimiters(structuredDocument, iFile, encodingRule, encodingMemento);
-
-			ByteArrayOutputStream codedByteStream = codedStreamCreator.getCodedByteArrayOutputStream(encodingRule);
-			InputStream codedStream = new ByteArrayInputStream(codedByteStream.toByteArray());
-			if (iFile.exists())
-				iFile.setContents(codedStream, true, true, null);
-			else
-				iFile.create(codedStream, false, null);
-			codedByteStream.close();
-			codedStream.close();
-		}
-	}
-
-	/**
-	 * Common trace method
-	 */
-	private void trace(String msg, Object id) {
-		if (Logger.DEBUG_MODELMANAGER) {
-			Logger.log(Logger.INFO, msg + " " + Utilities.makeShortId(id)); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * Common trace method
-	 */
-	private void trace(String msg, Object id, int value) {
-		if (Logger.DEBUG_MODELMANAGER) {
-			Logger.log(Logger.INFO, msg + Utilities.makeShortId(id) + " (" + value + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-	}
-
-	 boolean isIdInUse(String newId) {
-			boolean inUse = false;
-			SYNC.acquire();
-			SharedObject object =(SharedObject) fManagedObjects.get(newId);
-			if (object!=null) {
-				inUse = object.theSharedModel!=null;
-			}
-			SYNC.release();
-			return inUse;
-		}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistry.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistry.java
deleted file mode 100644
index 60a10a8..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistry.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.modelhandler;
-
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-
-/**
- * The entries in this registry are, conceptually, singleton's Since only one
- * instance is created in the registry, and then that instance returned when
- * required.
- * 
- * Note that there is intentionally no 'remove' method, Since the registry
- * itself is read it when once, from the platform's plugin registry, and is
- * not intended to be modified after that. A change in an extenstion in a
- * plugin.xml will only take effect when the workbench is re-started.
- *  
- */
-public interface EmbeddedTypeRegistry {
-
-	/**
-	 * Method to return the specific type for the specific mimetype.
-	 */
-	public EmbeddedTypeHandler getTypeFor(String mimeType);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistryImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistryImpl.java
deleted file mode 100644
index 8aa890f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistryImpl.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.modelhandler;
-
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler;
-
-
-/**
- *  
- */
-public class EmbeddedTypeRegistryImpl implements EmbeddedTypeRegistry {
-
-	private static EmbeddedTypeRegistry instance = null;
-
-	public synchronized static EmbeddedTypeRegistry getInstance() {
-		if (instance == null) {
-			instance = new EmbeddedTypeRegistryImpl();
-		}
-		return instance;
-	}
-
-	private HashSet hashSet = null;
-	private EmbeddedTypeHandler registryDefaultHandler = null;
-
-	/*
-	 * @see ContentTypeRegistry#getTypeFor(String)
-	 */
-	/**
-	 * Constructor for ContentTypeRegistryImpl.
-	 */
-	private EmbeddedTypeRegistryImpl() {
-		super();
-		hashSet = new HashSet();
-		new EmbeddedTypeRegistryReader().readRegistry(hashSet);
-	}
-
-	/**
-	 * @see ContentTypeRegistry#add(ContentTypeDescription)
-	 */
-	void add(IDocumentTypeHandler contentTypeDescription) {
-		hashSet.add(contentTypeDescription);
-	}
-
-	private EmbeddedTypeHandler getJSPDefaultEmbeddedType() {
-		return getTypeFor("text/html"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Method getRegistryDefault. We cache the default handler, since can't
-	 * change once plugin descriptors are loaded.
-	 * 
-	 * @return EmbeddedTypeHandler
-	 */
-	private EmbeddedTypeHandler getRegistryDefault() {
-		if (registryDefaultHandler == null) {
-			Iterator it = hashSet.iterator();
-			while ((registryDefaultHandler == null) && (it.hasNext())) { // safe
-				// cast
-				// since
-				// 'add'
-				// requires
-				// EmbeddedContentTypeDescription
-				EmbeddedTypeHandler item = (EmbeddedTypeHandler) it.next();
-				if ((item != null) && (item.isDefault())) {
-					registryDefaultHandler = item;
-					break;
-				}
-			}
-		}
-		return registryDefaultHandler;
-	}
-
-	/**
-	 * Finds the contentTypeDescription based on literal id. Its basically a
-	 * "first found first returned". Note the order is fairly unpredictable,
-	 * so non-unique ids would cause problems.
-	 */
-	public EmbeddedTypeHandler getTypeFor(String mimeType) {
-		// Note: the reason we have this precondition is that the
-		// default is different inside the registry than when called,
-		// for example, from the JSPLoader. For the JSPLoader, if there
-		// is no mimetype, the default should be HTML. Here, if there is
-		// some mimetype, but it is not recognized, we return a default
-		// for XML. This is required for various voice xml types, etc.
-		EmbeddedTypeHandler found = null;
-		if (mimeType == null || mimeType.trim().length() == 0) {
-			found = getJSPDefaultEmbeddedType();
-		} else {
-			Iterator it = hashSet.iterator();
-			while ((found == null) && (it.hasNext())) { // safe cast since
-				// 'add' requires
-				// EmbeddedContentTypeDescription
-				EmbeddedTypeHandler item = (EmbeddedTypeHandler) it.next();
-				if ((item != null) && (item.getSupportedMimeTypes().contains(mimeType))) {
-					found = item;
-					break;
-				}
-			}
-			// if no exact match, do the "looser" check
-			if(found == null) {
-				it = hashSet.iterator();
-				while ((found == null) && (it.hasNext())) { 
-					EmbeddedTypeHandler item = (EmbeddedTypeHandler) it.next();
-					if ((item != null) && (item.canHandleMimeType(mimeType))) {
-						found = item;
-						break;
-					}
-				}
-			}
-		}
-		// no matches, use default
-		if (found == null) {
-			found = getRegistryDefault();
-		}
-		return found;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistryReader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistryReader.java
deleted file mode 100644
index 698f7a1..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/EmbeddedTypeRegistryReader.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.modelhandler;
-
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-
-
-public class EmbeddedTypeRegistryReader {
-	protected String ATT_CLASS = "class"; //$NON-NLS-1$
-	protected String EXTENSION_POINT_ID = "embeddedTypeHandler"; //$NON-NLS-1$
-
-
-	protected String PLUGIN_ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
-	protected String TAG_NAME = "embeddedTypeHandler"; //$NON-NLS-1$
-
-	EmbeddedTypeRegistryReader() {
-		super();
-	}
-
-	protected EmbeddedTypeHandler readElement(IConfigurationElement element) {
-
-		EmbeddedTypeHandler contentTypeDescription = null;
-		if (element.getName().equals(TAG_NAME)) {
-			try {
-				contentTypeDescription = (EmbeddedTypeHandler) element.createExecutableExtension(ATT_CLASS);
-			} catch (Exception e) {
-				Logger.logException(e);
-			}
-		}
-		Assert.isNotNull(contentTypeDescription, "Error reading content type description"); //$NON-NLS-1$
-		return contentTypeDescription;
-	}
-
-	/**
-	 * We simply require an 'add' method, of what ever it is we are to read
-	 * into
-	 */
-	void readRegistry(Set set) {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				EmbeddedTypeHandler embeddedContentType = readElement(elements[i]);
-				// null can be returned if there's an error reading the
-				// element
-				if (embeddedContentType != null) {
-					set.add(embeddedContentType);
-				}
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerRegistry.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerRegistry.java
deleted file mode 100644
index af83ded..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerRegistry.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.modelhandler;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-
-
-public class ModelHandlerRegistry {
-	private static ModelHandlerRegistry instance = null;
-	static final String INTERNAL_DEFAULT_EXTENSION = "org.eclipse.wst.xml.core.internal.modelhandler"; //$NON-NLS-1$
-
-	public synchronized static ModelHandlerRegistry getInstance() {
-		if (instance == null) {
-			instance = new ModelHandlerRegistry();
-		}
-		return instance;
-	}
-
-	private IModelHandler defaultHandler = null;
-	private ModelHandlerRegistryReader reader = new ModelHandlerRegistryReader();
-
-	private ModelHandlerRegistry() {
-		super();
-		reader = new ModelHandlerRegistryReader().readRegistry();
-	}
-
-	/**
-	 * Finds the default model handler. Note: we still go through the registry
-	 * to be sure to get the existing instance, but then we do remember it, so
-	 * subsequent requests will be faster. The first time through, we do check
-	 * the whole list, to be sure there is only one.
-	 * 
-	 */
-	final public IModelHandler getDefault() {
-		if (defaultHandler == null) {
-			IConfigurationElement[] elements = reader.elements;
-			for (int i = 0; i < elements.length; i++) {
-				boolean ofInterest = reader.isElementDefault(elements[i]);
-				if (ofInterest) {
-					/*
-					 * If, here within the search loop we've already found one
-					 * defaultHandler, then something is wrong!
-					 */
-					if (defaultHandler == null) {
-						defaultHandler = reader.getInstance(elements[i]);
-					}
-					else {
-						String errorString = "Program or configuration error. More than one default content handler found"; //$NON-NLS-1$
-						Logger.log(Logger.ERROR, errorString);
-						throw new IllegalStateException(errorString);
-					}
-				}
-			}
-		}
-		if (defaultHandler == null) {
-			String errorString = "Program or configuration error. No default content type handler found."; //$NON-NLS-1$
-			Logger.log(Logger.ERROR, errorString);
-			throw new IllegalStateException(errorString);
-		}
-		return defaultHandler;
-	}
-
-	/**
-	 * Finds a ModelHandler based on literal extension id. It's basically a
-	 * "first found first returned". No specific order is guaranteed and the
-	 * uniqueness of IDs is not considered.
-	 * 
-	 * @param extensionId
-	 * @return the given extension, or null
-	 */
-	private IModelHandler getHandlerExtension(String extensionId) {
-		IModelHandler found = null;
-		IConfigurationElement[] elements = reader.elements;
-		if (elements != null) {
-			for (int i = 0; i < elements.length; i++) {
-				String currentId = reader.getId(elements[i]);
-				if (extensionId.equals(currentId)) {
-					IModelHandler item = reader.getInstance(elements[i]);
-					found = item;
-				}
-			}
-		}
-		else if (Logger.DEBUG){
-			Logger.log(Logger.WARNING, "There were no Model Handler found in registry"); //$NON-NLS-1$
-		}
-		return found;
-	}
-
-	/**
-	 * Finds the registered IModelHandler for a given named file's content
-	 * type.
-	 * 
-	 * @param file
-	 * @return The IModelHandler registered for the content type of the given
-	 *         file. If an exact match is not found, the most-specific match
-	 *         according to IContentType.isKindOf() will be returned. If none
-	 *         are found, either a default or null will be returned.
-	 * @throws CoreException
-	 */
-	public IModelHandler getHandlerFor(IFile file) throws CoreException {
-		IModelHandler modelHandler = null;
-		IContentDescription contentDescription = null;
-		IContentType contentType = null;
-		boolean accessible = file.isAccessible();
-		if (accessible) {
-			/* Try the optimized method first as the description may be cached */
-			contentDescription = file.getContentDescription();
-			if (contentDescription != null) {
-				// use the provided description
-				contentType = contentDescription.getContentType();
-			}
-			else {
-				/* use the more thorough discovery method to get a description */
-				InputStream contents = null;
-				try {
-					contents = file.getContents(true);
-					contentDescription = Platform.getContentTypeManager().getDescriptionFor(contents, file.getName(), IContentDescription.ALL);
-					if (contentDescription != null) {
-						contentType = contentDescription.getContentType();
-					}
-				}
-				catch (IOException e) {
-					// nothing further can be done, but will log for debugging
-					Logger.logException(e);
-				}
-				finally {
-					if (contents != null) {
-						try {
-							contents.close();
-						}
-						catch (IOException e1) {
-							// nothing can be done
-						}
-					}
-				}
-			}
-		}
-
-		/*
-		 * If we couldn't get the content type from a description, try basing
-		 * it on just the filename
-		 */
-		if (contentType == null) {
-			contentType = Platform.getContentTypeManager().findContentTypeFor(file.getName());
-		}
-
-		if (contentType != null) {
-			modelHandler = getHandlerForContentType(contentType);
-		}
-		else {
-			// hard coding for null content type
-			modelHandler = getHandlerExtension(INTERNAL_DEFAULT_EXTENSION); //$NON-NLS-1$
-		}
-
-		return modelHandler;
-	}
-
-
-	/**
-	 * Finds the registered IModelHandler for a given named InputStream.
-	 * 
-	 * @param inputName
-	 * @param inputStream
-	 * @return The IModelHandler registered for the content type of the given
-	 *         input. If an exact match is not found, the most-specific match
-	 *         according to IContentType.isKindOf() will be returned. If none
-	 *         are found, either a default or null will be returned.
-	 * @throws IOException
-	 */
-	public IModelHandler getHandlerFor(String inputName, InputStream inputStream) throws IOException {
-		InputStream iStream = Utilities.getMarkSupportedStream(inputStream);
-		IModelHandler modelHandler = null;
-		IContentType contentType = null;
-		if (inputStream != null) {
-			try {
-				iStream.mark(CodedIO.MAX_MARK_SIZE);
-				contentType = Platform.getContentTypeManager().findContentTypeFor(Utilities.getLimitedStream(iStream), inputName);
-			}
-			finally {
-				if (iStream != null && iStream.markSupported()) {
-					iStream.reset();
-				}
-			}
-
-		}
-		if (contentType == null) {
-			contentType = Platform.getContentTypeManager().findContentTypeFor(inputName);
-		}
-		// if all else failed, try to detect solely on contents; done last for
-		// performance reasons
-		if (contentType == null) {
-			contentType = Platform.getContentTypeManager().findContentTypeFor(Utilities.getLimitedStream(iStream), null);
-		}
-		modelHandler = getHandlerForContentType(contentType);
-		return modelHandler;
-	}
-
-	/**
-	 * Finds the registered IModelHandler for a given IContentType.
-	 * 
-	 * @param contentType
-	 * @return The IModelHandler registered for the given content type. If an
-	 *         exact match is not found, the most-specific match according to
-	 *         IContentType.isKindOf() will be returned. If none are found,
-	 *         either a default or null will be returned.
-	 */
-	private IModelHandler getHandlerForContentType(IContentType contentType) {
-		IModelHandler handler = null;
-		if (contentType != null) {
-			IConfigurationElement exactContentTypeElement = null;
-			IConfigurationElement kindOfContentTypeElement = null;
-			int kindOfContentTypeDepth = 0;
-			IConfigurationElement[] elements = reader.elements;
-			if (elements != null) {
-				for (int i = 0; i < elements.length && exactContentTypeElement == null; i++) {
-					String currentId = reader.getAssociatedContentTypeId(elements[i]);
-					IContentType associatedContentType = Platform.getContentTypeManager().getContentType(currentId);
-					if (contentType.equals(associatedContentType)) {
-						exactContentTypeElement = elements[i];
-					}
-					else if (contentType.isKindOf(associatedContentType)) {
-						/*
-						 * Update the kindOfElement variable only if this
-						 * element's content type is "deeper" (depth test
-						 * ensures the first content type is remembered)
-						 */
-						IContentType testContentType = associatedContentType;
-						int testDepth = 0;
-						while (testContentType != null) {
-							testDepth++;
-							testContentType = testContentType.getBaseType();
-						}
-						if (testDepth > kindOfContentTypeDepth) {
-							kindOfContentTypeElement = elements[i];
-							kindOfContentTypeDepth = testDepth;
-						}
-					}
-				}
-			}
-			else if (Logger.DEBUG){
-				Logger.log(Logger.WARNING, "There were no Model Handler found in registry"); //$NON-NLS-1$
-			}
-			if (exactContentTypeElement != null) {
-				handler = reader.getInstance(exactContentTypeElement);
-			}
-			else if (kindOfContentTypeElement != null) {
-				handler = reader.getInstance(kindOfContentTypeElement);
-			}
-		}
-
-		if (handler == null) {
-			// temp hard coding for null content type arguments
-			handler = getHandlerExtension(INTERNAL_DEFAULT_EXTENSION); //$NON-NLS-1$
-		}
-		return handler;
-	}
-
-	/**
-	 * Finds the registered IModelHandler for a given content type ID. No
-	 * specific order is guaranteed and the uniqueness of IDs is not
-	 * considered.
-	 * 
-	 * @param contentType
-	 * @return The IModelHandler registered for the given content type ID. If
-	 *         an exact match is not found, the most-specific match according
-	 *         to IContentType.isKindOf() will be returned. If none are found,
-	 *         either a default or null will be returned.
-	 */
-	public IModelHandler getHandlerForContentTypeId(String contentTypeId) {
-		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeId);
-		return getHandlerForContentType(contentType);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerRegistryReader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerRegistryReader.java
deleted file mode 100644
index c6d611f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerRegistryReader.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.modelhandler;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.AbstractModelHandler;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-
-
-/**
- * This class just converts what's in the plugins registry into a form more
- * easily useable by others, the ContentTypeRegistry.
- */
-class ModelHandlerRegistryReader {
-	private HashMap allReadyCreateInstances = new HashMap();
-	protected String ATT_ASSOCIATED_CONTENT_TYPE = "associatedContentTypeId"; //$NON-NLS-1$
-	protected String ATT_CLASS = "class"; //$NON-NLS-1$
-	protected String ATT_DEFAULT = "default"; //$NON-NLS-1$
-	protected String ATT_ID = "id"; //$NON-NLS-1$
-	IConfigurationElement[] elements;
-	protected String EXTENSION_POINT_ID = "modelHandler"; //$NON-NLS-1$
-	//
-	protected String PLUGIN_ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
-	protected String TAG_NAME = "modelHandler"; //$NON-NLS-1$
-
-	//
-	/**
-	 * ContentTypeRegistryReader constructor comment.
-	 */
-	ModelHandlerRegistryReader() {
-		super();
-	}
-
-	String getAssociatedContentTypeId(IConfigurationElement element) {
-		String value = element.getAttribute(ATT_ASSOCIATED_CONTENT_TYPE);
-		return value;
-	}
-
-	String getId(IConfigurationElement element) {
-		String idValue = element.getAttribute(ATT_ID);
-		return idValue;
-	}
-
-	synchronized IModelHandler getInstance(IConfigurationElement element) {
-		// May need to reconsider, but for now, we'll assume all clients must
-		// subclass AbstractContentTypeIdentifier. Its easier and safer, for
-		// this
-		// low level "system" object. (That is, we can check and set "package
-		// protected"
-		// attributes.
-		AbstractModelHandler modelHandler = (AbstractModelHandler) allReadyCreateInstances.get(getId(element));
-		if (modelHandler == null) {
-			try {
-				modelHandler = (AbstractModelHandler) element.createExecutableExtension(ATT_CLASS);
-				if (modelHandler != null) {
-					allReadyCreateInstances.put(getId(element), modelHandler);
-					String defaultValue = element.getAttribute(ATT_DEFAULT);
-					if (defaultValue != null && "true".equals(defaultValue)) //$NON-NLS-1$
-						modelHandler.setDefault(true);
-					else
-						modelHandler.setDefault(false);
-					// TODO -- set and check attributes vs. created instance
-					//contentTypeIdentifier.setOrCheckId(element.getAttribute(ATT_ID));
-				}
-			} catch (CoreException e) {
-				org.eclipse.wst.sse.core.internal.Logger.logException(e);
-			}
-		}
-		return modelHandler;
-	}
-
-	public boolean isElementDefault(IConfigurationElement element) {
-		String defaultValue = element.getAttribute(ATT_DEFAULT);
-		if (defaultValue != null && "true".equals(defaultValue)) //$NON-NLS-1$
-			return true;
-		else
-			return false;
-	}
-
-	ModelHandlerRegistryReader readRegistry() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			// just remember the elements, so plugins don't have to
-			// be activated, unless extension matches those "of interest".
-			elements = point.getConfigurationElements();
-		}
-		return this;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerUtility.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerUtility.java
deleted file mode 100644
index f0b2a4b..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/ModelHandlerUtility.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.modelhandler;
-
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler;
-
-/**
- * 
- * Likely a temporary class to be replaced by plugin, eventually.
- */
-public class ModelHandlerUtility {
-
-	private static ModelHandlerRegistry contentTypeRegistry;
-
-	public static IDocumentTypeHandler getContentTypeFor(String string) {
-		return getContentTypeRegistry().getHandlerForContentTypeId(string);
-	}
-
-	private static ModelHandlerRegistry getContentTypeRegistry() {
-		if (contentTypeRegistry == null) {
-			contentTypeRegistry = ModelHandlerRegistry.getInstance();
-		}
-		return contentTypeRegistry;
-	}
-
-	public static EmbeddedTypeHandler getDefaultEmbeddedType() {
-		return getEmbeddedContentTypeFor("text/html"); //$NON-NLS-1$
-	}
-
-	public static EmbeddedTypeHandler getEmbeddedContentTypeFor(String string) {
-		EmbeddedTypeHandler instance = null;
-		instance = EmbeddedTypeRegistryImpl.getInstance().getTypeFor(string);
-		return instance;
-	}
-
-	public ModelHandlerUtility() {
-		super();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/PluginContributedFactoryReader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/PluginContributedFactoryReader.java
deleted file mode 100644
index 7d2e2dd..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/modelhandler/PluginContributedFactoryReader.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.modelhandler;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-
-
-/**
- * 
- * Clients can make use of IExecutableExtension to handle the optional adapter
- * class and key. Typically, many clients use a typical pattern of providing
- * an adapter class and key in their null argument constructor anyway, so
- * they'd only have to use IExecutableExtension if the factory was for more
- * than one.
- */
-public class PluginContributedFactoryReader {
-	//	protected final String ATTR_ADAPTERKEY = "adapterKeyClass";
-	// //$NON-NLS-1$
-	//	protected final String ATTR_REGISTERADAPTER = "registerAdapters";
-	// //$NON-NLS-1$
-	private static PluginContributedFactoryReader reader = null;
-
-	public synchronized static PluginContributedFactoryReader getInstance() {
-		if (reader == null) {
-			reader = new PluginContributedFactoryReader();
-		}
-		return reader;
-	}
-
-	protected final String ATTR_CLASS = "class"; //$NON-NLS-1$
-	protected final String ATTR_CONTENTTYPE = "contentTypeIdentiferId"; //$NON-NLS-1$
-
-	protected final String EXTENSION_POINT_ID = "contentTypeFactoryContribution"; //$NON-NLS-1$
-	protected final String TAG_NAME = "factory"; //$NON-NLS-1$
-
-	protected PluginContributedFactoryReader() {
-		super();
-	}
-
-	public List getFactories(IDocumentTypeHandler handler) {
-		return loadRegistry(handler.getId());
-	}
-
-	public List getFactories(String type) {
-		return loadRegistry(type);
-	}
-
-	protected INodeAdapterFactory loadFactoryFromConfigurationElement(IConfigurationElement element, Object requesterType) {
-		INodeAdapterFactory factory = null;
-		if (element.getName().equals(TAG_NAME)) {
-			String contentType = element.getAttribute(ATTR_CONTENTTYPE);
-			if (!requesterType.equals(contentType))
-				return null;
-			String className = element.getAttribute(ATTR_CLASS);
-			//			String adapterKeyClass = element.getAttribute(ATTR_ADAPTERKEY);
-			//			String registerAdapters =
-			// element.getAttribute(ATTR_REGISTERADAPTER);
-
-			// if className is null, then no one defined the extension point
-			// for adapter factories
-			if (className != null) {
-				try {
-					factory = (INodeAdapterFactory) element.createExecutableExtension(ATTR_CLASS);
-				} catch (CoreException e) {
-					// if an error occurs here, its probably that the plugin
-					// could not be found/loaded
-					org.eclipse.wst.sse.core.internal.Logger.logException("Could not find class: " + className, e); //$NON-NLS-1$
-				} catch (Exception e) {
-					// if an error occurs here, its probably that the plugin
-					// could not be found/loaded -- but in any case we just
-					// want
-					// to log the error and continue running and best we can.
-					org.eclipse.wst.sse.core.internal.Logger.logException("Could not find class: " + className, e); //$NON-NLS-1$
-				}
-				//				if (plugin != null) {
-				//					factory = oldAttributesCode(element, factory, className,
-				// plugin);
-				//
-			}
-		}
-
-		return factory;
-	}
-
-	protected List loadRegistry(Object contentType) {
-		List factoryList = null; // new Vector();
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(SSECorePlugin.ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			if (elements.length > 0) {
-				// this is called a lot, so don't create vector unless really
-				// needed
-				// TODO: could eventually cache in a hashtable, or something,
-				// to avoid repeat processing
-				factoryList = new Vector();
-				for (int i = 0; i < elements.length; i++) {
-					INodeAdapterFactory factory = loadFactoryFromConfigurationElement(elements[i], contentType);
-					if (factory != null)
-						factoryList.add(factory);
-				}
-			}
-		}
-		return factoryList;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/parser/ContextRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/parser/ContextRegion.java
deleted file mode 100644
index caaafd5..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/parser/ContextRegion.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.parser;
-
-
-
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-
-
-/**
- * Regions of this class are intended specifically for XML/HTML/JSPs. Other
- * languages may need their own subclasses. (See the updateModel method).
- */
-public class ContextRegion implements ITextRegion {
-	protected int fLength;
-
-	protected int fStart;
-	protected int fTextLength;
-	protected String fType;
-
-	protected ContextRegion() {
-		super();
-	}
-
-	public ContextRegion(String newContext, int newStart, int newTextLength, int newLength) {
-		fType = newContext;
-		fStart = newStart;
-		fTextLength = newTextLength;
-		fLength = newLength;
-	}
-
-
-	public void adjust(int i) {
-		fStart += i;
-
-	}
-
-	public void adjustLength(int i) {
-		fLength += i;
-	}
-
-	public void adjustStart(int i) {
-		fStart += i;
-	}
-
-	public void adjustTextLength(int i) {
-		fTextLength += i;
-
-	}
-
-	boolean allLetterOrDigit(String changes) {
-		boolean result = true;
-		for (int i = 0; i < changes.length(); i++) {
-			// TO_DO_FUTURE: check that a Java Letter or Digit is
-			// the same thing as an XML letter or digit
-			if (!(Character.isLetterOrDigit(changes.charAt(i)))) {
-				result = false;
-				break;
-			}
-		}
-		return result;
-	}
-
-	boolean allWhiteSpace(String changes) {
-		boolean result = true;
-		for (int i = 0; i < changes.length(); i++) {
-			if (!Character.isWhitespace(changes.charAt(i))) {
-				result = false;
-				break;
-			}
-		}
-
-		return result;
-	}
-
-	boolean canHandleAsLetterOrDigit(String changes, int requestStart, int lengthToReplace) {
-		boolean result = false;
-		// Make sure we are in a non-white space area
-		if ((requestStart <= (getTextEnd())) && (allLetterOrDigit(changes))) {
-			result = true;
-		}
-		return result;
-	}
-
-	boolean canHandleAsWhiteSpace(String changes, int requestStart, int lengthToReplace) {
-		boolean result = false;
-		// if we are in the "white space" area of a region, then
-		// we don't want to handle, a reparse is needed.
-		// the white space region is consider anywhere that would
-		// leave whitespace between this character and the text part.
-		// and of course, we can insert whitespace in whitespace region
-		//
-		// if there is no whitespace in this region, no need to look further
-		if (getEnd() > getTextEnd()) {
-			// no need to add one to end of text, as we used to, since we
-			// change definition of length to equate to offset plus one.
-			if (requestStart > getTextEnd()) {
-				// ok, we are in the whitespace region, so we can't handle,
-				// unless
-				// we are just inserting whitespace.
-				if (allWhiteSpace(changes)) {
-					result = true;
-				}
-				else {
-					result = false;
-				}
-
-			}
-		}
-
-		return result;
-	}
-
-	public boolean contains(int position) {
-
-		return fStart <= position && position < fStart + fLength;
-	}
-
-	public void equatePositions(ITextRegion region) {
-		fStart = region.getStart();
-		fLength = region.getLength();
-		fTextLength = region.getTextLength();
-	}
-
-	public int getEnd() {
-		return fStart + fLength;
-	}
-
-	public int getLength() {
-		return fLength;
-	}
-
-	public int getStart() {
-		return fStart;
-	}
-
-	public int getTextEnd() {
-		return fStart + fTextLength;
-	}
-
-	public int getTextLength() {
-		return fTextLength;
-	}
-
-	public String getType() {
-		return fType;
-	}
-
-	public void setLength(int i) {
-		fLength = i;
-	}
-
-	public void setStart(int i) {
-		fStart = i;
-	}
-
-	public void setTextLength(int i) {
-		fTextLength = i;
-	}
-
-	public void setType(String string) {
-		fType = string;
-	}
-
-	public String toString() {
-		String className = getClass().getName();
-		String shortClassName = className.substring(className.lastIndexOf(".") + 1); //$NON-NLS-1$
-		String result = shortClassName + "--> " + getType() + ": " + getStart() + "-" + getTextEnd() + (getTextEnd() != getEnd() ? ("/" + getEnd()) : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-		// NOTE: if the document held by any region has been updated and the
-		// region offsets have not
-		// yet been updated, the output from this method invalid.
-		return result;
-	}
-
-	public StructuredDocumentEvent updateRegion(Object requester, IStructuredDocumentRegion parent, String changes, int requestStart, int lengthToReplace) {
-		// the four types we used to handle here, have all been moved to
-		// specific region classes.
-		// XML_TAG_ATTRIBUTE_VALUE
-		// XML_TAG_ATTRIBUTE_NAME
-		// XML_CONTENT
-		// XML_CDATA_TEXT
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/parser/ForeignRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/parser/ForeignRegion.java
deleted file mode 100644
index 9bb5a36..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/parser/ForeignRegion.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.parser;
-
-
-
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-
-
-public class ForeignRegion extends ContextRegion {
-
-	private String language = null;
-	private String surroundingTag = null;
-
-	public ForeignRegion(String newContext, int newStart, int newTextLength, int newLength) {
-		super(newContext, newStart, newTextLength, newLength);
-	}
-
-	public ForeignRegion(String newContext, int newStart, int newTextLength, int newLength, String newLanguage) {
-		super(newContext, newStart, newTextLength, newLength);
-		setLanguage(newLanguage);
-	}
-
-	/**
-	 * 
-	 * @return java.lang.String
-	 */
-	public java.lang.String getLanguage() {
-		return language;
-	}
-
-	/**
-	 * @return java.lang.String
-	 */
-	public java.lang.String getSurroundingTag() {
-		return surroundingTag;
-	}
-
-	/**
-	 * 
-	 * @param newLanguage
-	 *            java.lang.String
-	 */
-	public void setLanguage(java.lang.String newLanguage) {
-		language = newLanguage;
-	}
-
-	/**
-	 * @param newSurroundingTag
-	 *            java.lang.String
-	 */
-	public void setSurroundingTag(java.lang.String newSurroundingTag) {
-		surroundingTag = newSurroundingTag;
-	}
-
-	public String toString() {
-		return "FOREIGN: " + super.toString();//$NON-NLS-1$
-	}
-
-	public StructuredDocumentEvent updateRegion(Object requester, IStructuredDocumentRegion flatnode, String changes, int requestStart, int lengthToReplace) {
-		org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent result = null;
-		int lengthDifference = org.eclipse.wst.sse.core.internal.util.Utilities.calculateLengthDifference(changes, lengthToReplace);
-		fLength += lengthDifference;
-		fTextLength += lengthDifference;
-		result = new RegionChangedEvent(flatnode.getParentDocument(), requester, flatnode, this, changes, requestStart, lengthToReplace);
-
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/preferences/CommonModelPreferenceNames.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/preferences/CommonModelPreferenceNames.java
deleted file mode 100644
index a7ef278..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/preferences/CommonModelPreferenceNames.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.preferences;
-
-/**
- * @deprecated CommonModelPreferenceNames are now managed by each individual
- *             content type. (XXCorePreferenceNames)
- * 
- */
-public interface CommonModelPreferenceNames {
-	String TAB_WIDTH = "tabWidth";//$NON-NLS-1$
-	String LINE_WIDTH = "lineWidth";//$NON-NLS-1$
-	String SPLIT_MULTI_ATTRS = "splitMultiAttrs";//$NON-NLS-1$
-	String INDENT_USING_TABS = "indentUsingTabs";//$NON-NLS-1$
-	String CLEAR_ALL_BLANK_LINES = "clearAllBlankLines";//$NON-NLS-1$
-
-	String TAG_NAME_CASE = "tagNameCase";//$NON-NLS-1$
-	String ATTR_NAME_CASE = "attrNameCase";//$NON-NLS-1$
-
-	String FORMATTING_SUPPORTED = "formattingSupported";//$NON-NLS-1$
-
-	String PREFERRED_MARKUP_CASE_SUPPORTED = "preferredMarkupCaseSupported";//$NON-NLS-1$
-
-	String TASK_TAG_TAGS = "task-tag-tags"; //$NON-NLS-1$
-	String TASK_TAG_PRIORITIES = "task-tag-priorities"; //$NON-NLS-1$
-	String TASK_TAG_ENABLE = "task-tags"; //$NON-NLS-1$
-	String TASK_TAG_PROJECTS_IGNORED = "task-tag-projects-toIgnore"; //$NON-NLS-1$
-
-
-	/**
-	 * these are preferences that should be inherited from the "embedded
-	 * preference store" for example: if you ask for th OVERVIEW_RULER
-	 * preference for JSP, you will automatically get the preference from the
-	 * HTML preference store.
-	 */
-	String EMBEDDED_CONTENT_TYPE_PREFERENCES[] = {TAB_WIDTH, LINE_WIDTH, SPLIT_MULTI_ATTRS, INDENT_USING_TABS, CLEAR_ALL_BLANK_LINES, TAG_NAME_CASE, ATTR_NAME_CASE,};
-
-	String FORMATTING_PREFERENCES[] = {TAB_WIDTH, LINE_WIDTH, SPLIT_MULTI_ATTRS, INDENT_USING_TABS, CLEAR_ALL_BLANK_LINES,};
-
-	String AUTO = "Auto";//$NON-NLS-1$
-	String UTF_8 = "UTF-8";//$NON-NLS-1$
-	String ISO_8859_1 = "ISO-8859-1";//$NON-NLS-1$
-
-	int ASIS = 0;
-	int LOWER = 1;
-	int UPPER = 2;
-
-	// cleanup preference names
-	String CLEANUP_TAG_NAME_CASE = "cleanupTagNameCase";//$NON-NLS-1$
-	String CLEANUP_ATTR_NAME_CASE = "cleanupAttrNameCase";//$NON-NLS-1$
-	String COMPRESS_EMPTY_ELEMENT_TAGS = "compressEmptyElementTags";//$NON-NLS-1$
-	String INSERT_REQUIRED_ATTRS = "insertRequiredAttrs";//$NON-NLS-1$
-	String INSERT_MISSING_TAGS = "insertMissingTags";//$NON-NLS-1$
-	String QUOTE_ATTR_VALUES = "quoteAttrValues";//$NON-NLS-1$
-	String FORMAT_SOURCE = "formatSource";//$NON-NLS-1$
-	String CONVERT_EOL_CODES = "convertEOLCodes";//$NON-NLS-1$
-	String CLEANUP_EOL_CODE = "cleanupEOLCode";//$NON-NLS-1$
-
-	String LAST_ACTIVE_PAGE = "lastActivePage";//$NON-NLS-1$	
-
-	// need to put default tab width preference here so it is accessible by
-	// both model and editor
-	// this way, editor does not need to query model's default tab width
-	// preference
-	int DEFAULT_TAB_WIDTH = 4;
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/preferences/PreferenceInitializer.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/preferences/PreferenceInitializer.java
deleted file mode 100644
index 7505633..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/preferences/PreferenceInitializer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys;
-
-public class PreferenceInitializer extends AbstractPreferenceInitializer {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IEclipsePreferences taskTagDefaults = new DefaultScope().getNode(TaskTagPreferenceKeys.TASK_TAG_NODE);
-		taskTagDefaults.putBoolean(TaskTagPreferenceKeys.TASK_TAG_ENABLE, false);
-		taskTagDefaults.put(TaskTagPreferenceKeys.TASK_TAG_TAGS, "TODO,FIXME,XXX"); //$NON-NLS-1$
-		taskTagDefaults.put(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, "1,2,1"); //$NON-NLS-1$
-		taskTagDefaults.put(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED, ""); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/propertytester/StructuredFilePropertyTester.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/propertytester/StructuredFilePropertyTester.java
deleted file mode 100644
index a64b6b7..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/propertytester/StructuredFilePropertyTester.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.wst.sse.core.internal.propertytester;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.wst.sse.core.internal.Logger;
-
-/**
- * A Property Tester that operates on IFiles and validates
- * that the expected content type id matches that of the content
- * type of the file, or any of the base content types.
- * 
- * Based on org.eclipse.core.internal.propertytester.FilePropertyTester
- * 
- */
-public class StructuredFilePropertyTester extends PropertyTester {
-
-	/**
-	 * A property indicating that we are looking to verify that the file matches
-	 * the content type matching the given identifier. The identifier is
-	 * provided as the expected value.
-	 */
-	private static final String PROPERTY_CONTENT_TYPE_ID = "contentTypeId"; //$NON-NLS-1$
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
-		if(PROPERTY_CONTENT_TYPE_ID.equals(property) && (expectedValue != null) && (receiver instanceof IFile) && ((IFile) receiver).exists())
-			return testContentType((IFile) receiver, expectedValue.toString());
-		return false;
-	}
-	
-	/**
-	 * Tests whether the content type for <code>file</code> (or any base content types) 
-	 * matches the <code>contentTypeId</code>. It is possible that this method call could
-	 * cause the file to be read. It is also possible (through poor plug-in
-	 * design) for this method to load plug-ins.
-	 * 
-	 * @param file
-	 *            The file for which the content type should be determined; must
-	 *            not be <code>null</code>.
-	 * @param contentTypeId
-	 *            The expected content type; must not be <code>null</code>.
-	 * @return <code>true</code> if the file's content type (or base content types) 
-	 *         has an identifier that matches <code>contentTypeId</code>;
-	 *         <code>false</code> otherwise.
-	 */
-	private boolean testContentType(final IFile file, String contentTypeId) {
-		final String expectedValue = contentTypeId.trim();
-
-		try {
-			IContentDescription contentDescription = file.getContentDescription();
-			if (contentDescription != null) {
-				IContentType contentType = contentDescription.getContentType();
-				while (contentType != null) {
-					if (expectedValue.equals(contentType.getId()))
-						return true;
-					contentType = contentType.getBaseType();
-				}
-			}
-		}
-		catch (Exception e) {
-			// [232831] - Log messages only when debugging
-			if(Logger.DEBUG)
-				Logger.logException(e);
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/AbstractAdapterFactory.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/AbstractAdapterFactory.java
deleted file mode 100644
index 4aa9c80..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/AbstractAdapterFactory.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-/**
- * An abstract implementation of IAdapterFactory. All implementers of
- * IAdapterFactory should subclass this class. The default constructor uses
- * itself (this) as the key. Subclasses need to provide a way to create the
- * adapter, and can override or call other methods.
- */
-abstract public class AbstractAdapterFactory implements INodeAdapterFactory {
-
-
-
-	private Object fAdapterKey;
-
-	private boolean fShouldRegisterAdapter;
-
-	/**
-	 * If this default constructor used, setAdapterKey and setShouldRegister
-	 * should be used to properly initialize.
-	 */
-	protected AbstractAdapterFactory() {
-		super();
-
-	}
-
-
-	public AbstractAdapterFactory(Object adapterKey) {
-		this(adapterKey, true);
-	}
-
-	/**
-	 * Suclasses may extended this constructor, if needed.
-	 */
-
-	public AbstractAdapterFactory(Object adapterKey, boolean registerAdapters) {
-
-		super();
-		fAdapterKey = adapterKey;
-		fShouldRegisterAdapter = registerAdapters;
-
-	}
-
-	/**
-	 * ISSUE: should be final. See those that implement it 
-	 * for complicating details and "unknowns". 
-	 */
-	public INodeAdapter adapt(INodeNotifier target) {
-		INodeAdapter adapter = null;
-		if (target != null) {
-			adapter = target.getExistingAdapter(fAdapterKey);
-			if (adapter == null) {
-				adapter = adaptNew(target);
-			}
-		}
-		return adapter;
-	}
-
-	/**
-	 * Subclasses should normally implement their own 'copy' method. By
-	 * default, we'll return the same instance, for convenience of those using
-	 * singleton factories (which have no state, and so need to do anything on
-	 * 'release').
-	 * 
-	 */
-	public INodeAdapterFactory copy() {
-		return this;
-	}
-
-	/**
-	 * This method needs to return true of this factory is for adapters of
-	 * type 'type'. It is required that it return true if 'equals' and this
-	 * default behavior is provided by this super class. Clients may extend
-	 * this behavior if more complex logic is required.
-	 */
-	public boolean isFactoryForType(Object type) {
-		return type.equals(fAdapterKey);
-	}
-
-	/**
-	 * Subclasses may need to "cleanup" their adapter factory, release
-	 * adapters, resources, etc. Subclasses may extend this method if such
-	 * clean up is required. Note: while current behavior is to do nothing,
-	 * subclasses should not assume this would always be true, so should
-	 * always call super.release at the end of their method.
-	 */
-	public void release() {
-		// default for superclass is to do nothing
-	}
-
-	/**
-	 * Only for special cases there the adapter key can be set in the
-	 * constructor. It can be set here. If it is set more than, and
-	 */
-	final protected void setAdapterKey(Object key) {
-		if (fAdapterKey != null && !(fAdapterKey.equals(key)))
-			throw new IllegalStateException("INodeAdapter Key cannot be changed."); //$NON-NLS-1$
-		fAdapterKey = key;
-	}
-
-	/**
-	 * Can be called by subclasses during 'adapt' process, but must not be
-	 * overridden or reimplemented by subclasses.
-	 * 
-	 * @param target
-	 * @return
-	 */
-	protected final INodeAdapter adaptNew(INodeNotifier target) {
-		INodeAdapter adapter = createAdapter(target);
-		if (adapter != null) {
-			if (fShouldRegisterAdapter) {
-				target.addAdapter(adapter);
-			}
-		}
-		return adapter;
-	}
-
-	/**
-	 * Subclasses must implement this method. It is called by infrastructure
-	 * when an instance is needed. It is provided the node notifier, which may
-	 * or may not be relevent when creating the adapter. Note: the adapter
-	 * does not have to literally be a new intance and is actually recommended
-	 * to typically be a singleton for performance reasons.
-	 * 
-	 * @param target
-	 * @return
-	 */
-	abstract protected INodeAdapter createAdapter(INodeNotifier target);
-
-
-	protected final boolean isShouldRegisterAdapter() {
-		return fShouldRegisterAdapter;
-	}
-
-
-	protected final void setShouldRegisterAdapter(boolean shouldRegisterAdapter) {
-		// ISSUE: technically we probably should not allow this value to
-		// change, after initialization, but is not so easy to do,
-		// and I'm not sure its "worth" the protection.
-		fShouldRegisterAdapter = shouldRegisterAdapter;
-	}
-
-
-	protected final Object getAdapterKey() {
-		return fAdapterKey;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/AbstractNotifier.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/AbstractNotifier.java
deleted file mode 100644
index 6217f99..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/AbstractNotifier.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
-
-
-
-/**
- * AbstractNotifier is similar to (and based on) the EMF NotifierImpl class,
- * but is not related to EMF per se. This class is simpler (that is, not as
- * many functions).
- * 
- * Implementers of this INodeNotifier must subclass this class.
- */
-public abstract class AbstractNotifier implements INodeNotifier {
-	private final static int growthConstant = 3;
-	private int adapterCount = 0;
-
-	private INodeAdapter[] fAdapters;
-
-	/**
-	 * AbstractNotifier constructor comment.
-	 */
-	public AbstractNotifier() {
-		super();
-	}
-
-	/**
-	 * addAdapter method comment.
-	 */
-	public synchronized void addAdapter(INodeAdapter adapter) {
-
-		if (adapter == null)
-			return;
-		ensureCapacity(adapterCount + 1);
-		fAdapters[adapterCount++] = adapter;
-	}
-
-	private void ensureCapacity(int needed) {
-		if (fAdapters == null) {
-			// first time
-			fAdapters = new INodeAdapter[needed + growthConstant];
-			return;
-		}
-		int oldLength = fAdapters.length;
-		if (oldLength < needed) {
-			INodeAdapter[] oldAdapters = fAdapters;
-			INodeAdapter[] newAdapters = new INodeAdapter[needed + growthConstant];
-			System.arraycopy(oldAdapters, 0, newAdapters, 0, adapterCount);
-			fAdapters = newAdapters;
-		}
-	}
-
-	/**
-	 * NOT API: used only for testing.
-	 * 
-	 * @return int
-	 */
-	public int getAdapterCount() {
-		return adapterCount;
-	}
-
-	/**
-	 * Default behavior for getting an adapter.
-	 */
-	public INodeAdapter getAdapterFor(Object type) {
-		// first, we'll see if we already have one
-		INodeAdapter result = getExistingAdapter(type);
-		// if we didn't find one in our list already,
-		// let's create it
-		if (result == null) {
-			FactoryRegistry reg = getFactoryRegistry();
-			if (reg != null) {
-				INodeAdapterFactory factory = reg.getFactoryFor(type);
-				if (factory != null) {
-					result = factory.adapt(this);
-				}
-			}
-			// We won't prevent null from being returned, but it would be
-			// unusual.
-			// It might be because Factory is not working correctly, or
-			// not installed, so we'll allow warning message.
-			if ((result == null) && (org.eclipse.wst.sse.core.internal.util.Debug.displayWarnings)) {
-				System.out.println("Warning: no adapter was found or created for " + type); //$NON-NLS-1$
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a shallow clone of list, since clients should not manipulate
-	 * our list directly. Instead, they should use add/removeAdapter.
-	 */
-	public Collection getAdapters() {
-		if (fAdapters != null) {
-			if (adapterCount == 0) {
-				fAdapters = null;
-				return Collections.EMPTY_LIST;
-			}
-			else {
-				// we need to make a new array, to be sure
-				// it doesn't contain nulls at end, which may be
-				// present there for "growth".
-				INodeAdapter[] tempAdapters = new INodeAdapter[adapterCount];
-				System.arraycopy(fAdapters, 0, tempAdapters, 0, adapterCount);
-				// EMF uses the unmodifiableCollection. Its a bit of a
-				// performance
-				// drain, but may want to leave in since
-				// it would "fail fast" if someone was trying to modify the
-				// list.
-				return Collections.unmodifiableCollection(Arrays.asList(tempAdapters));
-				// return Arrays.asList(newAdapters);
-			}
-		}
-		else
-			return Collections.EMPTY_LIST;
-	}
-
-	private long getAdapterTimeCriteria() {
-		// to "re-get" the property each time is a little awkward, but we
-		// do it that way to avoid adding instance variable just for
-		// debugging.
-		// This method should only be called if debugAdapterNotifcationTime
-		// is true.
-		final String criteriaStr = Platform.getDebugOption("org.eclipse.wst.sse.core/dom/adapter/notification/time/criteria"); //$NON-NLS-1$
-		long criteria = -1;
-		if (criteriaStr != null) {
-			try {
-				criteria = Long.parseLong(criteriaStr);
-			}
-			catch (NumberFormatException e) {
-				// catch to be sure we don't burb in notification loop,
-				// but ignore, since just a debug aid
-			}
-		}
-		return criteria;
-	}
-
-	public INodeAdapter getExistingAdapter(Object type) {
-		INodeAdapter result = null;
-		for (int i = 0; i < adapterCount; i++) {
-			INodeAdapter a = fAdapters[i];
-			if (a != null && a.isAdapterForType(type)) {
-				result = a;
-				break;
-			}
-		}
-		// if we didn't find one in our list,
-		// return the null result
-		return result;
-	}
-
-	abstract public FactoryRegistry getFactoryRegistry();
-
-	public void notify(int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
-
-		if (fAdapters != null) {
-			int localAdapterCount = 0;
-			INodeAdapter[] localAdapters = null;
-
-			// lock object while making local assignments
-			synchronized (this) {
-				localAdapterCount = adapterCount;
-				localAdapters = new INodeAdapter[localAdapterCount];
-				System.arraycopy(fAdapters, 0, localAdapters, 0, localAdapterCount);
-			}
-
-			for (int i = 0; i < localAdapterCount; i++) {
-				INodeAdapter a = localAdapters[i];
-
-				if (Logger.DEBUG_ADAPTERNOTIFICATIONTIME) {
-					long getAdapterTimeCriteria = getAdapterTimeCriteria();
-					long startTime = System.currentTimeMillis();
-					// ** keep this line identical with non-debug version!!
-					a.notifyChanged(this, eventType, changedFeature, oldValue, newValue, pos);
-					long notifyDuration = System.currentTimeMillis() - startTime;
-					if (getAdapterTimeCriteria >= 0 && notifyDuration > getAdapterTimeCriteria) {
-						System.out.println("adapter notifyDuration: " + notifyDuration + "  class: " + a.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				else {
-					try {
-						// ** keep this line identical with debug version!!
-						a.notifyChanged(this, eventType, changedFeature, oldValue, newValue, pos);
-					}
-					catch (Exception e) {
-						// Its important to "keep going", since notifications
-						// occur between an
-						// aboutToChange event and a changed event -- the
-						// changed event typically being require
-						// to restore state, etc. So, we just log message, do
-						// not re-throw it, but
-						// typically the exception does indicate a serious
-						// program error.
-						Logger.logException("A structured model client, " + a + " threw following exception during adapter notification (" + INodeNotifier.EVENT_TYPE_STRINGS[eventType] + " )", e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					}
-				}
-
-			}
-		}
-	}
-
-	public synchronized void removeAdapter(INodeAdapter a) {
-		if (fAdapters == null || a == null)
-			return;
-		int newIndex = 0;
-		INodeAdapter[] newAdapters = new INodeAdapter[fAdapters.length];
-		int oldAdapterCount = adapterCount;
-		boolean found = false;
-		for (int oldIndex = 0; oldIndex < oldAdapterCount; oldIndex++) {
-			INodeAdapter candidate = fAdapters[oldIndex];
-			if (a == candidate) {
-				adapterCount--;
-				found = true;
-			}
-			else
-				newAdapters[newIndex++] = fAdapters[oldIndex];
-		}
-		if (found)
-			fAdapters = newAdapters;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/DocumentChanged.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/DocumentChanged.java
deleted file mode 100644
index 6d7a4ec..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/DocumentChanged.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-public class DocumentChanged extends ModelLifecycleEvent {
-	private IStructuredDocument fNewDocument;
-
-	private IStructuredDocument fOldDocument;
-
-	protected DocumentChanged() {
-
-		super(ModelLifecycleEvent.MODEL_DOCUMENT_CHANGED);
-
-	}
-
-	protected DocumentChanged(int additionalType, IStructuredModel model) {
-
-		super(model, ModelLifecycleEvent.MODEL_DOCUMENT_CHANGED | additionalType);
-
-	}
-
-	public DocumentChanged(int additionalType, IStructuredModel model, IStructuredDocument oldDocument, IStructuredDocument newDocument) {
-
-		this(additionalType, model);
-		fOldDocument = oldDocument;
-		fNewDocument = newDocument;
-	}
-
-	public IStructuredDocument getNewDocument() {
-
-		return fNewDocument;
-	}
-
-	public IStructuredDocument getOldDocument() {
-
-		return fOldDocument;
-	}
-
-	void setNewDocument(IStructuredDocument newDocument) {
-
-		fNewDocument = newDocument;
-	}
-
-	void setOldDocument(IStructuredDocument oldDocument) {
-
-		fOldDocument = oldDocument;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelLifecycleListener.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelLifecycleListener.java
deleted file mode 100644
index 87f8353..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelLifecycleListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
-
-/**
- * This is an early version of a class that may change over the next few
- * milestones.
- */
-
-public interface IModelLifecycleListener {
-
-	void processPostModelEvent(ModelLifecycleEvent event);
-
-	void processPreModelEvent(ModelLifecycleEvent event);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelLoader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelLoader.java
deleted file mode 100644
index 53308f0..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelLoader.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-
-/**
- * Responsible for creating a new Model from a resource, or as a new, empty
- * instance.
- * 
- */
-public interface IModelLoader {
-	/**
-	 * This method should perform all the model initialization required before
-	 * it contains content, namely, it should call newModel, the
-	 * createNewStructuredDocument(), then setAdapterFactories. (this is
-	 * tentative)
-	 */
-	IStructuredModel createModel();
-
-	/**
-	 * Method createModel. Creates a new model based on old one.
-	 * 
-	 * @param oldModel
-	 * @return IStructuredModel
-	 */
-	IStructuredModel createModel(IStructuredModel oldModel);
-
-	/**
-	 * This method must return those factories which must be attached to the
-	 * structuredModel before content is applied.
-	 */
-	List getAdapterFactories();
-
-	void load(IFile file, IStructuredModel model) throws IOException, CoreException;
-
-	void load(InputStream inputStream, IStructuredModel model, EncodingRule encodingRule) throws IOException;
-
-	void load(String filename, InputStream inputStream, IStructuredModel model, String encodingName, String lineDelimiter) throws IOException;
-
-	IModelLoader newInstance();
-
-	/**
-	 * This method should always return an new, empty Structured Model
-	 * appropriate for itself.
-	 */
-	IStructuredModel newModel();
-
-	IStructuredModel reinitialize(IStructuredModel model);
-
-	/**
-	 * This method should get a fresh copy of the data, and repopulate the
-	 * models ... normally by a call to setText on the structuredDocument, for
-	 * StructuredModels. This method is needed in some cases where clients are
-	 * sharing a model and then changes canceled. Say for example, one editor
-	 * and several "displays" are sharing a model, if the editor is closed
-	 * without saving changes, then the displays still need a model, but they
-	 * should revert to the original unsaved version.
-	 */
-	void reload(InputStream inputStream, IStructuredModel model);
-
-	/**
-	 * Create a Structured Model with the given StructuredDocument instance as
-	 * its document (instead of a new document instance as well)
-	 */
-	IStructuredModel createModel(IStructuredDocument document, String baseLocation, IModelHandler handler);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelManager.java
deleted file mode 100644
index d299322..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelManager.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Enumeration;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceAlreadyExists;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-
-
-/**
- * Responsible for providing a set of APIs for creating a new model manager,
- * for managing (add or remove) model loaders and model dumpers, and for
- * managing (get, release, save, and save as) models.
- * 
- * Clients can reference, but should not implement.
- * 
- * @see StructuredModelManger
- */
-public interface IModelManager {
-
-	public final static String DUPLICATED_MODEL = "org.eclipse.wst.sse.core.IModelManager.DUPLICATED_MODEL"; //$NON-NLS-1$
-	public final static String UNMANAGED_MODEL = "org.eclipse.wst.sse.core.IModelManager.UNMANAGED_MODEL"; //$NON-NLS-1$
-
-	/**
-	 * Calculate id provides a common way to determine the id from the input
-	 * ... needed to get and save the model. It is a simple class utility, but
-	 * is an instance method so can be accessed via interface.
-	 */
-	public String calculateId(IFile file);
-
-	IStructuredModel copyModelForEdit(String oldId, String newId) throws ResourceInUse;
-
-	/**
-	 * createNewInstance is similar to clone, except the new instance has no
-	 * content. Note: this produces an unmanaged model, for temporary use. If
-	 * a true shared model is desired, use "copy".
-	 */
-	public IStructuredModel createNewInstance(IStructuredModel model) throws IOException;
-
-	/**
-	 * Factory method, since a proper IStructuredDocument must have a proper
-	 * parser assigned. Note: its assume that IFile does not actually exist as
-	 * a resource yet. If it does, ResourceAlreadyExists exception is thrown.
-	 * If the resource does already exist, then createStructuredDocumentFor is
-	 * the right API to use.
-	 * 
-	 */
-	IStructuredDocument createNewStructuredDocumentFor(IFile iFile) throws ResourceAlreadyExists, IOException, CoreException;
-
-	/**
-	 * Factory method, since a proper IStructuredDocument must have a proper
-	 * parser assigned. Note: clients should verify IFile exists before using
-	 * this method. If this IFile does not exist, then
-	 * createNewStructuredDocument is the correct API to use.
-	 */
-	IStructuredDocument createStructuredDocumentFor(IFile iFile) throws IOException, CoreException;
-
-	/**
-	 * Conveience method, since a proper IStructuredDocument must have a
-	 * proper parser assigned. It should only be used when an empty
-	 * structuredDocument is needed. Otherwise, use IFile form.
-	 */
-	IStructuredDocument createStructuredDocumentFor(String contentTypeId);
-
-	/**
-	 * @deprecated -- I marked as deprecated to discouage use of this method.
-	 *             It does not really work for JSP fragments, since JSP
-	 *             Fragments need an IFile to correctly look up the content
-	 *             settings. Use IFile form instead. Note: some confustion
-	 *             with it and the form for HTPP encoding, so once a null arg
-	 *             is allowed in that API ... we can remove this one. (after
-	 *             verifying again with Tom/Linksbuild)
-	 */
-	IStructuredDocument createStructuredDocumentFor(String filename, InputStream inputStream, URIResolver resolver) throws IOException;
-
-	IStructuredDocument createStructuredDocumentFor(String filename, InputStream inputStream, URIResolver resolver, String ianaEncodingName) throws IOException;
-
-	IStructuredDocument createStructuredDocumentFor(String filename, String content, URIResolver resolver) throws IOException;
-
-	/**
-	 * Conveience method. It depends on the loaders newModel method to return
-	 * an appropriate StrucuturedModel appropriately initialized.
-	 */
-	IStructuredModel createUnManagedStructuredModelFor(IFile iFile) throws IOException, CoreException;
-
-	/**
-	 * Conveience method. It depends on the loaders newModel method to return
-	 * an appropriate StrucuturedModel appropriately initialized.
-	 */
-	IStructuredModel createUnManagedStructuredModelFor(String contentTypeId);
-
-	IStructuredModel createUnManagedStructuredModelFor(String contentTypeId, URIResolver resolver);
-
-	/**
-	 * Note: users of this 'model' must still release it when finished.
-	 * Returns null if there's not a model corresponding to document.
-	 */
-	IStructuredModel getExistingModelForEdit(IDocument document);
-
-	public IStructuredModel getExistingModelForEdit(IFile iFile);
-
-	/**
-	 * This is similar to the getModel method, except this method does not
-	 * create a model. This method does increment the reference count (if it
-	 * exists). If the model does not already exist in the cache of models,
-	 * null is returned.
-	 */
-	public IStructuredModel getExistingModelForEdit(Object id);
-
-	/**
-	 * Note: users of this 'model' must still release it when finished.
-	 * Returns null if there's not a model corresponding to document.
-	 */
-	IStructuredModel getExistingModelForRead(IDocument document);
-
-	public IStructuredModel getExistingModelForRead(IFile iFile);
-
-	/**
-	 * This is similar to the getModel method, except this method does not
-	 * create a model. This method does increment the reference count (if it
-	 * exists). If the model does not already exist in the cache of models,
-	 * null is returned.
-	 */
-	public IStructuredModel getExistingModelForRead(Object id);
-
-	public Enumeration getExistingModelIds();
-
-	public IStructuredModel getModelForEdit(IFile iFile) throws IOException, CoreException;
-
-	/*
-	 * @deprecated - encoding is handled automatically
-	 */
-	public IStructuredModel getModelForEdit(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException;
-
-	public IStructuredModel getModelForEdit(IFile iFile, String encoding, String lineDelimiter) throws UnsupportedEncodingException, IOException, CoreException;
-
-	public IStructuredModel getModelForEdit(IStructuredDocument textFileBufferDocument);
-
-	/*
-	 * @deprecated - a URI resolver should be automatically created when
-	 *             needed
-	 */
-	public IStructuredModel getModelForEdit(String id, InputStream inStream, URIResolver resolver) throws UnsupportedEncodingException, IOException;
-
-	public IStructuredModel getModelForRead(IFile iFile) throws IOException, CoreException;
-
-	/*
-	 * @deprecated - encoding is handled automatically
-	 */
-	public IStructuredModel getModelForRead(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException;
-
-	/*
-	 * @deprecated - encoding and line delimiters are handled automatically
-	 */
-	public IStructuredModel getModelForRead(IFile iFile, String encoding, String lineDelimiter) throws UnsupportedEncodingException, IOException, CoreException;
-
-	public IStructuredModel getModelForRead(IStructuredDocument textFileBufferDocument);
-
-	/*
-	 * @deprecated - a URI resolver should be automatically created when
-	 *             needed
-	 */
-	public IStructuredModel getModelForRead(String filename, InputStream inStream, URIResolver resolver) throws UnsupportedEncodingException, IOException;
-
-	/**
-	 * This method will not create a new model if it already exists ... if
-	 * force is false. The idea is that a client should call this method once
-	 * with force set to false. If the exception is thrown, then prompt client
-	 * if they want to overwrite.
-	 */
-	IStructuredModel getNewModelForEdit(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException;
-
-	/**
-	 * This method will not create a new model if it already exists ... if
-	 * force is false. The idea is that a client should call this method once
-	 * with force set to false. If the exception is thrown, then prompt client
-	 * if they want to overwrite.
-	 */
-	IStructuredModel getNewModelForRead(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException;
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 * @deprecated
-	 */
-	int getReferenceCount(Object id);
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 * @deprecated
-	 */
-	int getReferenceCountForEdit(Object id);
-
-	/**
-	 * This function returns the reference count of underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 * @deprecated
-	 */
-	int getReferenceCountForRead(Object id);
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model
-	 */
-	boolean isShared(Object id);
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model
-	 */
-	boolean isSharedForEdit(Object id);
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model
-	 */
-	boolean isSharedForRead(Object id);
-
-	/**
-	 * This method can be called to determine if the model manager is within a
-	 * "aboutToChange" and "changed" sequence.
-	 */
-	public boolean isStateChanging();
-
-	/**
-	 * This method changes the id of the model. TODO: try to refine the design
-	 * not to use this function
-	 * 
-	 * @deprecated
-	 */
-	void moveModel(Object oldId, Object newId);
-
-	/**
-	 * This method can be called when the content type of a model changes. Its
-	 * assumed the contentType has already been changed, and this method uses
-	 * the text of the old one, to repopulate the text of the new one. In
-	 * theory, the actual instance could change, (e.g. using 'saveAs' to go
-	 * from xml to dtd), but in practice, the intent of this API is to return
-	 * the same instance, just using different handlers, adapter factories,
-	 * etc.
-	 */
-	IStructuredModel reinitialize(IStructuredModel model) throws IOException;
-
-	/**
-	 * This is similar to the getModel method, except this method does not use
-	 * the cached version, but forces the cached version to be replaced with a
-	 * fresh, unchanged version. Note: this method does not change any
-	 * reference counts. Also, if there is not already a cached version of the
-	 * model, then this call is essentially ignored (that is, it does not put
-	 * a model in the cache) and returns null.
-	 * 
-	 * @deprecated
-	 */
-	IStructuredModel reloadModel(Object id, InputStream inStream) throws UnsupportedEncodingException;
-
-	void saveStructuredDocument(IStructuredDocument structuredDocument, IFile iFile) throws UnsupportedEncodingException, IOException, CoreException;
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelStateListener.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelStateListener.java
deleted file mode 100644
index b14e473..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IModelStateListener.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-
-
-/**
- * Interface for those wanting to listen to a model's state changing.
- */
-public interface IModelStateListener {
-
-	/**
-	 * A model is about to be changed. This typically is initiated by one
-	 * client of the model, to signal a large change and/or a change to the
-	 * model's ID or base Location. A typical use might be if a client might
-	 * want to suspend processing until all changes have been made.
-	 */
-	void modelAboutToBeChanged(IStructuredModel model);
-
-	/**
-	 * Signals that the changes foretold by modelAboutToBeChanged have been
-	 * made. A typical use might be to refresh, or to resume processing that
-	 * was suspended as a result of modelAboutToBeChanged.
-	 */
-	void modelChanged(IStructuredModel model);
-
-	/**
-	 * Notifies that a model's dirty state has changed, and passes that state
-	 * in isDirty. A model becomes dirty when any change is made, and becomes
-	 * not-dirty when the model is saved.
-	 */
-	void modelDirtyStateChanged(IStructuredModel model, boolean isDirty);
-
-	/**
-	 * A modelDeleted means the underlying resource has been deleted. The
-	 * model itself is not removed from model management until all have
-	 * released it. Note: baseLocation is not (necessarily) changed in this
-	 * event, but may not be accurate.
-	 */
-	void modelResourceDeleted(IStructuredModel model);
-
-	/**
-	 * A model has been renamed or copied (as in saveAs..). In the renamed
-	 * case, the two paramenters are the same instance, and only contain the
-	 * new info for id and base location.
-	 */
-	void modelResourceMoved(IStructuredModel oldModel, IStructuredModel newModel);
-
-	void modelAboutToBeReinitialized(IStructuredModel structuredModel);
-
-	void modelReinitialized(IStructuredModel structuredModel);
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeAdapter.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeAdapter.java
deleted file mode 100644
index e88a24f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeAdapter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-/**
- * This interface allows nodes to be adapted.
- * 
- * The main difference between this type of adapter (IAdaptable) and base
- * adapter is that these adapters are notified of changes.
- * 
- * @plannedfor 1.0
- */
-
-public interface INodeAdapter {
-
-	/**
-	 * The infrastructure calls this method to determine if the adapter is
-	 * appropriate for 'type'. Typically, adapters return true based on
-	 * identity comparison to 'type', but this is not required, that is, the
-	 * decision can be based on complex logic.
-	 * 
-	 */
-	boolean isAdapterForType(Object type);
-
-	/**
-	 * Sent to adapter when notifier changes. Each notifier is responsible for
-	 * defining specific eventTypes, feature changed, etc.
-	 * 
-	 * ISSUE: may be more evolvable if the argument was one big 'notifier
-	 * event' instance.
-	 */
-	void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeAdapterFactory.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeAdapterFactory.java
deleted file mode 100644
index d6a2506..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeAdapterFactory.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-/**
- * INodeNotifiers can be adapted by INodeAdapters. This factory interface
- * provides a way to provide factories which are invoked by the infrastructure
- * to manage this process, from creating, to adapting, to releasing, if
- * required.
- * 
- * @plannedfor 1.0
- * 
- */
-public interface INodeAdapterFactory {
-
-	/**
-	 * The primary purpose of an adapter factory is to create an adapter and
-	 * associate it with an INodeNotifier. This adapt method Method that
-	 * returns the adapter associated with the given object. The
-	 * implementation of this method should call addAdapter on the adapted
-	 * object with the correct instance of the adapter, if appropriate.
-	 * 
-	 * Note: the instance of the adapter returned may be a singleton or not
-	 * ... depending on the needs of the INodeAdapter ... but in general it is
-	 * recommended for an adapter to be stateless, so the efficiencies of a
-	 * singleton can be gained.
-	 * 
-	 * @param object
-	 *            the node notifier to be adapted
-	 */
-	INodeAdapter adapt(INodeNotifier object);
-
-	/**
-	 * Unlike clone, this method may or may not return the same instance, such
-	 * as in the case where the IAdapterFactory is intended to be a singleton.
-	 * 
-	 * @return an instance of this adapter factory.
-	 */
-	public INodeAdapterFactory copy();
-
-	/**
-	 * isFactoryForType is called by infrastructure to decide if this adapter
-	 * factory is apporiate to use for an adapter request that specifies
-	 * 'type'.
-	 * 
-	 * @param type -
-	 *            same object used to identify/request adapters.
-	 * @return true if factory is appropriate for type, false otherwise.
-	 */
-	boolean isFactoryForType(Object type);
-
-	/**
-	 * release is called by infrastructure when the factory registry is
-	 * released (which is done when a structured model is released). This
-	 * intened for the factory to be allowed to clean up any state information
-	 * it may have.
-	 * 
-	 * Note: while not recommended, due to performance reasons, if individual
-	 * adapters need some cleanup (or need to be released) it is (typically)
-	 * the responsibility of the adapter factory to track them, and initiate
-	 * what ever clean up is needed. In other works, cleanup at the adatper
-	 * level is not provided by infrastructure.
-	 */
-	public void release();
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeNotifier.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeNotifier.java
deleted file mode 100644
index 88d1888..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/INodeNotifier.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-
-
-import java.util.Collection;
-
-/**
- * INodeNotifiers and INodeAdapters form a collaboration that allows clients
- * to use the typical adapter pattern but with notification added, that is,
- * client's adapters will be notified when the nodeNotifier changes.
- * 
- * @plannedfor 1.0
- */
-
-public interface INodeNotifier {
-
-	/**
-	 * The change represents a non-structural change, sent to node notifier's
-	 * parent.
-	 */
-	static final int CHANGE = 1;
-	/**
-	 * The change represents an add event.
-	 */
-	static final int ADD = 2;
-
-	/**
-	 * The change represents a remove event.
-	 */
-	static final int REMOVE = 3;
-
-	/**
-	 * The change represents a structural change, sent to least-common parent
-	 * of node notifiers involved in the structural change
-	 */
-	static final int STRUCTURE_CHANGED = 4;
-
-	/**
-	 * The change represents a notification to parent notifier than its
-	 * contents have changed.
-	 */
-	static final int CONTENT_CHANGED = 5;
-
-
-	/**
-	 * NOT API: these strings are for printing, such as during debuging
-	 */
-	static final String[] EVENT_TYPE_STRINGS = new String[]{"undefined", "CHANGE", "ADD", "REMOVE", "STRUCUTRED_CHANGED", "CONTENT_CHANGED"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-
-
-	/**
-	 * Add an adapter of this notifier.
-	 * 
-	 * @param adapter
-	 *            the adapter to be added
-	 * 
-	 */
-	void addAdapter(INodeAdapter adapter);
-
-	/**
-	 * Return an exisiting adapter of type "type" or if none found create a
-	 * new adapter using a registered adapter factory
-	 */
-	INodeAdapter getAdapterFor(Object type);
-
-	/**
-	 * Return a read-only Collection of the Adapters to this notifier.
-	 * 
-	 * @return collection of adapters.
-	 */
-	Collection getAdapters();
-
-	/**
-	 * Return an exisiting adapter of type "type" or null if none found
-	 */
-	INodeAdapter getExistingAdapter(Object type);
-
-	/**
-	 * sent to adapter when its nodeNotifier changes.
-	 */
-	void notify(int eventType, Object changedFeature, Object oldValue, Object newValue, int pos);
-
-	/**
-	 * Remove an adapter of this notifier. If the adapter does not exist for
-	 * this node notifier, this request is ignored.
-	 * 
-	 * @param adapter
-	 *            the adapter to remove
-	 */
-	void removeAdapter(INodeAdapter adapter);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IStructuredModel.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IStructuredModel.java
deleted file mode 100644
index 7370e92..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IStructuredModel.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;
-import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
-import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceAlreadyExists;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-
-
-/**
- * IStructuredModels are mainly interesting by their extensions and
- * implementers. The main purposed of this abstraction is to provide a common
- * means to manage models that have an associated structured document.
- * 
- * @plannedfor 2.0
- * 
- * <p>
- * ISSUE: this interface needs ton of cleanup!
- * </p>
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- */
-public interface IStructuredModel extends IAdaptable {
-
-
-	/**
-	 * This API allows clients to declare that they are about to make a
-	 * "large" change to the model. This change might be in terms of content
-	 * or it might be in terms of the model id or base location.
-	 * 
-	 * Note that in the case of embedded calls, notification to listeners is
-	 * sent only once.
-	 * 
-	 * Note that the client who is making these changes has the responsibility
-	 * to restore the model's state once finished with the changes. See
-	 * getMemento and restoreState.
-	 * 
-	 * The method isModelStateChanging can be used by a client to determine if
-	 * the model is already in a change sequence.
-	 * 
-	 * This method is a matched pair to changedModel, and must be called
-	 * before changedModel. A client should never call changedModel without
-	 * calling aboutToChangeModel first nor call aboutToChangeModel without
-	 * calling changedModel later from the same Thread.
-	 */
-	void aboutToChangeModel();
-
-	void addModelLifecycleListener(IModelLifecycleListener listener);
-
-	void addModelStateListener(IModelStateListener listener);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, int cursorPosition, int selectionLength);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label, int cursorPosition, int selectionLength);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label, String description);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label, String description, int cursorPosition, int selectionLength);
-
-	/**
-	 * This API allows a client controlled way of notifying all ModelEvent
-	 * listeners that the model has been changed. This method is a matched
-	 * pair to aboutToChangeModel, and must be called after aboutToChangeModel
-	 * ... or some listeners could be left waiting indefinitely for the
-	 * changed event. So, its suggested that changedModel always be in a
-	 * finally clause. Likewise, a client should never call changedModel
-	 * without calling aboutToChangeModel first.
-	 * 
-	 * In the case of embedded calls, the notification is just sent once.
-	 * 
-	 */
-	void changedModel();
-
-	long computeModificationStamp(IResource resource);
-
-	/**
-	 * @deprecated
-	 */
-	IStructuredModel copy(String id) throws ResourceInUse, ResourceAlreadyExists;
-
-	/**
-	 * Disable undo management.
-	 */
-	void disableUndoManagement();
-
-	/**
-	 * Enable undo management.
-	 */
-	void enableUndoManagement();
-
-	/**
-	 * End recording undo transactions.
-	 */
-	void endRecording(Object requester);
-
-	/**
-	 * End recording undo transactions.
-	 */
-	void endRecording(Object requester, int cursorPosition, int selectionLength);
-
-	/**
-	 * This is a client-defined value for what that client (and/or loader)
-	 * considers the "base" of the structured model. Frequently the location
-	 * is either a workspace root-relative path of a workspace resource or an
-	 * absolute path in the local file system.
-	 */
-	String getBaseLocation();
-
-	/**
-	 * @return The associated content type identifier (String) for this model.
-	 */
-	String getContentTypeIdentifier();
-
-	/**
-	 * 
-	 * @return The model's FactoryRegistry. A model is not valid without one.
-	 */
-	FactoryRegistry getFactoryRegistry();
-
-	/**
-	 * The id is the id that the model manager uses to identify this model
-	 */
-	String getId();
-
-	/**
-	 * @param offset
-	 *            a text offset within the structured document
-	 * @return an IndexedRegion containing this offset or null if one could
-	 *         not be found
-	 */
-	IndexedRegion getIndexedRegion(int offset);
-
-	IModelHandler getModelHandler();
-
-	IModelManager getModelManager();
-
-	/**
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 * 
-	 * @return the reference count of underlying model
-	 */
-	int getReferenceCount();
-
-	/**
-	 * This function returns the edit-responsible reference count of
-	 * underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 */
-	int getReferenceCountForEdit();
-
-	/**
-	 * This function returns the reader reference count of underlying model.
-	 * 
-	 * @param id
-	 *            Object The id of the model TODO: try to refine the design
-	 *            not to use this function
-	 */
-	int getReferenceCountForRead();
-
-	Object getReinitializeStateData();
-
-	/**
-	 * Get URI resolution helper
-	 * 
-	 * @deprecated
-	 */
-	URIResolver getResolver();
-
-	IStructuredDocument getStructuredDocument();
-
-	/**
-	 * modification date of underlying resource, when this model was open, or
-	 * last saved. (Note: for this version, the client must manage the
-	 * accuracy of this data)
-	 */
-	long getSynchronizationStamp();
-
-	/**
-	 * Get undo manager.
-	 */
-	IStructuredTextUndoManager getUndoManager();
-
-	/**
-	 * 
-	 */
-	boolean isDirty();
-
-	/**
-	 * This method can be called to determine if the model is within a
-	 * "aboutToChange" and "changed" sequence.
-	 */
-	public boolean isModelStateChanging();
-
-	/**
-	 * 
-	 */
-	boolean isNew();
-
-	boolean isReinitializationNeeded();
-
-	/**
-	 * This is a combination of if the model is dirty and if the model is
-	 * shared for write access. The last writer as the responsibility to be
-	 * sure the user is prompted to save.
-	 */
-	public boolean isSaveNeeded();
-
-	/**
-	 * This function returns true if either isSharedForRead or isSharedForEdit
-	 * is true.
-	 */
-	boolean isShared();
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 */
-	boolean isSharedForEdit();
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 */
-	boolean isSharedForRead();
-
-	/**
-	 * newInstance is similar to clone, except that the newInstance contains
-	 * no content. Its purpose is so clients can get a temporary, unmanaged,
-	 * model of the same "type" as the original. Note: the client may still
-	 * need to do some initialization of the model returned by newInstance,
-	 * depending on desired use. For example, the only factories in the
-	 * newInstance are those that would be normally be created for a model of
-	 * the given contentType. Others are not copied automatically, and if
-	 * desired, should be added by client.
-	 */
-	IStructuredModel newInstance() throws IOException;
-
-	/**
-	 * Performs a reinitialization procedure. For this model. Note for future:
-	 * there may be a day where the model returned from this method is a
-	 * different instance than the instance it was called on. This will occur
-	 * when there is full support for "save as" type functions, where the
-	 * model could theoretically change completely.
-	 */
-	IStructuredModel reinit() throws IOException;
-
-	/**
-	 * This function allows the model to free up any resources it might be
-	 * using. In particular, itself, as stored in the IModelManager.
-	 * 
-	 */
-	void releaseFromEdit();
-
-	/**
-	 * This function allows the model to free up any resources it might be
-	 * using. In particular, itself, as stored in the IModelManager.
-	 * 
-	 */
-	void releaseFromRead();
-
-	/**
-	 * This function replenishes the model with the resource without saving
-	 * any possible changes. It is used when one editor may be closing, and
-	 * specifically says not to save the model, but another "display" of the
-	 * model still needs to hang on to some model, so needs a fresh copy.
-	 * 
-	 * Only valid for use with managed models.
-	 */
-	IStructuredModel reload(InputStream inputStream) throws IOException;
-
-	void removeModelLifecycleListener(IModelLifecycleListener listener);
-
-	void removeModelStateListener(IModelStateListener listener);
-
-	/**
-	 * A method that modifies the model's synchronization stamp to match the
-	 * resource. Turns out there's several ways of doing it, so this ensures a
-	 * common algorithm.
-	 */
-	void resetSynchronizationStamp(IResource resource);
-
-	void resourceDeleted();
-
-	void resourceMoved(IStructuredModel newModel);
-
-	void save() throws UnsupportedEncodingException, IOException, CoreException;
-
-	void save(EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException;
-
-	void save(IFile iFile) throws UnsupportedEncodingException, IOException, CoreException;
-
-	void save(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException;
-
-	void save(OutputStream outputStream) throws UnsupportedEncodingException, IOException, CoreException;
-
-	void setBaseLocation(String newBaseLocation);
-
-	public void setDirtyState(boolean dirtyState);
-
-	void setFactoryRegistry(FactoryRegistry registry);
-
-	/**
-	 * The id is the id that the model manager uses to identify this model
-	 */
-	void setId(String id) throws ResourceInUse;
-
-	void setModelHandler(IModelHandler modelHandler);
-
-	void setModelManager(IModelManager modelManager);
-
-	public void setNewState(boolean newState);
-
-	/**
-	 * Sets a "flag" that reinitialization is needed.
-	 */
-	void setReinitializeNeeded(boolean b);
-
-	/**
-	 * Holds any data that the reinitialization procedure might find useful in
-	 * reinitializing the model. This is handy, since the reinitialization may
-	 * not take place at once, and some "old" data may be needed to properly
-	 * undo previous settings. Note: the parameter was intentionally made to
-	 * be of type 'Object' so different models can use in different ways.
-	 */
-	void setReinitializeStateData(Object object);
-
-	/**
-	 * Set the URI resolution helper
-	 */
-	void setResolver(URIResolver uriResolver);
-
-	void setStructuredDocument(IStructuredDocument structuredDocument);
-
-	/**
-	 * Set undo manager.
-	 */
-	void setUndoManager(IStructuredTextUndoManager undoManager);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IndexedRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IndexedRegion.java
deleted file mode 100644
index bf9b7bc..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/IndexedRegion.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-
-
-/**
- * This type is used to indicate positions and lengths in source. Notice that
- * while getEndOffset and getLength are redundant, given that
- * 
- * <pre>
- * <code>
- *          getEndOffset() == getStartOffset() + getLength(); 
- * </code>
- * </pre>
- * 
- * we provide (require) both since in some cases implementors may be able to
- * provide one or the other more efficiently.
- * 
- * Note: it is not part of the API contract that implementors of IndexedRegion --
- * as a whole collection for a particular source -- must completely cover the
- * original source. They currently often do, so thought I'd mention explicitly
- * this may not always be true.
- * 
- * @plannedfor 1.0
- */
-public interface IndexedRegion {
-
-	/**
-	 * Can be used to test if the indexed regions contains the test position.
-	 * 
-	 * @param testPosition
-	 * @return true if test position is greater than or equal to start offset
-	 *         and less than start offset plus length.
-	 */
-	boolean contains(int testPosition);
-
-	/**
-	 * Can be used to get end offset of source text, relative to beginning of
-	 * documnt. Implementers should return -1 if, or some reason, the region
-	 * is not valid.
-	 * 
-	 * @return endoffset
-	 */
-	int getEndOffset();
-
-	/**
-	 * Can be used to get source postion of beginning of indexed region.
-	 * Implementers should return -1 if, or some reason, the region is not
-	 * valid.
-	 * 
-	 * @return int position of start of index region.
-	 */
-	int getStartOffset();
-
-	/**
-	 * Can be used to get the length of the source text. Implementers should
-	 * return -1 if, or some reason, the region is not valid.
-	 * 
-	 * @return int position of length of index region.
-	 */
-	int getLength();
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/StructuredModelManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/StructuredModelManager.java
deleted file mode 100644
index a136922..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/StructuredModelManager.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.sse.core.internal.SSECorePlugin;
-import org.eclipse.wst.sse.core.internal.model.ModelManagerImpl;
-import org.osgi.framework.Bundle;
-
-/**
- * Class to allow access to ModelManager. Not intended to be subclassed.
- * 
- * @plannedfor 1.0
- * @deprecated - use the one that is in
- *             org.eclipse.wst.sse.core.SttructuredModelManager
- */
-final public class StructuredModelManager {
-	/**
-	 * Do not allow instances to be created.
-	 */
-	private StructuredModelManager() {
-		super();
-	}
-
-	/**
-	 * Provides access to the instance of IModelManager. Returns null if model
-	 * manager can not be created or is not valid (such as, when workbench is
-	 * shutting down).
-	 * 
-	 * @return IModelManager - returns the one model manager for structured
-	 *         model
-	 * @deprecated - use the one that is in
-	 *             org.eclipse.wst.sse.core.SttructuredModelManager
-	 */
-	public static IModelManager getModelManager() {
-		boolean isReady = false;
-		IModelManager modelManager = null;
-		while (!isReady) {
-			Bundle localBundle = Platform.getBundle(SSECorePlugin.ID);
-			int state = localBundle.getState();
-			if (state == Bundle.ACTIVE) {
-				isReady = true;
-				// getInstance is a synchronized static method.
-				modelManager = ModelManagerImpl.getInstance();
-			}
-			else if (state == Bundle.STARTING) {
-				try {
-					Thread.sleep(100);
-				}
-				catch (InterruptedException e) {
-					// ignore, just loop again
-				}
-			}
-			else if (state == Bundle.STOPPING || state == Bundle.UNINSTALLED) {
-				isReady = true;
-				modelManager = null;
-			}
-			else {
-				// not sure about other states, 'resolved', 'installed'
-				isReady = true;
-				modelManager = null;
-			}
-		}
-		return modelManager;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/document/IEncodedDocument.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/document/IEncodedDocument.java
deleted file mode 100644
index 2d64715..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/document/IEncodedDocument.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.document;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-
-/**
- * This interface is strictly to define important "document properties" not
- * found in IDocument, but not central to "StructuredDocument".
- * 
- * Its not to be be implmented by clients.
- * 
- * @plannedfor 1.0
- */
-
-public interface IEncodedDocument extends IDocument {
-
-	/**
-	 * Returns the encoding memento for this document.
-	 * 
-	 * @return the encoding memento for this document.
-	 */
-	EncodingMemento getEncodingMemento();
-
-	/**
-	 * Returns the preferred line delimiter for this document.
-	 */
-	String getPreferredLineDelimiter();
-
-	/**
-	 * Sets the encoding memento for this document.
-	 * 
-	 * Is not to be called by clients, only document creation classes.
-	 * 
-	 * @param localEncodingMemento
-	 */
-	void setEncodingMemento(EncodingMemento localEncodingMemento);
-
-	/**
-	 * Sets the preferredLineDelimiter. Is not to be called by clients, only
-	 * document creation classes.
-	 * 
-	 * @param probableLineDelimiter
-	 */
-	void setPreferredLineDelimiter(String probableLineDelimiter);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/document/IStructuredDocumentProposed.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/document/IStructuredDocumentProposed.java
deleted file mode 100644
index 39832af..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/document/IStructuredDocumentProposed.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.document;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.Position;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.provisional.events.NewDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
-
-
-/**
- * A IStructuredDocument is a collection of StructuredDocumentRegions. It's
- * often called a "flat model" because its does contain some structural
- * information, but not very much, usually, at most, a few levels of
- * containment.
- * 
- * Clients should not implement.
- * 
- * @plannedfor 1.0
- */
-public interface IStructuredDocumentProposed extends IDocument, IDocumentExtension, IAdaptable {
-
-	/**
-	 * The document changing listeners receives the same events as the
-	 * document listeners, but the difference is the timing and
-	 * synchronization of data changes and notifications.
-	 */
-	void addDocumentChangingListener(IDocumentListener listener);
-
-	/**
-	 * this API ensures that any portion of the document within startOff to
-	 * length is not readonly (that is, that its editable). Note that if the
-	 * range overlaps with other readonly regions, those other readonly
-	 * regions will be adjusted.
-	 * 
-	 * @param startOffset
-	 * @param length
-	 */
-	void clearReadOnly(int startOffset, int length);
-
-	/**
-	 * returns true if any portion of startOffset to length is readonly
-	 * 
-	 * @param startOffset
-	 * @param length
-	 * @return
-	 */
-	boolean containsReadOnly(int startOffset, int length);
-
-	/**
-	 * Returns the region contained by offset.
-	 * 
-	 * @param offset
-	 * @return
-	 */
-	IStructuredDocumentRegion getRegionAtCharacterOffset(int offset);
-
-	/**
-	 * Resturns a list of the structured document regions.
-	 * 
-	 * Note: possibly expensive call, not to be used casually.
-	 * 
-	 * @return a list of the structured document regions.
-	 */
-	IStructuredDocumentRegionList getRegionList();
-
-
-	/**
-	 * Returns the text of this document.
-	 * 
-	 * Same as 'get' in super class, added for descriptiveness.
-	 * 
-	 * @return the text of this document.
-	 */
-	String getText();
-
-	/**
-	 * causes that portion of the document from startOffset to length to be
-	 * marked as readonly. Note that if this range overlaps with some other
-	 * region with is readonly, the regions are effectivly combined.
-	 * 
-	 * @param startOffset
-	 * @param length
-	 */
-	void makeReadOnly(int startOffset, int length);
-
-	/**
-	 * newInstance is similar to clone, except it contains no data. One
-	 * important thing to duplicate is the parser, with the parser correctly
-	 * "cloned", including its tokeninzer, block tags, etc.
-	 * 
-	 * NOTE: even after obtaining a 'newInstance' the client may have to do
-	 * some initialization, for example, it may need to add its own model
-	 * listeners. Or, as another example, if the IStructuredDocument has a
-	 * parser of type StructuredDocumentRegionParser, then the client may need
-	 * to add its own StructuredDocumentRegionHandler to that parser, if it is
-	 * in fact needed.
-	 */
-	IStructuredDocumentProposed newInstance();
-
-	/**
-	 * The document changing listeners receives the same events as the
-	 * document listeners, but the difference is the timing and
-	 * synchronization of data changes and notifications.
-	 */
-	void removeDocumentChangingListener(IDocumentListener listener);
-
-	/**
-	 * One of the APIs to manipulate the IStructuredDocument.
-	 * 
-	 * replaceText replaces the text from oldStart to oldEnd with the new text
-	 * found in the requestedChange string. If oldStart and oldEnd are equal,
-	 * it is an insertion request. If requestedChange is null (or empty) it is
-	 * a delete request. Otherwise it is a replace request.
-	 * 
-	 * Similar to 'replace' in super class.
-	 */
-	StructuredDocumentEvent replaceText(Object requester, int oldStart, int replacementLength, String requestedChange);
-
-	/**
-	 * Note, same as replaceText API, but will allow readonly areas to be
-	 * replaced. This method is not to be called by clients, only
-	 * infrastructure. For example, one case where its ok is with undo
-	 * operations (since, presumably, if user just did something that
-	 * happended to involve some inserting readonly text, they should normally
-	 * be allowed to still undo that operation. There might be other cases
-	 * where its used to give the user a choice, e.g. "you are about to
-	 * overwrite read only portions, do you want to continue".
-	 */
-	StructuredDocumentEvent overrideReadOnlyreplaceText(Object requester, int oldStart, int replacementLength, String requestedChange);
-
-	/**
-	 * One of the APIs to manipulate the IStructuredDocument in terms of Text.
-	 * 
-	 * The setText method replaces all text in the model.
-	 * 
-	 * @param requester -
-	 *            the object requesting the document be created.
-	 * @param allText -
-	 *            all the text of the document.
-	 * @return NewDocumentEvent - besides causing this event to be sent to
-	 *         document listeners, the event is returned.
-	 */
-	NewDocumentEvent setText(Object requester, String allText);
-
-	/**
-	 * Returns the encoding memento for this document.
-	 * 
-	 * @return the encoding memento for this document.
-	 */
-	EncodingMemento getEncodingMemento();
-
-	/**
-	 * Returns the line delimiter detected when this document was read from
-	 * storage.
-	 * 
-	 * @return line delimiter detected when this document was read from
-	 *         storage.
-	 */
-	String getDetectedLineDelimiter();
-
-	/**
-	 * Sets the encoding memento for this document.
-	 * 
-	 * Is not to be called by clients, only document creation classes.
-	 * 
-	 * @param localEncodingMemento
-	 */
-	void setEncodingMemento(EncodingMemento localEncodingMemento);
-
-	/**
-	 * Sets the detected line delimiter when the document was read. Is not to
-	 * be called by clients, only document creation classes.
-	 * 
-	 * @param probableLineDelimiter
-	 */
-	void setDetectedLineDelimiter(String probableLineDelimiter);
-
-	/**
-	 * This function provides a way for clients to compare a string with a
-	 * region of the documnet, without having to retrieve (create) a string
-	 * from the document, thus more efficient of lots of comparisons being
-	 * done.
-	 * 
-	 * @param ignoreCase -
-	 *            if true the characters are compared based on identity. If
-	 *            false, the string are compared with case accounted for.
-	 * @param testString -
-	 *            the string to compare.
-	 * @param documentOffset -
-	 *            the document in the offset to start the comparison.
-	 * @param length -
-	 *            the length in the document to compare (Note: technically,
-	 *            clients could just provide the string, and we could infer
-	 *            the length from the string supplied, but this leaves every
-	 *            client to correctly not even ask us if the the string length
-	 *            doesn't match the expected length, so this is an effort to
-	 *            maximize performance with correct code.
-	 * @return true if matches, false otherwise.
-	 */
-	boolean stringMatches(boolean ignoreCase, String testString, int documentOffset, int length);
-	
-	Position createPosition(int offset, String category, String type);
-	
-	Position createPosition(int offset, int length, String category, String type);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/AboutToBeChangedEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/AboutToBeChangedEvent.java
deleted file mode 100644
index e549692..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/AboutToBeChangedEvent.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * This event is send to structured document listeners. It is perfectly
- * analagous to its corresponding jface DocumentEvent and is provided simply
- * to allow clients to distinguish the source of the event.
- * 
- * @plannedfor 1.0
- */
-public class AboutToBeChangedEvent extends StructuredDocumentEvent {
-
-
-	/**
-	 * Creates an instance of this event.
-	 * 
-	 * @param document
-	 *            document involved in the change
-	 * @param originalRequester
-	 *            source of original request
-	 * @param changes
-	 *            the text changes
-	 * @param offset
-	 *            offset of request
-	 * @param lengthToReplace
-	 *            amount, if any, of replaced text
-	 */
-	public AboutToBeChangedEvent(IStructuredDocument document, Object originalRequester, String changes, int offset, int lengthToReplace) {
-		super(document, originalRequester, changes, offset, lengthToReplace);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/IModelAboutToBeChangedListener.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/IModelAboutToBeChangedListener.java
deleted file mode 100644
index df44547..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/IModelAboutToBeChangedListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-
-
-/**
- * Clients can implement this interface, and register with the
- * structuredDocument using addAboutToBeChangedListner to be notified that the
- * structuredDocument is about to be changed, but hasn't been changed at the
- * time this event is fired.
- */
-public interface IModelAboutToBeChangedListener {
-
-	void modelAboutToBeChanged(AboutToBeChangedEvent structuredDocumentEvent);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/IStructuredDocumentListener.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/IStructuredDocumentListener.java
deleted file mode 100644
index 26535af..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/IStructuredDocumentListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-/**
- * @deprecated will be removed since we now subclass DocumentEvent.
- */
-
-public interface IStructuredDocumentListener {
-
-	public void newModel(NewDocumentEvent structuredDocumentEvent);
-
-	public void noChange(NoChangeEvent structuredDocumentEvent);
-
-	public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent);
-
-	public void regionChanged(RegionChangedEvent structuredDocumentEvent);
-
-	public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NewDocumentContentEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NewDocumentContentEvent.java
deleted file mode 100644
index 038db77..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NewDocumentContentEvent.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * The NewDocumentContentEvent is fired when an instance of a
- * IStructuredDocument replaces all of its text.
- * 
- * ISSUE: not currently used, but there's still some efficiencies to be had so
- * plan to implement.
- * 
- * @plannedfor 1.0
- */
-public class NewDocumentContentEvent extends NewDocumentEvent {
-	/**
-	 * Creates an instance of this event.
-	 * 
-	 * @param document
-	 *            the document being changed
-	 * @param originalRequester
-	 *            the original requester of the change
-	 */
-	public NewDocumentContentEvent(IStructuredDocument document, Object originalRequester) {
-		super(document, originalRequester);
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NewDocumentEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NewDocumentEvent.java
deleted file mode 100644
index fe9a73a..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NewDocumentEvent.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * The NewDocumentEvent is fired when an instance of a IStructuredDocument
- * sets or replaces all of its text.
- * 
- * ISSUE: need to change so this is used for 'set' only.
- * 
- * @plannedfor 1.0
- */
-public class NewDocumentEvent extends StructuredDocumentEvent {
-
-
-	/**
-	 * Creates a new instance of the NewDocumentEvent.
-	 * 
-	 * @param document
-	 *            being changed
-	 * @param originalRequester
-	 *            source of request
-	 */
-	public NewDocumentEvent(IStructuredDocument document, Object originalRequester) {
-		super(document, originalRequester);
-	}
-
-	/**
-	 * This returns the length of the new document.
-	 * 
-	 * @return int returns the length of the new document.
-	 */
-	public int getLength() {
-		return getStructuredDocument().getLength();
-	}
-
-	/**
-	 * This doesn't mean quite the same thing as the IStructuredDocument
-	 * Events in the super class. It always will return zero.
-	 * 
-	 * @return int for a newDocument, the offset of is always 0
-	 */
-	public int getOffset() {
-		return 0;
-	}
-
-	/**
-	 * For a new document, the text involved is the complete text.
-	 * 
-	 * @return String the text that is the complete text of the documnet.
-	 */
-	public String getText() {
-		String results = getStructuredDocument().getText();
-		return results;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NoChangeEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NoChangeEvent.java
deleted file mode 100644
index d5004bc..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/NoChangeEvent.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * This event is sent if, after analysis, it is found there is no reason to
- * change the structuredDocument. This might occur, for example, if someone
- * pastes in the exact same text that they are replacing, or if someone tries
- * to change a read-only region.
- * 
- * This might be important, for example, if some state variables are set on an
- * "about the change" event. then if there is no change (i.e.no other event is
- * fired), those state variables could reset, or whatever, upon receiving this
- * event.
- * 
- * @plannedfor 1.0
- */
-public class NoChangeEvent extends StructuredDocumentEvent {
-	/**
-	 * NO_CONTENT_CHANGE means that a some text was requested to be replaced
-	 * with identical text, so no change is actually done.
-	 */
-	public final static int NO_CONTENT_CHANGE = 2;
-	/**
-	 * NO_EVENT is used in rare error conditions, when, basically, a request
-	 * to change the document is made before the previous request has
-	 * completed. This event to used so aboutToChange/Changed cycles can
-	 * complete as required, but the document is most likely not modified as
-	 * expected.
-	 */
-	public final static int NO_EVENT = 8;
-	/**
-	 * READ_ONLY_STATE_CHANGE means that the "read only" state of the text was
-	 * changed, not the content itself.
-	 */
-	public final static int READ_ONLY_STATE_CHANGE = 4;
-
-	/**
-	 * set to one of the above detailed reasons for why no change was done.
-	 */
-	public int reason = 0;
-
-	/**
-	 * NoChangeEvent constructor. This event can occur if there was a request
-	 * to modify a document or its properties, but there as not really is no
-	 * change to a document's content.
-	 * 
-	 * @param source
-	 * @param originalSource
-	 *            java.lang.Object
-	 * @param changes
-	 *            java.lang.String
-	 * @param offset
-	 *            int
-	 * @param lengthToReplace
-	 *            int
-	 */
-	public NoChangeEvent(IStructuredDocument source, Object originalSource, String changes, int offset, int lengthToReplace) {
-		super(source, originalSource, changes, offset, lengthToReplace);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/RegionChangedEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/RegionChangedEvent.java
deleted file mode 100644
index 29d4381..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/RegionChangedEvent.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-
-/**
- * This event is used when a document region changes in a non-structural way.
- * Non-structural, that is, as far as the IStructuredDocument is concerned.
- * The whole region, along with the new text is sent, just in case a listener
- * (e.g. a tree model) might make its own determination of what to do, and
- * needs the whole region to act appropriately.
- * 
- * Note: users should not make assumptions about whether the region is
- * literally the same instance or not -- it is currently a different instance
- * that is identical to the old except for the changed region, but this
- * implementation may change.
- * 
- * @plannedfor 1.0
- */
-public class RegionChangedEvent extends StructuredDocumentEvent {
-	private ITextRegion fChangedRegion;
-	private IStructuredDocumentRegion fStructuredDocumentRegion;
-
-	/**
-	 * Creates instance of a RegionChangedEvent.
-	 * 
-	 * @param document
-	 *            the document being changed.
-	 * @param originalRequester
-	 *            the object making the request for the change.
-	 * @param structuredDocumentRegion
-	 *            the containing region
-	 * @param changedRegion
-	 *            the region that has changed.
-	 * @param changes
-	 *            the string representing the change.
-	 * @param offset
-	 *            the offset of the change.
-	 * @param lengthToReplace
-	 *            the length specified to be replaced.
-	 */
-	public RegionChangedEvent(IStructuredDocument document, Object originalRequester, IStructuredDocumentRegion structuredDocumentRegion, ITextRegion changedRegion, String changes, int offset, int lengthToReplace) {
-		super(document, originalRequester, changes, offset, lengthToReplace);
-		fStructuredDocumentRegion = structuredDocumentRegion;
-		fChangedRegion = changedRegion;
-	}
-
-
-	/**
-	 * Returns the text region changed.
-	 * 
-	 * @return the text region changed
-	 */
-	public ITextRegion getRegion() {
-		return fChangedRegion;
-	}
-
-
-	/**
-	 * Returns the document region changed.
-	 * 
-	 * @return the document region changed
-	 */
-	public IStructuredDocumentRegion getStructuredDocumentRegion() {
-		return fStructuredDocumentRegion;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/RegionsReplacedEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/RegionsReplacedEvent.java
deleted file mode 100644
index 21a2e4f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/RegionsReplacedEvent.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-
-/**
- * This event is used when a node's regions change, but the document region
- * itself doesn't. This says nothing about the semantics of the document
- * region, that may still have changed. Also, its assumed/required that all
- * the regions are replaced (even those that may not have changed).
- * 
- * @plannedfor 1.0
- */
-public class RegionsReplacedEvent extends StructuredDocumentEvent {
-	private ITextRegionList fNewRegions;
-	private ITextRegionList fOldRegions;
-	private IStructuredDocumentRegion fStructuredDocumentRegion;
-
-	/**
-	 * Creates an instance of the RegionsReplacedEvent.
-	 * 
-	 * @param document -
-	 *            document being changed.
-	 * @param originalRequester -
-	 *            requester of the change.
-	 * @param structuredDocumentRegion -
-	 *            the region containing the change.
-	 * @param oldRegions -
-	 *            the old Regions being replaced.
-	 * @param newRegions -
-	 *            the new regions being added.
-	 * @param changes -
-	 *            the String representing the change.
-	 * @param offset -
-	 *            the offset of the change.
-	 * @param lengthToReplace -
-	 *            the length of text to replace.
-	 */
-	public RegionsReplacedEvent(IStructuredDocument document, Object originalRequester, IStructuredDocumentRegion structuredDocumentRegion, ITextRegionList oldRegions, ITextRegionList newRegions, String changes, int offset, int lengthToReplace) {
-		super(document, originalRequester, changes, offset, lengthToReplace);
-		fStructuredDocumentRegion = structuredDocumentRegion;
-		fOldRegions = oldRegions;
-		fNewRegions = newRegions;
-	}
-
-	/**
-	 * Returns the new text regions.
-	 * 
-	 * @return the new text regions.
-	 */
-	public ITextRegionList getNewRegions() {
-		return fNewRegions;
-	}
-
-	/**
-	 * Returns the old text regions.
-	 * 
-	 * @return the old text regions.
-	 */
-	public ITextRegionList getOldRegions() {
-		return fOldRegions;
-	}
-
-	/**
-	 * Returns the structured document region.
-	 * 
-	 * @return the structured document region.
-	 */
-	public IStructuredDocumentRegion getStructuredDocumentRegion() {
-		return fStructuredDocumentRegion;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/StructuredDocumentEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/StructuredDocumentEvent.java
deleted file mode 100644
index e3930ff..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/StructuredDocumentEvent.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-
-/**
- * IStructuredDocument events are generated by the IStructuredDocument, after
- * the IStructuredDocument acts on a request. Not intended to be instantiated,
- * except by subclasses in infrastructure. Not intended to be subclassed by
- * clients.
- * 
- * @plannedfor 1.0
- */
-public abstract class StructuredDocumentEvent extends DocumentEvent {
-	private String fDeletedText;
-	private Object fOriginalRequester;
-
-	/**
-	 * There is no public null-arg version of this constructor.
-	 */
-	private StructuredDocumentEvent() {
-		super();
-	}
-
-	/**
-	 * We assume (and require) that an IStructuredDocument's are always the
-	 * source of StructuredDocument events.
-	 * 
-	 * @param document -
-	 *            the document being changed
-	 */
-	private StructuredDocumentEvent(IStructuredDocument document) {
-		this();
-		if (document == null)
-			throw new IllegalArgumentException("null source"); //$NON-NLS-1$
-		fDocument = document;
-		fOriginalRequester = document;
-	}
-
-	/**
-	 * We assume (and require) that an IStructuredDocument's are always the
-	 * source of StructuredDocument events.
-	 * 
-	 * @param document -
-	 *            the document being changed.
-	 * @param originalRequester -
-	 *            the original requester of the change.
-	 */
-	StructuredDocumentEvent(IStructuredDocument document, Object originalRequester) {
-		this(document);
-		fOriginalRequester = originalRequester;
-	}
-
-	/**
-	 * We assume (and require) that an IStructuredDocument's are always the
-	 * source of StructuredDocument events.
-	 * 
-	 * @param document -
-	 *            the document being changed.
-	 * @param originalRequester -
-	 *            the requester of the change.
-	 * @param changes -
-	 *            the String representing the new text
-	 * @param offset -
-	 *            the offset of the change.
-	 * @param lengthToReplace -
-	 *            the length of text to replace.
-	 */
-	StructuredDocumentEvent(IStructuredDocument document, Object originalRequester, String changes, int offset, int lengthToReplace) {
-		this(document);
-		fOriginalRequester = originalRequester;
-		fText = changes;
-		fOffset = offset;
-		fLength = lengthToReplace;
-	}
-
-	/**
-	 * Provides the text that is being deleted.
-	 * 
-	 * @return the text that is being deleted, or null if none is being
-	 *         deleted.
-	 */
-	public String getDeletedText() {
-		return fDeletedText;
-	}
-
-	/**
-	 * This method returns the object that originally caused the event to
-	 * fire. This is typically not the object that created the event (the
-	 * IStructuredDocument) but instead the object that made a request to the
-	 * IStructuredDocument.
-	 * 
-	 * @return the object that made the request to the document
-	 */
-	public Object getOriginalRequester() {
-		return fOriginalRequester;
-	}
-
-	/**
-	 * This method is equivalent to 'getDocument' except it returns an object
-	 * of the appropriate type (namely, a IStructuredDocument, instead of
-	 * IDocument).
-	 * 
-	 * @return IStructuredDocumnt - the document being changed
-	 */
-	public IStructuredDocument getStructuredDocument() {
-		// a safe case, since constructor can only be called with a
-		// IStructuredDocument
-		return (IStructuredDocument) fDocument;
-	}
-
-	/**
-	 * Not to be called by clients, only parsers and reparsers. (will
-	 * eventually be moved to an SPI package).
-	 * 
-	 * @param newDeletedText -
-	 *            the text that has been deleted.
-	 */
-	public void setDeletedText(String newDeletedText) {
-		fDeletedText = newDeletedText;
-	}
-
-	/**
-	 * for debugging only
-	 * 
-	 * @deprecated - need to fix unit tests which depend on this exact format,
-	 *             then delete this
-	 */
-	public String toString() {
-		// return getClass().getName() + "[source=" + source + "]";
-		return getClass().getName();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/StructuredDocumentRegionsReplacedEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/StructuredDocumentRegionsReplacedEvent.java
deleted file mode 100644
index 6942bf7..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/events/StructuredDocumentRegionsReplacedEvent.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.events;
-
-
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
-
-/**
- * This event is used when a IStructuredDocumentRegion is deleted, or replaced
- * with more than one IStructuredDocumentRegion, or when simply more than one
- * IStructuredDocumentRegion changes.
- * 
- * @plannedfor 1.0
- */
-public class StructuredDocumentRegionsReplacedEvent extends StructuredDocumentEvent {
-
-	private IStructuredDocumentRegionList fNewStructuredDocumentRegions;
-	private IStructuredDocumentRegionList fOldStructuredDocumentRegions;
-
-	/**
-	 * Creates an instance of StructuredDocumentRegionsReplacedEvent
-	 * 
-	 * @param document -
-	 *            the document being changed.
-	 * @param originalRequester -
-	 *            the requester of the change.
-	 * @param oldStructuredDocumentRegions -
-	 *            the old document regions removed.
-	 * @param newStructuredDocumentRegions -
-	 *            the new document regions added.
-	 * @param changes -
-	 *            a string representing the text change.
-	 * @param offset -
-	 *            the offset of the change.
-	 * @param lengthToReplace -
-	 *            the length of text requested to be replaced.
-	 */
-	public StructuredDocumentRegionsReplacedEvent(IStructuredDocument document, Object originalRequester, IStructuredDocumentRegionList oldStructuredDocumentRegions, IStructuredDocumentRegionList newStructuredDocumentRegions, String changes, int offset, int lengthToReplace) {
-		super(document, originalRequester, changes, offset, lengthToReplace);
-		fOldStructuredDocumentRegions = oldStructuredDocumentRegions;
-		fNewStructuredDocumentRegions = newStructuredDocumentRegions;
-	}
-
-	/**
-	 * Returns the new structured document regions.
-	 * 
-	 * @return the new structured document regions.
-	 */
-	public IStructuredDocumentRegionList getNewStructuredDocumentRegions() {
-		return fNewStructuredDocumentRegions;
-	}
-
-	/**
-	 * Returns the old structured document regions.
-	 * 
-	 * @return the old structured document regions.
-	 */
-	public IStructuredDocumentRegionList getOldStructuredDocumentRegions() {
-		return fOldStructuredDocumentRegions;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/exceptions/ResourceAlreadyExists.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/exceptions/ResourceAlreadyExists.java
deleted file mode 100644
index a796e90..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/exceptions/ResourceAlreadyExists.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.exceptions;
-
-
-
-public class ResourceAlreadyExists extends Exception {
-
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * ResourceAlreadyExists constructor comment.
-	 */
-	public ResourceAlreadyExists() {
-		super();
-	}
-
-	/**
-	 * ResourceAlreadyExists constructor comment.
-	 * 
-	 * @param s
-	 *            java.lang.String
-	 */
-	public ResourceAlreadyExists(String s) {
-		super(s);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/exceptions/ResourceInUse.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/exceptions/ResourceInUse.java
deleted file mode 100644
index e4f1ac1..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/exceptions/ResourceInUse.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.exceptions;
-
-
-
-public class ResourceInUse extends Exception {
-
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * ResourceAlreadyExists constructor comment.
-	 */
-	public ResourceInUse() {
-		super();
-	}
-
-	/**
-	 * ResourceAlreadyExists constructor comment.
-	 * 
-	 * @param s
-	 *            java.lang.String
-	 */
-	public ResourceInUse(String s) {
-		super(s);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IModelManagerProposed.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IModelManagerProposed.java
deleted file mode 100644
index ace9420..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IModelManagerProposed.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.model;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceAlreadyExists;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * Responsible for managing IStructuredModels.
- * 
- * This allows clients to share models, so they do not have to be re-created
- * or passed around from one client to another. Clients should internally
- * enforce that models are gotten and released from locations close to each
- * other to prevent model leaks.
- * 
- * There are three ways to get a model based on usage and responsibility: for
- * 'MODIFY', just for 'SHARED', and 'UNSHARED'. Contrary to their names, a
- * model can technically be modified, and all modifications directly affect
- * the commonly shared version of the model. It is part of the API contract,
- * however, that clients who get a model for SHARED do not modify it. The
- * significance of the 'MODIFY' model is that the client is registering their
- * interest in saving changes to the model.
- * 
- * Clients can reference this interface, but should not implement.
- * 
- * @see org.eclipse.wst.sse.core.StructuredModelManager
- * @plannedfor 1.0
- */
-public interface IModelManagerProposed {
-
-	/**
-	 * AccessType is used internally as a JRE 1.4 compatible enumerated type.
-	 * Not intended to be referenced by clients.
-	 */
-	static class AccessType {
-		private String fType;
-
-		/**
-		 * default access contructor we use to create our specific constants.
-		 * 
-		 * @param type
-		 */
-		AccessType(String type) {
-			super();
-			fType = type;
-		}
-
-		/**
-		 * For debug purposes only.
-		 */
-		public String toString() {
-			return "Model Access Type: " + fType; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Constant to provide compile time safe parameter. <code>NOTSHARED</code>signifies
-	 * the client intentially wants a model that is not shared with other
-	 * clients. NOTSHARED models can not be saved.
-	 */
-	final AccessType NOTSHARED = new AccessType("NOTSHARED"); //$NON-NLS-1$
-
-	/**
-	 * Constant to provide compile-time safe parameter. <code>SHARED</code>signifies
-	 * the client is not intending to make changes and does not care whether
-	 * the model accessed is saved.
-	 */
-	final AccessType SHARED = new AccessType("SHARED"); //$NON-NLS-1$
-
-	/**
-	 * Constant to provide compile-time safe parameter. <code>MODIFY</code>signifies
-	 * the client is intending to make changes and is responsible for saving
-	 * changes (or not) if they are the last one holding MODIFY access to the
-	 * model before it's released.
-	 */
-	final AccessType MODIFY = new AccessType("MODIFY"); //$NON-NLS-1$
-
-	/**
-	 * copyModel is similar to a deep clone. The resulting model is shared,
-	 * according to the value of ReadEditType. If a model already is being
-	 * managed for 'newLocation' then a ResourceInUse exception is thrown,
-	 * unless the ReadEditType is NOTSHARED, in which case the resulting model
-	 * can not be saved.
-	 * 
-	 * @param oldLocation
-	 * @param newLocation
-	 * @param type
-	 * @return
-	 * @throws ResourceInUse
-	 * 
-	 * ISSUE: is this important enough to be API, or can clients solve
-	 * themselves
-	 */
-	IStructuredModel copyModel(IPath oldLocation, IPath newLocation, AccessType type) throws ResourceInUse;
-
-	/**
-	 * createNewInstance is similar to clone, except the new instance has no
-	 * text content. Note: this produces an UNSHARED model, for temporary use,
-	 * that has the same characteristics as original model. If a true shared
-	 * model is desired, use "copy".
-	 * 
-	 * ISSUE: still needed?
-	 * 
-	 * @param requester
-	 * @param model
-	 * @return
-	 * @throws IOException
-	 */
-	public IStructuredModel createNewInstance(Object requester, IStructuredModel model) throws IOException;
-
-	/**
-	 * Factory method, since a proper IStructuredDocument must have a proper
-	 * parser assigned. Note: its assume that IPath does not actually exist as
-	 * a resource yet. If it does, ResourceAlreadyExists exception is thrown.
-	 * If the resource does already exist, then createStructuredDocumentFor is
-	 * the right API to use.
-	 * 
-	 * ISSUE: do we want to support this via model manager, or else where?
-	 * ISSUE: do we need two of these? What's legacy use case?
-	 * 
-	 * @param location
-	 * @param progressMonitor
-	 * @return
-	 * @throws ResourceAlreadyExists
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-	IStructuredDocument createNewStructuredDocumentFor(IPath location, IProgressMonitor progressMonitor) throws ResourceAlreadyExists, IOException, CoreException;
-
-	/**
-	 * Factory method, since a proper IStructuredDocument must have a proper
-	 * parser assigned. Note: clients should verify that the resource
-	 * identified by the IPath exists before using this method. If this IFile
-	 * does not exist, then createNewStructuredDocument is the correct API to
-	 * use.
-	 * 
-	 * ISSUE: do we want to support this via model manager, or else where?
-	 * ISSUE: do we need two of these? What's legacy use case?
-	 * 
-	 * @param location
-	 * @param progressMonitor
-	 * @return
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-	IStructuredDocument createStructuredDocumentFor(IPath location, IProgressMonitor progressMonitor) throws IOException, CoreException;
-
-	/**
-	 * Note: callers of this method must still release the model when
-	 * finished. Returns the model for this document if it already exists and
-	 * is being shared. Returns null if this is not the case. The ReadEditType
-	 * must be either MODIFY or SHARED.
-	 * 
-	 * ISSUE: should we accept IDocument on parameter for future evolution,
-	 * and constrain to StructuredDocuments at runtime?
-	 * 
-	 * @param requester
-	 * @param type
-	 * @param document
-	 * @return
-	 */
-	IStructuredModel getExistingModel(Object requester, AccessType type, IDocument document);
-
-	/**
-	 * Callers of this method must still release the model when finished.
-	 * Returns the model for this location if it already exists and is being
-	 * shared. Returns null if this is not the case. The ReadEditType must be
-	 * either MODIFY or SHARED.
-	 * 
-	 * @param requester
-	 * @param type
-	 * @param location
-	 * @return
-	 */
-	public IStructuredModel getExistingModel(Object requester, AccessType type, IPath location);
-
-	/**
-	 * Returns the model that has the specified document as its structured
-	 * document.
-	 * 
-	 * @param requester
-	 * @param type
-	 * @param progressMonitor
-	 * @param document
-	 * @return
-	 */
-	public IStructuredModel getModel(Object requester, AccessType type, IProgressMonitor progressMonitor, IDocument document);
-
-	/**
-	 * Returns the model based on the content at the specified location.
-	 * 
-	 * Note: if the ModelManager does not know how to create a model for 
-	 * such a file for content, null is return.
-	 * ISSUE: should we throw some special, meaningful, checked 
-	 * exception instead?
-	 * 
-	 * @param requester
-	 * @param type
-	 * @param progressMonitor
-	 * @param location
-	 * @return
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-	public IStructuredModel getModel(Object requester, AccessType type, IProgressMonitor progressMonitor, IPath location) throws IOException, CoreException;
-
-	/**
-	 * This method will not create a new model if it already exists ... if
-	 * force is false. The idea is that a client should call this method once
-	 * with force set to false. If the exception is thrown, then prompt client
-	 * if they want to overwrite.
-	 * 
-	 * @param requester
-	 * @param location
-	 * @param force
-	 * @param type
-	 * @param progressMonitor
-	 * @return
-	 * @throws ResourceAlreadyExists
-	 * @throws ResourceInUse
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-	IStructuredModel getNewModel(Object requester, IPath location, boolean force, AccessType type, IProgressMonitor progressMonitor) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException;
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model.
-	 * 
-	 * @param location
-	 * @return
-	 */
-	boolean isShared(IPath location);
-
-	/**
-	 * This function returns true if there are other references to the
-	 * underlying model, shared in the specified way. The ReadEditType must be
-	 * either MODIFY or SHARED.
-	 * 
-	 * @param location
-	 * @param type
-	 * @return
-	 */
-	boolean isShared(IPath location, AccessType type);
-
-	/**
-	 * This method can be called when the content type of a model changes. Its
-	 * assumed the contentType has already been changed, and this method uses
-	 * the text of the old one, to repopulate the text of the new one.
-	 * 
-	 * @param model
-	 * @return
-	 * @throws IOException
-	 */
-	IStructuredModel reinitialize(IStructuredModel model) throws IOException;
-
-
-	/**
-	 * This is used by clients to signify that they are finished with a model
-	 * and will no longer access it or any of its underlying data (such as its
-	 * structured document). The ReadEditType must match what ever the client
-	 * used in the corresponding 'get' method.
-	 * 
-	 * This method must be called for every 'get'. Clients should use the
-	 * try/finally pattern to ensure the release is called even if there is an
-	 * unexpected exception.
-	 * 
-	 * @param requester
-	 * @param structuredModel
-	 * @param type
-	 */
-	void releaseModel(Object requester, IStructuredModel structuredModel, AccessType type);
-
-	/**
-	 * Writes the underlying document to the IPath.
-	 * 
-	 * ISSUE: we want to just "dump" contents to location, but need to spec.
-	 * all the different cases of shared, etc.
-	 * 
-	 * ?If to same location as 'get', then same instance of model, If to
-	 * different location (esp. if shared) then need to leave old instance of
-	 * model, create new model, and save to new location. ?
-	 * 
-	 * Cases: IPath is null, write to IPath created with IPath specificed and
-	 * equals IPath created with, write to IPath IPath specified and not
-	 * equals IPath created with, dumps to new IPath, no change in current
-	 * model state.
-	 * 
-	 * ISSUE: think through 'normalization' cases
-	 * 
-	 * 
-	 * @param structuredModel
-	 * @param location - already normalized?
-	 * @param progressMonitor
-	 * @throws UnsupportedEncodingException
-	 * @throws IOException
-	 * @throws CoreException
-	 * 
-	 * ISSUE: resource aleady exists? veto override
-	 */
-	void saveModel(IStructuredModel structuredModel, IPath location, IProgressMonitor progressMonitor) throws UnsupportedEncodingException, IOException, CoreException;
-
-	/**
-	 * Writes the underlying document to the IPath if the model is only shared
-	 * for EDIT by one client. This is the recommended way for 'background
-	 * jobs' to save models, in case the model is being shared by an editor,
-	 * or other client that might desire user intervention to save a resource.
-	 * 
-	 * @param structuredModel
-	 * @param location - already normalized?
-	 * @param progressMonitor
-	 * @throws UnsupportedEncodingException
-	 * @throws IOException
-	 * @throws CoreException
-	 * 
-	 * ISSUE: is locaiton needed in this case, or just use the one it was
-	 * created with
-	 */
-	void saveModelIfNotShared(IStructuredModel structuredModel, IPath location, IProgressMonitor progressMonitor) throws UnsupportedEncodingException, IOException, CoreException;
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IModelStateListenerProposed.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IModelStateListenerProposed.java
deleted file mode 100644
index 484fc70..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IModelStateListenerProposed.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.model;
-
-
-/**
- * Interface for those wanting to listen to a model's state changing.
- * 
- * @plannedfor 1.0
- */
-public interface IModelStateListenerProposed {
-
-	/**
-	 * A model is about to be changed. The event object itself signifies which
-	 * model, and any pertinent information.
-	 */
-	void modelAboutToBeChanged(IStructuredModelEvent event);
-
-	/**
-	 * Signals that the changes foretold by modelAboutToBeChanged have been
-	 * made. A typical use might be to refresh, or to resume processing that
-	 * was suspended as a result of modelAboutToBeChanged.
-	 */
-	void modelChanged(IStructuredModelEvent event);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/INodeAdapterFactoryManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/INodeAdapterFactoryManager.java
deleted file mode 100644
index 6c2d165..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/INodeAdapterFactoryManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-
-package org.eclipse.wst.sse.core.internal.provisional.model;
-
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-/**
- * Provides a means for clients to register IAdapterFactories for use
- * by infrastructure when StructuredModels are created. 
- */
-public interface INodeAdapterFactoryManager {
-
-	/**
-	 * 
-	 * @param factory
-	 * @param contentType
-	 */
-	void addAdapterFactory(INodeAdapterFactory factory, IContentType contentType);
-
-	void removeAdapterFactory(INodeAdapterFactory factory, IContentType contentType);
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IStructuredModelEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IStructuredModelEvent.java
deleted file mode 100644
index 73bc3be..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IStructuredModelEvent.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-
-package org.eclipse.wst.sse.core.internal.provisional.model;
-
-public interface IStructuredModelEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IStructuredModelProposed.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IStructuredModelProposed.java
deleted file mode 100644
index 7d984da..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/model/IStructuredModelProposed.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.model;
-
-import java.io.IOException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
-import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-
-/**
- * IStructuredModel's are mainly interesting by their extensions and
- * implementers. The main purposed of this abstraction it to provide a common
- * way to manage models that have an associated structured documnet.
- * 
- * @plannedfor 1.0
- * 
- */
-public interface IStructuredModelProposed extends IAdaptable {
-
-
-	/**
-	 * This API allows clients to declare that they are about to make a
-	 * "large" change to the model. This change might be in terms of content
-	 * or it might be in terms of the model id or base location.
-	 * 
-	 * Note that in the case of embedded calls, notification to listeners is
-	 * sent only once.
-	 * 
-	 * Note that the client who is making these changes has the responsibility
-	 * to restore the model's state once finished with the changes. See
-	 * getMemento and restoreState.
-	 * 
-	 * The method isModelStateChanging can be used by a client to determine if
-	 * the model is already in a change sequence.
-	 * 
-	 * This method is a matched pair to changedModel, and must be called
-	 * before changedModel. A client should never call changedModel without
-	 * calling aboutToChangeModel first nor call aboutToChangeModel without
-	 * calling changedModel later from the same Thread.
-	 */
-	void aboutToChangeModel();
-
-	void addModelStateListener(IModelStateListener listener);
-
-	/**
-	 * This API allows a client controlled way of notifying all ModelEvent
-	 * listners that the model has been changed. This method is a matched pair
-	 * to aboutToChangeModel, and must be called after aboutToChangeModel ...
-	 * or some listeners could be left waiting indefinitely for the changed
-	 * event. So, its suggested that changedModel always be in a finally
-	 * clause. Likewise, a client should never call changedModel without
-	 * calling aboutToChangeModel first.
-	 * 
-	 * In the case of embedded calls, the notification is just sent once.
-	 * 
-	 */
-	void changedModel();
-
-	/**
-	 * This is a client-defined value for what that client (and/or loader)
-	 * considers the "base" of the structured model. Frequently the location
-	 * is either a workspace root-relative path of a workspace resource or an
-	 * absolute path in the local file system.
-	 */
-	IPath getLocation();
-
-	/**
-	 * @return The associated content type identifier (String) for this model.
-	 */
-	IContentType getContentType() throws CoreException;
-
-	/**
-	 * 
-	 * @return The model's FactoryRegistry. A model is not valid without one.
-	 */
-	FactoryRegistry getFactoryRegistry();
-
-	/**
-	 * Return the index region at offset. Returns null if there is no
-	 * IndexedRegion that contains offset.
-	 */
-	IndexedRegion getIndexedRegion(int offset);
-
-	/**
-	 * ISSUE: do we want to provide this? How to ensure job/thread safety
-	 * 
-	 * @return
-	 */
-	IndexedRegion[] getIndexedRegions();
-
-	/**
-	 * Rreturns the IStructuredDocument that underlies this model
-	 * 
-	 * @return
-	 */
-	IStructuredDocument getStructuredDocument();
-
-	/**
-	 * 
-	 */
-	boolean isDirty();
-
-	/**
-	 * This method can be called to determine if the model is within a
-	 * "aboutToChange" and "changed" sequence.
-	 */
-	public boolean isModelStateChanging();
-
-	/**
-	 * 
-	 */
-	boolean isNew();
-
-	boolean isReinitializationNeeded();
-
-	/**
-	 * This is a combination of if the model is dirty and if the model is
-	 * shared for write access. The last writer as the responsibility to be
-	 * sure the user is prompted to save.
-	 */
-	public boolean isSaveNeeded();
-
-	/**
-	 * newInstance is similar to clone, except that the newInstance contains
-	 * no content. Its purpose is so clients can get a temporary, unmanaged,
-	 * model of the same "type" as the original. Note: the client may still
-	 * need to do some intialization of the model returned by newInstance,
-	 * depending on desired use. For example, the only factories in the
-	 * newInstance are those that would be normally be created for a model of
-	 * the given contentType. Others are not copied automatically, and if
-	 * desired, should be added by client.
-	 */
-	IStructuredModelProposed newInstance() throws IOException;
-
-	void removeModelStateListener(IModelStateListener listener);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocument.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocument.java
deleted file mode 100644
index 97d4ef6..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocument.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.text.IDocumentExtension;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
-import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;
-import org.eclipse.wst.sse.core.internal.provisional.events.IModelAboutToBeChangedListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-
-
-/**
- * A IStructuredDocument is a collection of StructuredDocumentRegions. It's
- * often called "flat" because its contents by design do not contain much
- * structural information beyond containment. Clients should not implement.
- */
-public interface IStructuredDocument extends IEncodedDocument, IDocumentExtension, IAdaptable {
-
-	void addDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener);
-
-	/**
-	 * The StructuredDocumentListeners and ModelChangedListeners are very
-	 * similar. They both receive identical events. The difference is the
-	 * timing. The "pure" StructuredDocumentListeners are notified after the
-	 * structuredDocument has been changed, but before other, related models
-	 * may have been changed such as the Structural Model. The Structural
-	 * model is in fact itself a "pure" StructuredDocumentListner. The
-	 * ModelChangedListeners can rest assured that all models and data have
-	 * been updated from the change by the tiem they are notified. This is
-	 * especially important for the text widget, for example, which may rely
-	 * on both structuredDocument and structural model information.
-	 */
-	void addDocumentChangedListener(IStructuredDocumentListener listener);
-
-	/**
-	 * The StructuredDocumentListeners and ModelChangedListeners are very
-	 * similar. They both receive identical events. The difference is the
-	 * timing. The "pure" StructuredDocumentListeners are notified after the
-	 * structuredDocument has been changed, but before other, related models
-	 * may have been changed such as the Structural Model. The Structural
-	 * model is in fact itself a "pure" StructuredDocumentListner. The
-	 * ModelChangedListeners can rest assured that all models and data have
-	 * been updated from the change by the tiem they are notified. This is
-	 * especially important for the text widget, for example, which may rely
-	 * on both structuredDocument and structural model information.
-	 */
-	void addDocumentChangingListener(IStructuredDocumentListener listener);
-
-	/**
-	 * this API ensures that any portion of the document within startOff to
-	 * length is not readonly (that is, that its editable). Note that if the
-	 * range overlaps with other readonly regions, those other readonly
-	 * regions will be adjusted.
-	 * 
-	 * @param startOffset
-	 * @param length
-	 */
-	void clearReadOnly(int startOffset, int length);
-
-	/**
-	 * returns true if any portion of startOffset to length is readonly
-	 * 
-	 * @param startOffset
-	 * @param length
-	 * @return
-	 */
-	boolean containsReadOnly(int startOffset, int length);
-
-	/**
-	 * This method is to remember info about the encoding When the resource
-	 * was last loaded or saved. Note: it is not kept "current", that is, can
-	 * not be depended on blindly to reflect what encoding to use. For that,
-	 * must go through the normal rules expressed in Loaders and Dumpers.
-	 */
-
-	EncodingMemento getEncodingMemento();
-
-	org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion getFirstStructuredDocumentRegion();
-
-	org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion getLastStructuredDocumentRegion();
-
-	/**
-	 * This can be considered the preferred delimiter.
-	 */
-	public String getLineDelimiter();
-
-	int getLineOfOffset(int offset); // throws SourceEditingException;
-
-	/**
-	 * The parser is now required on constructor, so there are occasions it
-	 * needs to be retrieved, such as to be initialized by EmbeddedContentType
-	 */
-	RegionParser getParser();
-
-	/**
-	 * @deprecated use getStructuredDocumentRegions()
-	 * @return
-	 */
-	IStructuredDocumentRegionList getRegionList();
-
-	/**
-	 * Returns the <code>IStructuredDocumentRegion</code> at the given character offset.
-	 * @param offset
-	 * @return the <code>IStructuredDocumentRegion</code> at the given character offset.
-	 */
-	IStructuredDocumentRegion getRegionAtCharacterOffset(int offset);
-	
-	/**
-	 * Returns <code>IStructuredDocumentRegion</code>s in the specified range.
-	 * @param offset
-	 * @param length
-	 * @return <code>IStructuredDocumentRegion</code>s in the specified range.
-	 */
-	IStructuredDocumentRegion[] getStructuredDocumentRegions(int offset, int length);
-	
-	/**
-	 * Returns all <code>IStructuredDocumentRegion</code>s in the document.
-	 * @return all <code>IStructuredDocumentRegion</code>s in the document.
-	 */
-	IStructuredDocumentRegion[] getStructuredDocumentRegions();
-	
-	/**
-	 * Note: this method was made public, and part of the interface, for
-	 * easier testing. Clients normally never manipulate the reparser directly
-	 * (nor should they need to).
-	 */
-	IStructuredTextReParser getReParser();
-
-	String getText();
-
-	IStructuredTextUndoManager getUndoManager();
-
-	/**
-	 * causes that portion of the document from startOffset to length to be
-	 * marked as readonly. Note that if this range overlaps with some other
-	 * region with is readonly, the regions are effectivly combined.
-	 * 
-	 * @param startOffset
-	 * @param length
-	 */
-	void makeReadOnly(int startOffset, int length);
-
-	/**
-	 * newInstance is similar to clone, except it contains no data. One
-	 * important thing to duplicate is the parser, with the parser correctly
-	 * "cloned", including its tokeninzer, block tags, etc.
-	 * 
-	 * NOTE: even after obtaining a 'newInstance' the client may have to do
-	 * some initialization, for example, it may need to add its own model
-	 * listeners. Or, as another example, if the IStructuredDocument has a
-	 * parser of type StructuredDocumentRegionParser, then the client may need
-	 * to add its own StructuredDocumentRegionHandler to that parser, if it is
-	 * in fact needed.
-	 */
-	IStructuredDocument newInstance();
-
-	void removeDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener);
-
-	void removeDocumentChangedListener(IStructuredDocumentListener listener);
-
-	void removeDocumentChangingListener(IStructuredDocumentListener listener);
-
-	/**
-	 * One of the APIs to manipulate the IStructuredDocument.
-	 * 
-	 * replaceText replaces the text from oldStart to oldEnd with the new text
-	 * found in the requestedChange string. If oldStart and oldEnd are equal,
-	 * it is an insertion request. If requestedChange is null (or empty) it is
-	 * a delete request. Otherwise it is a replace request.
-	 */
-	StructuredDocumentEvent replaceText(Object source, int oldStart, int replacementLength, String requestedChange);
-
-	/**
-	 * Note, same as replaceText API, but will allow readonly areas to be
-	 * replaced. This should seldom be called with a value of "true" for
-	 * ignoreReadOnlySetting. One case where its ok is with undo operations
-	 * (since, presumably, if user just did something that happended to
-	 * involve some inserting readonly text, they should normally be allowed
-	 * to still undo that operation. Otherwise, I can't think of a single
-	 * example, unless its to give the user a choice, e.g. "you are about to
-	 * overwrite read only portions, do you want to continue".
-	 */
-	StructuredDocumentEvent replaceText(Object source, int oldStart, int replacementLength, String requestedChange, boolean ignoreReadOnlySetting);
-
-	/**
-	 * This method is to remember info about the encoding When the resource
-	 * was last loaded or saved. Note: it is not kept "current", that is, can
-	 * not be depended on blindly to reflect what encoding to use. For that,
-	 * must go through the normal rules expressed in Loaders and Dumpers.
-	 */
-	void setEncodingMemento(EncodingMemento encodingMemento);
-
-	public void setLineDelimiter(String delimiter);
-
-	/**
-	 * One of the APIs to manipulate the IStructuredDocument in terms of Text.
-	 * 
-	 * The setText method replaces all text in the model.
-	 */
-	StructuredDocumentEvent setText(Object requester, String allText);
-
-	void setUndoManager(IStructuredTextUndoManager undoManager);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocumentRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocumentRegion.java
deleted file mode 100644
index 8b03b2a..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocumentRegion.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-/**
- * A ITextRegionCollection is a collection of ITextRegions. It is a structural
- * unit, but a minimal one. For example, in might consist of a "start tag" but
- * not a whole XML element.
- */
-public interface IStructuredDocumentRegion extends ITextRegionCollection {
-
-	/**
-	 * Adds a text region to the end of the collection of regions contained by
-	 * this region. It is the parsers responsibility to make sure its a
-	 * correct region (that is, its start offset is one greater than previous
-	 * regions end offset)
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void addRegion(ITextRegion aRegion);
-
-	/**
-	 * Returns the structured document region that follows this one or null if
-	 * at end of document.
-	 * 
-	 * @return the structured document region that follows this one.
-	 * 
-	 * ISSUE: for thread safety, this should be more restrictive.
-	 */
-	IStructuredDocumentRegion getNext();
-
-	/**
-	 * Returns this regions parent document.
-	 * 
-	 * @return this regions parent document.
-	 */
-	IStructuredDocument getParentDocument();
-
-	/**
-	 * Returns the structured document region that preceeds this one or null
-	 * if at beginning of document.
-	 * 
-	 * @return the structured document region that follows this one.
-	 * 
-	 * ISSUE: for thread safety, this should be more restrictive.
-	 */
-	IStructuredDocumentRegion getPrevious();
-
-	/**
-	 * Returns true if this document has been deleted, and is no longer part
-	 * of the actual structured document. This field can be used in
-	 * multi-threaded operations, which may retrieve a long list of regions
-	 * and be iterating through them at the same time the document is
-	 * modified, and regions deleted.
-	 * 
-	 * @return true if this region is no longer part of document.
-	 */
-	boolean isDeleted();
-
-	/**
-	 * Returns true if this structured document region was ended "naturally"
-	 * by syntactic rules, or if simply assumed to end so another could be
-	 * started.
-	 * 
-	 * @return true if region has syntactic end.
-	 */
-	boolean isEnded();
-
-	/**
-	 * Tests is region is equal to this one, ignoring position offsets of
-	 * shift.
-	 * 
-	 * For use by parsers and reparsers only.
-	 * 
-	 * @param region
-	 * @param shift
-	 * @return
-	 */
-	boolean sameAs(IStructuredDocumentRegion region, int shift);
-
-	/**
-	 * Tests if <code>oldRegion</code> is same as <code>newRegion</code>,
-	 * ignoring position offsets of <code>shift</code>.
-	 * 
-	 * ISSUE: which document region are old and new in?
-	 * 
-	 * For use by parsers and reparsers only.
-	 * 
-	 * @param oldRegion
-	 * @param documentRegion
-	 * @param newRegion
-	 * @param shift
-	 * @return
-	 */
-	boolean sameAs(ITextRegion oldRegion, IStructuredDocumentRegion documentRegion, ITextRegion newRegion, int shift);
-
-	/**
-	 * Set to true if/when this region is removed from a document, during the
-	 * process of re-parsing.
-	 * 
-	 * For use by parsers and reparsers only.
-	 * 
-	 * @param deleted
-	 */
-	void setDeleted(boolean deleted);
-
-	/**
-	 * Set to true by parser/reparser if region deemed to end syntactically.
-	 * 
-	 * For use by parsers and reparsers only.
-	 * 
-	 * @param hasEnd
-	 */
-	void setEnded(boolean hasEnd);
-
-	/**
-	 * Sets length of region.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void setLength(int newLength);
-
-	/**
-	 * Assigns pointer to next region, or null if last region.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void setNext(IStructuredDocumentRegion newNext);
-
-	/**
-	 * Assigns parent documnet.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void setParentDocument(IStructuredDocument document);
-
-	/**
-	 * Assigns pointer to previous region, or null if first region.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void setPrevious(IStructuredDocumentRegion newPrevious);
-
-	/**
-	 * Sets start offset of region, relative to beginning of document.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void setStart(int newStart);
-
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocumentRegionList.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocumentRegionList.java
deleted file mode 100644
index 734431e..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredDocumentRegionList.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-import java.util.Enumeration;
-
-/**
- * This is a class used to provide a list of StructuredDocumentRegions, so the
- * implementation of how the list is formed can be hidden (encapsulated by
- * this class).
- * 
- * ISSUE: should extend ITextRegionList instead?
- * 
- * @plannedfor 1.0
- * 
- */
-public interface IStructuredDocumentRegionList {
-
-	/**
-	 * Returns enumeration.
-	 * 
-	 * @return enumeration.
-	 */
-	Enumeration elements();
-
-	/**
-	 * Returns size of list.
-	 * 
-	 * @return size of list.
-	 */
-	int getLength();
-
-	/**
-	 * Returns the structured document region at index i.
-	 * 
-	 * @param i
-	 *            index of region to return
-	 * @return the region at specified offset.
-	 */
-	IStructuredDocumentRegion item(int i);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredPartitionTypes.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredPartitionTypes.java
deleted file mode 100644
index 17c2019..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredPartitionTypes.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-/**
- * This interface is not intended to be implemented.
- * It defines the partitioning for StructuredDocuments.
- * Clients should reference the partition type Strings defined here directly.
- * 
- * @deprecated use org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitions
- */
-public interface IStructuredPartitionTypes {
-
-	String DEFAULT_PARTITION = "org.eclipse.wst.sse.ST_DEFAULT"; //$NON-NLS-1$
-	String UNKNOWN_PARTITION = "org.eclipse.wst.sse.UNKNOWN_PARTITION_TYPE"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredPartitioning.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredPartitioning.java
deleted file mode 100644
index f7e940c..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredPartitioning.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-/**
- * Identifies the way that Documents are partitioned.
- * 
- * @plannedfor 1.0
- */
-public interface IStructuredPartitioning {
-	
-	/** String to identify default partitioning*/
-	String DEFAULT_STRUCTURED_PARTITIONING = "org.eclipse.wst.sse.core.default_structured_text_partitioning"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredTextPartitioner.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredTextPartitioner.java
deleted file mode 100644
index 9e53f8f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredTextPartitioner.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.wst.sse.core.internal.text.rules.IStructuredTypedRegion;
-
-
-/**
- * A partitioner interface required for handling the embedded content type 
- * properly. 
- * 
- * ISSUE: need to investigate necessity of these methods
- * 
- * @plannedfor 1.0
- */
-
-public interface IStructuredTextPartitioner extends IDocumentPartitioner {
-
-	/**
-	 * Used by JSP partitioner to ensure that the partitioner of the
-	 * embedded content type gets to create the partition in case the specific
-	 * classes are important.
-	 * 
-	 * ISSUE: investigate if we really need this...
-	 */
-	IStructuredTypedRegion createPartition(int offset, int length, String partitionType);
-
-	/**
-	 * Returns the Default partition type for this partitioner.
-	 * <p>
-	 * eg:
-	 * <br><code>org.eclipse.wst.xml.core.text.IXMLPartitions.XML_DEFAULT</code>
-	 * <br><code>org.eclipse.wst.html.core.text.IHTMLPartitions.HTML_DEFAULT</code>
-	 * <br><code>org.eclipse.wst.jsp.core.text.IJSPPartitions.JSP_DEFAULT</code>
-	 * </p>
-	 * @see org.eclipse.wst.sse.core.text.IStructuredPartitions
-	 * @see org.eclipse.wst.xml.core.text.IXMLPartitions
-	 * @see org.eclipse.wst.html.core.text.IHTMLPartitions
-	 * @see org.eclipse.wst.jsp.core.text.IJSPPartitions
-	 * 
-	 * @return the Default partition type for this partitioner.
-	 */
-	String getDefaultPartitionType();
-
-	/**
-	 * Returns the particular partition type for the given region/offset.
-	 * <p>
-	 * eg:
-	 * <br><code>org.eclipse.wst.xml.core.text.IXMLPartitions.XML_DEFAULT</code>
-	 * <br><code>org.eclipse.wst.html.core.text.IHTMLPartitions.HTML_DEFAULT</code>
-	 * <br><code>org.eclipse.wst.jsp.core.text.IJSPPartitions.JSP_DEFAULT</code>
-	 * </p>
-	 * 
-	 * @param region of the IStructuredDocument
-	 * @param offset in the IStructuredDoucment
-	 * @return the particular partition type for the given region/offset.
-	 */
-	String getPartitionType(ITextRegion region, int offset);
-
-	/**
-	 * Returns the partition type String of the IStructuredDocumentRegion 
-	 * between the 2 region parameters.
-	 * Useful for finding the partition type of a 0 length region.
-	 * eg.
-	 * <pre>
-	 * 	<script type="text/javascript">|</script>
-	 * </pre>
-	 * @param previousNode
-	 * @param nextNode
-	 * @return the partition type of the node between previousNode and nextNode
-	 * @deprecated move to IDocumentPartitionerExtension2 ->
-	 *  String getContentType(int offset, boolean preferOpenPartitions);
-	 */
-	String getPartitionTypeBetween(IStructuredDocumentRegion previousNode, IStructuredDocumentRegion nextNode);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredTextReParser.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredTextReParser.java
deleted file mode 100644
index 5acdfa1..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/IStructuredTextReParser.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-
-/**
- * IStructuredTextReParser describes the characteristics and responsibilities
- * for reparsing a structured document.
- * 
- * @plannedfor 1.0
- */
-public interface IStructuredTextReParser {
-
-	/**
-	 * Begins the process of reparsing, by providing the information needed
-	 * for the reparse. The reparse is actually performed when the reparse
-	 * method is called. Will through an IllegalStateException if document as
-	 * not be set.
-	 * 
-	 * @param requester
-	 * @param start
-	 * @param lengthToReplace
-	 * @param changes
-	 */
-	void initialize(Object requester, int start, int lengthToReplace, String changes);
-
-	/**
-	 * This method is provided to enable multiple threads to reparse a
-	 * document. This is needed since the intialize method sets state
-	 * variables that must be "in sync" with the structuredDocument.
-	 */
-	public boolean isParsing();
-
-	/**
-	 * Returns a new instance of this reparser, used when cloning documents.
-	 * 
-	 * @return a new instance of this reparser.
-	 */
-	public IStructuredTextReParser newInstance();
-
-	/**
-	 * An entry point for reparsing. It needs to calculates the dirty start
-	 * and dirty end in terms of structured document regions based on the
-	 * start point and length of the changes, which are provided by the
-	 * initialize method. Will through an IllegalStateException if document as
-	 * not be set.
-	 * 
-	 */
-	public StructuredDocumentEvent reparse();
-
-
-
-	/**
-	 * The reparser is initialized with its document, either in or shortly
-	 * after its constructed is called.
-	 * 
-	 * @param structuredDocument
-	 */
-	public void setStructuredDocument(IStructuredDocument newStructuredDocument);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegion.java
deleted file mode 100644
index b1281ab..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegion.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-
-/**
- * A simple description of a bit of text (technically, a bit of a text buffer)
- * that has a "type" associated with it. For example, for the XML text
- * "&LT;IMG&GT;", the ' <' might form a region of type "open bracket" where as
- * the text "IMG" might form a region of type "tag name".
- * 
- * Note that there are three positions associated with a region, the start,
- * the end, and the end of the text. The end of the region should always be
- * greater than or equal to the end of the text, because the end of the text
- * simply includes any white space that might follow the non-whitespace
- * portion of the region. This whitespace is assumed to be ignorable except
- * for reasons of maintaining it in the original document for formatting,
- * appearance, etc.
- * 
- * Follows the Prime Directives:
- * 
- * getEnd() == getStart() + getLength()
- * 
- * getTextEnd() == getStart() + getTextLength();
- * 
- * Event though 'end' and 'length' are redundant (given start), both methods
- * are provided, since some parsers/implementations favor one or the other for
- * efficiency.
- * 
- * @plannedfor 1.0
- */
-public interface ITextRegion {
-
-	/**
-	 * Changes length of region. May be less than, equal to, or greater than
-	 * zero. It may not, however, cause the length of the region to be less
-	 * than or equal to zero, or an illegal argument acception may be thrown
-	 * at runtime.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void adjustLength(int i);
-
-	/**
-	 * Changes start offset of region. May be less than, equal to, or greater
-	 * than zero. It may not, however, cause the offset of the region to be
-	 * less than zero, or an illegal argument acception may be thrown at
-	 * runtime.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void adjustStart(int i);
-
-	/**
-	 * Changes text length of region.
-	 * 
-	 * May be less than, equal to, or greater than zero. It may not, however,
-	 * cause the text length of the region to be greater than the length of a
-	 * region, or an illegal argument acception may be thrown at runtime.
-	 * 
-	 * For use by parsers and reparsers only.
-	 */
-	void adjustTextLength(int i);
-
-	/**
-	 * Makes this regions start, length, and text length equal to the
-	 * paremter's start, length, and text length.
-	 * 
-	 * @param region
-	 */
-	void equatePositions(ITextRegion region);
-
-	/**
-	 * Returns the end offset of this region. Whether is relative to the
-	 * document, or another region depends on the subtype.
-	 * 
-	 * Follows the Prime Directive: getEnd() == getStart() + getLength()
-	 * 
-	 * @return the end offset of this region.
-	 */
-	int getEnd();
-
-	/**
-	 * Returns the length of the region.
-	 * 
-	 * Follows the Prime Directive: getEnd() == getStart() + getLength()
-	 * 
-	 * @return the length of the region.
-	 */
-	int getLength();
-
-	/**
-	 * Returns the start of the region. Whether is relative to the document,
-	 * or another region depends on the subtype.
-	 * 
-	 * Follows the Prime Directive: getEnd() == getStart() + getLength()
-	 * 
-	 * @return the start of the region.
-	 */
-	int getStart();
-
-	/**
-	 * Returns the end offset of the text of this region.
-	 * 
-	 * In some implementations, the "end" of the region (accessible via
-	 * getEnd()) also contains any and all white space that may or may not be
-	 * present after the "token" (read: relevant) part of the region. This
-	 * method, getTextEnd(), is specific for the "token" part of the region,
-	 * without the whitespace.
-	 * 
-	 * @return the end offset of the text of this region.
-	 */
-	int getTextEnd();
-
-	/**
-	 * Returns the length of the text of this region.
-	 * 
-	 * The text length is equal to length if there is no white space at the
-	 * end of a region. Otherwise it is smaller than length.
-	 * 
-	 * @return the length of the text of this region.
-	 */
-	int getTextLength();
-
-	/**
-	 * Returns the type of this region.
-	 * 
-	 * @see regiontypes, structureddocumentregiontypes
-	 * @return the type of this region.
-	 */
-	String getType();
-
-	/**
-	 * Allows the region itself to participate in reparsing process.
-	 * 
-	 * The region itself can decide if it can determine the appropriate event
-	 * to return, based on the requested change. If it can not, this method
-	 * must return null, so a "higher level" reparsing process will be given
-	 * the oppurtunity to decide. If it returns an Event, that's it, not other
-	 * reparsing process will get an oppurtunity to reparse.
-	 * 
-	 * For use by parsers and reparsers only.
-	 * 
-	 */
-	StructuredDocumentEvent updateRegion(Object requester, IStructuredDocumentRegion parent, String changes, int requestStart, int lengthToReplace);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionCollection.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionCollection.java
deleted file mode 100644
index 08890ae..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionCollection.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-/**
- * ITextRegionCollection, as its name implies, is a collection of
- * ITextRegions.
- * 
- * @plannedfor 1.0
- */
-public interface ITextRegionCollection extends ITextRegion {
-
-	/**
-	 * Used to determine if a region contains a particular offset, where
-	 * offset is relative to the beginning of a document.
-	 * 
-	 * @param offset
-	 * @return true if offset is greater than or equal to regions start and
-	 *         less than its end offset.
-	 */
-	boolean containsOffset(int offset);
-
-	/**
-	 * Used to determine if a region contains a particular offset.
-	 * 
-	 * ISSUE: I need to figure out what this is really for! (that is, how to
-	 * describe it, or if still needed).
-	 * 
-	 * @param offset
-	 * @return true if offset is greater than or equal to regions start and
-	 *         less than its end offset.
-	 */
-	boolean containsOffset(ITextRegion region, int offset);
-
-	/**
-	 * Returns the end offset of this region, relative to beginning of
-	 * document.
-	 * 
-	 * For some subtypes, but not all, it is equivilent to getEnd().
-	 * 
-	 * @return the end offset of this region.
-	 */
-	int getEndOffset();
-
-	/**
-	 * Returns the end offset, relative to the beginning of the document of
-	 * the contained region.
-	 * 
-	 * @param containedRegion
-	 * @return the end offset of the contained region.
-	 */
-	int getEndOffset(ITextRegion containedRegion);
-
-	/**
-	 * Returns the first region of those contained by this region collection.
-	 * 
-	 * @return the first region.
-	 */
-	ITextRegion getFirstRegion();
-
-	/**
-	 * Returns the full text of this region, including whitespace.
-	 * 
-	 * @return the full text of this region, including whitespace.
-	 */
-	String getFullText();
-
-	/**
-	 * Returns the full text of the contained region, including whitespace.
-	 * 
-	 * @return the full text of the contained region, including whitespace.
-	 */
-	String getFullText(ITextRegion containedRegion);
-
-	/**
-	 * Returns the last region of those contained by this region collection.
-	 * 
-	 * @return the last region.
-	 */
-	ITextRegion getLastRegion();
-
-	/**
-	 * Returns the number of regions contained by this region.
-	 * 
-	 * @return the number of regions contained by this region.
-	 */
-	int getNumberOfRegions();
-
-	/**
-	 * Returns the region that contains offset. In the case of "nested"
-	 * regions, returns the top most region.
-	 * 
-	 * @param offset
-	 *            relative to beginning of document.
-	 * @return the region that contains offset. In the case of "nested"
-	 *         regions, returns the top most region.
-	 */
-	ITextRegion getRegionAtCharacterOffset(int offset);
-
-	/**
-	 * Returns the regions contained by this region.
-	 * 
-	 * Note: no assumptions should be made about the object identity of the
-	 * regions returned. Put another way, due to memory use optimizations,
-	 * even if the underlying text has not changed, the regions may or may not
-	 * be the same ones returned from one call to the next.
-	 * 
-	 * @return the regions contained by this region.
-	 */
-	ITextRegionList getRegions();
-
-	/**
-	 * Returns the start offset of this region, relative to the beginning of
-	 * the document.
-	 * 
-	 * @return the start offset of this region
-	 */
-	int getStartOffset();
-
-	/**
-	 * Returns the start offset of the contained region, relative to the
-	 * beginning of the document.
-	 * 
-	 * @return the start offset of the contained region
-	 */
-	int getStartOffset(ITextRegion containedRegion);
-
-	/**
-	 * Returns the text of this region, not including white space.
-	 * 
-	 * @return the text of this region, not including white space.
-	 */
-	String getText();
-
-	/**
-	 * Returns the text of the contained region, not including white space.
-	 * 
-	 * @return the text of the contained region, not including white space.
-	 */
-	String getText(ITextRegion containedRegion);
-
-	/**
-	 * Returns the end offset of the text of this region, not including white
-	 * space.
-	 * 
-	 * @return the end offset of the text of this region, not including white
-	 *         space.
-	 */
-	int getTextEndOffset();
-
-	/**
-	 * Returns the end offset of the text of the contained region, not
-	 * including white space.
-	 * 
-	 * @return the end offset of the text of the contained region, not
-	 *         including white space.
-	 */
-	int getTextEndOffset(ITextRegion containedRegion);
-
-	/**
-	 * Assigns the collection contained in this region.
-	 * 
-	 * For use by parsers and reparsers only.
-	 * 
-	 * @param containedRegions
-	 */
-	void setRegions(ITextRegionList containedRegions);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionContainer.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionContainer.java
deleted file mode 100644
index 654ca81..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionContainer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-/**
- * ITextRegionContainer contains other regions, like a ITextRegionCollection
- * but is itself a region in an ITextRegionCollection, so its "parent" region
- * is maintained.
- * 
- * @plannedfor 1.0
- */
-public interface ITextRegionContainer extends ITextRegionCollection {
-
-	/**
-	 * Returns the parent region.
-	 * 
-	 * @return the parent region.
-	 */
-	ITextRegionCollection getParent();
-
-	/**
-	 * Sets the parent region.
-	 * 
-	 * For use by parsers and reparsers only.
-	 * 
-	 * @param parent
-	 *            the ITextRegionCollection this region is contained in.
-	 */
-	void setParent(ITextRegionCollection parent);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionList.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionList.java
deleted file mode 100644
index c0e46d6..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/provisional/text/ITextRegionList.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.provisional.text;
-
-import java.util.Iterator;
-
-/**
- * ITextRegionList is to provide a list of regions. It can be used so clients
- * do not need to be aware of underlying implementation.
- */
-public interface ITextRegionList {
-
-	/**
-	 * Adds region to the list.
-	 * 
-	 * For use by parsers and reparsers only, while list is being created.
-	 * 
-	 * @param region
-	 * @return
-	 */
-	public boolean add(ITextRegion region);
-
-	/**
-	 * Adds new regions to the list.
-	 * 
-	 * For use by parsers and reparsers only, while list is being created.
-	 * 
-	 * @param insertPos
-	 * @param newRegions
-	 * @return
-	 */
-	public boolean addAll(int insertPos, ITextRegionList newRegions);
-
-	/**
-	 * Removes all regions from the list.
-	 * 
-	 * For use by parsers and reparsers only, while list is being created.
-	 * 
-	 */
-	public void clear();
-
-
-	/**
-	 * Returns the region at <code>index</code>, where 0 is first one in
-	 * the list. Throws an <code>ArrayIndexOutOfBoundsException</code> if
-	 * list is empty, or if index is out of range.
-	 * 
-	 * @param index
-	 * @return
-	 */
-	public ITextRegion get(int index);
-
-	/**
-	 * Returns the index of <code>region</code> or -1 if <code>region</code>
-	 * is not in the list.
-	 * 
-	 * @param region
-	 * @return
-	 */
-	public int indexOf(ITextRegion region);
-
-	/**
-	 * Returns true if list has no regions.
-	 * 
-	 * @return true if list has no regions.
-	 */
-	public boolean isEmpty();
-
-
-	/**
-	 * Returns an iterator for this list.
-	 * 
-	 * @return an iterator for this list.
-	 */
-	public Iterator iterator();
-
-	/**
-	 * Removes the region at index.
-	 * 
-	 * For use by parsers and reparsers only, while list is being created.
-	 * 
-	 */
-	public ITextRegion remove(int index);
-
-	/**
-	 * Removes the region.
-	 * 
-	 * For use by parsers and reparsers only, while list is being created.
-	 * 
-	 */
-	public void remove(ITextRegion region);
-
-
-	/**
-	 * Removes all regionList from this list.
-	 * 
-	 * For use by parsers and reparsers only, while list is being created.
-	 * 
-	 */
-	public void removeAll(ITextRegionList regionList);
-
-	/**
-	 * Returns the size of the list.
-	 * 
-	 * @return the size of the list.
-	 */
-	public int size();
-
-
-	/**
-	 * Creates and returns the regions in an array. No assumptions should be
-	 * made if the regions in the array are clones are same instance of
-	 * original region.
-	 * 
-	 * ISSUE: do we need to specify if cloned copies or not?
-	 * 
-	 * @return an array of regions.
-	 */
-	public ITextRegion[] toArray();
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/BasicStructuredDocument.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/BasicStructuredDocument.java
deleted file mode 100644
index 3452d7a..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/BasicStructuredDocument.java
+++ /dev/null
@@ -1,2968 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Jesper Steen Møller - initial IDocumentExtension4 support - #102822
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.BadPartitioningException;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.DefaultLineTracker;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.DocumentPartitioningChangedEvent;
-import org.eclipse.jface.text.DocumentRewriteSession;
-import org.eclipse.jface.text.DocumentRewriteSessionEvent;
-import org.eclipse.jface.text.DocumentRewriteSessionType;
-import org.eclipse.jface.text.FindReplaceDocumentAdapter;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension;
-import org.eclipse.jface.text.IDocumentExtension3;
-import org.eclipse.jface.text.IDocumentExtension4;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.jface.text.IDocumentPartitionerExtension;
-import org.eclipse.jface.text.IDocumentPartitionerExtension2;
-import org.eclipse.jface.text.IDocumentPartitionerExtension3;
-import org.eclipse.jface.text.IDocumentPartitioningListener;
-import org.eclipse.jface.text.IDocumentPartitioningListenerExtension;
-import org.eclipse.jface.text.IDocumentPartitioningListenerExtension2;
-import org.eclipse.jface.text.IDocumentRewriteSessionListener;
-import org.eclipse.jface.text.ILineTracker;
-import org.eclipse.jface.text.ILineTrackerExtension;
-import org.eclipse.jface.text.IPositionUpdater;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextStore;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.SequentialRewriteTextStore;
-import org.eclipse.jface.text.TypedRegion;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
-import org.eclipse.wst.sse.core.internal.provisional.events.AboutToBeChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.IModelAboutToBeChangedListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredTextReParser;
-import org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-import org.eclipse.wst.sse.core.internal.undo.StructuredTextUndoManager;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-import org.eclipse.wst.sse.core.internal.util.Debug;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-
-
-/**
- * The standard implementation of structured document.
- */
-public class BasicStructuredDocument implements IStructuredDocument, IDocumentExtension, IDocumentExtension3, IDocumentExtension4, CharSequence, IRegionComparible {
-
-	/**
-	 * This ThreadLocal construct is used so each thread can maintain its only
-	 * pointer to the double linked list that manages the documents regions.
-	 * The only thing we "gaurd" for is that a previously cached region has
-	 * been deleted.
-	 * 
-	 * The object that is kept in the thread local's map, is just a pointer to
-	 * an array position. That's because the object there needs to be "free"
-	 * from references to other objects, or it will not be garbage collected.
-	 */
-	private class CurrentDocumentRegionCache {
-		// I'm assuming for now there would never be so many threads that
-		// this arrayList needs to be bounded, or 'cleaned up'.
-		// this assumption should be tested in practice and long running
-		// jobs -- found not to be a good assumption. See below.
-		private List cachedRegionPositionArray = Collections.synchronizedList(new ArrayList());
-		private final boolean DEBUG = false;
-		private final int MAX_SIZE = 50;
-
-
-		private ThreadLocal threadLocalCachePosition = new ThreadLocal();
-
-		IStructuredDocumentRegion get() {
-			IStructuredDocumentRegion region = null;
-			int pos = getThreadLocalPosition();
-			try {
-				region = (IStructuredDocumentRegion) cachedRegionPositionArray.get(pos);
-			}
-			catch (IndexOutOfBoundsException e) {
-				// even though the cachedRegionPosition is synchronized,
-				// that just means each access is syncronized, its
-				// still possible for another thread to cause it to
-				// be cleared, after this thread gets it position.
-				// So, if that happens, all we can do is reset to beginning.
-				// This should be extremely rare (in other words, probably
-				// not worth using synchronized blocks
-				// to access cachedRegionPositionArray.
-				reinitThreadLocalPosition();
-				resetToInitialState();
-			}
-			if (region == null) {
-				region = resetToInitialState();
-			}
-			else
-			// region not null
-			if (region.isDeleted()) {
-				region = resetToInitialState();
-			}
-			return region;
-		}
-
-		private int getThreadLocalPosition() {
-			Object threadLocalObject = threadLocalCachePosition.get();
-			int pos = -1;
-			if (threadLocalObject == null) {
-
-				pos = reinitThreadLocalPosition();
-			}
-			else {
-				pos = ((Integer) threadLocalObject).intValue();
-			}
-			return pos;
-		}
-
-		/**
-		 * @return
-		 */
-		private int reinitThreadLocalPosition() {
-			Integer position;
-			int pos;
-			// TODO_future: think of a better solution that doesn't
-			// require this kludge. This is especially required because
-			// some infrasture, such as reconciler, actually null out
-			// their thread object and recreate it, 500 msecs later
-			// (approximately).
-			// Note: the likely solution in future is to clear after every
-			// heavy use of getCachedRegion, such as in creating node
-			// lists, or reparsing or partioning.
-			if (cachedRegionPositionArray.size() > MAX_SIZE) {
-				cachedRegionPositionArray.clear();
-				if (DEBUG) {
-					System.out.println("cachedRegionPositionArray cleared at size " + MAX_SIZE); //$NON-NLS-1$
-				}
-			}
-			position = new Integer(cachedRegionPositionArray.size());
-			threadLocalCachePosition.set(position);
-			cachedRegionPositionArray.add(position.intValue(), null);
-			pos = position.intValue();
-			return pos;
-		}
-
-		private IStructuredDocumentRegion resetToInitialState() {
-			IStructuredDocumentRegion region;
-			region = getFirstStructuredDocumentRegion();
-			set(region);
-			return region;
-		}
-
-		// TODO: make privite if used, else delete
-		void set(int pos, IStructuredDocumentRegion region) {
-			cachedRegionPositionArray.set(pos, region);
-		}
-
-		void set(IStructuredDocumentRegion region) {
-			try {
-				int pos = getThreadLocalPosition();
-				cachedRegionPositionArray.set(pos, region);
-			}
-			catch (IndexOutOfBoundsException e) {
-				// even though the cachedRegionPosition is synchronized,
-				// that just means each access is syncronized, its
-				// still possible for another thread to cause it to
-				// be cleared, after this thread gets it position.
-				// So, if that happens, all we can do is reset to beginning.
-				// This should be extremely rare (in other words, probably
-				// not worth using synchronized blocks
-				// to access cachedRegionPositionArray.
-				reinitThreadLocalPosition();
-				resetToInitialState();
-			}
-		}
-	}
-
-	/**
-	 * This NullDocumentEvent is used to complete the "aboutToChange" and
-	 * "changed" cycle, when in fact the original change is no longer valid.
-	 * The only known (valid) case of this is when a model re-initialize takes
-	 * place, which causes setText to be called in the middle of some previous
-	 * change. [This architecture will be improved in future].
-	 */
-	public class NullDocumentEvent extends DocumentEvent {
-		public NullDocumentEvent() {
-			this(BasicStructuredDocument.this, 0, 0, ""); //$NON-NLS-1$
-		}
-
-		private NullDocumentEvent(IDocument doc, int offset, int length, String text) {
-			super(doc, offset, length, text);
-		}
-	}
-
-	class RegisteredReplace {
-		/** The owner of this replace operation. */
-		IDocumentListener fOwner;
-		/** The replace operation */
-		IDocumentExtension.IReplace fReplace;
-
-		/**
-		 * Creates a new bundle object.
-		 * 
-		 * @param owner
-		 *            the document listener owning the replace operation
-		 * @param replace
-		 *            the replace operation
-		 */
-		RegisteredReplace(IDocumentListener owner, IDocumentExtension.IReplace replace) {
-			fOwner = owner;
-			fReplace = replace;
-		}
-	}
-
-	/**
-	 * these control variable isn't mark as 'final' since there's some unit
-	 * tests that manipulate it. For final product, it should be.
-	 */
-
-	private static boolean USE_LOCAL_THREAD = true;
-
-	/**
-	 * purely for debugging/performance measurements In practice, would always
-	 * be 'true'. (and should never be called by called by clients). Its not
-	 * 'final' or private just so it can be varied during
-	 * debugging/performance measurement runs.
-	 * 
-	 * @param use_local_thread
-	 */
-	public static void setUSE_LOCAL_THREAD(final boolean use_local_thread) {
-		USE_LOCAL_THREAD = use_local_thread;
-	}
-
-	private IStructuredDocumentRegion cachedDocumentRegion;
-	private EncodingMemento encodingMemento;
-	private boolean fAcceptPostNotificationReplaces = true;
-	private CurrentDocumentRegionCache fCurrentDocumnetRegionCache;
-	private DocumentEvent fDocumentEvent;
-	private IDocumentListener[] fDocumentListeners;
-
-	/**
-	 * The registered document partitioners.
-	 */
-	private Map fDocumentPartitioners;
-	/** The registered document partitioning listeners */
-	private List fDocumentPartitioningListeners;
-	private IStructuredDocumentRegion firstDocumentRegion;
-	private RegionParser fParser;
-	private GenericPositionManager fPositionManager;
-	private List fPostNotificationChanges;
-	private IDocumentListener[] fPrenotifiedDocumentListeners;
-	private int fReentranceCount = 0;
-	private IStructuredTextReParser fReParser;
-	private int fStoppedCount = 0;
-
-	private ITextStore fStore;
-	private Object[] fStructuredDocumentAboutToChangeListeners;
-	private Object[] fStructuredDocumentChangedListeners;
-	private Object[] fStructuredDocumentChangingListeners;
-
-	private List fDocumentRewriteSessionListeners;
-
-	private ILineTracker fTracker;
-	private IStructuredTextUndoManager fUndoManager;
-	private IStructuredDocumentRegion lastDocumentRegion;
-
-	private byte[] listenerLock = new byte[0];
-	private NullDocumentEvent NULL_DOCUMENT_EVENT;
-
-	/**
-	 * Theoretically, a document can contain mixed line delimiters, but the
-	 * user's preference is usually to be internally consistent.
-	 */
-	private String fInitialLineDelimiter;
-	private final String READ_ONLY_REGIONS_CATEGORY = "_READ_ONLY_REGIONS_CATEGORY_"; //$NON-NLS-1$
-	/**
-	 * Current rewrite session, or none if not presently rewriting.
-	 */
-	private DocumentRewriteSession fActiveRewriteSession;
-	/**
-	 * Last modification stamp, automatically updated on change.
-	 */
-	private long fModificationStamp;
-	/**
-	 * Keeps track of next modification stamp.
-	 */
-	private long fNextModificationStamp= IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP;
-	/**
-	 * debug variable only
-	 * 
-	 * @param parser
-	 */
-	private long startStreamTime;
-	/**
-	 * debug variable only
-	 * 
-	 * @param parser
-	 */
-	private long startTime;
-
-	public BasicStructuredDocument() {
-		super();
-		fCurrentDocumnetRegionCache = new CurrentDocumentRegionCache();
-		fStore = new StructuredDocumentTextStore(50, 300);
-		setLineTracker(new DefaultLineTracker());
-		NULL_DOCUMENT_EVENT = new NullDocumentEvent();
-
-		internal_addPositionCategory(READ_ONLY_REGIONS_CATEGORY);
-		internal_addPositionUpdater(new DeleteEqualPositionUpdater(READ_ONLY_REGIONS_CATEGORY));
-
-	}
-
-	/**
-	 * This is the primary way to get a new structuredDocument. Its best to
-	 * use the factory methods in ModelManger to create a new
-	 * IStructuredDocument, since it will get and initialize the parser
-	 * according to the desired content type.
-	 */
-	public BasicStructuredDocument(RegionParser parser) {
-		this();
-		Assert.isNotNull(parser, "Program Error: IStructuredDocument can not be created with null parser"); //$NON-NLS-1$
-		// go through setter in case there is side effects
-		internal_setParser(parser);
-	}
-
-	private void _clearDocumentEvent() {
-		// no hard and fast requirement to null out ... just seems like
-		// a good idea, since we are done with it.
-		fDocumentEvent = null;
-	}
-
-	private void _fireDocumentAboutToChange(Object[] listeners) {
-		// most DocumentAboutToBeChanged listeners do not anticipate
-		// DocumentEvent == null. So make sure documentEvent is not
-		// null. (this should never happen, yet it does sometimes)
-		if (fDocumentEvent == null) {
-			fDocumentEvent = new NullDocumentEvent();
-		}
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (listeners != null) {
-			Object[] holdListeners = listeners;
-			// Note: the docEvent is created in replaceText API
-			// fire
-			for (int i = 0; i < holdListeners.length; i++) {
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					startTime = System.currentTimeMillis();
-				}
-				// safeguard from listeners that throw exceptions
-				try {
-					// this is a safe cast, since addListners requires a
-					// IStructuredDocumentListener
-					((IDocumentListener) holdListeners[i]).documentAboutToBeChanged(fDocumentEvent);
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					long stopTime = System.currentTimeMillis();
-					System.out.println("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	private void notifyDocumentPartitionersAboutToChange(DocumentEvent documentEvent) {
-		if (fDocumentPartitioners != null) {
-			Iterator e = fDocumentPartitioners.values().iterator();
-			while (e.hasNext()) {
-				IDocumentPartitioner p = (IDocumentPartitioner) e.next();
-				// safeguard from listeners that throw exceptions
-				try {
-					p.documentAboutToBeChanged(documentEvent);
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-			}
-		}
-	}
-
-	private void _fireDocumentChanged(Object[] listeners, StructuredDocumentEvent event) {
-
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (listeners != null) {
-			Object[] holdListeners = listeners;
-			// NOTE: document event is created in replace Text API and setText
-			// API
-			// now fire
-			for (int i = 0; i < holdListeners.length; i++) {
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					startTime = System.currentTimeMillis();
-				}
-
-				// safeguard from listeners that throw exceptions
-				try {
-					// this is a safe cast, since addListners requires a
-					// IStructuredDocumentListener
-					// Notes: fDocumentEvent can be "suddenly" null, if one of
-					// the
-					// previous changes
-					// caused a "setText" to be called. The only known case of
-					// this
-					// is a model reset
-					// due to page directive changing. Eventually we should
-					// change
-					// archetecture to have
-					// event que and be able to "cancel" pending events, but
-					// for
-					// now, we'll just pass a
-					// NullDocumentEvent. By the way, it is important to send
-					// something, since clients might
-					// have indeterminant state due to "aboutToChange" being
-					// sent
-					// earlier.
-					if (fDocumentEvent == null) {
-						((IDocumentListener) holdListeners[i]).documentChanged(NULL_DOCUMENT_EVENT);
-					}
-					else {
-						fDocumentEvent.fModificationStamp = getModificationStamp();
-						((IDocumentListener) holdListeners[i]).documentChanged(fDocumentEvent);
-					}
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					long stopTime = System.currentTimeMillis();
-					System.out.println("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	private void notifyDocumentPartitionersDocumentChanged(DocumentEvent documentEvent) {
-		if (fDocumentPartitioners != null) {
-			Iterator e = fDocumentPartitioners.values().iterator();
-			while (e.hasNext()) {
-				IDocumentPartitioner p = (IDocumentPartitioner) e.next();
-				// safeguard from listeners that throw exceptions
-				try {
-					if (p instanceof IDocumentPartitionerExtension) {
-						// IRegion changedPartion =
-						((IDocumentPartitionerExtension) p).documentChanged2(documentEvent);
-					}
-					else {
-						p.documentChanged(documentEvent);
-					}
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-			}
-		}
-	}
-
-
-	private void _fireEvent(Object[] listeners, NoChangeEvent event) {
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (listeners != null) {
-			Object[] holdListeners = listeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					startTime = System.currentTimeMillis();
-				}
-				// safeguard from listeners that throw exceptions
-				try {
-					// this is a safe cast, since addListners requires a
-					// IStructuredDocumentListener
-					((IStructuredDocumentListener) holdListeners[i]).noChange(event);
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					long stopTime = System.currentTimeMillis();
-					System.out.println("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	private void _fireEvent(Object[] listeners, RegionChangedEvent event) {
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (listeners != null) {
-			Object[] holdListeners = listeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					startTime = System.currentTimeMillis();
-				}
-				// safeguard from listeners that throw exceptions
-				try {
-					// this is a safe cast, since addListners requires a
-					// IStructuredDocumentListener
-					((IStructuredDocumentListener) holdListeners[i]).regionChanged(event);
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					long stopTime = System.currentTimeMillis();
-					System.out.println("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	private void _fireEvent(Object[] listeners, RegionsReplacedEvent event) {
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (listeners != null) {
-			Object[] holdListeners = listeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					startTime = System.currentTimeMillis();
-				}
-				// safeguard from listeners that throw exceptions
-				try {
-					// this is a safe cast, since addListners requires a
-					// IStructuredDocumentListener
-					((IStructuredDocumentListener) holdListeners[i]).regionsReplaced(event);
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					long stopTime = System.currentTimeMillis();
-					System.out.println("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	private void _fireEvent(Object[] listeners, StructuredDocumentRegionsReplacedEvent event) {
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (listeners != null) {
-			Object[] holdListeners = listeners;
-			for (int i = 0; i < holdListeners.length; i++) {
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					startTime = System.currentTimeMillis();
-				}
-				// safeguard from listeners that throw exceptions
-				try {
-					// this is a safe cast, since addListners requires a
-					// IStructuredDocumentListener
-					((IStructuredDocumentListener) holdListeners[i]).nodesReplaced(event);
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					long stopTime = System.currentTimeMillis();
-					System.out.println("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	private void _fireStructuredDocumentAboutToChange(Object[] listeners) {
-		// we must assign listeners to local variable, since the add and
-		// remove
-		// listner
-		// methods can change the actual instance of the listener array from
-		// another thread
-		if (listeners != null) {
-			Object[] holdListeners = listeners;
-			// Note: the docEvent is created in replaceText API
-			// fire
-			for (int i = 0; i < holdListeners.length; i++) {
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					startTime = System.currentTimeMillis();
-				}
-				// safeguard from listeners that throw exceptions
-				try {
-					// notice the AboutToBeChangedEvent is created from the
-					// DocumentEvent, since it is (nearly)
-					// the same information. ?What to do about
-					// originalRequester?
-					if (fDocumentEvent == null) {
-						fDocumentEvent = new NullDocumentEvent();
-					}
-					AboutToBeChangedEvent aboutToBeChangedEvent = new AboutToBeChangedEvent(this, null, fDocumentEvent.getText(), fDocumentEvent.getOffset(), fDocumentEvent.getLength());
-					// this is a safe cast, since addListners requires a
-					// IStructuredDocumentListener
-					((IModelAboutToBeChangedListener) holdListeners[i]).modelAboutToBeChanged(aboutToBeChangedEvent);
-				}
-				catch (Exception exception) {
-					Logger.logException(exception);
-				}
-				if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {
-					long stopTime = System.currentTimeMillis();
-					System.out.println("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	protected void acquireLock() {
-		// do nothing here in super class
-	}
-
-	/**
-	 * addModelAboutToBeChangedListener method comment.
-	 */
-	public void addDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener) {
-		synchronized (listenerLock) {
-
-			// make sure listener is not already in listening
-			// (and if it is, print a warning to aid debugging, if needed)
-			if (!Utilities.contains(fStructuredDocumentAboutToChangeListeners, listener)) {
-				int oldSize = 0;
-				if (fStructuredDocumentAboutToChangeListeners != null) {
-					// normally won't be null, but we need to be sure, for
-					// first
-					// time through
-					oldSize = fStructuredDocumentAboutToChangeListeners.length;
-				}
-				int newSize = oldSize + 1;
-				Object[] newListeners = new Object[newSize];
-				if (fStructuredDocumentAboutToChangeListeners != null) {
-					System.arraycopy(fStructuredDocumentAboutToChangeListeners, 0, newListeners, 0, oldSize);
-				}
-				// add listener to last position
-				newListeners[newSize - 1] = listener;
-				//
-				// now switch new for old
-				fStructuredDocumentAboutToChangeListeners = newListeners;
-				//
-			}
-		}
-	}
-
-	/**
-	 * The StructuredDocumentListners and ModelChagnedListeners are very
-	 * similar. They both receive identical events. The difference is the
-	 * timing. The "pure" StructuredDocumentListners are notified after the
-	 * structuredDocument has been changed, but before other, related models
-	 * may have been changed such as the Structural Model. The Structural
-	 * model is in fact itself a "pure" StructuredDocumentListner. The
-	 * ModelChangedListeners can rest assured that all models and data have
-	 * been updated from the change by the tiem they are notified. This is
-	 * especially important for the text widget, for example, which may rely
-	 * on both structuredDocument and structural model information.
-	 */
-	public void addDocumentChangedListener(IStructuredDocumentListener listener) {
-		synchronized (listenerLock) {
-
-			if (Debug.debugStructuredDocument) {
-				System.out.println("IStructuredDocument::addModelChangedListener. Request to add an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$NON-NLS-2$//$NON-NLS-1$
-			}
-			// make sure listener is not already in listening
-			// (and if it is, print a warning to aid debugging, if needed)
-			if (Utilities.contains(fStructuredDocumentChangedListeners, listener)) {
-				if (Debug.displayWarnings) {
-					System.out.println("IStructuredDocument::addModelChangedListener. listener " + listener + " was addeded more than once. "); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-			else {
-				if (Debug.debugStructuredDocument) {
-					System.out.println("IStructuredDocument::addModelChangedListener. Adding an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$NON-NLS-2$//$NON-NLS-1$
-				}
-				int oldSize = 0;
-				if (fStructuredDocumentChangedListeners != null) {
-					// normally won't be null, but we need to be sure, for
-					// first
-					// time through
-					oldSize = fStructuredDocumentChangedListeners.length;
-				}
-				int newSize = oldSize + 1;
-				Object[] newListeners = new Object[newSize];
-				if (fStructuredDocumentChangedListeners != null) {
-					System.arraycopy(fStructuredDocumentChangedListeners, 0, newListeners, 0, oldSize);
-				}
-				// add listener to last position
-				newListeners[newSize - 1] = listener;
-				//
-				// now switch new for old
-				fStructuredDocumentChangedListeners = newListeners;
-				//
-				// when a listener is added,
-				// send the new model event to that one particular listener,
-				// so it
-				// can initialize itself with the current state of the model
-				// listener.newModel(new NewModelEvent(this, listener));
-			}
-		}
-	}
-
-	public void addDocumentChangingListener(IStructuredDocumentListener listener) {
-		synchronized (listenerLock) {
-
-			if (Debug.debugStructuredDocument) {
-				System.out.println("IStructuredDocument::addStructuredDocumentListener. Request to add an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$NON-NLS-2$//$NON-NLS-1$
-			}
-			// make sure listener is not already in listening
-			// (and if it is, print a warning to aid debugging, if needed)
-			if (Utilities.contains(fStructuredDocumentChangingListeners, listener)) {
-				if (Debug.displayWarnings) {
-					System.out.println("IStructuredDocument::addStructuredDocumentListener. listener " + listener + " was addeded more than once. "); //$NON-NLS-2$//$NON-NLS-1$
-				}
-			}
-			else {
-				if (Debug.debugStructuredDocument) {
-					System.out.println("IStructuredDocument::addStructuredDocumentListener. Adding an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$NON-NLS-2$//$NON-NLS-1$
-				}
-				int oldSize = 0;
-				if (fStructuredDocumentChangingListeners != null) {
-					// normally won't be null, but we need to be sure, for
-					// first
-					// time through
-					oldSize = fStructuredDocumentChangingListeners.length;
-				}
-				int newSize = oldSize + 1;
-				Object[] newListeners = new Object[newSize];
-				if (fStructuredDocumentChangingListeners != null) {
-					System.arraycopy(fStructuredDocumentChangingListeners, 0, newListeners, 0, oldSize);
-				}
-				// add listener to last position
-				newListeners[newSize - 1] = listener;
-				//
-				// now switch new for old
-				fStructuredDocumentChangingListeners = newListeners;
-				//
-				// when a listener is added,
-				// send the new model event to that one particular listener,
-				// so it
-				// can initialize itself with the current state of the model
-				// listener.newModel(new NewModelEvent(this, listener));
-			}
-		}
-	}
-
-	/**
-	 * We manage our own document listners, instead of delegating to our
-	 * parentDocument, so we can fire at very end (and not when the
-	 * parentDocument changes).
-	 * 
-	 */
-	public void addDocumentListener(IDocumentListener listener) {
-		synchronized (listenerLock) {
-
-			// make sure listener is not already in listening
-			// (and if it is, print a warning to aid debugging, if needed)
-			if (!Utilities.contains(fDocumentListeners, listener)) {
-				int oldSize = 0;
-				if (fDocumentListeners != null) {
-					// normally won't be null, but we need to be sure, for
-					// first
-					// time through
-					oldSize = fDocumentListeners.length;
-				}
-				int newSize = oldSize + 1;
-				IDocumentListener[] newListeners = null;
-				newListeners = new IDocumentListener[newSize];
-				if (fDocumentListeners != null) {
-					System.arraycopy(fDocumentListeners, 0, newListeners, 0, oldSize);
-				}
-				// add listener to last position
-				newListeners[newSize - 1] = listener;
-				// now switch new for old
-				fDocumentListeners = newListeners;
-			}
-		}
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#addDocumentPartitioningListener(org.eclipse.jface.text.IDocumentPartitioningListener)
-	 * 
-	 * Registers the document partitioning listener with the document. After
-	 * registration the IDocumentPartitioningListener is informed about each
-	 * partition change cause by a document manipulation. If a document
-	 * partitioning listener is also a document listener, the following
-	 * notification sequence is guaranteed if a document manipulation changes
-	 * the document partitioning: 1)
-	 * listener.documentAboutToBeChanged(DocumentEvent); 2)
-	 * listener.documentPartitioningChanged(); 3)
-	 * listener.documentChanged(DocumentEvent); If the listener is already
-	 * registered nothing happens.
-	 * 
-	 * @see IDocumentPartitioningListener
-	 */
-
-	public void addDocumentPartitioningListener(IDocumentPartitioningListener listener) {
-		synchronized (listenerLock) {
-
-			Assert.isNotNull(listener);
-			if (fDocumentPartitioningListeners == null) {
-				fDocumentPartitioningListeners = new ArrayList(1);
-			}
-			if (!fDocumentPartitioningListeners.contains(listener))
-				fDocumentPartitioningListeners.add(listener);
-		}
-	}
-
-	/**
-	 * Adds the position to the document's default position category. The
-	 * default category must be specified by the implementer. A position that
-	 * has been added to a position category is updated at each change applied
-	 * to the document.
-	 * 
-	 * @exception BadLocationException
-	 *                If position is not a valid range in the document
-	 */
-	public void addPosition(Position position) throws BadLocationException {
-		getPositionManager().addPosition(position);
-	}
-
-	/**
-	 * @see IDocument#addPosition
-	 * @exception BadLocationException
-	 *                If position is not a valid range in the document
-	 * @exception BadPositionCategoryException
-	 *                If the category is not defined for the document
-	 */
-	public void addPosition(String category, Position position) throws BadLocationException, BadPositionCategoryException {
-		getPositionManager().addPosition(category, position);
-	}
-
-	/**
-	 * @see IDocument#addPositionCategory
-	 */
-	public void addPositionCategory(String category) {
-		internal_addPositionCategory(category);
-	}
-
-	/**
-	 * @see IDocument#addPositionUpdater
-	 */
-	public void addPositionUpdater(IPositionUpdater updater) {
-		internal_addPositionUpdater(updater);
-	}
-
-	/**
-	 * Adds the given document listener as one which is notified before those
-	 * document listeners added with <code>addDocumentListener</code> are
-	 * notified. If the given listener is also registered using
-	 * <code>addDocumentListener</code> it will be notified twice. If the
-	 * listener is already registered nothing happens.
-	 * <p>
-	 * 
-	 * This method is not for public use, it may only be called by
-	 * implementers of <code>IDocumentAdapter</code> and only if those
-	 * implementers need to implement <code>IDocumentListener</code>.
-	 * 
-	 * @param documentAdapter
-	 *            the listener to be added as prenotified document listener
-	 */
-	public void addPrenotifiedDocumentListener(IDocumentListener documentAdapter) {
-		synchronized (listenerLock) {
-
-			if (fPrenotifiedDocumentListeners != null) {
-				int previousSize = fPrenotifiedDocumentListeners.length;
-				IDocumentListener[] listeners = new IDocumentListener[previousSize + 1];
-				System.arraycopy(fPrenotifiedDocumentListeners, 0, listeners, 0, previousSize);
-				listeners[previousSize] = documentAdapter;
-				fPrenotifiedDocumentListeners = listeners;
-			}
-			else {
-				fPrenotifiedDocumentListeners = new IDocumentListener[1];
-				fPrenotifiedDocumentListeners[0] = documentAdapter;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#charAt(int)
-	 */
-	public char charAt(int arg0) {
-		try {
-			return getChar(0);
-		}
-		catch (BadLocationException e) {
-			throw new IndexOutOfBoundsException();
-		}
-	}
-
-	/**
-	 * This form of the API removes all read only positions, as should be done
-	 * we 'setText' is called. Note: an alternative algorithm may simply
-	 * remove the category (and it would get added back in later, if/when
-	 * readonly regions added.
-	 */
-	private void clearReadOnly() {
-		Position[] positions = null;
-		try {
-			positions = getPositions(READ_ONLY_REGIONS_CATEGORY);
-		}
-		catch (BadPositionCategoryException e) {
-			Logger.logException("program error: should never occur", e); //$NON-NLS-1$
-		}
-		for (int i = 0; i < positions.length; i++) {
-			Position position = positions[i];
-			// note we don't fire the "about to change" or "changed" events,
-			// since presumably, text is all going away and being replaced
-			// anyway.
-			position.delete();
-		}
-	}
-
-
-	public void clearReadOnly(int startOffset, int length) {
-		// TODO DW I still need to implement smarter algorithm that
-		// adust existing RO regions, if needed. For now, I'll just
-		// remove any that overlap.
-		try {
-			Position[] positions = getPositions(READ_ONLY_REGIONS_CATEGORY);
-			for (int i = 0; i < positions.length; i++) {
-				Position position = positions[i];
-				if (position.overlapsWith(startOffset, length)) {
-					String effectedText = this.get(startOffset, length);
-					// fDocumentEvent = new DocumentEvent(this, startOffset,
-					// length, effectedText);
-					fireReadOnlyAboutToBeChanged();
-					position.delete();
-					NoChangeEvent noChangeEvent = new NoChangeEvent(this, null, effectedText, startOffset, length);
-					noChangeEvent.reason = NoChangeEvent.READ_ONLY_STATE_CHANGE;
-					fireReadOnlyStructuredDocumentEvent(noChangeEvent);
-				}
-			}
-		}
-		catch (BadPositionCategoryException e) {
-			// just means no readonly regions been defined yet
-			// so nothing to do.
-		}
-	}
-
-	/**
-	 * Computes the index at which a <code>Position</code> with the
-	 * specified offset would be inserted into the given category. As the
-	 * ordering inside a category only depends on the offset, the index must
-	 * be choosen to be the first of all positions with the same offset.
-	 * 
-	 * @param category
-	 *            the category in which would be added
-	 * @param offset
-	 *            the position offset to be considered
-	 * @return the index into the category
-	 * @exception BadLocationException
-	 *                if offset is invalid in this document
-	 * @exception BadPositionCategoryException
-	 *                if category is undefined in this document
-	 */
-	public int computeIndexInCategory(String category, int offset) throws org.eclipse.jface.text.BadPositionCategoryException, org.eclipse.jface.text.BadLocationException {
-		return getPositionManager().computeIndexInCategory(category, offset);
-	}
-
-	/**
-	 * Computes the number of lines in the given text. For a given implementer
-	 * of this interface this method returns the same result as
-	 * <code>set(text); getNumberOfLines()</code>.
-	 * 
-	 * @param text
-	 *            the text whose number of lines should be computed
-	 * @return the number of lines in the given text
-	 */
-	public int computeNumberOfLines(String text) {
-		return getTracker().computeNumberOfLines(text);
-	}
-
-	/**
-	 * Computes the partitioning of the given document range using the
-	 * document's partitioner.
-	 * 
-	 * @param offset
-	 *            the document offset at which the range starts
-	 * @param length
-	 *            the length of the document range
-	 * @return a specification of the range's partitioning
-	 * @throws BadLocationException
-	 * @throws BadPartitioningException
-	 */
-	public ITypedRegion[] computePartitioning(int offset, int length) throws BadLocationException {
-		ITypedRegion[] typedRegions = null;
-		try {
-			typedRegions = computePartitioning(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, length, false);
-		}
-		catch (BadPartitioningException e) {
-			// impossible in this context
-			throw new Error(e);
-		}
-		if (typedRegions == null) {
-			typedRegions = new ITypedRegion[0];
-		}
-		return typedRegions;
-	}
-
-
-	public ITypedRegion[] computePartitioning(String partitioning, int offset, int length, boolean includeZeroLengthPartitions) throws BadLocationException, BadPartitioningException {
-		if ((0 > offset) || (0 > length) || (offset + length > getLength()))
-			throw new BadLocationException();
-
-		IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);
-
-		if (partitioner instanceof IDocumentPartitionerExtension2)
-			return ((IDocumentPartitionerExtension2) partitioner).computePartitioning(offset, length, includeZeroLengthPartitions);
-		else if (partitioner != null)
-			return partitioner.computePartitioning(offset, length);
-		else if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning))
-			return new TypedRegion[]{new TypedRegion(offset, length, DEFAULT_CONTENT_TYPE)};
-		else
-			throw new BadPartitioningException();
-	}
-
-	/**
-	 * @see IDocument#containsPosition
-	 */
-	public boolean containsPosition(String category, int offset, int length) {
-		return getPositionManager().containsPosition(category, offset, length);
-	}
-
-	/**
-	 * @see IDocument#containsPositionCategory
-	 */
-	public boolean containsPositionCategory(String category) {
-		return getPositionManager().containsPositionCategory(category);
-	}
-
-	public boolean containsReadOnly(int startOffset, int length) {
-		boolean result = false;
-		try {
-			Position[] positions = getPositions(READ_ONLY_REGIONS_CATEGORY);
-			for (int i = 0; i < positions.length; i++) {
-				Position position = positions[i];
-				if (position.overlapsWith(startOffset, length)) {
-					result = true;
-					break;
-				}
-			}
-		}
-		catch (BadPositionCategoryException e) {
-			// just means no readonly regions been defined yet
-			// so obviously false
-			result = false;
-		}
-		return result;
-	}
-
-	private void executePostNotificationChanges() {
-		if (fStoppedCount > 0)
-			return;
-		while (fPostNotificationChanges != null) {
-			List changes = fPostNotificationChanges;
-			fPostNotificationChanges = null;
-			Iterator e = changes.iterator();
-			while (e.hasNext()) {
-				RegisteredReplace replace = (RegisteredReplace) e.next();
-				replace.fReplace.perform(this, replace.fOwner);
-			}
-		}
-	}
-
-	private void fireDocumentAboutToChanged() {
-		// most DocumentAboutToBeChanged listeners do not anticipate
-		// DocumentEvent == null. So make sure documentEvent is not
-		// null. (this should never happen, yet it does sometimes)
-		if (fDocumentEvent == null) {
-			fDocumentEvent = new NullDocumentEvent();
-		}
-
-		_fireStructuredDocumentAboutToChange(fStructuredDocumentAboutToChangeListeners);
-		// Note: the docEvent is created in replaceText API! (or set Text)
-		_fireDocumentAboutToChange(fPrenotifiedDocumentListeners);
-		notifyDocumentPartitionersAboutToChange(fDocumentEvent);
-		_fireDocumentAboutToChange(fDocumentListeners);
-	}
-
-	/**
-	 * Fires the document partitioning changed notification to all registered
-	 * document partitioning listeners. Uses a robust iterator.
-	 * 
-	 * @param event
-	 *            the document partitioning changed event
-	 * 
-	 * @see IDocumentPartitioningListenerExtension2
-	 */
-	protected void fireDocumentPartitioningChanged(DocumentPartitioningChangedEvent event) {
-		if (fDocumentPartitioningListeners == null || fDocumentPartitioningListeners.size() == 0)
-			return;
-
-		List list = new ArrayList(fDocumentPartitioningListeners);
-		Iterator e = list.iterator();
-		while (e.hasNext()) {
-			IDocumentPartitioningListener l = (IDocumentPartitioningListener) e.next();
-			if (l instanceof IDocumentPartitioningListenerExtension2) {
-				IDocumentPartitioningListenerExtension2 extension2 = (IDocumentPartitioningListenerExtension2) l;
-				extension2.documentPartitioningChanged(event);
-			}
-			else if (l instanceof IDocumentPartitioningListenerExtension) {
-				IDocumentPartitioningListenerExtension extension = (IDocumentPartitioningListenerExtension) l;
-				extension.documentPartitioningChanged(this, event.getCoverage());
-			}
-			else {
-				l.documentPartitioningChanged(this);
-			}
-		}
-
-	}
-
-	private void fireReadOnlyAboutToBeChanged() {
-		_fireStructuredDocumentAboutToChange(fStructuredDocumentAboutToChangeListeners);
-		// Note: the docEvent is created in replaceText API! (or set Text)
-		// _fireDocumentAboutToChange(fPrenotifiedDocumentListeners);
-		// _fireDocumentAboutToChange(fDocumentListeners);
-	}
-
-	private void fireReadOnlyStructuredDocumentEvent(NoChangeEvent event) {
-		_fireEvent(fStructuredDocumentChangingListeners, event);
-		_fireEvent(fStructuredDocumentChangedListeners, event);
-		// _fireDocumentChanged(fPrenotifiedDocumentListeners, event);
-		// _fireDocumentChanged(fDocumentListeners, event);
-		// _clearDocumentEvent();
-	}
-
-	private void fireStructuredDocumentEvent(NoChangeEvent event) {
-		_fireEvent(fStructuredDocumentChangingListeners, event);
-		_fireEvent(fStructuredDocumentChangedListeners, event);
-		_fireDocumentChanged(fPrenotifiedDocumentListeners, event);
-		notifyDocumentPartitionersDocumentChanged(event);
-		_fireDocumentChanged(fDocumentListeners, event);
-		_clearDocumentEvent();
-	}
-
-	private void fireStructuredDocumentEvent(RegionChangedEvent event) {
-		_fireEvent(fStructuredDocumentChangingListeners, event);
-		_fireEvent(fStructuredDocumentChangedListeners, event);
-		_fireDocumentChanged(fPrenotifiedDocumentListeners, event);
-		notifyDocumentPartitionersDocumentChanged(event);
-		_fireDocumentChanged(fDocumentListeners, event);
-		_clearDocumentEvent();
-	}
-
-	private void fireStructuredDocumentEvent(RegionsReplacedEvent event) {
-		_fireEvent(fStructuredDocumentChangingListeners, event);
-		_fireEvent(fStructuredDocumentChangedListeners, event);
-		_fireDocumentChanged(fPrenotifiedDocumentListeners, event);
-		notifyDocumentPartitionersDocumentChanged(event);
-		_fireDocumentChanged(fDocumentListeners, event);
-		_clearDocumentEvent();
-	}
-
-	private void fireStructuredDocumentEvent(StructuredDocumentRegionsReplacedEvent event) {
-		_fireEvent(fStructuredDocumentChangingListeners, event);
-		_fireEvent(fStructuredDocumentChangedListeners, event);
-		_fireDocumentChanged(fPrenotifiedDocumentListeners, event);
-		notifyDocumentPartitionersDocumentChanged(event);
-		_fireDocumentChanged(fDocumentListeners, event);
-		_clearDocumentEvent();
-	}
-
-	/**
-	 * Returns the document's complete text.
-	 */
-	public String get() {
-		return getStore().get(0, getLength());
-	}
-
-	/**
-	 * Returns length characters from the document's text starting from the
-	 * specified position.
-	 * 
-	 * @throws BadLocationException
-	 * 
-	 * @exception BadLocationException
-	 *                If the range is not valid in the document
-	 */
-	public String get(int offset, int length) {
-		String result = null;
-		int myLength = getLength();
-		if (0 > offset)
-			offset = 0;
-		if (0 > length)
-			length = 0;
-		if (offset + length > myLength) {
-			// first try adjusting length to fit
-			int lessLength = myLength - offset;
-			if ((lessLength >= 0) && (offset + lessLength == myLength)) {
-				length = lessLength;
-			}
-			else {
-				// second, try offset
-				int moreOffset = myLength - length;
-				if ((moreOffset >= 0) && (moreOffset + length == myLength)) {
-					offset = moreOffset;
-				}
-				else {
-					// can happen if myLength is 0.
-					// no adjustment possible.
-					result = new String();
-				}
-			}
-
-		}
-		if (result == null) {
-			result = getStore().get(offset, length);
-		}
-		return result;
-	}
-
-	public Object getAdapter(Class adapter) {
-		return Platform.getAdapterManager().getAdapter(this, adapter);
-	}
-
-	IStructuredDocumentRegion getCachedDocumentRegion() {
-		IStructuredDocumentRegion result = null;
-		if (USE_LOCAL_THREAD) {
-			result = fCurrentDocumnetRegionCache.get();
-		}
-		else {
-			result = cachedDocumentRegion;
-		}
-		return result;
-	}
-
-	/**
-	 * @see IDocument#getChar
-	 * @exception BadLocationException
-	 *                If position is not a valid range in the document
-	 */
-	public char getChar(int pos) throws BadLocationException {
-		char result = 0x00;
-		try {
-			result = getStore().get(pos);
-		}
-		catch (IndexOutOfBoundsException e) {
-			throw new BadLocationException(e.getLocalizedMessage());
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the type of the document partition containing the given
-	 * character position.
-	 */
-	public String getContentType(int offset) throws BadLocationException {
-		return getDocumentPartitioner().getContentType(offset);
-	}
-
-
-	public String getContentType(String partitioning, int offset, boolean preferOpenPartitions) throws BadLocationException, BadPartitioningException {
-		if ((0 > offset) || (offset > getLength()))
-			throw new BadLocationException();
-
-		IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);
-
-		if (partitioner instanceof IDocumentPartitionerExtension2)
-			return ((IDocumentPartitionerExtension2) partitioner).getContentType(offset, preferOpenPartitions);
-		else if (partitioner != null)
-			return partitioner.getContentType(offset);
-		else if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning))
-			return DEFAULT_CONTENT_TYPE;
-		else
-			throw new BadPartitioningException();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#getDefaultLineDelimiter()
-	 */
-	public String getDefaultLineDelimiter() {
-		
-		String lineDelimiter= null;
-		
-		try {
-			lineDelimiter= getLineDelimiter(0);
-		} catch (BadLocationException x) {
-		}
-	
-		if (lineDelimiter != null)
-			return lineDelimiter;
-
-		if (fInitialLineDelimiter != null)
-			return fInitialLineDelimiter;
-
-		String sysLineDelimiter= System.getProperty("line.separator"); //$NON-NLS-1$
-		String[] delimiters= getLegalLineDelimiters();
-		Assert.isTrue(delimiters.length > 0);
-		for (int i= 0; i < delimiters.length; i++) {
-			if (delimiters[i].equals(sysLineDelimiter)) {
-				lineDelimiter= sysLineDelimiter;
-				break;
-			}
-		}
-		
-		if (lineDelimiter == null)
-			lineDelimiter= delimiters[0];
-	
-		return lineDelimiter;
-		
-	}
-
-	/**
-	 * Returns the document's partitioner.
-	 * 
-	 * @see IDocumentPartitioner
-	 */
-	public IDocumentPartitioner getDocumentPartitioner() {
-		return getDocumentPartitioner(IDocumentExtension3.DEFAULT_PARTITIONING);
-	}
-
-
-	public IDocumentPartitioner getDocumentPartitioner(String partitioning) {
-
-		IDocumentPartitioner documentPartitioner = null;
-		if (fDocumentPartitioners != null) {
-			documentPartitioner = (IDocumentPartitioner) fDocumentPartitioners.get(partitioning);
-		}
-		return documentPartitioner;
-	}
-
-	public EncodingMemento getEncodingMemento() {
-		return encodingMemento;
-	}
-
-	public IStructuredDocumentRegion getFirstStructuredDocumentRegion() {
-		// should we update cachedNode?
-		// We should to keep consistent philosophy of remembering last
-		// requested position,
-		// for efficiency.
-		setCachedDocumentRegion(firstDocumentRegion);
-		return firstDocumentRegion;
-	}
-
-	public IStructuredDocumentRegion getLastStructuredDocumentRegion() {
-		// should we update cachedNode?
-		// We should to keep consistent philosophy of remembering last
-		// requested position,
-		// for efficiency.
-		setCachedDocumentRegion(lastDocumentRegion);
-		return lastDocumentRegion;
-	}
-
-	/*
-	 * -------------------------- partitions
-	 * ----------------------------------
-	 */
-	public String[] getLegalContentTypes() {
-		String[] result = null;
-		try {
-			result = getLegalContentTypes(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING);
-		}
-		catch (BadPartitioningException e) {
-			// impossible in this context
-			throw new Error(e);
-		}
-		return result;
-	}
-
-	public String[] getLegalContentTypes(String partitioning) throws BadPartitioningException {
-		IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);
-		if (partitioner != null)
-			return partitioner.getLegalContentTypes();
-		if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning))
-			return new String[]{DEFAULT_CONTENT_TYPE};
-		throw new BadPartitioningException();
-	}
-
-	/*
-	 * ------------------ line delimiter conversion
-	 * ---------------------------
-	 */
-	public String[] getLegalLineDelimiters() {
-		return getTracker().getLegalLineDelimiters();
-	}
-
-	/**
-	 * @see IDocument#getLength
-	 */
-	public int getLength() {
-		return getStore().getLength();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument#getLineDelimiter()
-	 */
-	public String getLineDelimiter() {
-		return getDefaultLineDelimiter();
-	}
-
-	/**
-	 * Returns the line delimiter of that line
-	 * 
-	 * @exception BadLocationException
-	 *                If the line number is invalid in the document
-	 */
-	public String getLineDelimiter(int line) throws org.eclipse.jface.text.BadLocationException {
-		return getTracker().getLineDelimiter(line);
-	}
-
-	/**
-	 * Returns a description of the specified line. The line is described by
-	 * its offset and its length excluding the line's delimiter.
-	 * 
-	 * @param line
-	 *            the line of interest
-	 * @return a line description
-	 * @exception BadLocationException
-	 *                if the line number is invalid in this document
-	 */
-	public org.eclipse.jface.text.IRegion getLineInformation(int line) throws org.eclipse.jface.text.BadLocationException {
-		return getTracker().getLineInformation(line);
-	}
-
-	/**
-	 * Returns a description of the line at the given offset. The description
-	 * contains the offset and the length of the line excluding the line's
-	 * delimiter.
-	 * 
-	 * @param offset
-	 *            the offset whose line should be described
-	 * @return a region describing the line
-	 * @exception BadLocationException
-	 *                if offset is invalid in this document
-	 */
-	public org.eclipse.jface.text.IRegion getLineInformationOfOffset(int offset) throws org.eclipse.jface.text.BadLocationException {
-		return getTracker().getLineInformationOfOffset(offset);
-	}
-
-	/*
-	 * ---------------------- line information
-	 * --------------------------------
-	 */
-	public int getLineLength(int line) throws org.eclipse.jface.text.BadLocationException {
-		return getTracker().getLineLength(line);
-	}
-
-	/**
-	 * Determines the offset of the first character of the given line.
-	 * 
-	 * @param line
-	 *            the line of interest
-	 * @return the document offset
-	 * @exception BadLocationException
-	 *                if the line number is invalid in this document
-	 */
-	public int getLineOffset(int line) throws org.eclipse.jface.text.BadLocationException {
-		return getTracker().getLineOffset(line);
-	}
-
-	public int getLineOfOffset(int offset) {
-		int result = -1;
-		try {
-			result = getTracker().getLineNumberOfOffset(offset);
-		}
-		catch (BadLocationException e) {
-			if (Logger.DEBUG_DOCUMENT)
-				Logger.log(Logger.INFO, "Dev. Program Info Only: IStructuredDocument::getLineOfOffset: offset out of range, zero assumed. offset = " + offset, e); //$NON-NLS-1$ //$NON-NLS-2$
-			result = 0;
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the number of lines in this document
-	 * 
-	 * @return the number of lines in this document
-	 */
-	public int getNumberOfLines() {
-		return getTracker().getNumberOfLines();
-	}
-
-	/**
-	 * Returns the number of lines which are occupied by a given text range.
-	 * 
-	 * @param offset
-	 *            the offset of the specified text range
-	 * @param length
-	 *            the length of the specified text range
-	 * @return the number of lines occupied by the specified range
-	 * @exception BadLocationException
-	 *                if specified range is invalid in this tracker
-	 */
-	public int getNumberOfLines(int offset, int length) throws org.eclipse.jface.text.BadLocationException {
-		return getTracker().getNumberOfLines(offset, length);
-	}
-
-	/**
-	 * This is public, temporarily, for use by tag lib classes.
-	 */
-	public RegionParser getParser() {
-		if (fParser == null) {
-			throw new IllegalStateException("IStructuredDocument::getParser. Parser needs to be set before use"); //$NON-NLS-1$
-		}
-		return fParser;
-	}
-
-	/**
-	 * Returns the document partition in which the position is located. The
-	 * partition is specified as typed region.
-	 */
-	public ITypedRegion getPartition(int offset) throws BadLocationException {
-		ITypedRegion partition = null;
-		try {
-			partition = getPartition(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, false);
-		}
-		catch (BadPartitioningException e) {
-			throw new Error(e);
-		}
-		if (partition == null) {
-			throw new Error();
-		}
-		return partition;
-	}
-
-
-	public ITypedRegion getPartition(String partitioning, int offset, boolean preferOpenPartitions) throws BadLocationException, BadPartitioningException {
-		if ((0 > offset) || (offset > getLength()))
-			throw new BadLocationException();
-		ITypedRegion result = null;
-
-		IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);
-
-		if (partitioner instanceof IDocumentPartitionerExtension2) {
-			result = ((IDocumentPartitionerExtension2) partitioner).getPartition(offset, preferOpenPartitions);
-		}
-		else if (partitioner != null) {
-			result = partitioner.getPartition(offset);
-		}
-		else if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning)) {
-			result = new TypedRegion(0, getLength(), DEFAULT_CONTENT_TYPE);
-		}
-		else
-			throw new BadPartitioningException();
-		return result;
-	}
-
-
-	public String[] getPartitionings() {
-		if (fDocumentPartitioners == null)
-			return new String[0];
-		String[] partitionings = new String[fDocumentPartitioners.size()];
-		fDocumentPartitioners.keySet().toArray(partitionings);
-		return partitionings;
-	}
-
-	/**
-	 * Returns all position categories added to this document.
-	 */
-	public String[] getPositionCategories() {
-		return getPositionManager().getPositionCategories();
-	}
-
-	/**
-	 * @return Returns the positionManager.
-	 */
-	private GenericPositionManager getPositionManager() {
-		if (fPositionManager == null) {
-			fPositionManager = new GenericPositionManager(this);
-		}
-		return fPositionManager;
-	}
-
-	/**
-	 * Returns all Positions of the given position category.
-	 * 
-	 * @exception BadPositionCategoryException
-	 *                If category is not defined for the document
-	 */
-	public Position[] getPositions(String category) throws org.eclipse.jface.text.BadPositionCategoryException {
-		return getPositionManager().getPositions(category);
-	}
-
-	/**
-	 * @see IDocument#getPositionUpdaters
-	 */
-	public IPositionUpdater[] getPositionUpdaters() {
-		return getPositionManager().getPositionUpdaters();
-	}
-
-	/**
-	 * This method can return null, which is the case if the offset is just
-	 * before or just after the existing text. Compare with
-	 * getNodeAtCharacterOffset.
-	 */
-	public IStructuredDocumentRegion getRegionAtCharacterOffset(int offset) {
-		IStructuredDocumentRegion result = null;
-
-		// FIXME: need to synch on 'cachedRegion' (but since that's a
-		// constantly changing object, we
-		// can't, so need to add a "region_lock" object, and use it here, and
-		// in re-parser.
-		// Oh, and need to make sure, after synch, that the region is not
-		// deleted, and if so, I guess go back
-		// to the beginning!
-
-		// cached node can be null when document is empty
-		IStructuredDocumentRegion potentialCachedRegion = getCachedDocumentRegion();
-		if (potentialCachedRegion != null) {
-
-			// 
-
-			// if we already have the right node, return that.
-			if (potentialCachedRegion.containsOffset(offset)) {
-				result = potentialCachedRegion;
-			}
-			else {
-				// first, find out what direction to go, relative to
-				// cachedNode.
-				// negative means "towards the front" of the file,
-				// postitive
-				// means
-				// towards the end.
-				int direction = offset - potentialCachedRegion.getStart();
-				if (direction < 0) {
-					// search towards beginning
-					while (!potentialCachedRegion.containsOffset(offset)) {
-						IStructuredDocumentRegion tempNode = potentialCachedRegion.getPrevious();
-						if (tempNode == null) {
-							break;
-						}
-						else {
-							potentialCachedRegion = tempNode;
-						}
-					}
-				}
-				else {
-					// search towards end
-					// There is a legitamat condition where the
-					// offset will not be contained in any node,
-					// which is if the offset is just past the last
-					// character of text.
-					// And, we must gaurd against setting cachedNode to
-					// null!
-					while (!potentialCachedRegion.containsOffset(offset)) {
-						IStructuredDocumentRegion tempNode = potentialCachedRegion.getNext();
-						if (tempNode == null)
-							break;
-						else
-							potentialCachedRegion = tempNode;
-					}
-				}
-			}
-			result = potentialCachedRegion;
-		}
-		// just to be doubly sure we never assign null to an already valid
-		// cachedRegion.
-		// I believe any time 'result' is null at this point, that just means
-		// we have an
-		// empty document, and the cachedRegion is already null, but we check
-		// and print
-		// warning, just so during development we be sure we never accidently
-		// break this assumption.
-		if (result != null)
-			setCachedDocumentRegion(result);
-		else if (getCachedDocumentRegion() != null) {
-			throw new IllegalStateException("Program Error: no region could be found to cache, but cache was non null. Indicates corrupted model or region list"); //$NON-NLS-1$
-		}
-
-		return result;
-	}
-
-	public IStructuredDocumentRegionList getRegionList() {
-		CoreNodeList result = null;
-		if (getCachedDocumentRegion() == null)
-			result = new CoreNodeList(null);
-		else
-			result = new CoreNodeList(getFirstStructuredDocumentRegion());
-
-		return result;
-	}
-
-
-	public IStructuredDocumentRegion[] getStructuredDocumentRegions() {
-		return getStructuredDocumentRegions(0, getLength());
-	}
-
-	/**
-	 * <p>
-	 * In the case of 0 length, the <code>IStructuredDocumentRegion</code>
-	 * at the character offset is returened. In other words, the region to the
-	 * right of the caret is returned. except for at the end of the document,
-	 * then the last region is returned.
-	 * </p>
-	 * <p>
-	 * Otherwise all the regions "inbetween" the indicated range are returned,
-	 * including the regions which overlap the region.
-	 * </p>
-	 * 
-	 * <br>
-	 * eg.
-	 * <p>
-	 * <br>
-	 * eg.
-	 * 
-	 * <pre>
-	 *                        &lt;html&gt;[&lt;head&gt;&lt;/head&gt;]&lt;/html&gt; returns &lt;head&gt;,&lt;/head&gt;
-	 * </pre>
-	 *    <pre>
-	 *                        &lt;ht[ml&gt;&lt;head&gt;&lt;/he]ad&gt;&lt;/html&gt; returns &lt;html&gt;,&lt;head&gt;,&lt;/head&gt;
-	 * </pre>
-	 * 
-	 * <pre>
-	 *                          &lt;html&gt;[&lt;head&gt;&lt;/head&gt;]&lt;/html&gt; returns &lt;head&gt;,&lt;/head&gt;
-	 * </pre>
-	 *    <pre>
-	 *                          &lt;ht[ml&gt;&lt;head&gt;&lt;/he]ad&gt;&lt;/html&gt; returns &lt;html&gt;,&lt;head&gt;,&lt;/head&gt;
-	 * </pre>
-	 * 
-	 * </p>
-	 */
-	public IStructuredDocumentRegion[] getStructuredDocumentRegions(int start, int length) {
-
-		if (length < 0)
-			throw new IllegalArgumentException("can't have negative length"); //$NON-NLS-1$
-
-		// this will make the right edge of the range point into the selection
-		// eg. <html>[<head></head>]</html>
-		// will return <head>,</head> instead of <head>,</head>,</html>
-		if (length > 0)
-			length--;
-
-		List results = new ArrayList();
-
-		// start thread safe block
-		try {
-			acquireLock();
-
-			IStructuredDocumentRegion currentRegion = getRegionAtCharacterOffset(start);
-			IStructuredDocumentRegion endRegion = getRegionAtCharacterOffset(start + length);
-			while (currentRegion != endRegion && currentRegion != null) {
-				results.add(currentRegion);
-				currentRegion = currentRegion.getNext();
-			}
-			// need to add that last end region
-			// can be null in the case of an empty document
-			if (endRegion != null)
-				results.add(endRegion);
-		}
-		finally {
-			releaseLock();
-		}
-		// end thread safe block
-
-		return (IStructuredDocumentRegion[]) results.toArray(new IStructuredDocumentRegion[results.size()]);
-	}
-
-	/**
-	 * was made public for easier testing. Normally should never be used by
-	 * client codes.
-	 */
-	public IStructuredTextReParser getReParser() {
-		if (fReParser == null) {
-			fReParser = new StructuredDocumentReParser();
-			fReParser.setStructuredDocument(this);
-		}
-		return fReParser;
-	}
-
-	private ITextStore getStore() {
-		Assert.isNotNull(fStore);
-		return fStore;
-	}
-
-	public String getText() {
-		String result = get();
-		return result;
-	}
-
-	/**
-	 * Returns the document's line tracker. Assumes that the document has been
-	 * initialized with a line tracker.
-	 * 
-	 * @return the document's line tracker
-	 */
-	private ILineTracker getTracker() {
-		Assert.isNotNull(fTracker);
-		return fTracker;
-	}
-
-	public IStructuredTextUndoManager getUndoManager() {
-		if (fUndoManager == null) {
-			fUndoManager = new StructuredTextUndoManager();
-		}
-		return fUndoManager;
-	}
-
-	void initializeFirstAndLastDocumentRegion() {
-		// cached Node must also be first, at the initial point. Only
-		// valid
-		// to call this method right after the first parse.
-		// 
-		// when starting afresh, our cachedNode should be our firstNode,
-		// so be sure to initialize the firstNode
-		firstDocumentRegion = getCachedDocumentRegion();
-		// be sure to use 'getNext' for this initial finding of the last
-		// node,
-		// since the implementation of node.getLastNode may simply call
-		// structuredDocument.getLastStructuredDocumentRegion!
-		IStructuredDocumentRegion aNode = firstDocumentRegion;
-		if (aNode == null) {
-			// defect 254607: to handle empty documents right, if
-			// firstnode is
-			// null, make sure last node is null too
-			lastDocumentRegion = null;
-		}
-		else {
-			while (aNode != null) {
-				lastDocumentRegion = aNode;
-				aNode = aNode.getNext();
-			}
-		}
-	}
-
-	/**
-	 * @see IDocument#insertPositionUpdater
-	 */
-	public void insertPositionUpdater(IPositionUpdater updater, int index) {
-		getPositionManager().insertPositionUpdater(updater, index);
-	}
-
-	private void internal_addPositionCategory(String category) {
-		getPositionManager().addPositionCategory(category);
-	}
-
-	private void internal_addPositionUpdater(IPositionUpdater updater) {
-		getPositionManager().addPositionUpdater(updater);
-	}
-
-	private void internal_setParser(RegionParser newParser) {
-		fParser = newParser;
-	}
-
-	String internalGet(int offset, int length) {
-		String result = null;
-		// int myLength = getLength();
-		// if ((0 > offset) || (0 > length) || (offset + length > myLength))
-		// throw new BadLocationException();
-		result = getStore().get(offset, length);
-		return result;
-	}
-
-	/**
-	 * @param requester
-	 * @param start
-	 * @param replacementLength
-	 * @param changes
-	 * @return
-	 */
-	private StructuredDocumentEvent internalReplaceText(Object requester, int start, int replacementLength, String changes, boolean ignoreReadOnlySettings) {
-		StructuredDocumentEvent result = null;
-
-		stopPostNotificationProcessing();
-		if (changes == null)
-			changes = ""; //$NON-NLS-1$
-		// 
-		if (Debug.debugStructuredDocument)
-			System.out.println(getClass().getName() + "::replaceText(" + start + "," + replacementLength + "," + changes + ")"); //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
-		if (Debug.perfTestStructuredDocumentOnly || Debug.perfTest || Debug.perfTestRawStructuredDocumentOnly) {
-			startStreamTime = System.currentTimeMillis();
-		}
-		try {
-			// Note: event must be computed before 'fire' method called
-			fDocumentEvent = new DocumentEvent(this, start, replacementLength, changes);
-			fireDocumentAboutToChanged();
-
-			try {
-				acquireLock();
-
-				if (!ignoreReadOnlySettings && (containsReadOnly(start, replacementLength))) {
-					NoChangeEvent noChangeEvent = new NoChangeEvent(this, requester, changes, start, replacementLength);
-					noChangeEvent.reason = NoChangeEvent.READ_ONLY_STATE_CHANGE;
-					result = noChangeEvent;
-				}
-				else {
-					result = updateModel(requester, start, replacementLength, changes);
-				}
-			}
-			finally {
-				releaseLock();
-			}
-
-
-			if (Debug.perfTestRawStructuredDocumentOnly || Debug.perfTest) {
-				long stopStreamTime = System.currentTimeMillis();
-				System.out.println("\n\t\t\t\t Time for IStructuredDocument raw replaceText: " + (stopStreamTime - startStreamTime)); //$NON-NLS-1$
-			}
-			if (Debug.debugStructuredDocument) {
-				System.out.println("event type returned by replaceTextWithNoDebuggingThread: " + result); //$NON-NLS-1$
-			}
-		}
-		finally {
-			// FUTURE_TO_DO: implement callback mechanism? to avoid instanceof
-			// and casting
-			// fireStructuredDocumentEvent must be called in order to end
-			// documentAboutToBeChanged state
-
-			// increment modification stamp if modifications were made
-			if (result != null && !(result instanceof NoChangeEvent)) {
-				fModificationStamp++;
-				fNextModificationStamp= Math.max(fModificationStamp, fNextModificationStamp);
-			}
-
-			if (result == null) {
-				// result should not be null, but if an exception was thrown,
-				// it will be
-				// so send a noChangeEvent and log the problem
-				NoChangeEvent noChangeEvent = new NoChangeEvent(this, requester, changes, start, replacementLength);
-				noChangeEvent.reason = NoChangeEvent.NO_EVENT;
-				fireStructuredDocumentEvent(noChangeEvent);
-				Logger.log(Logger.ERROR, "Program Error: invalid structured document event"); //$NON-NLS-1$
-			}
-			else {
-				if (result instanceof RegionChangedEvent) {
-					fireStructuredDocumentEvent((RegionChangedEvent) result);
-				}
-				else {
-					if (result instanceof RegionsReplacedEvent) {
-						fireStructuredDocumentEvent((RegionsReplacedEvent) result);
-					}
-					else {
-						if (result instanceof StructuredDocumentRegionsReplacedEvent) {
-							// probably more efficient to mark old regions as
-							// 'deleted' at the time
-							// that are determined to be deleted, but I'll do
-							// here
-							// in then central spot
-							// for programming ease.
-							updateDeletedFields((StructuredDocumentRegionsReplacedEvent) result);
-							fireStructuredDocumentEvent((StructuredDocumentRegionsReplacedEvent) result);
-						}
-						else {
-							if (result instanceof NoChangeEvent) {
-								fireStructuredDocumentEvent((NoChangeEvent) result);
-							}
-							else {
-								// if here, this means a new event was created
-								// and not handled here
-								// just send a no event until this issue is
-								// resolved.
-								NoChangeEvent noChangeEvent = new NoChangeEvent(this, requester, changes, start, replacementLength);
-								noChangeEvent.reason = NoChangeEvent.NO_EVENT;
-								fireStructuredDocumentEvent(noChangeEvent);
-								Logger.log(Logger.INFO, "Program Error: unexpected structured document event: " + result); //$NON-NLS-1$
-							}
-						}
-					}
-				}
-			}
-			if (Debug.perfTest || Debug.perfTestStructuredDocumentOnly) {
-				long stopStreamTime = System.currentTimeMillis();
-				System.out.println("\n\t\t\t\t Total Time for IStructuredDocument event signaling/processing in replaceText: " + (stopStreamTime - startStreamTime)); //$NON-NLS-1$
-			}
-			resumePostNotificationProcessing();
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#length()
-	 */
-	public int length() {
-
-		return getLength();
-	}
-	
-	public void makeReadOnly(int startOffset, int length) {
-		makeReadOnly(startOffset, length, false, false);
-	}
-
-	public void makeReadOnly(int startOffset, int length, boolean canInsertBefore, boolean canInsertAfter) {	
-		// doesn't make sense to have a readonly region of 0 length,
-		// so we'll ignore those requests
-		if (length <= 0)
-			return;
-		String affectedText = this.get(startOffset, length);
-		// a document event for "read only" change ... must
-		// be followed by "no change" structuredDocument event
-		// fDocumentEvent = new DocumentEvent(this, startOffset, length,
-		// affectedText);
-		fireReadOnlyAboutToBeChanged();
-		// if (containsReadOnly(startOffset, length)) {
-		// adjustReadOnlyRegions(startOffset, length);
-		// } else {
-		// we can blindly add category, since no harm done if already
-		// exists.
-		addPositionCategory(READ_ONLY_REGIONS_CATEGORY);
-		Position newPosition = new ReadOnlyPosition(startOffset, length, canInsertBefore);
-		try {
-			addPosition(READ_ONLY_REGIONS_CATEGORY, newPosition);
-			// FIXME: need to change API to pass in requester, so this event
-			// can be
-			// created correctly, instead of using null.
-			NoChangeEvent noChangeEvent = new NoChangeEvent(this, null, affectedText, startOffset, length);
-			noChangeEvent.reason = NoChangeEvent.READ_ONLY_STATE_CHANGE;
-			fireReadOnlyStructuredDocumentEvent(noChangeEvent);
-		}
-		catch (BadLocationException e) {
-			// for now, log and ignore. Perhaps later we
-			// could adjust to handle some cases?
-			Logger.logException(("could not create readonly region at " + startOffset + " to " + length), e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		catch (BadPositionCategoryException e) {
-			// should never occur, since we add category
-			Logger.logException(e);
-		}
-	}
-
-	public IStructuredDocument newInstance() {
-		IStructuredDocument newInstance = StructuredDocumentFactory.getNewStructuredDocumentInstance(getParser().newInstance());
-		((BasicStructuredDocument) newInstance).setReParser(getReParser().newInstance());
-		if (getDocumentPartitioner() instanceof StructuredTextPartitioner) {
-			newInstance.setDocumentPartitioner(((StructuredTextPartitioner) getDocumentPartitioner()).newInstance());
-			newInstance.getDocumentPartitioner().connect(newInstance);
-		}
-		newInstance.setLineDelimiter(getLineDelimiter());
-		if (getEncodingMemento() != null) {
-			newInstance.setEncodingMemento((EncodingMemento) getEncodingMemento().clone());
-		}
-		return newInstance;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.text.IRegionComparible#regionMatches(int,
-	 *      int, java.lang.String)
-	 */
-	public boolean regionMatches(int offset, int length, String stringToCompare) {
-		boolean result = false;
-		ITextStore store = getStore();
-		if (store instanceof IRegionComparible) {
-			result = ((IRegionComparible) store).regionMatches(offset, length, stringToCompare);
-		}
-		else {
-			result = get(offset, length).equals(stringToCompare);
-		}
-		return result;
-	}
-
-	public boolean regionMatchesIgnoreCase(int offset, int length, String stringToCompare) {
-		boolean result = false;
-		ITextStore store = getStore();
-		if (store instanceof IRegionComparible) {
-			result = ((IRegionComparible) store).regionMatchesIgnoreCase(offset, length, stringToCompare);
-		}
-		else {
-			result = get(offset, length).equalsIgnoreCase(stringToCompare);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#registerPostNotificationReplace(org.eclipse.jface.text.IDocumentListener,
-	 *      org.eclipse.jface.text.IDocumentExtension.IReplace)
-	 */
-	public void registerPostNotificationReplace(IDocumentListener owner, IDocumentExtension.IReplace replace) {
-		if (fAcceptPostNotificationReplaces) {
-			if (fPostNotificationChanges == null)
-				fPostNotificationChanges = new ArrayList(1);
-			fPostNotificationChanges.add(new RegisteredReplace(owner, replace));
-		}
-	}
-
-	protected void releaseLock() {
-		// do nothing here in super class
-	}
-
-	public void removeDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener) {
-		synchronized (listenerLock) {
-
-			if ((fStructuredDocumentAboutToChangeListeners != null) && (listener != null)) {
-				// if its not in the listeners, we'll ignore the request
-				if (Utilities.contains(fStructuredDocumentAboutToChangeListeners, listener)) {
-					int oldSize = fStructuredDocumentAboutToChangeListeners.length;
-					int newSize = oldSize - 1;
-					Object[] newListeners = new Object[newSize];
-					int index = 0;
-					for (int i = 0; i < oldSize; i++) {
-						if (fStructuredDocumentAboutToChangeListeners[i] == listener) { // ignore
-						}
-						else {
-							// copy old to new if its not the one we are
-							// removing
-							newListeners[index++] = fStructuredDocumentAboutToChangeListeners[i];
-						}
-					}
-					// now that we have a new array, let's switch it for the
-					// old
-					// one
-					fStructuredDocumentAboutToChangeListeners = newListeners;
-				}
-			}
-		}
-	}
-
-	/**
-	 * removeModelChangedListener method comment.
-	 */
-	public void removeDocumentChangedListener(IStructuredDocumentListener listener) {
-		synchronized (listenerLock) {
-
-			if ((fStructuredDocumentChangedListeners != null) && (listener != null)) {
-				// if its not in the listeners, we'll ignore the request
-				if (Utilities.contains(fStructuredDocumentChangedListeners, listener)) {
-					int oldSize = fStructuredDocumentChangedListeners.length;
-					int newSize = oldSize - 1;
-					Object[] newListeners = new Object[newSize];
-					int index = 0;
-					for (int i = 0; i < oldSize; i++) {
-						if (fStructuredDocumentChangedListeners[i] == listener) { // ignore
-						}
-						else {
-							// copy old to new if its not the one we are
-							// removing
-							newListeners[index++] = fStructuredDocumentChangedListeners[i];
-						}
-					}
-					// now that we have a new array, let's switch it for the
-					// old
-					// one
-					fStructuredDocumentChangedListeners = newListeners;
-				}
-			}
-		}
-	}
-
-	public void removeDocumentChangingListener(IStructuredDocumentListener listener) {
-		synchronized (listenerLock) {
-
-			if ((fStructuredDocumentChangingListeners != null) && (listener != null)) {
-				// if its not in the listeners, we'll ignore the request
-				if (Utilities.contains(fStructuredDocumentChangingListeners, listener)) {
-					int oldSize = fStructuredDocumentChangingListeners.length;
-					int newSize = oldSize - 1;
-					Object[] newListeners = new Object[newSize];
-					int index = 0;
-					for (int i = 0; i < oldSize; i++) {
-						if (fStructuredDocumentChangingListeners[i] == listener) { // ignore
-						}
-						else {
-							// copy old to new if its not the one we are
-							// removing
-							newListeners[index++] = fStructuredDocumentChangingListeners[i];
-						}
-					}
-					// now that we have a new array, let's switch it for the
-					// old
-					// one
-					fStructuredDocumentChangingListeners = newListeners;
-				}
-			}
-		}
-	}
-
-	public void removeDocumentListener(IDocumentListener listener) {
-		synchronized (listenerLock) {
-
-			if ((fDocumentListeners != null) && (listener != null)) {
-				// if its not in the listeners, we'll ignore the request
-				if (Utilities.contains(fDocumentListeners, listener)) {
-					int oldSize = fDocumentListeners.length;
-					int newSize = oldSize - 1;
-					IDocumentListener[] newListeners = new IDocumentListener[newSize];
-					int index = 0;
-					for (int i = 0; i < oldSize; i++) {
-						if (fDocumentListeners[i] == listener) { // ignore
-						}
-						else {
-							// copy old to new if its not the one we are
-							// removing
-							newListeners[index++] = fDocumentListeners[i];
-						}
-					}
-					// now that we have a new array, let's switch it for the
-					// old
-					// one
-					fDocumentListeners = newListeners;
-				}
-			}
-		}
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#removeDocumentPartitioningListener(org.eclipse.jface.text.IDocumentPartitioningListener)
-	 */
-	public void removeDocumentPartitioningListener(IDocumentPartitioningListener listener) {
-		synchronized (listenerLock) {
-
-			Assert.isNotNull(listener);
-			if (fDocumentPartitioningListeners != null)
-				fDocumentPartitioningListeners.remove(listener);
-		}
-	}
-
-	/**
-	 * Removes the given <code>Position</code> from the document's default
-	 * position category. The default position category is to be defined by
-	 * the implementers. If the position is not part of the document's default
-	 * category nothing happens.
-	 */
-	public void removePosition(Position position) {
-		getPositionManager().removePosition(position);
-	}
-
-	/**
-	 * @see IDocument#removePosition
-	 * @exception BadPositionCategoryException
-	 *                If the category is not defined for the document
-	 */
-	public void removePosition(String category, Position position) throws BadPositionCategoryException {
-		getPositionManager().removePosition(category, position);
-	}
-
-	/**
-	 * @see IDocument#removePositionCategory
-	 * @exception BadPositionCategoryException
-	 *                If the category is not defined for the document
-	 */
-	public void removePositionCategory(String category) throws BadPositionCategoryException {
-		getPositionManager().removePositionCategory(category);
-	}
-
-	/**
-	 * @see IDocument#removePositionUpdater
-	 */
-	public void removePositionUpdater(IPositionUpdater updater) {
-		getPositionManager().removePositionUpdater(updater);
-	}
-
-	/**
-	 * Removes the given document listener from teh document's list of
-	 * prenotified document listeners. If the listener is not registered with
-	 * the document nothing happens.
-	 * <p>
-	 * 
-	 * This method is not for public use, it may only be called by
-	 * implementers of <code>IDocumentAdapter</code> and only if those
-	 * implementers need to implement <code>IDocumentListener</code>.
-	 * 
-	 * @param documentAdapter
-	 *            the listener to be removed
-	 * 
-	 * @see #addPrenotifiedDocumentListener(IDocumentListener)
-	 */
-	public void removePrenotifiedDocumentListener(org.eclipse.jface.text.IDocumentListener documentAdapter) {
-		synchronized (listenerLock) {
-
-			if (Utilities.contains(fPrenotifiedDocumentListeners, documentAdapter)) {
-				int previousSize = fPrenotifiedDocumentListeners.length;
-				if (previousSize > 1) {
-					IDocumentListener[] listeners = new IDocumentListener[previousSize - 1];
-					int previousIndex = 0;
-					int newIndex = 0;
-					while (previousIndex < previousSize) {
-						if (fPrenotifiedDocumentListeners[previousIndex] != documentAdapter)
-							listeners[newIndex++] = fPrenotifiedDocumentListeners[previousIndex];
-						previousIndex++;
-					}
-					fPrenotifiedDocumentListeners = listeners;
-				}
-				else {
-					fPrenotifiedDocumentListeners = null;
-				}
-			}
-		}
-	}
-
-	/**
-	 * This method is for INTERNAL USE ONLY and is NOT API.
-	 * 
-	 * Rebuilds the StructuredDocumentRegion chain from the existing text.
-	 * FileBuffer support does not allow clients to know the document's
-	 * location before the text contents are set.
-	 * 
-	 * @see set(String)
-	 */
-	public void reparse(Object requester) {
-		stopPostNotificationProcessing();
-		clearReadOnly();
-
-		acquireLock();
-		try {
-			CharSequenceReader subSetTextStoreReader = new CharSequenceReader((CharSequence) getStore(), 0, getStore().getLength());
-			resetParser(subSetTextStoreReader, 0);
-			//
-			setCachedDocumentRegion(getParser().getDocumentRegions());
-			// when starting afresh, our cachedNode should be our firstNode,
-			// so be sure to initialize the firstNode and lastNode
-			initializeFirstAndLastDocumentRegion();
-			StructuredDocumentRegionIterator.setParentDocument(getCachedDocumentRegion(), this);
-		}
-		finally {
-			releaseLock();
-		}
-
-		resumePostNotificationProcessing();
-	}
-
-	/**
-	 * @see IDocument#replace
-	 * @exception BadLocationException
-	 *                If position is not a valid range in the document
-	 */
-	public void replace(int pos, int length, String string) throws BadLocationException {
-		if (Debug.displayWarnings) {
-			System.out.println("Note: IStructuredDocument::replace(int, int, String) .... its better to use replaceText(source, string, int, int) API for structuredDocument updates"); //$NON-NLS-1$
-		}
-		replaceText(this, pos, length, string);
-	}
-
-	/**
-	 * Replace the text with "newText" starting at position "start" for a
-	 * length of "replaceLength".
-	 * <p>
-	 * 
-	 * @param start
-	 *            start offset of text to replace None of the offsets include
-	 *            delimiters of preceeding lines. Offset 0 is the first
-	 *            character of the document.
-	 * @param replaceLength
-	 *            start offset of text to replace
-	 * @param newText
-	 *            start offset of text to replace
-	 *            <p>
-	 *            Implementors have to notify TextChanged listeners after the
-	 *            content has been updated. The TextChangedEvent should be set
-	 *            as follows:
-	 * 
-	 * event.type = SWT.TextReplaced event.start = start of the replaced text
-	 * event.numReplacedLines = number of replaced lines event.numNewLines =
-	 * number of new lines event.replacedLength = length of the replaced text
-	 * event.newLength = length of the new text
-	 * 
-	 * NOTE: numNewLines is the number of inserted lines and numReplacedLines
-	 * is the number of deleted lines based on the change that occurs
-	 * visually. For example:
-	 * 
-	 * replacedText newText numReplacedLines numNewLines "" "\n" 0 1 "\n\n"
-	 * "a" 2 0 "a" "\n\n" 0 2
-	 */
-	/**
-	 * One of the APIs to manipulate the IStructuredDocument in terms of text.
-	 */
-	public StructuredDocumentEvent replaceText(Object requester, int start, int replacementLength, String changes) {
-		return replaceText(requester, start, replacementLength, changes, false);
-	}
-
-	public StructuredDocumentEvent replaceText(Object requester, int start, int replacementLength, String changes, boolean ignoreReadOnlySettings) {
-		long modificationStamp;
-		
-		if (replacementLength == 0 && (changes == null || changes.length() == 0))
-			modificationStamp = getModificationStamp();
-		else
-			modificationStamp = getNextModificationStamp();
-		
-		return replaceText(requester, start, replacementLength, changes, ignoreReadOnlySettings, modificationStamp);
-	}
-	
-	private StructuredDocumentEvent replaceText(Object requester, int start, int replacementLength, String changes, boolean ignoreReadOnlySettings, long modificationStamp) {
-		StructuredDocumentEvent event = internalReplaceText(requester, start, replacementLength, changes, ignoreReadOnlySettings);
-		fModificationStamp = modificationStamp;
-		fNextModificationStamp= Math.max(fModificationStamp, fNextModificationStamp);
-		return event;
-	}
-
-	void resetParser(int startOffset, int endOffset) {
-
-		RegionParser parser = getParser();
-		ITextStore textStore = getStore();
-		if (textStore instanceof CharSequence) {
-			CharSequenceReader subSetTextStoreReader = new CharSequenceReader((CharSequence) textStore, startOffset, endOffset - startOffset);
-			parser.reset(subSetTextStoreReader, startOffset);
-		}
-		else {
-			String newNodeText = get(startOffset, endOffset - startOffset);
-			parser.reset(newNodeText, startOffset);
-
-		}
-
-	}
-
-	void resetParser(Reader reader, int startOffset) {
-		RegionParser parser = getParser();
-		parser.reset(reader, startOffset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#resumePostNotificationProcessing()
-	 */
-	public void resumePostNotificationProcessing() {
-		--fStoppedCount;
-		if (fStoppedCount == 0 && fReentranceCount == 0)
-			executePostNotificationChanges();
-	}
-
-	/**
-	 * @deprecated in superclass in 3.0 - use a FindReplaceDocumentAdapter
-	 *             directly
-	 * @see IDocument#search
-	 */
-	public int search(int startPosition, String findString, boolean forwardSearch, boolean caseSensitive, boolean wholeWord) throws BadLocationException {
-		// (dmw) I added this warning, to know if still being used. I'm not
-		// sure it
-		// works as expected any longer.
-		// but the warning should be removed, once know.
-		Logger.log(Logger.INFO, "WARNING: using unsupported deprecated method 'search'"); //$NON-NLS-1$
-		int offset = -1;
-		IRegion match = new FindReplaceDocumentAdapter(this).find(startPosition, findString, forwardSearch, caseSensitive, wholeWord, false);
-		if (match != null) {
-			offset = match.getOffset();
-		}
-		return offset;
-	}
-
-	/**
-	 * @see IDocument#setText
-	 */
-	public void set(String string) {
-		if (Debug.displayInfo) {
-			System.out.println("Note: IStructuredDocument::setText(String) .... its better to use setText(source, string) API for structuredDocument updates"); //$NON-NLS-1$
-		}
-		setText(null, string);
-	}
-
-	/**
-	 * This may be marked public, but should be packaged protected, once
-	 * refactoring is complete (in other words, not for client use).
-	 */
-	public void setCachedDocumentRegion(IStructuredDocumentRegion structuredRegion) {
-		if (USE_LOCAL_THREAD) {
-			fCurrentDocumnetRegionCache.set(structuredRegion);
-		}
-		else {
-			cachedDocumentRegion = structuredRegion;
-		}
-	}
-
-	/**
-	 * Sets the document's partitioner.
-	 * 
-	 * @see IDocumentPartitioner
-	 */
-	public void setDocumentPartitioner(IDocumentPartitioner partitioner) {
-		setDocumentPartitioner(IDocumentExtension3.DEFAULT_PARTITIONING, partitioner);
-	}
-
-
-	public void setDocumentPartitioner(String partitioning, IDocumentPartitioner partitioner) {
-		if (partitioner == null) {
-			if (fDocumentPartitioners != null) {
-				fDocumentPartitioners.remove(partitioning);
-				if (fDocumentPartitioners.size() == 0)
-					fDocumentPartitioners = null;
-			}
-		}
-		else {
-			if (fDocumentPartitioners == null)
-				fDocumentPartitioners = new HashMap();
-			fDocumentPartitioners.put(partitioning, partitioner);
-		}
-		DocumentPartitioningChangedEvent event = new DocumentPartitioningChangedEvent(this);
-		event.setPartitionChange(partitioning, 0, getLength());
-		fireDocumentPartitioningChanged(event);
-	}
-
-	public void setEncodingMemento(EncodingMemento encodingMemento) {
-		this.encodingMemento = encodingMemento;
-	}
-
-	void setFirstDocumentRegion(IStructuredDocumentRegion region) {
-		firstDocumentRegion = region;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#setInitialLineDelimiter(java.lang.String)
-	 */
-	public void setInitialLineDelimiter(String lineDelimiter) {
-		// make sure our preferred delimiter is
-		// one of the legal ones
-		if (Utilities.containsString(getLegalLineDelimiters(), lineDelimiter)) {
-			fInitialLineDelimiter= lineDelimiter;
-		}
-		else {
-			if (Logger.DEBUG_DOCUMENT)
-				Logger.log(Logger.INFO, "Attempt to set linedelimiter to non-legal delimiter"); //$NON-NLS-1$ //$NON-NLS-2$
-			fInitialLineDelimiter = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, System.getProperty("line.separator"), new IScopeContext[] { new InstanceScope() });//$NON-NLS-1$
-		}
-	}
-
-	void setLastDocumentRegion(IStructuredDocumentRegion region) {
-		lastDocumentRegion = region;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument#setLineDelimiter(java.lang.String)
-	 */
-	public void setLineDelimiter(String delimiter) {
-		setInitialLineDelimiter(delimiter);
-	}
-
-	/**
-	 * Sets the document's line tracker. Must be called at the beginning of
-	 * the constructor.
-	 * 
-	 * @param tracker
-	 *            the document's line tracker
-	 */
-	private void setLineTracker(ILineTracker tracker) {
-		fTracker = tracker;
-	}
-
-	public void setParser(RegionParser newParser) {
-		internal_setParser(newParser);
-	}
-
-	/**
-	 * @param positionManager
-	 *            The positionManager to set.
-	 */
-	// TODO: make private is needed, else remove
-	void setPositionManager(GenericPositionManager positionManager) {
-		fPositionManager = positionManager;
-	}
-
-	/**
-	 * 
-	 */
-	public void setReParser(IStructuredTextReParser newReParser) {
-		fReParser = newReParser;
-		if (fReParser != null) {
-			fReParser.setStructuredDocument(this);
-		}
-	}
-
-	/**
-	 * One of the APIs to manipulate the IStructuredDocument in terms of text.
-	 */
-	public StructuredDocumentEvent setText(Object requester, String theString) {
-		StructuredDocumentEvent result = null;
-
-		result = replaceText(requester, 0, getLength(), theString, true, getNextModificationStamp());
-
-		return result;
-	}
-
-	/**
-	 * Sets the document's text store. Must be called at the beginning of the
-	 * constructor.
-	 * 
-	 * @param store
-	 *            the document's text store
-	 */
-	private void setTextStore(ITextStore store) {
-		fStore = store;
-	}
-
-	public void setUndoManager(IStructuredTextUndoManager undoManager) {
-
-		// if the undo manager has already been set, then
-		// fail fast, since changing the undo manager will lead
-		// to unusual results (or at least loss of undo stack).
-		if (fUndoManager != null && fUndoManager != undoManager) {
-			throw new IllegalArgumentException("can not change undo manager once its been set"); //$NON-NLS-1$
-		}
-		else {
-			fUndoManager = undoManager;
-		}
-	}
-
-
-	public void startSequentialRewrite(boolean normalized) {
-		ITextStore store = new SequentialRewriteTextStore(getStore());
-		setTextStore(store);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#stopPostNotificationProcessing()
-	 */
-	public void stopPostNotificationProcessing() {
-		++fStoppedCount;
-	}
-
-
-	public void stopSequentialRewrite() {
-		if (getStore() instanceof SequentialRewriteTextStore) {
-			SequentialRewriteTextStore srws = (SequentialRewriteTextStore) getStore();
-			ITextStore source = srws.getSourceStore();
-			setTextStore(source);
-			srws.dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#subSequence(int, int)
-	 */
-	public CharSequence subSequence(int arg0, int arg1) {
-		return get(arg0, arg1);
-	}
-
-	/**
-	 * @param result
-	 */
-	private void updateDeletedFields(StructuredDocumentRegionsReplacedEvent event) {
-		IStructuredDocumentRegionList oldRegions = event.getOldStructuredDocumentRegions();
-		for (int i = 0; i < oldRegions.getLength(); i++) {
-			IStructuredDocumentRegion structuredDocumentRegion = oldRegions.item(i);
-			structuredDocumentRegion.setDeleted(true);
-		}
-
-	}
-
-	/**
-	 * Called by re-parser. Note: this method may be "public" but should only
-	 * be called by re-parsers in the right circumstances.
-	 */
-	public void updateDocumentData(int start, int lengthToReplace, String changes) {
-		stopPostNotificationProcessing();
-		getStore().replace(start, lengthToReplace, changes);
-		try {
-			getTracker().replace(start, lengthToReplace, changes);
-		}
-
-		catch (BadLocationException e) {
-			// should be impossible here, but will log for now
-			Logger.logException(e);
-		}
-		if (fPositionManager != null) {
-			fPositionManager.updatePositions(new DocumentEvent(this, start, lengthToReplace, changes));
-		}
-		fModificationStamp++;
-		fNextModificationStamp= Math.max(fModificationStamp, fNextModificationStamp);
-		resumePostNotificationProcessing();
-	}
-
-	private StructuredDocumentEvent updateModel(Object requester, int start, int lengthToReplace, String changes) {
-		StructuredDocumentEvent result = null;
-		IStructuredTextReParser reParser = getReParser();
-		// initialize the IStructuredTextReParser with the standard data
-		// that's
-		// always needed
-		reParser.initialize(requester, start, lengthToReplace, changes);
-		result = reParser.reparse();
-		// if result is null at this point, then there must be an error, since
-		// even if there
-		// was no change (either disallow due to readonly, or a person pasted
-		// the same thing
-		// they had selected) then a "NoChange" event should have been fired.
-		Assert.isNotNull(result, "no structuredDocument event was created in IStructuredDocument::updateStructuredDocument"); //$NON-NLS-1$
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument#getPreferredLineDelimiter()
-	 */
-	public String getPreferredLineDelimiter() {
-		return getDefaultLineDelimiter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument#setPreferredLineDelimiter(java.lang.String)
-	 */
-	public void setPreferredLineDelimiter(String probableLineDelimiter) {
-		setInitialLineDelimiter(probableLineDelimiter);
-
-	}
-
-
-	/**
-	 * Class which implements the rewritable session for the SSE.
-	 * 
-	 */
-	class StructuredDocumentRewriteSession extends DocumentRewriteSession {
-
-		/**
-		 * Creates a new session.
-		 * 
-		 * @param sessionType
-		 *            the type of this session
-		 */
-		protected StructuredDocumentRewriteSession(DocumentRewriteSessionType sessionType) {
-			super(sessionType);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#startRewriteSession(org.eclipse.jface.text.DocumentRewriteSessionType)
-	 */
-	public DocumentRewriteSession startRewriteSession(DocumentRewriteSessionType sessionType) throws IllegalStateException {
-		// delegate to sub-class, so UI threading is handled correctly
-		return internalStartRewriteSession(sessionType);
-	}
-
-	/**
-	 * NOT-API. Final protected so clients may call this method if needed, but
-	 * cannot override.
-	 * 
-	 * @param sessionType
-	 * @return
-	 * @throws IllegalStateException
-	 */
-	final protected DocumentRewriteSession internalStartRewriteSession(DocumentRewriteSessionType sessionType) throws IllegalStateException {
-		if (getActiveRewriteSession() != null)
-			throw new IllegalStateException("already in a rewrite session");
-
-		DocumentRewriteSession session = new StructuredDocumentRewriteSession(sessionType);
-		DocumentRewriteSessionEvent event = new DocumentRewriteSessionEvent(this, session, DocumentRewriteSessionEvent.SESSION_START);
-		fireDocumentRewriteSessionEvent(event);
-
-		ILineTracker tracker = getTracker();
-		if (tracker instanceof ILineTrackerExtension) {
-			ILineTrackerExtension extension = (ILineTrackerExtension) tracker;
-			extension.startRewriteSession(session);
-		}
-
-		startRewriteSessionOnPartitioners(session);
-
-		if (DocumentRewriteSessionType.SEQUENTIAL == sessionType)
-			startSequentialRewrite(false);
-		else if (DocumentRewriteSessionType.STRICTLY_SEQUENTIAL == sessionType)
-			startSequentialRewrite(true);
-
-		fActiveRewriteSession = session;
-		return session;
-	}
-
-	/**
-	 * Starts the given rewrite session.
-	 *
-	 * @param session the rewrite session
-	 * @since 2.0
-	 */
-	final void startRewriteSessionOnPartitioners(DocumentRewriteSession session) {
-		if (fDocumentPartitioners != null) {
-			Iterator e= fDocumentPartitioners.values().iterator();
-			while (e.hasNext()) {
-				Object partitioner= e.next();
-				if (partitioner instanceof IDocumentPartitionerExtension3) {
-					IDocumentPartitionerExtension3 extension= (IDocumentPartitionerExtension3) partitioner;
-					extension.startRewriteSession(session);
-				}
-			}
-		}
-	}
-
-
-	public void stopRewriteSession(DocumentRewriteSession session) {
-		// delegate to sub-class, so UI threading is handled correctly
-		internalStopRewriteSession(session);
-	}
-
-	/**
-	 * NOT-API. Final protected so clients may call this method if needed, but
-	 * cannot override.
-	 * 
-	 * @param session
-	 */
-	final protected void internalStopRewriteSession(DocumentRewriteSession session) {
-		if (fActiveRewriteSession == session) {
-			DocumentRewriteSessionType sessionType = session.getSessionType();
-			if (DocumentRewriteSessionType.SEQUENTIAL == sessionType || DocumentRewriteSessionType.STRICTLY_SEQUENTIAL == sessionType)
-				stopSequentialRewrite();
-
-			stopRewriteSessionOnPartitioners(session);
-
-			ILineTracker tracker = getTracker();
-			if (tracker instanceof ILineTrackerExtension) {
-				ILineTrackerExtension extension = (ILineTrackerExtension) tracker;
-				extension.stopRewriteSession(session, get());
-			}
-
-			DocumentRewriteSessionEvent event = new DocumentRewriteSessionEvent(this, session, DocumentRewriteSessionEvent.SESSION_STOP);
-			fireDocumentRewriteSessionEvent(event);
-			fActiveRewriteSession = null;
-		}
-	}
-
-	/**
-	 * Stops the given rewrite session.
-	 *
-	 * @param session the rewrite session
-	 * @since 2.0
-	 */
-	final void stopRewriteSessionOnPartitioners(DocumentRewriteSession session) {
-		if (fDocumentPartitioners != null) {
-			DocumentPartitioningChangedEvent event= new DocumentPartitioningChangedEvent(this);
-			Iterator e= fDocumentPartitioners.keySet().iterator();
-			while (e.hasNext()) {
-				String partitioning= (String) e.next();
-				IDocumentPartitioner partitioner= (IDocumentPartitioner) fDocumentPartitioners.get(partitioning);
-				if (partitioner instanceof IDocumentPartitionerExtension3) {
-					IDocumentPartitionerExtension3 extension= (IDocumentPartitionerExtension3) partitioner;
-					extension.stopRewriteSession(session);
-					event.setPartitionChange(partitioning, 0, getLength());
-				}
-			}
-			if (!event.isEmpty())
-				fireDocumentPartitioningChanged(event);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#getActiveRewriteSession()
-	 */
-	public DocumentRewriteSession getActiveRewriteSession() {
-		return fActiveRewriteSession;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#addDocumentRewriteSessionListener(org.eclipse.jface.text.IDocumentRewriteSessionListener)
-	 */
-	public void addDocumentRewriteSessionListener(IDocumentRewriteSessionListener listener) {
-		synchronized (listenerLock) {
-			Assert.isNotNull(listener);
-			if (fDocumentRewriteSessionListeners == null) {
-				fDocumentRewriteSessionListeners = new ArrayList(1);
-			}
-			if (!fDocumentRewriteSessionListeners.contains(listener))
-				fDocumentRewriteSessionListeners.add(listener);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#removeDocumentRewriteSessionListener(org.eclipse.jface.text.IDocumentRewriteSessionListener)
-	 */
-	public void removeDocumentRewriteSessionListener(IDocumentRewriteSessionListener listener) {
-		synchronized (listenerLock) {
-
-			Assert.isNotNull(listener);
-			if (fDocumentRewriteSessionListeners != null)
-				fDocumentRewriteSessionListeners.remove(listener);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#replace(int, int,
-	 *      java.lang.String, long)
-	 */
-	public void replace(int offset, int length, String text, long modificationStamp) throws BadLocationException {
-		replaceText(this, offset, length, text, false, modificationStamp);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#set(java.lang.String,
-	 *      long)
-	 */
-	public void set(String text, long modificationStamp) {
-		// bug 151069 - overwrite read only regions when setting entire document
-		 replaceText(null, 0, getLength(), text, true, modificationStamp);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension4#getModificationStamp()
-	 */
-	public long getModificationStamp() {
-		return fModificationStamp;
-	}
-	
-	private long getNextModificationStamp() {
-		if (fNextModificationStamp == Long.MAX_VALUE || fNextModificationStamp == IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP)
-			fNextModificationStamp= 0;
-		else
-			fNextModificationStamp= fNextModificationStamp + 1;
-
-		return fNextModificationStamp;
-	}
-
-	/**
-	 * Fires an event, as specified, to the associated listeners.
-	 * 
-	 * @param event
-	 *            The event to fire, either a start or stop event.
-	 */
-	private void fireDocumentRewriteSessionEvent(DocumentRewriteSessionEvent event) {
-		if (fDocumentRewriteSessionListeners == null || fDocumentRewriteSessionListeners.size() == 0)
-			return;
-
-		List list = new ArrayList(fDocumentRewriteSessionListeners);
-		Iterator e = list.iterator();
-		while (e.hasNext()) {
-			IDocumentRewriteSessionListener l = (IDocumentRewriteSessionListener) e.next();
-			l.documentRewriteSessionChanged(event);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/BasicStructuredDocumentRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/BasicStructuredDocumentRegion.java
deleted file mode 100644
index 624956f..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/BasicStructuredDocumentRegion.java
+++ /dev/null
@@ -1,599 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-import org.eclipse.wst.sse.core.internal.util.Debug;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-
-
-public class BasicStructuredDocumentRegion implements IStructuredDocumentRegion {
-	private static final String TEXT_STORE_NOT_ASSIGNED = "text store not assigned yet"; //$NON-NLS-1$
-	private static final String UNDEFINED = "org.eclipse.wst.sse.core.structuredDocument.UNDEFINED"; //$NON-NLS-1$
-
-	private ITextRegionList _regions;
-	/**
-	 * has this region been removed from its document
-	 */
-	private static final byte MASK_IS_DELETED = 1;
-	/**
-	 * was this region terminated normally
-	 */
-	private static final byte MASK_IS_ENDED = 1 << 1;
-
-	private byte fIsDeletedOrEnded = 0;
-
-	/**
-	 * allow a pointer back to this nodes model
-	 */
-	private IStructuredDocument fParentDocument;
-	
-	protected int fLength;
-	private IStructuredDocumentRegion next = null;
-	private IStructuredDocumentRegion previous = null;
-	protected int start;
-
-	public BasicStructuredDocumentRegion() {
-		super();
-		_regions = new TextRegionListImpl();
-
-	}
-
-	/**
-	 * Even inside-this class uses of 'regions' should use this method, as
-	 * this is where (soft) memory management/reparsing, etc., will be
-	 * centralized.
-	 */
-	private ITextRegionList _getRegions() {
-
-		return _regions;
-	}
-
-	public void addRegion(ITextRegion aRegion) {
-		_getRegions().add(aRegion);
-	}
-
-	public void adjust(int i) {
-		start += i;
-	}
-
-	public void adjustLength(int i) {
-		fLength += i;
-	}
-
-	public void adjustStart(int i) {
-		start += i;
-	}
-
-	public void adjustTextLength(int i) {
-		// not supported
-
-	}
-
-	public boolean containsOffset(int i) {
-
-		return getStartOffset() <= i && i < getEndOffset();
-	}
-
-	public boolean containsOffset(ITextRegion containedRegion, int offset) {
-		return getStartOffset(containedRegion) <= offset && offset < getEndOffset(containedRegion);
-	}
-
-	public void equatePositions(ITextRegion region) {
-		start = region.getStart();
-		fLength = region.getLength();
-	}
-
-	/**
-	 * getEnd and getEndOffset are the same only for
-	 * IStructuredDocumentRegions
-	 */
-	public int getEnd() {
-		return start + fLength;
-	}
-
-	/**
-	 * getEnd and getEndOffset are the same only for
-	 * IStructuredDocumentRegions
-	 */
-	public int getEndOffset() {
-		return getEnd();
-	}
-
-	public int getEndOffset(ITextRegion containedRegion) {
-		return getStartOffset(containedRegion) + containedRegion.getLength();
-	}
-
-	public ITextRegion getFirstRegion() {
-		if (_getRegions() == null)
-			return null;
-		return _getRegions().get(0);
-	}
-
-	public String getFullText() {
-		String result = ""; //$NON-NLS-1$
-		try {
-			result = getParentDocument().get(start, fLength);
-		}
-		catch (BadLocationException e) {
-			// log for now, unless we find reason not to
-			Logger.log(Logger.INFO, e.getMessage());
-		}
-		return result;
-	}
-
-	public String getFullText(ITextRegion aRegion) {
-		String result = ""; //$NON-NLS-1$
-		try {
-			int regionStart = aRegion.getStart();
-			int regionLength = aRegion.getLength();
-			result = fParentDocument.get(start + regionStart, regionLength);
-		}
-		catch (BadLocationException e) {
-			// log for now, unless we find reason not to
-			Logger.log(Logger.INFO, e.getMessage());
-		}
-		return result;
-	}
-
-	public String getFullText(String context) {
-		// DMW: looping is faster than enumeration,
-		// so switched around 2/12/03
-		// Enumeration e = getRegions().elements();
-		ITextRegion region = null;
-		String result = ""; //$NON-NLS-1$
-		int length = getRegions().size();
-		for (int i = 0; i < length; i++) {
-			region = getRegions().get(i);
-			if (region.getType() == context)
-				result += getFullText(region);
-		}
-		return result;
-	}
-
-	public ITextRegion getLastRegion() {
-		if (_getRegions() == null)
-			return null;
-		return _getRegions().get(_getRegions().size() - 1);
-	}
-
-	public int getLength() {
-		return fLength;
-	}
-
-	public IStructuredDocumentRegion getNext() {
-		return next;
-	}
-
-	public int getNumberOfRegions() {
-		return _getRegions().size();
-	}
-
-	public IStructuredDocument getParentDocument() {
-
-		return fParentDocument;
-	}
-
-	public IStructuredDocumentRegion getPrevious() {
-		return previous;
-	}
-
-	/**
-	 * The parameter offset refers to the overall offset in the document.
-	 */
-	public ITextRegion getRegionAtCharacterOffset(int offset) {
-		ITextRegion result = null;
-		if (_getRegions() != null) {
-			// transform the requested offset to the "scale" that
-			// regions are stored in, which are all relative to the
-			// start point.
-			// int transformedOffset = offset - getStartOffset();
-			//
-			int length = getRegions().size();
-			for (int i = 0; i < length; i++) {
-				ITextRegion region = getRegions().get(i);
-				if (Debug.debugStructuredDocument) {
-					System.out.println("region(s) in IStructuredDocumentRegion::getRegionAtCharacterOffset: " + region); //$NON-NLS-1$
-					System.out.println("       requested offset: " + offset); //$NON-NLS-1$
-					// System.out.println(" transformedOffset: " +
-					// transformedOffset); //$NON-NLS-1$
-					System.out.println("       region start: " + region.getStart()); //$NON-NLS-1$
-					System.out.println("       region end: " + region.getEnd()); //$NON-NLS-1$
-					System.out.println("       region type: " + region.getType()); //$NON-NLS-1$
-					System.out.println("       region class: " + region.getClass()); //$NON-NLS-1$
-
-				}
-				if ((getStartOffset(region) <= offset) && (offset < getEndOffset(region))) {
-					result = region;
-					break;
-				}
-			}
-		}
-		return result;
-	}
-
-	public ITextRegionList getRegions() {
-		return _getRegions();
-	}
-
-	/**
-	 * getStart and getStartOffset are the same only for
-	 * IStrucutredDocumentRegions
-	 */
-	public int getStart() {
-		return start;
-	}
-
-	/**
-	 * getStart and getStartOffset are the same only for
-	 * IStrucutredDocumentRegions
-	 */
-	public int getStartOffset() {
-		return getStart();
-	}
-
-	public int getStartOffset(ITextRegion containedRegion) {
-		// assert: containedRegion can not be null
-		// (might be performance hit if literally put in assert call,
-		// but containedRegion can not be null). Needs to be checked
-		// by calling code.
-		return getStartOffset() + containedRegion.getStart();
-	}
-
-	public String getText() {
-		String result = null;
-		try {
-			if (fParentDocument == null) {
-				// likely to happen during inspecting
-				result = TEXT_STORE_NOT_ASSIGNED;
-			}
-			else {
-				result = fParentDocument.get(start, fLength);
-			}
-		}
-		catch (BadLocationException e) {
-			// log for now, unless we find reason not to
-			Logger.log(Logger.INFO, e.getMessage());
-		}
-		return result;
-	}
-
-	public String getText(ITextRegion aRegion) {
-		// assert: aRegion can not be null
-		// (might be performance hit if literally put in assert call,
-		// but aRegion can not be null). Needs to be checked
-		// by calling code.
-		try {
-			return fParentDocument.get(this.getStartOffset(aRegion), aRegion.getTextLength());
-		}
-		catch (BadLocationException e) {
-			Logger.logException(e);
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the text of the first region with the matching context type
-	 */
-	public String getText(String context) {
-		// DMW: looping is faster than enumeration,
-		// so switched around 2/12/03
-		// Enumeration e = getRegions().elements();
-		ITextRegion region = null;
-		String result = ""; //$NON-NLS-1$
-		int length = getRegions().size();
-		for (int i = 0; i < length; i++) {
-			region = getRegions().get(i);
-			if (region.getType() == context) {
-				result = getText(region);
-				break;
-			}
-		}
-		return result;
-	}
-
-	public int getTextEnd() {
-		return start + fLength;
-	}
-
-	/**
-	 * @return int
-	 */
-	public int getTextEndOffset() {
-		ITextRegion region = _getRegions().get(_getRegions().size() - 1);
-		return getStartOffset() + region.getTextEnd();
-	}
-
-	public int getTextEndOffset(ITextRegion containedRegion) {
-		return getStartOffset(containedRegion) + containedRegion.getTextLength();
-	}
-
-	public int getTextLength() {
-		return fLength;
-	}
-
-	/**
-	 * Provides the type of IStructuredDocumentRegion ... not to be confused
-	 * with type of XML node! This is subclassed, if something other than type
-	 * of first region is desired.
-	 * 
-	 */
-	public String getType() {
-		String result = UNDEFINED;
-		ITextRegionList subregions = getRegions();
-		if (subregions != null && subregions.size() > 0) {
-			ITextRegion firstRegion = subregions.get(0);
-			if (firstRegion != null) {
-				result = firstRegion.getType();
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.text.IStructuredDocumentRegion#isDeleted()
-	 */
-	public boolean isDeleted() {
-		return (fIsDeletedOrEnded & MASK_IS_DELETED) != 0 || (fParentDocument == null);
-	}
-
-	/**
-	 * 
-	 * @return boolean
-	 */
-	public boolean isEnded() {
-		return (fIsDeletedOrEnded & MASK_IS_ENDED) != 0;
-	}
-
-	public boolean sameAs(IStructuredDocumentRegion region, int shift) {
-		boolean result = false;
-		// if region == null, we return false;
-		if (region != null) {
-			// if the regions are the same instance, they are equal
-			if (this == region) {
-				result = true;
-			}
-			else {
-				// this is the non-trivial part
-				// note: we change for type first, then start offset and end
-				// offset,
-				// since that would decide many cases right away and avoid the
-				// text comparison
-				if (getType() == region.getType()) {
-					if (sameOffsetsAs(region, shift) && sameTextAs(region, shift)) {
-						result = true;
-					}
-				}
-
-			}
-		}
-		return result;
-	}
-
-	public boolean sameAs(ITextRegion oldRegion, IStructuredDocumentRegion newDocumentRegion, ITextRegion newRegion, int shift) {
-		boolean result = false;
-		// if any region is null, we return false (even if both are!)
-		if ((oldRegion != null) && (newRegion != null)) {
-			// if the regions are the same instance, they are equal
-			if (oldRegion == newRegion) {
-				result = true;
-			}
-			else {
-				// this is the non-trivial part
-				// note: we change for type first, then start offset and end
-				// offset,
-				// since that would decide many cases right away and avoid the
-				// text comparison
-				if (oldRegion.getType() == newRegion.getType()) {
-					if (sameOffsetsAs(oldRegion, newDocumentRegion, newRegion, shift)) {
-						if (sameTextAs(oldRegion, newDocumentRegion, newRegion, shift)) {
-							result = true;
-						}
-					}
-				}
-			}
-
-		}
-
-		return result;
-	}
-
-	private boolean sameOffsetsAs(IStructuredDocumentRegion region, int shift) {
-		if (getStartOffset() == region.getStartOffset() - shift) {
-			if (getEndOffset() == region.getEndOffset() - shift) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean sameOffsetsAs(ITextRegion oldRegion, IStructuredDocumentRegion documentRegion, ITextRegion newRegion, int shift) {
-		if (getStartOffset(oldRegion) == documentRegion.getStartOffset(newRegion) - shift) {
-			if (getEndOffset(oldRegion) == documentRegion.getEndOffset(newRegion) - shift) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean sameTextAs(IStructuredDocumentRegion region, int shift) {
-		boolean result = false;
-		try {
-			if (getText().equals(region.getText())) {
-				result = true;
-			}
-		}
-		// ISSUE: we should not need this
-		catch (StringIndexOutOfBoundsException e) {
-			result = false;
-		}
-
-		return result;
-	}
-
-	private boolean sameTextAs(ITextRegion oldRegion, IStructuredDocumentRegion documentRegion, ITextRegion newRegion, int shift) {
-		boolean result = false;
-
-		if (getText(oldRegion).equals(documentRegion.getText(newRegion))) {
-			result = true;
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.text.IStructuredDocumentRegion#setDelete(boolean)
-	 */
-	public void setDeleted(boolean isDeleted) {
-		fIsDeletedOrEnded = (byte) (isDeleted ? fIsDeletedOrEnded | MASK_IS_DELETED : 0);
-	}
-
-	/**
-	 * 
-	 * @param newHasEnd
-	 *            boolean
-	 */
-	public void setEnded(boolean newHasEnd) {
-		fIsDeletedOrEnded = (byte) (newHasEnd ? fIsDeletedOrEnded | MASK_IS_ENDED : 0);
-	}
-
-	public void setLength(int newLength) {
-		// textLength = newLength;
-		fLength = newLength;
-	}
-
-	public void setNext(IStructuredDocumentRegion newNext) {
-		next = newNext;
-	}
-
-	public void setParentDocument(IStructuredDocument document) {
-		fParentDocument = document;
-
-	}
-
-	public void setPrevious(IStructuredDocumentRegion newPrevious) {
-		previous = newPrevious;
-	}
-
-	public void setRegions(ITextRegionList containedRegions) {
-		_regions = containedRegions;
-	}
-
-	public void setStart(int newStart) {
-		start = newStart;
-	}
-
-	public String toString() {
-		// NOTE: if the document held by any region has been updated and the
-		// region offsets have not
-		// yet been updated, the output from this method invalid.
-		// Also note, this method can not be changed, without "breaking"
-		// unit tests, since some of them compare current results to previous
-		// results.
-		String result = null;
-		result = "[" + getStart() + ", " + getEnd() + "] (" + getText() + ")"; //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
-		return result;
-	}
-
-	private void updateDownStreamRegions(ITextRegion changedRegion, int lengthDifference) {
-		int listLength = _getRegions().size();
-		int startIndex = 0;
-		// first, loop through to find index of where to start
-		for (int i = 0; i < listLength; i++) {
-			ITextRegion region = _getRegions().get(i);
-			if (region == changedRegion) {
-				startIndex = i;
-				break;
-			}
-		}
-		// now, beginning one past the one that was changed, loop
-		// through to end of list, adjusting the start postions.
-		startIndex++;
-		for (int j = startIndex; j < listLength; j++) {
-			ITextRegion region = _getRegions().get(j);
-			region.adjustStart(lengthDifference);
-		}
-	}
-
-	public StructuredDocumentEvent updateRegion(Object requester, IStructuredDocumentRegion structuredDocumentRegion, String changes, int requestStart, int lengthToReplace) {
-		StructuredDocumentEvent result = null;
-		int lengthDifference = Utilities.calculateLengthDifference(changes, lengthToReplace);
-		// Get the region pointed to by the requestStart postion, and give
-		// that region a chance to effect
-		// the update.
-		ITextRegion region = getRegionAtCharacterOffset(requestStart);
-		// if there is no region, then the requested changes must come right
-		// after the
-		// node (and right after the last region). This happens, for example,
-		// when someone
-		// types something at the end of the document, or more commonly, when
-		// they are right
-		// at the beginning of one node, and the dirty start is therefore
-		// calculated to be the
-		// previous node.
-		// So, in this case, we'll give the last region a chance to see if it
-		// wants to
-		// swallow the requested changes -- but only for inserts -- deletes
-		// and "replaces"
-		// should be reparsed if they are in these border regions, and only if
-		// the
-		if ((region == null) && (lengthToReplace == 0)) {
-			region = _getRegions().get(_getRegions().size() - 1);
-			// make sure the region is contiguous
-			if (getEndOffset(region) == requestStart) {
-				result = region.updateRegion(requester, this, changes, requestStart, lengthToReplace);
-			}
-		}
-		else {
-			if (region != null) {
-				//
-				// If the requested change spans more than one region, then
-				// we don't give the region a chance to update.
-				if ((containsOffset(region, requestStart)) && (containsOffset(region, requestStart + lengthToReplace))) {
-					result = region.updateRegion(requester, this, changes, requestStart, lengthToReplace);
-				}
-			}
-		}
-		// if result is not null, then we need to update the start and end
-		// postions of the regions that follow this one
-		// if result is null, then apply the flatnode specific checks on what
-		// it can change
-		// (i.e. more than one region, but no change to the node itself)
-		if (result != null) {
-			// That is, a region decided it could handle the change and
-			// created
-			// a region changed event.
-			Assert.isTrue(result instanceof RegionChangedEvent, "Program Error"); //$NON-NLS-1$
-			updateDownStreamRegions(((RegionChangedEvent) result).getRegion(), lengthDifference);
-			// PLUS, we need to update our own node end point (length)
-			setLength(getLength() + lengthDifference);
-		}
-
-		return result;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/CharSequenceReader.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/CharSequenceReader.java
deleted file mode 100644
index 6ab29b5..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/CharSequenceReader.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import java.io.IOException;
-import java.io.Reader;
-
-public class CharSequenceReader extends Reader {
-	private int fCurrentPosition;
-	private int fMaximumReadOffset;
-
-	private CharSequence fOriginalSource;
-
-	/**
-	 *  
-	 */
-	CharSequenceReader() {
-		super();
-	}
-
-
-	public CharSequenceReader(CharSequence originalSource, int offset, int length) {
-		// ISSUE: should we "fail fast" if requested length is more than there
-		// is?
-		fOriginalSource = originalSource;
-		int startOffset = offset;
-		int maxRequestedOffset = startOffset + length;
-		int maxPossibleOffset = 0 + originalSource.length();
-		fMaximumReadOffset = Math.min(maxRequestedOffset, maxPossibleOffset);
-
-		fCurrentPosition = startOffset;
-
-	}
-
-	/**
-	 * @param lockObject
-	 */
-	CharSequenceReader(Object lockObject) {
-		super(lockObject);
-		// for thread safety, may need to add back locking mechanism
-		// in our custom constructor. This constructor left here just
-		// for a reminder.
-	}
-
-	public void close() throws IOException {
-		// nothing to do when we close
-		// (may be to eventually "unlock" or null out some varibles
-		// just for hygene.
-		// or, perhaps if already closed once throw IOException? for
-		// consistency?
-	}
-
-	/**
-	 * @return Returns the originalSource.
-	 * @deprecated - only temporarily public, should be 'default' eventually
-	 *             or go away altogether.
-	 */
-	public CharSequence getOriginalSource() {
-		return fOriginalSource;
-	}
-
-	public int read() {
-		int result = -1;
-		if (fCurrentPosition < fMaximumReadOffset) {
-			result = fOriginalSource.charAt(fCurrentPosition++);
-		}
-		return result;
-	}
-
-	/**
-	 * Read characters into a portion of an array. This method will block
-	 * until some input is available, an I/O error occurs, or the end of the
-	 * stream is reached.
-	 * 
-	 * @param cbuf
-	 *            Destination buffer
-	 * @param off
-	 *            Offset at which to start storing characters
-	 * @param len
-	 *            Maximum number of characters to read
-	 * 
-	 * @return The number of characters read, or -1 if the end of the stream
-	 *         has been reached
-	 * 
-	 * @exception IOException
-	 *                If an I/O error occurs
-	 */
-
-	public int read(char[] cbuf, int off, int len) throws IOException {
-		int charsToRead = -1;
-		// if already over max, just return -1
-		// remember, currentPosition is what is getting ready to be read
-		// (that is, its already been incremented in read()).
-		if (fCurrentPosition < fMaximumReadOffset) {
-
-
-			int buffMaxToRead = cbuf.length - off;
-			int minRequested = Math.min(buffMaxToRead, len);
-			int lengthRemaining = fMaximumReadOffset - fCurrentPosition;
-			charsToRead = Math.min(minRequested, lengthRemaining);
-
-
-			CharSequence seq = fOriginalSource.subSequence(fCurrentPosition, fCurrentPosition + charsToRead);
-			// for now, hard assumption that original is a String since source
-			// is assumed to be document, or text store
-			String seqString = (String) seq;
-			seqString.getChars(0, seqString.length(), cbuf, off);
-
-
-
-			fCurrentPosition = fCurrentPosition + charsToRead;
-
-
-		}
-		return charsToRead;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/CoreNodeList.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/CoreNodeList.java
deleted file mode 100644
index 6acd927..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/CoreNodeList.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-
-
-import java.util.Enumeration;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
-
-
-public class CoreNodeList implements IStructuredDocumentRegionList {
-	int countedLength;
-	int currentIndex = -1;
-
-	IStructuredDocumentRegion[] flatNodes;
-	IStructuredDocumentRegion head;
-
-	/**
-	 * CoreNodeList constructor comment.
-	 */
-	public CoreNodeList() {
-		super();
-		// create an array, even if zero length
-		flatNodes = new IStructuredDocumentRegion[0];
-	}
-
-	public CoreNodeList(IStructuredDocumentRegion newHead) {
-		super();
-		// save head
-		head = newHead;
-		int count = 0;
-		IStructuredDocumentRegion countNode = newHead;
-		// we have to go through the list once, to get its
-		// length in order to create the array
-		while (countNode != null) {
-			count++;
-			countNode = countNode.getNext();
-		}
-		// create an array, even if zero length
-		flatNodes = new IStructuredDocumentRegion[count];
-		// start countNode over again, so to speak.
-		countNode = newHead;
-		count = 0;
-		while (countNode != null) {
-			flatNodes[count++] = countNode;
-			countNode = countNode.getNext();
-		}
-		if (count > 0) {
-			currentIndex = 0;
-			// else it stays at -1 initialized at object creation
-			//
-			// save length
-			countedLength = count;
-		}
-	}
-
-	public CoreNodeList(IStructuredDocumentRegion start, IStructuredDocumentRegion end) {
-		super();
-		// save head
-		head = start;
-		int count = 0;
-		IStructuredDocumentRegion countNode = start;
-		if ((start == null) || (end == null)) {
-			// error condition
-			//throw new IllegalArgumentException("Must provide start and end
-			// nodes to construct CoreNodeList");
-		} else {
-			count = 1;
-			while ((countNode != null) && (countNode != end)) {
-				count++;
-				countNode = countNode.getNext();
-			}
-		}
-		// if we ended because the last one was null,
-		// backup one.
-		if (countNode == null)
-			count--;
-		if (count < 0) {
-			count = 0;
-		}
-		flatNodes = new IStructuredDocumentRegion[count];
-		if (count > 0) {
-			flatNodes[0] = countNode = start;
-			for (int i = 1; i < count; i++) {
-				flatNodes[i] = flatNodes[i - 1].getNext();
-			}
-
-		}
-		currentIndex = 0;
-		countedLength = count;
-	}
-
-	public Enumeration elements() {
-		StructuredDocumentRegionEnumeration result = null;
-		if ((flatNodes != null) && (flatNodes.length > 0))
-			result = new StructuredDocumentRegionEnumeration(flatNodes[0], flatNodes[flatNodes.length - 1]);
-		else
-			result = new StructuredDocumentRegionEnumeration(null);
-		return result;
-	}
-
-	public int getLength() {
-		return flatNodes.length;
-	}
-
-	public boolean includes(Object o) {
-		if (flatNodes == null)
-			return false;
-		for (int i = 0; i < flatNodes.length; i++)
-			if (flatNodes[i] == o)
-				return true;
-		return false;
-	}
-
-	public IStructuredDocumentRegion item(int i) {
-		return flatNodes[i];
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/DeleteEqualPositionUpdater.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/DeleteEqualPositionUpdater.java
deleted file mode 100644
index e33783e..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/DeleteEqualPositionUpdater.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.DefaultPositionUpdater;
-
-/**
- * Follows the behavior of DefaultPositionUpdater except in addition to
- * deleting/overwriting text which completely contains the position deletes
- * the position, deleting text that equals the text in position also deletes
- * the position.
- * 
- * @see org.eclipse.jface.text.DefaultPositionUpdater
- */
-public class DeleteEqualPositionUpdater extends DefaultPositionUpdater {
-
-	/**
-	 * @param category
-	 */
-	public DeleteEqualPositionUpdater(String category) {
-		super(category);
-	}
-
-	/**
-	 * Determines whether the currently investigated position has been deleted
-	 * by the replace operation specified in the current event. If so, it
-	 * deletes the position and removes it from the document's position
-	 * category.
-	 * 
-	 * NOTE: position is deleted if current event completely overwrites
-	 * position OR if current event deletes the area surrounding/including the
-	 * position
-	 * 
-	 * @return <code>true</code> if position has been deleted
-	 */
-	protected boolean notDeleted() {
-		// position is deleted if current event completely overwrites position
-		// OR if
-		// current event deletes the area surrounding/including the position
-		if ((fOffset < fPosition.offset && (fPosition.offset + fPosition.length < fOffset + fLength)) || (fOffset <= fPosition.offset && (fPosition.offset + fPosition.length <= fOffset + fLength) && fReplaceLength == 0)) {
-
-			fPosition.delete();
-
-			try {
-				fDocument.removePosition(getCategory(), fPosition);
-			} catch (BadPositionCategoryException x) {
-			}
-
-			return false;
-		}
-
-		return true;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/GenericPositionManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/GenericPositionManager.java
deleted file mode 100644
index 0a422a3..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/GenericPositionManager.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-
-package org.eclipse.wst.sse.core.internal.text;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.DefaultPositionUpdater;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IPositionUpdater;
-import org.eclipse.jface.text.Position;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-
-/**
- * Based on the Position management methods from
- * org.eclipse.jface.text.AbstractDocument
- */
-
-public class GenericPositionManager {
-	private CharSequence fCharSequence;
-
-
-
-	private Map fPositions;
-	/** All registered document position updaters */
-	private List fPositionUpdaters;
-
-	/**
-	 * don't allow instantiation with out document pointer
-	 * 
-	 */
-	private GenericPositionManager() {
-		super();
-	}
-
-	/**
-	 * 
-	 */
-	public GenericPositionManager(CharSequence charSequence) {
-		this();
-		// we only use charSequence for "length", to
-		// made more generic than "document" even "text store"
-		fCharSequence = charSequence;
-		completeInitialization();
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#addPosition(org.eclipse.jface.text.Position)
-	 */
-	public void addPosition(Position position) throws BadLocationException {
-		try {
-			addPosition(IDocument.DEFAULT_CATEGORY, position);
-		}
-		catch (BadPositionCategoryException e) {
-		}
-	}
-
-
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#addPosition(java.lang.String,
-	 *      org.eclipse.jface.text.Position)
-	 */
-	public synchronized void addPosition(String category, Position position) throws BadLocationException, BadPositionCategoryException {
-
-		if ((0 > position.offset) || (0 > position.length) || (position.offset + position.length > getDocumentLength()))
-			throw new BadLocationException();
-
-		if (category == null)
-			throw new BadPositionCategoryException();
-
-		List list = (List) fPositions.get(category);
-		if (list == null)
-			throw new BadPositionCategoryException();
-
-		list.add(computeIndexInPositionList(list, position.offset), position);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#addPositionCategory(java.lang.String)
-	 */
-	public void addPositionCategory(String category) {
-
-		if (category == null)
-			return;
-
-		if (!containsPositionCategory(category))
-			fPositions.put(category, new ArrayList());
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#addPositionUpdater(org.eclipse.jface.text.IPositionUpdater)
-	 */
-	public void addPositionUpdater(IPositionUpdater updater) {
-		insertPositionUpdater(updater, fPositionUpdaters.size());
-	}
-
-
-	/**
-	 * Initializes document listeners, positions, and position updaters. Must
-	 * be called inside the constructor after the implementation plug-ins have
-	 * been set.
-	 */
-	protected void completeInitialization() {
-
-		fPositions = new HashMap();
-		fPositionUpdaters = new ArrayList();
-
-		addPositionCategory(IDocument.DEFAULT_CATEGORY);
-		addPositionUpdater(new DefaultPositionUpdater(IDocument.DEFAULT_CATEGORY));
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#computeIndexInCategory(java.lang.String,
-	 *      int)
-	 */
-	public int computeIndexInCategory(String category, int offset) throws BadLocationException, BadPositionCategoryException {
-
-		if (0 > offset || offset > getDocumentLength())
-			throw new BadLocationException();
-
-		List c = (List) fPositions.get(category);
-		if (c == null)
-			throw new BadPositionCategoryException();
-
-		return computeIndexInPositionList(c, offset);
-	}
-
-
-	/**
-	 * Computes the index in the list of positions at which a position with
-	 * the given offset would be inserted. The position is supposed to become
-	 * the first in this list of all positions with the same offset.
-	 * 
-	 * @param positions
-	 *            the list in which the index is computed
-	 * @param offset
-	 *            the offset for which the index is computed
-	 * @return the computed index
-	 * 
-	 * @see IDocument#computeIndexInCategory(String, int)
-	 */
-	protected synchronized int computeIndexInPositionList(List positions, int offset) {
-
-		if (positions.size() == 0)
-			return 0;
-
-		int left = 0;
-		int right = positions.size() - 1;
-		int mid = 0;
-		Position p = null;
-
-		while (left < right) {
-
-			mid = (left + right) / 2;
-
-			p = (Position) positions.get(mid);
-			if (offset < p.getOffset()) {
-				if (left == mid)
-					right = left;
-				else
-					right = mid - 1;
-			}
-			else if (offset > p.getOffset()) {
-				if (right == mid)
-					left = right;
-				else
-					left = mid + 1;
-			}
-			else if (offset == p.getOffset()) {
-				left = right = mid;
-			}
-
-		}
-
-		int pos = left;
-		p = (Position) positions.get(pos);
-		if (offset > p.getOffset()) {
-			// append to the end
-			pos++;
-		}
-		else {
-			// entry will became the first of all entries with the same
-			// offset
-			do {
-				--pos;
-				if (pos < 0)
-					break;
-				p = (Position) positions.get(pos);
-			}
-			while (offset == p.getOffset());
-			++pos;
-		}
-
-		Assert.isTrue(0 <= pos && pos <= positions.size());
-
-		return pos;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#containsPosition(java.lang.String,
-	 *      int, int)
-	 */
-	public boolean containsPosition(String category, int offset, int length) {
-
-		if (category == null)
-			return false;
-
-		List list = (List) fPositions.get(category);
-		if (list == null)
-			return false;
-
-		int size = list.size();
-		if (size == 0)
-			return false;
-
-		int index = computeIndexInPositionList(list, offset);
-		if (index < size) {
-			Position p = (Position) list.get(index);
-			while (p != null && p.offset == offset) {
-				if (p.length == length)
-					return true;
-				++index;
-				p = (index < size) ? (Position) list.get(index) : null;
-			}
-		}
-
-		return false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#containsPositionCategory(java.lang.String)
-	 */
-	public boolean containsPositionCategory(String category) {
-		if (category != null)
-			return fPositions.containsKey(category);
-		return false;
-	}
-
-
-
-	public int getDocumentLength() {
-		return fCharSequence.length();
-	}
-
-	/**
-	 * Returns all positions managed by the document grouped by category.
-	 * 
-	 * @return the document's positions
-	 */
-	protected Map getDocumentManagedPositions() {
-		return fPositions;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#getPositionCategories()
-	 */
-	public String[] getPositionCategories() {
-		String[] categories = new String[fPositions.size()];
-		Iterator keys = fPositions.keySet().iterator();
-		for (int i = 0; i < categories.length; i++)
-			categories[i] = (String) keys.next();
-		return categories;
-	}
-
-
-	public Position[] getPositions(String category) throws BadPositionCategoryException {
-
-		if (category == null)
-			throw new BadPositionCategoryException();
-
-		List c = (List) fPositions.get(category);
-		if (c == null)
-			throw new BadPositionCategoryException();
-
-		Position[] positions = new Position[c.size()];
-		c.toArray(positions);
-		return positions;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#getPositionUpdaters()
-	 */
-	public IPositionUpdater[] getPositionUpdaters() {
-		IPositionUpdater[] updaters = new IPositionUpdater[fPositionUpdaters.size()];
-		fPositionUpdaters.toArray(updaters);
-		return updaters;
-	}
-
-
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#insertPositionUpdater(org.eclipse.jface.text.IPositionUpdater,
-	 *      int)
-	 */
-	public synchronized void insertPositionUpdater(IPositionUpdater updater, int index) {
-
-		for (int i = fPositionUpdaters.size() - 1; i >= 0; i--) {
-			if (fPositionUpdaters.get(i) == updater)
-				return;
-		}
-
-		if (index == fPositionUpdaters.size())
-			fPositionUpdaters.add(updater);
-		else
-			fPositionUpdaters.add(index, updater);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#removePosition(org.eclipse.jface.text.Position)
-	 */
-	public void removePosition(Position position) {
-		try {
-			removePosition(IDocument.DEFAULT_CATEGORY, position);
-		}
-		catch (BadPositionCategoryException e) {
-		}
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#removePosition(java.lang.String,
-	 *      org.eclipse.jface.text.Position)
-	 */
-	public synchronized void removePosition(String category, Position position) throws BadPositionCategoryException {
-
-		if (position == null)
-			return;
-
-		if (category == null)
-			throw new BadPositionCategoryException();
-
-		List c = (List) fPositions.get(category);
-		if (c == null)
-			throw new BadPositionCategoryException();
-
-		// remove based on identity not equality
-		int size = c.size();
-		for (int i = 0; i < size; i++) {
-			if (position == c.get(i)) {
-				c.remove(i);
-				return;
-			}
-		}
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#removePositionCategory(java.lang.String)
-	 */
-	public void removePositionCategory(String category) throws BadPositionCategoryException {
-
-		if (category == null)
-			return;
-
-		if (!containsPositionCategory(category))
-			throw new BadPositionCategoryException();
-
-		fPositions.remove(category);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IDocument#removePositionUpdater(org.eclipse.jface.text.IPositionUpdater)
-	 */
-	public synchronized void removePositionUpdater(IPositionUpdater updater) {
-		for (int i = fPositionUpdaters.size() - 1; i >= 0; i--) {
-			if (fPositionUpdaters.get(i) == updater) {
-				fPositionUpdaters.remove(i);
-				return;
-			}
-		}
-	}
-
-
-	/**
-	 * Updates all positions of all categories to the change described by the
-	 * document event. All registered document updaters are called in the
-	 * sequence they have been arranged. Uses a robust iterator.
-	 * 
-	 * @param event
-	 *            the document event describing the change to which to adapt
-	 *            the positions
-	 */
-	protected synchronized void updatePositions(DocumentEvent event) {
-		List list = new ArrayList(fPositionUpdaters);
-		Iterator e = list.iterator();
-		while (e.hasNext()) {
-			IPositionUpdater u = (IPositionUpdater) e.next();
-			u.update(event);
-		}
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/IExecutionDelegatable.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/IExecutionDelegatable.java
deleted file mode 100644
index 03ed267..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/IExecutionDelegatable.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import org.eclipse.wst.sse.core.internal.IExecutionDelegate;
-
-public interface IExecutionDelegatable {
-
-	void setExecutionDelegate(IExecutionDelegate executionDelegate);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/IRegionComparible.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/IRegionComparible.java
deleted file mode 100644
index 3230439..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/IRegionComparible.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-public interface IRegionComparible {
-	boolean regionMatches(int offset, int length, String stringToCompare);
-
-	boolean regionMatchesIgnoreCase(int offset, int length, String stringToCompare);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/JobSafeStructuredDocument.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/JobSafeStructuredDocument.java
deleted file mode 100644
index 5848016..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/JobSafeStructuredDocument.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.jface.text.DocumentRewriteSession;
-import org.eclipse.jface.text.DocumentRewriteSessionType;
-import org.eclipse.wst.sse.core.internal.IExecutionDelegate;
-import org.eclipse.wst.sse.core.internal.ILockable;
-import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-
-
-
-public class JobSafeStructuredDocument extends BasicStructuredDocument implements IExecutionDelegatable, ILockable {
-
-	private IExecutionDelegate fExecutionDelegate;
-	private ILock fLockable = Platform.getJobManager().newLock();
-
-	public JobSafeStructuredDocument() {
-		super();
-	}
-
-
-	public JobSafeStructuredDocument(RegionParser parser) {
-		super(parser);
-	}
-
-
-	/**
-	 * 
-	 */
-	protected final void acquireLock() {
-		getLockObject().acquire();
-	}
-
-	private IExecutionDelegate getExecutionDelegate() {
-		return fExecutionDelegate;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.ILockable#getLock()
-	 */
-
-	public ILock getLockObject() {
-		return fLockable;
-	}
-
-
-	/**
-	 * 
-	 */
-	protected final void releaseLock() {
-		getLockObject().release();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.text.IStructuredDocument#replaceText(java.lang.Object,
-	 *      int, int, java.lang.String, boolean)
-	 */
-	public StructuredDocumentEvent replaceText(final Object requester, final int start, final int replacementLength, final String changes, final boolean ignoreReadOnlySettings) {
-		StructuredDocumentEvent event = null;
-		if (getExecutionDelegate() == null) {
-			// if the delegate has not been set, we execute on current
-			// thread, like "normal". This is the case for normal
-			// non-editor
-			// use (which should still, ultimately, be protected by
-			// a scheduling rule).
-			event = super.replaceText(requester, start, replacementLength, changes, ignoreReadOnlySettings);
-		}
-		else {
-			// If document is being used by an editor, a runnable is
-			// created,
-			// even if later (in the execution delegate instance) it is
-			// decided
-			// nothing special is needed (that is, in fact being called
-			// from
-			// editor's display thread, in which case its just executed)
-			final Object[] resultSlot = new Object[1];
-			Runnable runnable = new Runnable() {
-				public void run() {
-					try {
-						resultSlot[0] = JobSafeStructuredDocument.super.replaceText(requester, start, replacementLength, changes, ignoreReadOnlySettings);
-					}
-					catch (Throwable e) {
-						resultSlot[0] = e;
-					}
-				}
-			};
-			// strongly assumes synchronous call, to "wait" for
-			// results
-			// basically just routes to Display.synchExec(runnable),
-			// if not already running on display thread.
-			getExecutionDelegate().execute(runnable);
-
-			// this remembering and re-throwing of exception is just to
-			// get an
-			// exception that occurred on one thread, to be thrown on
-			// callers
-			// thread.
-			if (resultSlot[0] instanceof Throwable) {
-				throw new RuntimeException((Throwable) resultSlot[0]);
-			}
-			else {
-				event = (StructuredDocumentEvent) resultSlot[0];
-			}
-		}
-		return event;
-	}
-
-	public void setExecutionDelegate(IExecutionDelegate delegate) {
-		fExecutionDelegate = delegate;
-	}
-
-
-	public StructuredDocumentEvent setText(final Object requester, final String theString) {
-		StructuredDocumentEvent event = null;
-		if (getExecutionDelegate() == null) {
-			// if the delegate has not been set, we execute on current
-			// thread, like "normal". This is the case for normal
-			// non-editor
-			// use (which should still, ultimately, be protected by
-			// a scheduling rule).
-			event = super.setText(requester, theString);
-		}
-		else {
-			// If document is being used by an editor, a runnable is
-			// created,
-			// even if later (in the execution delegate instance) it is
-			// decided
-			// nothing special is needed (that is, in fact being called
-			// from
-			// editor's display thread, in which case its just executed)
-			final Object[] resultSlot = new Object[1];
-			Runnable runnable = new Runnable() {
-				public void run() {
-					try {
-						resultSlot[0] = JobSafeStructuredDocument.super.setText(requester, theString);
-					}
-					catch (Throwable e) {
-						resultSlot[0] = e;
-					}
-				}
-			};
-			// strongly assumes synchronous call, to "wait" for
-			// results
-			// basically just routes to Display.synchExec(runnable),
-			// if not already running on display thread.
-			getExecutionDelegate().execute(runnable);
-
-			// this remembering and re-throwing of exception is just to
-			// get an
-			// exception that occurred on one thread, to be thrown on
-			// callers
-			// thread.
-			if (resultSlot[0] instanceof Throwable) {
-				throw new RuntimeException((Throwable) resultSlot[0]);
-			}
-			else {
-				event = (StructuredDocumentEvent) resultSlot[0];
-			}
-		}
-		return event;
-	}
-
-	public DocumentRewriteSession startRewriteSession(DocumentRewriteSessionType sessionType) throws IllegalStateException {
-		DocumentRewriteSession session = null;
-		if (getExecutionDelegate() == null) {
-			// if the delegate has not been set, we execute on current
-			// thread, like "normal". This is the case for normal
-			// non-editor
-			// use (which should still, ultimately, be protected by
-			// a scheduling rule).
-			session = internalStartRewriteSession(sessionType);
-		}
-		else {
-			// If document is being used by an editor, a runnable is
-			// created,
-			// even if later (in the execution delegate instance) it is
-			// decided
-			// nothing special is needed (that is, in fact being called
-			// from
-			// editor's display thread, in which case its just executed)
-			final Object[] resultSlot = new Object[1];
-			final DocumentRewriteSessionType finalSessionType = sessionType;
-			Runnable runnable = new Runnable() {
-				public void run() {
-					try {
-						resultSlot[0] = internalStartRewriteSession(finalSessionType);
-
-					}
-					catch (Throwable e) {
-						resultSlot[0] = e;
-					}
-				}
-			};
-			// strongly assumes synchronous call, to "wait" for
-			// results
-			// basically just routes to Display.synchExec(runnable),
-			// if not already running on display thread.
-			getExecutionDelegate().execute(runnable);
-
-			// this remembering and re-throwing of exception is just to
-			// get an
-			// exception that occurred on one thread, to be thrown on
-			// callers
-			// thread.
-			if (resultSlot[0] instanceof Throwable) {
-				throw new RuntimeException((Throwable) resultSlot[0]);
-			}
-			else {
-				session = (DocumentRewriteSession) resultSlot[0];
-			}
-		}
-		return session;
-	}
-
-	public void stopRewriteSession(DocumentRewriteSession session) {
-		if (getExecutionDelegate() == null) {
-			// if the delegate has not been set, we execute on current
-			// thread, like "normal". This is the case for normal
-			// non-editor
-			// use (which should still, ultimately, be protected by
-			// a scheduling rule).
-			internalStopRewriteSession(session);
-		}
-		else {
-			// If document is being used by an editor, a runnable is
-			// created,
-			// even if later (in the execution delegate instance) it is
-			// decided
-			// nothing special is needed (that is, in fact being called
-			// from
-			// editor's display thread, in which case its just executed)
-			final Object[] resultSlot = new Object[1];
-			final DocumentRewriteSession finalSession = session;
-			Runnable runnable = new Runnable() {
-				public void run() {
-					try {
-						internalStopRewriteSession(finalSession);
-
-					}
-					catch (Throwable e) {
-						resultSlot[0] = e;
-					}
-				}
-			};
-			// strongly assumes synchronous call, to "wait" for
-			// results
-			// basically just routes to Display.synchExec(runnable),
-			// if not already running on display thread.
-			getExecutionDelegate().execute(runnable);
-
-			// this remembering and re-throwing of exception is just to
-			// get an
-			// exception that occurred on one thread, to be thrown on
-			// callers
-			// thread.
-			if (resultSlot[0] instanceof Throwable) {
-				throw new RuntimeException((Throwable) resultSlot[0]);
-			}
-		}
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/MinimalDocument.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/MinimalDocument.java
deleted file mode 100644
index 0d4675e..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/MinimalDocument.java
+++ /dev/null
@@ -1,445 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.jface.text.IDocumentPartitioningListener;
-import org.eclipse.jface.text.IPositionUpdater;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.TypedRegion;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.NotImplementedException;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
-import org.eclipse.wst.sse.core.internal.provisional.events.IModelAboutToBeChangedListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredTextReParser;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-
-
-/**
- * Purely a dummy "marker" instance for StructuredDocumentRegions which are
- * created temorarily in the course of re-parsing. Primarily a place holder,
- * but can be needed to get text from.
- */
-public class MinimalDocument implements IStructuredDocument {
-	private SubSetTextStore data;
-
-	/**
-	 * Marked private to be sure never created without data being initialized.
-	 *  
-	 */
-	private MinimalDocument() {
-		super();
-	}
-
-	public MinimalDocument(SubSetTextStore initialContents) {
-		this();
-		data = initialContents;
-	}
-
-	public void addDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addDocumentChangedListener(IStructuredDocumentListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addDocumentChangingListener(IStructuredDocumentListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addDocumentListener(IDocumentListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addDocumentPartitioningListener(IDocumentPartitioningListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addPosition(Position position) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addPosition(String category, Position position) throws BadLocationException, BadPositionCategoryException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addPositionCategory(String category) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addPositionUpdater(IPositionUpdater updater) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void addPrenotifiedDocumentListener(IDocumentListener documentAdapter) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void clearReadOnly(int startOffset, int length) {
-		// TODO: this is called from notifier loop inappropriately
-		//	throw new NotImplementedException("intentionally not implemented");
-	}
-
-	public int computeIndexInCategory(String category, int offset) throws BadLocationException, BadPositionCategoryException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int computeNumberOfLines(String text) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public ITypedRegion[] computePartitioning(int offset, int length) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public boolean containsPosition(String category, int offset, int length) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public boolean containsPositionCategory(String category) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public boolean containsReadOnly(int startOffset, int length) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void fireNewDocument(Object requester) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public String get() {
-		String result = null;
-		result = data.get(0, data.getLength());
-		return result;
-	}
-
-	public String get(int offset, int length) throws BadLocationException {
-		String result = null;
-		try {
-			result = data.get(offset, length);
-		} catch (StringIndexOutOfBoundsException e) {
-			throw new BadLocationException();
-		}
-		return result;
-	}
-
-	public Object getAdapter(Class adapter) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public char getChar(int offset) throws BadLocationException {
-		return data.get(offset);
-	}
-
-	public String getContentType(int offset) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IDocumentPartitioner getDocumentPartitioner() {
-		// temp fix
-		return null;
-		//		throw new NotImplementedException("intentionally not implemented");
-	}
-
-	public EncodingMemento getEncodingMemento() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IStructuredDocumentRegion getFirstStructuredDocumentRegion() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IStructuredDocumentRegion getLastStructuredDocumentRegion() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public String[] getLegalContentTypes() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public String[] getLegalLineDelimiters() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int getLength() {
-		return data.getLength();
-	}
-
-	public String getPreferedLineDelimiter() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public String getLineDelimiter(int line) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IRegion getLineInformation(int line) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IRegion getLineInformationOfOffset(int offset) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int getLineLength(int line) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int getLineOffset(int line) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int getLineOfOffset(int offset) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int getNumberOfLines() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int getNumberOfLines(int offset, int length) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public RegionParser getParser() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public ITypedRegion getPartition(int offset) throws BadLocationException {
-		Logger.log(Logger.WARNING, "An instance of MinimalDocument was asked for its partition, sometime indicating a deleted region was being accessed."); //$NON-NLS-1$
-		return new TypedRegion(0,0, "undefined"); //$NON-NLS-1$
-		//throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public String[] getPositionCategories() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public Position[] getPositions(String category) throws BadPositionCategoryException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IPositionUpdater[] getPositionUpdaters() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IStructuredDocumentRegion getRegionAtCharacterOffset(int offset) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IStructuredDocumentRegionList getRegionList() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public IStructuredTextReParser getReParser() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public String getText() {
-		return data.get(0, data.getLength());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.text.IStructuredDocument#getUndoManager()
-	 */
-	public IStructuredTextUndoManager getUndoManager() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void insertPositionUpdater(IPositionUpdater updater, int index) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void makeReadOnly(int startOffset, int length) {
-		// TODO: this is called from notifier loop inappropriately
-		//	throw new NotImplementedException("intentionally not implemented");
-	}
-
-	public IStructuredDocument newInstance() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#registerPostNotificationReplace(org.eclipse.jface.text.IDocumentListener,
-	 *      org.eclipse.jface.text.IDocumentExtension.IReplace)
-	 */
-	public void registerPostNotificationReplace(IDocumentListener owner, IReplace replace) throws UnsupportedOperationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$		
-	}
-
-	public void removeDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removeDocumentChangedListener(IStructuredDocumentListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removeDocumentChangingListener(IStructuredDocumentListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removeDocumentListener(IDocumentListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removeDocumentPartitioningListener(IDocumentPartitioningListener listener) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removePosition(Position position) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removePosition(String category, Position position) throws BadPositionCategoryException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removePositionCategory(String category) throws BadPositionCategoryException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removePositionUpdater(IPositionUpdater updater) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void removePrenotifiedDocumentListener(IDocumentListener documentAdapter) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void replace(int offset, int length, String text) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-		//		data.replace(offset, length, text);
-	}
-
-	public StructuredDocumentEvent replaceText(Object source, int oldStart, int replacementLength, String requestedChange) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.text.IStructuredDocument#replaceText(java.lang.Object,
-	 *      int, int, java.lang.String, boolean)
-	 */
-	public StructuredDocumentEvent replaceText(Object source, int oldStart, int replacementLength, String requestedChange, boolean ignoreReadOnlySetting) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#resumePostNotificationProcessing()
-	 */
-	public void resumePostNotificationProcessing() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public int search(int startOffset, String findString, boolean forwardSearch, boolean caseSensitive, boolean wholeWord) throws BadLocationException {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void set(String text) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-		//		data.set(text);
-	}
-
-	public void setDocumentPartitioner(IDocumentPartitioner partitioner) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void setEncodingMemento(EncodingMemento encodingMemento) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public void setPreferredLineDelimiter(String delimiter) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public StructuredDocumentEvent setText(Object requester, String allText) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.text.IStructuredDocument#setUndoManager(org.eclipse.wst.sse.core.undo.StructuredTextUndoManager)
-	 */
-	public void setUndoManager(IStructuredTextUndoManager undoManager) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#startSequentialRewrite(boolean)
-	 */
-	public void startSequentialRewrite(boolean normalize) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#stopPostNotificationProcessing()
-	 */
-	public void stopPostNotificationProcessing() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentExtension#stopSequentialRewrite()
-	 */
-	public void stopSequentialRewrite() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-
-	public String getLineDelimiter() {
-		return null;
-	}
-
-	public String getPreferredLineDelimiter() {
-		return null;
-	}
-
-	public void setLineDelimiter(String delimiter) {
-		
-	}
-	
-	public IStructuredDocumentRegion[] getStructuredDocumentRegions() {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-	
-	public IStructuredDocumentRegion[] getStructuredDocumentRegions(int start, int length) {
-		throw new NotImplementedException("intentionally not implemented"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/ReadOnlyPosition.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/ReadOnlyPosition.java
deleted file mode 100644
index 4c4bccf..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/ReadOnlyPosition.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import org.eclipse.jface.text.Position;
-
-class ReadOnlyPosition extends Position {
-	private boolean fIncludeStartOffset = false;
-
-	public ReadOnlyPosition(int newOffset, int newLength, boolean includeStart) {
-		super(newOffset, newLength);
-		fIncludeStartOffset = includeStart;
-	}
-
-	public boolean overlapsWith(int newOffset, int newLength) {
-		boolean overlapsWith = super.overlapsWith(newOffset, newLength);
-		if (overlapsWith) {
-			/*
-			 * BUG157526 If at the start of the read only region and length =
-			 * 0 most likely asking to insert and want to all inserting before
-			 * read only region
-			 */
-			if (fIncludeStartOffset && (newLength == 0) && (this.length != 0) && (newOffset == this.offset)) {
-				overlapsWith = false;
-			}
-		}
-		return overlapsWith;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentReParser.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentReParser.java
deleted file mode 100644
index ead5dad..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentReParser.java
+++ /dev/null
@@ -1,1651 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.FindReplaceDocumentAdapter;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTagParser;
-import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredTextReParser;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.sse.core.internal.util.Debug;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-
-
-/**
- * This class provides a centralized place to put "reparsing" logic. This is
- * the logic that reparses the text incrementally, as a user types in new
- * characters, or DOM nodes are inserted or deleted. Note: it is not a thread
- * safe class.
- */
-public class StructuredDocumentReParser implements IStructuredTextReParser {
-	protected IStructuredDocumentRegion dirtyEnd = null;
-	protected IStructuredDocumentRegion dirtyStart = null;
-	final private String doubleQuote = new String(new char[]{'\"'});
-	protected final CoreNodeList EMPTY_LIST = new CoreNodeList();
-	protected String fChanges;
-	protected String fDeletedText;
-
-	private FindReplaceDocumentAdapter fFindReplaceDocumentAdapter = null;
-	protected int fLengthDifference;
-	protected int fLengthToReplace;
-	protected Object fRequester;
-	protected int fStart;
-	// note: this is the impl class of IStructuredDocument, not the interface
-	// FUTURE_TO_DO: I believe some of these can be made private now.?
-	protected BasicStructuredDocument fStructuredDocument;
-
-	/**
-	 * variable used in anticiapation of multithreading
-	 */
-	protected boolean isParsing;
-	final private String singleQuote = new String(new char[]{'\''});
-
-	public StructuredDocumentReParser() {
-		super();
-	}
-
-	public StructuredDocumentEvent _checkBlockNodeList(List blockTagList) {
-		StructuredDocumentEvent result = null;
-		if (blockTagList != null) {
-			for (int i = 0; i < blockTagList.size(); i++) {
-				org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker blockTag = (org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker) blockTagList.get(i);
-				String tagName = blockTag.getTagName();
-				result = checkForCriticalName("<" + tagName); //$NON-NLS-1$
-				if (result != null)
-					break;
-				result = checkForCriticalName("</" + tagName); //$NON-NLS-1$
-				if (result != null)
-					break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Common utility for checking for critical word such as " <SCRIPT>"
-	 */
-	private StructuredDocumentEvent _checkForCriticalWord(String criticalTarget, boolean checkEnd) {
-		StructuredDocumentEvent result = null;
-		int documentLength = fStructuredDocument.getLength();
-		int propLen = fLengthToReplace;
-		if (propLen > documentLength)
-			propLen = documentLength;
-		int startNeighborhood = fStart - criticalTarget.length();
-		int adjustInsert = 0;
-		if (startNeighborhood < 0) {
-			adjustInsert = 0 - startNeighborhood;
-			startNeighborhood = 0;
-		}
-		int endNeighborhood = fStart + fLengthToReplace + criticalTarget.length() - 1;
-		if (endNeighborhood > documentLength)
-			endNeighborhood = documentLength - 1;
-		int oldlen = endNeighborhood - startNeighborhood; // + 1;
-		if (oldlen + startNeighborhood > documentLength) {
-			oldlen = documentLength - startNeighborhood;
-		}
-		String oldText = fStructuredDocument.get(startNeighborhood, oldlen);
-		String peek = StringUtils.paste(oldText, fChanges, criticalTarget.length() - adjustInsert, fLengthToReplace);
-		boolean isCriticalString = checkTagNames(oldText, criticalTarget, checkEnd);
-		boolean toBeCriticalString = checkTagNames(peek, criticalTarget, checkEnd);
-		if ((isCriticalString != toBeCriticalString) || // OR if both are
-					// critical and there's
-					// a change in the end
-					// tag ('>')
-					((isCriticalString && toBeCriticalString) && (changeInIsEndedState(oldText, peek)))) {
-			// if it involves a change of a critical string (making one where
-			// there wasn't, or removing
-			// one where there was one) then reparse everthing.
-			result = reparse(0, documentLength - 1);
-		}
-		return result;
-	}
-
-	private int _computeStartOfDifferences(CoreNodeList oldNodes, CoreNodeList newNodes) {
-		int startOfDifferences = -1;
-		int newNodesLength = newNodes.getLength();
-		boolean foundDifference = false;
-		boolean done = false;
-		// we'll control our loop based on the old List length
-		int oldNodesLength = oldNodes.getLength();
-		// be sure to check 'done' first, so startOfDifferences isn't
-		// icremented if done is true
-		done : while ((!done) && (++startOfDifferences < oldNodesLength)) {
-			IStructuredDocumentRegion oldNode = oldNodes.item(startOfDifferences);
-			// this lessThanEffectedRegion is to check to be sure the node is
-			// infact a candidate
-			// to be considered as "old". This check is important for the case
-			// where some
-			// text is replaceing text that
-			// appears identical, but is a different instance. For example, if
-			// the text
-			// is <P><B></B></P> and <B></B> is inserted at postion 3,
-			// resulting in <P><B></B><B></B></P>
-			// we do not want the
-			// first <B> to be considered old ... it is the new one, the
-			// second
-			// <B> is the old one.
-			if (_lessThanEffectedRegion(oldNode)) {
-				// be sure to check that we have new nodes to compare against.
-				if (startOfDifferences > newNodesLength) {
-					foundDifference = false;
-					done = true;
-					continue done;
-				} else {
-					//
-					IStructuredDocumentRegion newNode = newNodes.item(startOfDifferences);
-					// note: shift is 0 while at beginning of list, before the
-					// insertion (or deletion) point. After that, it is
-					// fStart+fLengthDifference
-					if (!(oldNode.sameAs(newNode, 0))) {
-						foundDifference = true;
-						done = true;
-						continue done;
-					} else { // if they are equal, then we will be keeping the
-						// old one, so
-						// we need to be sure its parentDocument is set back
-						// to
-						// the right instance
-						oldNode.setParentDocument(fStructuredDocument);
-					}
-				}
-			} else {
-				// we didn't literally find a difference, but we count it as
-				// such by implication
-				foundDifference = true;
-				done = true;
-				continue done;
-			}
-		}
-		// if we literally found a difference, then all is ok and we can
-		// return
-		// it.
-		// if we did not literally find one, then we have to decide why.
-		if (!foundDifference) {
-			if (newNodesLength == oldNodesLength) { // then lists are
-				// identical
-				// (and may be of zero
-				// length)
-				startOfDifferences = -1;
-			} else {
-				if (newNodesLength > oldNodesLength) { // then lists are
-					// identical except for
-					// newNodes added
-					startOfDifferences = oldNodesLength;
-				} else {
-					if (newNodesLength < oldNodesLength) { // then lists are
-						// identical except
-						// for old Nodes
-						// deleted
-						startOfDifferences = newNodesLength;
-					}
-				}
-			}
-		}
-		return startOfDifferences;
-	}
-
-	private int _computeStartOfDifferences(IStructuredDocumentRegion oldNodeParam, ITextRegionList oldRegions, IStructuredDocumentRegion newNodeParam, ITextRegionList newRegions) {
-		int startOfDifferences = -1;
-		int newRegionsLength = newRegions.size();
-		boolean foundDifference = false;
-		boolean done = false;
-		// we'll control our loop based on the old List length
-		int oldRegionsLength = oldRegions.size();
-		// be sure to check 'done' first, so startOfDifferences isn't
-		// icremented if done is true
-		done : while ((!done) && (++startOfDifferences < oldRegionsLength)) {
-			ITextRegion oldRegion = oldRegions.get(startOfDifferences);
-			// this lessThanEffectedRegion is to check to be sure the node is
-			// infact a candidate
-			// to be considered as "old". This check is important for the case
-			// where some
-			// text is replaceing text that
-			// appears identical, but is a different instance. For example, if
-			// the text
-			// is <P><B></B></P> and <B></B> is inserted at postion 3,
-			// resulting in <P><B></B><B></B></P>
-			// we do not want the
-			// first <B> to be considered old ... it is the new one, the
-			// second
-			// <B> is the old one.
-			if (_lessThanEffectedRegion(oldNodeParam, oldRegion)) {
-				// be sure to check that we have new nodes to compare against.
-				if (startOfDifferences > newRegionsLength) {
-					foundDifference = false;
-					done = true;
-					continue done;
-				} else {
-					//
-					ITextRegion newRegion = newRegions.get(startOfDifferences);
-					// note: shift is 0 while at beginning of list, before the
-					// insertion (or deletion) point. After that, it is
-					// fStart+fLengthDifference
-					if (!(oldNodeParam.sameAs(oldRegion, newNodeParam, newRegion, 0))) {
-						foundDifference = true;
-						done = true;
-						continue done;
-					} else {
-						// if they are equal, then we will be keeping the old
-						// one.
-						// unlike the flatnode case, there is no reason to
-						// update
-						// the textstore, since its the same text store in
-						// either case
-						// (since its the same flatnode)
-						//oldRegion.setTextStore(fStructuredDocument.parentDocument);
-					}
-				}
-			} else {
-				// we didn't literally find a difference, but we count it as
-				// such by implication
-				foundDifference = true;
-				done = true;
-				continue done;
-			}
-		}
-		// if we literally found a difference, then all is ok and we can
-		// return
-		// it.
-		// if we did not literally find one, then we have to decide why.
-		if (!foundDifference) {
-			if (newRegionsLength == oldRegionsLength) { // then lists are
-				// identical (and may
-				// be of zero length)
-				startOfDifferences = -1;
-			} else {
-				if (newRegionsLength > oldRegionsLength) { // then lists are
-					// identical except
-					// for newRegions
-					// added
-					startOfDifferences = oldRegionsLength;
-				} else {
-					if (newRegionsLength < oldRegionsLength) { // then lists
-						// are identical
-						// except for
-						// old Nodes
-						// deleted
-						startOfDifferences = newRegionsLength;
-					}
-				}
-			}
-		}
-		return startOfDifferences;
-	}
-
-	/**
-	 * Part 1 of 2 steps to do a core_reparse
-	 * 
-	 * Parses a portion of the current text in the IStructuredDocument and
-	 * returns the raw result
-	 */
-	private IStructuredDocumentRegion _core_reparse_text(int rescanStart, int rescanEnd) {
-		fStructuredDocument.resetParser(rescanStart, rescanEnd);
-		return fStructuredDocument.getParser().getDocumentRegions();
-	}
-
-	/**
-	 * Part 2 of 2 steps to do a core_reparse
-	 * 
-	 * Integrates a list of StructuredDocumentRegions based on the current
-	 * text contents of the IStructuredDocument into the IStructuredDocument
-	 * data structure
-	 */
-	private StructuredDocumentEvent _core_reparse_update_model(IStructuredDocumentRegion newNodesHead, int rescanStart, int rescanEnd, CoreNodeList oldNodes, boolean firstTime) {
-		StructuredDocumentEvent result = null;
-		CoreNodeList newNodes = null;
-		// rescan
-		newNodes = new CoreNodeList(newNodesHead);
-		// adjust our newNode chain so the offset positions match
-		// our text store (not the simple string of text reparsed)
-		StructuredDocumentRegionIterator.adjustStart(newNodesHead, rescanStart);
-		// initialize the parentDocument variable of each instance in the new
-		// chain
-		StructuredDocumentRegionIterator.setParentDocument(newNodesHead, fStructuredDocument);
-		// initialize the structuredDocument variable of each instance in the
-		// new chain
-		//StructuredDocumentRegionIterator.setStructuredDocument(newNodesHead,
-		// fStructuredDocument);
-		//
-		if (firstTime) {
-			fStructuredDocument.setCachedDocumentRegion(newNodesHead);
-			fStructuredDocument.initializeFirstAndLastDocumentRegion();
-			// note: since we are inserting nodes, for the first time, there
-			// is
-			// no adjustments
-			// to downstream stuff necessary.
-			result = new StructuredDocumentRegionsReplacedEvent(fStructuredDocument, fRequester, oldNodes, newNodes, fChanges, fStart, fLengthToReplace);
-		} else {
-			// note: integrates changes into model as a side effect
-			result = minimumEvent(oldNodes, newNodes);
-		}
-		result.setDeletedText(fDeletedText);
-		return result;
-	}
-
-	private CoreNodeList _formMinimumList(CoreNodeList flatnodes, int startOfDifferences, int endOfDifferences) {
-		CoreNodeList minimalNodes = null;
-		// if startOfDifferces is still its initial value, then we have an
-		// empty document
-		if (startOfDifferences == -1) {
-			minimalNodes = EMPTY_LIST;
-		} else {
-			// if we do not have any flatnode in our flatnode list, then
-			// simply
-			// return our standard empty list
-			if (flatnodes.getLength() == 0) {
-				minimalNodes = EMPTY_LIST;
-			} else {
-				// if startOfDifferences is greater than endOfDifferences,
-				// then
-				// that means the calculations "crossed" each other, and
-				// hence,
-				// there really is no differences, so, again, return the empty
-				// list
-				if (startOfDifferences > endOfDifferences) {
-					minimalNodes = EMPTY_LIST;
-				} else {
-					// the last check be sure we have some differnces
-					if ((endOfDifferences > -1)) {
-						minimalNodes = new CoreNodeList(flatnodes.item(startOfDifferences), flatnodes.item(endOfDifferences));
-					} else {
-						// there were no differences, the list wasn't
-						// minimized, so simply return it.
-						minimalNodes = flatnodes;
-					}
-				}
-			}
-		}
-		return minimalNodes;
-	}
-
-	private boolean _greaterThanEffectedRegion(IStructuredDocumentRegion oldNode) {
-		boolean result = false;
-		int nodeStart = oldNode.getStartOffset();
-		int changedRegionEnd = fStart + fLengthToReplace - 1;
-		result = nodeStart > changedRegionEnd;
-		return result;
-	}
-
-	private boolean _greaterThanEffectedRegion(IStructuredDocumentRegion oldNode, ITextRegion oldRegion) {
-		boolean result = false;
-		int regionStartOffset = oldNode.getStartOffset(oldRegion);
-		int effectedRegionEnd = fStart + fLengthToReplace - 1;
-		result = regionStartOffset > effectedRegionEnd;
-		return result;
-	}
-
-	private boolean _lessThanEffectedRegion(IStructuredDocumentRegion oldNode) {
-		boolean result = false;
-		int nodeEnd = oldNode.getEndOffset() - 1;
-		result = nodeEnd < fStart;
-		return result;
-	}
-
-	private boolean _lessThanEffectedRegion(IStructuredDocumentRegion oldNode, ITextRegion oldRegion) {
-		boolean result = false;
-		int nodeEnd = oldNode.getEndOffset(oldRegion) - 1;
-		result = nodeEnd < fStart;
-		return result;
-	}
-
-	private boolean _regionsSameKind(ITextRegion newRegion, ITextRegion oldRegion) {
-		boolean result = false;
-		// if one region is a container region, and the other not, always
-		// return false
-		// else, just check their type.
-		//      DW druing refactoring, looks like a "typo" here, using 'old' in
-		// both.
-		//		if (isContainerRegion(oldRegion) != isContainerRegion(oldRegion))
-		if (isCollectionRegion(oldRegion) != isCollectionRegion(newRegion))
-			result = false;
-		else if (oldRegion.getType() == newRegion.getType())
-			result = true;
-		return result;
-	}
-
-	//	private boolean hasCollectionRegions(ITextRegion aRegion) {
-	//		boolean result = false;
-	//		if (aRegion instanceof ITextRegionCollection) {
-	//			ITextRegionCollection regionContainter = (ITextRegionCollection)
-	// aRegion;
-	//			ITextRegionList regions = regionContainter.getRegions();
-	//			Iterator iterator = regions.iterator();
-	//			while (iterator.hasNext()) {
-	//				if (aRegion instanceof ITextRegionCollection) {
-	//					result = true;
-	//					break;
-	//				}
-	//			}
-	//		}
-	//		return result;
-	//	}
-	/**
-	 * This method is specifically to detect changes in 'isEnded' state,
-	 * although it still does so with heuristics. If number of '>' changes,
-	 * assume the isEnded state has changed.
-	 */
-	private boolean changeInIsEndedState(String oldText, String newText) {
-		int nOld = StringUtils.occurrencesOf(oldText, '>');
-		int nNew = StringUtils.occurrencesOf(newText, '>');
-		return !(nOld == nNew);
-	}
-
-	private void checkAndAssignParent(IStructuredDocumentRegion oldNode, ITextRegion region) {
-		if (region instanceof ITextRegionContainer) {
-			((ITextRegionContainer) region).setParent(oldNode);
-			return;
-		}
-		if (region instanceof ITextRegionCollection) {
-			ITextRegionCollection textRegionCollection = (ITextRegionCollection) region;
-			ITextRegionList regionList = textRegionCollection.getRegions();
-			for (int i = 0; i < regionList.size(); i++) {
-				ITextRegion innerRegion = regionList.get(i);
-				checkAndAssignParent(oldNode, innerRegion);
-			}
-		}
-	}
-
-	/**
-	 * A change to a CDATA tag can result in all being reparsed.
-	 */
-	private StructuredDocumentEvent checkForCDATA() {
-		StructuredDocumentEvent result = null;
-		result = checkForCriticalKey("<![CDATA["); //$NON-NLS-1$
-		if (result == null)
-			result = checkForCriticalKey("]]>"); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * If a comment start or end tag is being added or deleted, we'll rescan
-	 * the whole document. The reason is that content that is revealed or
-	 * commented out can effect the interpretation of the rest of the
-	 * document. Note: for now this is very XML specific, can refactor/improve
-	 * later.
-	 */
-	protected StructuredDocumentEvent checkForComments() {
-		StructuredDocumentEvent result = null;
-		result = checkForCriticalKey("<!--"); //$NON-NLS-1$
-		if (result == null)
-			result = checkForCriticalKey("-->"); //$NON-NLS-1$
-		// we'll also check for these degenerate cases
-		if (result == null)
-			result = checkForCriticalKey("<!--->"); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * Common utility for checking for critical word such as " <SCRIPT>"
-	 */
-	protected StructuredDocumentEvent checkForCriticalKey(String criticalTarget) {
-		return _checkForCriticalWord(criticalTarget, false);
-	}
-
-	/**
-	 * Common utility for checking for critical word such as " <SCRIPT>"
-	 */
-	private StructuredDocumentEvent checkForCriticalName(String criticalTarget) {
-		return _checkForCriticalWord(criticalTarget, true);
-	}
-
-	//	/**
-	//	 * Currently this method is pretty specific to ?ML
-	//	 * @deprecated - not really deprecated, but plan to make
-	//	 * protected ... I'm not sure why its public or misspelled?
-	//	 */
-	protected StructuredDocumentEvent checkForCrossStructuredDocumentRegionBoundryCases() {
-		StructuredDocumentEvent result = null;
-		// Case 1: See if the language's syntax requires that multiple
-		// StructuredDocumentRegions be rescanned
-		if (result == null) {
-			result = checkForCrossStructuredDocumentRegionSyntax();
-		}
-		// Case 2: "block tags" whose content is left unparsed
-		if (result == null) {
-			Object parser = fStructuredDocument.getParser();
-			if (parser instanceof BlockTagParser) {
-				List blockTags = ((BlockTagParser) parser).getBlockMarkers();
-				result = _checkBlockNodeList(blockTags);
-			}
-		}
-		// FUTURE_TO_DO: is there a better place to do this?
-		// or! do we already do it some other more central place?
-		if (result != null) {
-			result.setDeletedText(fDeletedText);
-		}
-		return result;
-	}
-
-	/**
-	 * Allow a reparser to check for extra syntactic cases that require
-	 * parsing beyond the flatNode boundary.
-	 * 
-	 * This implementation is very XML-centric.
-	 */
-	protected StructuredDocumentEvent checkForCrossStructuredDocumentRegionSyntax() {
-		StructuredDocumentEvent result;
-		// Case 1: Quote characters are involved
-		result = checkForQuotes();
-		if (result == null) {
-			// Case 2: The input forms or undoes a comment beginning or
-			// comment
-			// end
-			result = checkForComments();
-		}
-		if (result == null) {
-			// Case 3: The input forms or undoes a processing instruction
-			result = checkForPI();
-		}
-		if (result == null) {
-			// Case 4: The input forms or undoes a CDATA section
-			result = checkForCDATA();
-		}
-		return result;
-	}
-
-	/**
-	 * Checks to see if change request exactly matches the text it would be
-	 * replacing. (In future, this, or similar method is where to check for
-	 * "read only" attempted change.)
-	 */
-	private StructuredDocumentEvent checkForNoChange() {
-		StructuredDocumentEvent result = null;
-		// don't check equals unless lengths match
-		// should be a tiny bit faster, since usually not
-		// of equal lengths (I'm surprised String's equals method
-		// doesn't do this.)
-		if ((fChanges != null) && (fDeletedText != null) && (fChanges.length() == fDeletedText.length()) && (fChanges.equals(fDeletedText))) {
-			result = new NoChangeEvent(fStructuredDocument, fRequester, fChanges, fStart, fLengthToReplace);
-		}
-		return result;
-	}
-
-	/**
-	 * A change to a PI tag can result in all being reparsed.
-	 */
-	private StructuredDocumentEvent checkForPI() {
-		StructuredDocumentEvent result = null;
-		result = checkForCriticalKey("<?"); //$NON-NLS-1$
-		if (result == null)
-			result = checkForCriticalKey("?>"); //$NON-NLS-1$
-		return result;
-	}
-
-	//  For simplicity, if either text to be deleted, or text to be inserted
-	// contains at least
-	//  one quote, we'll search for previous quote in document, if any, and use
-	// that flatnode as
-	//  a dirty start, and we'll use end of document as dirty end. We need to
-	// assume either \" or
-	//  \' is an exceptable quote. (NOTE: this is, loosely, an XML assumption
-	// --
-	// other languages
-	//  would differ, but we'll "hard code" for XML for now.
-	// future_TODO: this is a really bad heuristic ... we should be looking
-	// for
-	// odd number of quotes
-	// within a structuredDocumentRegion (or something!) This causes way too
-	// much reparsing on
-	// simple cases, like deleting a tag with a quoted attribute!
-	private StructuredDocumentEvent checkForQuotes() {
-		// routine is supported with null or empty string meaning the same
-		// thing: deletion
-		if (fChanges == null)
-			fChanges = ""; //$NON-NLS-1$
-		//
-		StructuredDocumentEvent result = null;
-		try {
-			int dirtyStartPos = -1;
-			String proposedDeletion = fStructuredDocument.get(fStart, fLengthToReplace);
-			if (fStart < fStructuredDocument.getLength()) {
-				if ((fChanges.indexOf(singleQuote) > -1) || (proposedDeletion.indexOf(singleQuote) > -1)) {
-					IRegion singleQuoteRegion = getFindReplaceDocumentAdapter().find(fStart, singleQuote, false, false, false, false);
-					if (singleQuoteRegion != null) {
-						dirtyStartPos = singleQuoteRegion.getOffset();
-					}
-				} else if ((fChanges.indexOf(doubleQuote) > -1) || (proposedDeletion.indexOf(doubleQuote) > -1)) {
-					IRegion doubleQuoteRegion = getFindReplaceDocumentAdapter().find(fStart, doubleQuote, false, false, false, false);
-					if (doubleQuoteRegion != null) {
-						dirtyStartPos = doubleQuoteRegion.getOffset();
-					}
-				}
-			}
-			if (dirtyStartPos > -1) {
-				// then we found one, do create new structuredDocument event
-				// based on the previous quote to end of document
-				// except, we need to be positive that the previous quote is
-				// in a "safe start" region (e.g. if in JSP content, we need
-				// to
-				// backup till we include the whole JSP region, in order for
-				// it
-				// to be correctly re-parsed. The backing up is done in the
-				// reparse/find dirty start from hint
-				// method.
-				result = reparse(dirtyStartPos, fStructuredDocument.getLength() - 1);
-			}
-		} catch (BadLocationException e) {
-			Logger.logException(e);
-		}
-		if (result != null) {
-			result.setDeletedText(fDeletedText);
-		}
-		return result;
-	}
-
-	private StructuredDocumentEvent checkHeuristics() {
-		StructuredDocumentEvent result = null;
-		result = checkForNoChange();
-		if (result == null) {
-			result = checkForCrossStructuredDocumentRegionBoundryCases();
-			if (result == null) {
-				result = quickCheck();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Takes into account "tag name" rules for comparisons; case-insensitive.
-	 */
-	private boolean checkTagNames(String compareText, String criticalTarget, boolean checkEnd) {
-		boolean result = false;
-		if ((compareText == null) || (criticalTarget == null))
-			return false;
-		int posOfCriticalWord = compareText.toLowerCase().indexOf(criticalTarget.toLowerCase());
-		result = posOfCriticalWord > -1;
-		if (checkEnd && result) {
-			// instead of returning true right away, we'll only return true
-			// the
-			// potentially matched tag is indeed a tag, for example, if
-			// <SCRIPT
-			// becomes <SCRIPTS we don't want to say the latter is a critical
-			// tag
-			int lastPos = posOfCriticalWord + criticalTarget.length();
-			if (lastPos < compareText.length()) {
-				char lastChar = compareText.charAt(lastPos);
-				// Future: check formal definition of this java method, vs.
-				// XML
-				// parsing rules
-				result = (!Character.isLetterOrDigit(lastChar));
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * The core reparsing method ... after the dirty start and dirty end have
-	 * been calculated elsewhere, and the text updated.
-	 */
-	protected StructuredDocumentEvent core_reparse(int rescanStart, int rescanEnd, CoreNodeList oldNodes, boolean firstTime) {
-		IStructuredDocumentRegion newNodesHead = null;
-		StructuredDocumentEvent result = null;
-		newNodesHead = _core_reparse_text(rescanStart, rescanEnd);
-		result = _core_reparse_update_model(newNodesHead, rescanStart, rescanEnd, oldNodes, firstTime);
-		return result;
-	}
-
-	/**
-	 * Resets state to "not parsing"
-	 */
-	private synchronized void endReParse() {
-		isParsing = false;
-		dirtyStart = null;
-		dirtyEnd = null;
-	}
-
-	protected IStructuredDocumentRegion findDirtyEnd(int end) {
-		// Caution: here's one place we have to cast
-		IStructuredDocumentRegion result = fStructuredDocument.getRegionAtCharacterOffset(end);
-		// if not well formed, get one past, if there is something there
-		if ((result != null) && (!result.isEnded())) {
-			if (result.getNext() != null) {
-				result = result.getNext();
-			}
-		}
-		// also, get one past if exactly equal to the end (this was needed
-		// as a simple fix to when a whole exact region is deleted.
-		// there's probably a better way.
-		if ((result != null) && (end == result.getEnd())) {
-			if (result.getNext() != null) {
-				result = result.getNext();
-			}
-		}
-		// moved to subclass for quick transition
-		// 12/6/2001 - Since we've changed the parser/scanner to allow a lone
-		// '<' without
-		// always interpretting it as start of a tag name, we need to be a
-		// little fancier, in order
-		// to "skip" over any plain 'ol content between the lone '<' and any
-		// potential meating
-		// regions past plain 'ol content.
-		//		if (isLoneOpenFollowedByContent(result) && (result.getNext() !=
-		// null)) {
-		//			result = result.getNext();
-		//		}
-		if (result != null)
-			fStructuredDocument.setCachedDocumentRegion(result);
-		dirtyEnd = result;
-		return dirtyEnd;
-	}
-
-	protected void findDirtyStart(int start) {
-		IStructuredDocumentRegion result = fStructuredDocument.getRegionAtCharacterOffset(start);
-		// heuristic: if the postion is exactly equal to the start, then
-		// go back one more, if it exists. This prevents problems with
-		// insertions
-		// of text that should be merged with the previous node instead of
-		// simply hung
-		// off of it as a separate node (ex.: XML content inserted right
-		// before
-		// an open
-		// bracket should become part of the previous content node)
-		if (result != null) {
-			IStructuredDocumentRegion previous = result.getPrevious();
-			if ((previous != null) && ((!(previous.isEnded())) || (start == result.getStart()))) {
-				result = previous;
-			}
-			// If we are now at the end of a "tag dependent" content area (or
-			// JSP area)
-			// then we need to back up all the way to the beginning of that.
-			IStructuredDocumentRegion potential = result;
-			// moved to subclass to speed transition
-			//			while (isPartOfBlockRegion(potential)) {
-			//				potential = potential.getPrevious();
-			//			}
-			if (potential != null) {
-				result = potential;
-				fStructuredDocument.setCachedDocumentRegion(result);
-			}
-		}
-		dirtyStart = result;
-	}
-
-	protected CoreNodeList formOldNodes(IStructuredDocumentRegion dirtyStart, IStructuredDocumentRegion dirtyEnd) {
-		CoreNodeList oldNodes = new CoreNodeList(dirtyStart, dirtyEnd);
-		// Now save the old text, that "goes with" the old nodes and regions.
-		// Notice we are getting it directly from the text store
-		String oldText = null;
-		int oldStart = -1;
-		int oldEnd = -1;
-		// make sure there is some text, if not, use empty string
-		// (if one node is not null, the other should ALWAYS be not null too,
-		// since it
-		// would at least be equal to it.)
-		if (dirtyStart != null) {
-			oldStart = dirtyStart.getStart();
-			oldEnd = dirtyEnd.getEnd();
-			oldText = fStructuredDocument.get(oldStart, oldEnd - oldStart);
-		} else {
-			oldStart = 0;
-			oldEnd = 0;
-			oldText = ""; //$NON-NLS-1$
-		}
-		// create a temporary text store for this text
-		SubSetTextStore subTextStore = new SubSetTextStore(oldText, oldStart, oldEnd, fStructuredDocument.getLength());
-		// Now update the text store of the oldNodes
-		StructuredDocumentRegionIterator.setParentDocument(oldNodes, new MinimalDocument(subTextStore));
-		return oldNodes;
-	}
-
-	/**
-	 * @return Returns the findReplaceDocumentAdapter.
-	 */
-	public FindReplaceDocumentAdapter getFindReplaceDocumentAdapter() {
-		if (fFindReplaceDocumentAdapter == null) {
-			fFindReplaceDocumentAdapter = new FindReplaceDocumentAdapter(fStructuredDocument);
-		}
-		return fFindReplaceDocumentAdapter;
-	}
-
-	// Note: if thead safety is needed, this and all the other public methods
-	// of this class
-	// should be synchronized.
-	public void initialize(Object requester, int start, int lengthToReplace, String changes) {
-		isParsing = true;
-		fRequester = requester;
-		fStart = start;
-		fLengthToReplace = lengthToReplace;
-		fChanges = changes;
-		// notice this one is derived
-		fLengthDifference = Utilities.calculateLengthDifference(fChanges, fLengthToReplace);
-		fDeletedText = fStructuredDocument.get(fStart, fLengthToReplace);
-	}
-
-	protected void insertNodes(IStructuredDocumentRegion previousOldNode, IStructuredDocumentRegion nextOldNode, CoreNodeList newNodes) {
-		//
-		IStructuredDocumentRegion firstNew = null;
-		IStructuredDocumentRegion lastNew = null;
-		//
-		IStructuredDocumentRegion oldPrevious = previousOldNode;
-		IStructuredDocumentRegion oldNext = nextOldNode;
-		//
-		if (newNodes.getLength() > 0) {
-			// get pointers
-			firstNew = newNodes.item(0);
-			lastNew = newNodes.item(newNodes.getLength() - 1);
-			// switch surrounding StructuredDocumentRegions' references to
-			// lists
-			if (oldPrevious != null)
-				oldPrevious.setNext(firstNew);
-			if (oldNext != null) {
-				oldNext.setPrevious(lastNew);
-			} else {
-				// SIDE EFFECT
-				// if oldNext is null, that means we are replaceing the
-				// lastNode in the chain,
-				// so we need to update the structuredDocuments lastNode as
-				// the
-				// last of the new nodes.
-				fStructuredDocument.setLastDocumentRegion(newNodes.item(newNodes.getLength() - 1));
-			}
-			if (firstNew != null)
-				firstNew.setPrevious(oldPrevious);
-			if (lastNew != null)
-				lastNew.setNext(oldNext);
-		}
-		// else nothing to insert
-	}
-
-	/**
-	 * @param oldRegion
-	 */
-	private boolean isCollectionRegion(ITextRegion aRegion) {
-		return (aRegion instanceof ITextRegionCollection);
-	}
-
-	/**
-	 * @return boolean
-	 */
-	public boolean isParsing() {
-		return isParsing;
-	}
-
-	/**
-	 * The minimization algorithm simply checks the old nodes to see if any of
-	 * them "survived" the rescan and are unchanged. If so, the instance of
-	 * the old node is used instead of the new node. Before the requested
-	 * change, need to check type, offsets, and text to determine if the same.
-	 * After the requested change, need to check type and text, but adjust the
-	 * offsets to what ever the change was.
-	 */
-	protected StructuredDocumentEvent minimumEvent(CoreNodeList oldNodes, CoreNodeList newNodes) {
-		StructuredDocumentEvent event = null;
-		CoreNodeList minimalOldNodes = null;
-		CoreNodeList minimalNewNodes = null;
-		// To minimize nodes, we'll collect all those
-		// that are not equal into old and new lists
-		// Note: we assume that old and new nodes
-		// are basically contiguous -- and we force it to be so,
-		// by starting at the beginning to
-		// find first difference, and then starting at the end to find
-		// last difference. Everything in between we assume is different.
-		//
-		//
-		//
-		// startOfDifferences is the index into the core node list where the
-		// first difference
-		// occurs. But it may point into the old or the new list.
-		int startOfDifferences = _computeStartOfDifferences(oldNodes, newNodes);
-		int endOfDifferencesOld = -1;
-		int endOfDifferencesNew = -1;
-		// if one of the lists are shorter than where the differences start,
-		// then
-		// then some portion of the lists are identical
-		if ((startOfDifferences >= oldNodes.getLength()) || (startOfDifferences >= newNodes.getLength())) {
-			if (oldNodes.getLength() < newNodes.getLength()) {
-				// Then there are new regions to add
-				//     these lengths will cause the vector of old ones to not
-				//     have any elements, and the vector of new regions to have
-				//     just the new ones not in common with the old ones
-				//startOfDifferences should equal oldNodes.getLength(),
-				// calculated above on _computeStartOfDifferences
-				minimalOldNodes = EMPTY_LIST;
-				endOfDifferencesNew = newNodes.getLength() - 1;
-				minimalNewNodes = _formMinimumList(newNodes, startOfDifferences, endOfDifferencesNew);
-			} else {
-				if (oldNodes.getLength() > newNodes.getLength()) {
-					// delete old
-					// then there are old regions to delete
-					//    these lengths will cause the vector of old regions to
-					//    contain the ones to delete, and the vector of new
-					// regions
-					//    not have any elements
-					//startOfDifferences should equal newNodes.getLength(),
-					// calculated above on _computeStartOfDifferences
-					endOfDifferencesOld = oldNodes.getLength() - 1;
-					minimalOldNodes = _formMinimumList(oldNodes, startOfDifferences, endOfDifferencesOld);
-					minimalNewNodes = EMPTY_LIST;
-				} else
-					// unlikely event
-					event = new NoChangeEvent(fStructuredDocument, fRequester, fChanges, fStart, fLengthToReplace);
-			}
-		} else {
-			// We found a normal startOfDiffernces, but have not yet found the
-			// ends.
-			// We'll look for the end of differences by going backwards down
-			// the two lists.
-			// Here we need a seperate index for each array, since they may be
-			// (and
-			// probably are) of different lengths.
-			int indexOld = oldNodes.getLength() - 1;
-			int indexNew = newNodes.getLength() - 1;
-			// The greaterThanEffectedRegion is important to gaurd against
-			// incorrect counting
-			// when something identical is inserted to what's already there
-			// (see minimization test case 5)
-			// Note: the indexOld > startOfDifferences keeps indexOld from
-			// getting too small,
-			// so that the subsequent oldNodes.item(indexOld) is always valid.
-			while ((indexOld >= startOfDifferences) && (_greaterThanEffectedRegion(oldNodes.item(indexOld)))) {
-				if (!(oldNodes.item(indexOld).sameAs(newNodes.item(indexNew), fLengthDifference))) {
-					break;
-				} else {
-					// if they are equal, then we will be keeping the old one,
-					// so
-					// we need to be sure its parentDocument is set back to
-					// the
-					// right instance
-					oldNodes.item(indexOld).setParentDocument(fStructuredDocument);
-				}
-				indexOld--;
-				indexNew--;
-			}
-			endOfDifferencesOld = indexOld;
-			endOfDifferencesNew = indexNew;
-			minimalOldNodes = _formMinimumList(oldNodes, startOfDifferences, endOfDifferencesOld);
-			minimalNewNodes = _formMinimumList(newNodes, startOfDifferences, endOfDifferencesNew);
-		} /////////////////////////////////////////
-		//
-		IStructuredDocumentRegion firstDownStreamNode = null;
-		event = regionCheck(minimalOldNodes, minimalNewNodes);
-		if (event != null) {
-			firstDownStreamNode = minimalOldNodes.item(0).getNext();
-			if (firstDownStreamNode != null && fLengthDifference != 0) { // if
-				// firstDownStream
-				// is
-				// null,
-				// then
-				// we're
-				// at
-				// the
-				// end
-				// of
-				// the
-				// document
-				StructuredDocumentRegionIterator.adjustStart(firstDownStreamNode, fLengthDifference);
-			} //
-		} else {
-			event = nodesReplacedCheck(minimalOldNodes, minimalNewNodes);
-			// now splice the new chain of nodes to where the old chain is (or
-			// was)
-			// the firstDownStreamNode (the first of those after the new
-			// nodes)
-			// is
-			// remembered as a tiny optimization.
-			if (minimalOldNodes.getLength() == 0 && minimalNewNodes.getLength() > 0) {
-				// if no old nodes are being deleted, then use the
-				// the newNodes offset (minus one) to find the point to
-				// update downstream nodes, and after updating downstream
-				// nodes postions, insert the new ones.
-				int insertOffset = minimalNewNodes.item(0).getStartOffset();
-				IStructuredDocumentRegion lastOldUnchangedNode = null;
-				if (insertOffset > 0) {
-					lastOldUnchangedNode = fStructuredDocument.getRegionAtCharacterOffset(insertOffset - 1);
-					firstDownStreamNode = lastOldUnchangedNode.getNext();
-				} else {
-					// we're inserting at very beginning
-					firstDownStreamNode = fStructuredDocument.getFirstStructuredDocumentRegion();
-					// SIDE EFFECT: change the firstNode pointer if we're
-					// inserting at beginning
-					fStructuredDocument.setFirstDocumentRegion(minimalNewNodes.item(0));
-				}
-				StructuredDocumentRegionIterator.adjustStart(firstDownStreamNode, fLengthDifference);
-				insertNodes(lastOldUnchangedNode, firstDownStreamNode, minimalNewNodes);
-				// this (nodes replaced) is the only case where we need to
-				// update the cached Node
-				reSetCachedNode(minimalOldNodes, minimalNewNodes);
-			} else {
-				firstDownStreamNode = switchNodeLists(minimalOldNodes, minimalNewNodes);
-				// no need to adjust the length of the new nodes themselves,
-				// they
-				// are already correct, but we do need to
-				// adjust all "down stream" nodes with the length of the
-				// insertion or deletion
-				// --- adjustment moved to calling method.
-				if (firstDownStreamNode != null) {
-					// && event != null
-					StructuredDocumentRegionIterator.adjustStart(firstDownStreamNode, fLengthDifference);
-				} //
-				// this (nodes replaced) is the only case where we need to
-				// update the cached Node
-				reSetCachedNode(minimalOldNodes, minimalNewNodes);
-			}
-		}
-		return event;
-	}
-
-	// TODO: This should be abstract.
-	public IStructuredTextReParser newInstance() {
-		return new StructuredDocumentReParser();
-	}
-
-	protected StructuredDocumentEvent nodesReplacedCheck(CoreNodeList oldNodes, CoreNodeList newNodes) {
-		// actually, nothing to check here, since (and assuming) we've already
-		// minimized the number of nodes, and ruled out mere region changes
-		StructuredDocumentEvent result = new StructuredDocumentRegionsReplacedEvent(fStructuredDocument, fRequester, oldNodes, newNodes, fChanges, fStart, fLengthToReplace);
-		return result;
-	}
-
-	/**
-	 * A method to allow any heuristic "quick checks" that might cover many
-	 * many cases, before expending the time on a full reparse.
-	 *  
-	 */
-	public StructuredDocumentEvent quickCheck() {
-		StructuredDocumentEvent result = null;
-		// if the dirty start is null, then we have an empty document.
-		// in which case we'll return null so everything can be
-		// reparsed "from scratch" . If its not null, we'll give the flatnode
-		// a
-		// chance
-		// to handle, but only if there is one flatnode involved.
-		if (dirtyStart != null && dirtyStart == dirtyEnd) {
-			IStructuredDocumentRegion targetNode = dirtyStart;
-			result = dirtyStart.updateRegion(fRequester, targetNode, fChanges, fStart, fLengthToReplace);
-			if (result != null) {
-				// at this point only, we need to update the text store and
-				// and downstream nodes.
-				// FUTURE_TO_DO: can this dependency on structuredDocument
-				// method be eliminated?
-				fStructuredDocument.updateDocumentData(fStart, fLengthToReplace, fChanges);
-				IStructuredDocumentRegion firstDownStreamNode = targetNode.getNext();
-				// then flatnode must have been the last one, so need to
-				// update
-				// any downstream ones
-				if (firstDownStreamNode != null) {
-					StructuredDocumentRegionIterator.adjustStart(firstDownStreamNode, fLengthDifference);
-				}
-			}
-		}
-		if (result != null) {
-			result.setDeletedText(fDeletedText);
-		}
-		return result;
-	}
-
-	/**
-	 * If only one node is involved, sees how many regions are changed. If
-	 * only one, then its a 'regionChanged' event ... if more than one, its a
-	 * 'regionsReplaced' event.
-	 */
-	protected StructuredDocumentEvent regionCheck(CoreNodeList oldNodes, CoreNodeList newNodes) {
-		if (Debug.debugStructuredDocument)
-			System.out.println("IStructuredDocument::regionsReplacedCheck"); //$NON-NLS-1$
-		//$NON-NLS-1$
-		//$NON-NLS-1$
-		// the "regionsReplaced" event could only be true if and only if the
-		// nodelists
-		// are each only "1" in length.
-		StructuredDocumentEvent result = null;
-		int oldLength = oldNodes.getLength();
-		int newLength = newNodes.getLength();
-		if ((oldLength != 1) || (newLength != 1)) {
-			result = null;
-		} else {
-			IStructuredDocumentRegion oldNode = oldNodes.item(0);
-			IStructuredDocumentRegion newNode = newNodes.item(0);
-			result = regionCheck(oldNode, newNode);
-		}
-		return result;
-	}
-
-	/**
-	 * If only one node is involved, sees how many regions are changed. If
-	 * only one, then its a 'regionChanged' event ... if more than one, its a
-	 * 'regionsReplaced' event.
-	 */
-	protected StructuredDocumentEvent regionCheck(IStructuredDocumentRegion oldNode, IStructuredDocumentRegion newNode) {
-		//
-		StructuredDocumentEvent result = null;
-		ITextRegionList oldRegions = oldNode.getRegions();
-		ITextRegionList newRegions = newNode.getRegions();
-		ITextRegion[] oldRegionsArray = oldRegions.toArray();
-		ITextRegion[] newRegionsArray = newRegions.toArray();
-		//
-		// for the 'regionsReplaced' event, we don't care if
-		// the regions changed due to type, or text,
-		// we'll just collect all those that are not equal
-		// into the old and new region lists.
-		// Note: we, of course, assume that old and new regions
-		// are basically contiguous -- and we force it to be so,
-		// even if not literally so, by starting at beginning to
-		// find first difference, and then starting at end to find
-		// last difference. Everything in between we assume is different.
-		//
-		// going up is easy, we start at zero in each, and continue
-		// till regions are not the same.
-		int startOfDifferences = _computeStartOfDifferences(oldNode, oldRegions, newNode, newRegions);
-		int endOfDifferencesOld = -1;
-		int endOfDifferencesNew = -1;
-		//
-		//
-		// if one of the lists are shorter than where the differences start,
-		// then
-		// then some portion of the lists are identical
-		if ((startOfDifferences >= oldRegions.size()) || (startOfDifferences >= newRegions.size())) {
-			if (oldRegions.size() < newRegions.size()) {
-				// INSERT CASE
-				// then there are new regions to add
-				//     these lengths will cause the vector of old ones to not
-				//     have any elements, and the vector of new regions to have
-				//     just the new ones.
-				startOfDifferences = oldRegionsArray.length;
-				endOfDifferencesOld = oldRegionsArray.length - 1;
-				endOfDifferencesNew = newRegionsArray.length - 1;
-			} else {
-				if (oldRegions.size() > newRegions.size()) {
-					// DELETE CASE
-					// then there are old regions to delete
-					//    these lengths will cause the vector of old regions to
-					//    contain the ones to delete, and the vector of new
-					// regions
-					//    not have any elements
-					startOfDifferences = newRegionsArray.length;
-					endOfDifferencesOld = oldRegionsArray.length - 1;
-					endOfDifferencesNew = newRegionsArray.length - 1;
-				} else {
-					// else the lists are identical!
-					// unlikely event, probably error in current design, since
-					// we check for identity at the very beginning of
-					// reparsing.
-					result = new NoChangeEvent(fStructuredDocument, fRequester, fChanges, fStart, fLengthToReplace);
-				}
-			}
-		} else {
-			if ((startOfDifferences > -1) && (endOfDifferencesOld < 0) && (endOfDifferencesNew < 0)) {
-				// We found a normal startOfDiffernces, but have not yet found
-				// the ends.
-				// We'll look for the end of differences by going backwards
-				// down the two lists.
-				// Here we need a seperate index for each array, since they
-				// may
-				// be (and
-				// probably are) of different lengths.
-				int indexOld = oldRegionsArray.length - 1;
-				int indexNew = newRegionsArray.length - 1;
-				while ((indexOld >= startOfDifferences) && (_greaterThanEffectedRegion(oldNode, oldRegionsArray[indexOld]))) {
-					if ((!(oldNode.sameAs(oldRegionsArray[indexOld], newNode, newRegionsArray[indexNew], fLengthDifference)))) {
-						//endOfDifferencesOld = indexOne;
-						//endOfDifferencesNew = indexTwo;
-						break;
-					}
-					indexOld--;
-					indexNew--;
-				}
-				endOfDifferencesOld = indexOld;
-				endOfDifferencesNew = indexNew;
-			}
-		}
-		//
-		// result != null means the impossible case above occurred
-		if (result == null) {
-			// Now form the two vectors of different regions
-			ITextRegionList holdOldRegions = new TextRegionListImpl();
-			ITextRegionList holdNewRegions = new TextRegionListImpl();
-			if (startOfDifferences > -1 && endOfDifferencesOld > -1) {
-				for (int i = startOfDifferences; i <= endOfDifferencesOld; i++) {
-					holdOldRegions.add(oldRegionsArray[i]);
-				}
-			}
-			if (startOfDifferences > -1 && endOfDifferencesNew > -1) {
-				for (int i = startOfDifferences; i <= endOfDifferencesNew; i++) {
-					holdNewRegions.add(newRegionsArray[i]);
-				}
-			}
-			if (holdOldRegions.size() == 0 && holdNewRegions.size() == 0) {
-				// then this means the regions were identical, which means
-				// someone
-				// pasted exactly the same thing they had selected, or !!!
-				// someone deleted the end bracket of the tag. !!!?
-				result = new NoChangeEvent(fStructuredDocument, fRequester, fChanges, fStart, fLengthToReplace);
-			} else {
-				//If both holdOldRegions and holdNewRegions are of length 1,
-				// then its
-				// a "region changed" event, else a "regions replaced" event.
-				// so we want the new instance of region to become part of the
-				// old instance of old node
-				if ((holdOldRegions.size() == 1) && (holdNewRegions.size() == 1) && _regionsSameKind((holdNewRegions.get(0)), (holdOldRegions.get(0)))) {
-					ITextRegion newOldRegion = swapNewForOldRegion(oldNode, holdOldRegions.get(0), newNode, holdNewRegions.get(0));
-					// -- need to update any down stream regions, within this
-					// 'oldNode'
-					updateDownStreamRegions(oldNode, newOldRegion);
-					result = new RegionChangedEvent(fStructuredDocument, fRequester, oldNode, newOldRegion, fChanges, fStart, fLengthToReplace);
-				} else {
-					replaceRegions(oldNode, holdOldRegions, newNode, holdNewRegions);
-					// -- need to update any down stream regions, within this
-					// 'oldNode'
-					// don't need with the way replaceRegions is implemented.
-					// It handles.
-					//if(holdNewRegions.size() > 0)
-					//updateDownStreamRegions(oldNode, (ITextRegion)
-					// holdNewRegions.lastElement());
-					result = new RegionsReplacedEvent(fStructuredDocument, fRequester, oldNode, holdOldRegions, holdNewRegions, fChanges, fStart, fLengthToReplace);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * An entry point for reparsing. It calculates the dirty start and dirty
-	 * end flatnodes based on the start point and length of the changes.
-	 *  
-	 */
-	public StructuredDocumentEvent reparse() {
-		StructuredDocumentEvent result = null;
-		// if we do not have a cachedNode, then the document
-		// must be empty, so simply use 'null' as the dirtyStart and dirtyEnd
-		// otherwise, find them.
-		if (fStructuredDocument.getCachedDocumentRegion() != null) {
-			findDirtyStart(fStart);
-			int end = fStart + fLengthToReplace;
-			findDirtyEnd(end);
-		}
-		if (fStructuredDocument.getCachedDocumentRegion() != null) {
-			result = checkHeuristics();
-		}
-		if (result == null) {
-			result = reparse(dirtyStart, dirtyEnd);
-		}
-		endReParse();
-		return result;
-	}
-
-	/**
-	 * An entry point for reparsing. It calculates the dirty start and dirty
-	 * end flatnodes based on suggested positions to begin and end. This is
-	 * needed for cases where parsing must go beyond the immediate node and
-	 * its direct neighbors.
-	 *  
-	 */
-	protected StructuredDocumentEvent reparse(int reScanStartHint, int reScanEndHint) {
-		StructuredDocumentEvent result = null;
-		// if we do not have a cachedNode, then the document
-		// must be empty, so simply use 'null' as the dirtyStart and dirtyEnd
-		if (fStructuredDocument.getCachedDocumentRegion() != null) {
-			findDirtyStart(reScanStartHint);
-			findDirtyEnd(reScanEndHint);
-		}
-		result = reparse(dirtyStart, dirtyEnd);
-		isParsing = false;
-		// debug
-		//verifyStructured(result);
-		return result;
-	}
-
-	/**
-	 * The core reparsing method ... after the dirty start and dirty end have
-	 * been calculated elsewhere.
-	 */
-	protected StructuredDocumentEvent reparse(IStructuredDocumentRegion dirtyStart, IStructuredDocumentRegion dirtyEnd) {
-		StructuredDocumentEvent result = null;
-		int rescanStart = -1;
-		int rescanEnd = -1;
-		boolean firstTime = false;
-		//
-		// "save" the oldNodes (that may be replaced) in a list
-		CoreNodeList oldNodes = formOldNodes(dirtyStart, dirtyEnd);
-		if (dirtyStart == null || dirtyEnd == null) {
-			// dirtyStart or dirty end are null, then that means we didn't
-			// have
-			// a
-			// cached node, which means we have an empty document, so we
-			// just need to rescan the changes
-			rescanStart = 0;
-			rescanEnd = fChanges.length();
-			firstTime = true;
-		} else {
-			// set the start of the text to rescan
-			rescanStart = dirtyStart.getStart();
-			//
-			// set the end of the text to rescan
-			// notice we use the same rationale as for the rescanStart,
-			// with the added caveat that length has to be added to it,
-			// to compensate for the new text which has been added or deleted.
-			// If changes has zero length, then "length" will be negative,
-			// since
-			// we are deleting text. Otherwise, use the difference between
-			// what's selected to be replaced and the length of the new text.
-			rescanEnd = dirtyEnd.getEnd() + fLengthDifference;
-		}
-		// now that we have the old stuff "saved" away, update the document
-		// with the changes.
-		// FUTURE_TO_DO -- don't fire "document changed" event till later
-		fStructuredDocument.updateDocumentData(fStart, fLengthToReplace, fChanges);
-		// ------------------ now the real work
-		result = core_reparse(rescanStart, rescanEnd, oldNodes, firstTime);
-		//
-		// event is returned to the caller, incase there is
-		// some opitmization they can do
-		return result;
-	}
-
-	protected void replaceRegions(IStructuredDocumentRegion oldNode, ITextRegionList oldRegions, IStructuredDocumentRegion newNode, ITextRegionList newRegions) {
-		int insertPos = -1;
-		ITextRegionList regions = oldNode.getRegions();
-		// make a fake flatnode to be new parent of oldRegions, so their text
-		// will be right.
-		//IStructuredDocumentRegion holdOldStructuredDocumentRegion = new
-		// BasicStructuredDocumentRegion(oldNode);
-		//
-		// need to reset the parent of the new to-be-inserted regions to be
-		// the
-		// same oldNode that is the one having its regions changed
-		// DW, 4/16/2003, removed since ITextRegion no longer has parent.
-		// 		ITextRegionContainer oldParent = oldNode;
-		//		for (int i = 0; i < newRegions.size(); i++) {
-		//			AbstractRegion region = (AbstractRegion) newRegions.elementAt(i);
-		//			region.setParent(oldParent);
-		//		}
-		// if there are no old regions, insert the new regions according to
-		// offset
-		if (oldRegions.size() == 0) {
-			ITextRegion firstNewRegion = newRegions.get(0);
-			int firstOffset = newNode.getStartOffset(firstNewRegion);
-			// if at beginning, insert there
-			if (firstOffset == 0) {
-				insertPos = 0;
-			} else {
-				//
-				ITextRegion regionAtOffset = oldNode.getRegionAtCharacterOffset(firstOffset);
-				if (regionAtOffset == null)
-					insertPos = regions.size();
-				else
-					insertPos = regions.indexOf(regionAtOffset);
-			}
-		} else {
-			// else, delete old ones before inserting new ones in their place
-			ITextRegion firstOldRegion = oldRegions.get(0);
-			insertPos = regions.indexOf(firstOldRegion);
-			regions.removeAll(oldRegions);
-		}
-		regions.addAll(insertPos, newRegions);
-		// now regions vector of each node should be of equal length,
-		// so go through each, and make sure the old regions
-		// offsets matches the new regions offsets
-		// (we'll just assign them all, but could be slightly more effiecient)
-		ITextRegionList allNewRegions = newNode.getRegions();
-		for (int i = 0; i < regions.size(); i++) {
-			ITextRegion nextOldishRegion = regions.get(i);
-			ITextRegion nextNewRegion = allNewRegions.get(i);
-			nextOldishRegion.equatePositions(nextNewRegion);
-			checkAndAssignParent(oldNode, nextOldishRegion);
-		}
-		oldNode.setLength(newNode.getLength());
-		oldNode.setEnded(newNode.isEnded());
-		oldNode.setParentDocument(newNode.getParentDocument());
-		// removed concept of part of these regions, so no longer need to do.
-		//		for (int i = 0; i < oldRegions.size(); i++) {
-		//			ITextRegion region = (ITextRegion) oldRegions.elementAt(i);
-		//			region.setParent(holdOldStructuredDocumentRegion);
-		//		}
-	}
-
-	private void reSetCachedNode(CoreNodeList oldNodes, CoreNodeList newNodes) {
-		// use the last newNode as the new cachedNode postion, unless its null
-		// (e.g. when nodes are deleted) in which case, assign
-		// it to a "safe" node so we don't lose reference to the
-		// structuredDocument!
-		if (newNodes.getLength() > 0) {
-			// use last new node as the cache
-			fStructuredDocument.setCachedDocumentRegion(newNodes.item(newNodes.getLength() - 1));
-		} else {
-			// if cachedNode is an old node, then we're in trouble:
-			// we can't leave it as the cached node! and its already
-			// been disconnected from the model, so we can't do getNext
-			// or getPrevious, so we'll get one that is right before
-			// (or right after) the offset of the old nodes that are being
-			// deleted.
-			// 
-			// if newNodesHead and cachedNode are both null, then
-			// it means we were asked to insert an empty string into
-			// an empty document. So we have nothing to do here
-			// (that is, we have no node to cache)
-			// similarly if there are no new nodes and no old nodes then
-			// nothing to do (but that should never happen ... we shouldn't
-			// get there if there is no event to generate).
-			if ((fStructuredDocument.getCachedDocumentRegion() != null) && (oldNodes.getLength() > 0)) {
-				// note: we can't simple use nodeAtCharacterOffset, since it
-				// depends on cachedNode.
-				if (oldNodes.includes(fStructuredDocument.getCachedDocumentRegion()))
-					fStructuredDocument.setCachedDocumentRegion(fStructuredDocument.getFirstStructuredDocumentRegion());
-			}
-			if ((fStructuredDocument.getCachedDocumentRegion() == null) && (Debug.displayWarnings)) {
-				// this will happen now legitamately when all text is deleted
-				// from a document
-				System.out.println("Warning: StructuredDocumentReParser::reSetCachedNode: could not find a node to cache! (its ok if all text deleted)"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public void setStructuredDocument(IStructuredDocument newStructuredDocument) {
-		// NOTE: this method (and class) depend on being able to
-		// do the following cast (i.e. references some fields directly)
-		fStructuredDocument = (BasicStructuredDocument) newStructuredDocument;
-		fFindReplaceDocumentAdapter = null;
-	}
-
-	private IStructuredDocumentRegion splice(CoreNodeList oldNodes, CoreNodeList newNodes) {
-		//
-		IStructuredDocumentRegion firstOld = null;
-		IStructuredDocumentRegion firstNew = null;
-		IStructuredDocumentRegion lastOld = null;
-		IStructuredDocumentRegion lastNew = null;
-		//
-		IStructuredDocumentRegion oldPrevious = null;
-		IStructuredDocumentRegion oldNext = null;
-		IStructuredDocumentRegion newPrevious = null;
-		IStructuredDocumentRegion newNext = null;
-		//
-		// if called with both arguments empty lists, we can disregard.
-		// this happens, for example, when some text is replaced with the
-		// identical text.
-		if ((oldNodes.getLength() == 0) && (newNodes.getLength() == 0)) {
-			return null;
-		}
-		// get pointers
-		if (newNodes.getLength() > 0) {
-			firstNew = newNodes.item(0);
-			lastNew = newNodes.item(newNodes.getLength() - 1);
-		}
-		//
-		if (oldNodes.getLength() > 0) {
-			firstOld = oldNodes.item(0);
-			lastOld = oldNodes.item(oldNodes.getLength() - 1);
-			if (firstOld != null)
-				oldPrevious = firstOld.getPrevious();
-			if (lastOld != null)
-				oldNext = lastOld.getNext();
-		}
-		// handle switch
-		if (newNodes.getLength() > 0) {
-			// switch surrounding StructuredDocumentRegions' references to
-			// lists
-			if (oldPrevious != null)
-				oldPrevious.setNext(firstNew);
-			if (newPrevious != null)
-				newPrevious.setNext(firstOld);
-			if (oldNext != null)
-				oldNext.setPrevious(lastNew);
-			if (newNext != null)
-				newNext.setPrevious(lastOld);
-			// switch list pointers to surrounding StructuredDocumentRegions
-			if (firstOld != null)
-				firstOld.setPrevious(newPrevious);
-			if (lastOld != null)
-				lastOld.setNext(newNext);
-			if (firstNew != null)
-				firstNew.setPrevious(oldPrevious);
-			if (lastNew != null)
-				lastNew.setNext(oldNext);
-		} else {
-			// short circuit when there are no new nodes
-			if (oldPrevious != null)
-				oldPrevious.setNext(oldNext);
-			if (oldNext != null)
-				oldNext.setPrevious(oldPrevious);
-		}
-		//
-		// SIDE EFFECTs
-		// if we have oldNodes, and if oldNext or oldPrevious is null,
-		// that means we are replacing
-		// the lastNode or firstNode the structuredDocuments's chain of nodes,
-		// so we need to update the structuredDocuments last or first Node
-		// as the last or first of the new nodes.
-		// (and sometimes even these will be null! such as when deleting all
-		// text in a document).
-		if ((oldNext == null) && (oldNodes.getLength() > 0)) {
-			if (newNodes.getLength() > 0) {
-				fStructuredDocument.setLastDocumentRegion(lastNew);
-			} else {
-				// in this case, the last node is being deleted, but not
-				// replaced
-				// with anything. In this case, we can just back up one
-				// from the first old node
-				fStructuredDocument.setLastDocumentRegion(firstOld.getPrevious());
-			}
-		}
-		if ((oldPrevious == null) && (oldNodes.getLength() > 0)) {
-			if (newNodes.getLength() > 0) {
-				fStructuredDocument.setFirstDocumentRegion(firstNew);
-			} else {
-				// in this case the first node is being deleted, but not
-				// replaced
-				// with anything. So, we just go one forward past the last old
-				// node.
-				fStructuredDocument.setFirstDocumentRegion(lastOld.getNext());
-			}
-		}
-		// as a tiny optimization, we return the first of the downstream
-		// nodes,
-		// if any
-		return oldNext;
-	}
-
-	/**
-	 * The purpose of this method is to "reuse" the old container region, when
-	 * found to be same (so same instance doesn't change). The goal is to
-	 * "transform" the old region, so its equivelent to the newly parsed one.
-	 *  
-	 */
-	private ITextRegion swapNewForOldRegion(IStructuredDocumentRegion oldNode, ITextRegion oldRegion, IStructuredDocumentRegion newNode, ITextRegion newRegion) {
-		// makes the old region instance the correct size.
-		oldRegion.equatePositions(newRegion);
-		// adjusts old node instance appropriately
-		oldNode.setLength(newNode.getLength());
-		oldNode.setEnded(newNode.isEnded());
-		// we do have to set the parent document, since the oldNode's
-		// were set to a temporary one, then newNode's have the
-		// right one.
-		oldNode.setParentDocument(newNode.getParentDocument());
-		// if we're transforming a container region, we need to be sure to
-		// transfer the new embedded regions, to the old parent
-		// Note: if oldRegion hasEmbeddedRegions, then we know the
-		// newRegion does too, since we got here because they were the
-		// same type.
-		if (isCollectionRegion(oldRegion)) { // ||
-			// hasContainerRegions(oldRegion))
-			// {
-			transferEmbeddedRegions(oldNode, (ITextRegionContainer) oldRegion, (ITextRegionContainer) newRegion);
-		}
-		return oldRegion;
-	}
-
-	private IStructuredDocumentRegion switchNodeLists(CoreNodeList oldNodes, CoreNodeList newNodes) {
-		IStructuredDocumentRegion result = splice(oldNodes, newNodes);
-		// ensure that the old nodes hold no references to the existing model
-		if (oldNodes.getLength() > 0) {
-			IStructuredDocumentRegion firstItem = oldNodes.item(0);
-			firstItem.setPrevious(null);
-			IStructuredDocumentRegion lastItem = oldNodes.item(oldNodes.getLength() - 1);
-			lastItem.setNext(null);
-		}
-		return result;
-	}
-
-	/**
-	 * The purpose of this method is to "reuse" the old container region, when
-	 * found to be same (so same instance doesn't change). The goal is to
-	 * "transform" the old region, so its equivelent to the newly parsed one.
-	 *  
-	 */
-	private void transferEmbeddedRegions(IStructuredDocumentRegion oldNode, ITextRegionContainer oldRegion, ITextRegionContainer newRegion) {
-		// the oldRegion should already have the right parent, since
-		// we got here because all's equivelent except the region
-		// postions have changed.
-		//oldRegion.setParent(newRegion.getParent());
-		// but we should check if there's "nested" embedded regions, and if
-		// so, we can just move them over. setting their parent as this old
-		// region.
-		ITextRegionList newRegionsToTransfer = newRegion.getRegions();
-		oldRegion.setRegions(newRegionsToTransfer);
-		Iterator newRegionsInOldOne = newRegionsToTransfer.iterator();
-		while (newRegionsInOldOne.hasNext()) {
-			ITextRegion newOne = (ITextRegion) newRegionsInOldOne.next();
-			if (isCollectionRegion(newOne)) { // ||
-				// hasContainerRegions(newOne)) {
-				//((ITextRegionContainer) newOne).setParent(oldRegion);
-				oldRegion.setRegions(newRegion.getRegions());
-			}
-		}
-	}
-
-	private void updateDownStreamRegions(IStructuredDocumentRegion flatNode, ITextRegion lastKnownRegion) {
-		// so all regions after the last known region (last known to be ok)
-		// have to have their start and end values adjusted.
-		ITextRegionList regions = flatNode.getRegions();
-		int listLength = regions.size();
-		int startIndex = 0;
-		// first, loop through to find where to start
-		for (int i = 0; i < listLength; i++) {
-			ITextRegion region = regions.get(i);
-			if (region == lastKnownRegion) {
-				startIndex = i;
-				break;
-			}
-		}
-		// now, beginning one past the last known one, loop
-		// through to end of list, adjusting the start and end postions.
-		startIndex++;
-		for (int j = startIndex; j < listLength; j++) {
-			ITextRegion region = regions.get(j);
-			region.adjustStart(fLengthDifference);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentRegionEnumeration.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentRegionEnumeration.java
deleted file mode 100644
index 1191198..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentRegionEnumeration.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-
-
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.util.Debug;
-
-
-public class StructuredDocumentRegionEnumeration implements Enumeration {
-
-	private int count;
-	private IStructuredDocumentRegion head;
-	private IStructuredDocumentRegion oldHead;
-
-	/**
-	 * StructuredDocumentRegionEnumeration constructor comment.
-	 */
-	public StructuredDocumentRegionEnumeration(IStructuredDocumentRegion newHead) {
-		super();
-		IStructuredDocumentRegion countNode = head = newHead;
-		while (countNode != null) {
-			count++;
-			countNode = countNode.getNext();
-		}
-		if (Debug.DEBUG > 5) {
-			System.out.println("N Nodes in StructuredDocumentRegionEnumeration Contructor: " + count); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * StructuredDocumentRegionEnumeration constructor comment.
-	 */
-	public StructuredDocumentRegionEnumeration(IStructuredDocumentRegion start, IStructuredDocumentRegion end) {
-		super();
-		IStructuredDocumentRegion countNode = head = start;
-		if ((start == null) || (end == null)) {
-			// error condition
-			count = 0;
-			return;
-		}
-		//If both nodes are non-null, we assume there is always at least one
-		// item
-		count = 1;
-		while (countNode != end) {
-			count++;
-			countNode = countNode.getNext();
-		}
-		if (org.eclipse.wst.sse.core.internal.util.Debug.DEBUG > 5) {
-			System.out.println("N Nodes in StructuredDocumentRegionEnumeration Contructor: " + count); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * hasMoreElements method comment.
-	 */
-	public synchronized boolean hasMoreElements() {
-		return count > 0;
-	}
-
-	/**
-	 * nextElement method comment.
-	 */
-	public synchronized Object nextElement() {
-		if (count > 0) {
-			count--;
-			oldHead = head;
-			head = head.getNext();
-			return oldHead;
-		}
-		throw new NoSuchElementException("StructuredDocumentRegionEnumeration"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentRegionIterator.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentRegionIterator.java
deleted file mode 100644
index c121b31..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentRegionIterator.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-
-
-import java.util.Vector;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-
-
-public class StructuredDocumentRegionIterator {
-
-	public final static IStructuredDocumentRegion adjustStart(IStructuredDocumentRegion headNode, int adjustment) {
-		IStructuredDocumentRegion aNode = headNode;
-		while (aNode != null) {
-			aNode.adjustStart(adjustment);
-			aNode = aNode.getNext();
-		}
-		return headNode;
-	}
-
-	public final static int countRegions(IStructuredDocumentRegionList flatNodes) {
-		int result = 0;
-		if (flatNodes != null) {
-			int length = flatNodes.getLength();
-			for (int i = 0; i < length; i++) {
-				IStructuredDocumentRegion node = flatNodes.item(i);
-				// don't know why, but we're getting null pointer exceptions
-				// in this method
-				if (node != null) {
-					result = result + node.getNumberOfRegions();
-				}
-			}
-		}
-		return result;
-	}
-
-	public final static String getText(CoreNodeList flatNodes) {
-		String result = null;
-		if (flatNodes == null) {
-			result = ""; //$NON-NLS-1$
-		} else {
-			StringBuffer buff = new StringBuffer();
-			//IStructuredDocumentRegion aNode = null;
-			int length = flatNodes.getLength();
-			for (int i = 0; i < length; i++) {
-				buff.append(flatNodes.item(i).getText());
-			}
-			result = buff.toString();
-		}
-		return result;
-	}
-
-	public final static CoreNodeList setParentDocument(CoreNodeList nodelist, IStructuredDocument textStore) {
-		Assert.isNotNull(nodelist, "nodelist was null in CoreNodeList::setTextStore(CoreNodeList, StructuredTextStore)"); //$NON-NLS-1$
-		int len = nodelist.getLength();
-		for (int i = 0; i < len; i++) {
-			IStructuredDocumentRegion node = nodelist.item(i);
-			//Assert.isNotNull(node, "who's putting null in the node list? in
-			// CoreNodeList::setTextStore(CoreNodeList,
-			// StructuredTextStore)"); //$NON-NLS-1$
-			node.setParentDocument(textStore);
-		}
-		return nodelist;
-	}
-
-	//	public final static IStructuredDocumentRegion
-	// setStructuredDocument(IStructuredDocumentRegion headNode,
-	// BasicStructuredDocument structuredDocument) {
-	//		IStructuredDocumentRegion aNode = headNode;
-	//		while (aNode != null) {
-	//			aNode.setParentDocument(structuredDocument);
-	//			aNode = (IStructuredDocumentRegion) aNode.getNext();
-	//		}
-	//		return headNode;
-	//	}
-	public final static IStructuredDocumentRegion setParentDocument(IStructuredDocumentRegion headNode, IStructuredDocument document) {
-		IStructuredDocumentRegion aNode = headNode;
-		while (aNode != null) {
-			aNode.setParentDocument(document);
-			aNode = aNode.getNext();
-		}
-		return headNode;
-	}
-
-	public final static Vector toVector(IStructuredDocumentRegion headNode) {
-		IStructuredDocumentRegion aNode = headNode;
-		Vector v = new Vector();
-		while (aNode != null) {
-			v.addElement(aNode);
-			aNode = aNode.getNext();
-		}
-		return v;
-	}
-
-	/**
-	 *  
-	 */
-	private StructuredDocumentRegionIterator() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentSequentialRewriteTextStore.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentSequentialRewriteTextStore.java
deleted file mode 100644
index 5c31aa8..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentSequentialRewriteTextStore.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import org.eclipse.jface.text.ITextStore;
-import org.eclipse.jface.text.SequentialRewriteTextStore;
-
-public class StructuredDocumentSequentialRewriteTextStore extends SequentialRewriteTextStore implements CharSequence, IRegionComparible {
-
-	/**
-	 * @param source
-	 */
-	public StructuredDocumentSequentialRewriteTextStore(ITextStore source) {
-		super(source);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#charAt(int)
-	 */
-	public char charAt(int index) {
-		return get(index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#length()
-	 */
-	public int length() {
-		return getLength();
-	}
-
-	/**
-	 * @param c
-	 * @param d
-	 * @return
-	 */
-	private boolean matchesIgnoreCase(char c1, char c2) {
-		// we check both case conversions to handle those few cases,
-		// in languages such as Turkish, which have some characters
-		// which sort of have 3 cases.
-		boolean result = false;
-		if (Character.toUpperCase(c1) == Character.toUpperCase(c2))
-			result = true;
-		else if (Character.toLowerCase(c1) == Character.toLowerCase(c2))
-			result = true;
-		return result;
-	}
-
-	public boolean regionMatches(int offset, int length, String stringToCompare) {
-		boolean result = false;
-		int compareLength = stringToCompare.length();
-		if (compareLength == length) {
-			int endOffset = offset + length;
-			if (endOffset <= length()) {
-				result = regionMatches(offset, stringToCompare);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * This method assumes all lengths have been checked and fall withint
-	 * exceptable limits
-	 * 
-	 * @param offset
-	 * @param stringToCompare
-	 * @return
-	 */
-	private boolean regionMatches(int offset, String stringToCompare) {
-		boolean result = true;
-		int stringOffset = 0;
-		int len = stringToCompare.length();
-		for (int i = offset; i < len; i++) {
-			if (charAt(i) != stringToCompare.charAt(stringOffset++)) {
-				result = false;
-				break;
-			}
-		}
-		return result;
-	}
-
-	public boolean regionMatchesIgnoreCase(int offset, int length, String stringToCompare) {
-		boolean result = false;
-		int compareLength = stringToCompare.length();
-		if (compareLength == length) {
-			int endOffset = offset + length;
-			if (endOffset <= length()) {
-				result = regionMatchesIgnoreCase(offset, stringToCompare);
-			}
-		}
-
-		return result;
-	}
-
-	private boolean regionMatchesIgnoreCase(int offset, String stringToCompare) {
-		boolean result = true;
-		int stringOffset = 0;
-		int len = stringToCompare.length();
-		for (int i = offset; i < len; i++) {
-			if (!matchesIgnoreCase(charAt(i), stringToCompare.charAt(stringOffset++))) {
-				result = false;
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#subSequence(int, int)
-	 */
-	public CharSequence subSequence(int start, int end) {
-
-		return get(start, end - start);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentTextStore.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentTextStore.java
deleted file mode 100644
index e825e72..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/StructuredDocumentTextStore.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Viacheslav Kabanovich/Exadel 97817 Wrong algoritm in class StructuredDocumentTextStore
- *     			https://bugs.eclipse.org/bugs/show_bug.cgi?id=97817
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import org.eclipse.jface.text.GapTextStore;
-import org.eclipse.jface.text.ITextStore;
-
-public class StructuredDocumentTextStore implements ITextStore, CharSequence, IRegionComparible {
-
-	private GapTextStore fInternalStore;
-
-	/**
-	 *  
-	 */
-	public StructuredDocumentTextStore() {
-		this(50, 300);
-	}
-
-	/**
-	 * @param lowWatermark
-	 * @param highWatermark
-	 */
-	public StructuredDocumentTextStore(int lowWatermark, int highWatermark) {
-		super();
-		fInternalStore = new GapTextStore(lowWatermark, highWatermark);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#charAt(int)
-	 */
-	public char charAt(int index) {
-		return fInternalStore.get(index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.ITextStore#get(int)
-	 */
-	public char get(int offset) {
-
-		return fInternalStore.get(offset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.ITextStore#get(int, int)
-	 */
-	public String get(int offset, int length) {
-
-		return fInternalStore.get(offset, length);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.ITextStore#getLength()
-	 */
-	public int getLength() {
-
-		return fInternalStore.getLength();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#length()
-	 */
-	public int length() {
-
-		return fInternalStore.getLength();
-	}
-
-	private boolean matchesIgnoreCase(char c1, char c2) {
-		// we check both case conversions to handle those few cases,
-		// in languages such as Turkish, which have some characters
-		// which sort of have 3 cases.
-		boolean result = false;
-		if (Character.toUpperCase(c1) == Character.toUpperCase(c2))
-			result = true;
-		else if (Character.toLowerCase(c1) == Character.toLowerCase(c2))
-			result = true;
-		return result;
-	}
-
-	public boolean regionMatches(int offset, int length, String stringToCompare) {
-		boolean result = false;
-		int compareLength = stringToCompare.length();
-		if (compareLength == length) {
-			int endOffset = offset + length;
-			if (endOffset <= length()) {
-				result = regionMatches(offset, stringToCompare);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * This method assumes all lengths have been checked and fall withint
-	 * exceptable limits
-	 * 
-	 * @param offset
-	 * @param stringToCompare
-	 * @return
-	 */
-	private boolean regionMatches(int offset, String stringToCompare) {
-		boolean result = true;
-		int stringOffset = 0;
-		int end = offset + stringToCompare.length();
-		for (int i = offset; i < end; i++) {
-			if (charAt(i) != stringToCompare.charAt(stringOffset++)) {
-				result = false;
-				break;
-			}
-		}
-		return result;
-	}
-
-	public boolean regionMatchesIgnoreCase(int offset, int length, String stringToCompare) {
-		boolean result = false;
-		int compareLength = stringToCompare.length();
-		if (compareLength == length) {
-			int endOffset = offset + length;
-			if (endOffset <= length()) {
-				result = regionMatchesIgnoreCase(offset, stringToCompare);
-			}
-		}
-
-		return result;
-	}
-
-	private boolean regionMatchesIgnoreCase(int offset, String stringToCompare) {
-		boolean result = true;
-		int stringOffset = 0;
-		int end = offset + stringToCompare.length();
-		for (int i = offset; i < end; i++) {
-			if (!matchesIgnoreCase(charAt(i), stringToCompare.charAt(stringOffset++))) {
-				result = false;
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.ITextStore#replace(int, int,
-	 *      java.lang.String)
-	 */
-	public void replace(int offset, int length, String text) {
-		fInternalStore.replace(offset, length, text);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.ITextStore#set(java.lang.String)
-	 */
-	public void set(String text) {
-		fInternalStore.set(text);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.CharSequence#subSequence(int, int)
-	 */
-	public CharSequence subSequence(int start, int end) {
-		// convert 'end' to 'length'
-		return fInternalStore.get(start, end - start);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/SubSetTextStore.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/SubSetTextStore.java
deleted file mode 100644
index caca8b9..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/SubSetTextStore.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-/**
- * This is a convience or utility class that allows you to make a copy of a
- * part of a larger text store, but have the copy behave as if it was the
- * larger text store.
- * 
- * In other words, it provides a subset of a larger document, that "looks like"
- * the orginal document. That is, "looks like" in terms of offsets and lengths.
- * Valid access can only be made to data between the orignal offsets, even
- * though those offsets are in the same units at the original, and even though
- * the length appears to be long.
- * 
- * For example, if a subsettext store is created for the def part of abcdefgh,
- * then get(3,5) is valid, getLength is 8. Any other access, such as
- * getChar(2), would be invalid.
- */
-import org.eclipse.jface.text.ITextStore;
-
-/**
- * Similar to basics of IDocument, but the offsets are mapped from coordinates
- * of underlying storage to a "virtual" document.
- */
-public class SubSetTextStore implements ITextStore {
-	private int pseudoBeginOffset; // maps to "zero" postion of new text
-	//private int pseudoEndOffset;
-	private int pseudoLength; // length of old/original document
-	private StringBuffer stringBuffer = new StringBuffer();
-
-	/**
-	 * SubSetTextStore constructor comment.
-	 * 
-	 * @param initialContent
-	 *            java.lang.String
-	 */
-	public SubSetTextStore(String initialContent, int beginOffset, int endOffset, int originalDocumentLength) {
-		super();
-		pseudoBeginOffset = beginOffset;
-		//pseudoEndOffset = endOffset;
-		// used to be originalDocument.getLength ... not sure if used, or
-		// which
-		// is right
-		pseudoLength = originalDocumentLength;
-		stringBuffer = new StringBuffer(initialContent);
-		//set(initialContent);
-	}
-
-	// this is our "private" get, which methods in this class should
-	// use to get using "real" coordinates of underlying representation.
-	private String _get(int begin, int length) {
-		char[] chars = new char[length];
-		int srcEnd = begin + length;
-		stringBuffer.getChars(begin, srcEnd, chars, 0);
-		return new String(chars);
-	}
-
-	public char get(int offset) {
-		return stringBuffer.charAt(offset - pseudoBeginOffset);
-	}
-
-	/**
-	 * @return java.lang.String
-	 * @param begin
-	 *            int
-	 * @param end
-	 *            int
-	 */
-	public String get(int begin, int length) {
-		// remap the begin and end to "appear" to be in the
-		// same coordinates of the original parentDocument
-		return _get(begin - pseudoBeginOffset, length);
-	}
-
-	/**
-	 * @return java.lang.String
-	 * @param begin
-	 *            int
-	 * @param end
-	 *            int
-	 */
-	public char getChar(int pos) {
-		// remap the begin and end to "appear" to be in the
-		// same coordinates of the original parentDocument
-		return get(pos - pseudoBeginOffset);
-	}
-
-	/**
-	 * We redefine getLength so its not the true length of this sub-set
-	 * document, but the length of the original. This is needed, as a simple
-	 * example, if you want to see if the pseudo end is equal the last
-	 * position of the original document.
-	 */
-	public int getLength() {
-		return pseudoLength;
-	}
-
-	/**
-	 * Returns the length as if considered a true, standalone document
-	 */
-	public int getTrueLength() {
-		return stringBuffer.length();
-	}
-
-	public void replace(int begin, int length, String changes) {
-		// remap the begin and end to "appear" to be in the
-		// same coordinates of the original parentDocument
-		int end = begin + length;
-		stringBuffer.replace(begin - pseudoBeginOffset, end, changes);
-	}
-
-	public void set(String text) {
-		stringBuffer.setLength(0);
-		stringBuffer.append(text);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/TextRegionListImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/TextRegionListImpl.java
deleted file mode 100644
index ca92300..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/TextRegionListImpl.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-
-
-public class TextRegionListImpl implements ITextRegionList {
-
-	private class NullIterator implements Iterator {
-		public NullIterator() {
-		}
-
-		public boolean hasNext() {
-			return false;
-		}
-
-		public Object next() {
-			throw new NoSuchElementException();
-		}
-
-		public void remove() {
-			throw new UnsupportedOperationException("can not remove regions via iterator"); //$NON-NLS-1$
-
-		}
-
-	}
-
-	private class RegionIterator implements Iterator {
-		private ITextRegion[] fIteratorRegions;
-		private int index = -1;
-		private int maxindex = -1;
-
-		public RegionIterator() {
-			fIteratorRegions = toArray();
-			maxindex = fIteratorRegions.length - 1;
-		}
-
-		public boolean hasNext() {
-			return index < maxindex;
-		}
-
-		public Object next() {
-			if (!(index < maxindex))
-				throw new NoSuchElementException();
-			return fIteratorRegions[++index];
-		}
-
-		public void remove() {
-			throw new UnsupportedOperationException("can not remove regions via iterator"); //$NON-NLS-1$
-
-		}
-
-	}
-
-	private final static int growthConstant = 2;
-
-	private ITextRegion[] fRegions;
-	private int fRegionsCount = 0;
-
-	public TextRegionListImpl() {
-		super();
-	}
-
-	public TextRegionListImpl(ITextRegionList regionList) {
-		this();
-		fRegions = (ITextRegion[]) regionList.toArray().clone();
-		fRegionsCount = fRegions.length;
-	}
-
-	public boolean add(ITextRegion region) {
-
-		if (region == null)
-			return false;
-		ensureCapacity(fRegionsCount + 1);
-		fRegions[fRegionsCount++] = region;
-		return true;
-	}
-
-	public boolean addAll(int insertPos, ITextRegionList newRegions) {
-		// beginning of list is 0 to insertPos-1
-		// remainder of list is insertPos to fRegionsCount
-		// resulting total will be be fRegionsCount + newRegions.size()
-		if (insertPos < 0 || insertPos > fRegionsCount) {
-			throw new ArrayIndexOutOfBoundsException(insertPos);
-		}
-
-		int newRegionsSize = newRegions.size();
-
-		ensureCapacity(fRegionsCount + newRegionsSize);
-
-		int numMoved = fRegionsCount - insertPos;
-		if (numMoved > 0)
-			System.arraycopy(fRegions, insertPos, fRegions, insertPos + newRegionsSize, numMoved);
-
-		for (int i = 0; i < newRegionsSize; i++)
-			fRegions[insertPos++] = newRegions.get(i);
-
-		fRegionsCount += newRegionsSize;
-		return newRegionsSize != 0;
-
-	}
-
-	public void clear() {
-		// note: size of array is not reduced!
-		fRegionsCount = 0;
-	}
-
-	private void ensureCapacity(int needed) {
-		if (fRegions == null) {
-			// first time
-			fRegions = new ITextRegion[needed];
-			return;
-		}
-		int oldLength = fRegions.length;
-		if (oldLength < needed) {
-			ITextRegion[] oldAdapters = fRegions;
-			ITextRegion[] newAdapters = new ITextRegion[needed + growthConstant];
-			System.arraycopy(oldAdapters, 0, newAdapters, 0, fRegionsCount);
-			fRegions = newAdapters;
-		}
-	}
-
-	public ITextRegion get(int index) {
-		if (index < 0 || index > fRegionsCount) {
-			throw new ArrayIndexOutOfBoundsException(index);
-		}
-		ITextRegion result = fRegions[index];
-		return result;
-	}
-
-	public int indexOf(ITextRegion region) {
-
-		int result = -1;
-		if (region != null) {
-			if (fRegions != null) {
-				for (int i = 0; i < fRegions.length; i++) {
-					if (region.equals(fRegions[i])) {
-						result = i;
-						break;
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	public boolean isEmpty() {
-		return fRegionsCount == 0;
-	}
-
-	public Iterator iterator() {
-		if (size() == 0) {
-			return new NullIterator();
-		} else {
-			return new RegionIterator();
-		}
-	}
-
-	public ITextRegion remove(int index) {
-		// much more efficient ways to implement this, but
-		// I doubt if called often
-		ITextRegion oneToRemove = get(index);
-		remove(oneToRemove);
-		return oneToRemove;
-	}
-
-	public void remove(ITextRegion a) {
-		if (fRegions == null || a == null)
-			return;
-		int newIndex = 0;
-		ITextRegion[] newRegions = new ITextRegion[fRegionsCount];
-		int oldRegionCount = fRegionsCount;
-		boolean found = false;
-		for (int oldIndex = 0; oldIndex < oldRegionCount; oldIndex++) {
-			ITextRegion candidate = fRegions[oldIndex];
-			if (a == candidate) {
-				fRegionsCount--;
-				found = true;
-			} else
-				newRegions[newIndex++] = fRegions[oldIndex];
-		}
-		if (found)
-			fRegions = newRegions;
-	}
-
-	public void removeAll(ITextRegionList regionList) {
-		// much more efficient ways to implement this, but
-		// I doubt if called often
-		if (regionList != null) {
-			for (int i = 0; i < regionList.size(); i++) {
-				this.remove(regionList.get(i));
-			}
-		}
-
-	}
-
-	public int size() {
-		return fRegionsCount;
-	}
-
-	public ITextRegion[] toArray() {
-		// return "clone" of internal array
-		ITextRegion[] newArray = new ITextRegion[fRegionsCount];
-		System.arraycopy(fRegions, 0, newArray, 0, fRegionsCount);
-		return newArray;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/IStructuredRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/IStructuredRegion.java
deleted file mode 100644
index f12b76a..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/IStructuredRegion.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text.rules;
-
-import org.eclipse.jface.text.IRegion;
-
-/**
- * Like super class except allows length and offset to be modified. This is
- * convenient for some algorithms, and allows region objects to be reused.
- * Note: There MIGHT be some code that assumes regions are immutable. This
- * class would not be appropriate for those uses.
- */
-public interface IStructuredRegion extends IRegion {
-	void setLength(int length);
-
-	void setOffset(int offset);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/IStructuredTypedRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/IStructuredTypedRegion.java
deleted file mode 100644
index 1ea21a9..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/IStructuredTypedRegion.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text.rules;
-
-import org.eclipse.jface.text.ITypedRegion;
-
-/**
- * Similar to extended interface, except it allows the length, offset, and
- * type to be set. This is useful when iterating through a number of "small"
- * regions, that all map to the the same partion regions.
- */
-public interface IStructuredTypedRegion extends IStructuredRegion, ITypedRegion {
-	void setType(String partitionType);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/SimpleStructuredRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/SimpleStructuredRegion.java
deleted file mode 100644
index 4ca1ded..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/SimpleStructuredRegion.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text.rules;
-
-import org.eclipse.jface.text.IRegion;
-
-
-
-/**
- * Similar to jface region except we wanted a setting on length
- */
-public class SimpleStructuredRegion implements IStructuredRegion {
-	/** The region length */
-	private int fLength;
-
-	/** The region offset */
-	private int fOffset;
-
-	/**
-	 * Create a new region.
-	 * 
-	 * @param offset
-	 *            the offset of the region
-	 * @param length
-	 *            the length of the region
-	 */
-	public SimpleStructuredRegion(int offset, int length) {
-		fOffset = offset;
-		fLength = length;
-	}
-
-	/**
-	 * Two regions are equal if they have the same offset and length.
-	 * 
-	 * @see Object#equals
-	 */
-	public boolean equals(Object o) {
-		if (o instanceof IRegion) {
-			IRegion r = (IRegion) o;
-			return r.getOffset() == fOffset && r.getLength() == fLength;
-		}
-		return false;
-	}
-
-	/*
-	 * @see IRegion#getLength
-	 */
-	public int getLength() {
-		return fLength;
-	}
-
-	/*
-	 * @see IRegion#getOffset
-	 */
-	public int getOffset() {
-		return fOffset;
-	}
-
-	/**
-	 * @see Object#hashCode hascode is overridden since we provide our own
-	 *      equals.
-	 */
-	public int hashCode() {
-		return (fOffset << 24) | (fLength << 16);
-	}
-
-	/**
-	 * Sets the length.
-	 * 
-	 * @param length
-	 *            The length to set
-	 */
-	public void setLength(int length) {
-		fLength = length;
-	}
-
-	public void setOffset(int offset) {
-		fOffset = offset;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/SimpleStructuredTypedRegion.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/SimpleStructuredTypedRegion.java
deleted file mode 100644
index 1822a8a..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/SimpleStructuredTypedRegion.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text.rules;
-
-
-
-
-/**
- * Similar jace TypedRegion, but had to subclass our version which allowed
- * length to be set.
- */
-public class SimpleStructuredTypedRegion extends SimpleStructuredRegion implements IStructuredTypedRegion {
-
-	/** The region's type */
-	private String fType;
-
-	/**
-	 * Creates a typed region based on the given specification.
-	 * 
-	 * @param offset
-	 *            the region's offset
-	 * @param length
-	 *            the region's length
-	 * @param type
-	 *            the region's type
-	 */
-	public SimpleStructuredTypedRegion(int offset, int length, String type) {
-		super(offset, length);
-		fType = type;
-	}
-
-	/**
-	 * Two typed positions are equal if they have the same offset, length, and
-	 * type.
-	 * 
-	 * @see Object#equals
-	 */
-	public boolean equals(Object o) {
-		if (o instanceof SimpleStructuredTypedRegion) {
-			SimpleStructuredTypedRegion r = (SimpleStructuredTypedRegion) o;
-			return super.equals(r) && ((fType == null && r.getType() == null) || fType.equals(r.getType()));
-		}
-		return false;
-	}
-
-	/*
-	 * @see ITypedRegion#getType()
-	 */
-	public String getType() {
-		return fType;
-	}
-
-	/*
-	 * @see Object#hashCode
-	 */
-	public int hashCode() {
-		int type = fType == null ? 0 : fType.hashCode();
-		return super.hashCode() | type;
-	}
-
-	public void setType(String type) {
-		fType = type;
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer s = new StringBuffer();
-		s.append(getOffset());
-		s.append(":"); //$NON-NLS-1$
-		s.append(getLength());
-		s.append(" - "); //$NON-NLS-1$
-		s.append(getType());
-		return s.toString();
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/StructuredTextPartitioner.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/StructuredTextPartitioner.java
deleted file mode 100644
index 5f078c7..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/text/rules/StructuredTextPartitioner.java
+++ /dev/null
@@ -1,604 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.text.rules;
-
-
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.wst.sse.core.internal.ltk.parser.IBlockedStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.parser.ForeignRegion;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredTextPartitioner;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.sse.core.text.IStructuredPartitions;
-
-
-/**
- * Base Document partitioner for StructuredDocuments. BLOCK_TEXT ITextRegions
- * have a partition type of BLOCK or BLOCK:TAGNAME if a surrounding tagname
- * was recorded.
- */
-public class StructuredTextPartitioner implements IDocumentPartitioner, IStructuredTextPartitioner {
-
-	static class CachedComputedPartitions {
-		int fLength;
-		int fOffset;
-		ITypedRegion[] fPartitions;
-		boolean isInValid;
-
-		CachedComputedPartitions(int offset, int length, ITypedRegion[] partitions) {
-			fOffset = offset;
-			fLength = length;
-			fPartitions = partitions;
-			isInValid = true;
-		}
-	}
-
-	private CachedComputedPartitions cachedPartitions = new CachedComputedPartitions(-1, -1, null);
-	protected String[] fSupportedTypes = null;
-	protected IStructuredTypedRegion internalReusedTempInstance = new SimpleStructuredTypedRegion(0, 0, IStructuredPartitions.DEFAULT_PARTITION);
-	protected IStructuredDocument fStructuredDocument;
-
-	/**
-	 * StructuredTextPartitioner constructor comment.
-	 */
-	public StructuredTextPartitioner() {
-		super();
-	}
-
-	/**
-	 * Returns the partitioning of the given range of the connected document.
-	 * There must be a document connected to this partitioner.
-	 * 
-	 * Note: this shouldn't be called dirctly by clients, unless they control
-	 * the threading that includes modifications to the document. Otherwise
-	 * the document could be modified while partitions are being computed. We
-	 * advise that clients use the computePartitions API directly from the
-	 * document, so they won't have to worry about that.
-	 * 
-	 * @param offset
-	 *            the offset of the range of interest
-	 * @param length
-	 *            the length of the range of interest
-	 * @return the partitioning of the range
-	 */
-	public ITypedRegion[] computePartitioning(int offset, int length) {
-		if (fStructuredDocument == null) {
-			throw new IllegalStateException("document partitioner is not connected"); //$NON-NLS-1$
-		}
-		ITypedRegion[] results = null;
-
-
-
-		if ((!cachedPartitions.isInValid) && (offset == cachedPartitions.fOffset) && (length == cachedPartitions.fLength)) {
-			results = cachedPartitions.fPartitions;
-		} else {
-
-			if (length == 0) {
-				results = new ITypedRegion[]{getPartition(offset)};
-			} else {
-				List list = new ArrayList();
-				int endPos = offset + length;
-				if (endPos > fStructuredDocument.getLength()) {
-					// This can occur if the model instance is being
-					// changed
-					// and everyone's not yet up to date
-					return new ITypedRegion[]{createPartition(offset, length, getUnknown())};
-				}
-				int currentPos = offset;
-				IStructuredTypedRegion previousPartition = null;
-				while (currentPos < endPos) {
-					internalGetPartition(currentPos, false);
-					currentPos += internalReusedTempInstance.getLength();
-					// check if this partition just continues last one
-					// (type is the same),
-					// if so, just extend length of last one, not need to
-					// create new
-					// instance.
-					if (previousPartition != null && internalReusedTempInstance.getType().equals(previousPartition.getType())) {
-						// same partition type
-						previousPartition.setLength(previousPartition.getLength() + internalReusedTempInstance.getLength());
-					} else {
-						// not the same, so add to list
-						IStructuredTypedRegion partition = createNewPartitionInstance();
-						list.add(partition);
-						// and make current, previous
-						previousPartition = partition;
-					}
-				}
-				results = new ITypedRegion[list.size()];
-				list.toArray(results);
-			}
-			if (results.length > 0) {
-				// truncate returned results to requested range
-				if (results[0].getOffset() < offset && results[0] instanceof IStructuredRegion) {
-					((IStructuredRegion) results[0]).setOffset(offset);
-				}
-				int lastEnd = results[results.length - 1].getOffset() + results[results.length - 1].getLength();
-				if (lastEnd > offset + length && results[results.length - 1] instanceof IStructuredRegion) {
-					((IStructuredRegion) results[results.length - 1]).setLength(offset + length - results[results.length - 1].getOffset());
-				}
-			}
-			cachedPartitions.fLength = length;
-			cachedPartitions.fOffset = offset;
-			cachedPartitions.fPartitions = results;
-			cachedPartitions.isInValid = false;
-		}
-		return results;
-	}
-
-
-
-	/**
-	 * Connects the document to the partitioner, i.e. indicates the begin of
-	 * the usage of the receiver as partitioner of the given document.
-	 */
-	public synchronized void connect(IDocument document) {
-		if (document instanceof IStructuredDocument) {
-			cachedPartitions.isInValid = true;
-			this.fStructuredDocument = (IStructuredDocument) document;
-		} else {
-			throw new IllegalArgumentException("This class and API are for Structured Documents only"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Determines if the given ITextRegionContainer itself contains another
-	 * ITextRegionContainer
-	 * 
-	 * @param ITextRegionContainer
-	 * @return boolean
-	 */
-	protected boolean containsEmbeddedRegion(IStructuredDocumentRegion container) {
-		boolean containsEmbeddedRegion = false;
-
-		ITextRegionList regions = container.getRegions();
-		for (int i = 0; i < regions.size(); i++) {
-			ITextRegion region = regions.get(i);
-			if (region instanceof ITextRegionContainer) {
-				containsEmbeddedRegion = true;
-				break;
-			}
-		}
-		return containsEmbeddedRegion;
-	}
-
-	private IStructuredTypedRegion createNewPartitionInstance() {
-		return new SimpleStructuredTypedRegion(internalReusedTempInstance.getOffset(), internalReusedTempInstance.getLength(), internalReusedTempInstance.getType());
-	}
-
-	/**
-	 * Creates the concrete partition from the given values. Returns a new
-	 * instance for each call.
-	 * 
-	 * Subclasses may override.
-	 * 
-	 * @param offset
-	 * @param length
-	 * @param type
-	 * @return ITypedRegion
-	 * 
-	 * TODO: should be protected
-	 */
-	public IStructuredTypedRegion createPartition(int offset, int length, String type) {
-		return new SimpleStructuredTypedRegion(offset, length, type);
-	}
-
-	/**
-	 * Disconnects the document from the partitioner, i.e. indicates the end
-	 * of the usage of the receiver as partitioner of the given document.
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#disconnect()
-	 */
-	public synchronized void disconnect() {
-		cachedPartitions.isInValid = true;
-		this.fStructuredDocument = null;
-	}
-
-	/**
-	 * Informs about a forthcoming document change.
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#documentAboutToBeChanged(DocumentEvent)
-	 */
-	public void documentAboutToBeChanged(DocumentEvent event) {
-		cachedPartitions.isInValid = true;
-	}
-
-	/**
-	 * The document has been changed. The partitioner updates the set of
-	 * regions and returns whether the structure of the document partitioning
-	 * has been changed, i.e. whether partitions have been added or removed.
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#documentChanged(DocumentEvent)
-	 */
-	public boolean documentChanged(DocumentEvent event) {
-		boolean result = false;
-		if (event instanceof StructuredDocumentRegionsReplacedEvent) {
-			// partitions don't always change while document regions do,
-			// but that's the only "quick check" we have.
-			// I'm not sure if something more sophisticated will be needed
-			// in the future. (dmw, 02/18/04).
-			result = true;
-		}
-		return result;
-	}
-
-	protected boolean doParserSpecificCheck(int offset, boolean partitionFound, IStructuredDocumentRegion sdRegion, IStructuredDocumentRegion previousStructuredDocumentRegion, ITextRegion next, ITextRegion previousStart) {
-		// this (conceptually) abstract method is not concerned with
-		// specific region types
-		return false;
-	}
-
-	/**
-	 * Returns the content type of the partition containing the given
-	 * character position of the given document. The document has previously
-	 * been connected to the partitioner.
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getContentType(int)
-	 */
-	public String getContentType(int offset) {
-		return getPartition(offset).getType();
-	}
-
-	/**
-	 * To be used by default!
-	 */
-	public String getDefaultPartitionType() {
-
-		return IStructuredPartitions.DEFAULT_PARTITION;
-	}
-
-	/**
-	 * Returns the set of all possible content types the partitoner supports.
-	 * I.e. Any result delivered by this partitioner may not contain a content
-	 * type which would not be included in this method's result.
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getLegalContentTypes()
-	 */
-	public java.lang.String[] getLegalContentTypes() {
-		if (fSupportedTypes == null) {
-			initLegalContentTypes();
-		}
-		return fSupportedTypes;
-	}
-
-	/**
-	 * Returns the partition containing the given character position of the
-	 * given document. The document has previously been connected to the
-	 * partitioner.
-	 * 
-	 * Note: this shouldn't be called dirctly by clients, unless they control
-	 * the threading that includes modifications to the document. Otherwise
-	 * the document could be modified while partitions are being computed. We
-	 * advise that clients use the getPartition API directly from the
-	 * document, so they won't have to worry about that.
-	 * 
-	 * 
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getPartition(int)
-	 */
-	public ITypedRegion getPartition(int offset) {
-		internalGetPartition(offset, true);
-		return createNewPartitionInstance();
-	}
-
-	protected String getPartitionFromBlockedText(ITextRegion region, int offset, String result) {
-		// parser sensitive code was moved to subclass for quick transition
-		// this (conceptually) abstract version isn't concerned with blocked
-		// text
-
-		return result;
-	}
-
-	protected String getPartitionType(ForeignRegion region, int offset) {
-		String tagname = region.getSurroundingTag();
-		String result = null;
-		if (tagname != null) {
-			result = "BLOCK:" + tagname.toUpperCase(Locale.ENGLISH); //$NON-NLS-1$
-		} else {
-			result = "BLOCK"; //$NON-NLS-1$
-		}
-		return result;
-	}
-
-
-	protected String getPartitionType(IBlockedStructuredDocumentRegion blockedStructuredDocumentRegion, int offset) {
-		String result = null;
-		ITextRegionList regions = blockedStructuredDocumentRegion.getRegions();
-
-		// regions should never be null, or hold zero regions, but just in
-		// case...
-		if (regions != null && regions.size() > 0) {
-			if (regions.size() == 1) {
-				// if only one, then its a "pure" blocked note.
-				// if more than one, then must contain some embedded region
-				// container
-				ITextRegion blockedRegion = regions.get(0);
-				// double check for code safefy, though should always be true
-				if (blockedRegion instanceof ForeignRegion) {
-					result = getPartitionType((ForeignRegion) blockedRegion, offset);
-				}
-			} else {
-				// must have some embedded region container, so we'll make
-				// sure we'll get the appropriate one
-				result = getReleventRegionType(blockedStructuredDocumentRegion, offset);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Method getPartitionType.
-	 * 
-	 * @param region
-	 * @return String
-	 */
-	private String getPartitionType(ITextRegion region) {
-		// if it get's to this "raw" level, then
-		// must be default.
-		return getDefaultPartitionType();
-	}
-
-	/**
-	 * Returns the partition based on region type. This basically maps from
-	 * one region-type space to another, higher level, region-type space.
-	 * 
-	 * @param region
-	 * @param offset
-	 * @return String
-	 */
-	public String getPartitionType(ITextRegion region, int offset) {
-		String result = getDefaultPartitionType();
-		//		if (region instanceof ContextRegionContainer) {
-		//			result = getPartitionType((ITextRegionContainer) region, offset);
-		//		} else {
-		if (region instanceof ITextRegionContainer) {
-			result = getPartitionType((ITextRegionContainer) region, offset);
-		}
-
-		result = getPartitionFromBlockedText(region, offset, result);
-
-		return result;
-
-	}
-
-	/**
-	 * Similar to method with 'ITextRegion' as argument, except for
-	 * RegionContainers, if it has embedded regions, then we need to drill
-	 * down and return DocumentPartition based on "lowest level" region type.
-	 * For example, in <body id=" <%= object.getID() %>" > The text between
-	 * <%= and %> would be a "java region" not an "HTML region".
-	 */
-	protected String getPartitionType(ITextRegionContainer region, int offset) {
-		// TODO this method needs to be 'cleaned up' after refactoring
-		// its instanceof logic seems messed up now.
-		String result = null;
-		if (region != null) {
-			ITextRegion coreRegion = region;
-			if (coreRegion instanceof ITextRegionContainer) {
-				result = getPartitionType((ITextRegionContainer) coreRegion, ((ITextRegionContainer) coreRegion).getRegions(), offset);
-			} else {
-				result = getPartitionType(region);
-			}
-		} else {
-			result = getPartitionType((ITextRegion) region, offset);
-		}
-
-		return result;
-	}
-
-	private String getPartitionType(ITextRegionContainer coreRegion, ITextRegionList regions, int offset) {
-		String result = null;
-		for (int i = 0; i < regions.size(); i++) {
-			ITextRegion region = regions.get(i);
-			if (coreRegion.containsOffset(region, offset)) {
-				result = getPartitionType(region, offset);
-				break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Computes the partition type for the zero-length partition between a
-	 * start tag and end tag with the given name regions.
-	 * 
-	 * @param previousStartTagNameRegion
-	 * @param nextEndTagNameRegion
-	 * @return String
-	 */
-	public String getPartitionTypeBetween(IStructuredDocumentRegion previousNode, IStructuredDocumentRegion nextNode) {
-		return getDefaultPartitionType();
-	}
-
-	/**
-	 * Return the ITextRegion at the given offset. For most cases, this will
-	 * be the flatNode itself. Should it contain an embedded
-	 * ITextRegionContainer, will return the internal region at the offset
-	 * 
-	 * 
-	 * @param flatNode
-	 * @param offset
-	 * @return ITextRegion
-	 */
-	private String getReleventRegionType(IStructuredDocumentRegion flatNode, int offset) {
-		//		* Note: the original form of this method -- which returned "deep"
-		// region, isn't that
-		//		* useful, after doing parent elimination refactoring,
-		//		* since once the deep region is returned, its hard to get its text
-		// or offset without
-		//		* proper parent.
-		ITextRegion resultRegion = null;
-		if (containsEmbeddedRegion(flatNode)) {
-			resultRegion = flatNode.getRegionAtCharacterOffset(offset);
-			if (resultRegion instanceof ITextRegionContainer) {
-				resultRegion = flatNode.getRegionAtCharacterOffset(offset);
-				ITextRegionList regions = ((ITextRegionContainer) resultRegion).getRegions();
-				for (int i = 0; i < regions.size(); i++) {
-					ITextRegion region = regions.get(i);
-					if (flatNode.getStartOffset(region) <= offset && offset < flatNode.getEndOffset(region)) {
-						resultRegion = region;
-						break;
-					}
-				}
-			}
-		} else {
-			resultRegion = flatNode;
-		}
-		return resultRegion.getType();
-	}
-
-	/**
-	 * To be used, instead of default, when there is some thing surprising
-	 * about are attempt to partition
-	 */
-	protected String getUnknown() {
-		return IStructuredPartitions.UNKNOWN_PARTITION;
-	}
-
-	/**
-	 * to be abstract eventually
-	 */
-	protected void initLegalContentTypes() {
-		fSupportedTypes = new String[]{IStructuredPartitions.DEFAULT_PARTITION, IStructuredPartitions.UNKNOWN_PARTITION};
-	}
-
-	/**
-	 * Returns the partition containing the given character position of the
-	 * given document. The document has previously been connected to the
-	 * partitioner. If the checkBetween parameter is true, an offset between a
-	 * start and end tag will return a zero-length region.
-	 */
-	private void internalGetPartition(int offset, boolean checkBetween) {
-		if (fStructuredDocument == null) {
-			throw new IllegalStateException("document partitioner is not connected"); //$NON-NLS-1$
-		}
-
-		boolean partitionFound = false;
-		int docLength = fStructuredDocument.getLength();
-		// get document region type and map to partition type :
-		// Note: a partion can be smaller than a flatnode, if that flatnode
-		// contains a region container.
-		// That's why we need to get "relevent region".
-		IStructuredDocumentRegion structuredDocumentRegion = fStructuredDocument.getRegionAtCharacterOffset(offset);
-		// flatNode is null if empty document
-		// this is king of a "normal case" for empty document
-		if (structuredDocumentRegion == null) {
-			if (docLength == 0) {
-				/*
-				 * In order to prevent infinite error loops, this partition
-				 * must never have a zero length unless the document is also
-				 * zero length
-				 */
-				setInternalPartition(offset, 0, getDefaultPartitionType());
-				partitionFound = true;
-			}
-			else {
-				/*
-				 * This case is "unusual". When would region be null, and
-				 * document longer than 0. I think this means something's "out
-				 * of sync". And we may want to "flag" that fact and just
-				 * return one big region of 'unknown', instead of one
-				 * character at a time.
-				 */
-				setInternalPartition(offset, 1, getUnknown());
-				partitionFound = true;
-			}
-		}	
-		else if (checkBetween) {
-			// dmw: minimizes out to the first if test above
-			//			if (structuredDocumentRegion == null && docLength == 0) {
-			//				// known special case for an empty document
-			//				setInternalPartition(offset, 0, getDefault());
-			//				partitionFound = true;
-			//			}
-			//			else
-			if (structuredDocumentRegion.getStartOffset() == offset) {
-				IStructuredDocumentRegion previousStructuredDocumentRegion = structuredDocumentRegion.getPrevious();
-				if (previousStructuredDocumentRegion != null) {
-					ITextRegion next = structuredDocumentRegion.getRegionAtCharacterOffset(offset);
-					ITextRegion previousStart = previousStructuredDocumentRegion.getRegionAtCharacterOffset(previousStructuredDocumentRegion.getStartOffset());
-					partitionFound = doParserSpecificCheck(offset, partitionFound, structuredDocumentRegion, previousStructuredDocumentRegion, next, previousStart);
-				}
-			}
-		}
-
-		if (!partitionFound && structuredDocumentRegion != null) {
-			ITextRegion resultRegion = structuredDocumentRegion.getRegionAtCharacterOffset(offset);
-			partitionFound = isDocumentRegionBasedPartition(structuredDocumentRegion, resultRegion, offset);
-			if (!partitionFound) {
-				// Note: this new logic doesn't handle container regions
-				// inside of
-				// container regions ... may need to make this first clause
-				// a recursive method
-				if (resultRegion != null && resultRegion instanceof ITextRegionContainer) {
-					ITextRegionContainer containerRegion = (ITextRegionContainer) resultRegion;
-					// then need to "drill down" for relevent region and
-					// relevent offset
-					ITextRegion deepRegion = containerRegion.getRegionAtCharacterOffset(offset);
-					int endOffset = containerRegion.getEndOffset(deepRegion);
-					String type = getPartitionType(deepRegion, endOffset);
-					setInternalPartition(offset, endOffset - offset, type);
-				} else {
-					if (resultRegion != null) {
-						String type = getPartitionType(resultRegion, offset);
-						setInternalPartition(offset, structuredDocumentRegion.getEndOffset(resultRegion) - offset, type);
-					} else {
-						// can happen at EOF
-						setInternalPartition(offset, 1, getUnknown());
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Provides for a per-StructuredDocumentRegion override selecting the
-	 * partition type using more than just a single ITextRegion.
-	 * 
-	 * @param structuredDocumentRegion
-	 *            the StructuredDocumentRegion
-	 * @param containedChildRegion
-	 *            an ITextRegion within the given StructuredDocumentRegion
-	 *            that would normally determine the partition type by itself
-	 * @param offset
-	 *            the document offset
-	 * @return true if the partition type will be overridden, false to
-	 *         continue normal processing
-	 */
-	protected boolean isDocumentRegionBasedPartition(IStructuredDocumentRegion structuredDocumentRegion, ITextRegion containedChildRegion, int offset) {
-		return false;
-	}
-
-	public IDocumentPartitioner newInstance() {
-		return new StructuredTextPartitioner();
-	}
-
-	protected void setInternalPartition(int offset, int length, String type) {
-		internalReusedTempInstance.setOffset(offset);
-		internalReusedTempInstance.setLength(length);
-		internalReusedTempInstance.setType(type);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/CommandCursorPosition.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/CommandCursorPosition.java
deleted file mode 100644
index 439cf52..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/CommandCursorPosition.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-
-
-public interface CommandCursorPosition {
-
-	/**
-	 * Returns the cursor position to be set to after this command is redone.
-	 * 
-	 * @return int
-	 */
-	int getRedoCursorPosition();
-
-	/**
-	 * Returns the length of text to be selected after this command is redone.
-	 * 
-	 * @return int
-	 */
-	int getRedoSelectionLength();
-
-	/**
-	 * Returns the cursor position to be set to after this command is undone.
-	 * 
-	 * @return int
-	 */
-	int getUndoCursorPosition();
-
-	/**
-	 * Returns the length of text to be selected after this command is undone.
-	 * 
-	 * @return int
-	 */
-	int getUndoSelectionLength();
-
-	/**
-	 * Sets the cursor position to be used after this command is redone.
-	 */
-	void setRedoCursorPosition(int cursorPosition);
-
-	/**
-	 * Sets the length of text to be selected after this command is redone.
-	 */
-	void setRedoSelectionLength(int selectionLength);
-
-	/**
-	 * Sets the cursor position to be used after this command is undone.
-	 */
-	void setUndoCursorPosition(int cursorPosition);
-
-	/**
-	 * Sets the length of text to be selected after this command is undone.
-	 */
-	void setUndoSelectionLength(int selectionLength);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/IDocumentSelectionMediator.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/IDocumentSelectionMediator.java
deleted file mode 100644
index 5632884..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/IDocumentSelectionMediator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-import org.eclipse.jface.text.IDocument;
-
-
-public interface IDocumentSelectionMediator {
-	/**
-	 * Returns the document selection mediator's input document.
-	 * 
-	 * @return the document selection mediator's input document
-	 */
-	IDocument getDocument();
-
-	/**
-	 * Sets a new selection in the document as a result of an undo operation.
-	 * 
-	 * UndoDocumentEvent contains the requester of the undo operation, and the
-	 * offset and length of the new selection. Implementation of
-	 * IDocumentSelectionMediator can check if it's the requester that caused
-	 * the new selection, and decide if the new selection should be applied.
-	 */
-	void undoOperationSelectionChanged(UndoDocumentEvent event);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/IStructuredTextUndoManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/IStructuredTextUndoManager.java
deleted file mode 100644
index 80351ba..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/IStructuredTextUndoManager.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-
-public interface IStructuredTextUndoManager {
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, int cursorPosition, int selectionLength);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label, int cursorPosition, int selectionLength);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label, String description);
-
-	/**
-	 * Begin recording undo transactions.
-	 */
-	void beginRecording(Object requester, String label, String description, int cursorPosition, int selectionLength);
-
-	/**
-	 * Connect the mediator to the undo manager.
-	 */
-	void connect(IDocumentSelectionMediator mediator);
-
-	/**
-	 * Disable undo management.
-	 */
-	void disableUndoManagement();
-
-	/**
-	 * Disconnect the mediator from the undo manager.
-	 */
-	void disconnect(IDocumentSelectionMediator mediator);
-
-	/**
-	 * Enable undo management.
-	 */
-	void enableUndoManagement();
-
-	/**
-	 * End recording undo transactions.
-	 */
-	void endRecording(Object requester);
-
-	/**
-	 * End recording undo transactions.
-	 */
-	void endRecording(Object requester, int cursorPosition, int selectionLength);
-
-	/**
-	 * <p>
-	 * Normally, the undo manager can figure out the best times when to end a
-	 * pending command and begin a new one ... to the structure of a structued
-	 * document. There are times, however, when clients may wish to override
-	 * those algorithms and end one earlier than normal. The one known case is
-	 * for multipage editors. If a user is on one page, and type '123' as
-	 * attribute value, then click around to other parts of page, or different
-	 * pages, then return to '123|' and type 456, then "undo" they typically
-	 * expect the undo to just undo what they just typed, the 456, not the
-	 * whole attribute value.
-	 * <p>
-	 * If there is no pending command, the request is ignored.
-	 */
-	public void forceEndOfPendingCommand(Object requester, int currentPosition, int length);
-
-	/**
-	 * Some clients need to do complicated things with undo stack. Plus, in
-	 * some cases, if clients setCommandStack temporarily, they have
-	 * reponsibility to set back to original one when finished.
-	 */
-	public CommandStack getCommandStack();
-
-	/**
-	 * Get the redo command even if it's not committed yet.
-	 */
-	Command getRedoCommand();
-
-	/**
-	 * Get the undo command even if it's not committed yet.
-	 */
-	Command getUndoCommand();
-
-	/**
-	 * Redo the last command in the undo manager.
-	 */
-	void redo();
-
-	/**
-	 * Redo the last command in the undo manager and notify the requester
-	 * about the new selection.
-	 */
-	void redo(IDocumentSelectionMediator requester);
-
-	/**
-	 * Returns whether at least one text change can be repeated. A text change
-	 * can be repeated only if it was executed and rolled back.
-	 * 
-	 * @return <code>true</code> if at least on text change can be repeated
-	 */
-	boolean redoable();
-
-	/**
-	 * Set the command stack.
-	 */
-	void setCommandStack(CommandStack commandStack);
-
-	/**
-	 * Undo the last command in the undo manager.
-	 */
-	void undo();
-
-	/**
-	 * Undo the last command in the undo manager and notify the requester
-	 * about the new selection.
-	 */
-	void undo(IDocumentSelectionMediator requester);
-
-	/**
-	 * Returns whether at least one text change can be rolled back.
-	 * 
-	 * @return <code>true</code> if at least one text change can be rolled
-	 *         back
-	 */
-	boolean undoable();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCommand.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCommand.java
deleted file mode 100644
index b085f5b..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCommand.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-
-
-public interface StructuredTextCommand {
-
-	String getTextDeleted();
-
-	int getTextEnd();
-
-	String getTextInserted();
-
-	int getTextStart();
-
-	void setTextDeleted(String textDeleted);
-
-	void setTextEnd(int textEnd);
-
-	void setTextInserted(String textInserted);
-
-	void setTextStart(int textStart);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCommandImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCommandImpl.java
deleted file mode 100644
index 70f2bc2..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCommandImpl.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-
-public class StructuredTextCommandImpl extends AbstractCommand implements StructuredTextCommand {
-
-	protected IDocument fDocument = null; // needed for updating the text
-	protected String fTextDeleted = null;
-	protected int fTextEnd = -1;
-	protected String fTextInserted = null;
-	protected int fTextStart = -1;
-
-	/**
-	 * We have no-arg constructor non-public to force document to be specfied.
-	 *  
-	 */
-	protected StructuredTextCommandImpl() {
-		super();
-	}
-
-	public StructuredTextCommandImpl(IDocument document) {
-		this();
-		fDocument = document; // needed for updating the text
-	}
-
-	public void execute() {
-	}
-
-	/**
-	 * getTextDeleted method comment.
-	 */
-	public java.lang.String getTextDeleted() {
-		return fTextDeleted;
-	}
-
-	/**
-	 * textEnd is the same as (textStart + textInserted.length())
-	 */
-	public int getTextEnd() {
-		return fTextEnd;
-	}
-
-	/**
-	 * getTextInserted method comment.
-	 */
-	public java.lang.String getTextInserted() {
-		return fTextInserted;
-	}
-
-	/**
-	 * getTextStart method comment.
-	 */
-	public int getTextStart() {
-		return fTextStart;
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public void redo() {
-		if (fDocument instanceof IStructuredDocument) {
-			// note: one of the few places we programatically ignore read-only
-			// settings
-			((IStructuredDocument) fDocument).replaceText(this, fTextStart, fTextDeleted.length(), fTextInserted, true);
-		} else {
-			try {
-				fDocument.replace(fTextStart, fTextDeleted.length(), fTextInserted);
-			} catch (BadLocationException e) {
-				// assumed impossible, for now
-				Logger.logException(e);
-			}
-		}
-	}
-
-	/**
-	 * setTextDeleted method comment.
-	 */
-	public void setTextDeleted(java.lang.String textDeleted) {
-		fTextDeleted = textDeleted;
-	}
-
-	/**
-	 * setTextEnd method comment.
-	 */
-	public void setTextEnd(int textEnd) {
-		fTextEnd = textEnd;
-	}
-
-	/**
-	 * setTextInserted method comment.
-	 */
-	public void setTextInserted(java.lang.String textInserted) {
-		fTextInserted = textInserted;
-	}
-
-	/**
-	 * setTextStart method comment.
-	 */
-	public void setTextStart(int textStart) {
-		fTextStart = textStart;
-	}
-
-	public void undo() {
-		if (fDocument instanceof IStructuredDocument) {
-			// note: one of the few places we programatically ignore read-only
-			// settings
-			((IStructuredDocument) fDocument).replaceText(this, fTextStart, fTextInserted.length(), fTextDeleted, true);
-		} else {
-			try {
-				fDocument.replace(fTextStart, fTextInserted.length(), fTextDeleted);
-			} catch (BadLocationException e) {
-				// assumed impossible, for now
-				Logger.logException(e);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCompoundCommandImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCompoundCommandImpl.java
deleted file mode 100644
index ddf7636..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextCompoundCommandImpl.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-
-
-
-public class StructuredTextCompoundCommandImpl extends CompoundCommand implements CommandCursorPosition {
-	protected int fRedoCursorPosition = -1;
-	protected int fRedoSelectionLength = 0;
-
-	protected int fUndoCursorPosition = -1;
-	protected int fUndoSelectionLength = 0;
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 */
-	public StructuredTextCompoundCommandImpl() {
-		super();
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param resultIndex
-	 *            int
-	 */
-	public StructuredTextCompoundCommandImpl(int resultIndex) {
-		super(resultIndex);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param resultIndex
-	 *            int
-	 * @param commandList
-	 *            java.util.List
-	 */
-	public StructuredTextCompoundCommandImpl(int resultIndex, java.util.List commandList) {
-		super(resultIndex, commandList);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param resultIndex
-	 *            int
-	 * @param label
-	 *            java.lang.String
-	 */
-	public StructuredTextCompoundCommandImpl(int resultIndex, String label) {
-		super(resultIndex, label);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param resultIndex
-	 *            int
-	 * @param label
-	 *            java.lang.String
-	 * @param commandList
-	 *            java.util.List
-	 */
-	public StructuredTextCompoundCommandImpl(int resultIndex, String label, java.util.List commandList) {
-		super(resultIndex, label, commandList);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param resultIndex
-	 *            int
-	 * @param label
-	 *            java.lang.String
-	 * @param description
-	 *            java.lang.String
-	 */
-	public StructuredTextCompoundCommandImpl(int resultIndex, String label, String description) {
-		super(resultIndex, label, description);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param resultIndex
-	 *            int
-	 * @param label
-	 *            java.lang.String
-	 * @param description
-	 *            java.lang.String
-	 * @param commandList
-	 *            java.util.List
-	 */
-	public StructuredTextCompoundCommandImpl(int resultIndex, String label, String description, java.util.List commandList) {
-		super(resultIndex, label, description, commandList);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param commandList
-	 *            java.util.List
-	 */
-	public StructuredTextCompoundCommandImpl(java.util.List commandList) {
-		super(commandList);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param label
-	 *            java.lang.String
-	 */
-	public StructuredTextCompoundCommandImpl(String label) {
-		super(label);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param label
-	 *            java.lang.String
-	 * @param commandList
-	 *            java.util.List
-	 */
-	public StructuredTextCompoundCommandImpl(String label, java.util.List commandList) {
-		super(label, commandList);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param label
-	 *            java.lang.String
-	 * @param description
-	 *            java.lang.String
-	 */
-	public StructuredTextCompoundCommandImpl(String label, String description) {
-		super(label, description);
-	}
-
-	/**
-	 * StructuredTextCompoundCommandImpl constructor comment.
-	 * 
-	 * @param label
-	 *            java.lang.String
-	 * @param description
-	 *            java.lang.String
-	 * @param commandList
-	 *            java.util.List
-	 */
-	public StructuredTextCompoundCommandImpl(String label, String description, java.util.List commandList) {
-		super(label, description, commandList);
-	}
-
-	/**
-	 * Returns the cursor position to be set to after this command is redone.
-	 * 
-	 * @return int
-	 */
-	public int getRedoCursorPosition() {
-		int cursorPosition = -1;
-
-		if (fRedoCursorPosition != -1)
-			cursorPosition = fRedoCursorPosition;
-		else if (!commandList.isEmpty()) {
-			int commandListSize = commandList.size();
-			Command lastCommand = (Command) commandList.get(commandListSize - 1);
-
-			if (lastCommand instanceof CommandCursorPosition)
-				cursorPosition = ((CommandCursorPosition) lastCommand).getRedoCursorPosition();
-		}
-
-		return cursorPosition;
-	}
-
-	/**
-	 * Returns the length of text to be selected after this command is redone.
-	 * 
-	 * @return int
-	 */
-	public int getRedoSelectionLength() {
-		return fRedoSelectionLength;
-	}
-
-	/**
-	 * Returns the cursor position to be set to after this command is undone.
-	 * 
-	 * @return int
-	 */
-	public int getUndoCursorPosition() {
-		int cursorPosition = -1;
-
-		if (fUndoCursorPosition != -1)
-			cursorPosition = fUndoCursorPosition;
-		else if (!commandList.isEmpty()) {
-			// never used
-			//int commandListSize = commandList.size();
-			Command firstCommand = (Command) commandList.get(0);
-
-			if (firstCommand instanceof CommandCursorPosition)
-				cursorPosition = ((CommandCursorPosition) firstCommand).getUndoCursorPosition();
-		}
-
-		return cursorPosition;
-	}
-
-	/**
-	 * Returns the length of text to be selected after this command is undone.
-	 * 
-	 * @return int
-	 */
-	public int getUndoSelectionLength() {
-		return fUndoSelectionLength;
-	}
-
-	/**
-	 * Sets the cursor position to be used after this command is redone.
-	 */
-	public void setRedoCursorPosition(int cursorPosition) {
-		fRedoCursorPosition = cursorPosition;
-	}
-
-	/**
-	 * Sets the length of text to be selected after this command is redone.
-	 */
-	public void setRedoSelectionLength(int selectionLength) {
-		fRedoSelectionLength = selectionLength;
-	}
-
-	/**
-	 * Sets the cursor position to be used after this command is undone.
-	 */
-	public void setUndoCursorPosition(int cursorPosition) {
-		fUndoCursorPosition = cursorPosition;
-	}
-
-	/**
-	 * Sets the length of text to be selected after this command is undone.
-	 */
-	public void setUndoSelectionLength(int selectionLength) {
-		fUndoSelectionLength = selectionLength;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextUndoManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextUndoManager.java
deleted file mode 100644
index 3a2ff35..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/StructuredTextUndoManager.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Jesper Steen Møller - initial IDocumentExtension4 support - #102822
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-import java.util.EventObject;
-
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.jface.text.DocumentRewriteSession;
-import org.eclipse.jface.text.DocumentRewriteSessionType;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension4;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.SSECoreMessages;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
-import org.eclipse.wst.sse.core.internal.provisional.events.NewDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
-import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.util.Assert;
-import org.eclipse.wst.sse.core.internal.util.Utilities;
-
-public class StructuredTextUndoManager implements IStructuredTextUndoManager {
-
-	class InternalCommandStackListener implements CommandStackListener {
-		public void commandStackChanged(EventObject event) {
-			resetInternalCommands();
-		}
-	}
-
-	class InternalStructuredDocumentListener implements IStructuredDocumentListener {
-
-		public void newModel(NewDocumentEvent structuredDocumentEvent) {
-			// Do nothing. Do not push the new model's structuredDocument
-			// changes
-			// onto the undo command stack, or else the user may be able to
-			// undo
-			// an existing file to an empty file.
-		}
-
-		public void noChange(NoChangeEvent structuredDocumentEvent) {
-			// Since "no change", do nothing.
-		}
-
-		public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {
-			processStructuredDocumentEvent(structuredDocumentEvent);
-		}
-
-		private void processStructuredDocumentEvent(String textDeleted, String textInserted, int textStart, int textEnd) {
-			if (fTextCommand != null && textStart == fTextCommand.getTextEnd()) {
-				// append to the text command
-				fTextCommand.setTextDeleted(fTextCommand.getTextDeleted().concat(textDeleted));
-				fTextCommand.setTextInserted(fTextCommand.getTextInserted().concat(textInserted));
-				fTextCommand.setTextEnd(textEnd);
-			}
-			else if (fTextCommand != null && textStart == fTextCommand.getTextStart() - (textEnd - textStart + 1) && textEnd <= fTextCommand.getTextEnd() - (textEnd - textStart + 1) && textDeleted.length() == 1 && textInserted.length() == 0) {
-				// backspace pressed
-
-				// erase a character just inserted
-				if (fTextCommand.getTextInserted().length() > 0) {
-					fTextCommand.setTextInserted(fTextCommand.getTextInserted().substring(0, fTextCommand.getTextEnd() - fTextCommand.getTextStart() - 1));
-					fTextCommand.setTextEnd(textEnd);
-				}
-				// erase a character in the file
-				else {
-					fTextCommand.setTextDeleted(textDeleted.concat(fTextCommand.getTextDeleted()));
-					fTextCommand.setTextStart(textStart);
-				}
-			}
-			else {
-				createNewTextCommand(textDeleted, textInserted, textStart, textEnd);
-			}
-
-			// save cursor position
-			fCursorPosition = textEnd;
-		}
-
-		private void processStructuredDocumentEvent(StructuredDocumentEvent structuredDocumentEvent) {
-			// Note: fListening tells us if we should listen to the
-			// StructuredDocumentEvent.
-			// fListening is set to false right before the undo/redo process
-			// and
-			// then set to true again
-			// right after the undo/redo process to block out and ignore all
-			// StructuredDocumentEvents generated
-			// by the undo/redo process.
-
-			// Process StructuredDocumentEvent if fListening is true.
-			//
-			// We are executing a command from the command stack if the
-			// requester
-			// is a command (for example, undo/redo).
-			// We should not process the flat model event when we are
-			// executing a
-			// command from the command stack.
-			if (fUndoManagementEnabled && !(structuredDocumentEvent.getOriginalRequester() instanceof Command)) {
-				// check requester if not recording
-				if (!fRecording)
-					checkRequester(structuredDocumentEvent.getOriginalRequester());
-
-				// process the structuredDocumentEvent
-				String textDeleted = structuredDocumentEvent.getDeletedText();
-				String textInserted = structuredDocumentEvent.getText();
-				int textStart = structuredDocumentEvent.getOffset();
-				int textEnd = textStart + textInserted.length();
-				processStructuredDocumentEvent(textDeleted, textInserted, textStart, textEnd);
-			}
-		}
-
-		public void regionChanged(RegionChangedEvent structuredDocumentEvent) {
-			processStructuredDocumentEvent(structuredDocumentEvent);
-		}
-
-		public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {
-			processStructuredDocumentEvent(structuredDocumentEvent);
-		}
-
-	}
-
-	private static final String TEXT_CHANGE_TEXT = SSECoreMessages.Text_Change_UI_; //$NON-NLS-1$
-	private CommandStack fCommandStack = null;
-	private StructuredTextCompoundCommandImpl fCompoundCommand = null;
-	private String fCompoundCommandDescription = null;
-	private String fCompoundCommandLabel = null;
-	int fCursorPosition = 0;
-	// private IStructuredModel fStructuredModel = null;
-	private IDocument fDocument;
-	private InternalCommandStackListener fInternalCommandStackListener;
-	// private Map fTextViewerToListenerMap = new HashMap();
-	private IStructuredDocumentListener fInternalStructuredDocumentListener;
-	private IDocumentSelectionMediator[] fMediators = null;
-	private boolean fRecording = false;
-	private int fRecordingCount = 0;
-	private Object fRequester;
-	StructuredTextCommandImpl fTextCommand = null;
-	private int fUndoCursorPosition = -1;
-	boolean fUndoManagementEnabled = true;
-	private int fUndoSelectionLength = 0;
-
-	public StructuredTextUndoManager() {
-		this(new BasicCommandStack());
-	}
-
-	public StructuredTextUndoManager(CommandStack commandStack) {
-		setCommandStack(commandStack);
-	}
-
-	private void addDocumentSelectionMediator(IDocumentSelectionMediator mediator) {
-		if (!Utilities.contains(fMediators, mediator)) {
-			int oldSize = 0;
-
-			if (fMediators != null) {
-				// normally won't be null, but we need to be sure, for first
-				// time through
-				oldSize = fMediators.length;
-			}
-
-			int newSize = oldSize + 1;
-			IDocumentSelectionMediator[] newMediators = new IDocumentSelectionMediator[newSize];
-			if (fMediators != null) {
-				System.arraycopy(fMediators, 0, newMediators, 0, oldSize);
-			}
-
-			// add the new undo mediator to last position
-			newMediators[newSize - 1] = mediator;
-
-			// now switch new for old
-			fMediators = newMediators;
-		}
-		else {
-			removeDocumentSelectionMediator(mediator);
-			addDocumentSelectionMediator(mediator);
-		}
-	}
-
-	public void beginRecording(Object requester) {
-		beginRecording(requester, null, null);
-	}
-
-	public void beginRecording(Object requester, int cursorPosition, int selectionLength) {
-		beginRecording(requester, null, null);
-
-		fUndoCursorPosition = cursorPosition;
-		fUndoSelectionLength = selectionLength;
-	}
-
-	public void beginRecording(Object requester, String label) {
-		beginRecording(requester, label, null);
-	}
-
-	public void beginRecording(Object requester, String label, int cursorPosition, int selectionLength) {
-		beginRecording(requester, label, null);
-
-		fUndoCursorPosition = cursorPosition;
-		fUndoSelectionLength = selectionLength;
-	}
-
-	public void beginRecording(Object requester, String label, String description) {
-		// save the requester
-		fRequester = requester;
-
-		// update label and desc only on the first level when recording is
-		// nested
-		if (fRecordingCount == 0) {
-			fCompoundCommandLabel = label;
-			if (fCompoundCommandLabel == null)
-				fCompoundCommandLabel = TEXT_CHANGE_TEXT;
-
-			fCompoundCommandDescription = description;
-			if (fCompoundCommandDescription == null)
-				fCompoundCommandDescription = TEXT_CHANGE_TEXT;
-
-			// clear commands
-			fTextCommand = null;
-			fCompoundCommand = null;
-		}
-
-		// update counter and flag
-		fRecordingCount++;
-		fRecording = true;
-
-		// no undo cursor position and undo selection length specified
-		// reset undo cursor position and undo selection length
-		fUndoCursorPosition = -1;
-		fUndoSelectionLength = 0;
-	}
-
-	public void beginRecording(Object requester, String label, String description, int cursorPosition, int selectionLength) {
-		beginRecording(requester, label, description);
-
-		fUndoCursorPosition = cursorPosition;
-		fUndoSelectionLength = selectionLength;
-	}
-
-	void checkRequester(Object requester) {
-		if (fRequester != null && !fRequester.equals(requester)) {
-			// Force restart of recording so the last compound command is
-			// closed.
-			//
-			// However, we should not force restart of recording when the
-			// request came from StructuredDocumentToTextAdapter or
-			// XMLModelImpl
-			// because cut/paste requests and character inserts to the
-			// textViewer are from StructuredDocumentToTextAdapter,
-			// and requests to delete a node in the XMLTableTreeViewer are
-			// from XMLModelImpl (which implements IStructuredModel).
-
-			if (!(requester instanceof IStructuredModel || requester instanceof IStructuredDocument)) {
-				resetInternalCommands();
-			}
-		}
-	}
-
-
-
-	public void connect(IDocumentSelectionMediator mediator) {
-		Assert.isNotNull(mediator);
-		if (fDocument == null) {
-			// add this undo manager as structured document listener
-			fDocument = mediator.getDocument();
-			// future_TODO: eventually we want to refactor or allow either
-			// type of document, but for now, we'll do instanceof check, and
-			// fail
-			// if not right type
-			if (fDocument instanceof IStructuredDocument) {
-				((IStructuredDocument) fDocument).addDocumentChangedListener(getInternalStructuredDocumentListener());
-			}
-			else {
-				throw new IllegalArgumentException("only meditator with structured documents currently handled"); //$NON-NLS-1$
-			}
-		}
-		else {
-			// if we've already had our document set, we'll just do this fail
-			// fast integrity check
-			if (!fDocument.equals(mediator.getDocument()))
-				throw new IllegalStateException("Connection to undo manager failed. Document for document selection mediator inconistent with undo manager."); //$NON-NLS-1$
-		}
-
-		addDocumentSelectionMediator(mediator);
-	}
-
-	void createNewTextCommand(String textDeleted, String textInserted, int textStart, int textEnd) {
-		StructuredTextCommandImpl textCommand = new StructuredTextCommandImpl(fDocument);
-		textCommand.setLabel(TEXT_CHANGE_TEXT);
-		textCommand.setDescription(TEXT_CHANGE_TEXT);
-		textCommand.setTextStart(textStart);
-		textCommand.setTextEnd(textEnd);
-		textCommand.setTextDeleted(textDeleted);
-		textCommand.setTextInserted(textInserted);
-
-		if (fRecording) {
-			if (fCompoundCommand == null) {
-				StructuredTextCompoundCommandImpl compoundCommand = new StructuredTextCompoundCommandImpl();
-				compoundCommand.setUndoCursorPosition(fUndoCursorPosition);
-				compoundCommand.setUndoSelectionLength(fUndoSelectionLength);
-
-				compoundCommand.setLabel(fCompoundCommandLabel);
-				compoundCommand.setDescription(fCompoundCommandDescription);
-				compoundCommand.append(textCommand);
-
-				fCompoundCommand = compoundCommand;
-			}
-			else {
-				fCompoundCommand.append(textCommand);
-			}
-		}
-		else {
-			fCommandStack.execute(textCommand);
-		}
-
-		fTextCommand = textCommand;
-	}
-
-	/**
-	 * Disable undo management.
-	 */
-	public void disableUndoManagement() {
-		fUndoManagementEnabled = false;
-	}
-
-	public void disconnect(IDocumentSelectionMediator mediator) {
-		removeDocumentSelectionMediator(mediator);
-
-		if (fMediators != null && fMediators.length == 0 && fDocument != null) {
-			// remove this undo manager as structured document listener
-			// future_TODO: eventually we want to refactor or allow either
-			// type of document, but for now, we'll do instanceof check, and
-			// fail
-			// if not right type
-			if (fDocument instanceof IStructuredDocument) {
-				((IStructuredDocument) fDocument).removeDocumentChangedListener(getInternalStructuredDocumentListener());
-			}
-			else {
-				throw new IllegalArgumentException("only meditator with structured documents currently handled"); //$NON-NLS-1$
-			}
-			// if no longer listening to document, then dont even track it
-			// anymore
-			// (this allows connect to reconnect to document again)
-			fDocument = null;
-		}
-	}
-
-	public void enableUndoManagement() {
-		fUndoManagementEnabled = true;
-	}
-
-	public void endRecording(Object requester) {
-		int cursorPosition = (fTextCommand != null) ? fTextCommand.getTextEnd() : -1;
-		int selectionLength = 0;
-
-		endRecording(requester, cursorPosition, selectionLength);
-	}
-
-	public void endRecording(Object requester, int cursorPosition, int selectionLength) {
-		// Recording could be stopped by forceEndOfPendingCommand(). Make sure
-		// we are still recording before proceeding, or else fRecordingCount
-		// may not be balanced.
-		if (fRecording) {
-			if (fCompoundCommand != null) {
-				fCompoundCommand.setRedoCursorPosition(cursorPosition);
-				fCompoundCommand.setRedoSelectionLength(selectionLength);
-			}
-
-			// end recording is a logical stopping point for text command,
-			// even when fRecordingCount > 0 (in nested beginRecording)
-			fTextCommand = null;
-
-			// update counter and flag
-			if (fRecordingCount > 0)
-				fRecordingCount--;
-			if (fRecordingCount == 0) {
-				
-				// Finally execute the commands accumulated in the compound command.
-				
-				if (fCompoundCommand != null) {
-					fCommandStack.execute(fCompoundCommand);
-				}
-				
-				fRecording = false;
-
-				// reset compound command only when fRecordingCount ==
-				// 0
-				fCompoundCommand = null;
-				fCompoundCommandLabel = null;
-				fCompoundCommandDescription = null;
-
-				// Also reset fRequester
-				fRequester = null;
-			}
-		}
-	}
-
-	/**
-	 * Utility method to find model given document
-	 */
-	private IStructuredModel findStructuredModel(IDocument document) {
-		IModelManager modelManager = StructuredModelManager.getModelManager();
-		IStructuredModel structuredModel = modelManager.getExistingModelForRead(document);
-		return structuredModel;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.undo.IStructuredTextUndoManager#forceEndOfPendingCommand(java.lang.Object,
-	 *      int, int)
-	 */
-	public void forceEndOfPendingCommand(Object requester, int currentPosition, int length) {
-		if (fRecording)
-			endRecording(requester, currentPosition, length);
-		else
-			resetInternalCommands();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.undo.IStructuredTextUndoManager#getCommandStack()
-	 */
-	public CommandStack getCommandStack() {
-		return fCommandStack;
-	}
-
-	/**
-	 * @return
-	 */
-	private CommandStackListener getInternalCommandStackListener() {
-		if (fInternalCommandStackListener == null) {
-			fInternalCommandStackListener = new InternalCommandStackListener();
-		}
-		return fInternalCommandStackListener;
-	}
-
-	/**
-	 * @return
-	 */
-	private IStructuredDocumentListener getInternalStructuredDocumentListener() {
-		if (fInternalStructuredDocumentListener == null) {
-			fInternalStructuredDocumentListener = new InternalStructuredDocumentListener();
-		}
-		return fInternalStructuredDocumentListener;
-	}
-
-	public Command getRedoCommand() {
-		return fCommandStack.getRedoCommand();
-	}
-
-	public Command getUndoCommand() {
-		return fCommandStack.getUndoCommand();
-	}
-
-	public void redo() {
-		redo(null);
-	}
-
-	public void redo(IDocumentSelectionMediator requester) {
-		IStructuredModel model = findStructuredModel(fDocument);
-
-		if (redoable()) {
-			IDocumentExtension4 docExt4 = null;
-			DocumentRewriteSession rewriteSession = null;
-			try {
-				if (model != null)
-					model.aboutToChangeModel();
-
-				Command redoCommand = getRedoCommand();
-				if (redoCommand instanceof CompoundCommand &&
-						model.getStructuredDocument() instanceof IDocumentExtension4) {
-					docExt4 = (IDocumentExtension4)model.getStructuredDocument();
-				}
-				rewriteSession = (docExt4 == null) ? null :
-					docExt4.startRewriteSession(DocumentRewriteSessionType.UNRESTRICTED);
-
-				// make sure to redo before setting document selection
-				fCommandStack.redo();
-
-				// set document selection
-				setRedoDocumentSelection(requester, redoCommand);
-			}
-			finally {
-				if (docExt4 != null && rewriteSession != null)
-					docExt4.stopRewriteSession(rewriteSession);
-				if (model != null) {
-					model.changedModel();
-					model.releaseFromRead();
-				}
-			}
-		}
-	}
-
-	public boolean redoable() {
-		return fCommandStack.canRedo();
-	}
-
-	private void removeDocumentSelectionMediator(IDocumentSelectionMediator mediator) {
-		if (fMediators != null && mediator != null) {
-			// if its not in the array, we'll ignore the request
-			if (Utilities.contains(fMediators, mediator)) {
-				int oldSize = fMediators.length;
-				int newSize = oldSize - 1;
-				IDocumentSelectionMediator[] newMediators = new IDocumentSelectionMediator[newSize];
-				int index = 0;
-				for (int i = 0; i < oldSize; i++) {
-					if (fMediators[i] == mediator) { // ignore
-					}
-					else {
-						// copy old to new if its not the one we are removing
-						newMediators[index++] = fMediators[i];
-					}
-				}
-				// now that we have a new array, let's switch it for the old
-				// one
-				fMediators = newMediators;
-			}
-		}
-	}
-
-	void resetInternalCommands() {
-		// Either the requester of the structured document change event is
-		// changed, or the command stack is changed. Need to reset internal
-		// commands so we won't continue to append changes.
-		fCompoundCommand = null;
-		fTextCommand = null;
-
-		// Also reset fRequester
-		fRequester = null;
-	}
-
-	public void setCommandStack(CommandStack commandStack) {
-		if (fCommandStack != null)
-			fCommandStack.removeCommandStackListener(getInternalCommandStackListener());
-
-		fCommandStack = commandStack;
-
-		if (fCommandStack != null)
-			fCommandStack.addCommandStackListener(getInternalCommandStackListener());
-	}
-
-	private void setRedoDocumentSelection(IDocumentSelectionMediator requester, Command command) {
-		int cursorPosition = -1;
-		int selectionLength = 0;
-
-		if (command instanceof CommandCursorPosition) {
-			CommandCursorPosition commandCursorPosition = (CommandCursorPosition) command;
-			cursorPosition = commandCursorPosition.getRedoCursorPosition();
-			selectionLength = commandCursorPosition.getRedoSelectionLength();
-		}
-		else if (command instanceof StructuredTextCommand) {
-			StructuredTextCommand structuredTextCommand = (StructuredTextCommand) command;
-			cursorPosition = structuredTextCommand.getTextStart();
-			selectionLength = structuredTextCommand.getTextInserted().length();
-		}
-
-		if (cursorPosition > -1 && fMediators != null && fMediators.length > 0) {
-			for (int i = 0; i < fMediators.length; i++) {
-				IDocument document = fMediators[i].getDocument();
-				fMediators[i].undoOperationSelectionChanged(new UndoDocumentEvent(requester, document, cursorPosition, selectionLength));
-			}
-		}
-	}
-
-	private void setUndoDocumentSelection(IDocumentSelectionMediator requester, Command command) {
-		int cursorPosition = -1;
-		int selectionLength = 0;
-
-		if (command instanceof CommandCursorPosition) {
-			CommandCursorPosition commandCursorPosition = (CommandCursorPosition) command;
-			cursorPosition = commandCursorPosition.getUndoCursorPosition();
-			selectionLength = commandCursorPosition.getUndoSelectionLength();
-		}
-		else if (command instanceof StructuredTextCommand) {
-			StructuredTextCommand structuredTextCommand = (StructuredTextCommand) command;
-			cursorPosition = structuredTextCommand.getTextStart();
-			selectionLength = structuredTextCommand.getTextDeleted().length();
-		}
-
-		if (cursorPosition > -1 && fMediators != null && fMediators.length > 0) {
-			for (int i = 0; i < fMediators.length; i++) {
-				IDocument document = fMediators[i].getDocument();
-				fMediators[i].undoOperationSelectionChanged(new UndoDocumentEvent(requester, document, cursorPosition, selectionLength));
-			}
-		}
-	}
-
-	public void undo() {
-		undo(null);
-	}
-
-	public void undo(IDocumentSelectionMediator requester) {
-		// Force an endRecording before undo.
-		//
-		// For example, recording was turned on on the Design Page of
-		// PageDesigner.
-		// Then undo is invoked on the Source Page. Recording should be
-		// stopped before we undo.
-		// Note that redo should not be available when we switch to the Source
-		// Page.
-		// Therefore, this force ending of recording is not needed in redo.
-		if (fRecording)
-			endRecording(this);
-
-		if (undoable()) {
-			IStructuredModel model = findStructuredModel(fDocument);
-			IDocumentExtension4 docExt4 = null;
-			DocumentRewriteSession rewriteSession = null;
-
-			try {
-				if (model != null)
-					model.aboutToChangeModel();
-
-				Command undoCommand = getUndoCommand();
-				if (undoCommand instanceof CompoundCommand &&
-						model.getStructuredDocument() instanceof IDocumentExtension4) {
-					docExt4 = (IDocumentExtension4)model.getStructuredDocument();
-				}
-				rewriteSession = (docExt4 == null) ? null :
-					docExt4.startRewriteSession(DocumentRewriteSessionType.UNRESTRICTED);
-				
-				// make sure to undo before setting document selection
-				fCommandStack.undo();
-
-				// set document selection
-				setUndoDocumentSelection(requester, undoCommand);
-			}
-			finally {
-				if (docExt4 != null && rewriteSession != null)
-					docExt4.stopRewriteSession(rewriteSession);
-				if (model != null) {
-					model.changedModel();
-					model.releaseFromRead();
-				}
-			}
-		}
-	}
-
-	public boolean undoable() {
-		return fCommandStack.canUndo();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/UndoDocumentEvent.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/UndoDocumentEvent.java
deleted file mode 100644
index 0fee467..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/undo/UndoDocumentEvent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.undo;
-
-import org.eclipse.jface.text.IDocument;
-
-public class UndoDocumentEvent {
-	private IDocument fDocument;
-	private int fLength;
-	private int fOffset;
-	private IDocumentSelectionMediator fRequester;
-
-	public UndoDocumentEvent(IDocumentSelectionMediator requester, IDocument document, int offset, int length) {
-		fRequester = requester;
-		fDocument = document;
-		fOffset = offset;
-		fLength = length;
-	}
-
-	public IDocument getDocument() {
-		return fDocument;
-	}
-
-	public int getLength() {
-		return fLength;
-	}
-
-	public int getOffset() {
-		return fOffset;
-	}
-
-	public IDocumentSelectionMediator getRequester() {
-		return fRequester;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Assert.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Assert.java
deleted file mode 100644
index f3d1ee0..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Assert.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-
-/**
- * <code>Assert</code> is useful for for embedding runtime sanity checks in
- * code. The predicate methods all test a condition and throw some type of
- * unchecked exception if the condition does not hold.
- * <p>
- * Assertion failure exceptions, like most runtime exceptions, are thrown when
- * something is misbehaving. Assertion failures are invariably unspecified
- * behavior; consequently, clients should never rely on these being thrown
- * (and certainly should not being catching them specifically).
- * </p>
- */
-public final class Assert {
-
-	/**
-	 * <code>AssertionFailedException</code> is a runtime exception thrown
-	 * by some of the methods in <code>Assert</code>.
-	 * <p>
-	 * This class is not declared public to prevent some misuses; programs
-	 * that catch or otherwise depend on assertion failures are susceptible to
-	 * unexpected breakage when assertions in the code are added or removed.
-	 * </p>
-	 */
-	class AssertionFailedException extends RuntimeException {
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 1L;
-
-		/**
-		 * Constructs a new exception.
-		 */
-		public AssertionFailedException() {
-			super();
-		}
-
-		/**
-		 * Constructs a new exception with the given message.
-		 */
-		public AssertionFailedException(String detail) {
-			super(detail);
-		}
-	}
-
-	/**
-	 * Asserts that an argument is legal. If the given boolean is not
-	 * <code>true</code>, an <code>IllegalArgumentException</code> is
-	 * thrown.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @return <code>true</code> if the check passes (does not return if the
-	 *         check fails)
-	 * @exception IllegalArgumentException
-	 *                if the legality test failed
-	 */
-	public static boolean isLegal(boolean expression) {
-		return isLegal(expression, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Asserts that an argument is legal. If the given boolean is not
-	 * <code>true</code>, an <code>IllegalArgumentException</code> is
-	 * thrown. The given message is included in that exception, to aid
-	 * debugging.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @param message
-	 *            the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return if the
-	 *         check fails)
-	 * @exception IllegalArgumentException
-	 *                if the legality test failed
-	 */
-	public static boolean isLegal(boolean expression, String message) {
-		if (!expression)
-			throw new IllegalArgumentException();
-		return expression;
-	}
-
-	/**
-	 * Asserts that the given object is not <code>null</code>. If this is
-	 * not the case, some kind of unchecked exception is thrown.
-	 * 
-	 * @param object
-	 *            the value to test
-	 * @exception IllegalArgumentException
-	 *                if the object is <code>null</code>
-	 */
-	public static void isNotNull(Object object) {
-		isNotNull(object, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Asserts that the given object is not <code>null</code>. If this is
-	 * not the case, some kind of unchecked exception is thrown. The given
-	 * message is included in that exception, to aid debugging.
-	 * 
-	 * @param object
-	 *            the value to test
-	 * @param message
-	 *            the message to include in the exception
-	 * @exception IllegalArgumentException
-	 *                if the object is <code>null</code>
-	 */
-	public static void isNotNull(Object object, String message) {
-		if (object == null) {
-			//Logger.log(Logger.ERROR, "null_argument: " + message); //$NON-NLS-1$
-			throw new Assert().new AssertionFailedException(message);
-		}
-	}
-
-	/**
-	 * Asserts that the given boolean is <code>true</code>. If this is not
-	 * the case, some kind of unchecked exception is thrown.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @return <code>true</code> if the check passes (does not return if the
-	 *         check fails)
-	 */
-	public static boolean isTrue(boolean expression) {
-		return isTrue(expression, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Asserts that the given boolean is <code>true</code>. If this is not
-	 * the case, some kind of unchecked exception is thrown. The given message
-	 * is included in that exception, to aid debugging.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @param message
-	 *            the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return if the
-	 *         check fails)
-	 */
-	public static boolean isTrue(boolean expression, String message) {
-		if (!expression) {
-			throw new Assert().new AssertionFailedException(message);
-		}
-		return expression;
-	}
-
-	/* This class is not intended to be instantiated. */
-	private Assert() {
-		super();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Debug.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Debug.java
deleted file mode 100644
index d6126c3..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Debug.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-
-
-import java.util.Enumeration;
-
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-
-
-public final class Debug {
-	public static final boolean checkForMemoryLeaks = false;
-
-	public static final boolean collectStats = false;
-
-	public static final int DEBUG = 0;
-
-	public static final boolean DEBUG_THREADLOCAL = false;
-
-	public static final boolean debugBreakpoints = false;
-	public static final boolean debugCaretMediator = false;
-	public static final boolean debugDisplayTreePositions = false;
-	//
-	public static final boolean debugMediator = false;
-	//
-	public static final boolean debugNotification = false;
-	public static final boolean debugNotificationAndEvents = false;
-
-	public static final boolean debugNotifyDeferred = false;
-	public static final boolean debugReconciling = false;
-	//
-	public static final boolean debugRtfFormatProvider = false;
-	//
-	public static final boolean debugStructuredDocument = false;
-	public static final boolean debugTaglibs = false;
-	//
-	public static final boolean debugTokenizer = false;
-	//
-	public static final boolean debugTreeModel = false;
-	public static final boolean debugUpdateTreePositions = false;
-	public static final boolean displayInfo = false;
-
-	/** effects output of Logger */
-	public static final boolean displayToConsole = true;
-	public static final boolean displayWarnings = false;
-	//
-	public static final boolean headParsing = false;
-	public static final boolean jsDebugContextAssist = false;
-	//
-	public static final boolean jsDebugSyntaxColoring = false;
-
-	public static final boolean LOCKS = false;
-	// 
-	public static final boolean perfTest = false;
-	public static final boolean perfTestAdapterClassLoading = false;
-	public static final boolean perfTestFormat = false;
-	public static final boolean perfTestRawStructuredDocumentOnly = false;
-	public static final boolean perfTestStructuredDocumentEventOnly = false;
-	public static final boolean perfTestStructuredDocumentOnly = false;
-
-	//
-	public static final boolean syntaxHighlighting = false;
-	//
-	public static final boolean useStandardEolInWidget = false;
-
-	/**
-	 * For tests and debug only
-	 */
-
-	public static final void dump(IStructuredDocument structuredDocument) {
-		dump(structuredDocument, false);
-	}
-
-	public static final void dump(IStructuredDocument structuredDocument, boolean verbose) {
-		ITextRegionCollection flatNode = null;
-		System.out.println("Dump of structuredDocument:"); //$NON-NLS-1$
-		IStructuredDocumentRegionList flatNodes = structuredDocument.getRegionList();
-		Enumeration structuredDocumentRegions = flatNodes.elements();
-		while (structuredDocumentRegions.hasMoreElements()) {
-			flatNode = (ITextRegionCollection) structuredDocumentRegions.nextElement();
-			if (!verbose) {
-				String outString = flatNode.toString();
-				outString = org.eclipse.wst.sse.core.utils.StringUtils.escape(outString);
-				System.out.println(outString);
-			} else {
-				dump(flatNode, verbose);
-			}
-		}
-		System.out.println();
-		System.out.println("= = = = = ="); //$NON-NLS-1$
-		System.out.println();
-	}
-
-	/**
-	 * @param flatNode
-	 * @param verbose
-	 */
-	public static final void dump(ITextRegionCollection region, boolean verbose) {
-		if (region == null)
-			return;
-		if (verbose) {
-			printParent(region);
-		}
-		printChildRegions(region, 0);
-	}
-
-	private static void printChildRegions(ITextRegionCollection region, int depth) {
-		if (region != null) {
-			// ==> // ITextRegionCollection regionCollection = region;
-			System.out.println(region);
-			ITextRegionList regionList = region.getRegions();
-			for (int i = 0; i < regionList.size(); i++) {
-				ITextRegion r = regionList.get(i);
-				if (r instanceof ITextRegionCollection) {
-					ITextRegionCollection rc = (ITextRegionCollection) r;
-					printChildRegions(rc, depth++);
-				} else {
-					System.out.println(space(depth) + r);
-					depth--;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Simple utility to make sure println's are some what in order
-	 */
-	public static final synchronized void println(String msg) {
-		System.out.println(System.currentTimeMillis() + "\t" + msg); //$NON-NLS-1$
-	}
-
-	private static void printParent(IStructuredDocumentRegion region) {
-		System.out.println("    [parent document: " + toStringUtil(region.getParentDocument()) + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private static void printParent(ITextRegionCollection region) {
-		if (region instanceof IStructuredDocumentRegion) {
-			printParent((IStructuredDocumentRegion) region);
-		} else if (region instanceof ITextRegionContainer) {
-			printParent((ITextRegionContainer) region);
-		} else
-			System.out.println("    [parent document: " + "(na)" + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	private static void printParent(ITextRegionContainer region) {
-		System.out.println("    [parent document: " + toStringUtil(region.getParent()) + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * @param depth
-	 * @return
-	 */
-	private static String space(int depth) {
-		String result = "  "; //$NON-NLS-1$
-		for (int i = 0; i < depth; i++) {
-			result += "  "; //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	public static final String toStringUtil(IStructuredDocument object) {
-		String className = object.getClass().getName();
-		String shortClassName = className.substring(className.lastIndexOf(".") + 1); //$NON-NLS-1$
-		String result = shortClassName;
-		// NOTE: if the document held by any region has been updated and the
-		// region offsets have not
-		// yet been updated, the output from this method invalid.
-		return result;
-
-	}
-
-	public static final String toStringUtil(ITextRegionCollection object) {
-		String className = object.getClass().getName();
-		String shortClassName = className.substring(className.lastIndexOf(".") + 1); //$NON-NLS-1$
-		String result = shortClassName;
-		// NOTE: if the document held by any region has been updated and the
-		// region offsets have not
-		// yet been updated, the output from this method invalid.
-		return result;
-
-	}
-
-	/**
-	 * Debug constructor comment.
-	 */
-	public Debug() {
-		super();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/DocumentInputStream.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/DocumentInputStream.java
deleted file mode 100644
index fad0951..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/DocumentInputStream.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-
-public class DocumentInputStream extends InputStream {
-	private IDocument fDocument;
-	private int fMark = -1;
-	private int fPosition = 0;
-
-	public DocumentInputStream(IDocument source) {
-		super();
-		fDocument = source;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#available()
-	 */
-	public int available() throws IOException {
-		return fDocument.getLength() - fPosition;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#close()
-	 */
-	public void close() throws IOException {
-		this.fDocument = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#mark(int)
-	 */
-	public synchronized void mark(int readlimit) {
-		fMark = fPosition;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#markSupported()
-	 */
-	public boolean markSupported() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#read()
-	 */
-	public int read() throws IOException {
-		try {
-			if (fPosition < fDocument.getLength())
-				return fDocument.getChar(fPosition++);
-			else
-				return -1;
-		} catch (BadLocationException e) {
-			throw new IOException(e.getMessage());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#reset()
-	 */
-	public synchronized void reset() throws IOException {
-		fPosition = fMark;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.io.InputStream#skip(long)
-	 */
-	public long skip(long n) throws IOException {
-		long skipped = n;
-		if (n < fDocument.getLength() - fPosition) {
-			skipped = n;
-			fPosition += skipped;
-		} else {
-			skipped = fDocument.getLength() - fPosition;
-			fPosition = fDocument.getLength();
-		}
-		return skipped;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/JarUtilities.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/JarUtilities.java
deleted file mode 100644
index 5582df1..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/JarUtilities.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-import java.util.zip.ZipInputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.sse.core.internal.Logger;
-
-
-public class JarUtilities {
-
-	/**
-	 * @see http://java.sun.com/products/jsp/errata_1_1_a_042800.html, Issues
-	 *      8 & 9
-	 * 
-	 * "There are two cases. In both cases the TLD_URI is to be interpreted
-	 * relative to the root of the Web Application. In the first case the
-	 * TLD_URI refers to a TLD file directly. In the second case, the TLD_URI
-	 * refers to a JAR file. If so, that JAR file should have a TLD at
-	 * location META-INF/taglib.tld."
-	 */
-	public static final String JSP11_TAGLIB = "META-INF/taglib.tld"; //$NON-NLS-1$
-
-	public static void closeJarFile(ZipFile file) {
-		if (file == null)
-			return;
-		try {
-			file.close();
-		}
-		catch (IOException ioe) {
-			// no cleanup can be done
-			Logger.logException("JarUtilities: Could not close file " + file.getName(), ioe); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Provides a stream to a local copy of the input or null if not possible
-	 */
-	protected static InputStream getCachedInputStream(String jarFilename, String entryName) {
-		File testFile = new File(jarFilename);
-		if (!testFile.exists())
-			return null;
-
-		InputStream cache = null;
-		ZipFile jarfile = null;
-		try {
-			jarfile = new ZipFile(jarFilename);
-		}
-		catch (IOException ioExc) {
-			Logger.logException("JarUtilities: " + jarFilename, ioExc); //$NON-NLS-1$
-			closeJarFile(jarfile);
-		}
-
-		if (jarfile != null) {
-			try {
-				ZipEntry zentry = jarfile.getEntry(entryName);
-				if (zentry != null) {
-					InputStream entryInputStream = null;
-					try {
-						entryInputStream = jarfile.getInputStream(zentry);
-					}
-					catch (IOException ioExc) {
-						Logger.logException("JarUtilities: " + jarFilename, ioExc); //$NON-NLS-1$
-					}
-
-					if (entryInputStream != null) {
-						int c;
-						ByteArrayOutputStream buffer = null;
-						if (zentry.getSize() > 0) {
-							buffer = new ByteArrayOutputStream((int) zentry.getSize());
-						}
-						else {
-							buffer = new ByteArrayOutputStream();
-						}
-						// array dim restriction?
-						byte bytes[] = new byte[2048];
-						try {
-							while ((c = entryInputStream.read(bytes)) >= 0) {
-								buffer.write(bytes, 0, c);
-							}
-							cache = new ByteArrayInputStream(buffer.toByteArray());
-							closeJarFile(jarfile);
-						}
-						catch (IOException ioe) {
-							// no cleanup can be done
-						}
-						finally {
-							try {
-								entryInputStream.close();
-							}
-							catch (IOException e) {
-							}
-						}
-					}
-				}
-			}
-			finally {
-				closeJarFile(jarfile);
-			}
-		}
-		return cache;
-	}
-	
-	private static InputStream copyAndCloseStream(InputStream original) {
-		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-		InputStream cachedCopy = null;
-		
-		if (original != null) {
-			int c;
-			// array dim restriction?
-			byte bytes[] = new byte[2048];
-			try {
-				while ((c = original.read(bytes)) >= 0) {
-					buffer.write(bytes, 0, c);
-				}
-				cachedCopy = new ByteArrayInputStream(buffer.toByteArray());
-				closeStream(original);
-			}
-			catch (IOException ioe) {
-				// no cleanup can be done
-			}
-		}
-		return cachedCopy;
-	}
-
-	public static String[] getEntryNames(IResource jarResource) {
-		if (jarResource == null || jarResource.getType() != IResource.FILE)
-			return new String[0];
-		if(jarResource.getLocation() == null) {
-			try {
-				return getEntryNames(new ZipInputStream(((IFile)jarResource).getContents()), true);
-			}
-			catch (CoreException e) {
-				Logger.logException("Problem reading contents of " + jarResource.getFullPath(), e);  //$NON-NLS-1$
-			}
-		}
-		return getEntryNames(jarResource.getLocation().toString());
-	}
-
-	public static String[] getEntryNames(String jarFilename) {
-		return getEntryNames(jarFilename, true);
-	}
-
-	private static String[] getEntryNames(ZipInputStream jarInputStream, boolean excludeDirectories) {
-		List entryNames = new ArrayList();
-		try {
-			ZipEntry z = jarInputStream.getNextEntry();
-			while (z != null) {
-				if (!(z.isDirectory() && excludeDirectories))
-					entryNames.add(z.getName());
-				z = jarInputStream.getNextEntry();
-			}
-		}
-		catch (ZipException zExc) {
-			Logger.log(Logger.WARNING, "JarUtilities ZipException: (stream) " + zExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		catch (IOException ioExc) {
-			Logger.log(Logger.WARNING, "JarUtilities IOException: (stream) " + ioExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		finally {
-			closeStream(jarInputStream);
-		}
-		String[] names = (String[]) entryNames.toArray(new String[0]);
-		return names;
-	}
-
-	private static void closeStream(InputStream inputStream) {
-		try {
-			inputStream.close();
-		}
-		catch (IOException e) {
-			// nothing to do
-		}
-	}
-
-	public static String[] getEntryNames(String jarFilename, boolean excludeDirectories) {
-		ZipFile jarfile = null;
-		List entryNames = new ArrayList();
-		try {
-			jarfile = new ZipFile(jarFilename);
-			Enumeration entries = jarfile.entries();
-			while (entries.hasMoreElements()) {
-				ZipEntry z = (ZipEntry) entries.nextElement();
-				if (!(z.isDirectory() && excludeDirectories))
-					entryNames.add(z.getName());
-			}
-		}
-		catch (ZipException zExc) {
-			Logger.log(Logger.WARNING, "JarUtilities ZipException: " + jarFilename + " " + zExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		catch (IOException ioExc) {
-			Logger.log(Logger.WARNING, "JarUtilities IOException: " + jarFilename + " " + ioExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		finally {
-			closeJarFile(jarfile);
-		}
-		String[] names = (String[]) entryNames.toArray(new String[0]);
-		return names;
-	}
-
-	public static InputStream getInputStream(IResource jarResource, String entryName) {
-		if (jarResource == null || jarResource.getType() != IResource.FILE)
-			return null;
-		IPath location = jarResource.getLocation();
-		if(location == null) {
-			try {
-				InputStream zipStream = ((IFile)jarResource).getContents();
-				return getInputStream(new ZipInputStream(zipStream), entryName);
-			}
-			catch (CoreException e) {
-				Logger.logException("Problem reading contents of " + jarResource.getFullPath(), e);  //$NON-NLS-1$
-				return null;
-			}
-		}
-		return getInputStream(location.toString(), entryName);
-	}
-	
-	private static InputStream getInputStream(ZipInputStream zip, String entryName) {
-		InputStream result = null;
-		try {
-			ZipEntry z = zip.getNextEntry();
-			while (z != null && !z.getName().equals(entryName)) {
-				z = zip.getNextEntry();
-			}
-			if(z != null) {				
-				result = copyAndCloseStream(zip);
-			}
-		}
-		catch (ZipException zExc) {
-			Logger.log(Logger.WARNING, "JarUtilities ZipException: (stream) " + zExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		catch (IOException ioExc) {
-			Logger.log(Logger.WARNING, "JarUtilities IOException: (stream) " + ioExc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		finally {
-			closeStream(zip);
-		}
-		return result;
-	}
-
-	public static InputStream getInputStream(String jarFilename, String entryName) {
-		// check sanity
-		if (jarFilename == null || jarFilename.length() < 1 || entryName == null || entryName.length() < 1)
-			return null;
-
-		// JAR files are not allowed to have leading '/' in member names
-		String internalName = null;
-		if (entryName.startsWith("/")) //$NON-NLS-1$
-			internalName = entryName.substring(1);
-		else
-			internalName = entryName;
-
-		return getCachedInputStream(jarFilename, internalName);
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/PathHelper.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/PathHelper.java
deleted file mode 100644
index 768f361..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/PathHelper.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-
-
-import java.io.File;
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * Collection of helper methods to manage and convert links Originally part of
- * the LinksManager 
- */
-public class PathHelper {
-	public static final String BACKWARD_SLASH = "\\";//$NON-NLS-1$
-
-	public static final String FORWARD_SLASH = "/";//$NON-NLS-1$
-	public static final String RELATIVE_PATH_SIG = "../";//$NON-NLS-1$
-
-	/**
-	 * adjust relative path isside the absolute path
-	 */
-	public static String adjustPath(String path) {
-		int i = 0;
-		while ((i = path.indexOf(RELATIVE_PATH_SIG)) > 0) {
-			// split the string into two
-			String part1 = path.substring(0, i - 1);
-			String part2 = path.substring(i + RELATIVE_PATH_SIG.length() - 1);
-			// strip one path seg from part1
-			int j = part1.lastIndexOf(FORWARD_SLASH);
-			if (j == -1) {
-				// can't resolve. passed path is like
-				// E:/eclipseproject/../../sample.css.
-				return "";//$NON-NLS-1$
-			}
-			part1 = part1.substring(0, j);
-			path = part1 + part2;
-		}
-		return path;
-	}
-
-	/**
-	 * Append trailing url slash if needed
-	 */
-	public static String appendTrailingURLSlash(String input) {
-		// check to see already a slash
-		if (!input.endsWith(FORWARD_SLASH)) {
-			input += FORWARD_SLASH;
-		}
-		return input;
-	}
-
-	/**
-	 * Convert to relative url based on base
-	 */
-	public static String convertToRelative(String input, String base) {
-		// tokenize the strings
-		StringTokenizer inputTokenizer = new StringTokenizer(input, FORWARD_SLASH);
-		StringTokenizer baseTokenizer = new StringTokenizer(base, FORWARD_SLASH);
-		String token1 = "", token2 = "";//$NON-NLS-2$//$NON-NLS-1$
-		//
-		// Go through until equls
-		while (true) {
-			if (!inputTokenizer.hasMoreTokens() || !baseTokenizer.hasMoreTokens())
-				break;
-			token1 = baseTokenizer.nextToken();
-			token2 = inputTokenizer.nextToken();
-			if (!token1.equals(token2))
-				break;
-		}
-		// now generate the backs
-		String output = "";//$NON-NLS-1$
-		while (baseTokenizer.hasMoreTokens()) {
-			baseTokenizer.nextToken();
-			output += "../"; //$NON-NLS-1$
-		}
-		output += token2;
-		// generate the rest
-		while (inputTokenizer.hasMoreTokens()) {
-			output = output + FORWARD_SLASH + inputTokenizer.nextToken();
-		}
-		return output;
-	}
-
-	/**
-	 * Return the containing folder path. Will handle both url and file path
-	 */
-	public static String getContainingFolderPath(String path) {
-		String retValue = path;
-
-		int urlSlashIndex = path.lastIndexOf(FORWARD_SLASH);
-		int filePathSlashIndex = path.lastIndexOf(File.separator);
-		int index = filePathSlashIndex;
-		if (urlSlashIndex > filePathSlashIndex)
-			index = urlSlashIndex;
-		if (index >= 0)
-			retValue = path.substring(0, index);
-		return retValue;
-	}
-
-	/**
-	 * Remove leading path separator
-	 */
-	public static String removeLeadingPathSeparator(String path) {
-		if (path.startsWith(File.separator))
-			path = path.substring(File.separator.length());
-		return path;
-	}
-
-	/**
-	 * Remove leading path separator
-	 */
-	public static String removeLeadingSeparator(String path) {
-		if (path.startsWith(File.separator))
-			path = path.substring(File.separator.length());
-		else if (path.startsWith(FORWARD_SLASH) || path.startsWith(BACKWARD_SLASH))
-			path = path.substring(FORWARD_SLASH.length());
-		return path;
-	}
-
-	/**
-	 * Switch to file path slashes
-	 */
-	public static String switchToFilePathSlashes(String path) {
-		path = path.replace(FORWARD_SLASH.charAt(0), File.separatorChar);
-		path = path.replace(BACKWARD_SLASH.charAt(0), File.separatorChar);
-		return path;
-	}
-
-	/**
-	 * Switch to file path slashes
-	 */
-	public static String switchToForwardSlashes(String path) {
-		path = path.replace(File.separatorChar, FORWARD_SLASH.charAt(0));
-		path = path.replace(BACKWARD_SLASH.charAt(0), FORWARD_SLASH.charAt(0));
-		return path;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ProjectResolver.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ProjectResolver.java
deleted file mode 100644
index 0a21f95..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ProjectResolver.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * @deprecated The URIResolver interface is deprecated. Use the resolver from
- *             org.eclipse.wst.common.uriresolver.
- */
-public class ProjectResolver implements URIResolver {
-	private String fFileBaseLocation = null;
-	private IProject fProject = null;
-
-	/**
-	 * It is strongly recommended that clients use
-	 * project.getAdapter(URIResolver.class) to obtain a URIResolver aware of
-	 * the Project's special requirements. Note that a URIResolver may not be
-	 * returned at all so manually creating this object may still be required.
-	 */
-	public ProjectResolver(IProject project) {
-		super();
-		fProject = project;
-	}
-
-	public String getFileBaseLocation() {
-		return fFileBaseLocation;
-	}
-
-	public String getLocationByURI(String uri) {
-		return getLocationByURI(uri, getFileBaseLocation());
-	}
-
-	// defect 244817 end
-	/**
-	 * Resolve the (possibly relative) URI acording to RFC1808 using the
-	 * default file base location. Resolves resource references into absolute
-	 * resource locations without ensuring that the resource actually exists.
-	 * 
-	 * Note: currently resolveCrossProjectLinks is ignored in this
-	 * implementation.
-	 */
-	public String getLocationByURI(String uri, boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, getFileBaseLocation(), resolveCrossProjectLinks);
-	}
-
-	public String getLocationByURI(String uri, String baseReference) {
-		if (uri == null)
-			return null;
-		/*
-		 * defect 244817 try { URL aURL = new URL(uri);
-		 */
-		/**
-		 * An actual URL was given, but only the "file:///" protocol is
-		 * supported. Resolve the URI by finding the file to which it points.
-		 */
-		/*
-		 * defect 244817 if (!aURL.getProtocol().equals("platform")) {
-		 * //$NON-NLS-1$ if (aURL.getProtocol().equals("file") &&
-		 * (aURL.getHost().equals("localhost") || aURL.getHost().length() ==
-		 * 0)) { //$NON-NLS-2$//$NON-NLS-1$ return aURL.getFile(); } return
-		 * uri; } } catch (MalformedURLException mfuExc) { }
-		 */
-		// defect 244817 start
-		if (isFileURL(uri)) {
-			try {
-				URL url = new URL(uri);
-				return getPath(url);
-			}
-			catch (MalformedURLException e) {
-			}
-		}
-		// defect 244817 end
-
-		// which of the serveral are we suppose to use here?
-		//
-
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71223
-		// Workaround for problem in URIHelper; uris starting with '/' are
-		// returned as-is.
-		String location = null;
-		if (uri.startsWith("/")) { //$NON-NLS-1$
-			IProject p = getProject();
-			if (p != null && p.isAccessible()) {
-				IFile file = p.getFile(uri);
-				
-				if (file.getLocation() != null) {
-					location = file.getLocation().toString();
-				}
-				if (location == null && file.getLocationURI() != null) {
-					location = file.getLocationURI().toString();
-				}
-				if (location == null) {
-					location = file.getFullPath().toString();
-				}
-			}
-		}
-		if(location == null) {
-			location = URIHelper.normalize(uri, baseReference, getRootLocationString());
-		}
-		return location;
-	}
-
-	/**
-	 * Perform the getLocationByURI action using the baseReference as the
-	 * point of reference instead of the default for this resolver
-	 * 
-	 * Note: currently resolveCrossProjectLinks is ignored in this
-	 * implementation.
-	 */
-	public String getLocationByURI(String uri, String baseReference, boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, baseReference);
-	}
-
-	/**
-	 * 
-	 * @param path
-	 * @param host
-	 * @return String
-	 */
-	private String getPath(IPath path, String host) {
-		IPath newPath = path;
-		// They are potentially for only Windows operating system.
-		// a.) if path has a device, and if it begins with IPath.SEPARATOR,
-		// remove it
-		final String device = path.getDevice();
-		if ((device != null) && (device.length() > 0)) {
-			if (device.charAt(0) == IPath.SEPARATOR) {
-				final String newDevice = device.substring(1);
-				newPath = path.setDevice(newDevice);
-			}
-		}
-		// b.) if it has a hostname, it is UNC name... Any java or eclipse api
-		// helps it ??
-		if (path != null && host != null && host.length() != 0) {
-			IPath uncPath = new Path(host);
-			uncPath = uncPath.append(path);
-			newPath = uncPath.makeUNC(true);
-		}
-		return newPath.toString();
-	}
-
-	/**
-	 * 
-	 * @param url
-	 * @return String
-	 */
-	private String getPath(URL url) {
-		String ref = url.getRef() == null ? "" : "#" + url.getRef(); //$NON-NLS-1$ //$NON-NLS-2$
-		String strPath = url.getFile() + ref;
-		IPath path;
-		if (strPath.length() == 0) {
-			path = Path.ROOT;
-		}
-		else {
-			path = new Path(strPath);
-			String query = null;
-			StringTokenizer parser = new StringTokenizer(strPath, "?"); //$NON-NLS-1$
-			int tokenCount = parser.countTokens();
-			if (tokenCount == 2) {
-				path = new Path((String) parser.nextElement());
-				query = (String) parser.nextElement();
-			}
-			if (query == null) {
-				parser = new StringTokenizer(path.toString(), "#"); //$NON-NLS-1$
-				tokenCount = parser.countTokens();
-				if (tokenCount == 2) {
-					path = new Path((String) parser.nextElement());
-				}
-			}
-		}
-		return getPath(path, url.getHost());
-	}
-
-	public org.eclipse.core.resources.IProject getProject() {
-		return fProject;
-	}
-
-	public org.eclipse.core.resources.IContainer getRootLocation() {
-		return fProject;
-	}
-
-	protected String getRootLocationString() {
-		String location = null;
-		if (fProject == null)
-			return null;
-		if (fProject.getLocation() != null) {
-			location = fProject.getLocation().toString();
-		}
-		if (location == null && fProject.getLocationURI() != null) {
-			location = fProject.getLocationURI().toString();
-		}
-		if (location == null) {
-			location = fProject.getFullPath().toString();
-		}
-		return location;
-	}
-
-	public InputStream getURIStream(String uri) {
-		return null;
-	}
-
-	// defect 244817 start
-	/**
-	 * 
-	 * @param passedSpec
-	 * @return boolean
-	 */
-	private boolean isFileURL(String passedSpec) {
-		if (passedSpec == null) {
-			return false;
-		}
-		final String spec = passedSpec.trim();
-		if (spec.length() == 0) {
-			return false;
-		}
-		final int limit = spec.length();
-		String newProtocol = null;
-		for (int index = 0; index < limit; index++) {
-			final char p = spec.charAt(index);
-			if (p == '/') { //$NON-NLS-1$
-				break;
-			}
-			if (p == ':') { //$NON-NLS-1$
-				newProtocol = spec.substring(0, index);
-				break;
-			}
-		}
-		return (newProtocol != null && newProtocol.compareToIgnoreCase("file") == 0); //$NON-NLS-1$
-	}
-
-	public void setFileBaseLocation(String newFileBaseLocation) {
-		fFileBaseLocation = newFileBaseLocation;
-	}
-
-	public void setProject(IProject newProject) {
-		fProject = newProject;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ResourceUtil.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ResourceUtil.java
deleted file mode 100644
index ab59ecb..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ResourceUtil.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-
-/**
- * @deprecated - makes assumptions on behalf of the requester
- */
-public class ResourceUtil {
-
-	/**
-	 * Obtains the IFile for a model
-	 * 
-	 * @param model
-	 *            the model to use
-	 * @return the IFile used to create the model, if it came from an IFile,
-	 *         null otherwise
-	 */
-	public static IFile getFileFor(IStructuredModel model) {
-		if (model == null)
-			return null;
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IFile file = null;
-		IPath location = new Path(model.getBaseLocation());
-		// if the path is not a path in the file system and there are at least
-		// 2 segments, it might be in the workspace
-		IFile[] files = root.findFilesForLocation(location);
-		if (files.length > 0) {
-			file = files[0];
-		}
-		else if (location.segmentCount() > 1) {
-			// remember, this IFile isn't guaranteed to exist
-			file = root.getFile(location);
-		}
-		return file;
-	}
-
-	/**
-	 * Obtain IFiles from IStructuredModel (includes linkedResources)
-	 * 
-	 * @return the corresponding files in the workspace, or an empty array if
-	 *         none
-	 */
-	public static IFile[] getFilesFor(IStructuredModel model) {
-		if (model == null)
-			return null;
-
-		IFile[] files = null;
-		IPath location = new Path(model.getBaseLocation());
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		// if the path is not a path in the file system and there are at least
-		// 2 segments, it might be in the workspace
-		if (!location.toFile().exists() && location.segmentCount() > 1) {
-			// remember, this IFile isn't guaranteed to exist
-			files = new IFile[]{root.getFile(location)};
-		}
-		else {
-			files = root.findFilesForLocation(location);
-		}
-		return files;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ScriptLanguageKeys.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ScriptLanguageKeys.java
deleted file mode 100644
index 5d4d7aa..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/ScriptLanguageKeys.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-/**
- * Contains list of script languages and mime types
- */
-public interface ScriptLanguageKeys {
-
-	public static final String JAVA = "java"; //$NON-NLS-1$
-
-	public static final String[] JAVA_LANGUAGE_KEYS = new String[]{"java"}; //$NON-NLS-1$
-
-	public static final String JAVASCRIPT = "javascript"; //$NON-NLS-1$
-	public static final String[] JAVASCRIPT_LANGUAGE_KEYS = {"javascript", //$NON-NLS-1$
-				"javascript1.0", //$NON-NLS-1$
-				"javascript1.1", //$NON-NLS-1$
-				"javascript1.2", //$NON-NLS-1$
-				"javascript1.3", //$NON-NLS-1$
-				"javascript1.4", //$NON-NLS-1$
-				"javascript1.5", //$NON-NLS-1$
-				"javascript1.6", //$NON-NLS-1$
-				"jscript", //$NON-NLS-1$
-				"sashscript"}; //$NON-NLS-1$
-
-	public static final String[] JAVASCRIPT_MIME_TYPE_KEYS = {"text/javascript", //$NON-NLS-1$
-				"text/jscript", //$NON-NLS-1$
-				"text/sashscript"}; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Sorter.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Sorter.java
deleted file mode 100644
index e3ff42b..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Sorter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-
-
-/**
- * The SortOperation takes a collection of objects and returns a sorted
- * collection of these objects. Concrete instances of this class provide the
- * criteria for the sorting of the objects based on the type of the objects.
- */
-public abstract class Sorter {
-
-	/**
-	 * Returns true if elementTwo is 'greater than' elementOne This is the
-	 * 'ordering' method of the sort operation. Each subclass overides this
-	 * method with the particular implementation of the 'greater than' concept
-	 * for the objects being sorted.
-	 */
-	public abstract boolean compare(Object elementOne, Object elementTwo);
-
-	/**
-	 * Sort the objects in sorted collection and return that collection.
-	 */
-	private Object[] quickSort(Object[] sortedCollection, int left, int right) {
-		int originalLeft = left;
-		int originalRight = right;
-		Object mid = sortedCollection[(left + right) / 2];
-
-		do {
-			while (compare(sortedCollection[left], mid))
-				left++;
-			while (compare(mid, sortedCollection[right]))
-				right--;
-			if (left <= right) {
-				Object tmp = sortedCollection[left];
-				sortedCollection[left] = sortedCollection[right];
-				sortedCollection[right] = tmp;
-				left++;
-				right--;
-			}
-		} while (left <= right);
-
-		if (originalLeft < right)
-			sortedCollection = quickSort(sortedCollection, originalLeft, right);
-		if (left < originalRight)
-			sortedCollection = quickSort(sortedCollection, left, originalRight);
-
-		return sortedCollection;
-	}
-
-	/**
-	 * Return a new sorted collection from this unsorted collection. Sort
-	 * using quick sort.
-	 */
-	public Object[] sort(Object[] unSortedCollection) {
-		int size = unSortedCollection.length;
-		Object[] sortedCollection = new Object[size];
-
-		//copy the array so can return a new sorted collection
-		System.arraycopy(unSortedCollection, 0, sortedCollection, 0, size);
-		if (size > 1)
-			quickSort(sortedCollection, 0, size - 1);
-
-		return sortedCollection;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/TextUtilities.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/TextUtilities.java
deleted file mode 100644
index 423fa49..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/TextUtilities.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-
-
-/**
- * Collection of text functions.
- * @deprecated - the JFace class is public in 3.1
- */
-// This class was originally copied from org.eclipse.jface.text, and made
-// public
-public class TextUtilities {
-	/**
-	 * Returns whether the text ends with one of the given search strings.
-	 */
-	public static boolean endsWith(String[] searchStrings, String text) {
-		for (int i = 0; i < searchStrings.length; i++) {
-			if (text.endsWith(searchStrings[i]))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the position in the string greater than offset of the longest
-	 * matching search string.
-	 */
-	public static int[] indexOf(String[] searchStrings, String text, int offset) {
-
-		int[] result = {-1, -1};
-
-		for (int i = 0; i < searchStrings.length; i++) {
-			int index = text.indexOf(searchStrings[i], offset);
-			if (index >= 0) {
-
-				if (result[0] == -1) {
-					result[0] = index;
-					result[1] = i;
-				} else if (index < result[0]) {
-					result[0] = index;
-					result[1] = i;
-				} else if (index == result[0] && searchStrings[i].length() > searchStrings[result[1]].length()) {
-					result[0] = index;
-					result[1] = i;
-				}
-			}
-		}
-
-		return result;
-
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/URIResolver.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/URIResolver.java
deleted file mode 100644
index e2259eb..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/URIResolver.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-
-
-/**
- * @deprecated
- * 
- * Should use extensible URIResolver from org.eclipse.wst.common.uriresolver
- * instead.
- */
-
-public interface URIResolver {
-
-	String getFileBaseLocation();
-
-	/**
-	 * Resolve the (possibly relative) URI acording to RFC1808 using the
-	 * default file base location. Resolves resource references into absolute
-	 * resource locations without ensuring that the resource actually exists.
-	 */
-	String getLocationByURI(String uri);
-
-	/**
-	 * Resolve the (possibly relative) URI acording to RFC1808 using the
-	 * default file base location. Resolves resource references into absolute
-	 * resource locations without ensuring that the resource actually exists.
-	 * 
-	 * If resolveCrossProjectLinks is set to true, then this method will
-	 * properly resolve the URI if it is a valid URI to another (appropriate)
-	 * project.
-	 */
-	String getLocationByURI(String uri, boolean resolveCrossProjectLinks);
-
-	/**
-	 * Perform the getLocationByURI action using the baseReference as the
-	 * point of reference instead of the default for this resolver
-	 */
-	String getLocationByURI(String uri, String baseReference);
-
-	/**
-	 * Perform the getLocationByURI action using the baseReference as the
-	 * point of reference instead of the default for this resolver
-	 * 
-	 * If resolveCrossProjectLinks is set to true, then this method will
-	 * properly resolve the URI if it is a valid URI to another (appropriate)
-	 * project.
-	 */
-	String getLocationByURI(String uri, String baseReference, boolean resolveCrossProjectLinks);
-
-	IProject getProject();
-
-	IContainer getRootLocation();
-
-	/**
-	 * Attempts to return a direct inputstream to the given URI which must be
-	 * relative to the default point of reference.
-	 * 
-	 */
-	InputStream getURIStream(String uri);
-
-	void setFileBaseLocation(String newLocation);
-
-	void setProject(IProject newProject);
-
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Utilities.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Utilities.java
deleted file mode 100644
index 911c5e9..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/util/Utilities.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.util;
-
-
-
-import java.io.BufferedInputStream;
-import java.io.InputStream;
-
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-import org.eclipse.wst.sse.core.internal.encoding.util.BufferedLimitedStream;
-
-
-
-public class Utilities {
-
-	/**
-	 * a common calculation in some of the parsing methods (e.g. in
-	 * ContextRegion and IStructuredDocumentRegion)
-	 */
-	public static int calculateLengthDifference(String changes, int lengthToReplace) {
-		// determine the length by the text itself, or, if there is no text to
-		// insert (i.e. we are doing a delete) then calculate the length as
-		// a negative number to denote the amount to delete.
-		// For a straight insert, the selection Length will be zero.
-		int lengthDifference = 0;
-		if (changes == null) {
-			// the delete case
-			lengthDifference = 0 - lengthToReplace;
-		}
-		else {
-			lengthDifference = changes.length() - lengthToReplace;
-		}
-		if (Debug.debugStructuredDocument) {
-			System.out.println("lengthDifference: " + lengthDifference);//$NON-NLS-1$
-		}
-		return lengthDifference;
-	}
-
-	/**
-	 * Returns true iff both parameters are not null and the object is within
-	 * the array. Careful, this uses identity. Not good for basic strings.
-	 */
-	public static boolean contains(Object[] objectArray, Object object) {
-		boolean result = false;
-		// if object or objectArray is null, return false
-		if ((objectArray != null) && (object != null)) {
-			for (int i = 0; i < objectArray.length; i++) {
-				if (objectArray[i] == object) {
-					result = true;
-					break;
-				}
-			}
-		}
-		return result;
-	}
-
-	public static boolean containsString(String[] objectArray, String object) {
-		boolean result = false;
-		// if object or objectArray is null, return false
-		if ((objectArray != null) && (object != null)) {
-			for (int i = 0; i < objectArray.length; i++) {
-				if (objectArray[i].equals(object)) {
-					result = true;
-					break;
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Ensures that an InputStream has mark/reset support, is readlimit is
-	 * set, and that the stream is "limitable" (that is, reports "end of
-	 * input" rather than allow going past mark). This is very specialized
-	 * stream introduced to overcome
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=67211. See also
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=68565
-	 */
-	public static InputStream getLimitedStream(InputStream original) {
-		if (original == null)
-			return null;
-		if (original instanceof BufferedLimitedStream)
-			return original;
-		return new BufferedLimitedStream(original, CodedIO.MAX_BUF_SIZE);
-	}
-
-	/**
-	 * <p>
-	 * Ensures that an InputStream has mark/reset support.
-	 * </p>
-	 * <p>
-	 * It's vital that a BufferedInputStream <b>not</b> be wrapped in another
-	 * BufferedInputStream as each can preemptively consume <i>n</i> bytes
-	 * (e.g. 2048) from the parent stream before any requests are made. The
-	 * cascading effect is that the second/inner BufferedInputStream can never
-	 * rewind itself to the first <i>n</i> bytes since they were already
-	 * consumed by its parent.
-	 * </p>
-	 */
-	public static InputStream getMarkSupportedStream(InputStream original) {
-		if (original == null)
-			return null;
-		if (original.markSupported())
-			return original;
-		InputStream buffered = new BufferedInputStream(original, CodedIO.MAX_BUF_SIZE);
-		buffered.mark(CodedIO.MAX_MARK_SIZE);
-		return buffered;
-	}
-
-	/**
-	 * Used for log/trace messages. Id is assumed to be some form of a
-	 * filename. See IModelManager.
-	 */
-	public static String makeShortId(Object id) {
-		if (id == null)
-			id = "NOID";//$NON-NLS-1$
-		String whole = id.toString();
-		String part = whole.substring(whole.lastIndexOf("/") + 1); //$NON-NLS-1$
-		return "..." + part; //$NON-NLS-1$
-	}
-
-
-	/**
-	 * Utilities constructor comment.
-	 */
-	public Utilities() {
-		super();
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ErrorInfo.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ErrorInfo.java
deleted file mode 100644
index d36b92c..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ErrorInfo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.validate;
-
-
-
-public interface ErrorInfo {
-
-	public String getHint();
-
-	public int getLength();
-
-	public int getOffset();
-
-	public int getState();
-
-	public short getTargetType();
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationAdapter.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationAdapter.java
deleted file mode 100644
index 336020e..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationAdapter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.validate;
-
-
-
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-
-/**
- */
-public interface ValidationAdapter extends INodeAdapter {
-
-	/**
-	 */
-	void setReporter(ValidationReporter reporter);
-
-	/**
-	 */
-	void validate(IndexedRegion node);
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationMessage.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationMessage.java
deleted file mode 100644
index 5f2f605..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationMessage.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.validate;
-
-
-
-/**
- */
-public class ValidationMessage {
-	public static final int IGNORE = -1;
-	public static final int ERROR = 1;
-	public static final int INFORMATION = 3;
-	public static final int WARNING = 2;
-	private int length;
-
-	private String message;
-	private int offset;
-	private int severity;
-
-	/**
-	 */
-	public ValidationMessage(String message, int offset, int severity) {
-		this(message, offset, 0, severity);
-	}
-
-	/**
-	 */
-	public ValidationMessage(String message, int offset, int length, int severity) {
-		super();
-
-		this.message = message;
-		this.offset = offset;
-		this.length = length;
-		this.severity = severity;
-	}
-
-	/**
-	 */
-	public int getLength() {
-		return this.length;
-	}
-
-	/**
-	 */
-	public String getMessage() {
-		return this.message;
-	}
-
-	/**
-	 */
-	public int getOffset() {
-		return this.offset;
-	}
-
-	/**
-	 */
-	public int getSeverity() {
-		return this.severity;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationReporter.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationReporter.java
deleted file mode 100644
index 82a06b5..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidationReporter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.internal.validate;
-
-
-
-
-/**
- */
-public interface ValidationReporter {
-
-	/**
-	 */
-	void report(ValidationMessage message);
-	
-	void report(ErrorInfo info);
-	
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidatorGroupListener.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidatorGroupListener.java
deleted file mode 100644
index d8c6f83..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/validate/ValidatorGroupListener.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wst.sse.core.internal.validate;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.validation.IValidatorGroupListener;
-import org.eclipse.wst.validation.ValidationState;
-
-public class ValidatorGroupListener implements IValidatorGroupListener {
-
-	Map fDiagnosticMap = new HashMap();
-	private static final boolean _debug = false;
-
-	public ValidatorGroupListener() {
-	}
-
-	protected void finalize() throws Throwable {
-		super.finalize();
-		if (fDiagnosticMap != null && !fDiagnosticMap.isEmpty()) {
-			Object[] paths = fDiagnosticMap.keySet().toArray();
-			for (int i = 0; i < paths.length; i++) {
-				Logger.log(Logger.ERROR, "Leaked model: " + paths[i]);
-				validationFinishing(ResourcesPlugin.getWorkspace().getRoot().getFile((IPath) paths[i]), new NullProgressMonitor(), null);
-			}
-		}
-	}
-
-	public void validationFinishing(IResource resource, IProgressMonitor monitor, ValidationState state) {
-		if (_debug)
-			System.out.println("Finishing:" + resource.getFullPath());
-		if (resource.getType() != IResource.FILE)
-			return;
-
-		IStructuredModel model = (IStructuredModel) fDiagnosticMap.remove(resource.getFullPath());
-		if (model != null) {
-			model.releaseFromRead();
-		}
-	}
-
-	public void validationStarting(IResource resource, IProgressMonitor monitor, ValidationState state) {
-		if (_debug)
-			System.out.println("Starting: " + resource.getFullPath());
-		try {
-			if (monitor != null && !monitor.isCanceled()) {
-				if (resource.getType() != IResource.FILE)
-					return;
-
-				IStructuredModel model = StructuredModelManager.getModelManager().getModelForRead((IFile) resource);
-				if (model != null) {
-					fDiagnosticMap.put(resource.getFullPath(), model);
-				}
-			}
-		}
-		catch (Exception e) {
-			Logger.logException(e);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/text/IStructuredPartitions.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/text/IStructuredPartitions.java
deleted file mode 100644
index e1cfc24..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/text/IStructuredPartitions.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.sse.core.text;
-
-/**
- * This interface is not intended to be implemented.
- * It defines the partitioning for StructuredDocuments.
- * Clients should reference the partition type Strings defined here directly.
- * 
- * @since 1.1
- */
-public interface IStructuredPartitions {
-
-	String DEFAULT_PARTITION = "org.eclipse.wst.sse.ST_DEFAULT"; //$NON-NLS-1$
-	String UNKNOWN_PARTITION = "org.eclipse.wst.sse.UNKNOWN_PARTITION_TYPE"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/utils/StringUtils.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/utils/StringUtils.java
deleted file mode 100644
index 894fde2..0000000
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/utils/StringUtils.java
+++ /dev/null
@@ -1,743 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.core.utils;
-
-
-
-import java.util.ArrayList;
-import java.util.List;
-import com.ibm.icu.util.StringTokenizer;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.wst.sse.core.internal.Logger;
-
-
-public class StringUtils {
-	protected static final String AMPERSTAND = "&"; //$NON-NLS-1$
-	protected static final String AMPERSTAND_ENTITY = "&&;"; //$NON-NLS-1$
-	protected static final String CARRIAGE_RETURN = "\r"; //$NON-NLS-1$
-	protected static final String CARRIAGE_RETURN_ENTITY = "\\r"; //$NON-NLS-1$
-	protected static final String CR = "\r"; //$NON-NLS-1$
-	protected static final String CRLF = "\r\n"; //$NON-NLS-1$
-	protected static final String DELIMITERS = " \t\n\r\f"; //$NON-NLS-1$
-	protected static final String DOUBLE_QUOTE = "\""; //$NON-NLS-1$
-	protected static final char DOUBLE_QUOTE_CHAR = '\"'; //$NON-NLS-1$
-	protected static final String DOUBLE_QUOTE_ENTITY = "&quot;"; //$NON-NLS-1$
-
-	protected static final String EQUAL_SIGN = "="; //$NON-NLS-1$
-	protected static final String EQUAL_SIGN_ENTITY = "&#61;"; //$NON-NLS-1$
-	private static final String FALSE = "false"; //$NON-NLS-1$
-	protected static final String GREATER_THAN = ">"; //$NON-NLS-1$
-	protected static final String GREATER_THAN_ENTITY = "&gt;"; //$NON-NLS-1$
-	protected static final String LESS_THAN = "<"; //$NON-NLS-1$
-	protected static final String LESS_THAN_ENTITY = "&lt;"; //$NON-NLS-1$
-	protected static final String LF = "\n"; //$NON-NLS-1$
-	protected static final String LINE_FEED = "\n"; //$NON-NLS-1$
-	protected static final String LINE_FEED_ENTITY = "\\n"; //$NON-NLS-1$
-	protected static final String LINE_FEED_TAG = "<dl>"; //$NON-NLS-1$
-	protected static final String LINE_TAB = "\t"; //$NON-NLS-1$
-	protected static final String LINE_TAB_ENTITY = "\\t"; //$NON-NLS-1$
-	protected static final String LINE_TAB_TAG = "<dd>"; //$NON-NLS-1$
-	protected static final String SINGLE_QUOTE = "'"; //$NON-NLS-1$
-	protected static final char SINGLE_QUOTE_CHAR = '\''; //$NON-NLS-1$
-	protected static final String SINGLE_QUOTE_ENTITY = "&#039;"; //$NON-NLS-1$
-	protected static final String SPACE = " "; //$NON-NLS-1$
-	protected static final String SPACE_ENTITY = "&nbsp;"; //$NON-NLS-1$
-	private static final String TRUE = "true"; //$NON-NLS-1$
-
-	/**
-	 * Append appendString to the end of aString only if aString does not end
-	 * with the insertString.
-	 */
-	public static String appendIfNotEndWith(String aString, String appendString) {
-		if ((aString != null) && (appendString != null))
-			if (aString.endsWith(appendString))
-				return aString;
-			else
-				return aString + appendString;
-		else
-			return aString;
-	}
-
-	/**
-	 * Breaks out space-separated words into an array of words. For example:
-	 * <code>"no comment"</code> into an array <code>a[0]="no"</code> and
-	 * <code>a[1]= "comment"</code>.
-	 * 
-	 * @param value
-	 *            the string to be converted
-	 * @return the list of words
-	 */
-	public static String[] asArray(String value) {
-		ArrayList list = new ArrayList();
-		StringTokenizer stok = new StringTokenizer(value);
-		while (stok.hasMoreTokens()) {
-			list.add(stok.nextToken());
-		}
-		String result[] = new String[list.size()];
-		list.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Breaks out delim-separated words into an array of words. For example:
-	 * <code>"no comment"</code> into an array <code>a[0]="no"</code> and
-	 * <code>a[1]= "comment"</code>.
-	 * 
-	 * @param value
-	 *            the string to be converted
-	 * @return the list of words
-	 */
-	public static String[] asArray(String value, String delim) {
-		return asArray(value, delim, false);
-	}
-
-	/**
-	 * Breaks out delim-separated words into an array of words. For example:
-	 * <code>"no comment"</code> into an array <code>a[0]="no"</code> and
-	 * <code>a[1]= "comment"</code>.
-	 * 
-	 * @param value
-	 *            the string to be converted
-	 * @return the list of words
-	 */
-	public static String[] asArray(String value, String delim, boolean returnTokens) {
-		ArrayList list = new ArrayList();
-		StringTokenizer stok = new StringTokenizer(value, delim, returnTokens);
-		while (stok.hasMoreTokens()) {
-			list.add(stok.nextToken());
-		}
-		String result[] = new String[list.size()];
-		list.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Breaks out delim-separated words into an array of words. For example:
-	 * <code>"abc,,def"</code> into an array <code>a[0]="abc"</code>,
-	 * <code>a[1]=null</code>, and <code>a[2]= "def"</code> where "," is
-	 * the delim.
-	 * 
-	 * @param value
-	 *            the string to be converted
-	 * @return the list of words
-	 */
-	public static String[] asFixedArray(String value, String delim) {
-		String array[] = asArray(value, delim, true);
-		int arrayLength = array.length;
-		boolean stringFound = false;
-		ArrayList list = new ArrayList();
-
-		for (int i = 0; i < arrayLength; i++) {
-			String token = array[i];
-			if (token.compareTo(delim) == 0) {
-				if (!stringFound)
-					list.add(null);
-				stringFound = false;
-			}
-			else {
-				list.add(token);
-				stringFound = true;
-			}
-		}
-		// add one more null if last token is the delim
-		if (!stringFound)
-			list.add(null);
-
-		String result[] = new String[list.size()];
-		list.toArray(result);
-		return result;
-	}
-
-	public static String chop(String source) {
-		return chop(source, "/"); //$NON-NLS-1$
-	}
-
-	public static String chop(String source, String delimiter) {
-		return source.substring(0, source.lastIndexOf(delimiter));
-	}
-
-	public static boolean contains(String[] arrayOfStrings, String needle, boolean caseSensitive) {
-		boolean result = false;
-		if (needle == null)
-			return false;
-		if (arrayOfStrings == null)
-			return false;
-
-		if (caseSensitive) {
-			for (int i = 0; i < arrayOfStrings.length; i++) {
-				if (needle.equals(arrayOfStrings[i])) {
-					result = true;
-					break;
-				}
-			}
-		}
-		else {
-			for (int i = 0; i < arrayOfStrings.length; i++) {
-				if (needle.equalsIgnoreCase(arrayOfStrings[i])) {
-					result = true;
-					break;
-				}
-			}
-		}
-		return result;
-	}
-
-	public static boolean containsLetters(String fullValue) {
-
-		if (fullValue == null || fullValue.length() == 0)
-			return false;
-
-		char[] chars = fullValue.toCharArray();
-		for (int i = 0; i < fullValue.length(); i++)
-			if (Character.isLetter(chars[i]))
-				return true;
-
-		return false;
-	}
-
-	public static boolean containsLineDelimiter(String aString) {
-		return indexOfLineDelimiter(aString) != -1;
-	}
-
-	public static String convertLineDelimiters(String allText, String lineDelimiterToUse) {
-		IDocument tempDoc = new Document(allText);
-
-		if (lineDelimiterToUse == null)
-			lineDelimiterToUse = System.getProperty("line.separator"); //$NON-NLS-1$
-
-		String newText = ""; //$NON-NLS-1$
-		int lineCount = tempDoc.getNumberOfLines();
-		for (int i = 0; i < lineCount; i++) {
-			try {
-				org.eclipse.jface.text.IRegion lineInfo = tempDoc.getLineInformation(i);
-				int lineStartOffset = lineInfo.getOffset();
-				int lineLength = lineInfo.getLength();
-				int lineEndOffset = lineStartOffset + lineLength;
-				newText += allText.substring(lineStartOffset, lineEndOffset);
-
-				if ((i < lineCount - 1) && (tempDoc.getLineDelimiter(i) != null))
-					newText += lineDelimiterToUse;
-			}
-			catch (BadLocationException e) {
-				// log for now, unless we find reason not to
-				Logger.log(Logger.INFO, e.getMessage());
-			}
-		}
-
-		return newText;
-	}
-
-	/**
-	 * Replaces all instances of special HTML characters with the appropriate
-	 * HTML entity equivalent. WARNING only use this method for strings that
-	 * dont already have HTML-specific items such as tags and entities.
-	 * 
-	 * @param String
-	 *            content String to convert
-	 * 
-	 * @return String the converted string
-	 * @see HTMLPrinter#convertToHTMLContent(String content)
-	 */
-	public static String convertToHTMLContent(String content) {
-		content = replace(content, AMPERSTAND, AMPERSTAND_ENTITY);
-		content = replace(content, LESS_THAN, LESS_THAN_ENTITY);
-		content = replace(content, GREATER_THAN, GREATER_THAN_ENTITY);
-		content = replace(content, LINE_FEED, LINE_FEED_TAG);
-		content = replace(content, LINE_TAB, LINE_TAB_TAG);
-		content = replace(content, SINGLE_QUOTE, SINGLE_QUOTE_ENTITY);
-		content = replace(content, DOUBLE_QUOTE, DOUBLE_QUOTE_ENTITY);
-		content = replace(content, SPACE + SPACE, SPACE_ENTITY + SPACE_ENTITY); // replacing
-		// every
-		// space
-		// would
-		// be
-		// too
-		// much
-		return content;
-	}
-
-	/**
-	 * Converts a string into a form that will not conflict with saving it
-	 * into an INI file
-	 */
-	public static String escape(String normalString) {
-		if (normalString == null)
-			return null;
-		StringBuffer escapedBuffer = new StringBuffer();
-		StringTokenizer toker = new StringTokenizer(normalString, EQUAL_SIGN + LINE_FEED + CARRIAGE_RETURN + LINE_TAB, true);
-		String chunk = null;
-		while (toker.hasMoreTokens()) {
-			chunk = toker.nextToken();
-			if (chunk.equals(EQUAL_SIGN)) {
-				escapedBuffer.append(EQUAL_SIGN_ENTITY);
-			}
-			else if (chunk.equals(LINE_FEED)) {
-				escapedBuffer.append(LINE_FEED_ENTITY);
-			}
-			else if (chunk.equals(CARRIAGE_RETURN)) {
-				escapedBuffer.append(CARRIAGE_RETURN_ENTITY);
-			}
-			else if (chunk.equals(LINE_TAB)) {
-				escapedBuffer.append(LINE_TAB_ENTITY);
-			}
-			else {
-				escapedBuffer.append(chunk);
-			}
-		}
-		return escapedBuffer.toString();
-	}
-
-	/**
-	 * Returns the first line of the given text without a trailing delimiter
-	 * 
-	 * @param text
-	 * @return
-	 */
-	public static String firstLineOf(String text) {
-		if (text == null || text.length() < 1) {
-			return text;
-		}
-		IDocument doc = new Document(text);
-		try {
-			int lineNumber = doc.getLineOfOffset(0);
-			IRegion line = doc.getLineInformation(lineNumber);
-			return doc.get(line.getOffset(), line.getLength());
-		}
-		catch (BadLocationException e) {
-			// do nothing
-		}
-		return text;
-	}
-
-	public static int indexOfLastLineDelimiter(String aString) {
-		return indexOfLastLineDelimiter(aString, aString.length());
-	}
-
-	public static int indexOfLastLineDelimiter(String aString, int offset) {
-		int index = -1;
-
-		if (aString != null && aString.length() > 0) {
-			index = aString.lastIndexOf(CRLF, offset);
-			if (index == -1) {
-				index = aString.lastIndexOf(CR, offset);
-				if (index == -1)
-					index = aString.lastIndexOf(LF, offset);
-			}
-		}
-
-		return index;
-	}
-
-	public static int indexOfLineDelimiter(String aString) {
-		return indexOfLineDelimiter(aString, 0);
-	}
-
-	public static int indexOfLineDelimiter(String aString, int offset) {
-		int index = -1;
-
-		if (aString != null && aString.length() > 0) {
-			index = aString.indexOf(CRLF, offset);
-			if (index == -1) {
-				index = aString.indexOf(CR, offset);
-				if (index == -1)
-					index = aString.indexOf(LF, offset);
-			}
-		}
-
-		return index;
-	}
-
-	public static int indexOfNonblank(String aString) {
-		return indexOfNonblank(aString, 0);
-	}
-
-	public static int indexOfNonblank(String aString, int offset) {
-		int index = -1;
-
-		if (aString != null && aString.length() > 0) {
-			for (int i = offset; i < aString.length(); i++) {
-				if (DELIMITERS.indexOf(aString.substring(i, i + 1)) == -1) {
-					index = i;
-					break;
-				}
-			}
-		}
-
-		return index;
-	}
-
-	/**
-	 * Insert insertString to the beginning of aString only if aString does
-	 * not start with the insertString.
-	 */
-	public static String insertIfNotStartWith(String aString, String insertString) {
-		if ((aString != null) && (insertString != null))
-			if (aString.startsWith(insertString))
-				return aString;
-			else
-				return insertString + aString;
-		else
-			return aString;
-	}
-
-	public static boolean isQuoted(String string) {
-		if ((string == null) || (string.length() < 2))
-			return false;
-
-		int lastIndex = string.length() - 1;
-		char firstChar = string.charAt(0);
-		char lastChar = string.charAt(lastIndex);
-
-		return (((firstChar == SINGLE_QUOTE_CHAR) && (lastChar == SINGLE_QUOTE_CHAR)) || ((firstChar == DOUBLE_QUOTE_CHAR) && (lastChar == DOUBLE_QUOTE_CHAR)));
-	}
-
-	/**
-	 * Unit tests.
-	 * 
-	 * @param args
-	 *            java.lang.String[]
-	 */
-	public static void main(String[] args) {
-		// testPaste();
-		testStripNonLetterDigits();
-	}
-
-	/*
-	 * Returns the merged form of both strings
-	 */
-	public static String merge(String newStart, String newEnd) {
-		String[] regions = overlapRegions(newStart, newEnd);
-		return regions[0] + regions[1] + regions[2];
-	}
-
-	public static int occurrencesOf(String searchString, char targetChar) {
-		int result = 0;
-		int len = searchString.length();
-		for (int i = 0; i < len; i++) {
-			if (targetChar == searchString.charAt(i))
-				result++;
-		}
-		return result;
-	}
-
-	/**
-	 * 
-	 * @return java.lang.String[]
-	 * @param start
-	 *            java.lang.String
-	 * @param end
-	 *            java.lang.String
-	 * 
-	 * Returns a 3 String array containing unique text from the start,
-	 * duplicated text that overlaps the start and end, and the unique text
-	 * from the end.
-	 */
-	private static String[] overlapRegions(String start, String end) {
-		String[] results = null;
-		if (start != null && end == null) {
-			results = new String[]{start, "", ""}; //$NON-NLS-2$//$NON-NLS-1$
-		}
-		else if (start == null && end != null) {
-			results = new String[]{"", "", end}; //$NON-NLS-2$//$NON-NLS-1$
-		}
-		else if (start == null && end == null) {
-			results = new String[]{"", "", ""}; //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
-		}
-		else if (start != null && end != null) {
-
-			int startLength = start.length();
-			int endLength = end.length();
-
-			if (startLength == 0 || endLength == 0) {
-				results = new String[]{"", "", ""}; //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
-			}
-			else {
-				results = new String[3];
-				String testStart = ""; //$NON-NLS-1$
-				String testEnd = ""; //$NON-NLS-1$
-				int mergeLength = Math.min(startLength, endLength);
-				boolean finished = false;
-				while (mergeLength > 0 && !finished) {
-					testStart = start.substring(startLength - mergeLength);
-					testEnd = end.substring(0, mergeLength);
-					// case sensitive
-					if (testStart.equals(testEnd)) {
-						finished = true;
-						results[0] = start.substring(0, startLength - mergeLength);
-						results[1] = start.substring(startLength - mergeLength);
-						results[2] = end.substring(mergeLength);
-					}
-					mergeLength--;
-				}
-				if (!finished) {
-					results[0] = start;
-					results[1] = ""; //$NON-NLS-1$
-					results[2] = end;
-				}
-			}
-		}
-		return results;
-	}
-
-	/**
-	 * Packs an array of Strings into a single comma delimited String.
-	 * 
-	 * @param strings
-	 * @return
-	 * @todo Generated comment
-	 */
-	public static String pack(String[] strings) {
-		StringBuffer buf = new StringBuffer();
-		for (int i = 0; i < strings.length; i++) {
-			buf.append(StringUtils.replace(strings[i], ",", "&comma;")); //$NON-NLS-1$ //$NON-NLS-2$
-			if (i < strings.length - 1)
-				buf.append(","); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-
-	/*
-	 * Pastes the new text into the old at the start position, replacing text
-	 * implied by length.
-	 */
-	public static String paste(String oldText, String newText, int start, int length) {
-		String result = null;
-		StringBuffer sb = new StringBuffer();
-		int startIndex = start;
-		int endIndex = start + length;
-		if (startIndex > oldText.length()) {
-			startIndex = oldText.length();
-		}
-		sb.append(oldText.substring(0, startIndex));
-		// null or empty new text accompliches a delete
-		if (newText != null) {
-			sb.append(newText);
-		}
-		if (endIndex < oldText.length()) {
-
-			sb.append(oldText.substring(endIndex));
-		}
-		result = sb.toString();
-		return result;
-	}
-
-	/**
-	 * Replace matching literal portions of a string with another string
-	 */
-	public static String replace(String aString, String source, String target) {
-		if (aString == null)
-			return null;
-		String normalString = ""; //$NON-NLS-1$
-		int length = aString.length();
-		int position = 0;
-		int previous = 0;
-		int spacer = source.length();
-		while (position + spacer - 1 < length && aString.indexOf(source, position) > -1) {
-			position = aString.indexOf(source, previous);
-			normalString = normalString + aString.substring(previous, position) + target;
-			position += spacer;
-			previous = position;
-		}
-		normalString = normalString + aString.substring(position, aString.length());
-
-		return normalString;
-	}
-
-	/**
-	 * Restore the entity references for markup delimiters in text where they
-	 * have been replaced by the proper Unicode values through a DOM text
-	 * parser.
-	 */
-	public static String restoreMarkers(String text) {
-		String content = text;
-		content = replace(content, AMPERSTAND, AMPERSTAND_ENTITY);
-		content = replace(content, LESS_THAN, LESS_THAN_ENTITY);
-		content = replace(content, GREATER_THAN, GREATER_THAN_ENTITY);
-		return content;
-	}
-
-	/**
-	 * Removes extra whitespace characters and quotes
-	 */
-	public static String strip(String quotedString) {
-		if (quotedString == null || quotedString.length() == 0)
-			return quotedString;
-		String trimmed = quotedString.trim();
-		if (trimmed.length() < 2)
-			return quotedString;
-
-		char first = trimmed.charAt(0);
-		char nextToLast = trimmed.charAt(trimmed.length() - 2);
-		char last = trimmed.charAt(trimmed.length() - 1);
-
-		if ((first == '\"' && last == '\"' && nextToLast != '\\') || (first == '\'' && last == '\'' && nextToLast != '\\')) {
-			return trimmed.substring(1, trimmed.length() - 1);
-		}
-		return trimmed;
-	}
-
-	/**
-	 * This method strips anything from the beginning and end of a string that
-	 * is not a letter or digit. It is used by some encoding detectors to come
-	 * up with the encoding name from illformed input (e.g in <?xml
-	 * encoding="abc?> -- where final quote is left off, the '>' is returned
-	 * with the rest of the attribute value 'abc').
-	 */
-	public static String stripNonLetterDigits(String fullValue) {
-		if (fullValue == null || fullValue.length() == 0)
-			return fullValue;
-		int fullValueLength = fullValue.length();
-		int firstPos = 0;
-		while (firstPos < fullValueLength && !Character.isLetterOrDigit(fullValue.charAt(firstPos))) {
-			firstPos++;
-		}
-		int lastPos = fullValueLength - 1;
-		while (lastPos > firstPos && !Character.isLetterOrDigit(fullValue.charAt(lastPos))) {
-			lastPos--;
-		}
-		String result = fullValue;
-		if (firstPos != 0 || lastPos != fullValueLength) {
-			result = fullValue.substring(firstPos, lastPos + 1);
-		}
-		return result;
-	}
-
-	/**
-	 * Similar to strip, except quotes don't need to match such as "UTF' is
-	 * still stripped of both quotes. (Plus, this one does not detect escaped
-	 * quotes)
-	 */
-	public static String stripQuotes(String quotedValue) {
-		if (quotedValue == null)
-			return null;
-		// normally will never have leading or trailing blanks,
-		// but if it does, we'll do lenient interpretation
-		return stripQuotesLeaveInsideSpace(quotedValue).trim();
-	}
-
-	/**
-	 * Like strip quotes, except leaves the start and end space inside the
-	 * quotes
-	 * 
-	 * @param quotedValue
-	 * @return
-	 */
-	public static String stripQuotesLeaveInsideSpace(String quotedValue) {
-		if (quotedValue == null)
-			return null;
-		// nomally will never have leading or trailing blanks ... but just in
-		// case.
-		String result = quotedValue.trim();
-		int len = result.length();
-		if (len > 0) {
-			char firstChar = result.charAt(0);
-			if ((firstChar == SINGLE_QUOTE_CHAR) || (firstChar == DOUBLE_QUOTE_CHAR)) {
-				result = result.substring(1, len);
-			}
-			len = result.length();
-			if (len > 0) {
-				char lastChar = result.charAt(len - 1);
-				if ((lastChar == SINGLE_QUOTE_CHAR) || (lastChar == DOUBLE_QUOTE_CHAR)) {
-					result = result.substring(0, len - 1);
-				}
-			}
-		}
-		return result;
-	}
-
-	public static void testPaste() {
-		String testString = "The quick brown fox ..."; //$NON-NLS-1$
-		System.out.println(paste(testString, null, 4, 5));
-		System.out.println(paste(testString, null, 4, 6));
-		System.out.println(paste(testString, "", 4, 6)); //$NON-NLS-1$
-		System.out.println(paste(testString, "fast", 4, 6)); //$NON-NLS-1$
-		System.out.println(paste(testString, "fast ", 4, 6)); //$NON-NLS-1$
-		System.out.println(paste(testString, "But ", 0, 0)); //$NON-NLS-1$
-		System.out.println(paste("", "burp", 4, 6)); //$NON-NLS-2$//$NON-NLS-1$
-	}
-
-	public static void testStripNonLetterDigits() {
-		String testString = "abc"; //$NON-NLS-1$
-		System.out.println(testString + " -->" + stripNonLetterDigits(testString) + "<--"); //$NON-NLS-1$ //$NON-NLS-2$
-		testString = ""; //$NON-NLS-1$
-		System.out.println(testString + " -->" + stripNonLetterDigits(testString) + "<--"); //$NON-NLS-1$ //$NON-NLS-2$
-		testString = "\"abc\""; //$NON-NLS-1$
-		System.out.println(testString + " -->" + stripNonLetterDigits(testString) + "<--"); //$NON-NLS-1$ //$NON-NLS-2$
-		testString = "\"ab-c1?"; //$NON-NLS-1$
-		System.out.println(testString + " -->" + stripNonLetterDigits(testString) + "<--"); //$NON-NLS-1$ //$NON-NLS-2$
-		testString = "+++"; //$NON-NLS-1$
-		System.out.println(testString + " -->" + stripNonLetterDigits(testString) + "<--"); //$NON-NLS-1$ //$NON-NLS-2$
-		testString = "abc="; //$NON-NLS-1$
-		System.out.println(testString + " -->" + stripNonLetterDigits(testString) + "<--"); //$NON-NLS-1$ //$NON-NLS-2$
-		testString = "abc "; //$NON-NLS-1$
-		System.out.println(testString + " -->" + stripNonLetterDigits(testString) + "<--"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	}
-
-	public static String toString(boolean booleanValue) {
-		if (booleanValue)
-			return TRUE;
-		else
-			return FALSE;
-	}
-
-	/**
-	 * Remove "escaped" chars from a string.
-	 */
-	public static String unescape(String aString) {
-		if (aString == null)
-			return null;
-		String normalString = replace(aString, EQUAL_SIGN_ENTITY, EQUAL_SIGN);
-		normalString = replace(normalString, LINE_FEED_ENTITY, LINE_FEED);
-		normalString = replace(normalString, CARRIAGE_RETURN_ENTITY, CARRIAGE_RETURN);
-		normalString = replace(normalString, LINE_TAB_ENTITY, LINE_TAB);
-		return normalString;
-	}
-
-	public static String uniqueEndOf(String newStart, String newEnd) {
-		String[] regions = overlapRegions(newStart, newEnd);
-		return regions[2];
-	}
-
-	/**
-	 * Unpacks a comma delimited String into an array of Strings
-	 * 
-	 * @param s
-	 * @return
-	 * @todo Generated comment
-	 */
-	public static String[] unpack(String s) {
-		if (s == null)
-			return new String[0];
-		StringTokenizer toker = new StringTokenizer(s, ","); //$NON-NLS-1$
-		List list = new ArrayList();
-		while (toker.hasMoreTokens()) {
-			// since we're separating the values with ',', escape ',' in the
-			// values
-			list.add(StringUtils.replace(toker.nextToken(), "&comma;", ",").trim()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return (String[]) list.toArray(new String[0]);
-	}
-
-	/**
-	 * StringUtils constructor comment.
-	 */
-	private StringUtils() {
-		super();
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.sse.ui/.classpath b/bundles/org.eclipse.wst.sse.ui/.classpath
new file mode 100644
index 0000000..3a7715c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-extensions"/>
+	<classpathentry kind="src" path="src-encoding"/>
+	<classpathentry kind="src" path="src-tasktags"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible" pattern="org/eclipse/wst/validation/**"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/bundles/org.eclipse.wst.sse.ui/.cvsignore b/bundles/org.eclipse.wst.sse.ui/.cvsignore
new file mode 100644
index 0000000..2b6bc40
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/.cvsignore
@@ -0,0 +1,8 @@
+bin
+editor.jar
+build.xml
+temp.folder
+org.eclipse.wst.sse.ui_1.0.0.jar
+@dot
+src.zip
+javaCompiler...args
diff --git a/bundles/org.eclipse.wst.sse.ui/.options b/bundles/org.eclipse.wst.sse.ui/.options
new file mode 100644
index 0000000..cfbecf3
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/.options
@@ -0,0 +1,73 @@
+org.eclipse.wst.sse.ui/debug=true
+org.eclipse.wst.sse.ui/debug/tracefilter=
+
+#org.eclipse.wst.sse.ui.edit.util.ActionContributer._showDebugStatus
+org.eclipse.wst.sse.ui/actioncontributor/debugstatusfields=true
+
+
+#org.eclipse.wst.sse.ui.extension.TransferBuilder.debugTime
+org.eclipse.wst.sse.ui/transferbuilder/time=false
+
+org.eclipse.wst.sse.ui/extendedconfigurationbuilder=false
+#org.eclipse.wst.sse.ui.extension.ExtendedConfigurationBuilder.debugTime
+org.eclipse.wst.sse.ui/extendedconfigurationbuilder/time=false
+
+
+org.eclipse.wst.sse.ui/extendededitoractionbuilder=false
+
+#org.eclipse.wst.sse.ui.extension.ExtendedEditorActionBuilder.debugReadTime
+org.eclipse.wst.sse.ui/extendededitoractionbuilder/readtime=false
+
+#org.eclipse.wst.sse.ui.extension.ExtendedEditorActionBuilder.debugContributeTime
+org.eclipse.wst.sse.ui/extendededitoractionbuilder/contributetime=false
+
+
+#org.eclipse.wst.sse.ui.extension.ExtendedEditorActionBuilder.debugMenu
+org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugmenu=false
+
+#org.eclipse.wst.sse.ui.extension.ExtendedEditorActionBuilder.debugPopup
+org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugpopup=false
+
+#org.eclipse.wst.sse.ui.extension.ExtendedEditorActionBuilder.debugToolbar
+org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugtoolbar=false
+
+
+#org.eclipse.wst.sse.ui.FileModelProvider.debugOperations
+org.eclipse.wst.sse.ui/filemodelprovider/operations=false
+
+#org.eclipse.wst.sse.ui.FileModelProvider.debugLifecyclelistener
+org.eclipse.wst.sse.ui/filemodelprovider/lifecyclelistener=false
+
+#org.eclipse.wst.sse.ui.FileModelProvider.debugModelStatelistener
+org.eclipse.wst.sse.ui/filemodelprovider/modelstatelistener=false
+
+
+#org.eclipse.wst.sse.ui.StorageModelProvider.debugOperations
+org.eclipse.wst.sse.ui/storagemodelprovider/operations=false
+
+#org.eclipse.wst.sse.ui.StorageModelProvider.debugElementStatelistener
+org.eclipse.wst.sse.ui/storagemodelprovider/elementstatelistener=false
+
+org.eclipse.wst.sse.ui/contentOutline=false
+org.eclipse.wst.sse.ui/propertySheet=false
+
+#org.eclipse.wst.sse.ui.views.contentoutline.PropertyChangeUpdateActionContributionItem.debug
+org.eclipse.wst.sse.ui/propertyChangeUpdateActionContributionItem=false
+
+org.eclipse.wst.sse.ui/debug/reconcilerjob=false
+
+#org.eclipse.wst.sse.ui.internal.GotoAnnotationAction._debug
+org.eclipse.wst.sse.ui/gotoNextAnnotation=false
+
+org.eclipse.wst.sse.ui/preferences-properties=false
+
+org.eclipse.wst.sse.ui/debug/reconcilerSpelling=false
+org.eclipse.wst.sse.ui/debug/reconcilerSpelling/showProblems=false
+
+org.eclipse.wst.sse.ui/debug/reconcilerValidators=false
+#org.eclipse.wst.sse.ui.internal.reconcile.validator.ValidatorStrategy
+org.eclipse.wst.sse.ui/debug/reconcilerValidatorSupported=false
+org.eclipse.wst.sse.ui/debug/reconcilerValidatorEnablement=false
+
+org.eclipse.wst.sse.ui/structuredPresentationReconciler=false
+org.eclipse.wst.sse.ui/structuredPresentationReconciler/time=false
diff --git a/bundles/org.eclipse.wst.sse.ui/.project b/bundles/org.eclipse.wst.sse.ui/.project
new file mode 100644
index 0000000..78bd94c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.sse.ui</name>
+	<comment></comment>
+	<projects></projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.core.resources.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs
copy to bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.core.resources.prefs
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.core.runtime.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs
copy to bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.core.runtime.prefs
diff --git a/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..26b0cde
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,91 @@
+#Wed Apr 30 02:03:18 EDT 2008

+eclipse.preferences.version=1

+org.eclipse.jdt.core.builder.cleanOutputFolder=clean

+org.eclipse.jdt.core.builder.duplicateResourceTask=warning

+org.eclipse.jdt.core.builder.invalidClasspath=ignore

+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch

+org.eclipse.jdt.core.circularClasspath=error

+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled

+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled

+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled

+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2

+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve

+org.eclipse.jdt.core.compiler.compliance=1.4

+org.eclipse.jdt.core.compiler.debug.lineNumber=generate

+org.eclipse.jdt.core.compiler.debug.localVariable=generate

+org.eclipse.jdt.core.compiler.debug.sourceFile=generate

+org.eclipse.jdt.core.compiler.doc.comment.support=enabled

+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100

+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning

+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning

+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore

+org.eclipse.jdt.core.compiler.problem.deprecation=ignore

+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled

+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled

+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning

+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning

+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning

+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore

+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled

+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore

+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore

+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error

+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error

+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning

+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning

+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore

+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error

+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore

+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled

+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled

+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private

+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore

+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error

+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore

+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore

+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled

+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public

+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore

+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled

+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private

+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore

+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error

+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error

+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning

+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore

+org.eclipse.jdt.core.compiler.problem.nullReference=warning

+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning

+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore

+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error

+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning

+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning

+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore

+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning

+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled

+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error

+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled

+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore

+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore

+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning

+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore

+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning

+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore

+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error

+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore

+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore

+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled

+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled

+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled

+org.eclipse.jdt.core.compiler.problem.unusedImport=error

+org.eclipse.jdt.core.compiler.problem.unusedLabel=error

+org.eclipse.jdt.core.compiler.problem.unusedLocal=error

+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore

+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled

+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled

+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled

+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error

+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning

+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning

+org.eclipse.jdt.core.compiler.source=1.3

+org.eclipse.jdt.core.incompatibleJDKLevel=ignore

+org.eclipse.jdt.core.incompleteClasspath=error

diff --git a/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..6ad0dd8
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Nov 16 00:51:27 EST 2006
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<templates/>
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs
copy to bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
diff --git a/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..52ce9da
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,25 @@
+#Thu Aug 14 03:59:55 EDT 2008

+compilers.f.unresolved-features=1

+compilers.f.unresolved-plugins=1

+compilers.incompatible-environment=0

+compilers.p.build=0

+compilers.p.deprecated=1

+compilers.p.discouraged-class=1

+compilers.p.illegal-att-value=0

+compilers.p.internal=1

+compilers.p.missing-packages=2

+compilers.p.no-required-att=0

+compilers.p.not-externalized-att=0

+compilers.p.unknown-attribute=0

+compilers.p.unknown-class=1

+compilers.p.unknown-element=0

+compilers.p.unknown-identifier=1

+compilers.p.unknown-resource=0

+compilers.p.unresolved-ex-points=0

+compilers.p.unresolved-import=0

+compilers.p.unused-element-or-attribute=0

+compilers.s.create-docs=false

+compilers.s.doc-folder=doc

+compilers.s.open-tags=1

+compilers.use-project=true

+eclipse.preferences.version=1

diff --git a/bundles/org.eclipse.wst.sse.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.sse.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..45500ee
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,70 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.wst.sse.ui; singleton:=true
+Bundle-Version: 1.2.5.qualifier
+Bundle-Activator: org.eclipse.wst.sse.ui.internal.SSEUIPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.wst.sse.ui,
+ org.eclipse.wst.sse.ui.contentassist,
+ org.eclipse.wst.sse.ui.internal;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.actions;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.contentassist;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.contentoutline;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.contentproperties.ui;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.correction;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.debug;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.derived;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.edit.util;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.editor;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.encoding.ui;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.extension;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.format;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.handlers;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.hyperlink;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.openon;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.preferences;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.preferences.ui;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.projection;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.properties;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.provisional.extensions;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.provisional.preferences;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.provisional.registry;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.provisional.style;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.reconcile;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.reconcile.validator;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.search;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.selection;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.spelling;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.taginfo;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.text;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.ui;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.util;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.internal.view.events;x-friends:="org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.sse.ui.preferences,
+ org.eclipse.wst.sse.ui.quickoutline,
+ org.eclipse.wst.sse.ui.reconcile,
+ org.eclipse.wst.sse.ui.typing,
+ org.eclipse.wst.sse.ui.views.contentoutline,
+ org.eclipse.wst.sse.ui.views.properties
+Import-Package: com.ibm.icu.util; version="3.8",
+ com.ibm.icu.text; version="3.8"
+Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.jface.text;bundle-version="[3.6.0,4.0.0)",
+ org.eclipse.debug.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.editors;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
+ org.eclipse.search;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.workbench.texteditor;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.forms;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.ui.views;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.validation;bundle-version="[1.2.100,1.3.0)",
+ org.eclipse.emf.common;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.sse.ui/README.txt b/bundles/org.eclipse.wst.sse.ui/README.txt
new file mode 100644
index 0000000..efe4522
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/README.txt
@@ -0,0 +1,2 @@
+The base editor of the sse framework. It provides the hooks for content assist,
+breakpoints, debugging, open-on, quickfix, spell checking and a content outline.
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.core/about.html b/bundles/org.eclipse.wst.sse.ui/about.html
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/about.html
copy to bundles/org.eclipse.wst.sse.ui/about.html
diff --git a/bundles/org.eclipse.wst.sse.ui/build.properties b/bundles/org.eclipse.wst.sse.ui/build.properties
new file mode 100644
index 0000000..a080c98
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/build.properties
@@ -0,0 +1,30 @@
+###############################################################################
+# Copyright (c) 2001, 2006 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Jens Lukowski/Innoopract - initial renaming/restructuring
+#     
+###############################################################################
+bin.includes = plugin.xml,\
+               .options,\
+               .,\
+               icons/,\
+               plugin.properties,\
+               META-INF/,\
+               about.html
+bin.excludes = bin/**,\
+               @dot/**,\
+               temp.folder/**
+src.includes = toc.xml,\
+               testToc.xml,\
+               schema/,\
+               html/
+source.. = src/,\
+           src-extensions/,\
+           src-encoding/,\
+           src-tasktags/
diff --git a/bundles/org.eclipse.wst.sse.ui/html/maintopic.html b/bundles/org.eclipse.wst.sse.ui/html/maintopic.html
new file mode 100644
index 0000000..a476078
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/html/maintopic.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>Main Topic</title>
+</head>
+
+<body>
+<h1>Main Topic</h1>
+Please enter your text here.
+</body>
+</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/html/subtopic.html b/bundles/org.eclipse.wst.sse.ui/html/subtopic.html
new file mode 100644
index 0000000..8a61c50
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/html/subtopic.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>Sub Topic</title>
+</head>
+
+<body>
+<h1>Sub Topic</h1>
+Please enter your text here.
+</body>
+</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/html/toc.html b/bundles/org.eclipse.wst.sse.ui/html/toc.html
new file mode 100644
index 0000000..326f0a9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/html/toc.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>Table of Contents</title>
+</head>
+
+<body>
+<h1>Table of Contents</h1>
+Please enter your text here.
+</body>
+</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/ctool16/spellcheck.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/ctool16/spellcheck.gif
new file mode 100644
index 0000000..c71de32
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/ctool16/spellcheck.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/collapseall.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/collapseall.gif
new file mode 100644
index 0000000..7dc0de5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/collapseall.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/delete.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/delete.gif
new file mode 100644
index 0000000..2e197c2
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/delete.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/synced.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/synced.gif
new file mode 100644
index 0000000..4b9e567
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/dlcl16/synced.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/dtool16/spellcheck.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/dtool16/spellcheck.gif
new file mode 100644
index 0000000..a4cf55f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/dtool16/spellcheck.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/collapseall.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/collapseall.gif
new file mode 100644
index 0000000..a2d80a9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/collapseall.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/delete.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/delete.gif
new file mode 100644
index 0000000..0ae6dec
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/delete.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/synced.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/synced.gif
new file mode 100644
index 0000000..05cefef
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/elcl16/synced.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/etool16/spellcheck.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/etool16/spellcheck.gif
new file mode 100644
index 0000000..c71de32
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/etool16/spellcheck.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/occ_match.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/occ_match.gif
new file mode 100644
index 0000000..9e033de
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/occ_match.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/preferences.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/preferences.gif
new file mode 100644
index 0000000..4c07fea
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/preferences.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/prop_ps.gif b/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/prop_ps.gif
new file mode 100644
index 0000000..3aec64d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/full/obj16/prop_ps.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/icons/sourceEditor.gif b/bundles/org.eclipse.wst.sse.ui/icons/sourceEditor.gif
new file mode 100644
index 0000000..75ebdb8
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/icons/sourceEditor.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.sse.ui/plugin.properties b/bundles/org.eclipse.wst.sse.ui/plugin.properties
new file mode 100644
index 0000000..5ab4691
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/plugin.properties
@@ -0,0 +1,117 @@
+###############################################################################
+# Copyright (c) 2001, 2010 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Jens Lukowski/Innoopract - initial renaming/restructuring
+#     David Carver - bug 212330 - migrate to org.eclipse.ui.menus extension point     
+###############################################################################
+providerName=Eclipse Web Tools Platform
+pluginName=Structured Source Editor
+Standalone_Structured_Source_Editor.name=Standalone Structured Source Editor
+# Names on preferences pages
+Structured_Text_Editor.name=Structured Text Editors
+Task_Tags_Preferences.name=Task Tags
+
+#
+sourceEditorFontDefiniton.label=Structured Text Editor Text Font
+sourceEditorFontDefintion.description=The Structured text editor text font is used by Structured text editors.
+
+Adapter_Factory_Description_Extension.name=Adapter Factory Description Extension
+Extended_Editor_Actions_Extension.name=Extended Editor Actions Extension
+Drop_Target_Transfers_Extension.name=Drop Target Transfers Extension
+Extended_Editor_Configuration_Extension.name=Extended Editor Configuration Extension
+quickFixProcessor=Quick Fix Processor Extension
+Semantic_Highlighting_Extension.name=Semantic Highlighting Extension
+Character_Pairing.name=Character Pairing Extension
+Completion_Proposal.name=Completion Proposal
+Completion_Proposal_Categories_Configuration.name=Completion Proposal Categories Configuration
+Commenting_Strategy_Extension.name=Commenting Strategy Extension
+##########################################################################
+# These strings are used in Workbench Keys Preferences
+##########################################################################
+scope.structuredTextEditor.name=Editing in Structured Text Editors
+scope.structuredTextEditor.description=Editing in Structured Text Editors
+scope.structuredTextEditor.comments.description=Source Comments in Structured Text Editors
+scope.structuredTextEditor.comments.name=Source Comments in Structured Text Editors
+command.toggle.comment.name=Toggle Comment
+command.toggle.comment.description=Toggle Comment
+command.toggle.comment.mnemonic=T
+command.add.block.comment.name=Add Block Comment
+command.add.block.comment.description=Add Block Comment
+command.add.block.comment.mnemonic=A
+command.remove.block.comment.name=Remove Block Comment
+command.remove.block.comment.description=Remove Block Comment
+command.remove.block.comment.mnemonic=R
+command.cleanup.document.name=Cleanup Document...
+command.cleanup.document.description=Cleanup document
+command.cleanup.document.mnemonic=C
+command.format.document.name=Format
+command.format.document.description=Format selection
+command.format.document.mnemonic=F
+command.format.active.elements.name=Format Active Elements
+command.format.active.elements.description=Format active elements
+command.format.active.elements.mnemonic=i
+command.open.file.from.source.name=Open Selection
+command.open.file.from.source.description=Open an editor on the selected link
+command.open.file.from.source.mnemonic=O
+command.search.find.occurrences.name=Occurrences in File
+command.search.find.occurrences.description=Find occurrences of the selection in the file
+command.search.find.occurrences.mnemonic=O
+command.information.quick_outline.name=Quick Outline
+command.information.quick_outline.description=Show the quick outline for the editor input
+ActionDefinition.selectEnclosing.name=Select Enclosing Element
+ActionDefinition.selectEnclosing.description=Expand selection to include enclosing element
+ActionDefinition.selectNext.name=Select Next Element
+ActionDefinition.selectNext.description=Expand selection to include next sibling
+ActionDefinition.selectPrevious.name=Select Previous Element
+ActionDefinition.selectPrevious.description=Expand selection to include previous sibling
+ActionDefinition.selectLast.name=Restore Last Selection
+ActionDefinition.selectLast.description=Restore last selection
+ActionDefinition.quickFix.name=Quick Fix
+ActionDefinition.quickFix.description=Quick Fix
+ActionDefinition.gotoMatchingBracket.name=Matching Bracket
+ActionDefinition.gotoMatchingBracket.description=Go to Matching Bracket
+
+
+#
+AddBookmark.label=Add Boo&kmark...
+SelectRuler.label=Select Ruler
+#
+##########################################################################
+# These strings are used in file and container resource popup menu
+##########################################################################
+Source=&Source
+FormatDocument=&Format
+Refactor=Refac&tor
+##
+Breakpoint_Extension_Point.name=Breakpoint Extension Point
+Source_Validation_Extension_Point.name=Reconcile Validator Extension Point
+###############################################################################
+# The following property keys maybe unused. Commented out on 4/12/2005. Uncomment if needed.
+#Bean_Info_Provider_Extension.name=Bean Info Provider Extension
+#SpellCheck_Extension_Point.name=SpellCheck Extension Point
+#Open_On_Extension_Point.name=Open On Extension Point
+#Spell_Check_label=Spell Check
+#Spell_Check_tooltip=Spell Check
+preferenceKeywords.todo=case sensitive task tag todo xxx fix fixme project specific projectspecific comments
+preferenceKeywords.sseeditor=structured text editor source xml html jsp appearance highlight matching brackets report problems type validation inform unsupported content folding color hovers modifier semantic
+ExpandSelectionTo=Expand Selection To
+SmartInsert_label=Sma&rt Insert Mode
+StructureSelectEnclosing_label=Enclosing Element
+StructureSelectEnclosing_tooltip=Expand selection to include enclosing element
+StructureSelectNext_label=Next Element
+StructureSelectNext_tooltip=Expand selection to include next sibling
+StructureSelectPrevious_label=Previous Element
+StructureSelectPrevious_tooltip=Expand selection to include previous sibling
+StructureSelectHistory_label=Restore Last Selection
+StructureSelectHistory_tooltip=Restore last selection
+
+Colors.content_assist_proposals_background=Content Assist Proposals Background
+Colors.content_assist_proposals_foreground=Content Assist Proposals Foreground
+Colors.content_assist_parameters_background=Content Assist Parameters Background
+Colors.content_assist_parameters_foreground=Content Assist Parameters Foreground
diff --git a/bundles/org.eclipse.wst.sse.ui/plugin.xml b/bundles/org.eclipse.wst.sse.ui/plugin.xml
new file mode 100644
index 0000000..35e7717
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/plugin.xml
@@ -0,0 +1,850 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.3"?>
+<plugin>
+
+	<extension-point
+		id="adapterFactoryDescription"
+		name="%Adapter_Factory_Description_Extension.name" ></extension-point>
+	<extension-point
+		id="extendedEditorActions"
+		name="%Extended_Editor_Actions_Extension.name" ></extension-point>
+	<extension-point
+		id="dropTargetTransfers"
+		name="%Drop_Target_Transfers_Extension.name" ></extension-point>
+	<extension-point
+		id="editorConfiguration"
+		name="%Extended_Editor_Configuration_Extension.name"
+		schema="schema/editorconfiguration.exsd" ></extension-point>
+	<extension-point
+		id="semanticHighlighting"
+		name="%Semantic_Highlighting_Extension.name"
+		schema="schema/semanticHighlighting.exsd" ></extension-point>
+	<extension-point
+		id="characterPairing"
+		name="%Character_Pairing.name"
+		schema="schema/characterPairing.exsd" ></extension-point>
+
+
+	<!-- Make sure default preference values are set at runtime -->
+	<extension point="org.eclipse.core.runtime.preferences">
+		<initializer
+			class="org.eclipse.wst.sse.ui.internal.PreferenceInitializer" />
+	</extension>
+
+
+	<!-- reusable extensions -->
+	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
+		<sourceViewerConfiguration
+			class="org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration"
+			target="org.eclipse.wst.sse.ui.StructuredTextEditor" />
+		<provisionalDefinition
+			type="preferencepages"
+			value="org.eclipse.wst.sse.ui.preferences.editor"
+			target="org.eclipse.wst.sse.ui.StructuredTextEditor" />
+	</extension>
+	<!-- associate the NavigateActionSet with various parts of the XML perspective-->
+	<extension point="org.eclipse.ui.actionSetPartAssociations">
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.edit.text.actionSet.annotationNavigation">
+			<part
+				id="org.eclipse.wst.sse.ui.StructuredTextEditor">
+			</part>
+		</actionSetPartAssociation>
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.NavigateActionSet">
+			<part
+				id="org.eclipse.wst.sse.ui.StructuredTextEditor">
+			</part>
+		</actionSetPartAssociation>
+		<actionSetPartAssociation
+            targetID="org.eclipse.debug.ui.launchActionSet">
+            <part id="org.eclipse.wst.sse.ui.StructuredTextEditor"/>
+		</actionSetPartAssociation>
+	</extension>
+	
+	<!-- Keywords for preference and properties pages -->
+	<extension point="org.eclipse.ui.keywords">
+		<keyword
+			label="%preferenceKeywords.todo"
+			id="org.eclipse.wst.sse.ui.todo"/>
+		<keyword
+			label="%preferenceKeywords.sseeditor"
+			id="org.eclipse.wst.sse.ui.sseeditor"/>
+    </extension>
+    
+	<extension point="org.eclipse.ui.preferencePages">
+		<!-- Source Editor Preference page under Workbench->Editors -->
+		<page
+			name="%Structured_Text_Editor.name"
+			category="org.eclipse.ui.preferencePages.Editors"
+			class="org.eclipse.wst.sse.ui.internal.preferences.ui.StructuredTextEditorPreferencePage"
+			id="org.eclipse.wst.sse.ui.preferences.editor">
+			<keywordReference id="org.eclipse.wst.sse.ui.sseeditor"/>
+		</page>
+
+		<!-- SSE task tags preference page under that-->
+		<page
+			name="%Task_Tags_Preferences.name"
+			category="org.eclipse.wst.sse.ui.preferences.editor"
+			class="org.eclipse.wst.sse.ui.internal.preferences.ui.TaskTagPreferencePage"
+			id="org.eclipse.wst.sse.ui.preferences.tasktags">
+			<keywordReference id="org.eclipse.wst.sse.ui.todo"/>
+		</page>
+	</extension>
+	<!-- ================================================================================================ -->
+	<!-- common task tags property page -->
+	<!-- ================================================================================================ -->
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			id="org.eclipse.wst.sse.ui.project.properties.tasktags"
+			name="%Task_Tags_Preferences.name"
+			class="org.eclipse.wst.sse.ui.internal.preferences.ui.TaskTagPreferencePage">
+         	<enabledWhen>
+               	<and>
+					<adapt type="org.eclipse.core.resources.IProject">
+					</adapt>
+				</and> 
+			</enabledWhen>
+			<keywordReference id="org.eclipse.wst.sse.ui.todo"/>
+		</page>
+	</extension>
+
+	<!--
+		<extension-point id="dragSourceTransfers" name="Drag Source Transfers"/>
+	-->
+	<extension point="org.eclipse.ui.commands">
+		<!-- Edit commands -->
+		<command
+			name="%ActionDefinition.selectEnclosing.name"
+			description="%ActionDefinition.selectEnclosing.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.structure.select.enclosing">
+		</command>
+		<command
+			name="%ActionDefinition.selectNext.name"
+			description="%ActionDefinition.selectNext.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.structure.select.next">
+		</command>
+		<command
+			name="%ActionDefinition.selectPrevious.name"
+			description="%ActionDefinition.selectPrevious.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.structure.select.previous">
+		</command>
+		<command
+			name="%ActionDefinition.selectLast.name"
+			description="%ActionDefinition.selectLast.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.structure.select.last">
+		</command>
+		<!-- Source commands -->
+		<command
+			name="%command.toggle.comment.name"
+			description="%command.toggle.comment.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.toggle.comment">
+		</command>
+		<command
+			name="%command.add.block.comment.name"
+			description="%command.add.block.comment.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.add.block.comment">
+		</command>
+		<command
+			name="%command.remove.block.comment.name"
+			description="%command.remove.block.comment.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.remove.block.comment">
+		</command>
+		<command
+			name="%command.cleanup.document.name"
+			description="%command.cleanup.document.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.cleanup.document">
+		</command>
+		<command
+			name="%command.format.document.name"
+			description="%command.format.document.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.format.document">
+		</command>
+		<command
+			name="%command.format.active.elements.name"
+			description="%command.format.active.elements.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.format.active.elements">
+		</command>
+		<!-- Navigate commands -->
+		<command
+			name="%command.open.file.from.source.name"
+			description="%command.open.file.from.source.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.open.file.from.source">
+		</command>
+      <command
+            name="%ActionDefinition.gotoMatchingBracket.name"
+            description="%ActionDefinition.gotoMatchingBracket.description"
+            categoryId="org.eclipse.ui.category.navigate"
+            id="org.eclipse.wst.sse.ui.goto.matching.bracket">
+      </command>
+		<!-- Find Occurrences -->
+		<command
+			name="%command.search.find.occurrences.name"
+			description="%command.search.find.occurrences.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.sse.ui.search.find.occurrences">
+		</command>
+		<command
+			name="%command.information.quick_outline.name"
+			description="%command.information.quick_outline.description"
+			categoryId="org.eclipse.ui.category.navigate"
+			id="org.eclipse.wst.sse.ui.quick_outline">
+		</command>
+	</extension>
+	<!-- Keybinding scope for source editor -->
+	<extension point="org.eclipse.ui.contexts">
+		<context
+			name="%scope.structuredTextEditor.name"
+			parentId="org.eclipse.ui.textEditorScope"
+			description="%scope.structuredTextEditor.description"
+			id="org.eclipse.wst.sse.ui.structuredTextEditorScope">
+		</context>
+		<context
+			name="%scope.structuredTextEditor.comments.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structuredTextEditor.comments.description"
+			id="org.eclipse.wst.sse.comments">
+		</context>
+	</extension>
+	<!-- Keybindings for source editor -->
+	<extension point="org.eclipse.ui.bindings">
+	    <!--  win32:  M1=CTRL, M2=SHIFT, M3=ALT -->
+		<!-- Edit commands -->
+		<key
+			sequence="M2+M3+ARROW_UP"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.structure.select.enclosing"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M2+M3+ARROW_RIGHT"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.structure.select.next"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M2+M3+ARROW_RIGHT"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId=""
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+			platform="carbon">
+		</key>
+		<key
+			sequence="M2+M4+ARROW_RIGHT"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.structure.select.next"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+			platform="carbon">
+		</key>
+		<key
+			sequence="M2+M3+ARROW_LEFT"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.structure.select.previous"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M2+M3+ARROW_LEFT"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId=""
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+			platform="carbon">
+		</key>
+		<key
+			sequence="M2+M4+ARROW_LEFT"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.structure.select.previous"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+			platform="carbon">
+		</key>
+		<key
+			sequence="M2+M3+ARROW_DOWN"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.structure.select.last"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<!-- Source commands -->
+		<key
+			sequence="M1+M2+C"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.toggle.comment"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M1+O"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.quick_outline"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M1+M2+/"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.add.block.comment"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M1+/"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.add.block.comment"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+			platform="carbon">
+		</key>
+		<key
+			sequence="M1+M2+\"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.remove.block.comment"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M1+\"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.remove.block.comment"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+			platform="carbon">
+		</key>
+		<key
+			sequence="M1+M2+F"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.format.document"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+			sequence="M1+I"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.format.active.elements"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<!-- Navigate commands -->
+		<key
+			sequence="F3"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.open.file.from.source"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+		<key
+            sequence="M1+M2+P"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+            commandId="org.eclipse.wst.sse.ui.goto.matching.bracket"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+		<!-- Find Occurrences -->
+		<key
+			sequence="M1+M2+A"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.sse.ui.search.find.occurrences"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+		</key>
+	</extension>
+	<!-- Font and colors contributions -->
+	<extension point="org.eclipse.ui.themes">
+		<themeElementCategory
+			label="%Structured_Text_Editor.name"
+			id="org.eclipse.wst.sse.ui">
+		</themeElementCategory>
+		<fontDefinition
+			label="%sourceEditorFontDefiniton.label"
+			categoryId="org.eclipse.wst.sse.ui"
+			defaultsTo="org.eclipse.jface.textfont"
+			id="org.eclipse.wst.sse.ui.textfont">
+			<description>
+				%sourceEditorFontDefintion.description
+			</description>
+		</fontDefinition>
+	</extension>
+	<extension point="org.eclipse.wst.sse.ui.dropTargetTransfers">
+		<dropTargetContribution
+			targetID="org.eclipse.wst.sse.ui.StructuredTextEditor"
+			id="org.eclipse.wst.sse.ui.extension.ExtendedTransfers">
+			<transfer
+				priority="mid"
+				singleton="true"
+				class="org.eclipse.swt.dnd.FileTransfer"
+				method="getInstance"
+				id="org.eclipse.swt.dnd.FileTransfer">
+			</transfer>
+			<dropAction
+				class="org.eclipse.wst.sse.ui.internal.FileDropAction"
+				transferID="org.eclipse.swt.dnd.FileTransfer"
+				id="org.eclipse.wst.sse.ui.internal.FileDropAction">
+			</dropAction>
+			<transfer
+				priority="low"
+				singleton="true"
+				class="org.eclipse.swt.dnd.TextTransfer"
+				method="getInstance"
+				id="org.eclipse.swt.dnd.TextTransfer">
+			</transfer>
+			<dropAction
+				class="org.eclipse.wst.sse.ui.internal.TextDropAction"
+				transferID="org.eclipse.swt.dnd.TextTransfer"
+				id="org.eclipse.wst.sse.ui.internal.TextDropAction">
+			</dropAction>
+		</dropTargetContribution>
+	</extension>
+
+	<extension point="org.eclipse.ui.editors.annotationTypes">
+		<type
+			super="org.eclipse.ui.workbench.texteditor.error"
+			markerType="org.eclipse.wst.sse.problem"
+			name="org.eclipse.wst.sse.ui.temp.error"
+			markerSeverity="2">
+		</type>
+		<type
+			super="org.eclipse.ui.workbench.texteditor.warning"
+			markerType="org.eclipse.wst.sse.problem"
+			name="org.eclipse.wst.sse.ui.temp.warning"
+			markerSeverity="1">
+		</type>
+
+		<type
+			super="org.eclipse.ui.workbench.texteditor.info"
+			markerType="org.eclipse.wst.sse.problem"
+			name="org.eclipse.wst.sse.ui.temp.info"
+			markerSeverity="0">
+		</type>
+	</extension>
+	<extension
+		point="org.eclipse.ui.editors.markerAnnotationSpecification">
+
+		<!--================================================================================================-->
+		<!-- same as eclipse text ui (including preference keys), except for vertical ruler & preference page -->
+		<!--================================================================================================-->
+		<specification
+			annotationType="org.eclipse.wst.sse.ui.temp.error"
+			annotationImageProvider="org.eclipse.wst.sse.ui.internal.ui.StructuredTextAnnotationImageProvider"
+			verticalRulerPreferenceValue="true"
+			verticalRulerPreferenceKey="sseErrorIndicationInVerticalRuler"
+			includeOnPreferencePage="false">
+		</specification>
+		<specification
+			annotationType="org.eclipse.wst.sse.ui.temp.warning"
+			annotationImageProvider="org.eclipse.wst.sse.ui.internal.ui.StructuredTextAnnotationImageProvider"
+			verticalRulerPreferenceValue="false"
+			verticalRulerPreferenceKey="sseWarningIndicationInVerticalRuler"
+			includeOnPreferencePage="false">
+		</specification>
+		<specification
+			annotationImageProvider="org.eclipse.wst.sse.ui.internal.ui.StructuredTextAnnotationImageProvider"
+			annotationType="org.eclipse.wst.sse.ui.temp.info">
+		</specification>
+	</extension>
+	<!-- dynamic content type supporting editor, no supported file extensions by default -->
+	<extension point="org.eclipse.ui.editors">
+		<editor
+			name="%Standalone_Structured_Source_Editor.name"
+			icon="$nl$/icons/sourceEditor.gif"
+			contributorClass="org.eclipse.wst.sse.ui.internal.actions.ActionContributor"
+			class="org.eclipse.wst.sse.ui.StructuredTextEditor"
+			symbolicFontName="org.eclipse.wst.sse.ui.textfont"
+			id="org.eclipse.wst.sse.ui.StructuredTextEditor">
+		</editor>
+	</extension>
+	
+<!--	<extension point="org.eclipse.ui.popupMenus">
+		<objectContribution
+			objectClass="org.eclipse.core.resources.IContainer"
+			id="org.eclipse.wst.sse.ui.actions.ContainerSourceActions">
+			<menu
+				label="%Source"
+				path="additions"
+				id="source">
+				<groupMarker name="sourceGroup"></groupMarker>
+			</menu>
+			<action
+				label="%FormatDocument"
+				class="org.eclipse.wst.sse.ui.internal.actions.FormatActionDelegate"
+				menubarPath="source/sourceGroup"
+				enablesFor="+"
+				id="org.eclipse.wst.sse.ui.actions.ContainerSourceActions.Format">
+			</action>
+		</objectContribution>
+		<objectContribution
+			objectClass="org.eclipse.core.resources.IFile"
+			id="org.eclipse.wst.sse.ui.actions.FileSourceActions">
+			<menu
+				label="%Source"
+				path="additions"
+				id="source">
+				<groupMarker name="sourceGroup"></groupMarker>
+			</menu>
+			<action
+				label="%FormatDocument"
+				class="org.eclipse.wst.sse.ui.internal.actions.FormatActionDelegate"
+				menubarPath="source/sourceGroup"
+				enablesFor="+"
+				id="org.eclipse.wst.sse.ui.actions.FileSourceActions.Format">
+			</action>
+		</objectContribution>
+   	</extension>
+   	-->
+   <!--
+   <extension
+         point="org.eclipse.ui.editorActions">
+      <editorContribution
+            targetID="org.eclipse.wst.sse.ui.StructuredTextEditor"
+            id="org.eclipse.wst.sse.ui.StructuredTextEditor.ruler.actions">
+         <action
+               label="%AddBookmark.label"
+               helpContextId="org.eclipse.ui.bookmark_action_context"
+               class="org.eclipse.ui.texteditor.BookmarkRulerAction"
+               actionID="RulerDoubleClick"
+               id="org.eclipse.ui.texteditor.BookmarkRulerAction">
+         </action>
+         <action
+               label="%SelectRuler.label"
+               class="org.eclipse.ui.texteditor.SelectRulerAction"
+               actionID="RulerClick"
+               id="org.eclipse.ui.texteditor.SelectRulerAction">
+         </action>
+      </editorContribution>
+   </extension>
+   -->
+   
+	<!--================================================================================================-->
+	<!-- contribute a SearchResultViewPage for Occurrences in file                                      -->
+	<!--================================================================================================-->
+	<extension
+		id="Occurrences search page"
+		point="org.eclipse.search.searchResultViewPages">
+		<viewPage
+			id="org.eclipse.wst.sse.ui.search.OccurrencesSearchResultPage"
+			searchResultClass="org.eclipse.wst.sse.ui.internal.search.OccurrencesSearchResult"
+			class="org.eclipse.wst.sse.ui.internal.search.OccurrencesSearchViewPage">
+		</viewPage>
+	</extension>
+
+	<!-- extension point for toggling breakpoints -->
+	<extension-point
+		id="breakpoint"
+		name="%Breakpoint_Extension_Point.name" 
+		schema="schema/org.eclipse.wst.sse.ui.breakpoint.exsd" />
+	<!-- extension point for source validation -->
+	<!-- interfaces for this extension point can be found in org.eclipse.wst.validation -->
+	<extension-point
+		id="sourcevalidation"
+		name="%Source_Validation_Extension_Point.name"
+		schema="schema/org.eclipse.wst.sse.ui.sourcevalidation.exsd" />
+	<extension-point 
+		id="quickFixProcessor" 
+		name="%quickFixProcessor" 
+		schema="schema/quickFixProcessor.exsd"/>
+ <extension-point id="commentingStrategy" name="%Commenting_Strategy_Extension.name" schema="schema/commentingStrategy.exsd"/>
+ <extension-point id="completionProposal" name="%Completion_Proposal.name" schema="schema/completionProposal.exsd"/>
+ <extension-point id="completionProposalCategoriesConfiguration" name="%Completion_Proposal_Categories_Configuration.name" schema="schema/completionProposalCategoriesConfiguration.exsd"/>
+ 
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=edit">
+			<menu id="sourceMenuId" label="%Source"></menu>
+		</menuContribution>
+		<menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=sourceMenuId">
+			<menu id="refactorMenuId" label="%Refactor"></menu>
+		</menuContribution>
+	    <menuContribution locationURI="menu:edit?after=additions">
+	       <menu id="expandSelectionToMenuId" label="%ExpandSelectionTo"></menu>
+		</menuContribution>
+		<menuContribution locationURI="menu:sourceMenuId">
+			<separator name="sourceBegin" visible="false"></separator>
+			<separator name="shiftBegin" visible="true"></separator>
+			<separator name="shiftEnd" visible="true"></separator>
+			<separator name="additions" visible="true"></separator>
+			<separator name="sourceEnd" visible="false"></separator>	
+		</menuContribution>
+
+	    <menuContribution locationURI="menu:goTo?after=additions">
+		    <separator name="matchingBegin" visible="false"></separator>
+		    <command commandId="org.eclipse.wst.sse.ui.goto.matching.bracket" id="org.eclipse.wst.sse.ui.goto.matching.bracket" label="%ActionDefinition.gotoMatchingBracket.name" style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+				</visibleWhen>
+		    </command>
+			<separator name="matchingEnd" visible="false"></separator>
+		</menuContribution>
+		<!-- Contribute a Source menu for containers -->
+     <menuContribution
+           locationURI="popup:org.eclipse.ui.popup.any?after=additions">
+        <menu
+              id="sourceMenuId"
+              label="%Source">
+	        <command
+	              commandId="org.eclipse.wst.sse.ui.format"
+	              id="sourceFormat"
+	              style="push">
+	           <!-- Check to make sure that the handler is enabled before making visible -->
+				<visibleWhen checkEnabled="true" />
+	        </command>
+        </menu>
+     </menuContribution>
+		<menuContribution locationURI="menu:sourceMenuId?after=additions">
+			<command commandId="org.eclipse.wst.sse.ui.search.find.occurrences" id="OccurencesFile" style="push">
+			   <visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	    <!--<menuContribution locationURI="menu:edit?after=additions">
+	       <command commandId="org.eclipse.ui.edit.text.toggleInsertMode" id="ToggleInsertMode" label="%SmartInsert_label" style="toggle">
+			   <visibleWhen checkEnabled="false">
+				   <reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+			   </visibleWhen>
+	       </command>	       
+		</menuContribution> -->
+	    <menuContribution locationURI="menu:expandSelectionToMenuId">
+	       <command commandId="org.eclipse.wst.sse.ui.structure.select.enclosing" id="org.eclipse.wst.sse.ui.structure.select.enclosing" label="%StructureSelectEnclosing_label" style="push">
+			   <visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+				</visibleWhen>
+	       </command>	       
+	       <command commandId="org.eclipse.wst.sse.ui.structure.select.next" id="org.eclipse.wst.sse.ui.structure.select.next" label="%StructureSelectNext_label" style="push">
+			   <visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+				</visibleWhen>
+	       </command>
+	       <command commandId="org.eclipse.wst.sse.ui.structure.select.previous" id="org.eclipse.wst.sse.ui.structure.select.previous" label="%StructureSelectPrevious_label" style="push">
+			   <visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+				</visibleWhen>
+	       </command>
+	       <command commandId="org.eclipse.wst.sse.ui.structure.select.last" id="org.eclipse.wst.sse.ui.structure.select.last" label="%StructureSelectHistory_label" style="push">
+			   <visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+				</visibleWhen>
+	       </command>
+		</menuContribution>
+		
+
+		<menuContribution locationURI="menu:sourceMenuId?after=shiftBegin">
+			<command commandId="org.eclipse.ui.edit.text.shiftLeft"
+			         id="ShiftLeft"
+			         style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+				</visibleWhen>
+			</command>
+			<command commandId="org.eclipse.ui.edit.text.shiftRight"
+                     id="ShiftRight"
+                     style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+
+		<menuContribution locationURI="menu:sourceMenuId?after=shiftEnd">
+	        <command
+		           commandId="org.eclipse.wst.sse.ui.cleanup.document"
+		           id="CleanupDocument"
+			       mnemonic="%command.cleanup.document.mnemonic"
+		           style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+				</visibleWhen>
+		    </command>
+			<command 
+				commandId="org.eclipse.wst.sse.ui.format.document" 
+				id="FormatDocument" 
+			    mnemonic="%command.format.document.mnemonic"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+				</visibleWhen>
+			</command>
+			<command 
+				commandId="org.eclipse.wst.sse.ui.format.active.elements" 
+				id="FormatElements" 
+				mnemonic="%command.format.active.elements.mnemonic"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+
+		<menuContribution
+	           locationURI="popup:sourcePopupMenuId?after=sourceBegin">
+			<command
+					commandId="org.eclipse.wst.sse.ui.toggle.comment"
+					id="ToggleComment"
+					style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.commentingActiveContext.definition"></reference>
+				</visibleWhen>
+			</command>
+			<command
+					commandId="org.eclipse.wst.sse.ui.add.block.comment"
+					id="AddBlockComment"
+					style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.commentingActiveContext.definition"></reference>
+				</visibleWhen>
+			</command>
+			<command
+					commandId="org.eclipse.wst.sse.ui.remove.block.comment"
+					id="RemoveBlockComment"
+					style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.sse.ui.commentingActiveContext.definition"></reference>
+				</visibleWhen>
+			</command>
+			<separator name="format" visible="true"></separator>
+				<command
+			           commandId="org.eclipse.wst.sse.ui.cleanup.document"
+			           id="CleanupDocument"
+			           style="push">
+					<visibleWhen checkEnabled="false">
+						<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+					</visibleWhen>
+			    </command>
+				<command 
+					commandId="org.eclipse.wst.sse.ui.format.document" 
+					id="FormatDocument" 
+					mnemonic="%command.format.document.mnemonic" 
+					style="push">
+						<visibleWhen checkEnabled="false">
+							<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+						</visibleWhen>
+				</command>
+				<command 
+					commandId="org.eclipse.wst.sse.ui.format.active.elements" 
+					id="FormatElements" 
+					mnemonic="%command.format.active.elements.mnemonic" 
+					style="push">
+						<visibleWhen checkEnabled="false">
+							<reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+						</visibleWhen>
+				</command>
+				
+	     </menuContribution>
+			<menuContribution locationURI="menu:sourceMenuId?after=sourceBegin">
+				<command commandId="org.eclipse.wst.sse.ui.toggle.comment"
+						id="ToggleComment"
+				    mnemonic="%command.toggle.comment.mnemonic"
+				    style="push">
+					<visibleWhen checkEnabled="false">
+						<reference definitionId="org.eclipse.wst.sse.ui.commentingActiveContext.definition"/>
+					</visibleWhen>
+				</command>
+				<command commandId="org.eclipse.wst.sse.ui.add.block.comment"
+						id="AddBlockComment"
+				    mnemonic="%command.add.block.comment.mnemonic"
+				    style="push">
+					<visibleWhen checkEnabled="false">
+						<reference definitionId="org.eclipse.wst.sse.ui.commentingActiveContext.definition"/>
+					</visibleWhen>
+				</command>
+				<command commandId="org.eclipse.wst.sse.ui.remove.block.comment"
+						id="RemoveBlockComment"
+						mnemonic="%command.remove.block.comment.mnemonic"
+						style="push">
+					<visibleWhen checkEnabled="false">
+						<reference definitionId="org.eclipse.wst.sse.ui.commentingActiveContext.definition"/>
+					</visibleWhen>
+				</command>
+			</menuContribution>
+	</extension>
+	<extension
+       point="org.eclipse.ui.commands">
+	    <command
+	          id="org.eclipse.wst.sse.ui.format"
+	          name="%command.format.document.name">
+	    </command>
+	</extension>
+	
+	<!-- Enable the FormatHandler for Containers -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.wst.sse.ui.internal.handlers.FormatHandler"
+			commandId="org.eclipse.wst.sse.ui.format">
+			<activeWhen>
+				<iterate ifEmpty="false">
+					<adapt
+						type="org.eclipse.core.resources.IContainer">
+					</adapt>
+				</iterate>
+			</activeWhen>
+			<enabledWhen>
+				<iterate ifEmpty="false">
+					<adapt
+						type="org.eclipse.core.resources.IContainer">
+					</adapt>
+				</iterate>
+			</enabledWhen>
+		</handler>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.sse.ui.sseActiveContext.definition">
+            <with variable="activeContexts">
+	           <iterate operator="or">
+	              <equals value="org.eclipse.wst.sse.ui.structuredTextEditorScope"/>
+	           </iterate>
+            </with>
+		</definition>
+	  <definition 
+	  		id="org.eclipse.wst.sse.ui.commentingActiveContext.definition">
+	  	<with variable="activeContexts">
+				<iterate operator="or">
+					<equals value="org.eclipse.wst.sse.comments"/>
+				</iterate>
+			</with>
+	  </definition>
+	</extension>
+	
+	<!-- Define theme -->
+	<extension
+		point="org.eclipse.ui.themes">
+		<theme
+			id="org.eclipse.ui.ide.systemDefault">
+			<colorOverride
+				id="content_assist_proposals_background"
+				value="COLOR_LIST_BACKGROUND">
+			</colorOverride>
+			<colorOverride
+				id="content_assist_proposals_foreground"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="content_assist_parameters_background"
+				value="COLOR_LIST_BACKGROUND">
+			</colorOverride>
+			<colorOverride
+				id="content_assist_parameters_foreground"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+		</theme>
+		<colorDefinition
+			id="content_assist_proposals_background"
+			isEditable="false"
+			label="%Colors.content_assist_proposals_background"
+			value="255,255,255">
+		</colorDefinition>
+		<colorDefinition
+			id="content_assist_proposals_foreground"
+			isEditable="false"
+			label="%Colors.content_assist_proposals_foreground"
+			value="0,0,0">
+		</colorDefinition>
+		<colorDefinition
+			id="content_assist_parameters_background"
+			isEditable="false"
+			label="%Colors.content_assist_parameters_background"
+			value="255,255,255">
+		</colorDefinition>
+		<colorDefinition
+			id="content_assist_parameters_foreground"
+			isEditable="false"
+			label="%Colors.content_assist_parameters_foreground"
+			value="0,0,0">
+		</colorDefinition>
+	</extension>
+	
+</plugin>
+
diff --git a/bundles/org.eclipse.wst.sse.ui/reexport-info.txt b/bundles/org.eclipse.wst.sse.ui/reexport-info.txt
new file mode 100644
index 0000000..9c8c7c7
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/reexport-info.txt
@@ -0,0 +1,4 @@
+we reexport eclipse.ui.editors 
+since one of our APIs, StructuredSourceViewerConfiguration 
+requires it. 
+
diff --git a/bundles/org.eclipse.wst.sse.ui/schema/characterPairing.exsd b/bundles/org.eclipse.wst.sse.ui/schema/characterPairing.exsd
new file mode 100644
index 0000000..f6b731e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/characterPairing.exsd
@@ -0,0 +1,131 @@
+<?xml version='1.0' encoding='UTF-8'?>

+<!-- Schema file written by PDE -->

+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">

+<annotation>

+      <appInfo>

+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="characterPairing" name="Character Pairing"/>

+      </appInfo>

+      <documentation>

+         [Enter description of this extension point.]

+      </documentation>

+   </annotation>

+

+   <element name="extension">

+      <annotation>

+         <appInfo>

+            <meta.element />

+         </appInfo>

+      </annotation>

+      <complexType>

+         <sequence>

+            <element ref="inserter" minOccurs="0" maxOccurs="unbounded"/>

+         </sequence>

+         <attribute name="point" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="name" type="string">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+               <appInfo>

+                  <meta.attribute translatable="true"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="inserter">

+      <complexType>

+         <sequence>

+            <element ref="contentTypeIdentifier" minOccurs="1" maxOccurs="unbounded"/>

+         </sequence>

+         <attribute name="class" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+               <appInfo>

+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.sse.ui.AbstractCharacterPairInserter:"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+         <attribute name="id" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="contentTypeIdentifier">

+      <complexType>

+         <attribute name="id" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="partitions" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="since"/>

+      </appInfo>

+      <documentation>

+         [Enter the first release in which this extension point appears.]

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="examples"/>

+      </appInfo>

+      <documentation>

+         [Enter extension point usage example here.]

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="apiinfo"/>

+      </appInfo>

+      <documentation>

+         [Enter API information here.]

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="implementation"/>

+      </appInfo>

+      <documentation>

+         [Enter information about supplied implementation of this extension point.]

+      </documentation>

+   </annotation>

+

+

+</schema>

diff --git a/bundles/org.eclipse.wst.sse.ui/schema/commentingStrategy.exsd b/bundles/org.eclipse.wst.sse.ui/schema/commentingStrategy.exsd
new file mode 100644
index 0000000..57b4d68
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/commentingStrategy.exsd
@@ -0,0 +1,260 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="commentingStrategy" name="Commenting Strategy"/>
+      </appInfo>
+      <documentation>
+         This extension point allows the contribution of commenting strategy&apos;s to participate in the commenting actions, such as adding and removing commenting blocks and toggling line comments.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <choice minOccurs="1" maxOccurs="unbounded">
+               <element ref="blockCommentingStrategy" minOccurs="0" maxOccurs="unbounded"/>
+               <element ref="lineCommentingStrategy" minOccurs="0" maxOccurs="unbounded"/>
+            </choice>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="blockCommentingStrategy">
+      <annotation>
+         <documentation>
+            Defines a block commenting strategy
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="contentType"/>
+         </sequence>
+         <attribute name="prefix" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The prefix of the block comment this strategy impliments
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="suffix" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The suffix of the block comment this strategy impliments
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="lineCommentingStrategy">
+      <annotation>
+         <documentation>
+            Deefines a line commenting strategy
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="contentType"/>
+         </sequence>
+         <attribute name="prefix" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The prefix of the block comment this strategy impliments
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="contentType">
+      <annotation>
+         <documentation>
+            A content type that the strategy is applicable for
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence>
+            <choice>
+               <element ref="requiredPartitionTypes"/>
+               <element ref="allowablePartitionTypes"/>
+               <sequence>
+                  <element ref="requiredPartitionTypes"/>
+                  <element ref="allowablePartitionTypes"/>
+               </sequence>
+            </choice>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The ID of the content type
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="associatedCommentPartitionTypeID" type="string">
+            <annotation>
+               <documentation>
+                  The partition type ID of the comment partition that is associated with the strategy in this content type
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="requiredPartitionTypes">
+      <annotation>
+         <documentation>
+            List of partition types in the associated content type that are requried for the strategy to be applicable.  Only one of these partition types must be present in a selection for the strategy to be applicable.
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="partitionType"/>
+         </sequence>
+      </complexType>
+   </element>
+
+   <element name="allowablePartitionTypes">
+      <annotation>
+         <documentation>
+            The partition types that are allowed in a user selection for the strategy to be valid.  It is assumed that any partition types listed in the &lt;code&gt;requiredPartitionTypes&lt;/code&gt; are also allowable.  This list is ignored if the value of &lt;code&gt;anyPartitionType&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;.  If this list is not provided then it is assumed the value of &lt;code&gt;anyPartitionType&lt;/code&gt; is false.
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="0" maxOccurs="unbounded">
+            <element ref="partitionType"/>
+         </sequence>
+         <attribute name="anyPartitionType" type="boolean" use="default" value="false">
+            <annotation>
+               <documentation>
+                  If &lt;code&gt;true&lt;/code&gt; then the strategy is valid for any partition type in the associated &lt;code&gt;contentType&lt;/code&gt;, this means that any &lt;code&gt;partionType&lt;/code&gt;s listed here would be ignored.  If &lt;code&gt;false&lt;/code&gt; then only the &lt;code&gt;partitionType&lt;/code&gt;s listed here are allowed in a user selection (allong with any specified requried partition types) for the strategy to be valid.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="partitionType">
+      <annotation>
+         <documentation>
+            A partition type associated with the parenting content type
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The ID of the partition type.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;&lt;b&gt;Example 1:&lt;/b&gt; A simple example for block comments on XML documents&lt;/p&gt;&lt;pre&gt;&lt;extension point=&quot;org.eclipse.wst.sse.ui.commentingStrategy&quot;&gt;
+  &lt;blockCommentingStrategy
+      prefix=&quot;&amp;lt;!--&quot;
+      suffix=&quot;--&amp;gt;&quot;&gt;
+    &lt;contentType
+        id=&quot;org.eclipse.core.runtime.xml&quot;
+        associatedCommentPartitionTypeID=&quot;org.eclipse.wst.xml.XML_COMMENT&quot;&gt;
+      &lt;allowablePartitionTypes
+          anyPartitionType=&quot;true&quot;&gt;
+      &lt;/allowablePartitionTypes&gt;
+    &lt;/contentType&gt;
+  &lt;/blockCommentingStrategy&gt;
+&lt;/extension&gt;&lt;/pre&gt;
+
+&lt;p&gt;&lt;b&gt;Example 2:&lt;/b&gt; A more complex example for adding CSS comenting to both CSS and HTML documents&lt;/p&gt;&lt;pre&gt;&lt;extension point=&quot;org.eclipse.wst.sse.ui.commentingStrategy&quot;&gt;
+  &lt;blockCommentingStrategy
+      prefix=&quot;/*&quot;
+      suffix=&quot;*/&quot;&gt;
+    &lt;contentType
+        associatedCommentPartitionTypeID=&quot;org.eclipse.wst.css.COMMENT&quot;
+        id=&quot;org.eclipse.wst.css.core.csssource&quot;&gt;
+      &lt;allowablePartitionTypes
+          anyPartitionType=&quot;true&quot;&gt;
+      &lt;/allowablePartitionTypes&gt;
+    &lt;/contentType&gt;
+    &lt;contentType
+        id=&quot;org.eclipse.wst.html.core.htmlsource&quot;&gt;
+      &lt;allowablePartitionTypes
+          anyPartitionType=&quot;false&quot;&gt;
+      &lt;/allowablePartitionTypes&gt;
+      &lt;requiredPartitionTypes
+          requireAll=&quot;true&quot;&gt;
+        &lt;partitionType
+            id=&quot;org.eclipse.wst.css.STYLE&quot;&gt;
+        &lt;/partitionType&gt;
+      &lt;/requiredPartitionTypes&gt;
+    &lt;/contentType&gt;
+  &lt;/blockCommentingStrategy&gt;
+&lt;/extension&gt;&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         The user of this extension point does not need to impliment any classes themselves but for their contributions to work in any given content type then the following handlers must be registered for the content type in question by using the &lt;code&gt;org.eclipse.ui.handlers&lt;/code&gt; extension point.
+&lt;ul&gt;
+&lt;li&gt;&lt;code&gt;org.eclipse.wst.sse.ui.handlers.AddBlockCommentHandler&lt;/code&gt;&lt;/li&gt;
+&lt;li&gt;&lt;code&gt;org.eclipse.wst.sse.ui.handlers.RemoveBlockCommentHandler&lt;/code&gt;&lt;/li&gt;
+&lt;li&gt;&lt;code&gt;org.eclipse.wst.sse.ui.handlers.ToggleLineCommentHandler&lt;/code&gt;&lt;/li&gt;
+&lt;/ul&gt;
+      </documentation>
+   </annotation>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2010 IBM Corporation and others.
+All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.sse.ui/schema/completionProposal.exsd b/bundles/org.eclipse.wst.sse.ui/schema/completionProposal.exsd
new file mode 100644
index 0000000..e361555
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/completionProposal.exsd
@@ -0,0 +1,292 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="completionProposal" name="SSE Completion Proposal"/>
+      </appInfo>
+      <documentation>
+         This extension point allows the contribution of SSE completion proposal computers and categories to participate in the content assist process of SSE editors.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="name" />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <choice minOccurs="0" maxOccurs="unbounded">
+               <element ref="proposalCategory" minOccurs="0" maxOccurs="unbounded"/>
+               <element ref="proposalComputer" minOccurs="0" maxOccurs="unbounded"/>
+               <element ref="proposalComputerExtendedActivation" minOccurs="0" maxOccurs="unbounded"/>
+            </choice>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="proposalCategory">
+      <annotation>
+         <documentation>
+            A proposal category contribution defines categories of proposals used to group them in the UI.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique ID of the proposal category
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  The name of the proposal category.  If a name is not provided the proposal category ID will be used as the name.
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="icon" type="string">
+            <annotation>
+               <documentation>
+                  An optional icon of the category, which can be displayed in the user preferences
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="resource"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="proposalComputer">
+      <annotation>
+         <documentation>
+            A proposal computer contribution which is associated with at least one content type.
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="contentType" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique ID of the proposal computer.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  The human readable name of the proposal computer.  If none is given the ID of the proposal computer will be used.
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="icon" type="string">
+            <annotation>
+               <documentation>
+                  An optional icon of the computer, which will be used when creating the proposals suggested by this computer.  This preference can be programicly overwriten by the implimentation of &lt;code&gt;org.eclipse.wst.sse.ui.internal.provisional.contentassist.ICompletionProposalComputer&lt;/code&gt; specified by the &lt;tt&gt;class&lt;/tt&gt; attribute.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="resource"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The class that implements the contributed computer. The
+class must be public and implement
+&lt;code&gt;org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer&lt;/code&gt;
+and must have a public 0-argument constructor.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="activate" type="boolean" use="default" value="false">
+            <annotation>
+               <documentation>
+                  If the attribute is set to &lt;code&gt;true&lt;/code&gt; it will force this plug-in to be loaded on content assist invocation
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="categoryId" type="string" use="default" value="org.eclipse.wst.sse.ui.defaultProposalCategory">
+            <annotation>
+               <documentation>
+                  The id of a &lt;tt&gt;proposalCategory&lt;/tt&gt; that this proposal computer should be a part of
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="identifier" basedOn="org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="contentType">
+      <annotation>
+         <documentation>
+            A SSE content type. If no partition types are provided then computer will be associated with all partition types in the content type.
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="partitionType" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The ID of the content type
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="partitionType">
+      <annotation>
+         <documentation>
+            A SSE partition type.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The ID of the partition type.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="autoActivationDelegate" type="string">
+            <annotation>
+               <documentation>
+                  Identifies a class that is responsible for identifying auto-activation characters for the associated content and partition type.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.sse.ui.contentassist.AutoActivationDelegate:"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="proposalComputerExtendedActivation">
+      <annotation>
+         <documentation>
+            Used to extended the activation context of an already existing proposal computer.  Use this if there is a plugin A that has defined a proposal comptuer that should be activated for a content type defined in plugin B.
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="contentType" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The ID of the &lt;tt&gt;proposalComputer&lt;/tt&gt; whos activation context should be extended.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="identifier" basedOn="org.eclipse.wst.sse.ui.completionProposal/proposalComputer/@id"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;The following are examples of SSE completion proposal contributions:&lt;/p&gt;
+
+&lt;b&gt;Plugin A:&lt;/b&gt;&lt;pre&gt;&lt;extension point=&quot;org.eclipse.wst.sse.ui.completionProposal&quot;&gt;
+  &lt;proposalCategory
+      icon=&quot;icons/full/obj16/tag-macro.gif&quot;
+      id=&quot;org.eclipse.wst.xml.ui.proposalCategory.xmlTemplates&quot;
+      name=&quot;XML Templates&quot;&gt;
+  &lt;/proposalCategory&gt;
+  &lt;proposalComputer
+      activate=&quot;false&quot;
+      categoryId=&quot;org.eclipse.wst.xml.ui.proposalCategory.xmlTemplates&quot;
+      class=&quot;org.eclipse.wst.xml.ui.internal.contentassist.XMLTemplatesCompletionProposalComputer&quot;
+      id=&quot;org.eclipse.wst.xml.ui.proposalComputer.xmlTemplates&quot;&gt;
+    &lt;contentType
+        id=&quot;org.eclipse.core.runtime.xml&quot;&gt;
+    &lt;/contentType&gt;
+  &lt;/proposalComputer&gt;
+&lt;/extension&gt;&lt;/pre&gt;
+&lt;b&gt;Plugin B:&lt;/b&gt; (extending the activation context of an existing computer)&lt;pre&gt;&lt;extension point=&quot;org.eclipse.wst.sse.ui.completionProposal&quot;&gt;
+  &lt;proposalComputerExtendedActivation
+      id=&quot;org.eclipse.wst.xml.ui.proposalCategory.xmlTemplates&quot;&gt;
+    &lt;contentType
+        id=&quot;org.eclipse.jst.jsp.core.jspsource&quot;&gt;
+      &lt;partitionType
+          id=&quot;org.eclipse.wst.xml.XML_DEFAULT&quot;&gt;
+      &lt;/partitionType&gt;
+    &lt;/contentType&gt;
+  &lt;/proposalComputerExtendedActivation&gt;
+&lt;/extension&gt;&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         The contributed class must impliment &lt;code&gt;org.eclipse.wst.sse.ui.internal.provisional.contentassist.ICompletionProposalComputer&lt;/code&gt;
+      </documentation>
+   </annotation>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2010 IBM Corporation and others.
+All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.sse.ui/schema/completionProposalCategoriesConfiguration.exsd b/bundles/org.eclipse.wst.sse.ui/schema/completionProposalCategoriesConfiguration.exsd
new file mode 100644
index 0000000..c8f40f4
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/completionProposalCategoriesConfiguration.exsd
@@ -0,0 +1,126 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="completionProposalCategoriesConfiguration" name="Completion Proposal Categories Configuration"/>
+      </appInfo>
+      <documentation>
+         This extension point allows the contribution of completion proposal category configuration readers.  These are used to determine which completion categories contributed by &lt;tt&gt;org.eclipse.wst.sse.ui.completionProposal&lt;/tt&gt; extensions are turned on by preference (either programatic or user).  If a completion proposal category configuration reader exists for a given content type the reader will be consulted to determine which completion categories to use when generating completion proposals.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="name" />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="categoriesConfiguration" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="categoriesConfiguration">
+      <complexType>
+         <attribute name="contentTypeID" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The ID of the content type
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string">
+            <annotation>
+               <documentation>
+                  The class that impliments the contributed completion proposal categories configuration.  The class must be public and impliment either &lt;code&gt;org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader&lt;/code&gt; or &lt;code&gt;org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter&lt;/code&gt;.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;The following are examples of a SSE completion proposal computer contribution:&lt;/p&gt;
+&lt;pre&gt;&lt;extension
+    point=&quot;org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration&quot;&gt;
+  &lt;categoriesConfiguration
+    class=&quot;org.eclipse.wst.xml.ui.internal.preferences.XMLCompletionProposalCategoriesConfiguration&quot;
+    contentTypeID=&quot;org.eclipse.core.runtime.xml&quot;&gt;
+  &lt;/categoriesConfiguration&gt;
+&lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;The contributed class must impliment either &lt;code&gt;org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader&lt;/code&gt; or &lt;code&gt;org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter&lt;/code&gt;.&lt;/p&gt;
+
+&lt;p&gt;A reader implimentation should be used if the preferences can not be set by the user, if the preferences will be modified by the user then a writer implimentation should be used.&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         &lt;p&gt;See &lt;code&gt;org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration&lt;/code&gt; which if implimented by an adopter provides a usefull framework for reading and writing completion proposal categories configuration information to a preference store.&lt;/p&gt;
+
+&lt;p&gt;For a useful user interface for modifing completion proposal categories configurations see &lt;code&gt;org.eclipse.wst.sse.ui.preferences.CodeAssistCyclingConfigurationBlock&lt;/code&gt; which can easly be included on a preference page.&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2010 IBM Corporation and others.
+All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.sse.ui/schema/editorconfiguration.exsd b/bundles/org.eclipse.wst.sse.ui/schema/editorconfiguration.exsd
new file mode 100644
index 0000000..0f83484
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/editorconfiguration.exsd
@@ -0,0 +1,341 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="editorConfiguration" name="Editor Configuration"/>
+      </appInfo>
+      <documentation>
+         The SSE StructuredTextEditor is intended to be as flexible as possible.  Much of its design centers around the notion of defining and redefining its behavior and appearance based on the content type of its input.  This extension point allows clients to provide an editor configuration to the StructuredTextEditor without having to subclass the editor.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="sourceViewerConfiguration" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="contentOutlineConfiguration" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="propertySheetConfiguration" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="documentationTextHover" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="doubleClickStrategy" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="provisionalConfiguration" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="provisionalDefinition" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="quickOutlineConfiguration" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="sourceViewerConfiguration">
+      <annotation>
+         <documentation>
+            Defines the source viewer configuration, affecting syntax highlighting, content assist, hover help, and more in the current editor.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension, either an editor or content type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Must subclass org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration:"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="contentOutlineConfiguration">
+      <annotation>
+         <documentation>
+            Defines how the current editor&apos;s input maps to elements with in a Tree control, as well as selection filtering, toolbar and menu contributions, etc in the Outline view.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension, either an editor or content type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Must subclass org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration:"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="propertySheetConfiguration">
+      <annotation>
+         <documentation>
+            Defines how the current editor&apos;s input maps to properties in a Table control, as well as toolbar contributions, etc in the Properties view.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension, either an editor or content type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Must subclass org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration:"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="documentationTextHover">
+      <annotation>
+         <documentation>
+            Defines the text hover processor to use to display documentation information in a text hover. Note, in the event more than one documentation text hover is contributed for the same target partition type, the first one loaded will be the one used and all other contributions will be ignored.
+&lt;br /&gt;
+&lt;i&gt;Since 3.0&lt;/i&gt;
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension.  Must be a partition type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Must implement org.eclipse.jface.text.ITextHover
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jface.text.ITextHover"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="doubleClickStrategy">
+      <annotation>
+         <documentation>
+            Defines the doubleclick strategy to use when the user performs a mouse doubleclick.  Note, in the event more than one doubleclick strategy is contributed for the same target partition type, the first one loaded will be the one used and all other contributions will be ignored.
+&lt;br /&gt;
+&lt;i&gt;Since 3.0&lt;/i&gt;
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension.  Must be a partition type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Must implement org.eclipse.jface.text.ITextDoubleClickStrategy
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jface.text.ITextDoubleClickStrategy"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="provisionalConfiguration">
+      <annotation>
+         <documentation>
+            Declares a class fulfilling the requirements of a type to be used for the given target(s).
+Note: this is not API and is only used for provisional configuration types.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension, either an editor or content type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="type" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The type of configuration to find.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Implementation class for this type.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="provisionalDefinition">
+      <annotation>
+         <documentation>
+            Defines a value for a type to be used for the given target(s).
+Note: this is not API and is only used for provisional configuration types.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="type" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The type of definition to find.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="value" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The value of this definition.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension, either an editor or content type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="quickOutlineConfiguration">
+      <annotation>
+         <documentation>
+            Defines the configuration to be used when displaying editor input in the Tree layout for an editor&apos;s Quick Outline.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension, either an editor or content type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The class that provides implementation of the quick outline configuration.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.sse.ui.AbstractQuickOutlineConfiguration:"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         1.0
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension 
+         point=&quot;org.eclipse.wst.sse.ui.editorConfiguration&quot;&gt;
+      &lt;!-- associating a source viewer configuration to an input&apos;s content type--&gt;
+      &lt;sourceViewerConfiguration
+            class=&quot;org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML&quot;
+            target=&quot;org.eclipse.wst.html.core.htmlsource&quot;/&gt;
+      &lt;!-- associating an outline configuration to an input&apos;s content type --&gt;
+      &lt;contentOutlineConfiguration
+           class=&quot;org.eclipse.wst.sse.xml.ui.views.contentoutline.XMLContentOutlineConfiguration&quot;
+            target=&quot;org.eclipse.core.runtime.xml&quot;/&gt;
+      &lt;!-- associating a property sheet configuration to multiple content types --&gt;
+      &lt;propertySheetConfiguration
+            class=&quot;org.eclipse.wst.xml.ui.views.properties.XMLPropertySheetConfiguration&quot;
+            target=&quot;org.eclipse.wst.sse.contenttype.xml, org.eclipse.wst.html.core.htmlsource, org.eclipse.jst.jsp.core.jspsource&quot;/&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         see &lt;code&gt;org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration&lt;/code&gt;, &lt;code&gt;org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration&lt;/code&gt;, &lt;code&gt;org.eclipse.wst.sse.ui.views.properties.StructuredPropertySheetConfiguration&lt;/code&gt;.
+      </documentation>
+   </annotation>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005, 2007 IBM Corporation and others.
+All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.sse.ui/schema/org.eclipse.wst.sse.ui.breakpoint.exsd b/bundles/org.eclipse.wst.sse.ui/schema/org.eclipse.wst.sse.ui.breakpoint.exsd
new file mode 100644
index 0000000..0221b53
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/org.eclipse.wst.sse.ui.breakpoint.exsd
@@ -0,0 +1,148 @@
+<?xml version='1.0' encoding='UTF-8'?>

+<!-- Schema file written by PDE -->

+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">

+<annotation>

+      <appInfo>

+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="breakpoint" name="Breakpoint Providers"/>

+      </appInfo>

+      <documentation>

+         This extension point is provided to allow clients to provide support for adding their own breakpoint line markers with the StructuredTextEditor.

+      </documentation>

+   </annotation>

+

+   <element name="extension">

+      <annotation>

+         <appInfo>

+            <meta.element />

+         </appInfo>

+      </annotation>

+      <complexType>

+         <sequence>

+            <element ref="breakpointContribution" minOccurs="1" maxOccurs="unbounded"/>

+         </sequence>

+         <attribute name="point" type="string" use="required">

+            <annotation>

+               <documentation>

+                  a fully qualified identifier of the target extension point

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  an optional identifier of the extension instance

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="name" type="string">

+            <annotation>

+               <documentation>

+                  an optional name of the extension instance

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="provider">

+      <complexType>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  an optional identifier of the provider instance

+               </documentation>

+               <appInfo>

+                  <meta.attribute kind="identifier"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+         <attribute name="class" type="string" use="required">

+            <annotation>

+               <documentation>

+                  An implementor of org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider .

+               </documentation>

+               <appInfo>

+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+         <attribute name="contentTypes" type="string" use="required">

+            <annotation>

+               <documentation>

+                  A comma separated list of content type IDs for which this provider should be used.

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="breakpointContribution">

+      <complexType>

+         <choice>

+            <element ref="provider" minOccurs="1" maxOccurs="unbounded"/>

+         </choice>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  an optional identifier of the contribution

+               </documentation>

+               <appInfo>

+                  <meta.attribute kind="identifier"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="since"/>

+      </appInfo>

+      <documentation>

+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="examples"/>

+      </appInfo>

+      <documentation>

+         Example demonstrating how Java stratum breakpoints are contributed when editing JSPs and tag files.

+&lt;pre&gt;

+ &lt;extension point=&quot;org.eclipse.wst.sse.ui.breakpoint&quot;&gt;

+  &lt;breakpointContribution id=&quot;org.eclipse.jst.jsp.ui.providers&quot;&gt;

+   &lt;provider

+    contentTypes=&quot;org.eclipse.jst.jsp.core.jspsource, org.eclipse.jst.jsp.core.tagsource&quot;

+    id=&quot;org.eclipse.jst.jsp.ui.internal.breakpointproviders.JavaStratumBreakpointProvider&quot;&gt;

+    class=&quot;org.eclipse.jst.jsp.ui.internal.breakpointproviders.JavaStratumBreakpointProvider&quot;/&gt;

+  &lt;/breakpointContribution&gt;

+ &lt;/extension&gt;

+&lt;/pre&gt;

+      </documentation>

+   </annotation>

+

+

+   <annotation>

+      <appInfo>

+         <meta.section type="implementation"/>

+      </appInfo>

+      <documentation>

+         A full implementation is available in org.eclipse.jst.jsp.ui.internal.breakpointproviders.JavaStratumBreakpointProvider

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="copyright"/>

+      </appInfo>

+      <documentation>

+         Copyright (c) 2009 IBM Corporation and others.&lt;br&gt;

+All rights reserved. This program and the accompanying materials are made 

+available under the terms of the Eclipse Public License v1.0 which accompanies 

+this distribution, and is available at &lt;a

+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;

+      </documentation>

+   </annotation>

+

+</schema>

diff --git a/bundles/org.eclipse.wst.sse.ui/schema/org.eclipse.wst.sse.ui.sourcevalidation.exsd b/bundles/org.eclipse.wst.sse.ui/schema/org.eclipse.wst.sse.ui.sourcevalidation.exsd
new file mode 100644
index 0000000..ee02eba
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/org.eclipse.wst.sse.ui.sourcevalidation.exsd
@@ -0,0 +1,191 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="sourcevalidation" name="Source Validation"/>
+      </appInfo>
+      <documentation>
+         This extension point is provided to allow clients to contribute a validator (&lt;code&gt;org.eclipse.wst.validation.internal.provisional.core.IValidator&lt;/code&gt;)
+for as-you-type (source) validation.&lt;br&gt;
+
+If your validator can handle &quot;partial document&quot; validation, it should also implement ISourceValidator.  The validate call on ISourceValidator gets passed an IRegion representation of the part of the document that&apos;s dirty.&lt;br&gt;
+
+This should be much more efficient than validating the entire file each time someone types.&lt;br&gt;
+
+The validator is enabled for specific content type/partition combinations.&lt;br&gt;
+
+Required plugins are:&lt;br&gt;
+   org.eclipse.wst.sse.ui&lt;br&gt;
+   org.eclipse.wst.validation
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="validator"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="validator">
+      <complexType>
+         <sequence>
+            <element ref="contentTypeIdentifier" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="scope" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Either &quot;total&quot; or &quot;partial&quot;, depending on whether all or just some of the document should be revalidated on changes.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="partitionType">
+      <complexType>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="contentTypeIdentifier">
+      <complexType>
+         <sequence>
+            <element ref="partitionType" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         Example demonstrating how HTMLValidator contributes to as-you-type validation in the source editor.
+
+&lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.wst.sse.ui.extensions.sourcevalidation&quot;&gt;
+      &lt;validator
+            scope=&quot;total&quot;
+            class=&quot;org.eclipse.wst.validation.html.HTMLValidator&quot;
+            id=&quot;org.eclipse.wst.validation.htmlsourcevalidator&quot;&gt;
+         &lt;contentTypeIdentifier
+               id=&quot;org.eclipse.wst.html.core.htmlsource&quot;&gt;
+            &lt;partitionType
+                  id=&quot;org.eclipse.wst.html.HTML_DEFAULT&quot;/&gt;
+         &lt;/contentTypeIdentifier&gt;
+         &lt;contentTypeIdentifier
+               id=&quot;org.eclipse.jst.jsp.core.jspsource&quot;&gt;
+            &lt;partitionType
+                  id=&quot;org.eclipse.wst.html.HTML_DEFAULT&quot;/&gt;
+         &lt;/contentTypeIdentifier&gt;
+      &lt;/validator&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;p&gt;
+Using ISourceValidator
+&lt;/p&gt;
+&lt;p&gt;
+If your validator can handle &quot;partial document&quot; validation, it should  implement ISourceValidator.  
+&lt;/p&gt;
+&lt;p&gt;
+The validate call on ISourceValidator gets passed an IRegion of the document which represents just the part that&apos;s dirty.  This should be much more efficient than validating the entire file each time someone types.
+&lt;/p&gt;
+&lt;p&gt;
+ISourceValidator has its &quot;connect(IDocument doc)&quot; method called when it&apos;s hooked up to the document (when the editor is opened), and &quot;disconnect(IDocument doc)&quot; called when the editor is closed, where any &quot;unhooking&quot; should take place.
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         Currently there is no supplied implementation for IValidator.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
+All rights reserved. This program and the accompanying materials are made 
+available under the terms of the Eclipse Public License v1.0 which accompanies 
+this distribution, and is available at &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.sse.ui/schema/quickFixProcessor.exsd b/bundles/org.eclipse.wst.sse.ui/schema/quickFixProcessor.exsd
new file mode 100644
index 0000000..188711c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/quickFixProcessor.exsd
@@ -0,0 +1,135 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="quickFixProcessor" name="Quick Fix Processor"/>
+      </appinfo>
+      <documentation>
+         This extension point is used to associate a quick assist processor in Structured Text Editors with a specific &quot;kind&quot; of problem (a marker or annotation of a certain type or having certain attribute values).
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="quickFixProcessor" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="quickFixProcessor">
+      <complexType>
+         <sequence>
+            <element ref="attribute" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="problemType" type="string">
+            <annotation>
+               <documentation>
+                  the problem type for which this quick fix processor applies to.  To set the problem type for an annotation or marker, create a &quot;problemType&quot; attribute for the annotation/marker and set a value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  the name of the class implementing IQuickAssistProcessor
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jface.text.quickassist.IQuickAssistProcessor"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="attribute">
+      <complexType>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  the name of the attribute whose value is being specified.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="value" type="string">
+            <annotation>
+               <documentation>
+                  the specified value of the attribute.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         3.0
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         &lt;br /&gt;
+&amp;lt;extension point=&quot;org.eclipse.wst.sse.ui.quickFixProcessor&quot;&amp;gt;&lt;br /&gt;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;quickFixProcessor&lt;br /&gt;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class=&quot;org.eclipse.wst.sse.ui.examples.quickfixes.ExampleQuickAssistProcessor&quot;&lt;br /&gt;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;problemType=&quot;org.eclipse.wst.sse.ui.examples.quickfixes.problem&quot;&amp;gt;&lt;br /&gt;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;attribute name=&quot;anAttributeKey&quot; value=&quot;attribute value&quot;/&amp;gt;&lt;br /&gt;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/quickFixProcessor&amp;gt;&lt;br /&gt;
+ &amp;lt;/extension&amp;gt;&lt;br /&gt;
+
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         Provisional API: This class/interface is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback  from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.
+      </documentation>
+   </annotation>
+
+
+   <annotation>
+      <appinfo>
+         <meta.section type="copyright"/>
+      </appinfo>
+      <documentation>
+         Copyright (c) 2008 IBM Corporation and others.
+All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.sse.ui/schema/semanticHighlighting.exsd b/bundles/org.eclipse.wst.sse.ui/schema/semanticHighlighting.exsd
new file mode 100644
index 0000000..b14a843
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/semanticHighlighting.exsd
@@ -0,0 +1,125 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.sse.ui" id="semanticHighlighting" name="Semantic Highlighting"/>
+      </appInfo>
+      <documentation>
+         The Semantic Highlighting extension point allows plug-ins to contribute rules to the Structured Source Editor&apos;s semantic highlighting framework. Semantic highlighting is performed as a second pass after syntax highlighting.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="highlighting" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="highlighting">
+      <complexType>
+         <attribute name="target" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A string defining when to use this extension.  It is the content type id.  Multiple targets may be given as a comma delimited value.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Must implement org.eclipse.wst.sse.ui.ISemanticHighlighting to provide basic semantic highlighting information.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.sse.ui.ISemanticHighlighting"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="styleStringKey" type="string">
+            <annotation>
+               <documentation>
+                  The preference key that controls the style of the semantic highlighting. The style&apos;s value should be in the form: RGB foreground (#rrggbb) | RGB background (#rrggbb) | bold (true/false) | italic (true/false) | strikethrough (true/false) | underline (true/false)
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         3.1
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is the declaration of a semantic highlighting that is effective on org.eclipse.core.runtime.xml and org.eclipse.wst.xml.core.xmlsource content types. The &lt;code&gt;org.eclipse.wst.xml.ui.internal.style.NamespaceHighlighting&lt;/code&gt; determines the consumable regions of the document.
+&lt;pre&gt;
+ &lt;extension point=&quot;org.eclipse.wst.sse.ui.semanticHighlighting&quot;&gt;
+  &lt;highlighting
+        class=&quot;org.eclipse.wst.xml.ui.internal.style.NamespaceHighlighting&quot;
+        target=&quot;org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource&quot;&gt;
+  &lt;/highlighting&gt;
+ &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         See &lt;code&gt;org.eclipse.wst.sse.ui.ISemanticHighlighting&lt;/code&gt;
+      </documentation>
+   </annotation>
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2009 IBM Corporation and others.
+All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.sse.ui/src-encoding/org/eclipse/wst/sse/ui/internal/encoding/ui/EncodingPreferencePage.java b/bundles/org.eclipse.wst.sse.ui/src-encoding/org/eclipse/wst/sse/ui/internal/encoding/ui/EncodingPreferencePage.java
new file mode 100644
index 0000000..78e4162
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-encoding/org/eclipse/wst/sse/ui/internal/encoding/ui/EncodingPreferencePage.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.encoding.ui;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.sse.core.internal.encoding.util.CodedResourcePlugin;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+/**
+ * @deprecated - this should not be handled by the platform and not WTP
+ */
+
+public class EncodingPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+	Button fUse3ByteBOMWithUTF8CheckBox = null;
+
+	private Button createCheckBox(Composite parent, String label) {
+		Button button = new Button(parent, SWT.CHECK | SWT.LEFT | SWT.WRAP);
+		button.setText(label);
+
+		boolean selection = CodedResourcePlugin.getDefault().getPluginPreferences().getBoolean(CommonEncodingPreferenceNames.USE_3BYTE_BOM_WITH_UTF8);
+		button.setSelection(selection);
+
+		return button;
+	}
+
+	private Composite createComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+
+		//GridLayout
+		GridLayout layout = new GridLayout(1, true);
+		composite.setLayout(layout);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL_BOTH);
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		Composite composite = createComposite(parent);
+
+		String description = SSEUIMessages.EncodingPreferencePage_0; //$NON-NLS-1$
+		
+		// ISSUE: the following to lines look redundant, 
+		// not sure what was trying to be accomplished. 
+		// May be dead code. 
+		createLabel(composite, description);
+		createLabel(composite, ""); //$NON-NLS-1$
+
+		String checkBoxLabel = SSEUIMessages.EncodingPreferencePage_1; //$NON-NLS-1$
+		fUse3ByteBOMWithUTF8CheckBox = createCheckBox(composite, checkBoxLabel);
+
+		return composite;
+	}
+
+	private Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.LEFT);
+		label.setText(text);
+
+		return label;
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+	}
+
+	public void performDefaults() {
+		boolean defaultSelection = CodedResourcePlugin.getDefault().getPluginPreferences().getDefaultBoolean(CommonEncodingPreferenceNames.USE_3BYTE_BOM_WITH_UTF8);
+		fUse3ByteBOMWithUTF8CheckBox.setSelection(defaultSelection);
+	}
+
+	public boolean performOk() {
+		CodedResourcePlugin.getDefault().getPluginPreferences().setValue(CommonEncodingPreferenceNames.USE_3BYTE_BOM_WITH_UTF8, fUse3ByteBOMWithUTF8CheckBox.getSelection());
+		CodedResourcePlugin.getDefault().savePluginPreferences();
+
+		return true;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ConfigurationPointCalculator.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ConfigurationPointCalculator.java
new file mode 100644
index 0000000..1aa8ae4
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ConfigurationPointCalculator.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.part.MultiPageEditorSite;
+
+public class ConfigurationPointCalculator {
+	public static final String DESIGN = ".design"; //$NON-NLS-1$
+	public static final String SOURCE = ".source"; //$NON-NLS-1$
+
+	public static String[] getConfigurationPoints(IEditorPart part, String contentType, String subContext, Class rootClass) {
+		ConfigurationPointCalculator calculator = new ConfigurationPointCalculator();
+		calculator.setContentType(contentType);
+		calculator.setPart(part);
+		calculator.setRootClass(rootClass);
+		calculator.setSubContext(subContext);
+		return calculator.getConfigurationPoints();
+	}
+
+	protected String fContentType = null;
+	protected IWorkbenchPart fPart = null;
+
+	protected Class fRootClass = null;
+	protected String fSubContext = null;
+
+	/**
+	 * 
+	 */
+	public ConfigurationPointCalculator() {
+		super();
+	}
+
+	public String[] getConfigurationPoints() {
+		List points = new ArrayList(2);
+
+		IWorkbenchPartSite site = null;
+		if (fPart != null) {
+			site = fPart.getSite();
+			String id = site.getId();
+			if (id != null && id.length() > 0 && !id.equals(fRootClass.getName()))
+				points.add(id);
+			if (site instanceof MultiPageEditorSite) {
+				String multipageID = ((MultiPageEditorSite) site).getMultiPageEditor().getSite().getId();
+				if (!points.contains(multipageID))
+					points.add(multipageID);
+				String sourcePageID = ((MultiPageEditorSite) site).getMultiPageEditor().getSite().getId() + ".source"; //$NON-NLS-1$
+				if (!points.contains(sourcePageID))
+					points.add(sourcePageID);
+			}
+			if (site instanceof MultiPageEditorSite) {
+				String multipageClassName = ((MultiPageEditorSite) site).getMultiPageEditor().getClass().getName();
+				if (!points.contains(multipageClassName))
+					points.add(multipageClassName);
+			}
+			Class editorClass = fPart.getClass();
+			while (editorClass != null && fRootClass != null && !editorClass.equals(fRootClass)) {
+				if (!points.contains(editorClass.getName()))
+					points.add(editorClass.getName());
+				editorClass = editorClass.getSuperclass();
+			}
+		}
+
+		if (fContentType != null) {
+			IContentType contentType = Platform.getContentTypeManager().getContentType(fContentType);
+			while (contentType != null && !contentType.getId().equals(IContentTypeManager.CT_TEXT)) {
+				if (!points.contains(contentType.getId()))
+					points.add(contentType.getId());
+				contentType = contentType.getBaseType();
+			}
+		}
+
+		if (fRootClass != null && !points.contains(fRootClass.getName()))
+			points.add(fRootClass.getName());
+		return (String[]) points.toArray(new String[0]);
+	}
+
+	/**
+	 * @return Returns the contentType.
+	 */
+	public String getContentType() {
+		return fContentType;
+	}
+
+	/**
+	 * @return Returns the part.
+	 */
+	public IWorkbenchPart getPart() {
+		return fPart;
+	}
+
+	/**
+	 * @return Returns the rootClass.
+	 */
+	public Class getRootClass() {
+		return fRootClass;
+	}
+
+	/**
+	 * @return Returns the subContext.
+	 */
+	public String getSubContext() {
+		return fSubContext;
+	}
+
+	/**
+	 * @param contentType
+	 *            The contentType to set.
+	 */
+	public void setContentType(String contentType) {
+		fContentType = contentType;
+	}
+
+	/**
+	 * @param part
+	 *            The part to set.
+	 */
+	public void setPart(IWorkbenchPart part) {
+		fPart = part;
+	}
+
+	/**
+	 * @param rootClass
+	 *            The rootClass to set.
+	 */
+	public void setRootClass(Class rootClass) {
+		fRootClass = rootClass;
+	}
+
+	/**
+	 * @param subContext
+	 *            The subContext to set.
+	 */
+	public void setSubContext(String subContext) {
+		fSubContext = subContext;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ISelfValidateEditAction.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ISelfValidateEditAction.java
new file mode 100644
index 0000000..13dac00
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ISelfValidateEditAction.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions;
+
+
+
+/**
+ * This is a marker interface to control ValidateEdit call Usually framework
+ * calls IExtendedSimpleEditor#validateEdit() before calling
+ * IExtendedEditorAction's run() method. However, if the action implements
+ * this interface, framework won't call validateEdit() method.
+ * 
+ * The action should call validateEdit() at their own appropriate timing.
+ */
+public interface ISelfValidateEditAction {
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ISourceEditingTextTools.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ISourceEditingTextTools.java
new file mode 100644
index 0000000..d60a96f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/ISourceEditingTextTools.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions;
+
+
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * Interface to provide convenient functions for editors that may not be
+ * ITextEditors, but need to expose properties usually found in text editors
+ */
+public interface ISourceEditingTextTools {
+
+	/**
+	 * @return the document offset at which the Caret is located
+	 */
+	public int getCaretOffset();
+
+	/**
+	 * @return the IDocument being edited. If this editor supports multiple
+	 *         documents, the document currently possessing the caret will be
+	 *         returned.
+	 */
+	public IDocument getDocument();
+
+	/**
+	 * @return The IEditorPart instance for this editor that is known to the
+	 *         workbench.
+	 */
+	public IEditorPart getEditorPart();
+
+	/**
+	 * @return The current selection within the editor. Implementors may
+	 *         support other types of selection.
+	 */
+	public ITextSelection getSelection();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IBreakpointConstants.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IBreakpointConstants.java
new file mode 100644
index 0000000..bf6c9ae
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IBreakpointConstants.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint;
+
+/**
+ * @author pavery
+ */
+public interface IBreakpointConstants {
+	String ATTR_HIDDEN = "hidden"; //$NON-NLS-1$
+	/**
+	 * Setters of this attribute should use '/'for segment separators when
+	 * representing paths.
+	 */
+	String RESOURCE_PATH = "org.eclipse.wst.sse.ui.extensions.breakpoint.path"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IBreakpointProvider.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IBreakpointProvider.java
new file mode 100644
index 0000000..b10cdf1
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IBreakpointProvider.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+
+/**
+ * Interface to provide breakpoint creation
+ */
+public interface IBreakpointProvider {
+
+	/**
+	 * Adds breakpoint to specified position
+	 * 
+	 * @param document
+	 *            IDocument object
+	 * @param input
+	 *            current editor input, not necessarily an IFileEditorInput or
+	 *            linked to a resource in any way
+	 * @param lineNumber
+	 *            current line number
+	 * @param offset
+	 *            current caret offset
+	 * @throws CoreException
+	 * @return IStatus the status after being asked to add a breakpoint. The
+	 *         Severity of ERROR should only be used if the location
+	 *         information is both valid for a breakpoint and one could not be
+	 *         added.  Any severity greater than INFO will be logged, and if
+	 *         no breakpoints were created, shown to the user.
+	 */
+	IStatus addBreakpoint(IDocument document, IEditorInput input, int lineNumber, int offset) throws CoreException;
+
+	/**
+	 * Returns corresponding resource from editor input
+	 * 
+	 * @param input
+	 * @return IResource
+	 */
+	IResource getResource(IEditorInput input);
+
+	/**
+	 * Set ISourceEditingTextTools object
+	 * 
+	 * @param tool
+	 *            ISourceEditingTextTools object
+	 */
+	void setSourceEditingTextTools(ISourceEditingTextTools tool);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IExtendedStorageEditorInput.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IExtendedStorageEditorInput.java
new file mode 100644
index 0000000..5e5d7f5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/IExtendedStorageEditorInput.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint;
+
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.texteditor.IElementStateListener;
+
+public interface IExtendedStorageEditorInput extends IStorageEditorInput {
+	/**
+	 * Adds the given element state listener to this input. Has no effect if
+	 * an identical listener is already registered. Typically used by the
+	 * IDocumentProvider to register itself for change notification.
+	 * 
+	 * @param listener
+	 *            the listener
+	 */
+	void addElementStateListener(IElementStateListener listener);
+
+	/**
+	 * Removes the given element state listener from this input. Has no affect
+	 * if an identical listener is not registered.
+	 * 
+	 * @param listener
+	 *            the listener
+	 */
+	void removeElementStateListener(IElementStateListener listener);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/NodeLocation.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/NodeLocation.java
new file mode 100644
index 0000000..ff34c70
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/NodeLocation.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint;
+
+
+public interface NodeLocation {
+	/**
+	 * Returns the document end offset of the end tag, -1 of there is no end
+	 * tag
+	 * 
+	 * @return
+	 */
+	int getEndTagEndOffset();
+
+	/**
+	 * Returns the document start offset of the end tag, -1 of there is no end
+	 * tag
+	 * 
+	 * @return
+	 */
+	int getEndTagStartOffset();
+
+	/**
+	 * Returns the document end offset of the start tag, -1 of there is no
+	 * start tag
+	 * 
+	 * @return
+	 */
+	int getStartTagEndOffset();
+
+	/**
+	 * Returns the document start offset of the start tag, -1 of there is no
+	 * start tag
+	 * 
+	 * @return
+	 */
+	int getStartTagStartOffset();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/NullSourceEditingTextTools.java b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/NullSourceEditingTextTools.java
new file mode 100644
index 0000000..a926fa7
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-extensions/org/eclipse/wst/sse/ui/internal/provisional/extensions/breakpoint/NullSourceEditingTextTools.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+
+public class NullSourceEditingTextTools implements ISourceEditingTextTools {
+	public static final String ID = "sourceeditingtexttools"; //$NON-NLS-1$
+	private ITextEditor fTextEditor;
+
+	/**
+	 * @return
+	 */
+	public synchronized static ISourceEditingTextTools getInstance() {
+		return new NullSourceEditingTextTools();
+	}
+
+	private NullSourceEditingTextTools() {
+		super();
+	}
+
+	public int getCaretOffset() {
+		ISelection sel = fTextEditor.getSelectionProvider().getSelection();
+		if (sel instanceof ITextSelection) {
+			return ((ITextSelection) sel).getOffset();
+		}
+		return -1;
+	}
+
+	public IDocument getDocument() {
+		return fTextEditor.getDocumentProvider().getDocument(fTextEditor.getEditorInput());
+	}
+
+	public IEditorPart getEditorPart() {
+		return fTextEditor;
+	}
+
+	public ITextSelection getSelection() {
+		if (fTextEditor != null)
+			return (ITextSelection) fTextEditor.getSelectionProvider().getSelection();
+		return TextSelection.emptySelection();
+	}
+
+	public void setTextEditor(ITextEditor editor) {
+		fTextEditor = editor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/ExclusionsTab.java b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/ExclusionsTab.java
new file mode 100644
index 0000000..c6d9c5a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/ExclusionsTab.java
@@ -0,0 +1,374 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.sse.core.internal.SSECorePlugin;
+import org.eclipse.wst.sse.core.internal.tasks.FileTaskScannerRegistryReader;
+import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.util.Sorter;
+
+import com.ibm.icu.text.Collator;
+
+class ExclusionsTab implements IPreferenceTab {
+	private class ArrayTreeContentProvider implements ITreeContentProvider {
+		public ArrayTreeContentProvider() {
+			super();
+		}
+
+		public void dispose() {
+		}
+
+		public Object[] getChildren(Object parentElement) {
+			if (parentElement instanceof Object[])
+				return fContentTypeSorter.sort((Object[]) parentElement);
+			return new Object[0];
+		}
+
+		public Object[] getElements(Object inputElement) {
+			return getChildren(inputElement);
+		}
+
+		public Object getParent(Object element) {
+			return null;
+		}
+
+		public boolean hasChildren(Object element) {
+			return getChildren(element).length > 0;
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+	}
+
+	private class ContentTypeLabelProvider extends LabelProvider {
+		public String getText(Object element) {
+			if (element != null) {
+				Object o = element;
+				if (o instanceof String) {
+					o = fContentTypeManager.getContentType(o.toString());
+				}
+				if (o instanceof IContentType) {
+					return ((IContentType) o).getName();
+				}
+			}
+			return super.getText(element);
+		}
+	}
+
+	/**
+	 * A QuickSorter that sorts and returns a IContentType-typed array
+	 */
+	private class ContentTypeSorter extends Sorter {
+		private Collator collator = Collator.getInstance(Locale.ENGLISH);
+
+		public boolean compare(Object elementOne, Object elementTwo) {
+			return (collator.compare(((IContentType) elementOne).getName(), ((IContentType) elementTwo).getName())) < 0;
+		}
+
+		public Object[] sort(Object[] unSortedCollection) {
+			Object[] types = super.sort(unSortedCollection);
+			IContentType[] sortedTypes = new IContentType[types.length];
+			if (types.length > 0) {
+				System.arraycopy(types, 0, sortedTypes, 0, sortedTypes.length);
+			}
+			return sortedTypes;
+		}
+	}
+
+	private class ContentTypeTreeProvider implements ITreeContentProvider {
+		public ContentTypeTreeProvider() {
+			super();
+		}
+
+		public void dispose() {
+		}
+
+		boolean equals(Object left, Object right) {
+			return left == null ? right == null : ((right != null) && left.equals(right));
+		}
+
+		public Object[] getChildren(Object parentElement) {
+			if (parentElement instanceof Object[]) {
+				return (Object[]) parentElement;
+			}
+			if (parentElement instanceof IContentType) {
+				List elements = new ArrayList(0);
+				IContentType[] allTypes = fContentTypeManager.getAllContentTypes();
+				for (int i = 0; i < allTypes.length; i++) {
+					if (!fSupportedContentTypes.contains(allTypes[i]) && equals(allTypes[i].getBaseType(), parentElement)) {
+						elements.add(allTypes[i]);
+					}
+				}
+				return fContentTypeSorter.sort(elements.toArray());
+			}
+			return new Object[0];
+		}
+
+		public Object[] getElements(Object inputElement) {
+			return getChildren(inputElement);
+		}
+
+		public Object getParent(Object element) {
+			Object parent = null;
+			if (element instanceof IContentType) {
+				parent = ((IContentType) element).getBaseType();
+			}
+			return parent;
+		}
+
+		public boolean hasChildren(Object element) {
+			return getChildren(element).length > 0;
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+	}
+
+	/**
+	 * A QuickSorter that sorts and returns a String-typed array
+	 */
+	private class StringSorter extends Sorter {
+		Collator collator = Collator.getInstance(Locale.ENGLISH);
+
+		public boolean compare(Object elementOne, Object elementTwo) {
+			return (collator.compare(elementOne.toString(), elementTwo.toString()) < 0);
+		}
+
+		public Object[] sort(Object[] unSortedCollection) {
+			Object[] sortedCollection = super.sort(unSortedCollection);
+			String[] strings = new String[sortedCollection.length];
+			// copy the array so can return a new sorted collection
+			if (strings.length > 0) {
+				System.arraycopy(sortedCollection, 0, strings, 0, strings.length);
+			}
+			return strings;
+		}
+	}
+
+	private static final boolean _debugPreferences = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/preferences")); //$NON-NLS-1$ //$NON-NLS-2$
+
+	private CheckboxTreeViewer fContentTypeList;
+
+	private IContentTypeManager fContentTypeManager = null;
+
+	ContentTypeSorter fContentTypeSorter = new ContentTypeSorter();
+
+	private IContentType[] fIgnoreContentTypes = null;
+
+	private IContentType[] fOriginalIgnoreContentTypes = null;
+
+	private TaskTagPreferencePage fOwner = null;
+
+	private IScopeContext[] fPreferencesLookupOrder = null;
+
+	private IPreferencesService fPreferencesService = null;
+
+	private List fSupportedContentTypes = null;
+
+	public ExclusionsTab(TaskTagPreferencePage parent, IPreferencesService preferencesService, IScopeContext[] lookupOrder) {
+		super();
+		fOwner = parent;
+		fPreferencesLookupOrder = lookupOrder;
+		fPreferencesService = preferencesService;
+		fContentTypeManager = Platform.getContentTypeManager();
+
+		String[] supportedContentTypeIDs = FileTaskScannerRegistryReader.getInstance().getSupportedContentTypeIds();
+		fSupportedContentTypes = new ArrayList(supportedContentTypeIDs.length);
+		for (int i = 0; i < supportedContentTypeIDs.length; i++) {
+			IContentType type = fContentTypeManager.getContentType(supportedContentTypeIDs[i]);
+			if (type != null) {
+				fSupportedContentTypes.add(type);
+			}
+		}
+		String[] ignoreContentTypes = StringUtils.unpack(fPreferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED, SSECorePlugin.getDefault().getPluginPreferences().getDefaultString(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED), fPreferencesLookupOrder));
+		List contentTypes = new ArrayList();
+		for (int i = 0; i < ignoreContentTypes.length; i++) {
+			IContentType type = fContentTypeManager.getContentType(ignoreContentTypes[i]);
+			if (type != null) {
+				contentTypes.add(type);
+			}
+		}
+		fOriginalIgnoreContentTypes = fIgnoreContentTypes = (IContentType[]) contentTypes.toArray(new IContentType[contentTypes.size()]);
+	}
+
+	public Control createContents(Composite tabFolder) {
+		Composite composite = new Composite(tabFolder, SWT.NONE);
+		composite.setLayout(new GridLayout(2, true));
+		Text description = new Text(composite, SWT.READ_ONLY | SWT.SINGLE);
+		description.setText(SSEUIMessages.TaskTagExclusionTab_02);
+//		description.setBackground(composite.getBackground());
+
+		fContentTypeList = new CheckboxTreeViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+		fContentTypeList.setLabelProvider(new ContentTypeLabelProvider());
+		fContentTypeList.setContentProvider(new ArrayTreeContentProvider());
+
+		fContentTypeList.setInput(fSupportedContentTypes.toArray());
+		fContentTypeList.setCheckedElements(fSupportedContentTypes.toArray());
+		fContentTypeList.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+		for (int i = 0; i < fIgnoreContentTypes.length; i++) {
+			fContentTypeList.setChecked(fIgnoreContentTypes[i], false);
+		}
+
+		Button selectAll = new Button(composite, SWT.PUSH);
+		selectAll.setText(SSEUIMessages.TaskTagPreferenceTab_17);
+		selectAll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
+		selectAll.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				fContentTypeList.setCheckedElements(fSupportedContentTypes.toArray());
+			}
+		});
+
+		Button selectNone = new Button(composite, SWT.PUSH);
+		selectNone.setText(SSEUIMessages.TaskTagPreferenceTab_18);
+		selectNone.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
+		selectNone.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				fContentTypeList.setCheckedElements(new Object[0]);
+			}
+		});
+
+		new Label(composite, SWT.NONE).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
+
+		Text affectedTypesLabel = new Text(composite, SWT.READ_ONLY | SWT.SINGLE);
+		affectedTypesLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
+//		affectedTypesLabel.setBackground(composite.getBackground());
+		affectedTypesLabel.setText(SSEUIMessages.TaskTagExclusionTab_03);
+
+		final TreeViewer contentTypeTreeViewer = new TreeViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+		contentTypeTreeViewer.setLabelProvider(new ContentTypeLabelProvider());
+		contentTypeTreeViewer.setContentProvider(new ContentTypeTreeProvider());
+		contentTypeTreeViewer.setInput(new Object[0]);
+		contentTypeTreeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+
+		fContentTypeList.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if (event.getSelection() instanceof IStructuredSelection) {
+					Object[] o = ((IStructuredSelection) event.getSelection()).toArray();
+					contentTypeTreeViewer.setInput(o);
+					contentTypeTreeViewer.expandAll();
+					if (o.length > 0) {
+						contentTypeTreeViewer.reveal(o[0]);
+					}
+				}
+			}
+		});
+
+		return composite;
+	}
+
+	public String getTitle() {
+		return SSEUIMessages.TaskTagExclusionTab_01;
+	}
+
+	public void performApply() {
+		save();
+	}
+
+	public void performDefaults() {
+		if (_debugPreferences) {
+			System.out.println("Loading defaults in " + getClass().getName()); //$NON-NLS-1$
+		}
+		IEclipsePreferences[] defaultPreferences = new IEclipsePreferences[fPreferencesLookupOrder.length - 1];
+		for (int i = 1; i < defaultPreferences.length; i++) {
+			defaultPreferences[i - 1] = fPreferencesLookupOrder[i].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE);
+		}
+		String[] defaultIgnoreTypes = StringUtils.unpack(fPreferencesService.get(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED, null, defaultPreferences)); //$NON-NLS-1$
+
+		List contentTypes = new ArrayList();
+		for (int i = 0; i < defaultIgnoreTypes.length; i++) {
+			IContentType type = fContentTypeManager.getContentType(defaultIgnoreTypes[i]);
+			if (type != null) {
+				contentTypes.add(type);
+			}
+		}
+		fIgnoreContentTypes = (IContentType[]) contentTypes.toArray(new IContentType[contentTypes.size()]);
+		fContentTypeList.setCheckedElements(fContentTypeManager.getAllContentTypes());
+		for (int i = 0; i < fIgnoreContentTypes.length; i++) {
+			fContentTypeList.setChecked(fIgnoreContentTypes[i], false);
+		}
+	}
+
+	public void performOk() {
+		List ignoredIds = save();
+		String[] ignoreIDs = (String[]) new StringSorter().sort(ignoredIds.toArray());
+		fIgnoreContentTypes = new IContentType[ignoreIDs.length];
+		for (int i = 0; i < ignoreIDs.length; i++) {
+			fIgnoreContentTypes[i] = fContentTypeManager.getContentType(ignoreIDs[i]);
+		}
+
+		if (!Arrays.equals(fOriginalIgnoreContentTypes, fIgnoreContentTypes)) {
+			fOwner.requestRedetection();
+		}
+		fOriginalIgnoreContentTypes = fIgnoreContentTypes;
+	}
+
+	private List save() {
+		List ignoredIds = new ArrayList();
+		List checked = Arrays.asList(fContentTypeList.getCheckedElements());
+		for (int i = 0; i < fSupportedContentTypes.size(); i++) {
+			if (!checked.contains(fSupportedContentTypes.get(i))) {
+				ignoredIds.add(((IContentType) fSupportedContentTypes.get(i)).getId());
+			}
+		}
+		IEclipsePreferences[] defaultPreferences = new IEclipsePreferences[fPreferencesLookupOrder.length - 1];
+		for (int i = 1; i < defaultPreferences.length; i++) {
+			defaultPreferences[i - 1] = fPreferencesLookupOrder[i].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE);
+		}
+
+		String defaultIgnoredContentTypeIds = StringUtils.pack((String[]) new StringSorter().sort(StringUtils.unpack(fPreferencesService.get(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED, "", defaultPreferences)))); //$NON-NLS-1$
+		String ignoredContentTypeIds = StringUtils.pack((String[]) new StringSorter().sort(ignoredIds.toArray()));
+		if (ignoredContentTypeIds.equals(defaultIgnoredContentTypeIds)) {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED + " from scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).remove(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED);
+		}
+		else {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED + " \"" + ignoredContentTypeIds + "\" in scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).put(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED, ignoredContentTypeIds);
+		}
+		return ignoredIds;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/MainTab.java b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/MainTab.java
new file mode 100644
index 0000000..6b633a0
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/MainTab.java
@@ -0,0 +1,452 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *	   David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.sse.core.internal.provisional.tasks.TaskTag;
+import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+import com.ibm.icu.util.StringTokenizer;
+
+class MainTab implements IPreferenceTab {
+	public class TaskTagDialog extends Dialog {
+		public TaskTag taskTag = null;
+
+		Combo priorityCombo = null;
+		Text tagText = null;
+
+		public TaskTagDialog(Shell parentShell) {
+			super(parentShell);
+			setShellStyle(getShellStyle() | SWT.RESIZE);
+		}
+
+		protected void configureShell(Shell newShell) {
+			super.configureShell(newShell);
+			newShell.setText(SSEUIMessages.TaskTagPreferenceTab_5); //$NON-NLS-1$
+		}
+
+		protected Control createButtonBar(Composite parent) {
+			Control c = super.createButtonBar(parent);
+			getButton(IDialogConstants.OK_ID).setEnabled(taskTag == null || taskTag.getTag().length() > 0);
+			return c;
+		}
+
+		protected Control createDialogArea(Composite parent) {
+			Composite composite = new Composite(parent, SWT.NONE);
+			composite.setLayout(new GridLayout(2, false));
+			GridData gridData = new GridData(GridData.FILL_BOTH);
+			gridData.widthHint = parent.getDisplay().getClientArea().width / 5;
+			composite.setLayoutData(gridData);
+			Label label = new Label(composite, SWT.NONE);
+			label.setText(SSEUIMessages.TaskTagPreferenceTab_6); //$NON-NLS-1$
+			label.setLayoutData(new GridData());
+			tagText = new Text(composite, SWT.BORDER);
+			tagText.setText(taskTag != null ? taskTag.getTag() : ""); //$NON-NLS-1$
+			tagText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			tagText.addModifyListener(new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					String testTag = tagText.getText();
+					String[] tags = new String[fTaskTags.length];
+					for (int i = 0; i < tags.length; i++) {
+						tags[i] = fTaskTags[i].getTag();
+					}
+					getButton(IDialogConstants.OK_ID).setEnabled(tagText.getText().length() > 0 && !Arrays.asList(tags).contains(testTag));
+					taskTag = new TaskTag(tagText.getText(), priorityCombo.getSelectionIndex());
+				}
+			});
+
+			label = new Label(composite, SWT.NONE);
+			label.setText(SSEUIMessages.TaskTagPreferenceTab_7); //$NON-NLS-1$
+			label.setLayoutData(new GridData());
+			priorityCombo = new Combo(composite, SWT.READ_ONLY | SWT.SINGLE);
+			priorityCombo.setItems(new String[]{SSEUIMessages.TaskTagPreferenceTab_0, SSEUIMessages.TaskTagPreferenceTab_1, SSEUIMessages.TaskTagPreferenceTab_2});
+			priorityCombo.select(taskTag != null ? taskTag.getPriority() : TaskTag.PRIORITY_NORMAL);
+			priorityCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			priorityCombo.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					taskTag = new TaskTag(taskTag.getTag(), priorityCombo.getSelectionIndex());
+				}
+			});
+		    Dialog.applyDialogFont(parent);
+			return composite;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+		 */
+		protected void okPressed() {
+			taskTag = new TaskTag(tagText.getText(), priorityCombo.getSelectionIndex());
+			super.okPressed();
+		}
+	}
+
+	public class TaskTagTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+		public TaskTagTableLabelProvider() {
+			super();
+		}
+
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		public String getColumnText(Object element, int columnIndex) {
+			if (columnIndex < 1)
+				return ((TaskTag) element).getTag();
+			for (int i = 0; i < fTaskTags.length; i++) {
+				if (fTaskTags[i].equals(element)) {
+					if (fTaskTags[i].getPriority() == IMarker.PRIORITY_LOW) {
+						return SSEUIMessages.TaskTagPreferenceTab_0; //$NON-NLS-1$
+					}
+					else if (fTaskTags[i].getPriority() == IMarker.PRIORITY_HIGH) {
+						return SSEUIMessages.TaskTagPreferenceTab_2; //$NON-NLS-1$
+					}
+					else {
+						return SSEUIMessages.TaskTagPreferenceTab_1; //$NON-NLS-1$
+					}
+				}
+			}
+			return SSEUIMessages.TaskTagPreferenceTab_3; //$NON-NLS-1$
+		}
+	}
+
+	private static final boolean _debugPreferences = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/preferences")); //$NON-NLS-1$ //$NON-NLS-2$
+
+	private Control fControl;
+
+	private TaskTag[] fOriginalTaskTags;
+	private TaskTagPreferencePage fOwner = null;
+	private IScopeContext[] fPreferencesLookupOrder = null;
+
+	private IPreferencesService fPreferencesService = null;
+
+	private TaskTag[] fTaskTags;
+
+	private TableViewer valueTable = null;
+
+
+	public MainTab(TaskTagPreferencePage parent, IPreferencesService preferencesService, IScopeContext[] lookupOrder) {
+		super();
+		fOwner = parent;
+		fPreferencesLookupOrder = lookupOrder;
+		fPreferencesService = preferencesService;
+	}
+
+
+	private void addTag() {
+		TaskTagDialog dlg = new TaskTagDialog(fControl.getShell());
+		int result = dlg.open();
+		if (result == Window.OK) {
+			TaskTag newTag = dlg.taskTag;
+			List newTags = new ArrayList(Arrays.asList(fTaskTags));
+			newTags.add(newTag);
+			fTaskTags = (TaskTag[]) newTags.toArray(new TaskTag[newTags.size()]);
+			valueTable.setInput(fTaskTags);
+			valueTable.getTable().setSelection(fTaskTags.length - 1);
+		}
+	}
+
+	public Control createContents(Composite tabFolder) {
+		loadPreferenceValues();
+		fOriginalTaskTags = fTaskTags;
+
+		Composite composite = new Composite(tabFolder, SWT.NONE);
+		composite.setLayout(new GridLayout(2, false));
+		fControl = composite;
+
+		Text description = new Text(composite, SWT.READ_ONLY | SWT.SINGLE);
+		description.setText(SSEUIMessages.TaskTagPreferenceTab_33); //$NON-NLS-1$
+//		description.setBackground(composite.getBackground());
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=104403
+		Point sizeHint = description.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+		gd.widthHint = sizeHint.x;
+		description.setLayoutData(gd);
+
+		valueTable = new TableViewer(composite, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
+		valueTable.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+		TableColumn textColumn = new TableColumn(valueTable.getTable(), SWT.NONE, 0);
+		textColumn.setText(SSEUIMessages.TaskTagPreferenceTab_12); //$NON-NLS-1$
+		TableColumn priorityColumn = new TableColumn(valueTable.getTable(), SWT.NONE, 1);
+		priorityColumn.setText(SSEUIMessages.TaskTagPreferenceTab_13); //$NON-NLS-1$
+		valueTable.setContentProvider(new ArrayContentProvider());
+		valueTable.setLabelProvider(new TaskTagTableLabelProvider());
+		valueTable.getTable().setLinesVisible(true);
+		valueTable.getTable().setHeaderVisible(true);
+		TableLayout layout = new TableLayout();
+		layout.addColumnData(new ColumnWeightData(1, 140, true));
+		layout.addColumnData(new ColumnWeightData(1, 140, true));
+		valueTable.getTable().setLayout(layout);
+
+		Composite buttons = new Composite(composite, SWT.NONE);
+		buttons.setLayout(new GridLayout());
+		buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
+
+		final Button addButton = new Button(buttons, SWT.PUSH);
+		addButton.setText(SSEUIMessages.TaskTagPreferenceTab_14); //$NON-NLS-1$
+		addButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+		final Button editButton = new Button(buttons, SWT.PUSH);
+		editButton.setText(SSEUIMessages.TaskTagPreferenceTab_15); //$NON-NLS-1$
+		editButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+		final Button removeButton = new Button(buttons, SWT.PUSH);
+		removeButton.setText(SSEUIMessages.TaskTagPreferenceTab_16); //$NON-NLS-1$
+		removeButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+
+		editButton.setEnabled(false);
+		removeButton.setEnabled(false);
+
+		Label warning = new Label(composite, SWT.NONE);
+		warning.setLayoutData(new GridData());
+		warning.setText(SSEUIMessages.TaskTagPreferenceTab_19); //$NON-NLS-1$
+
+		final ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				ISelection selection = valueTable.getSelection();
+				editButton.setEnabled(((IStructuredSelection) selection).size() == 1);
+				removeButton.setEnabled(!selection.isEmpty());
+			}
+		};
+		valueTable.addPostSelectionChangedListener(selectionChangedListener);
+		addButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				addTag();
+				valueTable.getTable().setSelection(fTaskTags.length - 1);
+				selectionChangedListener.selectionChanged(null);
+			}
+		});
+		editButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				int i = valueTable.getTable().getSelectionIndex();
+				editTag(i);
+				if (i >= 0) {
+					valueTable.getTable().setSelection(i);
+					selectionChangedListener.selectionChanged(null);
+				}
+			}
+		});
+		removeButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				int i = valueTable.getTable().getSelectionIndex();
+				removeTags(valueTable.getSelection());
+				if (i >= 0 && i < fTaskTags.length) {
+					valueTable.getTable().setSelection(i);
+				}
+			}
+		});
+		valueTable.addDoubleClickListener(new IDoubleClickListener() {
+			public void doubleClick(DoubleClickEvent event) {
+				int i = valueTable.getTable().getSelectionIndex();
+				editTag(i);
+				if (i >= 0) {
+					valueTable.getTable().setSelection(i);
+					selectionChangedListener.selectionChanged(null);
+				}
+			}
+		});
+
+		valueTable.setInput(fTaskTags);
+
+		return composite;
+	}
+
+	/**
+	 * @param selection
+	 */
+	private void editTag(int i) {
+		if (i < 0) {
+			return;
+		}
+
+		int selection = valueTable.getTable().getSelectionIndex();
+		TaskTagDialog dlg = new TaskTagDialog(fControl.getShell());
+		dlg.taskTag = fTaskTags[selection];
+		int result = dlg.open();
+		if (result == Window.OK) {
+			fTaskTags[selection] = dlg.taskTag;
+			valueTable.refresh();
+		}
+	}
+
+	public String getTitle() {
+		return SSEUIMessages.TaskTagPreferenceTab_20;
+	}
+
+	private void loadPreferenceValues() {
+		String tags = fPreferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_TAGS, "", fPreferencesLookupOrder); //$NON-NLS-1$
+		String priorities = fPreferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, "", fPreferencesLookupOrder); //$NON-NLS-1$
+		loadTagsAndPrioritiesFrom(tags, priorities);
+	}
+
+	/**
+	 * @param tags
+	 * @param priorities
+	 */
+	private void loadTagsAndPrioritiesFrom(String tagString, String priorityString) {
+		String[] tags = StringUtils.unpack(tagString);
+
+		StringTokenizer toker = null;
+		List list = new ArrayList();
+
+		toker = new StringTokenizer(priorityString, ","); //$NON-NLS-1$
+		while (toker.hasMoreTokens()) {
+			Integer number = null;
+			try {
+				number = Integer.valueOf(toker.nextToken());
+			}
+			catch (NumberFormatException e) {
+				number = new Integer(IMarker.PRIORITY_NORMAL);
+			}
+			list.add(number);
+		}
+		Integer[] priorities = (Integer[]) list.toArray(new Integer[0]);
+
+		fTaskTags = new TaskTag[Math.min(tags.length, priorities.length)];
+		for (int i = 0; i < fTaskTags.length; i++) {
+			fTaskTags[i] = new TaskTag(tags[i], priorities[i].intValue());
+		}
+	}
+
+	public void performApply() {
+		save();
+
+		if (!Arrays.equals(fOriginalTaskTags, fTaskTags)) {
+			fOwner.requestRedetection();
+		}
+		fOriginalTaskTags = fTaskTags;
+	}
+
+	public void performDefaults() {
+		if (_debugPreferences) {
+			System.out.println("Loading defaults in " + getClass().getName()); //$NON-NLS-1$
+		}
+		IEclipsePreferences[] preferences = new IEclipsePreferences[fPreferencesLookupOrder.length];
+		for (int i = 0; i < preferences.length; i++) {
+			preferences[i] = fPreferencesLookupOrder[i].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE);
+		}
+		String tags = fPreferencesService.get(TaskTagPreferenceKeys.TASK_TAG_TAGS, null, preferences);
+		String priorities = fPreferencesService.get(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, null, preferences);
+		loadTagsAndPrioritiesFrom(tags, priorities);
+		int selection = valueTable.getTable().getSelectionIndex();
+		valueTable.setInput(fTaskTags);
+		valueTable.getTable().setSelection(selection);
+	}
+
+	public void performOk() {
+		performApply();
+	}
+
+	/**
+	 * @param selection
+	 */
+	private void removeTags(ISelection selection) {
+		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+		List taskTags = new ArrayList(Arrays.asList(fTaskTags));
+		taskTags.removeAll(structuredSelection.toList());
+		fTaskTags = (TaskTag[]) taskTags.toArray(new TaskTag[taskTags.size()]);
+		valueTable.setInput(fTaskTags);
+	}
+
+	private void save() {
+		IEclipsePreferences defaultPreferences = new DefaultScope().getNode(TaskTagPreferenceKeys.TASK_TAG_NODE);
+		String defaultTags = defaultPreferences.get(TaskTagPreferenceKeys.TASK_TAG_TAGS, null);
+		String defaultPriorities = defaultPreferences.get(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, null);
+
+		StringBuffer buf = new StringBuffer();
+		for (int i = 0; i < fTaskTags.length; i++) {
+			if (i > 0) {
+				buf.append(","); //$NON-NLS-1$
+			}
+			buf.append(fTaskTags[i].getTag());
+		}
+		String currentTags = buf.toString();
+		if (currentTags.equals(defaultTags) && !fPreferencesLookupOrder[0].getName().equals(DefaultScope.SCOPE)) {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_TAGS + " from scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).remove(TaskTagPreferenceKeys.TASK_TAG_TAGS);
+		}
+		else {
+			fOwner.requestRedetection();
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_TAGS + " \"" + currentTags + "\" in scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).put(TaskTagPreferenceKeys.TASK_TAG_TAGS, currentTags);
+		}
+
+		StringBuffer buf2 = new StringBuffer();
+		for (int i = 0; i < fTaskTags.length; i++) {
+			if (i > 0) {
+				buf2.append(","); //$NON-NLS-1$
+			}
+			buf2.append(String.valueOf(fTaskTags[i].getPriority()));
+		}
+		String priorities = buf2.toString();
+
+		if (priorities.equals(defaultPriorities) && !fPreferencesLookupOrder[0].getName().equals(DefaultScope.SCOPE)) {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PRIORITIES + " from scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).remove(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES);
+		}
+		else {
+			fOwner.requestRedetection();
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_PRIORITIES + " \"" + priorities + "\" in scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).put(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, priorities);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/PropertyPreferencePage.java b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/PropertyPreferencePage.java
new file mode 100644
index 0000000..11b85ad
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/PropertyPreferencePage.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.dialogs.ControlEnableState;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.dialogs.ListDialog;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.views.navigator.ResourceSorter;
+import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * Based loosley on org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage
+ */
+abstract class PropertyPreferencePage extends PropertyPage implements IWorkbenchPreferencePage {
+	private static final boolean _debugPreferences = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/preferences-properties")); //$NON-NLS-1$ //$NON-NLS-2$
+	/*
+	 * Disable link data, prevents the display of a "workspace" or "project"
+	 * settings link to prevent recursive dialog launching
+	 */
+	private static final Object DISABLE_LINK = "DISABLE_LINK"; //$NON-NLS-1$
+
+	private Map fData = null;
+
+	private Button fEnableProjectSettings;
+
+	private Link fProjectSettingsLink;
+
+	public PropertyPreferencePage() {
+		super();
+	}
+
+	public final void applyData(Object data) {
+		super.applyData(data);
+		if (data instanceof Map) {
+			fData = (Map) data;
+			updateLinkEnablement();
+		}
+	}
+
+	protected abstract Control createCommonContents(Composite composite);
+
+	public final Control createContents(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		GridLayout layout = new GridLayout();
+		composite.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		composite.setLayoutData(data);
+
+		Composite checkLinkComposite = new Composite(composite, SWT.NONE);
+		checkLinkComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		checkLinkComposite.setLayout(new GridLayout(2, false));
+
+		if (getProject() != null) {
+			fEnableProjectSettings = new Button(checkLinkComposite, SWT.CHECK);
+			fEnableProjectSettings.setText(SSEUIMessages.EnableProjectSettings); //$NON-NLS-1$//$NON-NLS-2$
+			fEnableProjectSettings.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+			boolean enabledForProject = createPreferenceScopes()[0].getNode(getPreferenceNodeQualifier()).getBoolean(getProjectSettingsKey(), false);
+			fEnableProjectSettings.setSelection(enabledForProject);
+		}
+		else {
+			Label spacer = new Label(checkLinkComposite, SWT.CHECK);
+			spacer.setLayoutData(new GridData());
+		}
+
+		fProjectSettingsLink = new Link(checkLinkComposite, SWT.NONE);
+		fProjectSettingsLink.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
+
+		/*
+		 * "element" should be a project, if null, link to per-project
+		 * properties
+		 */
+		if (getProject() != null) {
+			fProjectSettingsLink.setText("<a>" + SSEUIMessages.ConfigureWorkspaceSettings + "</a>"); //$NON-NLS-1$//$NON-NLS-2$
+		}
+		else {
+			fProjectSettingsLink.setText("<a>" + SSEUIMessages.ConfigureProjectSettings + "</a>"); //$NON-NLS-1$//$NON-NLS-2$
+		}
+
+		updateLinkEnablement();
+
+		fProjectSettingsLink.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				if (getProject() == null) {
+					openProjectSettings();
+				}
+				else {
+					openWorkspaceSettings();
+				}
+			}
+
+		});
+
+		if (getProject() != null) {
+			Label line = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
+			line.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+		}
+
+		final Control common = createCommonContents(composite);
+		common.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		if (fEnableProjectSettings != null) {
+			SelectionAdapter selectionAdapter = new SelectionAdapter() {
+				ControlEnableState enablements = null;
+
+				public void widgetSelected(SelectionEvent e) {
+					super.widgetSelected(e);
+					if (fEnableProjectSettings.getSelection()) {
+						if (enablements != null) {
+							enablements.restore();
+							enablements = null;
+						}
+					}
+					else {
+						enablements = ControlEnableState.disable(common);
+					}
+				}
+			};
+			selectionAdapter.widgetSelected(null);
+			fEnableProjectSettings.addSelectionListener(selectionAdapter);
+		}
+
+		applyDialogFont(composite);
+		return composite;
+	}
+
+	public void createControl(Composite parent) {
+		if (getProject() != null) {
+			noDefaultAndApplyButton();
+		}
+		super.createControl(parent);
+	}
+
+	protected IScopeContext[] createPreferenceScopes() {
+		IProject project = getProject();
+		if (project != null) {
+			return new IScopeContext[]{new ProjectScope(project), new InstanceScope(), new DefaultScope()};
+		}
+		return new IScopeContext[]{new InstanceScope(), new DefaultScope()};
+	}
+
+	protected abstract String getPreferenceNodeQualifier();
+
+	protected abstract String getPreferencePageID();
+
+	protected IProject getProject() {
+		if (getElement() != null) {
+			if (getElement() instanceof IProject) {
+				return (IProject) getElement();
+			}
+			Object adapter = getElement().getAdapter(IProject.class);
+			if (adapter instanceof IProject) {
+				return (IProject) adapter;
+			}
+			adapter = getElement().getAdapter(IResource.class);
+			if (adapter instanceof IProject) {
+				return (IProject) adapter;
+			}
+		}
+		return null;
+	}
+
+	protected abstract String getProjectSettingsKey();
+
+	protected abstract String getPropertyPageID();
+
+	protected boolean isElementSettingsEnabled() {
+		return fEnableProjectSettings != null && fEnableProjectSettings.getSelection();
+	}
+
+	void openProjectSettings() {
+		ListDialog dialog = new ListDialog(getShell()) {
+
+			protected Control createDialogArea(Composite container) {
+				Control area = super.createDialogArea(container);
+				getTableViewer().setSorter(new ResourceSorter(ResourceSorter.NAME));
+				return area;
+			}
+		};
+		dialog.setMessage(SSEUIMessages.PropertyPreferencePage_02);
+		dialog.setContentProvider(new IStructuredContentProvider() {
+			public void dispose() {
+			}
+
+			public Object[] getElements(Object inputElement) {
+				return ((IWorkspace) inputElement).getRoot().getProjects();
+			}
+
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+		});
+		dialog.setLabelProvider(new DecoratingLabelProvider(new WorkbenchLabelProvider(), SSEUIPlugin.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));
+		dialog.setInput(ResourcesPlugin.getWorkspace());
+		dialog.setTitle(SSEUIMessages.PropertyPreferencePage_01);
+		if (dialog.open() == Window.OK) {
+			Object[] result = dialog.getResult();
+			if (result.length > 0) {
+				IProject project = (IProject) dialog.getResult()[0];
+				Map data = new HashMap();
+				data.put(DISABLE_LINK, Boolean.TRUE);
+				PreferencesUtil.createPropertyDialogOn(getShell(), project, getPropertyPageID(), new String[]{getPropertyPageID()}, data).open();
+			}
+		}
+	}
+
+	void openWorkspaceSettings() {
+		Map data = new HashMap();
+		data.put(DISABLE_LINK, Boolean.TRUE);
+		PreferencesUtil.createPreferenceDialogOn(getShell(), getPreferencePageID(), new String[]{getPreferencePageID()}, data).open();
+	}
+
+	public boolean performOk() {
+		boolean ok = super.performOk();
+		IScopeContext[] preferenceScopes = createPreferenceScopes();
+		if (getProject() != null) {
+			if (isElementSettingsEnabled()) {
+				if (_debugPreferences) {
+					System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " (" + true + ") in scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+				}
+				preferenceScopes[0].getNode(getPreferenceNodeQualifier()).putBoolean(getProjectSettingsKey(), fEnableProjectSettings.getSelection());
+			}
+			else {
+				if (_debugPreferences) {
+					System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " from scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+				}
+				preferenceScopes[0].getNode(getPreferenceNodeQualifier()).remove(getProjectSettingsKey());
+			}
+		}
+		return ok;
+	}
+
+	private void updateLinkEnablement() {
+		if (fData != null && fProjectSettingsLink != null) {
+			fProjectSettingsLink.setEnabled(!Boolean.TRUE.equals(fData.get(DISABLE_LINK)));
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/TaskTagPreferencePage.java b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/TaskTagPreferencePage.java
new file mode 100644
index 0000000..cb1be0f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src-tasktags/org/eclipse/wst/sse/ui/internal/preferences/ui/TaskTagPreferencePage.java
@@ -0,0 +1,353 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.jface.dialogs.ControlEnableState;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.internal.tasks.TaskScanningScheduler;
+import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.ui.internal.preferences.TabFolderLayout;
+import org.osgi.service.prefs.BackingStoreException;
+
+public class TaskTagPreferencePage extends PropertyPreferencePage {
+
+	private static final boolean _debugPreferences = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/preferences")); //$NON-NLS-1$ //$NON-NLS-2$
+	// Remember the last displayed tab for convenience
+	private static final String TASK_TAG_LAST_TAB = "task-tag-last-tab"; //$NON-NLS-1$
+
+	private int detectionRequested = 0;
+
+	private Button fEnableCheckbox = null;
+
+	private boolean fEnableTaskTags = true;
+
+	private boolean fOriginalEnableTaskTags = true;
+
+	private IPreferencesService fPreferencesService = null;
+
+	private Button fRedetectButton;
+
+	private SelectionListener fTabEnablementListener;
+
+	private TabFolder fTabFolder;
+	private IPreferenceTab[] fTabs = null;
+
+	public TaskTagPreferencePage() {
+		super();
+		fPreferencesService = Platform.getPreferencesService();
+	}
+
+	protected void contributeButtons(Composite parent) {
+		if (getElement() == null) {
+			((GridLayout) parent.getLayout()).numColumns += 2;
+			fRedetectButton = new Button(parent, SWT.PUSH);
+			fRedetectButton.setText(SSEUIMessages.TaskTagPreferencePage_32); //$NON-NLS-1$
+			fRedetectButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_FILL));
+			fRedetectButton.setEnabled(true);
+			fRedetectButton.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					Job redetectJob = new Job(SSEUIMessages.TaskTagPreferenceTab_27) { //$NON-NLS-1$
+						public Object getAdapter(Class adapter) {
+							return null;
+						}
+
+						protected IStatus run(IProgressMonitor monitor) {
+							TaskScanningScheduler.refresh();
+							return Status.OK_STATUS;
+						}
+					};
+					redetectJob.schedule();
+				}
+			});
+			Label spacer = new Label(parent, SWT.NONE);
+			spacer.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER));
+		}
+		super.contributeButtons(parent);
+	}
+
+	protected Control createCommonContents(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout compositeLayout = new GridLayout();
+		compositeLayout.marginLeft = 0;
+		compositeLayout.marginRight = 0;
+		composite.setLayout(compositeLayout);
+
+		IScopeContext[] preferenceScopes = createPreferenceScopes();
+		fOriginalEnableTaskTags = fEnableTaskTags = fPreferencesService.getBoolean(getPreferenceNodeQualifier(), TaskTagPreferenceKeys.TASK_TAG_ENABLE, false, preferenceScopes);
+		fEnableCheckbox = new Button(composite, SWT.CHECK);
+		fEnableCheckbox.setSelection(fEnableTaskTags);
+		fEnableCheckbox.setText(SSEUIMessages.TaskTagPreferenceTab_31); //$NON-NLS-1$
+		fEnableCheckbox.setSelection(fEnableTaskTags);
+		fEnableCheckbox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_END, false, false, 1, 1));
+
+		fTabFolder = new TabFolder(composite, SWT.NONE);
+		fTabFolder.setLayout(new TabFolderLayout());
+		fTabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+
+		TabItem taskItem = new TabItem(fTabFolder, SWT.NONE);
+		MainTab mainTab = new MainTab(this, fPreferencesService, preferenceScopes);
+		taskItem.setText(mainTab.getTitle());
+		final Control taskTagsControl = mainTab.createContents(fTabFolder);
+		taskItem.setControl(taskTagsControl);
+
+		TabItem exclusionItem = new TabItem(fTabFolder, SWT.NONE);
+		ExclusionsTab exclusionsTab = new ExclusionsTab(this, fPreferencesService, preferenceScopes);
+		exclusionItem.setText(exclusionsTab.getTitle());
+		final Control exclusionControl = exclusionsTab.createContents(fTabFolder);
+		exclusionItem.setControl(exclusionControl);
+
+		fTabs = new IPreferenceTab[]{mainTab, exclusionsTab};
+
+		fTabEnablementListener = new SelectionAdapter() {
+			ControlEnableState[] lastEnableStates = null;
+
+			public void widgetSelected(SelectionEvent e) {
+				fEnableTaskTags = fEnableCheckbox.getSelection();
+				if (fEnableTaskTags) {
+					if (lastEnableStates != null) {
+						for (int i = 0; i < lastEnableStates.length; i++) {
+							if (lastEnableStates[i] != null) {
+								lastEnableStates[i].restore();
+							}
+						}
+						lastEnableStates = null;
+						fTabFolder.redraw();
+					}
+				}
+				else if (lastEnableStates == null) {
+					lastEnableStates = new ControlEnableState[fTabs.length + 1];
+					lastEnableStates[0] = ControlEnableState.disable(taskTagsControl);
+					lastEnableStates[1] = ControlEnableState.disable(exclusionControl);
+					if (fRedetectButton != null) {
+						lastEnableStates[2] = ControlEnableState.disable(fRedetectButton);
+					}
+				}
+			}
+		};
+		fTabEnablementListener.widgetSelected(null);
+		fEnableCheckbox.addSelectionListener(fTabEnablementListener);
+
+		// restore last selected tab
+		int activeTab = new DefaultScope().getNode(getPreferenceNodeQualifier()).getInt(TASK_TAG_LAST_TAB, 0);
+		if (activeTab > 0) {
+			fTabFolder.setSelection(activeTab);
+		}
+
+		SSEUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.PREFWEBX_TASKTAGS_HELPID);
+		return composite;
+	}
+
+	protected String getPreferenceNodeQualifier() {
+		return TaskTagPreferenceKeys.TASK_TAG_NODE;
+	}
+
+	protected String getPreferencePageID() {
+		return "org.eclipse.wst.sse.ui.preferences.tasktags";//$NON-NLS-1$
+
+	}
+
+	protected String getProjectSettingsKey() {
+		return TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT;
+	}
+
+	protected String getPropertyPageID() {
+		return "org.eclipse.wst.sse.ui.project.properties.tasktags";//$NON-NLS-1$
+	}
+
+	public String getTitle() {
+		return SSEUIMessages.TaskTagPreferenceTab_20; //$NON-NLS-1$
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+
+	public void performApply() {
+		super.performApply();
+		save();
+
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performApply();
+		}
+
+		promptForRedetectIfNecessary();
+	}
+
+	public void performDefaults() {
+		super.performDefaults();
+		IEclipsePreferences defaultPreferences = createPreferenceScopes()[1].getNode(getPreferenceNodeQualifier());
+		fEnableTaskTags = defaultPreferences.getBoolean(TaskTagPreferenceKeys.TASK_TAG_ENABLE, false);
+		fEnableCheckbox.setSelection(fEnableTaskTags);
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performDefaults();
+		}
+		fTabEnablementListener.widgetSelected(null);
+		if (_debugPreferences) {
+			System.out.println("Loading defaults in " + getClass().getName()); //$NON-NLS-1$
+		}
+	}
+
+	public boolean performOk() {
+		boolean ok = super.performOk();
+		save();
+
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performOk();
+		}
+
+		promptForRedetectIfNecessary();
+
+		// save last tab (use Default scope since it won't be persisted)
+		new DefaultScope().getNode(getPreferenceNodeQualifier()).putInt(TASK_TAG_LAST_TAB, fTabFolder.getSelectionIndex());
+
+		IScopeContext[] contexts = createPreferenceScopes();
+		// remove project-specific information if it's not enabled
+		if (getProject() != null && !isElementSettingsEnabled()) {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+			}
+			contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT);
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+			}
+			contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED);
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PRIORITIES + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+			}
+			contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES);
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_TAGS + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+			}
+			contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_TAGS);
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_ENABLE + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+			}
+			contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_ENABLE);
+		}
+		for (int i = 0; i < contexts.length; i++) {
+			try {
+				contexts[i].getNode(getPreferenceNodeQualifier()).flush();
+			}
+			catch (BackingStoreException e) {
+				Logger.logException("problem saving preference settings to scope " + contexts[i].getName(), e); //$NON-NLS-1$
+			}
+		}
+
+		return ok;
+	}
+
+
+	private void promptForRedetectIfNecessary() {
+		if (detectionRequested > 0) {
+			MessageDialog dialog = new MessageDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SSEUIMessages.TaskTagPreferenceTab_22, PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getImage(), SSEUIMessages.TaskTagPreferenceTab_23, MessageDialog.QUESTION, new String[]{SSEUIMessages.TaskTagPreferenceTab_24, SSEUIMessages.TaskTagPreferenceTab_25, SSEUIMessages.TaskTagPreferenceTab_26}, 2); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+			int button = dialog.open();
+			if (button == 0) {
+				Job redetectJob = new Job(SSEUIMessages.TaskTagPreferenceTab_27) { //$NON-NLS-1$
+					public Object getAdapter(Class adapter) {
+						return null;
+					}
+
+					protected IStatus run(IProgressMonitor monitor) {
+						if (getProject() == null) {
+							if (_debugPreferences) {
+								System.out.println(getClass().getName() + ": rescanning all"); //$NON-NLS-1$
+							}
+							TaskScanningScheduler.refresh();
+						}
+						else {
+							if (_debugPreferences) {
+								System.out.println(getClass().getName() + ": rescanning " + getProject()); //$NON-NLS-1$
+							}
+							TaskScanningScheduler.refresh(getProject());
+						}
+						return Status.OK_STATUS;
+					}
+				};
+				redetectJob.schedule(500);
+			}
+			detectionRequested = 0;
+		}
+	}
+
+	void requestRedetection() {
+		detectionRequested++;
+	}
+
+	private void save() {
+		if (fEnableTaskTags != fOriginalEnableTaskTags) {
+			requestRedetection();
+		}
+		fOriginalEnableTaskTags = fEnableTaskTags;
+
+		IScopeContext[] preferenceScopes = createPreferenceScopes();
+		IEclipsePreferences defaultPreferences = preferenceScopes[1].getNode(getPreferenceNodeQualifier());
+		boolean defaultEnable = defaultPreferences.getBoolean(TaskTagPreferenceKeys.TASK_TAG_ENABLE, false);
+		if (fEnableTaskTags == defaultEnable) {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_ENABLE + " from scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+			preferenceScopes[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_ENABLE);
+		}
+		else {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_ENABLE + " \"" + fEnableTaskTags + "\" in scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			preferenceScopes[0].getNode(getPreferenceNodeQualifier()).putBoolean(TaskTagPreferenceKeys.TASK_TAG_ENABLE, fEnableTaskTags);
+		}
+		if (getProject() != null && isElementSettingsEnabled()) {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " (" + true + ") in scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$  
+			}
+			preferenceScopes[0].getNode(getPreferenceNodeQualifier()).putBoolean(TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT, true);
+		}
+		else {
+			if (_debugPreferences) {
+				System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " from scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			preferenceScopes[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT);
+		}
+		try {
+			fPreferencesService.getRootNode().flush();
+		}
+		catch (BackingStoreException e) {
+			// log it, there is no recovery
+			Logger.logException(e);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/EditorExecutionContext.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/EditorExecutionContext.java
new file mode 100644
index 0000000..b40d9a5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/EditorExecutionContext.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.wst.sse.core.internal.IExecutionDelegate;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+class EditorExecutionContext implements IExecutionDelegate {
+
+	/**
+	 * Reusable runnable for the Display execution queue to cut down on
+	 * garbage creation. Will make use of the progress service if possible.
+	 */
+	private static class ReusableUIRunner implements Runnable, IRunnableWithProgress {
+		private StructuredTextEditor editor;
+		private ISafeRunnable fRunnable = null;
+
+		ReusableUIRunner(StructuredTextEditor part) {
+			super();
+			editor = part;
+		}
+
+		/*
+		 * Expected to only be run by Display queue in the UI Thread
+		 * 
+		 * @see java.lang.Runnable#run()
+		 */
+		public void run() {
+			IWorkbenchPartSite site = editor.getEditorPart().getSite();
+			final IWorkbenchWindow workbenchWindow = (site == null) ? null : site.getWorkbenchWindow();
+			final IWorkbenchSiteProgressService jobService = (IWorkbenchSiteProgressService) ((site == null) ? null : site.getAdapter(IWorkbenchSiteProgressService.class));
+			/*
+			 * Try to use the progress service so the workbench can give more
+			 * feedback to the user (although editors seem to make less use of
+			 * the service than views -
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=86221 .
+			 */
+			if (workbenchWindow != null && jobService != null) {
+				/*
+				 * Doc is ambiguous, but it must be run from the UI thread -
+				 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=165180
+				 */
+				try {
+					jobService.runInUI(workbenchWindow, this, (ISchedulingRule) editor.getEditorPart().getEditorInput().getAdapter(IResource.class));
+				}
+				catch (InvocationTargetException e) {
+					Logger.logException(e);
+				}
+				catch (InterruptedException e) {
+					Logger.logException(e);
+				}
+			}
+			else {
+				/*
+				 * Run it directly and direct the UI of the editor. See
+				 * StructuredTextEditor's begin/end background job for other
+				 * activities to best accommodate (for example, there is a
+				 * "timed delay" before the editor itself leaves
+				 * background-update mode). NOTE: this execute method itself
+				 * is always called from inside of an ILock block, so another
+				 * block is not not needed here for all these sycnExec's.
+				 */
+				IWorkbench workbench = SSEUIPlugin.getInstance().getWorkbench();
+				final Display display = workbench.getDisplay();
+				if (display != null && !display.isDisposed()) {
+					editor.beginBackgroundOperation();
+					try {
+						/*
+						 * Here's where the document update/modification
+						 * occurs
+						 */
+						SafeRunner.run(fRunnable);
+					}
+					finally {
+						/*
+						 * This 'end' is just a signal to editor that this
+						 * particular update is done. Its up to the editor to
+						 * decide exactly when to leave its "background mode"
+						 */
+						editor.endBackgroundOperation();
+					}
+				}
+				fRunnable = null;
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse
+		 * .core.runtime.IProgressMonitor)
+		 */
+		public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+			if (fRunnable != null)
+				SafeRunner.run(fRunnable);
+		}
+
+		void setRunnable(ISafeRunnable r) {
+			fRunnable = r;
+		}
+	}
+
+	StructuredTextEditor fEditor;
+	private ReusableUIRunner fReusableRunner;
+
+	public EditorExecutionContext(StructuredTextEditor editor) {
+		super();
+		fEditor = editor;
+		fReusableRunner = new ReusableUIRunner(fEditor);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.wst.sse.core.internal.IExecutionDelegate#execute(java.lang
+	 * .Runnable)
+	 */
+	public void execute(final ISafeRunnable runnable) {
+		IWorkbench workbench = SSEUIPlugin.getInstance().getWorkbench();
+		final Display display = workbench.getDisplay();
+		if (display.getThread() == Thread.currentThread()) {
+			// *If already in display thread, we can simply run, "as usual"*/
+			SafeRunner.run(runnable);
+		}
+		else {
+			// *otherwise run through the reusable runner */
+			fReusableRunner.setRunnable(runnable);
+			display.syncExec(fReusableRunner);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/EncodingSupport.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/EncodingSupport.java
new file mode 100644
index 0000000..fd054ef
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/EncodingSupport.java
@@ -0,0 +1,139 @@
+/*******************************************************************************

+ * Copyright (c) 2008 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.wst.sse.ui;

+

+import org.eclipse.ui.editors.text.DefaultEncodingSupport;

+import org.eclipse.ui.editors.text.IEncodingSupport;

+import org.eclipse.ui.texteditor.StatusTextEditor;

+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;

+

+/**

+ * An implementation that will try to use a <b>provisional</b> configuration

+ * if IEncodingSupport.class as a delegate. A delegate, if found, will be

+ * asked for encoding information before defaulting to the superclass

+ * implementation, but will be told to set the encoding after the superclass

+ * has. Delegates should not duplicate any functionality in the

+ * DefaultEncodingSupport implementation as they may be executed in addition

+ * to the default behavior.

+ */

+class EncodingSupport extends DefaultEncodingSupport {

+	private String[] fConfigurationPoints = null;

+	/** The editor this support is associated with. */

+	private StatusTextEditor fStatusTextEditor;

+

+	IEncodingSupport fSupportDelegate = null;

+

+	EncodingSupport(String[] configurationPoints) {

+		super();

+		fConfigurationPoints = configurationPoints;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see org.eclipse.ui.editors.text.DefaultEncodingSupport#dispose()

+	 */

+	public void dispose() {

+		super.dispose();

+

+		if (fSupportDelegate instanceof DefaultEncodingSupport) {

+			((DefaultEncodingSupport) fSupportDelegate).dispose();

+		}

+		fSupportDelegate = null;

+		fStatusTextEditor = null;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @seeorg.eclipse.ui.editors.text.DefaultEncodingSupport#

+	 * getDefaultEncoding()

+	 */

+	public String getDefaultEncoding() {

+		IEncodingSupport delegate = getEncodingSupportDelegate();

+		if (delegate != null) {

+			return delegate.getDefaultEncoding();

+		}

+

+		return super.getDefaultEncoding();

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see org.eclipse.ui.editors.text.DefaultEncodingSupport#getEncoding ()

+	 */

+	public String getEncoding() {

+		IEncodingSupport delegate = getEncodingSupportDelegate();

+		if (delegate != null) {

+			return delegate.getEncoding();

+		}

+

+		return super.getEncoding();

+	}

+

+	IEncodingSupport getEncodingSupportDelegate() {

+		if (fSupportDelegate == null) {

+			ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();

+			for (int i = 0; fSupportDelegate == null && i < fConfigurationPoints.length; i++) {

+				fSupportDelegate = (IEncodingSupport) builder.getConfiguration(IEncodingSupport.class.getName(), fConfigurationPoints[i]);

+			}

+		}

+		return fSupportDelegate;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.ui.editors.text.DefaultEncodingSupport#initialize(org.eclipse

+	 * .ui.texteditor.StatusTextEditor)

+	 */

+	public void initialize(StatusTextEditor textEditor) {

+		super.initialize(textEditor);

+		fStatusTextEditor = textEditor;

+

+		IEncodingSupport encodingSupportDelegate = getEncodingSupportDelegate();

+		if (encodingSupportDelegate instanceof DefaultEncodingSupport) {

+			((DefaultEncodingSupport) encodingSupportDelegate).initialize(textEditor);

+		}

+	}

+

+	void reinitialize(String[] configurationPoints) {

+		if (fSupportDelegate instanceof DefaultEncodingSupport) {

+			((DefaultEncodingSupport) fSupportDelegate).dispose();

+		}

+		fSupportDelegate = null;

+

+		fConfigurationPoints = configurationPoints;

+

+		IEncodingSupport encodingSupportDelegate = getEncodingSupportDelegate();

+		if (encodingSupportDelegate instanceof DefaultEncodingSupport) {

+			((DefaultEncodingSupport) encodingSupportDelegate).initialize(fStatusTextEditor);

+		}

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see org.eclipse.ui.editors.text.DefaultEncodingSupport#setEncoding

+	 * (java.lang.String, boolean)

+	 */

+	protected void setEncoding(String encoding, boolean overwrite) {

+		super.setEncoding(encoding, overwrite);

+

+		IEncodingSupport delegate = getEncodingSupportDelegate();

+		if (delegate != null && overwrite) {

+			delegate.setEncoding(encoding);

+		}

+	}

+}

diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/FoldingActionGroup.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/FoldingActionGroup.java
new file mode 100644
index 0000000..7291cef
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/FoldingActionGroup.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.source.projection.IProjectionListener;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.ui.actions.ActionGroup;
+import org.eclipse.ui.editors.text.IFoldingCommandIds;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.ui.texteditor.ResourceAction;
+import org.eclipse.ui.texteditor.TextOperationAction;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingStrategy;
+
+class FoldingActionGroup extends ActionGroup {
+	private static abstract class PreferenceAction extends ResourceAction implements IUpdate {
+		PreferenceAction(ResourceBundle bundle, String prefix, int style) {
+			super(bundle, prefix, style);
+		}
+	}
+
+	private ProjectionViewer fViewer;
+
+	private final PreferenceAction fToggle;
+	private final TextOperationAction fExpandAll;
+	private final IProjectionListener fProjectionListener;
+	private final TextOperationAction fCollapseAll;
+
+
+	/**
+	 * Creates a new projection action group for <code>editor</code>. If
+	 * the supplied viewer is not an instance of <code>ProjectionViewer</code>,
+	 * the action group is disabled.
+	 * 
+	 * @param editor
+	 *            the text editor to operate on
+	 * @param viewer
+	 *            the viewer of the editor
+	 */
+	public FoldingActionGroup(final ITextEditor editor, ITextViewer viewer) {
+		if (!(viewer instanceof ProjectionViewer)) {
+			fToggle = null;
+			fExpandAll = null;
+			fCollapseAll = null;
+			fProjectionListener = null;
+			return;
+		}
+
+		fViewer = (ProjectionViewer) viewer;
+
+		fProjectionListener = new IProjectionListener() {
+
+			public void projectionEnabled() {
+				update();
+			}
+
+			public void projectionDisabled() {
+				update();
+			}
+		};
+
+		fViewer.addProjectionListener(fProjectionListener);
+
+		fToggle = new PreferenceAction(SSEUIMessages.getResourceBundle(), "Projection_Toggle_", IAction.AS_CHECK_BOX) { //$NON-NLS-1$
+			public void run() {
+				IPreferenceStore store = SSEUIPlugin.getDefault().getPreferenceStore();
+				boolean current = store.getBoolean(AbstractStructuredFoldingStrategy.FOLDING_ENABLED);
+				store.setValue(AbstractStructuredFoldingStrategy.FOLDING_ENABLED, !current);
+			}
+
+			public void update() {
+				ITextOperationTarget target = (ITextOperationTarget) editor.getAdapter(ITextOperationTarget.class);
+
+				boolean isEnabled = (target != null && target.canDoOperation(ProjectionViewer.TOGGLE));
+				setEnabled(isEnabled);
+			}
+		};
+		
+		IPreferenceStore store = SSEUIPlugin.getDefault().getPreferenceStore();
+		boolean checked = store.getBoolean(AbstractStructuredFoldingStrategy.FOLDING_ENABLED);
+		fToggle.setChecked(checked);
+		fToggle.setActionDefinitionId(IFoldingCommandIds.FOLDING_TOGGLE);
+		editor.setAction("FoldingToggle", fToggle); //$NON-NLS-1$
+
+		fExpandAll = new TextOperationAction(SSEUIMessages.getResourceBundle(), "Projection_ExpandAll_", editor, ProjectionViewer.EXPAND_ALL, true); //$NON-NLS-1$
+		fExpandAll.setActionDefinitionId(IFoldingCommandIds.FOLDING_EXPAND_ALL);
+		editor.setAction("FoldingExpandAll", fExpandAll); //$NON-NLS-1$
+
+		fCollapseAll = new TextOperationAction(SSEUIMessages.getResourceBundle(), "Projection_CollapseAll_", editor, ProjectionViewer.COLLAPSE_ALL, true); //$NON-NLS-1$
+		fCollapseAll.setActionDefinitionId(IFoldingCommandIds.FOLDING_COLLAPSE_ALL);
+		editor.setAction("FoldingCollapseAll", fCollapseAll); //$NON-NLS-1$
+	}
+
+	/**
+	 * Returns <code>true</code> if the group is enabled.
+	 * 
+	 * <pre>
+	 *        Invariant: isEnabled() &lt;=&gt; fViewer and all actions are != null.
+	 * </pre>
+	 * 
+	 * @return <code>true</code> if the group is enabled
+	 */
+	protected boolean isEnabled() {
+		return fViewer != null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.actions.ActionGroup#dispose()
+	 */
+	public void dispose() {
+		if (isEnabled()) {
+			fViewer.removeProjectionListener(fProjectionListener);
+			fViewer = null;
+		}
+		super.dispose();
+	}
+
+	/**
+	 * Updates the actions.
+	 */
+	protected void update() {
+		if (isEnabled()) {
+			fToggle.update();
+			fToggle.setChecked(fViewer.isProjectionMode());
+			fExpandAll.update();
+			fCollapseAll.update();
+		}
+	}
+
+	/**
+	 * Fills the menu with all folding actions.
+	 * 
+	 * @param manager
+	 *            the menu manager for the folding submenu
+	 */
+	public void fillMenu(IMenuManager manager) {
+		if (isEnabled()) {
+			update();
+			manager.add(fToggle);
+			manager.add(fExpandAll);
+			manager.add(fCollapseAll);
+		}
+	}
+
+	/*
+	 * @see org.eclipse.ui.actions.ActionGroup#updateActionBars()
+	 */
+	public void updateActionBars() {
+		update();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/IContentSelectionProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/IContentSelectionProvider.java
new file mode 100644
index 0000000..84ab191
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/IContentSelectionProvider.java
@@ -0,0 +1,13 @@
+package org.eclipse.wst.sse.ui;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeViewer;
+
+/**
+ * Allows contributors to redefine a selection when provided with the current
+ * selection.
+ * 
+ */
+public interface IContentSelectionProvider {
+	ISelection getSelection(TreeViewer viewer, ISelection selection);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/ISemanticHighlighting.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/ISemanticHighlighting.java
new file mode 100644
index 0000000..f8193de
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/ISemanticHighlighting.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.Position;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+
+/**
+ * This interface defines preferences and consumability for semantic highlighting.
+ * The preference keys provided by the implementation are stored within the preference store
+ * provided by the implementation. When a region is consumable by the semantic highlighting,
+ * the implementation provides an array of positions to style.
+ * 
+ * @since 3.1
+ *
+ */
+public interface ISemanticHighlighting {
+	
+	/**
+	 * The preference key that controls the text's bold attribute for the semantic highlighting
+	 * @return the bold preference key
+	 */
+	public String getBoldPreferenceKey();
+	
+	/**
+	 * The preference key that controls the text's underline attribute for the semantic highlighting
+	 * @return the bold preference key
+	 */
+	public String getUnderlinePreferenceKey();
+	
+	/**
+	 * The preference key that controls the text's strikethrough attribute for the semantic highlighting
+	 * @return the bold preference key
+	 */
+	public String getStrikethroughPreferenceKey();
+	
+	/**
+	 * The preference key that controls the text's italic attribute for the semantic highlighting
+	 * @return the bold preference key
+	 */
+	public String getItalicPreferenceKey();
+	
+	/**
+	 * The preference key that controls the text's color attribute for the semantic highlighting
+	 * @return the bold preference key
+	 */
+	public String getColorPreferenceKey();
+	
+	/**
+	 * The preference store that maintains the preferences for the semantic highlighting
+	 * @return the bold preference key
+	 */
+	public IPreferenceStore getPreferenceStore();
+	
+	/**
+	 * The preference key that controls if the semantic highlighting is enabled
+	 * @return the bold preference key
+	 */
+	public String getEnabledPreferenceKey();
+
+	/**
+	 * @return the display name
+	 */
+	public String getDisplayName();
+
+	/**
+	 * Returns an array of positions iff the semantic highlighting consumes any part of the structured document region.
+	 * <p>
+	 * NOTE: Implementors are not allowed to keep a reference on the region or on any object
+	 * retrieved from the region.
+	 * </p>
+	 *
+	 * @param region the structured document region
+	 * @return an array of positions to consume iff the semantic highlighting consumes any part of the structured document region, otherwise null
+	 */
+	public Position[] consumes(IStructuredDocumentRegion region);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/ISemanticHighlightingExtension.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/ISemanticHighlightingExtension.java
new file mode 100644
index 0000000..b73398e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/ISemanticHighlightingExtension.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+
+/**
+ * Extends {@link org.eclipse.wst.sse.ui.ISemanticHighlighting} allowing clients to
+ * define consumability with respect to indexed regions containing the structured
+ * document region.
+ * 
+ */
+public interface ISemanticHighlightingExtension {
+
+	/**
+	 * Returns an array of positions iff the semantic highlighting consumes any part of the structured document region
+	 *
+	 * <p>
+	 * NOTE: Implementors are not allowed to keep a reference on the either regions or on any object
+	 * retrieved from the regions.
+	 * </p>
+	 *
+	 * @param documentRegion the structured document region
+	 * @param indexedRegion the indexed region that contains the <code>documentRegion</code>
+	 * @return an array of positions to consume iff the semantic highlighting consumes any part of the structured document region, otherwise null
+	 */
+	public Position[] consumes(IStructuredDocumentRegion documentRegion, IndexedRegion indexedRegion);
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredSourceViewerDecorationSupport.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredSourceViewerDecorationSupport.java
new file mode 100644
index 0000000..72486bd
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredSourceViewerDecorationSupport.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import org.eclipse.jface.text.source.AnnotationPainter;
+import org.eclipse.jface.text.source.IAnnotationAccess;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.ISharedTextColors;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
+
+class StructuredSourceViewerDecorationSupport extends SourceViewerDecorationSupport {
+	public StructuredSourceViewerDecorationSupport(ISourceViewer sourceViewer, IOverviewRuler overviewRuler, IAnnotationAccess annotationAccess, ISharedTextColors sharedTextColors) {
+		super(sourceViewer, overviewRuler, annotationAccess, sharedTextColors);
+	}
+
+	protected AnnotationPainter createAnnotationPainter() {
+		/*
+		 * The new squiggly drawer depends on the presentation reconciler to
+		 * draw its squiggles. Unfortunately, StructuredTextEditors cannot use
+		 * the presentation reconciler because it conflicts with its
+		 * highlighter. Overriding createAnnotationPainter so that it is
+		 * forced to use the old squiggly painter instead of the new one. See
+		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=201928
+		 */
+		AnnotationPainter painter = super.createAnnotationPainter();
+		// dont use new squiggly painter
+		painter.addTextStyleStrategy(AnnotationPreference.STYLE_SQUIGGLES, null);
+		// use old one
+		painter.addDrawingStrategy(AnnotationPreference.STYLE_SQUIGGLES, new AnnotationPainter.SquigglesStrategy());
+		// dont use new problem underline painter
+		painter.addTextStyleStrategy(AnnotationPreference.STYLE_PROBLEM_UNDERLINE, null);
+		// use old one
+		painter.addDrawingStrategy(AnnotationPreference.STYLE_PROBLEM_UNDERLINE, new AnnotationPainter.SquigglesStrategy());
+		return painter;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextEditor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextEditor.java
new file mode 100644
index 0000000..67b939f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextEditor.java
@@ -0,0 +1,3655 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.text.AbstractInformationControlManager;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IBlockTextSelection;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ISelectionValidator;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension;
+import org.eclipse.jface.text.ITextViewerExtension2;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.text.contentassist.ContentAssistEvent;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.ICompletionListener;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.information.IInformationPresenter;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.InformationPresenter;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ContentAssistantFacade;
+import org.eclipse.jface.text.source.DefaultCharacterPairMatcher;
+import org.eclipse.jface.text.source.ICharacterPairMatcher;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.LineChangeHover;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.VerifyKeyListener;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.editors.text.ITextEditorHelpContextIds;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.help.IWorkbenchHelpSystem;
+import org.eclipse.ui.part.IShowInTargetList;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+import org.eclipse.ui.texteditor.DefaultRangeIndicator;
+import org.eclipse.ui.texteditor.IAbstractTextEditorHelpContextIds;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.IStatusField;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.ITextEditorExtension;
+import org.eclipse.ui.texteditor.ITextEditorExtension2;
+import org.eclipse.ui.texteditor.ITextEditorExtension3;
+import org.eclipse.ui.texteditor.ITextEditorExtension4;
+import org.eclipse.ui.texteditor.ITextEditorExtension5;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
+import org.eclipse.ui.texteditor.TextOperationAction;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector;
+import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
+import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.text.IExecutionDelegatable;
+import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
+import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
+import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
+import org.eclipse.wst.sse.ui.internal.IModelProvider;
+import org.eclipse.wst.sse.ui.internal.IPopupMenuContributor;
+import org.eclipse.wst.sse.ui.internal.IStructuredTextEditorActionConstants;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.ReadOnlyAwareDropTargetAdapter;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.StorageModelProvider;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.UnknownContentTypeDialog;
+import org.eclipse.wst.sse.ui.internal.actions.ActionDefinitionIds;
+import org.eclipse.wst.sse.ui.internal.actions.StructuredTextEditorActionConstants;
+import org.eclipse.wst.sse.ui.internal.contentoutline.ConfigurableContentOutlinePage;
+import org.eclipse.wst.sse.ui.internal.debug.BreakpointRulerAction;
+import org.eclipse.wst.sse.ui.internal.debug.EditBreakpointAction;
+import org.eclipse.wst.sse.ui.internal.debug.ManageBreakpointAction;
+import org.eclipse.wst.sse.ui.internal.debug.ToggleBreakpointAction;
+import org.eclipse.wst.sse.ui.internal.debug.ToggleBreakpointsTarget;
+import org.eclipse.wst.sse.ui.internal.derived.HTMLTextPresenter;
+import org.eclipse.wst.sse.ui.internal.editor.EditorModelUtil;
+import org.eclipse.wst.sse.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.ui.internal.editor.SelectionConvertor;
+import org.eclipse.wst.sse.ui.internal.editor.StructuredModelDocumentProvider;
+import org.eclipse.wst.sse.ui.internal.extension.BreakpointProviderBuilder;
+import org.eclipse.wst.sse.ui.internal.handlers.AddBlockCommentHandler;
+import org.eclipse.wst.sse.ui.internal.handlers.RemoveBlockCommentHandler;
+import org.eclipse.wst.sse.ui.internal.handlers.ToggleLineCommentHandler;
+import org.eclipse.wst.sse.ui.internal.hyperlink.OpenHyperlinkAction;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingStrategy;
+import org.eclipse.wst.sse.ui.internal.properties.ConfigurablePropertySheetPage;
+import org.eclipse.wst.sse.ui.internal.properties.ShowPropertiesAction;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ConfigurationPointCalculator;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.NullSourceEditingTextTools;
+import org.eclipse.wst.sse.ui.internal.provisional.preferences.CommonEditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.quickoutline.QuickOutlineHandler;
+import org.eclipse.wst.sse.ui.internal.quickoutline.QuickOutlinePopupDialog;
+import org.eclipse.wst.sse.ui.internal.reconcile.DocumentRegionProcessor;
+import org.eclipse.wst.sse.ui.internal.selection.SelectionHistory;
+import org.eclipse.wst.sse.ui.internal.style.SemanticHighlightingManager;
+import org.eclipse.wst.sse.ui.internal.text.DocumentRegionEdgeMatcher;
+import org.eclipse.wst.sse.ui.internal.text.SourceInfoProvider;
+import org.eclipse.wst.sse.ui.internal.util.Assert;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+import org.eclipse.wst.sse.ui.quickoutline.AbstractQuickOutlineConfiguration;
+import org.eclipse.wst.sse.ui.reconcile.ISourceReconcilingListener;
+import org.eclipse.wst.sse.ui.typing.AbstractCharacterPairInserter;
+import org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration;
+import org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration;
+
+/**
+ * A Text Editor for editing structured models and structured documents.
+ * <p>
+ * This class is not meant to be subclassed.<br />
+ * New content types may associate source viewer, content outline, and
+ * property sheet configurations to extend the existing functionality.
+ * </p>
+ * 
+ * @see org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration
+ * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration
+ * @see org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration
+ * 
+ * @since 1.0
+ */
+
+public class StructuredTextEditor extends TextEditor {
+	private class GotoMatchingBracketHandler extends AbstractHandler {
+		public Object execute(ExecutionEvent arg0) throws ExecutionException {
+			gotoMatchingBracket();
+			return null;
+		}
+	}
+
+	private class InternalModelStateListener implements IModelStateListener {
+		public void modelAboutToBeChanged(IStructuredModel model) {
+			if (getTextViewer() != null) {
+				// getTextViewer().setRedraw(false);
+			}
+		}
+
+		public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
+			if (getTextViewer() != null) {
+				// getTextViewer().setRedraw(false);
+				getTextViewer().unconfigure();
+				setStatusLineMessage(null);
+			}
+		}
+
+		public void modelChanged(IStructuredModel model) {
+			if (getSourceViewer() != null) {
+				// getTextViewer().setRedraw(true);
+				// Since the model can be changed on a background
+				// thread, we will update menus on display thread,
+				// if we are not already on display thread,
+				// and if there is not an update already pending.
+				// (we can get lots of 'modelChanged' events in rapid
+				// succession, so only need to do one.
+				if (!fUpdateMenuTextPending) {
+					runOnDisplayThreadIfNeededed(new Runnable() {
+						public void run() {
+							updateMenuText();
+							fUpdateMenuTextPending = false;
+						}
+					});
+				}
+
+			}
+		}
+
+		public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty) {
+			// do nothing
+		}
+
+		public void modelReinitialized(IStructuredModel structuredModel) {
+			try {
+				if (getSourceViewer() != null) {
+					SourceViewerConfiguration cfg = getSourceViewerConfiguration();
+					getSourceViewer().configure(cfg);
+				}
+			}
+			catch (Exception e) {
+				// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=1166
+				// investigate each error case post beta
+				Logger.logException("problem trying to configure after model change", e); //$NON-NLS-1$
+			}
+			finally {
+				// so we don't freeze workbench (eg. during page language or
+				// content type change)
+				((ITextViewerExtension) getSourceViewer()).setRedraw(true);
+				
+				IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) getSite().getService(IWorkbenchSiteProgressService.class);
+				if (service != null) {
+					service.warnOfContentChange();
+				}
+			}
+		}
+
+		// Note: this one should probably be used to
+		// control viewer
+		// instead of viewer having its own listener
+		public void modelResourceDeleted(IStructuredModel model) {
+			// do nothing
+		}
+
+		public void modelResourceMoved(IStructuredModel originalmodel, IStructuredModel movedmodel) {
+			// do nothing
+		}
+
+		/**
+		 * This 'Runnable' should be very brief, and should not "call out" to
+		 * other code especially if it depends on the state of the model.
+		 * 
+		 * @param r
+		 */
+		private void runOnDisplayThreadIfNeededed(Runnable r) {
+			// if there is no Display at all (that is, running headless),
+			// or if we are already running on the display thread, then
+			// simply execute the runnable.
+			if (getDisplay() == null || (Thread.currentThread() == getDisplay().getThread())) {
+				r.run();
+			}
+			else {
+				// otherwise force the runnable to run on the display thread.
+				getDisplay().asyncExec(r);
+			}
+		}
+	}
+	
+	/**
+	 * Listens to double-click and selection from the outline page
+	 */
+	private class OutlinePageListener implements IDoubleClickListener, ISelectionChangedListener {
+		public void doubleClick(DoubleClickEvent event) {
+			if (event.getSelection().isEmpty())
+				return;
+
+			int start = -1;
+			int length = 0;
+			if (event.getSelection() instanceof IStructuredSelection) {
+				ISelection currentSelection = getSelectionProvider().getSelection();
+				if (currentSelection instanceof IStructuredSelection) {
+					Object current = ((IStructuredSelection) currentSelection).toArray();
+					Object newSelection = ((IStructuredSelection) event.getSelection()).toArray();
+					if (!current.equals(newSelection)) {
+						IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+						Object o = selection.getFirstElement();
+						if (o instanceof IndexedRegion) {
+							start = ((IndexedRegion) o).getStartOffset();
+							length = ((IndexedRegion) o).getEndOffset() - start;
+						}
+						else if (o instanceof ITextRegion) {
+							start = ((ITextRegion) o).getStart();
+							length = ((ITextRegion) o).getEnd() - start;
+						}
+						else if (o instanceof IRegion) {
+							start = ((ITextRegion) o).getStart();
+							length = ((ITextRegion) o).getLength();
+						}
+					}
+				}
+			}
+			else if (event.getSelection() instanceof ITextSelection) {
+				start = ((ITextSelection) event.getSelection()).getOffset();
+				length = ((ITextSelection) event.getSelection()).getLength();
+			}
+			if (start > -1) {
+				getSourceViewer().setRangeIndication(start, length, false);
+				selectAndReveal(start, length);
+			}
+		}
+
+		public void selectionChanged(SelectionChangedEvent event) {
+			/*
+			 * Do not allow selection from other parts to affect selection in
+			 * the text widget if it has focus, or if we're still firing a
+			 * change of selection. Selection events "bouncing" off of other
+			 * parts are all that we can receive if we have focus (since we
+			 * forwarded our selection to the service just a moment ago), and
+			 * only the user should affect selection if we have focus.
+			 */
+
+			/* The isFiringSelection check only works if a selection listener */
+			if (event.getSelection().isEmpty() || fStructuredSelectionProvider.isFiringSelection())
+				return;
+
+			if (getSourceViewer() != null && getSourceViewer().getTextWidget() != null && !getSourceViewer().getTextWidget().isDisposed() && !getSourceViewer().getTextWidget().isFocusControl()) {
+				int start = -1;
+				int length = 0;
+				if (event.getSelection() instanceof IStructuredSelection) {
+					ISelection current = getSelectionProvider().getSelection();
+					if (current instanceof IStructuredSelection) {
+						Object[] currentSelection = ((IStructuredSelection) current).toArray();
+						Object[] newSelection = ((IStructuredSelection) event.getSelection()).toArray();
+						if (!Arrays.equals(currentSelection, newSelection)) {
+							if (newSelection.length > 0) {
+								/*
+								 * No ordering is guaranteed for multiple
+								 * selection
+								 */
+								Object o = newSelection[0];
+								if (o instanceof IndexedRegion) {
+									start = ((IndexedRegion) o).getStartOffset();
+									int end = ((IndexedRegion) o).getEndOffset();
+									if (newSelection.length > 1) {
+										for (int i = 1; i < newSelection.length; i++) {
+											start = Math.min(start, ((IndexedRegion) newSelection[i]).getStartOffset());
+											end = Math.max(end, ((IndexedRegion) newSelection[i]).getEndOffset());
+										}
+										length = end - start;
+									}
+								}
+								else if (o instanceof ITextRegion) {
+									start = ((ITextRegion) o).getStart();
+									int end = ((ITextRegion) o).getEnd();
+									if (newSelection.length > 1) {
+										for (int i = 1; i < newSelection.length; i++) {
+											start = Math.min(start, ((ITextRegion) newSelection[i]).getStart());
+											end = Math.max(end, ((ITextRegion) newSelection[i]).getEnd());
+										}
+										length = end - start;
+									}
+								}
+								else if (o instanceof IRegion) {
+									start = ((IRegion) o).getOffset();
+									int end = start + ((IRegion) o).getLength();
+									if (newSelection.length > 1) {
+										for (int i = 1; i < newSelection.length; i++) {
+											start = Math.min(start, ((IRegion) newSelection[i]).getOffset());
+											end = Math.max(end, ((IRegion) newSelection[i]).getOffset() + ((IRegion) newSelection[i]).getLength());
+										}
+										length = end - start;
+									}
+								}
+							}
+						}
+					}
+				}
+				else if (event.getSelection() instanceof ITextSelection) {
+					start = ((ITextSelection) event.getSelection()).getOffset();
+				}
+				if (start > -1) {
+					updateRangeIndication(event.getSelection());
+					selectAndReveal(start, length);
+				}
+			}
+		}
+	}
+
+	private class ShowInTargetListAdapter implements IShowInTargetList {
+		/**
+		 * Array of ID Strings that define the default show in targets for
+		 * this editor.
+		 * 
+		 * @see org.eclipse.ui.part.IShowInTargetList#getShowInTargetIds()
+		 * @return the array of ID Strings that define the default show in
+		 *         targets for this editor.
+		 */
+		public String[] getShowInTargetIds() {
+			return fShowInTargetIds;
+		}
+	}
+
+	/**
+	 * A post selection provider that wraps the provider implemented in
+	 * AbstractTextEditor to provide a StructuredTextSelection to post
+	 * selection listeners. Listens to selection changes from the source
+	 * viewer.
+	 */
+	private static class StructuredSelectionProvider implements IPostSelectionProvider, ISelectionValidator {
+		/**
+		 * A "hybrid" text and structured selection class containing the text
+		 * selection and a list of selected model objects. The determination
+		 * of which model objects matches the text selection is responsibility
+		 * of the StructuredSelectionProvider which created this selection
+		 * object.
+		 */
+		private static class StructuredTextSelection extends TextSelection implements IStructuredSelection {
+			private Object[] selectedStructured;
+
+			StructuredTextSelection(IDocument document, int offset, int length, Object[] selectedObjects) {
+				super(document, offset, length);
+				selectedStructured = selectedObjects;
+			}
+
+			StructuredTextSelection(IDocument document, ITextSelection selection, Object[] selectedObjects) {
+				this(document, selection.getOffset(), selection.getLength(), selectedObjects);
+			}
+
+			public Object getFirstElement() {
+				Object[] selectedStructures = getSelectedStructures();
+				return selectedStructures.length > 0 ? selectedStructures[0] : null;
+			}
+
+			private Object[] getSelectedStructures() {
+				return (selectedStructured != null) ? selectedStructured : new Object[0];
+			}
+
+			public boolean isEmpty() {
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=191327
+				return super.isEmpty() || getSelectedStructures().length == 0;
+			}
+
+			public Iterator iterator() {
+				return toList().iterator();
+			}
+
+			public int size() {
+				return (selectedStructured != null) ? selectedStructured.length : 0;
+			}
+
+			public Object[] toArray() {
+				return getSelectedStructures();
+			}
+
+			public List toList() {
+				return Arrays.asList(getSelectedStructures());
+			}
+
+			public String toString() {
+				return getOffset() + ":" + getLength() + "@" + getSelectedStructures(); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		
+		private ISelectionProvider fParentProvider = null;
+		private boolean isFiringSelection = false;
+		private ListenerList listeners = new ListenerList();
+		private ListenerList postListeners = new ListenerList();
+		private ISelection fLastSelection = null;
+		private ISelectionProvider fLastSelectionProvider = null;
+		private SelectionChangedEvent fLastUpdatedSelectionChangedEvent = null;
+		private StructuredTextEditor fEditor;
+		/*
+		 * Responsible for finding the selected objects within a text
+		 * selection. Set/reset by the StructuredTextEditor based on a
+		 * per-model adapter on input.
+		 */
+		SelectionConvertor selectionConvertor = new SelectionConvertor();
+		
+		StructuredSelectionProvider(ISelectionProvider parentProvider, StructuredTextEditor structuredTextEditor) {
+			fParentProvider = parentProvider;
+			fEditor = structuredTextEditor;
+			fParentProvider.addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					handleSelectionChanged(event);
+				}
+			});
+			if (fParentProvider instanceof IPostSelectionProvider) {
+				((IPostSelectionProvider) fParentProvider).addPostSelectionChangedListener(new ISelectionChangedListener() {
+					public void selectionChanged(SelectionChangedEvent event) {
+						handlePostSelectionChanged(event);
+					}
+				});
+			}
+		}
+
+		public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
+			postListeners.add(listener);
+		}
+
+		public void addSelectionChangedListener(ISelectionChangedListener listener) {
+			listeners.add(listener);
+		}
+
+		public void dispose() {
+			fEditor = null;
+			listeners.clear();
+			postListeners.clear();
+			selectionConvertor = null;
+		}
+
+		private void fireSelectionChanged(final SelectionChangedEvent event, ListenerList listenerList) {
+			Object[] listeners = listenerList.getListeners();
+			isFiringSelection = true;
+			for (int i = 0; i < listeners.length; ++i) {
+				final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
+				SafeRunner.run(new SafeRunnable() {
+					public void run() {
+						l.selectionChanged(event);
+					}
+				});
+			}
+			isFiringSelection = false;
+		}
+
+		private ISelectionProvider getParentProvider() {
+			return fParentProvider;
+		}
+
+		public ISelection getSelection() {
+			fLastSelection = null;
+			fLastSelectionProvider = null;
+			fLastUpdatedSelectionChangedEvent = null;
+
+			/*
+			 * When a client explicitly asks for selection, provide the hybrid
+			 * result.
+			 */
+			ISelection selection = getParentProvider().getSelection();
+			if (!(selection instanceof IStructuredSelection) && selection instanceof ITextSelection) {
+				IStructuredModel structuredModel = null;
+				StructuredTextEditor localEditor = getStructuredTextEditor();
+				if (localEditor != null) {
+					structuredModel = localEditor.getInternalModel();
+					if (structuredModel != null) {
+						if (localEditor.isBlockSelectionModeEnabled()) {
+							/*
+							 * Block selection handling - find the overlapping
+							 * objects on each line, keeping in mind that the
+							 * selected block may not overlap actual lines or
+							 * columns of the document.
+							 * IBlockTextSelection.getRegions() should handle
+							 * that for us...
+							 */
+							IBlockTextSelection blockSelection = (IBlockTextSelection) selection;
+							IRegion[] regions = blockSelection.getRegions();
+							Set blockObjects = new LinkedHashSet();
+							for (int i = 0; i < regions.length; i++) {
+								Object[] objects = selectionConvertor.getElements(structuredModel, regions[i].getOffset(), regions[i].getLength());
+								for (int j = 0; j < objects.length; j++) {
+									blockObjects.add(objects[j]);
+								}
+							}
+							selection = new StructuredTextSelection(getDocument(), (ITextSelection) selection, blockObjects.toArray());
+						}
+						else {
+							int start = ((ITextSelection) selection).getOffset();
+							int end = start + ((ITextSelection) selection).getLength();
+							selection = new StructuredTextSelection(getDocument(), (ITextSelection) selection, selectionConvertor.getElements(structuredModel, start, end));
+						}
+					}
+				}
+				if (selection == null) {
+					selection = new StructuredTextSelection(getDocument(), (ITextSelection) selection, new Object[0]);
+				}
+			}
+			
+			return selection;
+		}
+
+		private StructuredTextEditor getStructuredTextEditor() {
+			return fEditor;
+		}
+
+		void handlePostSelectionChanged(SelectionChangedEvent event) {
+			SelectionChangedEvent updatedEvent = null;
+			if (fLastSelection == event.getSelection() && fLastSelectionProvider == event.getSelectionProvider()) {
+				updatedEvent = fLastUpdatedSelectionChangedEvent;
+			}
+			else {
+				updatedEvent = updateEvent(event);
+			}
+			// only update the range indicator on post selection
+			StructuredTextEditor localEditor = fEditor;
+
+			if (localEditor != null) {
+				localEditor.updateRangeIndication(updatedEvent.getSelection());
+				fireSelectionChanged(updatedEvent, postListeners);
+			}
+		}
+
+		void handleSelectionChanged(SelectionChangedEvent event) {
+			SelectionChangedEvent updatedEvent = event;
+			if (fLastSelection != event.getSelection() || fLastSelectionProvider != event.getSelectionProvider()) {
+				fLastSelection = event.getSelection();
+				fLastSelectionProvider = event.getSelectionProvider();
+				fLastUpdatedSelectionChangedEvent = updatedEvent = updateEvent(event);
+			}
+			fireSelectionChanged(updatedEvent, listeners);
+		}
+
+		IDocument getDocument() {
+			return fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+		}
+
+
+		boolean isFiringSelection() {
+			return isFiringSelection;
+		}
+
+		public boolean isValid(ISelection selection) {
+			// ISSUE: is not clear default behavior should be true?
+			// But not clear is this default would apply for our editor.
+			boolean result = true;
+			// if editor is "gone", can not be valid
+			StructuredTextEditor e = getStructuredTextEditor();
+			if (e == null || e.fEditorDisposed) {
+				result = false;
+			}
+			// else defer to parent
+			else if (getParentProvider() instanceof ISelectionValidator) {
+				result = ((ISelectionValidator) getParentProvider()).isValid(selection);
+			}
+			return result;
+		}
+
+		public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
+			postListeners.remove(listener);
+		}
+
+		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+			listeners.remove(listener);
+		}
+
+		public void setSelection(ISelection selection) {
+			if (isFiringSelection()) {
+				return;
+			}
+
+			fLastSelection = null;
+			fLastSelectionProvider = null;
+			fLastUpdatedSelectionChangedEvent = null;
+
+			ISelection textSelection = updateSelection(selection);
+			getParentProvider().setSelection(textSelection);
+			StructuredTextEditor localEditor = getStructuredTextEditor();
+			if (localEditor != null) {
+				localEditor.updateRangeIndication(textSelection);
+			}
+		}
+
+		/**
+		 * Create a corresponding event that contains a
+		 * StructuredTextselection
+		 * 
+		 * @param event
+		 * @return
+		 */
+		private SelectionChangedEvent updateEvent(SelectionChangedEvent event) {
+			ISelection selection = event.getSelection();
+			if (selection instanceof ITextSelection && !(selection instanceof IStructuredSelection)) {
+				IStructuredModel structuredModel = null;
+				StructuredTextEditor localEditor = getStructuredTextEditor();
+				if (localEditor != null) {
+					structuredModel = localEditor.getInternalModel();
+					if (structuredModel != null) {
+						int start = ((ITextSelection) selection).getOffset();
+						int end = start + ((ITextSelection) selection).getLength();
+						selection = new StructuredTextSelection(getDocument(), (ITextSelection) event.getSelection(), selectionConvertor.getElements(structuredModel, start, end));
+					}
+				}
+				if (selection == null)
+					selection = new StructuredTextSelection(getDocument(), (ITextSelection) event.getSelection(), new Object[0]);
+			}
+			SelectionChangedEvent newEvent = new SelectionChangedEvent(event.getSelectionProvider(), selection);
+			return newEvent;
+		}
+
+		/**
+		 * Create a corresponding StructuredTextselection
+		 * 
+		 * @param selection
+		 * @return
+		 */
+		private ISelection updateSelection(ISelection selection) {
+			ISelection updated = selection;
+			if (selection instanceof IStructuredSelection && !(selection instanceof ITextSelection) && !selection.isEmpty()) {
+				Object[] selectedObjects = ((IStructuredSelection) selection).toArray();
+				if (selectedObjects.length > 0) {
+					int start = -1;
+					int length = 0;
+
+					// no ordering is guaranteed for multiple selection
+					Object o = selectedObjects[0];
+					if (o instanceof IndexedRegion) {
+						start = ((IndexedRegion) o).getStartOffset();
+						int end = ((IndexedRegion) o).getEndOffset();
+						if (selectedObjects.length > 1) {
+							for (int i = 1; i < selectedObjects.length; i++) {
+								start = Math.min(start, ((IndexedRegion) selectedObjects[i]).getStartOffset());
+								end = Math.max(end, ((IndexedRegion) selectedObjects[i]).getEndOffset());
+							}
+							length = end - start;
+						}
+					}
+					else if (o instanceof ITextRegion) {
+						start = ((ITextRegion) o).getStart();
+						int end = ((ITextRegion) o).getEnd();
+						if (selectedObjects.length > 1) {
+							for (int i = 1; i < selectedObjects.length; i++) {
+								start = Math.min(start, ((ITextRegion) selectedObjects[i]).getStart());
+								end = Math.max(end, ((ITextRegion) selectedObjects[i]).getEnd());
+							}
+							length = end - start;
+						}
+					}
+
+					if (start > -1) {
+						updated = new StructuredTextSelection(getDocument(), start, length, selectedObjects);
+					}
+				}
+			}
+			return updated;
+		}
+	}
+
+	class TimeOutExpired extends TimerTask {
+		public void run() {
+			final byte[] result = new byte[1]; // Did the busy state end successfully?
+			getDisplay().syncExec(new Runnable() {
+				public void run() {
+					if (getDisplay() != null && !getDisplay().isDisposed())
+						endBusyStateInternal(result);
+				}
+			});
+			if (result[0] == 1) {
+				fBusyTimer.cancel();
+			}
+		}
+
+	}
+
+	private class ConfigurationAndTarget {
+		private String fTargetId;
+		private StructuredTextViewerConfiguration fConfiguration;
+
+		public ConfigurationAndTarget(String targetId, StructuredTextViewerConfiguration config) {
+			fTargetId = targetId;
+			fConfiguration = config;
+		}
+
+		public String getTargetId() {
+			return fTargetId;
+		}
+
+		public StructuredTextViewerConfiguration getConfiguration() {
+			return fConfiguration;
+		}
+	}
+
+	private class CharacterPairListener implements VerifyKeyListener {
+		private CharacterPairing[] fInserters = new CharacterPairing[0];
+		private ICompletionListener fCompletionListener;
+		private boolean fIsCompleting = false;
+
+		public void installCompletionListener() {
+			ISourceViewer viewer = getSourceViewer();
+			if (viewer instanceof StructuredTextViewer) {
+				fCompletionListener = new ICompletionListener() {
+
+					public void assistSessionStarted(ContentAssistEvent event) {
+						fIsCompleting = true;
+					}
+
+					public void assistSessionEnded(ContentAssistEvent event) {
+						fIsCompleting = false;
+					}
+
+					public void selectionChanged(ICompletionProposal proposal, boolean smartToggle) {
+					}
+					
+				};
+				ContentAssistantFacade facade = ((StructuredTextViewer) viewer).getContentAssistFacade();
+				if (facade != null)
+					facade.addCompletionListener(fCompletionListener);
+			}
+		}
+
+		/**
+		 * Add the pairing to the list of inserters
+		 * @param pairing
+		 */
+		void addInserter(CharacterPairing pairing) {
+			List pairings = new ArrayList(Arrays.asList(fInserters));
+			pairings.add(pairing);
+			fInserters = (CharacterPairing[]) pairings.toArray(new CharacterPairing[pairings.size()]);
+		}
+
+		void prioritize() {
+			Arrays.sort(fInserters);
+		}
+
+		/**
+		 * Perform cleanup on the character pair inserters
+		 */
+		void dispose() {
+			ISourceViewer viewer = getSourceViewer();
+			if (viewer instanceof StructuredTextViewer) {
+				ContentAssistantFacade facade = ((StructuredTextViewer) viewer).getContentAssistFacade();
+				if (facade != null)
+					facade.removeCompletionListener(fCompletionListener);
+			}
+
+			for (int i = 0; i < fInserters.length; i++) {
+				final AbstractCharacterPairInserter inserter = fInserters[i].inserter;
+				SafeRunner.run(new ISafeRunnable() {
+					public void handleException(Throwable exception) {
+						// rely on default logging
+					}
+
+					public void run() throws Exception {
+						inserter.dispose();
+					}
+				});
+			}
+		}
+
+		public void verifyKey(final VerifyEvent event) {
+			if (!event.doit || getInsertMode() != SMART_INSERT || fIsCompleting || isBlockSelectionModeEnabled() && isMultilineSelection())
+				return;
+			final boolean[] paired = { false };
+			for (int i = 0; i < fInserters.length; i++) {
+				final CharacterPairing pairing = fInserters[i];
+				// use a SafeRunner -- this is a critical function (typing)
+				SafeRunner.run(new ISafeRunnable() {
+					public void run() throws Exception {
+						final AbstractCharacterPairInserter inserter = pairing.inserter;
+						if (inserter.hasPair(event.character)) {
+							if (pair(event, inserter, pairing.partitions))
+								paired[0] = true;
+						}
+					}
+
+					public void handleException(Throwable exception) {
+						// rely on default logging
+					}
+				});
+				if (paired[0])
+					return;
+			}
+		}
+
+		private boolean pair(VerifyEvent event, AbstractCharacterPairInserter inserter, Set partitions) {
+			final ISourceViewer viewer = getSourceViewer();
+			final IDocument document = getSourceViewer().getDocument();
+			if (document != null) {
+				try {
+					final Point selection = viewer.getSelectedRange();
+					final int offset = selection.x;
+					final ITypedRegion partition = document.getPartition(offset);
+					if (partitions.contains(partition.getType())) {
+						// Don't modify if the editor input cannot be changed
+						if (!validateEditorInputState())
+							return false;
+						event.doit = !inserter.pair(viewer, event.character);
+						return true;
+					}
+				} catch (BadLocationException e) {
+				}
+			}
+			return false;
+		}
+
+		private boolean isMultilineSelection() {
+			ISelection selection = getSelectionProvider().getSelection();
+			if (selection instanceof ITextSelection) {
+				ITextSelection ts = (ITextSelection) selection;
+				return ts.getStartLine() != ts.getEndLine();
+			}
+			return false;
+		}
+	}
+
+	/**
+	 * Representation of a character pairing that includes its priority based on
+	 * its content type and how close it is to the content type of the file
+	 * in the editor.
+	 */
+	private class CharacterPairing implements Comparable {
+		int priority;
+		AbstractCharacterPairInserter inserter;
+		Set partitions;
+		public int compareTo(Object o) {
+			if (o == this)
+				return 0;
+			return this.priority - ((CharacterPairing) o).priority;
+		}
+	}
+	
+	private class PartListener implements IPartListener {
+
+		private ITextEditor fEditor;
+
+		public PartListener(ITextEditor editor) {
+			fEditor = editor;
+		}
+
+		public void partActivated(IWorkbenchPart part) {
+			if (part.getAdapter(ITextEditor.class) == fEditor) {
+				IReconciler reconciler = getSourceViewerConfiguration().getReconciler(getSourceViewer());
+				if (reconciler instanceof DocumentRegionProcessor) {
+					((DocumentRegionProcessor) reconciler).forceReconciling();
+				}
+			}
+		}
+
+		public void partBroughtToTop(IWorkbenchPart part) {
+		}
+
+		public void partClosed(IWorkbenchPart part) {
+		}
+
+		public void partDeactivated(IWorkbenchPart part) {
+		}
+
+		public void partOpened(IWorkbenchPart part) {
+		}
+		
+	}
+
+	/**
+	 * Not API. May be removed in the future.
+	 */
+	protected final static char[] BRACKETS = {'{', '}', '(', ')', '[', ']'};
+
+	private static final long BUSY_STATE_DELAY = 1000;
+	/**
+	 * Not API. May be removed in the future.
+	 */
+	protected static final String DOT = "."; //$NON-NLS-1$
+	private static final String EDITOR_CONTEXT_MENU_ID = "org.eclipse.wst.sse.ui.StructuredTextEditor.EditorContext"; //$NON-NLS-1$
+	private static final String EDITOR_CONTEXT_MENU_SUFFIX = ".source.EditorContext"; //$NON-NLS-1$
+
+	/** Non-NLS strings */
+	private static final String EDITOR_KEYBINDING_SCOPE_ID = "org.eclipse.wst.sse.ui.structuredTextEditorScope"; //$NON-NLS-1$
+	/**
+	 * Not API. May be removed in the future.
+	 */
+	public static final String GROUP_NAME_ADDITIONS = IWorkbenchActionConstants.MB_ADDITIONS; //$NON-NLS-1$
+
+	private static final String REDO_ACTION_DESC = SSEUIMessages.Redo___0___UI_; //$NON-NLS-1$ = "Redo: {0}."
+	private static final String REDO_ACTION_DESC_DEFAULT = SSEUIMessages.Redo_Text_Change__UI_; //$NON-NLS-1$ = "Redo Text Change."
+	private static final String REDO_ACTION_TEXT = SSEUIMessages._Redo__0___Ctrl_Y_UI_; //$NON-NLS-1$ = "&Redo {0} @Ctrl+Y"
+	private static final String REDO_ACTION_TEXT_DEFAULT = SSEUIMessages._Redo_Text_Change__Ctrl_Y_UI_; //$NON-NLS-1$ = "&Redo Text Change @Ctrl+Y"
+	private static final String RULER_CONTEXT_MENU_ID = "org.eclipse.wst.sse.ui.StructuredTextEditor.RulerContext"; //$NON-NLS-1$
+	private static final String RULER_CONTEXT_MENU_SUFFIX = ".source.RulerContext"; //$NON-NLS-1$
+
+	private final static String UNDERSCORE = "_"; //$NON-NLS-1$
+	/** Translatable strings */
+	private static final String UNDO_ACTION_DESC = SSEUIMessages.Undo___0___UI_; //$NON-NLS-1$ = "Undo: {0}."
+
+	private static final String UNDO_ACTION_DESC_DEFAULT = SSEUIMessages.Undo_Text_Change__UI_; //$NON-NLS-1$ = "Undo Text Change."
+	private static final String UNDO_ACTION_TEXT = SSEUIMessages._Undo__0___Ctrl_Z_UI_; //$NON-NLS-1$ = "&Undo {0} @Ctrl+Z"
+	private static final String UNDO_ACTION_TEXT_DEFAULT = SSEUIMessages._Undo_Text_Change__Ctrl_Z_UI_; //$NON-NLS-1$ = "&Undo Text Change @Ctrl+Z"
+	// development time/debug variables only
+	private int adapterRequests;
+
+	private long adapterTime;
+	private boolean fBackgroundJobEnded;
+	private boolean fBusyState;
+	private Timer fBusyTimer;
+	boolean fDirtyBeforeDocumentEvent = false;
+	int validateEditCount = 0;
+	private ExtendedEditorDropTargetAdapter fDropAdapter;
+	private DropTarget fDropTarget;
+	boolean fEditorDisposed = false;
+	private IEditorPart fEditorPart;
+	private InternalModelStateListener fInternalModelStateListener;
+	private IContentOutlinePage fOutlinePage;
+
+	private OutlinePageListener fOutlinePageListener = null;
+	/** This editor's projection support */
+	private ProjectionSupport fProjectionSupport;
+	private IPropertySheetPage fPropertySheetPage;
+
+	private ISourceReconcilingListener[] fReconcilingListeners = new ISourceReconcilingListener[0]; 
+	private IPartListener fPartListener;
+
+	private String fRememberTitle;
+	/** The ruler context menu to be disposed. */
+	private Menu fRulerContextMenu;
+	/** The ruler context menu manager to be disposed. */
+	private MenuManager fRulerContextMenuManager;
+
+	String[] fShowInTargetIds = new String[]{IPageLayout.ID_RES_NAV, IPageLayout.ID_PROJECT_EXPLORER, IPageLayout.ID_OUTLINE};
+
+	private IAction fShowPropertiesAction = null;
+	private IStructuredModel fStructuredModel;
+	StructuredSelectionProvider fStructuredSelectionProvider = null;
+	/** The text context menu to be disposed. */
+	private Menu fTextContextMenu;
+	/** The text context menu manager to be disposed. */
+	private MenuManager fTextContextMenuManager;
+	private String fViewerConfigurationTargetId;
+	/** The selection history of the editor */
+	private SelectionHistory fSelectionHistory;
+	/** The information presenter. */
+	private InformationPresenter fInformationPresenter;
+	private boolean fUpdateMenuTextPending;
+	/** The quick outline handler */
+	private QuickOutlineHandler fOutlineHandler;
+
+	private boolean shouldClose = false;
+	private long startPerfTime;
+	private boolean fisReleased;
+	/**
+	 * The action group for folding.
+	 */
+	private FoldingActionGroup fFoldingGroup;
+
+	private ILabelProvider fStatusLineLabelProvider;
+
+	private SemanticHighlightingManager fSemanticManager;
+	
+	private boolean fSelectionChangedFromGoto = false;
+
+	private final CharacterPairListener fPairInserter = new CharacterPairListener();
+
+	/**
+	 * Creates a new Structured Text Editor.
+	 */
+	public StructuredTextEditor() {
+		super();
+		initializeDocumentProvider(null);
+	}
+
+	private IStructuredModel aboutToSaveModel() {
+		IStructuredModel model = getInternalModel();
+		if (model != null) {
+			model.aboutToChangeModel();
+		}
+		return model;
+	}
+
+	protected void addSourceMenuActions(IMenuManager menu) {
+		IMenuManager subMenu= new MenuManager(SSEUIMessages.SourceMenu_label, IStructuredTextEditorActionConstants.SOURCE_CONTEXT_MENU_ID);
+		subMenu.add(new Separator(IStructuredTextEditorActionConstants.SOURCE_BEGIN));
+		subMenu.add(new Separator(IStructuredTextEditorActionConstants.SOURCE_ADDITIONS));
+		subMenu.add(new Separator(IStructuredTextEditorActionConstants.SOURCE_END));
+		menu.appendToGroup(ITextEditorActionConstants.GROUP_EDIT, subMenu);
+	}
+
+	protected void addRefactorMenuActions(IMenuManager menu) {
+		IMenuManager subMenu = new MenuManager(SSEUIMessages.RefactorMenu_label, IStructuredTextEditorActionConstants.REFACTOR_CONTEXT_MENU_ID);
+		menu.appendToGroup(ITextEditorActionConstants.GROUP_EDIT, subMenu);
+	}
+
+	protected void addContextMenuActions(IMenuManager menu) {
+		// Only offer actions that affect the text if the viewer allows
+		// modification and supports any of these operations
+
+		// Some Design editors (DTD) rely on this view for their own uses
+		menu.appendToGroup(IWorkbenchActionConstants.GROUP_ADD, fShowPropertiesAction);
+	}
+
+	private void addExtendedContextMenuActions(IMenuManager menu) {
+		IEditorActionBarContributor c = getEditorSite().getActionBarContributor();
+		if (c instanceof IPopupMenuContributor) {
+			((IPopupMenuContributor) c).contributeToPopupMenu(menu);
+		}
+		else {
+			ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
+			IExtendedContributor pmc = builder.readActionExtensions(getConfigurationPoints());
+			if (pmc != null) {
+				pmc.setActiveEditor(this);
+				pmc.contributeToPopupMenu(menu);
+			}
+		}
+	}
+
+	protected void addExtendedRulerContextMenuActions(IMenuManager menu) {
+		// none at this level
+	}
+
+
+
+	/**
+	 * Starts background mode.
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 */
+	void beginBackgroundOperation() {
+		fBackgroundJobEnded = false;
+		// if already in busy state, no need to do anything
+		// and, we only start, or reset, the timed busy
+		// state when we get the "endBackgroundOperation" call.
+		if (!inBusyState()) {
+			beginBusyStateInternal();
+		}
+	}
+
+	private void beginBusyStateInternal() {
+
+		fBusyState = true;
+		startBusyTimer();
+
+		ISourceViewer viewer = getSourceViewer();
+		if (viewer instanceof StructuredTextViewer) {
+			((StructuredTextViewer) viewer).beginBackgroundUpdate();
+
+		}
+		showBusy(true);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.ITextEditor#close(boolean)
+	 */
+	public void close(final boolean save) {
+		/*
+		 * Instead of us closing directly, we have to close with our
+		 * containing (multipage) editor, if it exists.
+		 */
+		if (getSite() == null) {
+			// if site hasn't been set yet, then we're not
+			// completely open
+			// so set a flag not to open
+			shouldClose = true;
+		}
+		else {
+			if (getEditorPart() != null) {
+				Display display = getSite().getShell().getDisplay();
+				display.asyncExec(new Runnable() {
+
+					public void run() {
+						getSite().getPage().closeEditor(getEditorPart(), save);
+					}
+				});
+			}
+			else {
+				super.close(save);
+			}
+		}
+	}
+	
+	private void activateContexts(IContextService service) {
+		if(service == null)
+			return;
+		
+		String[] definitions = getDefinitions(getConfigurationPoints());
+		
+		if(definitions != null) {
+			String[] contexts = null;
+			for(int i = 0; i < definitions.length; i++) {
+				contexts = StringUtils.unpack(definitions[i]);
+				for(int j = 0; j < contexts.length; j++)
+					service.activateContext(contexts[j].trim());
+			}
+		}
+		
+	}
+	
+	private String[] getDefinitions(String[] ids) {
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] definitions = null;
+		
+		/* Iterate through the configuration ids until one is found that has
+		 * an activecontexts definition
+		 */
+		for(int i = 0; i < ids.length; i++) {
+			definitions = builder.getDefinitions("activecontexts", ids[i]); //$NON-NLS-1$
+			if(definitions != null && definitions.length > 0)
+				return definitions;
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#collectContextMenuPreferencePages()
+	 */
+	protected String[] collectContextMenuPreferencePages() {
+		List allIds = new ArrayList(0);
+
+		// get contributed preference pages
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] configurationIds = getConfigurationPoints();
+		for (int i = 0; i < configurationIds.length; i++) {
+			String[] definitions = builder.getDefinitions("preferencepages", configurationIds[i]); //$NON-NLS-1$
+			for (int j = 0; j < definitions.length; j++) {
+				String someIds = definitions[j];
+				if (someIds != null && someIds.length() > 0) {
+					// supports multiple comma-delimited page IDs in one
+					// element
+					String[] ids = StringUtils.unpack(someIds);
+					for (int k = 0; k < ids.length; k++) {
+						// trim, just to keep things clean
+						String id = ids[k].trim();
+						if (!allIds.contains(id)) {
+							allIds.add(id);
+						}
+					}
+				}
+			}
+		}
+
+		// add pages contributed by super
+		String[] superPages = super.collectContextMenuPreferencePages();
+		for (int m = 0; m < superPages.length; m++) {
+			// trim, just to keep things clean
+			String id = superPages[m].trim();
+			if (!allIds.contains(id)) {
+				allIds.add(id);
+			}
+		}
+
+		return (String[]) allIds.toArray(new String[0]);
+	}
+
+	/**
+	 * Compute and set double-click action for the vertical ruler
+	 */
+	private void computeAndSetDoubleClickAction() {
+		/*
+		 * Make double-clicking on the ruler toggle a breakpoint instead of
+		 * toggling a bookmark. For lines where a breakpoint won't be created,
+		 * create a bookmark through the contributed RulerDoubleClick action.
+		 */
+		setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK, new ToggleBreakpointAction(this, getVerticalRuler(), getAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK)));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.ExtendedTextEditor#configureSourceViewerDecorationSupport(org.eclipse.ui.texteditor.SourceViewerDecorationSupport)
+	 */
+	protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) {
+		support.setCharacterPairMatcher(createCharacterPairMatcher());
+		support.setMatchingCharacterPainterPreferenceKeys(EditorPreferenceNames.MATCHING_BRACKETS, EditorPreferenceNames.MATCHING_BRACKETS_COLOR);
+
+		super.configureSourceViewerDecorationSupport(support);
+	}
+
+	protected void createActions() {
+		super.createActions();
+		ResourceBundle resourceBundle = SSEUIMessages.getResourceBundle();
+		IWorkbenchHelpSystem helpSystem = SSEUIPlugin.getDefault().getWorkbench().getHelpSystem();
+		// TextView Action - moving the selected text to
+		// the clipboard
+		// override the cut/paste/delete action to make
+		// them run on read-only
+		// files
+		Action action = new TextOperationAction(resourceBundle, "Editor_Cut_", this, ITextOperationTarget.CUT); //$NON-NLS-1$
+		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.CUT);
+		setAction(ITextEditorActionConstants.CUT, action);
+		helpSystem.setHelp(action, IAbstractTextEditorHelpContextIds.CUT_ACTION);
+		// TextView Action - inserting the clipboard
+		// content at the current
+		// position
+		// override the cut/paste/delete action to make
+		// them run on read-only
+		// files
+		action = new TextOperationAction(resourceBundle, "Editor_Paste_", this, ITextOperationTarget.PASTE); //$NON-NLS-1$
+		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.PASTE);
+		setAction(ITextEditorActionConstants.PASTE, action);
+		helpSystem.setHelp(action, IAbstractTextEditorHelpContextIds.PASTE_ACTION);
+		// TextView Action - deleting the selected text or
+		// if selection is
+		// empty the character at the right of the current
+		// position
+		// override the cut/paste/delete action to make
+		// them run on read-only
+		// files
+		action = new TextOperationAction(resourceBundle, "Editor_Delete_", this, ITextOperationTarget.DELETE); //$NON-NLS-1$
+		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.DELETE);
+		setAction(ITextEditorActionConstants.DELETE, action);
+		helpSystem.setHelp(action, IAbstractTextEditorHelpContextIds.DELETE_ACTION);
+		// SourceView Action - requesting content assist to
+		// show completetion
+		// proposals for the current insert position
+		action = new TextOperationAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_PROPOSALS + UNDERSCORE, this, ISourceViewer.CONTENTASSIST_PROPOSALS);
+		helpSystem.setHelp(action, IHelpContextIds.CONTMNU_CONTENTASSIST_HELPID);
+		action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+		setAction(StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_PROPOSALS, action);
+		markAsStateDependentAction(StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_PROPOSALS, true);
+		// SourceView Action - requesting content assist to
+		// show the content
+		// information for the current insert position
+		action = new TextOperationAction(SSEUIMessages.getResourceBundle(), StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_CONTEXT_INFORMATION + UNDERSCORE, this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION);
+		action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
+		setAction(StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_CONTEXT_INFORMATION, action);
+		markAsStateDependentAction(StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_CONTEXT_INFORMATION, true);
+		// StructuredTextViewer Action - requesting format
+		// of the whole
+		// document
+		action = new TextOperationAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT + UNDERSCORE, this, StructuredTextViewer.FORMAT_DOCUMENT);
+		helpSystem.setHelp(action, IHelpContextIds.CONTMNU_FORMAT_DOC_HELPID);
+		action.setActionDefinitionId(ActionDefinitionIds.FORMAT_DOCUMENT);
+		setAction(StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT, action);
+		markAsStateDependentAction(StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT, true);
+		markAsSelectionDependentAction(StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT, true);
+		// StructuredTextViewer Action - requesting format
+		// of the active
+		// elements
+		action = new TextOperationAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_ACTIVE_ELEMENTS + UNDERSCORE, this, StructuredTextViewer.FORMAT_ACTIVE_ELEMENTS);
+		helpSystem.setHelp(action, IHelpContextIds.CONTMNU_FORMAT_ELEMENTS_HELPID);
+		action.setActionDefinitionId(ActionDefinitionIds.FORMAT_ACTIVE_ELEMENTS);
+		setAction(StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_ACTIVE_ELEMENTS, action);
+		markAsStateDependentAction(StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_ACTIVE_ELEMENTS, true);
+		markAsSelectionDependentAction(StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_ACTIVE_ELEMENTS, true);
+
+		// StructuredTextEditor Action - add breakpoints (falling back to the
+		// current double-click if they can't be added)
+		action = new ToggleBreakpointAction(this, getVerticalRuler());
+		setAction(ActionDefinitionIds.TOGGLE_BREAKPOINTS, action);
+		// StructuredTextEditor Action - manage breakpoints
+		action = new ManageBreakpointAction(this, getVerticalRuler());
+		setAction(ActionDefinitionIds.MANAGE_BREAKPOINTS, action);
+		// StructuredTextEditor Action - edit breakpoints
+		action = new EditBreakpointAction(this, getVerticalRuler());
+		setAction(ActionDefinitionIds.EDIT_BREAKPOINTS, action);
+		// StructuredTextViewer Action - open file on selection
+		action = new OpenHyperlinkAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE + UNDERSCORE, this, getSourceViewer());
+		action.setActionDefinitionId(ActionDefinitionIds.OPEN_FILE);
+		setAction(StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE, action);
+
+		computeAndSetDoubleClickAction();
+		
+		//add handlers to handler service
+		IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
+		if (handlerService != null) {
+			
+			IHandler gotoHandler = new GotoMatchingBracketHandler();
+			handlerService.activateHandler(ActionDefinitionIds.GOTO_MATCHING_BRACKET, gotoHandler);
+			
+			fOutlineHandler = new QuickOutlineHandler();
+	    	handlerService.activateHandler(ActionDefinitionIds.SHOW_OUTLINE, fOutlineHandler);
+			
+			IHandler toggleCommentHandler = new ToggleLineCommentHandler();
+			handlerService.activateHandler(ActionDefinitionIds.TOGGLE_COMMENT, toggleCommentHandler);
+			
+			IHandler addCommentBlockHandler = new AddBlockCommentHandler();
+			handlerService.activateHandler(ActionDefinitionIds.ADD_BLOCK_COMMENT, addCommentBlockHandler);
+			
+			IHandler removeCommentBlockHandler = new RemoveBlockCommentHandler();
+			handlerService.activateHandler(ActionDefinitionIds.REMOVE_BLOCK_COMMENT, removeCommentBlockHandler);
+		}
+
+		fShowPropertiesAction = new ShowPropertiesAction(getEditorPart(), getSelectionProvider());
+		fFoldingGroup = new FoldingActionGroup(this, getSourceViewer());
+	}
+
+	protected LineChangeHover createChangeHover() {
+		return super.createChangeHover(); //new StructuredLineChangeHover();
+	}
+
+	protected ICharacterPairMatcher createCharacterPairMatcher() {
+		ICharacterPairMatcher matcher = null;
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] ids = getConfigurationPoints();
+		for (int i = 0; matcher == null && i < ids.length; i++) {
+			matcher = (ICharacterPairMatcher) builder.getConfiguration(DocumentRegionEdgeMatcher.ID, ids[i]);
+		}
+		if (matcher == null) {
+			matcher = new DefaultCharacterPairMatcher(new char[]{'(', ')', '{', '}', '[', ']', '<', '>', '"', '"', '\'', '\''});
+		}
+		return matcher;
+	}
+
+	/**
+	 * Create a preference store that combines the source editor preferences
+	 * with the base editor's preferences.
+	 * 
+	 * @return IPreferenceStore
+	 */
+	private IPreferenceStore createCombinedPreferenceStore() {
+		IPreferenceStore sseEditorPrefs = SSEUIPlugin.getDefault().getPreferenceStore();
+		IPreferenceStore baseEditorPrefs = EditorsUI.getPreferenceStore();
+		return new ChainedPreferenceStore(new IPreferenceStore[]{sseEditorPrefs, baseEditorPrefs});
+	}
+
+	private ContentOutlineConfiguration createContentOutlineConfiguration() {
+		ContentOutlineConfiguration cfg = null;
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] ids = getConfigurationPoints();
+		for (int i = 0; cfg == null && i < ids.length; i++) {
+			cfg = (ContentOutlineConfiguration) builder.getConfiguration(ExtendedConfigurationBuilder.CONTENTOUTLINECONFIGURATION, ids[i]);
+		}
+		return cfg;
+	}
+
+	protected void createModelDependentFields() {
+		if (fStructuredSelectionProvider != null) {
+			SelectionConvertor convertor = (SelectionConvertor) fStructuredModel.getAdapter(SelectionConvertor.class);
+			if (convertor != null)
+				fStructuredSelectionProvider.selectionConvertor = convertor;
+			else
+				fStructuredSelectionProvider.selectionConvertor = new SelectionConvertor();
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Use StructuredTextViewerConfiguration if a viewerconfiguration has not
+	 * already been set. Also initialize StructuredTextViewer.
+	 * </p>
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createPartControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createPartControl(Composite parent) {
+		IContextService contextService = (IContextService) getSite().getService(IContextService.class);
+		if (contextService != null)
+			contextService.activateContext(EDITOR_KEYBINDING_SCOPE_ID);
+
+		if (getSourceViewerConfiguration() == null) {
+			ConfigurationAndTarget cat = createSourceViewerConfiguration();
+			fViewerConfigurationTargetId = cat.getTargetId();
+			StructuredTextViewerConfiguration newViewerConfiguration = cat.getConfiguration();
+			setSourceViewerConfiguration(newViewerConfiguration);
+		}
+
+		super.createPartControl(parent);
+
+		// instead of calling setInput twice, use initializeSourceViewer() to
+		// handle source viewer initialization previously handled by setInput
+		initializeSourceViewer();
+
+		// update editor context menu, vertical ruler context menu, infopop
+		if (getInternalModel() != null) {
+			updateEditorControlsForContentType(getInternalModel().getContentTypeIdentifier());
+		}
+		else {
+			updateEditorControlsForContentType(null);
+		}
+
+		// used for Show Tooltip Description
+		IInformationControlCreator informationControlCreator = new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell shell) {
+				boolean cutDown = false;
+				int style = cutDown ? SWT.NONE : (SWT.V_SCROLL | SWT.H_SCROLL);
+				return new DefaultInformationControl(shell, SWT.RESIZE | SWT.TOOL, style, new HTMLTextPresenter(cutDown));
+			}
+		};
+
+		fInformationPresenter = new InformationPresenter(informationControlCreator);
+		fInformationPresenter.setSizeConstraints(60, 10, true, true);
+		fInformationPresenter.install(getSourceViewer());
+		addReconcilingListeners(getSourceViewerConfiguration(), getTextViewer());
+		fPartListener = new PartListener(this);
+		getSite().getWorkbenchWindow().getPartService().addPartListener(fPartListener);
+		installSemanticHighlighting();
+		if (fOutlineHandler != null) {
+			IInformationPresenter presenter = configureOutlinePresenter(getSourceViewer(), getSourceViewerConfiguration());
+			if (presenter != null) {
+				presenter.install(getSourceViewer());
+				fOutlineHandler.configure(presenter);
+			}
+		}
+		installCharacterPairing();
+		ISourceViewer viewer = getSourceViewer();
+		if (viewer instanceof ITextViewerExtension) {
+			((ITextViewerExtension) viewer).appendVerifyKeyListener(fPairInserter);
+			fPairInserter.installCompletionListener();
+		}
+		
+	}
+
+	protected PropertySheetConfiguration createPropertySheetConfiguration() {
+		PropertySheetConfiguration cfg = null;
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] ids = getConfigurationPoints();
+		for (int i = 0; cfg == null && i < ids.length; i++) {
+			cfg = (PropertySheetConfiguration) builder.getConfiguration(ExtendedConfigurationBuilder.PROPERTYSHEETCONFIGURATION, ids[i]);
+		}
+		return cfg;
+	}
+
+	/**
+	 * Loads the Show In Target IDs from the Extended Configuration extension
+	 * point.
+	 * 
+	 * @return
+	 */
+	private String[] createShowInTargetIds() {
+		List allIds = new ArrayList(0);
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] configurationIds = getConfigurationPoints();
+		for (int i = 0; i < configurationIds.length; i++) {
+			String[] definitions = builder.getDefinitions("showintarget", configurationIds[i]); //$NON-NLS-1$
+			for (int j = 0; j < definitions.length; j++) {
+				String someIds = definitions[j];
+				if (someIds != null && someIds.length() > 0) {
+					String[] ids = StringUtils.unpack(someIds);
+					for (int k = 0; k < ids.length; k++) {
+						// trim, just to keep things clean
+						String id = ids[k].trim();
+						if (!allIds.contains(id)) {
+							allIds.add(id);
+						}
+					}
+				}
+			}
+		}
+
+		if (!allIds.contains(IPageLayout.ID_RES_NAV)) {
+			allIds.add(IPageLayout.ID_RES_NAV);
+		}
+		if (!allIds.contains(IPageLayout.ID_PROJECT_EXPLORER)) {
+			allIds.add(IPageLayout.ID_PROJECT_EXPLORER);
+		}
+		if (!allIds.contains(IPageLayout.ID_OUTLINE)) {
+			allIds.add(IPageLayout.ID_OUTLINE);
+		}
+		return (String[]) allIds.toArray(new String[0]);
+	}
+
+	/**
+	 * @return
+	 */
+	private ISourceEditingTextTools createSourceEditingTextTools() {
+		ISourceEditingTextTools tools = null;
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] ids = getConfigurationPoints();
+		for (int i = 0; tools == null && i < ids.length; i++) {
+			tools = (ISourceEditingTextTools) builder.getConfiguration(NullSourceEditingTextTools.ID, ids[i]);
+		}
+		if (tools == null) {
+			tools = NullSourceEditingTextTools.getInstance();
+			((NullSourceEditingTextTools) tools).setTextEditor(this);
+		}
+		Method method = null; //$NON-NLS-1$
+		try {
+			method = tools.getClass().getMethod("setTextEditor", new Class[]{StructuredTextEditor.class}); //$NON-NLS-1$
+		}
+		catch (NoSuchMethodException e) {
+		}
+		if (method == null) {
+			try {
+				method = tools.getClass().getMethod("setTextEditor", new Class[]{ITextEditor.class}); //$NON-NLS-1$
+			}
+			catch (NoSuchMethodException e) {
+			}
+		}
+		if (method == null) {
+			try {
+				method = tools.getClass().getMethod("setTextEditor", new Class[]{IEditorPart.class}); //$NON-NLS-1$
+			}
+			catch (NoSuchMethodException e) {
+			}
+		}
+		if (method != null) {
+			if (!method.isAccessible()) {
+				method.setAccessible(true);
+			}
+			try {
+				method.invoke(tools, new Object[]{this});
+			}
+			catch (Exception e) {
+				Logger.logException("Problem creating ISourceEditingTextTools implementation", e); //$NON-NLS-1$
+			}
+		}
+
+		return tools;
+	}
+
+	/**
+	 * Creates the source viewer to be used by this editor
+	 */
+	protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
+		fAnnotationAccess = createAnnotationAccess();
+		fOverviewRuler = createOverviewRuler(getSharedColors());
+		StructuredTextViewer sourceViewer = createStructedTextViewer(parent, verticalRuler, styles);
+		initSourceViewer(sourceViewer);
+		return sourceViewer;
+	}
+
+	private ConfigurationAndTarget createSourceViewerConfiguration() {
+		ConfigurationAndTarget cat = null;
+		StructuredTextViewerConfiguration cfg = null;
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] ids = getConfigurationPoints();
+		for (int i = 0; cfg == null && i < ids.length; i++) {
+			cfg = (StructuredTextViewerConfiguration) builder.getConfiguration(ExtendedConfigurationBuilder.SOURCEVIEWERCONFIGURATION, ids[i]);
+			cat = new ConfigurationAndTarget(ids[i], cfg);
+		}
+		if (cfg == null) {
+			cfg = new StructuredTextViewerConfiguration();
+			String targetid = getClass().getName() + "#default"; //$NON-NLS-1$
+			cat = new ConfigurationAndTarget(targetid, cfg);
+		}
+		return cat;
+	}
+
+	protected StructuredTextViewer createStructedTextViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
+		return new StructuredTextViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles);
+	}
+
+	protected void createUndoRedoActions() {
+		// overridden to add icons to actions
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=111877
+		super.createUndoRedoActions();
+		IAction action = getAction(ITextEditorActionConstants.UNDO);
+		if (action != null) {
+			action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
+		}
+
+		action = getAction(ITextEditorActionConstants.REDO);
+		if (action != null) {
+			action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		Logger.trace("Source Editor", "StructuredTextEditor::dispose entry"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (org.eclipse.wst.sse.core.internal.util.Debug.perfTestAdapterClassLoading) {
+			System.out.println("Total calls to getAdapter: " + adapterRequests); //$NON-NLS-1$
+			System.out.println("Total time in getAdapter: " + adapterTime); //$NON-NLS-1$
+			System.out.println("Average time per call: " + (adapterTime / adapterRequests)); //$NON-NLS-1$
+		}
+
+		ISourceViewer viewer = getSourceViewer();
+		if (viewer instanceof ITextViewerExtension)
+			((ITextViewerExtension) viewer).removeVerifyKeyListener(fPairInserter);
+
+		// dispose of information presenter
+		if (fInformationPresenter != null) {
+			fInformationPresenter.dispose();
+			fInformationPresenter = null;
+		}
+
+		if (fOutlineHandler != null) {
+			fOutlineHandler.dispose();
+		}
+		// dispose of selection history
+		if (fSelectionHistory != null) {
+			fSelectionHistory.dispose();
+			fSelectionHistory = null;
+		}
+
+		if (fProjectionSupport != null) {
+			fProjectionSupport.dispose();
+			fProjectionSupport = null;
+		}
+
+		if (fFoldingGroup != null) {
+			fFoldingGroup.dispose();
+			fFoldingGroup = null;
+		}
+
+		// dispose of menus that were being tracked
+		if (fTextContextMenu != null) {
+			fTextContextMenu.dispose();
+		}
+		if (fRulerContextMenu != null) {
+			fRulerContextMenu.dispose();
+		}
+		if (fTextContextMenuManager != null) {
+			fTextContextMenuManager.removeMenuListener(getContextMenuListener());
+			fTextContextMenuManager.removeAll();
+			fTextContextMenuManager.dispose();
+		}
+		if (fRulerContextMenuManager != null) {
+			fRulerContextMenuManager.removeMenuListener(getContextMenuListener());
+			fRulerContextMenuManager.removeAll();
+			fRulerContextMenuManager.dispose();
+		}
+
+		// added this 2/20/2004 based on probe results --
+		// seems should be handled by setModel(null), but
+		// that's a more radical change.
+		// and, technically speaking, should not be needed,
+		// but makes a memory leak
+		// less severe.
+		if (fStructuredModel != null) {
+			fStructuredModel.removeModelStateListener(getInternalModelStateListener());
+		}
+
+		// BUG155335 - if there was no document provider, there was nothing
+		// added
+		// to document, so nothing to remove
+		if (getDocumentProvider() != null) {
+			IDocument doc = getDocumentProvider().getDocument(getEditorInput());
+			if (doc != null) {
+				if (doc instanceof IExecutionDelegatable) {
+					((IExecutionDelegatable) doc).setExecutionDelegate(null);
+				}
+			}
+		}
+
+		// some things in the configuration need to clean
+		// up after themselves
+		if (fOutlinePage != null) {
+			if (fOutlinePage instanceof ConfigurableContentOutlinePage && fOutlinePageListener != null) {
+				((ConfigurableContentOutlinePage) fOutlinePage).removeDoubleClickListener(fOutlinePageListener);
+			}
+			if (fOutlinePageListener != null) {
+				fOutlinePage.removeSelectionChangedListener(fOutlinePageListener);
+			}
+		}
+
+		fEditorDisposed = true;
+		disposeModelDependentFields();
+
+		if (fDropTarget != null)
+			fDropTarget.dispose();
+
+		if (fPartListener != null) {
+			getSite().getWorkbenchWindow().getPartService().removePartListener(fPartListener);
+			fPartListener = null;
+		}
+
+		uninstallSemanticHighlighting();
+
+		if (fPairInserter != null)
+			fPairInserter.dispose();
+
+
+		setPreferenceStore(null);
+
+		/*
+		 * Strictly speaking, but following null outs should not be needed,
+		 * but in the event of a memory leak, they make the memory leak less
+		 * severe
+		 */
+		fDropAdapter = null;
+		fDropTarget = null;
+
+		if (fStructuredSelectionProvider != null) {
+			fStructuredSelectionProvider.dispose();
+		}
+
+		setStatusLineMessage(null);
+
+		super.dispose();
+
+		Logger.trace("Source Editor", "StructuredTextEditor::dispose exit"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#disposeDocumentProvider()
+	 */
+	protected void disposeDocumentProvider() {
+		if (fStructuredModel != null && !fisReleased && !(getDocumentProvider() instanceof IModelProvider)) {
+			fStructuredModel.releaseFromEdit();
+			fisReleased = true;
+		}
+		super.disposeDocumentProvider();
+	}
+
+	/**
+	 * Disposes model specific editor helpers such as statusLineHelper.
+	 * Basically any code repeated in update() & dispose() should be placed
+	 * here.
+	 */
+	private void disposeModelDependentFields() {
+		if(fStructuredSelectionProvider != null)
+			fStructuredSelectionProvider.selectionConvertor = new SelectionConvertor();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.ITextEditor#doRevertToSaved()
+	 */
+	public void doRevertToSaved() {
+		super.doRevertToSaved();
+		if (fOutlinePage != null && fOutlinePage instanceof IUpdate) {
+			((IUpdate) fOutlinePage).update();
+		}
+		// reset undo
+		IDocument doc = getDocumentProvider().getDocument(getEditorInput());
+		if (doc instanceof IStructuredDocument) {
+			((IStructuredDocument) doc).getUndoManager().getCommandStack().flush();
+		}
+
+		// update menu text
+		updateMenuText();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void doSave(IProgressMonitor progressMonitor) {
+		IStructuredModel model = null;
+		try {
+			model = aboutToSaveModel();
+			updateEncodingMemento();
+			super.doSave(progressMonitor);
+		}
+		finally {
+			savedModel(model);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#doSetInput(org.eclipse.ui.IEditorInput)
+	 */
+	protected void doSetInput(IEditorInput input) throws CoreException {
+		IEditorInput oldInput = getEditorInput();
+		if (oldInput != null) {
+			IDocument olddoc = getDocumentProvider().getDocument(oldInput);
+			if (olddoc != null && olddoc instanceof IExecutionDelegatable) {
+				((IExecutionDelegatable) olddoc).setExecutionDelegate(null);
+			}
+		}
+
+		if (fStructuredModel != null && !(getDocumentProvider() instanceof IModelProvider)) {
+			fStructuredModel.releaseFromEdit();
+		}
+
+		//attempt to get the model for the given input
+		super.doSetInput(input);
+		IStructuredModel model = tryToGetModel(input);
+		
+		/* if could not get the model prompt user to update content type
+		 * if preferences allow, then try to get model again
+		 */
+		if(model == null &&	SSEUIPlugin.getDefault().getPreferenceStore().getBoolean(EditorPreferenceNames.SHOW_UNKNOWN_CONTENT_TYPE_MSG)) {
+			// display a dialog informing user of unknown content type giving them chance to update preferences
+			UnknownContentTypeDialog dialog = new UnknownContentTypeDialog(getSite().getShell(), SSEUIPlugin.getDefault().getPreferenceStore(), EditorPreferenceNames.SHOW_UNKNOWN_CONTENT_TYPE_MSG);
+			dialog.open();
+
+			//try to get model again in hopes user updated preferences
+			super.doSetInput(input);
+			model = tryToGetModel(input);
+			
+			//still could not get the model to open this editor so log
+			if(model == null) {
+				logUnexpectedDocumentKind(input);
+			}
+		}
+
+		if (fStructuredModel != null || model != null) {
+			setModel(model);
+		}
+
+		if (getInternalModel() != null) {
+			updateEditorControlsForContentType(getInternalModel().getContentTypeIdentifier());
+		}
+		else {
+			updateEditorControlsForContentType(null);
+		}
+
+		// start editor with smart insert mode
+		setInsertMode(SMART_INSERT);
+	}
+	
+	/**
+	 * <p>Attempts to get the {@link IStructuredModel} for the given {@link IEditorInput}</p>
+	 * 
+	 * @param input the {@link IEditorInput} to try and get the {@link IStructuredModel} for
+	 * 
+	 * @return The {@link IStructuredModel} associated with the given {@link IEditorInput} or
+	 * <code>null</code> if no associated {@link IStructuredModel} could be found.
+	 */
+	private IStructuredModel tryToGetModel(IEditorInput input) {
+		IStructuredModel model = null;
+		
+		IDocument newDocument = getDocumentProvider().getDocument(input);
+		if (newDocument instanceof IExecutionDelegatable) {
+			((IExecutionDelegatable) newDocument).setExecutionDelegate(new EditorExecutionContext(this));
+		}
+
+		// if we have a Model provider, get the model from it
+		if (getDocumentProvider() instanceof IModelProvider) {
+			model = ((IModelProvider) getDocumentProvider()).getModel(getEditorInput());
+			if (!model.isShared()) {
+				EditorModelUtil.addFactoriesTo(model);
+			}
+		}
+		else if (newDocument instanceof IStructuredDocument) {
+			// corresponding releaseFromEdit occurs in dispose()
+			model = StructuredModelManager.getModelManager().getModelForEdit((IStructuredDocument) newDocument);
+			EditorModelUtil.addFactoriesTo(model);
+		} 
+		
+		return model;
+	}
+
+	/**
+	 * Sets up this editor's context menu before it is made visible.
+	 * <p>
+	 * Not API. May be reduced to protected method in the future.
+	 * </p>
+	 * 
+	 * @param menu
+	 *            the menu
+	 */
+	public void editorContextMenuAboutToShow(IMenuManager menu) {
+		/*
+		 * To be consistent with the Java Editor, we want to remove ShiftRight
+		 * and ShiftLeft from the context menu.
+		 */
+		super.editorContextMenuAboutToShow(menu);
+		menu.remove(ITextEditorActionConstants.SHIFT_LEFT);
+		menu.remove(ITextEditorActionConstants.SHIFT_RIGHT);
+
+		addContextMenuActions(menu);
+		addSourceMenuActions(menu);
+		addRefactorMenuActions(menu);
+		addExtendedContextMenuActions(menu);
+	}
+
+	/**
+	 * End background mode.
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 */
+	void endBackgroundOperation() {
+		fBackgroundJobEnded = true;
+		// note, we don't immediately end our 'internal busy' state,
+		// since we may get many calls in a short period of
+		// time. We always wait for the time out.
+		resetBusyState();
+	}
+
+	/**
+	 * Note this method can be called indirectly from background job operation
+	 * ... but expected to be gaurded there with ILock, plus, can be called
+	 * directly from timer thread, so the timer's run method guards with ILock
+	 * too.
+	 * 
+	 * Set result[0] to 1 if the busy state was ended successfully
+	 */
+	private void endBusyStateInternal(byte[] result) {
+		if (fBackgroundJobEnded) {
+			result[0] = 1;
+			showBusy(false);
+
+			ISourceViewer viewer = getSourceViewer();
+			if (viewer instanceof StructuredTextViewer) {
+				((StructuredTextViewer) viewer).endBackgroundUpdate();
+			}
+			fBusyState = false;
+		}
+		else {
+			// we will only be in this branch for a back ground job that is
+			// taking
+			// longer than our normal time-out period (meaning we got notified
+			// of
+			// the timeout "inbetween" calls to 'begin' and
+			// 'endBackgroundOperation'.
+			// (which, remember, can only happen since there are many calls to
+			// begin/end in a short period of time, and we only "reset" on the
+			// 'ends').
+			// In this event, there's really nothing to do, we're still in
+			// "busy state"
+			// and should start a new reset cycle once endBackgroundjob is
+			// called.
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class required) {
+		if (org.eclipse.wst.sse.core.internal.util.Debug.perfTestAdapterClassLoading) {
+			startPerfTime = System.currentTimeMillis();
+		}
+		Object result = null;
+		// text editor
+		IStructuredModel internalModel = getInternalModel();
+		if (ITextEditor.class.equals(required) || ITextEditorExtension5.class.equals(required) || ITextEditorExtension4.class.equals(required) || ITextEditorExtension3.class.equals(required) || ITextEditorExtension2.class.equals(required) || ITextEditorExtension.class.equals(required)) {
+			result = this;
+		}
+		else if (IWorkbenchSiteProgressService.class.equals(required)) {
+			return getEditorPart().getSite().getAdapter(IWorkbenchSiteProgressService.class);
+		}
+		// content outline page
+		else if (IContentOutlinePage.class.equals(required)) {
+			if (fOutlinePage == null || fOutlinePage.getControl() == null || fOutlinePage.getControl().isDisposed()) {
+				ContentOutlineConfiguration cfg = createContentOutlineConfiguration();
+				if (cfg != null) {
+					ConfigurableContentOutlinePage outlinePage = new ConfigurableContentOutlinePage();
+					outlinePage.setConfiguration(cfg);
+					if (internalModel != null) {
+						outlinePage.setInputContentTypeIdentifier(internalModel.getContentTypeIdentifier());
+						outlinePage.setInput(internalModel);
+					}
+
+					if (fOutlinePageListener == null) {
+						fOutlinePageListener = new OutlinePageListener();
+					}
+
+					outlinePage.addSelectionChangedListener(fOutlinePageListener);
+					outlinePage.addDoubleClickListener(fOutlinePageListener);
+
+					fOutlinePage = outlinePage;
+				}
+			}
+			result = fOutlinePage;
+		}
+		// property sheet page, but only if the input's editable
+		else if (IPropertySheetPage.class.equals(required) && isEditable()) {
+			if (fPropertySheetPage == null || fPropertySheetPage.getControl() == null || fPropertySheetPage.getControl().isDisposed()) {
+				PropertySheetConfiguration cfg = createPropertySheetConfiguration();
+				if (cfg != null) {
+					ConfigurablePropertySheetPage propertySheetPage = new ConfigurablePropertySheetPage();
+					propertySheetPage.setConfiguration(cfg);
+					fPropertySheetPage = propertySheetPage;
+				}
+			}
+			result = fPropertySheetPage;
+		}
+		else if (IDocument.class.equals(required)) {
+			result = getDocumentProvider().getDocument(getEditorInput());
+		}
+		else if (ISourceEditingTextTools.class.equals(required)) {
+			result = createSourceEditingTextTools();
+		}
+		else if (IToggleBreakpointsTarget.class.equals(required)) {
+			result = ToggleBreakpointsTarget.getInstance();
+		}
+		else if (ITextEditorExtension4.class.equals(required)) {
+			result = this;
+		}
+		else if (IShowInTargetList.class.equals(required)) {
+			result = new ShowInTargetListAdapter();
+		}
+		else if (IVerticalRuler.class.equals(required)) {
+			return getVerticalRuler();
+		}
+		else if (SelectionHistory.class.equals(required)) {
+			if (fSelectionHistory == null)
+				fSelectionHistory = new SelectionHistory(this);
+			result = fSelectionHistory;
+		}
+		else if (IResource.class.equals(required)) {
+			IEditorInput input = getEditorInput();
+			if (input != null) {
+				result = input.getAdapter(required);
+			}
+		}
+		else {
+			if (result == null && internalModel != null) {
+				result = internalModel.getAdapter(required);
+			}
+			// others
+			if (result == null)
+				result = super.getAdapter(required);
+		}
+		if (result == null) {
+//			Logger.log(Logger.INFO_DEBUG, "StructuredTextEditor.getAdapter returning null for " + required); //$NON-NLS-1$
+		}
+		if (org.eclipse.wst.sse.core.internal.util.Debug.perfTestAdapterClassLoading) {
+			long stop = System.currentTimeMillis();
+			adapterRequests++;
+			adapterTime += (stop - startPerfTime);
+		}
+		if (org.eclipse.wst.sse.core.internal.util.Debug.perfTestAdapterClassLoading) {
+			System.out.println("Total calls to getAdapter: " + adapterRequests); //$NON-NLS-1$
+			System.out.println("Total time in getAdapter: " + adapterTime); //$NON-NLS-1$
+			System.out.println("Average time per call: " + (adapterTime / adapterRequests)); //$NON-NLS-1$
+		}
+		return result;
+	}
+
+	private String[] getConfigurationPoints() {
+		String contentTypeIdentifierID = null;
+		if (getInternalModel() != null) {
+			contentTypeIdentifierID = getInternalModel().getContentTypeIdentifier();
+		}
+		return ConfigurationPointCalculator.getConfigurationPoints(this, contentTypeIdentifierID, ConfigurationPointCalculator.SOURCE, StructuredTextEditor.class);
+	}
+
+	/**
+	 * added checks to overcome bug such that if we are shutting down in an
+	 * error condition, then viewer will have already been disposed.
+	 */
+	protected String getCursorPosition() {
+		String result = null;
+		// this may be too expensive in terms of
+		// performance, to do this check
+		// every time, just to gaurd against error
+		// condition.
+		// perhaps there's a better way?
+		if (getSourceViewer() != null && getSourceViewer().getTextWidget() != null && !getSourceViewer().getTextWidget().isDisposed()) {
+			result = super.getCursorPosition();
+		}
+		else {
+			result = "0:0"; //$NON-NLS-1$
+		}
+		return result;
+	}
+
+
+	Display getDisplay() {
+		return PlatformUI.getWorkbench().getDisplay();
+	}
+
+	/**
+	 * Returns this editor part.
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 * 
+	 * @return this editor part
+	 */
+	public IEditorPart getEditorPart() {
+		if (fEditorPart == null)
+			return this;
+		return fEditorPart;
+	}
+
+	IStructuredModel getInternalModel() {
+		return fStructuredModel;
+	}
+
+	private InternalModelStateListener getInternalModelStateListener() {
+		if (fInternalModelStateListener == null) {
+			fInternalModelStateListener = new InternalModelStateListener();
+		}
+		return fInternalModelStateListener;
+	}
+
+	/**
+	 * Returns this editor's StructuredModel.
+	 * <p>
+	 * Not API. Will be removed in the future.
+	 * </p>
+	 * 
+	 * @return returns this editor's IStructuredModel
+	 * @deprecated - This method allowed for uncontrolled access to the model
+	 *             instance and will be removed in the future. It is
+	 *             recommended that the current document provider be asked for
+	 *             the current document and the IModelManager then asked for
+	 *             the corresponding model with
+	 *             getExistingModelFor*(IDocument). Supported document
+	 *             providers ensure that the document maps to a shared
+	 *             structured model.
+	 */
+	public IStructuredModel getModel() {
+		IDocumentProvider documentProvider = getDocumentProvider();
+		
+		if (documentProvider == null) {
+			// this indicated an error in startup sequence
+			Logger.trace(getClass().getName(), "Program Info Only: document provider was null when model requested"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		
+		// Remember if we entered this method without a model existing
+		boolean initialModelNull = (fStructuredModel == null);
+		
+		if (fStructuredModel == null && documentProvider != null) {
+			// lazily set the model instance, although this is an ABNORMAL
+			// CODE PATH
+			if (documentProvider instanceof IModelProvider) {
+				fStructuredModel = ((IModelProvider) documentProvider).getModel(getEditorInput());
+				fisReleased = false;
+			}
+			else {
+				IDocument doc = documentProvider.getDocument(getEditorInput());
+				if (doc instanceof IStructuredDocument) {
+					/*
+					 * Called in this manner because getExistingModel can skip
+					 * some calculations always performed in getModelForEdit
+					 */
+					IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
+					if (model == null) {
+						model = StructuredModelManager.getModelManager().getModelForEdit((IStructuredDocument) doc);
+					}
+					fStructuredModel = model;
+					fisReleased = false;
+				}
+			}
+
+			EditorModelUtil.addFactoriesTo(fStructuredModel);
+
+			if (initialModelNull && fStructuredModel != null) {
+				/*
+				 * DMW: 9/1/2002 -- why is update called here? No change has
+				 * been indicated? I'd like to remove, but will leave for now
+				 * to avoid breaking this hack. Should measure/breakpoint to
+				 * see how large the problem is. May cause performance
+				 * problems.
+				 * 
+				 * DMW: 9/8/2002 -- not sure why this was here initially, but
+				 * the intent/hack must have been to call update if this was
+				 * the first time fStructuredModel was set. So, I added the
+				 * logic to check for that "first time" case. It would appear
+				 * we don't really need. may remove in future when can test
+				 * more.
+				 */
+				update();
+			}
+		}
+		return fStructuredModel;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.part.IWorkbenchPartOrientation#getOrientation()
+	 */
+	public int getOrientation() {
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88714
+		return SWT.LEFT_TO_RIGHT;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.ITextEditor#getSelectionProvider()
+	 */
+	public ISelectionProvider getSelectionProvider() {
+		if (fStructuredSelectionProvider == null) {
+			ISelectionProvider parentProvider = super.getSelectionProvider();
+			if (parentProvider != null) {
+				fStructuredSelectionProvider = new StructuredSelectionProvider(parentProvider, this);
+				fStructuredSelectionProvider.addPostSelectionChangedListener(new ISelectionChangedListener() {
+					public void selectionChanged(SelectionChangedEvent event) {
+						updateStatusLine(event.getSelection());
+					}
+				});
+				if (fStructuredModel != null) {
+					SelectionConvertor convertor = (SelectionConvertor) fStructuredModel.getAdapter(SelectionConvertor.class);
+					if (convertor != null) {
+						fStructuredSelectionProvider.selectionConvertor = convertor;
+					}
+				}
+			}
+		}
+		if (fStructuredSelectionProvider == null) {
+			return super.getSelectionProvider();
+		}
+		return fStructuredSelectionProvider;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#getStatusLineManager()
+	 * 
+	 * Overridden to use the top-level editor part's status line
+	 */
+	protected IStatusLineManager getStatusLineManager() {
+		return getEditorPart().getEditorSite().getActionBars().getStatusLineManager();
+	}
+
+	/**
+	 * Returns the editor's source viewer. This method was created to expose
+	 * the protected final getSourceViewer() method.
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 * 
+	 * @return the editor's source viewer
+	 */
+	public StructuredTextViewer getTextViewer() {
+		return (StructuredTextViewer) getSourceViewer();
+	}
+
+	/**
+	 * Jumps to the matching bracket.
+	 */
+	void gotoMatchingBracket() {
+		ICharacterPairMatcher matcher = createCharacterPairMatcher();
+		if (matcher == null)
+			return;
+
+		ISourceViewer sourceViewer = getSourceViewer();
+		IDocument document = sourceViewer.getDocument();
+		if (document == null)
+			return;
+
+		IRegion selection = getSignedSelection(sourceViewer);
+
+		int selectionLength = Math.abs(selection.getLength());
+		if (selectionLength > 1) {
+			setStatusLineErrorMessage(SSEUIMessages.GotoMatchingBracket_error_invalidSelection);
+			sourceViewer.getTextWidget().getDisplay().beep();
+			return;
+		}
+
+		int sourceCaretOffset = selection.getOffset() + selection.getLength();
+		IRegion region = matcher.match(document, sourceCaretOffset);
+		if (region == null) {
+			setStatusLineErrorMessage(SSEUIMessages.GotoMatchingBracket_error_noMatchingBracket);
+			sourceViewer.getTextWidget().getDisplay().beep();
+			return;
+		}
+
+		int offset = region.getOffset();
+		int length = region.getLength();
+
+		if (length < 1)
+			return;
+
+		int anchor = matcher.getAnchor();
+
+		// go to after the match if matching to the right
+		int targetOffset = (ICharacterPairMatcher.RIGHT == anchor) ? offset : offset + length;
+
+		boolean visible = false;
+		if (sourceViewer instanceof ITextViewerExtension5) {
+			ITextViewerExtension5 extension = (ITextViewerExtension5) sourceViewer;
+			visible = (extension.modelOffset2WidgetOffset(targetOffset) > -1);
+		}
+		else {
+			IRegion visibleRegion = sourceViewer.getVisibleRegion();
+			// http://dev.eclipse.org/bugs/show_bug.cgi?id=34195
+			visible = (targetOffset >= visibleRegion.getOffset() && targetOffset <= visibleRegion.getOffset() + visibleRegion.getLength());
+		}
+
+		if (!visible) {
+			setStatusLineErrorMessage(SSEUIMessages.GotoMatchingBracket_error_bracketOutsideSelectedElement);
+			sourceViewer.getTextWidget().getDisplay().beep();
+			return;
+		}
+
+		if (selection.getLength() < 0)
+			targetOffset -= selection.getLength();
+
+		if (sourceViewer != null) {
+			sourceViewer.setSelectedRange(targetOffset, selection.getLength());
+			sourceViewer.revealRange(targetOffset, selection.getLength());
+		}
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#handleCursorPositionChanged()
+	 */
+	protected void handleCursorPositionChanged() {
+		super.handleCursorPositionChanged();
+		updateStatusField(StructuredTextEditorActionConstants.STATUS_CATEGORY_OFFSET);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#handlePreferenceStoreChanged(org.eclipse.jface.util.PropertyChangeEvent)
+	 */
+	protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
+		String property = event.getProperty();
+
+		if (EditorPreferenceNames.EDITOR_TEXT_HOVER_MODIFIERS.equals(property)) {
+			updateHoverBehavior();
+		}
+		
+		//enable or disable as you type validation
+		else if(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS.equals(property)) {
+			IReconciler reconciler = this.getSourceViewerConfiguration().getReconciler(this.getSourceViewer());
+			if (reconciler instanceof DocumentRegionProcessor) {
+				((DocumentRegionProcessor) reconciler).setValidatorStrategyEnabled(isValidationEnabled());
+			}
+		}
+
+		else if (AbstractStructuredFoldingStrategy.FOLDING_ENABLED.equals(property)) {
+			if (getSourceViewer() instanceof ProjectionViewer) {
+				// install projection support if it has not even been
+				// installed yet
+				if (isFoldingEnabled() && (fProjectionSupport == null)) {
+					installProjectionSupport();
+				}
+				ProjectionViewer pv = (ProjectionViewer) getSourceViewer();
+				if (pv.isProjectionMode() != isFoldingEnabled()) {
+					if (pv.canDoOperation(ProjectionViewer.TOGGLE)) {
+						pv.doOperation(ProjectionViewer.TOGGLE);
+					}
+				}
+			}
+		}
+
+		// update content assist preferences
+		else if (EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND.equals(property)) {
+			ISourceViewer sourceViewer = getSourceViewer();
+			if (sourceViewer != null) {
+				SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+				if (configuration != null) {
+					IContentAssistant contentAssistant = configuration.getContentAssistant(sourceViewer);
+					if (contentAssistant instanceof ContentAssistant) {
+						ContentAssistant assistant = (ContentAssistant) contentAssistant;
+						RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND);
+						Color color = EditorUtility.getColor(rgb);
+						assistant.setProposalSelectorBackground(color);
+					}
+				}
+			}
+		}
+
+		// update content assist preferences
+		else if (EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND.equals(property)) {
+			ISourceViewer sourceViewer = getSourceViewer();
+			if (sourceViewer != null) {
+				SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+				if (configuration != null) {
+					IContentAssistant contentAssistant = configuration.getContentAssistant(sourceViewer);
+					if (contentAssistant instanceof ContentAssistant) {
+						ContentAssistant assistant = (ContentAssistant) contentAssistant;
+						RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND);
+						Color color = EditorUtility.getColor(rgb);
+						assistant.setProposalSelectorForeground(color);
+					}
+				}
+			}
+		}
+
+		// update content assist preferences
+		else if (EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND.equals(property)) {
+			ISourceViewer sourceViewer = getSourceViewer();
+			if (sourceViewer != null) {
+				SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+				if (configuration != null) {
+					IContentAssistant contentAssistant = configuration.getContentAssistant(sourceViewer);
+					if (contentAssistant instanceof ContentAssistant) {
+						ContentAssistant assistant = (ContentAssistant) contentAssistant;
+						RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND);
+						Color color = EditorUtility.getColor(rgb);
+						assistant.setContextInformationPopupBackground(color);
+						assistant.setContextSelectorBackground(color);
+					}
+				}
+			}
+		}
+
+		// update content assist preferences
+		else if (EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND.equals(property)) {
+			ISourceViewer sourceViewer = getSourceViewer();
+			if (sourceViewer != null) {
+				SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+				if (configuration != null) {
+					IContentAssistant contentAssistant = configuration.getContentAssistant(sourceViewer);
+					if (contentAssistant instanceof ContentAssistant) {
+						ContentAssistant assistant = (ContentAssistant) contentAssistant;
+						RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND);
+						Color color = EditorUtility.getColor(rgb);
+						assistant.setContextInformationPopupForeground(color);
+						assistant.setContextSelectorForeground(color);
+					}
+				}
+			}
+		}
+
+		super.handlePreferenceStoreChanged(event);
+	}
+
+	private boolean inBusyState() {
+		return fBusyState;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite,
+	 *      org.eclipse.ui.IEditorInput)
+	 */
+	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+		// if we've gotten an error elsewhere, before
+		// we've actually opened, then don't open.
+		if (shouldClose) {
+			setSite(site);
+			close(false);
+		}
+		else {
+			super.init(site, input);
+		}
+	}
+
+	/**
+	 * Set the document provider for this editor.
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 * 
+	 * @param documentProvider
+	 *            documentProvider to initialize
+	 */
+	public void initializeDocumentProvider(IDocumentProvider documentProvider) {
+		if (documentProvider != null) {
+			setDocumentProvider(documentProvider);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#initializeDragAndDrop(org.eclipse.jface.text.source.ISourceViewer)
+	 */
+	protected void initializeDragAndDrop(ISourceViewer viewer) {
+		IPreferenceStore store = getPreferenceStore();
+		if (store != null && store.getBoolean(PREFERENCE_TEXT_DRAG_AND_DROP_ENABLED))
+			initializeDrop(viewer);
+	}
+
+	protected void initializeDrop(ITextViewer textViewer) {
+		int operations = DND.DROP_COPY | DND.DROP_MOVE;
+		fDropTarget = new DropTarget(textViewer.getTextWidget(), operations);
+		fDropAdapter = new ReadOnlyAwareDropTargetAdapter(true);
+		fDropAdapter.setTargetEditor(this);
+		fDropAdapter.setTargetIDs(getConfigurationPoints());
+		fDropAdapter.setTextViewer(textViewer);
+		fDropTarget.setTransfer(fDropAdapter.getTransfers());
+		fDropTarget.addDropListener(fDropAdapter);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#initializeEditor()
+	 */
+	protected void initializeEditor() {
+		super.initializeEditor();
+
+		setPreferenceStore(createCombinedPreferenceStore());
+
+		setRangeIndicator(new DefaultRangeIndicator());
+		setEditorContextMenuId(EDITOR_CONTEXT_MENU_ID);
+		initializeDocumentProvider(null);
+		// set the infopop for source viewer
+		String helpId = getHelpContextId();
+		// no infopop set or using default text editor help, use default
+		if (helpId == null || ITextEditorHelpContextIds.TEXT_EDITOR.equals(helpId))
+			helpId = IHelpContextIds.XML_SOURCE_VIEW_HELPID;
+		setHelpContextId(helpId);
+		// defect 203158 - disable ruler context menu for
+		// beta
+		// setRulerContextMenuId(RULER_CONTEXT_MENU_ID);
+		configureInsertMode(SMART_INSERT, true);
+
+		// enable the base source editor activity when editor opens
+		try {
+			// FIXME: - commented out to avoid minor dependancy during
+			// transition to org.eclipse
+			// WTPActivityBridge.getInstance().enableActivity(CORE_SSE_ACTIVITY_ID,
+			// true);
+		}
+		catch (Exception t) {
+			// if something goes wrong with enabling activity, just log the
+			// error but dont
+			// have it break the editor
+			Logger.log(Logger.WARNING_DEBUG, t.getMessage(), t);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.editors.text.TextEditor#initializeKeyBindingScopes()
+	 */
+	protected void initializeKeyBindingScopes() {
+		setKeyBindingScopes(new String[]{EDITOR_KEYBINDING_SCOPE_ID});
+	}
+
+	/**
+	 * Initializes the editor's source viewer and other items that were source
+	 * viewer-dependent.
+	 */
+	private void initializeSourceViewer() {
+		IAction openHyperlinkAction = getAction(StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE);
+		if (openHyperlinkAction instanceof OpenHyperlinkAction) {
+			((OpenHyperlinkAction) openHyperlinkAction).setHyperlinkDetectors(getSourceViewerConfiguration().getHyperlinkDetectors(getSourceViewer()));
+		}
+
+		// do not even install projection support until folding is actually
+		// enabled
+		if (isFoldingEnabled()) {
+			installProjectionSupport();
+		}
+	}
+
+	protected void initSourceViewer(StructuredTextViewer sourceViewer) {
+		// ensure decoration support is configured
+		getSourceViewerDecorationSupport(sourceViewer);
+	}
+
+	protected void installTextDragAndDrop(ISourceViewer viewer) {
+		// do nothing
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.editors.text.TextEditor#installEncodingSupport()
+	 */
+	protected void installEncodingSupport() {
+		fEncodingSupport = new EncodingSupport(getConfigurationPoints());
+		fEncodingSupport.initialize(this);
+	}
+
+	/**
+	 * Install everything necessary to get document folding working and enable
+	 * document folding
+	 */
+	private void installProjectionSupport() {
+		ProjectionViewer projectionViewer = (ProjectionViewer) getSourceViewer();
+
+		fProjectionSupport = new ProjectionSupport(projectionViewer, getAnnotationAccess(), getSharedColors());
+		fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.error"); //$NON-NLS-1$
+		fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.warning"); //$NON-NLS-1$
+		fProjectionSupport.setHoverControlCreator(new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				return new DefaultInformationControl(parent);
+			}
+		});
+		fProjectionSupport.install();
+
+		if (isFoldingEnabled())
+			projectionViewer.doOperation(ProjectionViewer.TOGGLE);
+	}
+
+	/**
+	 * Return whether document folding should be enabled according to the
+	 * preference store settings.
+	 * 
+	 * @return <code>true</code> if document folding should be enabled
+	 */
+	private boolean isFoldingEnabled() {
+		IPreferenceStore store = getPreferenceStore();
+		// check both preference store and vm argument
+		return (store.getBoolean(AbstractStructuredFoldingStrategy.FOLDING_ENABLED));
+	}
+	
+	/**
+	 * Determine if the user preference for as you type validation is enabled or not
+	 */
+	private boolean isValidationEnabled() {
+		return getPreferenceStore().getBoolean(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS);
+	}
+
+	/**
+	 * <p>Logs a warning about how this {@link StructuredTextEditor} just opened an {@link IEditorInput}
+	 * it was not designed to open.</p>
+	 * 
+	 * @param input the {@link IEditorInput} this {@link StructuredTextEditor} was not designed to open
+	 * to log the message about.
+	 */
+	private void logUnexpectedDocumentKind(IEditorInput input) {
+		Logger.log(Logger.WARNING, "StructuredTextEditor being used without StructuredDocument"); //$NON-NLS-1$
+		String name = null;
+		if (input != null) {
+			name = input.getName();
+		}
+		else {
+			name = "input was null"; //$NON-NLS-1$
+		}
+		Logger.log(Logger.WARNING, "         Input Name: " + name); //$NON-NLS-1$
+		String implClass = null;
+		IDocument document = getDocumentProvider().getDocument(input);
+		if (document != null) {
+			implClass = document.getClass().getName();
+		}
+		else {
+			implClass = "document was null"; //$NON-NLS-1$
+		}
+		Logger.log(Logger.WARNING, "Unexpected IDocument implementation: " + implClass + "\n\tIDocumentProvider implementation: " + getDocumentProvider().getClass().getName()); //$NON-NLS-1$  //$NON-NLS-2$
+	}
+
+	/*
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#performRevert()
+	 */
+	protected void performRevert() {
+		ProjectionViewer projectionViewer = (ProjectionViewer) getSourceViewer();
+		projectionViewer.setRedraw(false);
+		try {
+
+			boolean projectionMode = projectionViewer.isProjectionMode();
+			if (projectionMode) {
+				projectionViewer.disableProjection();
+			}
+
+			super.performRevert();
+
+			if (projectionMode) {
+				projectionViewer.enableProjection();
+			}
+
+		}
+		finally {
+			projectionViewer.setRedraw(true);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Not API. May be reduced to protected method in the future.
+	 * </p>
+	 */
+	public void rememberSelection() {
+		/*
+		 * This method was made public for use by editors that use
+		 * StructuredTextEditor (like some clients)
+		 */
+		super.rememberSelection();
+	}
+
+
+	/**
+	 * both starts and resets the busy state timer
+	 */
+	private void resetBusyState() {
+		// reset the "busy" timeout
+		if (fBusyTimer != null) {
+			fBusyTimer.cancel();
+		}
+		startBusyTimer();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Not API. May be reduced to protected method in the future.
+	 * </p>
+	 */
+	public void restoreSelection() {
+		/*
+		 * This method was made public for use by editors that use
+		 * StructuredTextEditor (like some clients)
+		 */
+		// catch odd case where source viewer has no text
+		// widget (defect
+		// 227670)
+		if ((getSourceViewer() != null) && (getSourceViewer().getTextWidget() != null))
+			super.restoreSelection();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#rulerContextMenuAboutToShow(org.eclipse.jface.action.IMenuManager)
+	 */
+	protected void rulerContextMenuAboutToShow(IMenuManager menu) {
+		super.rulerContextMenuAboutToShow(menu);
+
+		IMenuManager foldingMenu = new MenuManager(SSEUIMessages.Folding, "projection"); //$NON-NLS-1$
+		menu.appendToGroup(ITextEditorActionConstants.GROUP_RULERS, foldingMenu);
+
+		IAction action = getAction("FoldingToggle"); //$NON-NLS-1$
+		foldingMenu.add(action);
+		action = getAction("FoldingExpandAll"); //$NON-NLS-1$
+		foldingMenu.add(action);
+		action = getAction("FoldingCollapseAll"); //$NON-NLS-1$
+		foldingMenu.add(action);
+
+		IStructuredModel internalModel = getInternalModel();
+		if (internalModel != null) {
+			boolean debuggingAvailable = BreakpointProviderBuilder.getInstance().isAvailable(internalModel.getContentTypeIdentifier(), BreakpointRulerAction.getFileExtension(getEditorInput()));
+			if (debuggingAvailable) {
+				// append actions to "debug" group (created in
+				// AbstractDecoratedTextEditor.rulerContextMenuAboutToShow(IMenuManager)
+				menu.appendToGroup("debug", getAction(ActionDefinitionIds.TOGGLE_BREAKPOINTS)); //$NON-NLS-1$
+				menu.appendToGroup("debug", getAction(ActionDefinitionIds.MANAGE_BREAKPOINTS)); //$NON-NLS-1$
+				menu.appendToGroup("debug", getAction(ActionDefinitionIds.EDIT_BREAKPOINTS)); //$NON-NLS-1$
+			}
+			addExtendedRulerContextMenuActions(menu);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * Overridden to expose part activation handling for multi-page editors.
+	 * </p>
+	 * <p>
+	 * Not API. May be reduced to protected method in the future.
+	 * </p>
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#safelySanityCheckState(org.eclipse.ui.IEditorInput)
+	 */
+	public void safelySanityCheckState(IEditorInput input) {
+		super.safelySanityCheckState(input);
+	}
+	
+	protected void sanityCheckState(IEditorInput input) {
+		try {
+			++validateEditCount;
+			super.sanityCheckState(input);
+		}
+		finally {
+			--validateEditCount;
+		}
+	}
+
+	private void savedModel(IStructuredModel model) {
+		if (model != null) {
+			model.changedModel();
+		}
+	}
+
+	/**
+	 * Ensure that the correct IDocumentProvider is used. For direct models, a
+	 * special provider is used. For StorageEditorInputs, use a custom
+	 * provider that creates a usable ResourceAnnotationModel. For everything
+	 * else, use the base support.
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#setDocumentProvider(org.eclipse.ui.IEditorInput)
+	 */
+	protected void setDocumentProvider(IEditorInput input) {
+		if (input instanceof IStructuredModel) {
+			// largely untested
+			setDocumentProvider(StructuredModelDocumentProvider.getInstance());
+		}
+		else if (input instanceof IStorageEditorInput && !(input instanceof IFileEditorInput)) {
+			setDocumentProvider(StorageModelProvider.getInstance());
+		}
+		else {
+			super.setDocumentProvider(input);
+		}
+	}
+
+	/**
+	 * Set editor part associated with this editor.
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 * 
+	 * @param editorPart
+	 *            editor part associated with this editor
+	 */
+	public void setEditorPart(IEditorPart editorPart) {
+		fEditorPart = editorPart;
+	}
+
+	/**
+	 * Sets the model field within this editor.
+	 * 
+	 * @deprecated - can eventually be eliminated
+	 */
+	private void setModel(IStructuredModel newModel) {
+		Assert.isNotNull(getDocumentProvider(), "document provider can not be null when setting model"); //$NON-NLS-1$
+		if (fStructuredModel != null) {
+			fStructuredModel.removeModelStateListener(getInternalModelStateListener());
+		}
+		fStructuredModel = newModel;
+		if (fStructuredModel != null) {
+			fStructuredModel.addModelStateListener(getInternalModelStateListener());
+		}
+		// update() should be called whenever the model is
+		// set or changed
+		update();
+	}
+
+	/**
+	 * Sets the editor's source viewer configuration which it uses to
+	 * configure it's internal source viewer. This method was overwritten so
+	 * that viewer configuration could be set after editor part was created.
+	 */
+	protected void setSourceViewerConfiguration(SourceViewerConfiguration config) {
+		SourceViewerConfiguration oldSourceViewerConfiguration = getSourceViewerConfiguration();
+		super.setSourceViewerConfiguration(config);
+		StructuredTextViewer stv = getTextViewer();
+		if (stv != null) {
+			/*
+			 * There should be no need to unconfigure before configure because
+			 * configure will also unconfigure before configuring
+			 */
+			removeReconcilingListeners(oldSourceViewerConfiguration, stv);
+			stv.unconfigure();
+			setStatusLineMessage(null);
+			stv.configure(config);
+			addReconcilingListeners(config, stv);
+		}
+	}
+	
+	private void removeReconcilingListeners(SourceViewerConfiguration config, StructuredTextViewer stv) {
+		IReconciler reconciler = config.getReconciler(stv);
+		if (reconciler instanceof DocumentRegionProcessor) {
+			for (int i = 0; i < fReconcilingListeners.length; i++) {
+				((DocumentRegionProcessor) reconciler).removeReconcilingListener(fReconcilingListeners[i]);
+			}
+		}
+	}
+
+	private void addReconcilingListeners(SourceViewerConfiguration config, StructuredTextViewer stv) {
+		try {
+			List reconcilingListeners = new ArrayList(fReconcilingListeners.length);
+			String[] ids = getConfigurationPoints();
+			for (int i = 0; i < ids.length; i++) {
+				reconcilingListeners.addAll(ExtendedConfigurationBuilder.getInstance().getConfigurations("sourceReconcilingListener", ids[i])); //$NON-NLS-1$
+			}
+			fReconcilingListeners = (ISourceReconcilingListener[]) reconcilingListeners.toArray(new ISourceReconcilingListener[reconcilingListeners.size()]);
+		}
+		catch (ClassCastException e) {
+			Logger.log(Logger.ERROR, "Configuration has a reconciling listener that does not implement ISourceReconcilingListener."); //$NON-NLS-1$
+		}
+
+		IReconciler reconciler = config.getReconciler(stv);
+		if (reconciler instanceof DocumentRegionProcessor) {
+			for (int i = 0; i < fReconcilingListeners.length; i++)
+				((DocumentRegionProcessor) reconciler).addReconcilingListener(fReconcilingListeners[i]);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
+	 */
+	public void showBusy(boolean busy) {
+		if (busy) {
+			fRememberTitle = getPartName();
+			// update title and/or fonts and/or background
+			//
+			// temp solution, for testing, uses "busy"
+			setPartName(SSEUIMessages.busy); //$NON-NLS-1$
+		}
+		else {
+			// reset to what it was
+			setPartName(fRememberTitle);
+		}
+	}
+
+	private void startBusyTimer() {
+		// TODO: we need a resettable timer, so not so
+		// many are created
+		fBusyTimer = new Timer(true);
+		fBusyTimer.schedule(new TimeOutExpired(), BUSY_STATE_DELAY);
+	}
+
+	protected void uninstallTextDragAndDrop(ISourceViewer viewer) {
+		// do nothing
+	}
+
+	/**
+	 * Update should be called whenever the model is set or changed (as in
+	 * swapped)
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 */
+	public void update() {
+		if (fOutlinePage != null && fOutlinePage instanceof ConfigurableContentOutlinePage) {
+			ContentOutlineConfiguration cfg = createContentOutlineConfiguration();
+			((ConfigurableContentOutlinePage) fOutlinePage).setConfiguration(cfg);
+			IStructuredModel internalModel = getInternalModel();
+			((ConfigurableContentOutlinePage) fOutlinePage).setInputContentTypeIdentifier(internalModel.getContentTypeIdentifier());
+			((ConfigurableContentOutlinePage) fOutlinePage).setInput(internalModel);
+		}
+		if (fPropertySheetPage != null && fPropertySheetPage instanceof ConfigurablePropertySheetPage) {
+			PropertySheetConfiguration cfg = createPropertySheetConfiguration();
+			((ConfigurablePropertySheetPage) fPropertySheetPage).setConfiguration(cfg);
+		}
+		disposeModelDependentFields();
+
+		fShowInTargetIds = createShowInTargetIds();
+
+		if (getSourceViewerConfiguration() instanceof StructuredTextViewerConfiguration && fStatusLineLabelProvider != null) {
+			fStatusLineLabelProvider.dispose();
+		}
+
+		String configurationId = fViewerConfigurationTargetId;
+		updateSourceViewerConfiguration();
+
+		/* Only reinstall if the configuration id has changed */
+		if (configurationId != null && !configurationId.equals(fViewerConfigurationTargetId)) {
+			uninstallSemanticHighlighting();
+			installSemanticHighlighting();
+		}
+
+		if (getSourceViewerConfiguration() instanceof StructuredTextViewerConfiguration) {
+			fStatusLineLabelProvider = ((StructuredTextViewerConfiguration) getSourceViewerConfiguration()).getStatusLineLabelProvider(getSourceViewer());
+			updateStatusLine(null);
+		}
+
+		if (fEncodingSupport != null && fEncodingSupport instanceof EncodingSupport) {
+			((EncodingSupport) fEncodingSupport).reinitialize(getConfigurationPoints());
+		}
+
+		createModelDependentFields();
+	}
+
+	/**
+	 * Updates all content dependent actions.
+	 */
+	protected void updateContentDependentActions() {
+		super.updateContentDependentActions();
+		// super.updateContentDependentActions only updates
+		// the enable/disable
+		// state of all
+		// the content dependent actions.
+		// StructuredTextEditor's undo and redo actions
+		// have a detail label and
+		// description.
+		// They needed to be updated.
+		if (!fEditorDisposed)
+			updateMenuText();
+	}
+
+
+	/**
+	 * Updates the editor context menu by creating a new context menu with the
+	 * given menu id
+	 * 
+	 * @param contextMenuId
+	 *            Cannot be null
+	 */
+	private void updateEditorContextMenuId(String contextMenuId) {
+		// update editor context menu id if updating to a new id or if context
+		// menu is not already set up
+		if (!contextMenuId.equals(getEditorContextMenuId()) || (fTextContextMenu == null)) {
+			setEditorContextMenuId(contextMenuId);
+
+			if (getSourceViewer() != null) {
+				StyledText styledText = getSourceViewer().getTextWidget();
+				if (styledText != null) {
+					// dispose of previous context menu
+					if (fTextContextMenu != null) {
+						fTextContextMenu.dispose();
+					}
+					if (fTextContextMenuManager != null) {
+						fTextContextMenuManager.removeMenuListener(getContextMenuListener());
+						fTextContextMenuManager.removeAll();
+						fTextContextMenuManager.dispose();
+					}
+
+					fTextContextMenuManager = new MenuManager(getEditorContextMenuId(), getEditorContextMenuId());
+					fTextContextMenuManager.setRemoveAllWhenShown(true);
+					fTextContextMenuManager.addMenuListener(getContextMenuListener());
+
+					fTextContextMenu = fTextContextMenuManager.createContextMenu(styledText);
+					styledText.setMenu(fTextContextMenu);
+
+					getSite().registerContextMenu(getEditorContextMenuId(), fTextContextMenuManager, getSelectionProvider());
+
+					// also register this menu for source page part and
+					// structured text editor ids
+					String partId = getSite().getId();
+					if (partId != null) {
+						getSite().registerContextMenu(partId + EDITOR_CONTEXT_MENU_SUFFIX, fTextContextMenuManager, getSelectionProvider());
+					}
+					getSite().registerContextMenu(EDITOR_CONTEXT_MENU_ID, fTextContextMenuManager, getSelectionProvider());
+				}
+			}
+		}
+	}
+
+	/**
+	 * Updates editor context menu, vertical ruler menu, help context id for
+	 * new content type
+	 * 
+	 * @param contentType
+	 */
+	private void updateEditorControlsForContentType(String contentType) {
+		if (contentType == null) {
+			updateEditorContextMenuId(EDITOR_CONTEXT_MENU_ID);
+			updateRulerContextMenuId(RULER_CONTEXT_MENU_ID);
+			updateHelpContextId(ITextEditorHelpContextIds.TEXT_EDITOR);
+		}
+		else {
+			updateEditorContextMenuId(contentType + EDITOR_CONTEXT_MENU_SUFFIX);
+			updateRulerContextMenuId(contentType + RULER_CONTEXT_MENU_SUFFIX);
+			updateHelpContextId(contentType + "_source_HelpId"); //$NON-NLS-1$
+			
+			/* Activate the contexts defined for this editor */
+			activateContexts((IContextService) getSite().getService(IContextService.class));
+		}
+	}
+	
+	private void updateEncodingMemento() {
+		boolean failed = false;
+		IStructuredModel internalModel = getInternalModel();
+		if (internalModel != null) {
+			IStructuredDocument doc = internalModel.getStructuredDocument();
+			EncodingMemento memento = doc.getEncodingMemento();
+			IDocumentCharsetDetector detector = internalModel.getModelHandler().getEncodingDetector();
+			if (memento != null && detector != null) {
+				detector.set(doc);
+				try {
+					String newEncoding = detector.getEncoding();
+					if (newEncoding != null) {
+						memento.setDetectedCharsetName(newEncoding);
+					}
+				}
+				catch (IOException e) {
+					failed = true;
+				}
+			}
+			/**
+			 * Be sure to use the new value but only if no exception
+			 * occurred. (we may find cases we need to do more error recovery
+			 * there) should be near impossible to get IOException from
+			 * processing the _document_
+			 */
+			if (!failed) {
+				doc.setEncodingMemento(memento);
+			}
+		}
+	}
+
+	/**
+	 * Updates the help context of the editor with the given help context id
+	 * 
+	 * @param helpContextId
+	 *            Cannot be null
+	 */
+	private void updateHelpContextId(String helpContextId) {
+		if (!helpContextId.equals(getHelpContextId())) {
+			setHelpContextId(helpContextId);
+
+			if (getSourceViewer() != null) {
+				StyledText styledText = getSourceViewer().getTextWidget();
+				if (styledText != null) {
+					IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem();
+					helpSystem.setHelp(styledText, getHelpContextId());
+				}
+			}
+		}
+	}
+
+	/*
+	 * Update the hovering behavior depending on the preferences.
+	 */
+	private void updateHoverBehavior() {
+		SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+		String[] types = configuration.getConfiguredContentTypes(getSourceViewer());
+
+		for (int i = 0; i < types.length; i++) {
+
+			String t = types[i];
+
+			ISourceViewer sourceViewer = getSourceViewer();
+			if (sourceViewer instanceof ITextViewerExtension2) {
+				// Remove existing hovers
+				((ITextViewerExtension2) sourceViewer).removeTextHovers(t);
+
+				int[] stateMasks = configuration.getConfiguredTextHoverStateMasks(getSourceViewer(), t);
+
+				if (stateMasks != null) {
+					for (int j = 0; j < stateMasks.length; j++) {
+						int stateMask = stateMasks[j];
+						ITextHover textHover = configuration.getTextHover(sourceViewer, t, stateMask);
+						((ITextViewerExtension2) sourceViewer).setTextHover(textHover, t, stateMask);
+					}
+				}
+				else {
+					ITextHover textHover = configuration.getTextHover(sourceViewer, t);
+					((ITextViewerExtension2) sourceViewer).setTextHover(textHover, t, ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK);
+				}
+			}
+			else
+				sourceViewer.setTextHover(configuration.getTextHover(sourceViewer, t), t);
+		}
+	}
+
+	private void updateMenuText() {
+		ITextViewer viewer = getTextViewer();
+		StyledText widget = null;
+		if (viewer != null)
+			widget = viewer.getTextWidget();
+
+		if (fStructuredModel != null && !fStructuredModel.isModelStateChanging() && viewer != null && widget != null && !widget.isDisposed()) {
+			// performance: don't force an update of the action bars unless
+			// required as it is expensive
+			String previousUndoText = null;
+			String previousUndoDesc = null;
+			String previousRedoText = null;
+			String previousRedoDesc = null;
+			boolean updateActions = false;
+			IAction undoAction = getAction(ITextEditorActionConstants.UNDO);
+			IAction redoAction = getAction(ITextEditorActionConstants.REDO);
+			if (undoAction != null) {
+				previousUndoText = undoAction.getText();
+				previousUndoDesc = undoAction.getDescription();
+				updateActions = updateActions || previousUndoText == null || previousUndoDesc == null;
+				undoAction.setText(UNDO_ACTION_TEXT_DEFAULT);
+				undoAction.setDescription(UNDO_ACTION_DESC_DEFAULT);
+			}
+			if (redoAction != null) {
+				previousRedoText = redoAction.getText();
+				previousRedoDesc = redoAction.getDescription();
+				updateActions = updateActions || previousRedoText == null || previousRedoDesc == null;
+				redoAction.setText(REDO_ACTION_TEXT_DEFAULT);
+				redoAction.setDescription(REDO_ACTION_DESC_DEFAULT);
+			}
+			if (fStructuredModel.getUndoManager() != null) {
+				IStructuredTextUndoManager undoManager = fStructuredModel.getUndoManager();
+				// get undo command
+				Command undoCommand = undoManager.getUndoCommand();
+				// set undo label and description
+				if (undoAction != null) {
+					undoAction.setEnabled(undoManager.undoable());
+					if (undoCommand != null) {
+						String label = undoCommand.getLabel();
+						if (label != null) {
+							String customText = MessageFormat.format(UNDO_ACTION_TEXT, new String[]{label});
+							updateActions = updateActions || customText == null || previousUndoText == null || !customText.equals(previousUndoText);
+							undoAction.setText(customText);
+						}
+						String desc = undoCommand.getDescription();
+						if (desc != null) {
+							String customDesc = MessageFormat.format(UNDO_ACTION_DESC, new String[]{desc});
+							updateActions = updateActions || customDesc == null || previousRedoDesc == null || !customDesc.equals(previousUndoDesc);
+							undoAction.setDescription(customDesc);
+						}
+					}
+				}
+				// get redo command
+				Command redoCommand = undoManager.getRedoCommand();
+				// set redo label and description
+				if (redoAction != null) {
+					redoAction.setEnabled(undoManager.redoable());
+					if (redoCommand != null) {
+						String label = redoCommand.getLabel();
+						if (label != null) {
+							String customText = MessageFormat.format(REDO_ACTION_TEXT, new String[]{label});
+							updateActions = updateActions || customText == null || previousRedoText == null || !customText.equals(previousRedoText);
+							redoAction.setText(customText);
+						}
+						String desc = redoCommand.getDescription();
+						if (desc != null) {
+							String customDesc = MessageFormat.format(REDO_ACTION_DESC, new String[]{desc});
+							updateActions = updateActions || customDesc == null || previousRedoDesc == null || !customDesc.equals(previousRedoDesc);
+							redoAction.setDescription(customDesc);
+						}
+					}
+				}
+			}
+			// tell the action bars to update
+			if (updateActions) {
+				if (getEditorSite().getActionBars() != null) {
+					getEditorSite().getActionBars().updateActionBars();
+				}
+				else if (getEditorPart() != null && getEditorPart().getEditorSite().getActionBars() != null) {
+					getEditorPart().getEditorSite().getActionBars().updateActionBars();
+				}
+			}
+		}
+	}
+
+	void updateRangeIndication(ISelection selection) {
+		boolean rangeUpdated = false;
+		if (selection instanceof IStructuredSelection && !((IStructuredSelection) selection).isEmpty()) {
+			Object[] objects = ((IStructuredSelection) selection).toArray();
+			if (objects.length > 0 && objects[0] instanceof IndexedRegion) {
+				int start = ((IndexedRegion) objects[0]).getStartOffset();
+				int end = ((IndexedRegion) objects[0]).getEndOffset();
+				if (objects.length > 1) {
+					for (int i = 1; i < objects.length; i++) {
+						start = Math.min(start, ((IndexedRegion) objects[i]).getStartOffset());
+						end = Math.max(end, ((IndexedRegion) objects[i]).getEndOffset());
+					}
+				}
+				getSourceViewer().setRangeIndication(start, end - start, false);
+				rangeUpdated = true;
+			}
+		}
+		if (!rangeUpdated && getSourceViewer() != null) {
+			if (selection instanceof ITextSelection) {
+				getSourceViewer().setRangeIndication(((ITextSelection) selection).getOffset(), ((ITextSelection) selection).getLength(), false);
+			}
+			else {
+				getSourceViewer().removeRangeIndication();
+			}
+		}
+	}
+
+
+	/**
+	 * Updates the editor vertical ruler menu by creating a new vertical ruler
+	 * context menu with the given menu id
+	 * 
+	 * @param rulerMenuId
+	 *            Cannot be null
+	 */
+	private void updateRulerContextMenuId(String rulerMenuId) {
+		// update ruler context menu id if updating to a new id or if context
+		// menu is not already set up
+		if (!rulerMenuId.equals(getRulerContextMenuId()) || (fRulerContextMenu == null)) {
+			setRulerContextMenuId(rulerMenuId);
+
+			if (getVerticalRuler() != null) {
+				// dispose of previous ruler context menu
+				if (fRulerContextMenu != null) {
+					fRulerContextMenu.dispose();
+				}
+				if (fRulerContextMenuManager != null) {
+					fRulerContextMenuManager.removeMenuListener(getContextMenuListener());
+					fRulerContextMenuManager.removeAll();
+					fRulerContextMenuManager.dispose();
+				}
+
+				fRulerContextMenuManager = new MenuManager(getRulerContextMenuId(), getRulerContextMenuId());
+				fRulerContextMenuManager.setRemoveAllWhenShown(true);
+				fRulerContextMenuManager.addMenuListener(getContextMenuListener());
+
+				Control rulerControl = getVerticalRuler().getControl();
+				fRulerContextMenu = fRulerContextMenuManager.createContextMenu(rulerControl);
+				rulerControl.setMenu(fRulerContextMenu);
+
+				getSite().registerContextMenu(getRulerContextMenuId(), fRulerContextMenuManager, getSelectionProvider());
+
+				// also register this menu for source page part and structured
+				// text editor ids
+				String partId = getSite().getId();
+				if (partId != null) {
+					getSite().registerContextMenu(partId + RULER_CONTEXT_MENU_SUFFIX, fRulerContextMenuManager, getSelectionProvider());
+				}
+				getSite().registerContextMenu(RULER_CONTEXT_MENU_ID, fRulerContextMenuManager, getSelectionProvider());
+			}
+		}
+	}
+
+	private void updateSourceViewerConfiguration() {
+		SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+		// no need to update source viewer configuration if one does not exist
+		// yet
+		if (configuration == null) {
+			return;
+		}
+		// do not configure source viewer configuration twice
+		boolean configured = false;
+
+		// structuredtextviewer only works with
+		// structuredtextviewerconfiguration
+		if (!(configuration instanceof StructuredTextViewerConfiguration)) {
+			ConfigurationAndTarget cat = createSourceViewerConfiguration();
+			fViewerConfigurationTargetId = cat.getTargetId();
+			configuration = cat.getConfiguration();
+			setSourceViewerConfiguration(configuration);
+			configured = true;
+		}
+		else {
+			ConfigurationAndTarget cat = createSourceViewerConfiguration();
+			StructuredTextViewerConfiguration newViewerConfiguration = cat.getConfiguration();
+			if (!(cat.getTargetId().equals(fViewerConfigurationTargetId))) {
+				// d282894 use newViewerConfiguration
+				fViewerConfigurationTargetId = cat.getTargetId();
+				configuration = newViewerConfiguration;
+				setSourceViewerConfiguration(configuration);
+				configured = true;
+			}
+		}
+
+		if (getSourceViewer() != null) {
+			// not sure if really need to reconfigure when input changes
+			// (maybe only need to reset viewerconfig's document)
+			if (!configured)
+				getSourceViewer().configure(configuration);
+			IAction openHyperlinkAction = getAction(StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE);
+			if (openHyperlinkAction instanceof OpenHyperlinkAction) {
+				((OpenHyperlinkAction) openHyperlinkAction).setHyperlinkDetectors(getSourceViewerConfiguration().getHyperlinkDetectors(getSourceViewer()));
+			}
+		}
+	}
+
+	protected void updateStatusField(String category) {
+		super.updateStatusField(category);
+
+		if (category == null)
+			return;
+
+		if (StructuredTextEditorActionConstants.STATUS_CATEGORY_OFFSET.equals(category)) {
+			IStatusField field = getStatusField(category);
+			ISourceViewer sourceViewer = getSourceViewer();
+			if (field != null && sourceViewer != null) {
+				Point selection = sourceViewer.getTextWidget().getSelection();
+				int offset1 = widgetOffset2ModelOffset(sourceViewer, selection.x);
+				int offset2 = widgetOffset2ModelOffset(sourceViewer, selection.y);
+				String text = null;
+				if (offset1 != offset2)
+					text = "[" + offset1 + "-" + offset2 + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				else
+					text = "[ " + offset1 + " ]"; //$NON-NLS-1$ //$NON-NLS-2$
+				field.setText(text == null ? fErrorLabel : text);
+			}
+		}
+	}
+	
+	public Annotation gotoAnnotation(boolean forward) {
+		Annotation result = super.gotoAnnotation(forward);
+		if(result != null)
+			fSelectionChangedFromGoto = true;
+		return result;
+	}
+
+	void updateStatusLine(ISelection selection) {
+		// Bug 210481 - Don't update the status line if the selection
+		// was caused by go to navigation
+		if(fSelectionChangedFromGoto) {
+			fSelectionChangedFromGoto = false;
+			return;
+		}
+		IStatusLineManager statusLineManager = getEditorSite().getActionBars().getStatusLineManager();
+		if (fStatusLineLabelProvider != null && statusLineManager != null) {
+			String text = null;
+			Image image = null;
+			if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
+				Object firstElement = ((IStructuredSelection) selection).getFirstElement();
+				if (firstElement != null) {
+					text = fStatusLineLabelProvider.getText(firstElement);
+					image = fStatusLineLabelProvider.getImage((firstElement));
+				}
+			}
+			if (image == null) {
+				statusLineManager.setMessage(text);
+			}
+			else {
+				statusLineManager.setMessage(image, text);
+			}
+		}
+	}
+
+	/**
+	 * Returns the signed current selection.
+	 * The length will be negative if the resulting selection
+	 * is right-to-left (RtoL).
+	 * <p>
+	 * The selection offset is model based.
+	 * </p>
+	 *
+	 * @param sourceViewer the source viewer
+	 * @return a region denoting the current signed selection, for a resulting RtoL selections length is < 0
+	 */
+	IRegion getSignedSelection(ISourceViewer sourceViewer) {
+		StyledText text= sourceViewer.getTextWidget();
+		Point selection= text.getSelectionRange();
+
+		if (text.getCaretOffset() == selection.x) {
+			selection.x= selection.x + selection.y;
+			selection.y= -selection.y;
+		}
+
+		selection.x= widgetOffset2ModelOffset(sourceViewer, selection.x);
+
+		return new Region(selection.x, selection.y);
+	}
+
+	protected SourceViewerDecorationSupport getSourceViewerDecorationSupport(ISourceViewer viewer) {
+		/* Removed workaround for Bug [206913] source annotations are not painting in source editors.
+		 * With the new presentation reconciler, we no longer need to force the painting. This
+		 * actually caused Bug [219776] Wrong annotation display on macs. We forced the
+		 * Squiggles strategy, even when the native problem underline was specified for annotations */
+		return super.getSourceViewerDecorationSupport(viewer);
+	}
+
+	private void installCharacterPairing() {
+		IStructuredModel model = getInternalModel();
+		if (model != null) {
+			IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(SSEUIPlugin.ID, "characterPairing"); //$NON-NLS-1$
+			IContentTypeManager mgr = Platform.getContentTypeManager();
+			IContentType type = mgr.getContentType(model.getContentTypeIdentifier());
+			if (type != null) {
+				for (int i = 0; i < elements.length; i++) {
+					// Create the inserter
+					IConfigurationElement element = elements[i];
+					try {
+						IConfigurationElement[] contentTypes = element.getChildren("contentTypeIdentifier");
+						for (int j = 0; j < contentTypes.length; j++) {
+							String id = contentTypes[j].getAttribute("id");
+							if (id != null) {
+								IContentType targetType = mgr.getContentType(id);
+								int priority = calculatePriority(type, targetType, 0);
+								if (priority >= 0) {
+									final CharacterPairing pairing = new CharacterPairing();
+									pairing.priority = priority;
+									String[] partitions = StringUtils.unpack(contentTypes[j].getAttribute("partitions"));
+									pairing.partitions = new HashSet(partitions.length);
+									// Only add the inserter if there is at least one partition for the content type
+									for (int k = 0; k < partitions.length; k++) {
+										pairing.partitions.add(partitions[k]);
+									}
+
+									pairing.inserter = (AbstractCharacterPairInserter) element.createExecutableExtension("class");
+									if (pairing.inserter != null && partitions.length > 0) {
+										fPairInserter.addInserter(pairing);
+										/* use a SafeRunner since this method is also invoked during Part creation */
+										SafeRunner.run(new ISafeRunnable() {
+											public void run() throws Exception {
+												pairing.inserter.initialize();
+											}
+
+											public void handleException(Throwable exception) {
+												// rely on default logging
+											}
+										});
+									}
+								}
+							}
+						}
+					} catch (CoreException e) {
+						Logger.logException(e);
+					}
+				}
+				fPairInserter.prioritize();
+			}
+		}
+	}
+
+	/**
+	 * Calculates the priority of the target content type. The closer <code>targetType</code>
+	 * is to <code>type</code> the higher its priority.
+	 * 
+	 * @param type
+	 * @param targetType
+	 * @param priority
+	 * @return
+	 */
+	private int calculatePriority(IContentType type, IContentType targetType, int priority) {
+		if (type == null || targetType == null)
+			return -1;
+		if (type.getId().equals(targetType.getId()))
+			return priority;
+		return calculatePriority(type.getBaseType(), targetType, ++priority);
+	}
+
+	/**
+	 * Installs semantic highlighting on the editor
+	 */
+	private void installSemanticHighlighting() {
+		IStructuredModel model = getInternalModel();
+		if (fSemanticManager == null && model != null) {
+			fSemanticManager = new SemanticHighlightingManager();
+			fSemanticManager.install(getSourceViewer(), getPreferenceStore(), getSourceViewerConfiguration(), model.getContentTypeIdentifier());
+		}
+	}
+	
+	/**
+	 * Uninstalls semantic highlighting on the editor and performs cleanup
+	 */
+	private void uninstallSemanticHighlighting() {
+		if (fSemanticManager != null) {
+			fSemanticManager.uninstall();
+			fSemanticManager = null;
+		}
+	}
+
+	private IInformationPresenter configureOutlinePresenter(ISourceViewer sourceViewer, SourceViewerConfiguration config) {
+		InformationPresenter presenter = null;
+
+		// Get the quick outline configuration
+		AbstractQuickOutlineConfiguration cfg = null;
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] ids = getConfigurationPoints();
+		for (int i = 0; cfg == null && i < ids.length; i++) {
+			cfg = (AbstractQuickOutlineConfiguration) builder.getConfiguration(ExtendedConfigurationBuilder.QUICKOUTLINECONFIGURATION, ids[i]);
+		}
+
+		if (cfg != null) {
+			presenter = new InformationPresenter(getOutlinePresenterControlCreator(cfg));
+			presenter.setDocumentPartitioning(config.getConfiguredDocumentPartitioning(sourceViewer));
+			presenter.setAnchor(AbstractInformationControlManager.ANCHOR_GLOBAL);
+			IInformationProvider provider = new SourceInfoProvider(this);
+			String[] contentTypes = config.getConfiguredContentTypes(sourceViewer);
+			for (int i = 0; i < contentTypes.length; i++) {
+				presenter.setInformationProvider(provider, contentTypes[i]);
+			}
+			presenter.setSizeConstraints(50, 20, true, false);
+		}
+		return presenter;
+	}
+
+	/**
+	 * Returns the outline presenter control creator. The creator is a 
+	 * factory creating outline presenter controls for the given source viewer. 
+	 *
+	 * @param sourceViewer the source viewer to be configured by this configuration
+	 * @return an information control creator
+	 */
+	private IInformationControlCreator getOutlinePresenterControlCreator(final AbstractQuickOutlineConfiguration config) {
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				int shellStyle = SWT.RESIZE;
+				return new QuickOutlinePopupDialog(parent, shellStyle, getInternalModel(), config);
+			}
+		};
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextInvocationContext.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextInvocationContext.java
new file mode 100644
index 0000000..241265c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextInvocationContext.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import java.util.Map;
+
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.TextInvocationContext;
+
+/**
+ * Provisional API: This class/interface is part of an interim API that is
+ * still under development and expected to change significantly before
+ * reaching stability. It is being made available at this early stage to
+ * solicit feedback from pioneering adopters on the understanding that any
+ * code that uses this API will almost certainly be broken (repeatedly) as the
+ * API evolves.
+ * 
+ * This class is not intended to be instantiated by clients.
+ * 
+ * Structured Text quick assist invocation context.
+ */
+public final class StructuredTextInvocationContext extends TextInvocationContext {
+	private Map fAttributes;
+
+	/**
+	 * @param sourceViewer
+	 * @param offset
+	 * @param length
+	 * @param attributes
+	 */
+	public StructuredTextInvocationContext(ISourceViewer sourceViewer, int offset, int length, Map attributes) {
+		super(sourceViewer, offset, length);
+		fAttributes = attributes;
+	}
+
+	/**
+	 * @param attributeName
+	 * @return the value of this attribute, or <tt>null</tt> when no such
+	 *         attribute is defined or that attribute's value has been set to
+	 *         <tt>null</tt>
+	 */
+	public Object getAttribute(String attributeName) {
+		return (fAttributes != null ? fAttributes.get(attributeName) : null);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextMultiPassContentFormatter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextMultiPassContentFormatter.java
new file mode 100644
index 0000000..88d48e5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextMultiPassContentFormatter.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TypedPosition;
+import org.eclipse.jface.text.formatter.FormattingContextProperties;
+import org.eclipse.jface.text.formatter.IFormattingContext;
+import org.eclipse.jface.text.formatter.IFormattingStrategy;
+import org.eclipse.jface.text.formatter.MultiPassContentFormatter;
+import org.eclipse.wst.sse.core.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+
+/**
+ * Extends the MultiPassContentFormatter to allow clients to contribute
+ * additional slave formatting strategies via the
+ * <code>org.eclipse.wst.sse.ui.editorConfiguration</code> extension point
+ */
+class StructuredTextMultiPassContentFormatter extends MultiPassContentFormatter {
+	/**
+	 * The value of "type" attribute in the provisionalConfiguration element
+	 */
+	private static final String SLAVE_FORMATTING_STRATEGY_EXTENDED_ID = "slaveformattingstrategy"; //$NON-NLS-1$
+	/**
+	 * list of partition types that already have a formatting strategy
+	 */
+	private List fInstalledPartitionTypes;
+
+	/**
+	 * Creates a new content formatter.
+	 * 
+	 * @param partitioning
+	 *            the document partitioning for this formatter
+	 * @param type
+	 *            the default content type
+	 */
+	public StructuredTextMultiPassContentFormatter(final String partitioning, final String type) {
+		super(partitioning, type);
+	}
+
+	protected void formatMaster(IFormattingContext context, IDocument document, int offset, int length) {
+		// for debugging purposes
+		long startTime = System.currentTimeMillis();
+
+		super.formatMaster(context, document, offset, length);
+
+		if (Logger.DEBUG_FORMAT) {
+			long endTime = System.currentTimeMillis();
+			System.out.println("formatModel time: " + (endTime - startTime)); //$NON-NLS-1$
+		}
+	}
+
+	/*
+	 * Overwritten to check for additional slave formatting strategies
+	 * contributed via the editorConfiguration extension point.
+	 */
+	protected void formatSlave(IFormattingContext context, IDocument document, int offset, int length, String type) {
+		List installedTypes = getInstalledPartitionTypes();
+		if (installedTypes.contains(type)) {
+			// we've already set the slave formatter strategy so just perform
+			// as normal
+			super.formatSlave(context, document, offset, length, type);
+		}
+		else {
+			boolean findExtendedSlaveFormatter = true;
+
+			// need to figure out if there's already a slave formatter set, so
+			// just attempt to format as normal
+			super.formatSlave(context, document, offset, length, type);
+
+			// now, determine if slave formatter was already set by checking
+			// context (it would be set if there's already one)
+			Object contextPartition = context.getProperty(FormattingContextProperties.CONTEXT_PARTITION);
+			if (contextPartition instanceof TypedPosition) {
+				String contextType = ((TypedPosition) contextPartition).getType();
+				if (contextType == type) {
+					// there's already a slave formatter set, so just add it
+					// to the list of installed partition types for future
+					// reference
+					installedTypes.add(type);
+					findExtendedSlaveFormatter = false;
+				}
+			}
+			// no slave formatter is set yet, so try to find one contributed
+			// via the editorConfiguration extension point
+			if (findExtendedSlaveFormatter) {
+				Object configuration = ExtendedConfigurationBuilder.getInstance().getConfiguration(SLAVE_FORMATTING_STRATEGY_EXTENDED_ID, type);
+				if (configuration instanceof IFormattingStrategy) {
+					// found a formatter, so add it in
+					setSlaveStrategy((IFormattingStrategy) configuration, type);
+					// try to format slave again now that one is set
+					super.formatSlave(context, document, offset, length, type);
+				}
+				// note that we've already checked this partition type for
+				// future reference
+				installedTypes.add(type);
+			}
+		}
+	}
+
+	/**
+	 * Get the list of partition types that have already been evaluated for
+	 * slave formatting strategies for this formatter.
+	 * 
+	 * @return List
+	 */
+	private List getInstalledPartitionTypes() {
+		if (fInstalledPartitionTypes == null)
+			fInstalledPartitionTypes = new ArrayList();
+		return fInstalledPartitionTypes;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextViewerConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextViewerConfiguration.java
new file mode 100644
index 0000000..5008211
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextViewerConfiguration.java
@@ -0,0 +1,719 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.IUndoManager;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.formatter.IContentFormatter;
+import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
+import org.eclipse.jface.text.hyperlink.MultipleHyperlinkPresenter;
+import org.eclipse.jface.text.information.IInformationPresenter;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.InformationPresenter;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.quickassist.IQuickAssistAssistant;
+import org.eclipse.jface.text.quickassist.QuickAssistAssistant;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationHover;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPreferenceConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
+import org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner;
+import org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.StructuredTextAnnotationHover;
+import org.eclipse.wst.sse.ui.internal.contentassist.StructuredContentAssistant;
+import org.eclipse.wst.sse.ui.internal.correction.CompoundQuickAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.derived.HTMLTextPresenter;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.sse.ui.internal.provisional.style.ReconcilerHighlighter;
+import org.eclipse.wst.sse.ui.internal.provisional.style.StructuredPresentationReconciler;
+import org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor;
+import org.eclipse.wst.sse.ui.internal.rules.StructuredDocumentDamagerRepairer;
+import org.eclipse.wst.sse.ui.internal.taginfo.AnnotationHoverProcessor;
+import org.eclipse.wst.sse.ui.internal.taginfo.BestMatchHover;
+import org.eclipse.wst.sse.ui.internal.taginfo.ProblemAnnotationHoverProcessor;
+import org.eclipse.wst.sse.ui.internal.taginfo.TextHoverManager;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+
+
+/**
+ * Configuration for the source viewer used by StructuredTextEditor.<br />
+ * Note: While ISourceViewer is passed in for each get configuration, clients
+ * should create a new viewer configuration instance for each instance of
+ * source viewer as some methods return the same instance of an object,
+ * regardless of the sourceviewer.
+ * <p>
+ * Clients should subclass and override just those methods which must be
+ * specific to their needs.
+ * </p>
+ * 
+ * @see org.eclipse.wst.sse.ui.StructuredTextEditor
+ * @see org.eclipse.wst.sse.ui.internal.StructuredTextViewer
+ * @since 1.0
+ */
+public class StructuredTextViewerConfiguration extends TextSourceViewerConfiguration {
+	/**
+	 * One instance per configuration because creating a second assistant that
+	 * is added to a viewer can cause odd key-eating by the wrong one.
+	 */
+	private StructuredContentAssistant fContentAssistant = null;
+	
+	/*
+	 * One instance per configuration because it's just like content assistant
+	 */
+	private IQuickAssistAssistant fQuickAssistant = null;
+	/*
+	 * One instance per configuration
+	 */
+	private IReconciler fReconciler;
+	/**
+	 * Extended configuration provisionalConfiguration type to contribute
+	 * additional auto edit strategies
+	 */
+	private final String AUTOEDITSTRATEGY = "autoeditstrategy"; //$NON-NLS-1$
+	
+	private final String CONTENT_ASSIST_SIZE = "contentassistsize";
+	
+	private ReconcilerHighlighter fHighlighter = null;
+	
+	/**
+	 * Creates a structured text viewer configuration.
+	 */
+	public StructuredTextViewerConfiguration() {
+		super();
+		// initialize fPreferenceStore with same preference store used in
+		// StructuredTextEditor
+		fPreferenceStore = createCombinedPreferenceStore();
+	}
+
+	/**
+	 * Create a preference store that combines the source editor preferences
+	 * with the base editor's preferences.
+	 * 
+	 * @return IPreferenceStore
+	 */
+	private IPreferenceStore createCombinedPreferenceStore() {
+		IPreferenceStore sseEditorPrefs = SSEUIPlugin.getDefault().getPreferenceStore();
+		IPreferenceStore baseEditorPrefs = EditorsUI.getPreferenceStore();
+		return new ChainedPreferenceStore(new IPreferenceStore[]{sseEditorPrefs, baseEditorPrefs});
+	}
+
+	/**
+	 * Note: Clients cannot override this method because this method returns a
+	 * specially configured Annotation Hover for the StructuredTextViewer
+	 * 
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.editors.text.TextSourceViewerConfiguration#getAnnotationHover(org.eclipse.jface.text.source.ISourceViewer)
+	 */
+	final public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
+		return new StructuredTextAnnotationHover() {
+			protected boolean isIncluded(Annotation annotation) {
+				return isShowInVerticalRuler(annotation);
+			}
+		};
+	}
+
+	/**
+	 * Get color for the preference key. Assumes fPreferenceStore is not null.
+	 * 
+	 * @param key
+	 * @return Color for preference key or null if none found
+	 */
+	private Color getColor(String key) {
+		RGB rgb = PreferenceConverter.getColor(fPreferenceStore, key);
+		return EditorUtility.getColor(rgb);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getAutoEditStrategies(org.eclipse.jface.text.source.ISourceViewer, java.lang.String)
+	 */
+	public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) {
+		List allStrategies = new ArrayList(0);
+
+		IAutoEditStrategy[] superStrategies = super.getAutoEditStrategies(sourceViewer, contentType);
+		for (int i = 0; i < superStrategies.length; i++) {
+			allStrategies.add(superStrategies[i]);
+		}
+
+		// add auto edit strategies contributed by clients
+		List extendedAutoEdits = ExtendedConfigurationBuilder.getInstance().getConfigurations(AUTOEDITSTRATEGY, contentType);
+		if (!extendedAutoEdits.isEmpty()) {
+			allStrategies.addAll(extendedAutoEdits);
+		}
+
+		return (IAutoEditStrategy[]) allStrategies.toArray(new IAutoEditStrategy[allStrategies.size()]);
+	}
+
+	/**
+	 * Returns the configured partitioning for the given source viewer. The
+	 * partitioning is used when the querying content types from the source
+	 * viewer's input document.<br />
+	 * Note: Clients cannot override this method at this time.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return the configured partitioning
+	 * @see #getConfiguredContentTypes(ISourceViewer)
+	 */
+	final public String getConfiguredDocumentPartitioning(ISourceViewer sourceViewer) {
+		/*
+		 * This implementation returns default structured text partitioning
+		 */
+		return IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING;
+	}
+
+	public int[] getConfiguredTextHoverStateMasks(ISourceViewer sourceViewer, String contentType) {
+		/*
+		 * This implementation returns configured text hover state masks for
+		 * StructuredTextViewers
+		 */
+		TextHoverManager.TextHoverDescriptor[] hoverDescs = SSEUIPlugin.getDefault().getTextHoverManager().getTextHovers();
+		int stateMasks[] = new int[hoverDescs.length];
+		int stateMasksLength = 0;
+		for (int i = 0; i < hoverDescs.length; i++) {
+			if (hoverDescs[i].isEnabled()) {
+				int j = 0;
+				int stateMask = computeStateMask(hoverDescs[i].getModifierString());
+				while (j < stateMasksLength) {
+					if (stateMasks[j] == stateMask)
+						break;
+					j++;
+				}
+				if (j == stateMasksLength)
+					stateMasks[stateMasksLength++] = stateMask;
+			}
+		}
+		if (stateMasksLength == hoverDescs.length)
+			return stateMasks;
+
+		int[] shortenedStateMasks = new int[stateMasksLength];
+		System.arraycopy(stateMasks, 0, shortenedStateMasks, 0, stateMasksLength);
+		return shortenedStateMasks;
+	}
+
+	/**
+	 * Returns the content assistant ready to be used with the given source
+	 * viewer.<br />
+	 * Note: The same instance of IContentAssistant is returned regardless of
+	 * the source viewer passed in.
+	 * <p>
+	 * Clients should generally not override this method. Instead, clients
+	 * wanting to add their own processors should override
+	 * <code>getContentAssistProcessors(ISourceViewer, String)</code>
+	 * </p>
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return a content assistant
+	 * @see #getContentAssistProcessors(ISourceViewer, String)
+	 */
+	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+		/*
+		 * Note: This method was made final so that StructuredContentAssist is
+		 * always used and content assist extension point always works.
+		 */
+		if (fContentAssistant == null) {
+			fContentAssistant = new StructuredContentAssistant();
+
+			// content assistant configurations
+			fContentAssistant.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+			fContentAssistant.enableAutoActivation(true);
+			fContentAssistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
+			fContentAssistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
+			fContentAssistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
+			fContentAssistant.enableColoredLabels(PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS));
+
+			// set content assist preferences
+			if (fPreferenceStore != null) {
+				int delay = fPreferenceStore.getInt(EditorPreferenceNames.CODEASSIST_AUTOACTIVATION_DELAY);
+				fContentAssistant.setAutoActivationDelay(delay);
+
+				Color color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND);
+				fContentAssistant.setProposalSelectorBackground(color);
+
+				color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND);
+				fContentAssistant.setProposalSelectorForeground(color);
+
+				color = getColor(EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND);
+				fContentAssistant.setContextInformationPopupBackground(color);
+				fContentAssistant.setContextSelectorBackground(color);
+
+				color = getColor(EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND);
+				fContentAssistant.setContextInformationPopupForeground(color);
+				fContentAssistant.setContextSelectorForeground(color);
+			}
+			
+			// add content assist processors for each partition type
+			String[] types = getConfiguredContentTypes(sourceViewer);
+			for (int i = 0; i < types.length; i++) {
+				String type = types[i];
+
+				// add all content assist processors for current partiton type
+				IContentAssistProcessor[] processors = getContentAssistProcessors(sourceViewer, type);
+				if (processors != null) {
+					for (int j = 0; j < processors.length; j++) {
+						fContentAssistant.setContentAssistProcessor(processors[j], type);
+					}
+				}
+			}
+			IDialogSettings dialogSettings = SSEUIPlugin.getInstance().getDialogSettings();
+			if(dialogSettings != null) {
+				IDialogSettings section = dialogSettings.getSection(CONTENT_ASSIST_SIZE);
+				if(section == null) {
+					section = dialogSettings.addNewSection(CONTENT_ASSIST_SIZE);
+				}
+				fContentAssistant.setRestoreCompletionProposalSize(section);
+			}
+		}
+		return fContentAssistant;
+	}
+
+	/**
+	 * <p>Returns a {@link StructuredContentAssistProcessor} which can be contributed to through
+	 * the <tt>org.eclipse.wst.sse.ui.completionProposal</tt> extension point.</p>
+	 * 
+	 * <p>If an extender of this class overrides this method and does not include an
+	 * implementation of a {@link StructuredContentAssistProcessor} in their returned
+	 * processors then all of the contributions by the aforementioned extension point
+	 * will be left out.</p>
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @param partitionType
+	 *            the partition type for which the content assist processors
+	 *            are applicable
+	 * @return IContentAssistProcessors or null if should not be supported
+	 */
+	protected IContentAssistProcessor[] getContentAssistProcessors(ISourceViewer sourceViewer, String partitionType) {
+		IContentAssistProcessor processor = new StructuredContentAssistProcessor(
+				fContentAssistant, partitionType, sourceViewer, null);
+		return new IContentAssistProcessor[]{processor};
+	}
+
+	/**
+	 * Returns the content formatter ready to be used with the given source
+	 * viewer.
+	 * <p>
+	 * It is not recommended that clients override this method as it may
+	 * become <code>final</code> in the future and replaced by an extensible
+	 * framework.
+	 * </p>
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return a content formatter or <code>null</code> if formatting should
+	 *         not be supported
+	 */
+	public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
+		// try to use the StructuredTextMultiPassContentFormatter so that it
+		// picks up any additional formatting strategies contributed via the
+		// editorConfiguration extension point
+		IContentFormatter formatter = null;
+		if (sourceViewer != null) {
+			IDocument document = sourceViewer.getDocument();
+			if (document instanceof IDocumentExtension3) {
+				String partitioning = getConfiguredDocumentPartitioning(sourceViewer);
+				IDocumentPartitioner partitioner = ((IDocumentExtension3) document).getDocumentPartitioner(partitioning);
+				if (partitioner instanceof StructuredTextPartitioner) {
+					String defaultPartitionType = ((StructuredTextPartitioner) partitioner).getDefaultPartitionType();
+					formatter = new StructuredTextMultiPassContentFormatter(partitioning, defaultPartitionType);
+				}
+			}
+		}
+
+		return formatter;
+	}
+
+	/**
+	 * Returns the double-click strategy ready to be used in this viewer when
+	 * double clicking onto text of the given content type. Note that if
+	 * clients want to contribute their own doubleclick strategy, they should
+	 * use <code>org.eclipse.wst.sse.ui.editorConfiguration</code> extension
+	 * point's <code>doubleClickStrategy</code> element instead of
+	 * overriding this method. If clients do override this method, please
+	 * remember to call <code>super.getDoubleClickStrategy()</code>.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @param contentType
+	 *            the content type for which the strategy is applicable
+	 * @return a double-click strategy or <code>null</code> if double
+	 *         clicking should not be supported
+	 */
+	public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
+		ITextDoubleClickStrategy strategy = null;
+		Object extendedStrategy = ExtendedConfigurationBuilder.getInstance().getConfiguration(ExtendedConfigurationBuilder.DOUBLECLICKSTRATEGY, contentType);
+		if (extendedStrategy instanceof ITextDoubleClickStrategy) {
+			strategy = (ITextDoubleClickStrategy) extendedStrategy;
+		}
+		else {
+			strategy = super.getDoubleClickStrategy(sourceViewer, contentType);
+		}
+		return strategy;
+	}
+
+	/**
+	 * Returns the hyperlink presenter for the given source viewer.<br />
+	 * Note: Clients cannot override this method, and although it's no longer
+	 * necessary, it must remain for binary compatibility.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return a hyperlink presenter specially configured for
+	 *         StructuredTextViewer
+	 */
+	final public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) {
+		if (fPreferenceStore == null) {
+			return super.getHyperlinkPresenter(sourceViewer);
+		}
+		return new MultipleHyperlinkPresenter(fPreferenceStore);
+	}
+	
+	/**
+	 * Returns the information control creator. The creator is a factory
+	 * creating information controls for the given source viewer.<br />
+	 * Note: Clients cannot override this method at this time.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return the information control creator
+	 */
+	final public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
+		// used by hover help
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				return new DefaultInformationControl(parent, new HTMLTextPresenter(true));
+			}
+		};
+	}
+
+	/**
+	 * Returns the information presenter ready to be used with the given
+	 * source viewer.
+	 * <p>
+	 * Clients cannot override this method. Instead, clients wanting to add
+	 * their own information providers should override
+	 * <code>getInformationProvider(ISourceViewer, String)</code>
+	 * </p>
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return a content assistant
+	 * @see #getInformationProvider(ISourceViewer, String)
+	 */
+	final public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
+		InformationPresenter presenter = new InformationPresenter(getInformationPresenterControlCreator(sourceViewer));
+
+		// information presenter configurations
+		presenter.setSizeConstraints(60, 10, true, true);
+		presenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+		// add information providers for each partition type
+		String[] types = getConfiguredContentTypes(sourceViewer);
+		for (int i = 0; i < types.length; i++) {
+			String type = types[i];
+
+			IInformationProvider provider = getInformationProvider(sourceViewer, type);
+			if (provider != null) {
+				presenter.setInformationProvider(provider, type);
+			}
+		}
+
+		return presenter;
+	}
+
+	/**
+	 * Returns the information provider that will be used for information
+	 * presentation in the given source viewer and for the given partition
+	 * type.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @param partitionType
+	 *            the partition type for which the information provider is
+	 *            applicable
+	 * @return IInformationProvider or null if should not be supported
+	 * @deprecated instead of overriding this method to provide documentation
+	 *             information, adopters should use the
+	 *             <code>documentationTextHover</code> element in the
+	 *             <code>org.eclipse.wst.sse.ui.editorConfiguration</code>
+	 *             extension point
+	 */
+	protected IInformationProvider getInformationProvider(ISourceViewer sourceViewer, String partitionType) {
+		ITextHover bestMatchHover = new BestMatchHover(createDocumentationHovers(partitionType));
+		return new TextHoverInformationProvider(bestMatchHover);
+	}
+
+	/**
+	 * Returns the information presenter control creator. The creator is a
+	 * factory creating the presenter controls for the given source viewer.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return an information control creator
+	 */
+	private IInformationControlCreator getInformationPresenterControlCreator(ISourceViewer sourceViewer) {
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				int shellStyle = SWT.RESIZE | SWT.TOOL;
+				int style = SWT.V_SCROLL | SWT.H_SCROLL;
+				return new DefaultInformationControl(parent, shellStyle, style, new HTMLTextPresenter(false));
+			}
+		};
+	}
+
+	/**
+	 * Returns the line style providers that will be used for syntax
+	 * highlighting in the given source viewer.
+	 * <p>
+	 * Not fully API since return type LineStyleProvider is not API.
+	 * </p>
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @param partitionType
+	 *            the partition type for which the lineStyleProviders are
+	 *            applicable
+	 * @return LineStyleProvders or null if should not be supported
+	 */
+	public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+		return null;
+	}
+
+	/**
+	 * See <code>getLineStyleProviders(ISourceViewer, String)</code> for
+	 * alternative way to provide highlighting information.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return always returns null
+	 * @see #getLineStyleProviders(ISourceViewer, String)
+	 */
+	public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+		StructuredPresentationReconciler reconciler = new StructuredPresentationReconciler();
+		reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+		
+		String[] contentTypes = getConfiguredContentTypes(sourceViewer);
+		
+		if(contentTypes != null) {
+			StructuredDocumentDamagerRepairer dr = null;
+			
+			for (int i = 0; i < contentTypes.length; i++) {
+				if (fHighlighter != null) {
+					LineStyleProvider provider = fHighlighter.getProvider(contentTypes[i]);
+					if (provider == null)
+						continue;
+					
+					dr = new StructuredDocumentDamagerRepairer(provider);
+					dr.setDocument(sourceViewer.getDocument());
+					reconciler.setDamager(dr, contentTypes[i]);
+					reconciler.setRepairer(dr, contentTypes[i]);
+				}
+			}
+		}
+		
+		return reconciler;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.editors.text.TextSourceViewerConfiguration#getOverviewRulerAnnotationHover(org.eclipse.jface.text.source.ISourceViewer)
+	 */
+	public IAnnotationHover getOverviewRulerAnnotationHover(ISourceViewer sourceViewer) {
+		return new StructuredTextAnnotationHover(true) {
+			protected boolean isIncluded(Annotation annotation) {
+				return isShowInOverviewRuler(annotation);
+			}
+		};
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getQuickAssistAssistant(org.eclipse.jface.text.source.ISourceViewer)
+	 */
+	public IQuickAssistAssistant getQuickAssistAssistant(ISourceViewer sourceViewer) {
+		if (fQuickAssistant == null) {
+			IQuickAssistAssistant assistant = new QuickAssistAssistant();
+			assistant.setQuickAssistProcessor(new CompoundQuickAssistProcessor());
+			assistant.setInformationControlCreator(getQuickAssistAssistantInformationControlCreator());
+
+			// Waiting for color preferences, see:
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=133731
+			// set content assist preferences
+			if (fPreferenceStore != null) {
+				Color color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND);
+				assistant.setProposalSelectorBackground(color);
+
+				color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND);
+				assistant.setProposalSelectorForeground(color);
+			}
+			fQuickAssistant = assistant;
+		}
+		return fQuickAssistant;
+	}
+
+	/**
+	 * Returns the information control creator for the quick assist assistant.
+	 * 
+	 * @return the information control creator
+	 */
+	private IInformationControlCreator getQuickAssistAssistantInformationControlCreator() {
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				return new DefaultInformationControl(parent, new HTMLTextPresenter(true));
+			}
+		};
+	}
+
+	/**
+	 * Returns the reconciler ready to be used with the given source viewer.<br />
+	 * Note: The same instance of IReconciler is returned regardless of the
+	 * source viewer passed in.
+	 * <p>
+	 * Clients cannot override this method. Instead, clients wanting to add
+	 * their own reconciling strategy should use the
+	 * <code>org.eclipse.wst.sse.ui.extensions.sourcevalidation</code>
+	 * extension point.
+	 * </p>
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return a reconciler
+	 */
+	final public IReconciler getReconciler(ISourceViewer sourceViewer) {
+		IReconciler reconciler = null;
+		
+		if (sourceViewer != null) {
+			//Only create reconciler if sourceViewer is present
+			if (fReconciler == null && sourceViewer != null) {
+				StructuredRegionProcessor newReconciler = new StructuredRegionProcessor();
+	
+				// reconciler configurations
+				newReconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+	
+				fReconciler = newReconciler;
+			}
+			reconciler = fReconciler;
+		}
+		
+		return reconciler;
+	}
+
+	/**
+	 * @since 2.0
+	 * @param treeViewer
+	 * @return a label provider providing the status line contents
+	 */
+	public ILabelProvider getStatusLineLabelProvider(ISourceViewer sourceViewer) {
+		return null;
+	}
+
+	/**
+	 * Create documentation hovers based on hovers contributed via
+	 * <code>org.eclipse.wst.sse.ui.editorConfiguration</code> extension
+	 * point
+	 * 
+	 * @param partitionType
+	 * @return
+	 */
+	private ITextHover[] createDocumentationHovers(String partitionType) {
+		List extendedTextHover = ExtendedConfigurationBuilder.getInstance().getConfigurations(ExtendedConfigurationBuilder.DOCUMENTATIONTEXTHOVER, partitionType);
+		ITextHover[] hovers = (ITextHover[]) extendedTextHover.toArray(new ITextHover[extendedTextHover.size()]);
+		return hovers;
+	}
+
+	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
+		ITextHover textHover = null;
+
+		/*
+		 * Returns a default problem, annotation, and best match hover
+		 * depending on stateMask
+		 */
+		TextHoverManager.TextHoverDescriptor[] hoverDescs = SSEUIPlugin.getDefault().getTextHoverManager().getTextHovers();
+		int i = 0;
+		while (i < hoverDescs.length && textHover == null) {
+			if (hoverDescs[i].isEnabled() && computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
+				String hoverType = hoverDescs[i].getId();
+				if (TextHoverManager.PROBLEM_HOVER.equalsIgnoreCase(hoverType))
+					textHover = new ProblemAnnotationHoverProcessor();
+				else if (TextHoverManager.ANNOTATION_HOVER.equalsIgnoreCase(hoverType))
+					textHover = new AnnotationHoverProcessor();
+				else if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType))
+					textHover = new BestMatchHover(createDocumentationHovers(contentType));
+				else if (TextHoverManager.DOCUMENTATION_HOVER.equalsIgnoreCase(hoverType)) {
+					ITextHover[] hovers = createDocumentationHovers(contentType);
+					if (hovers.length > 0) {
+						textHover = hovers[0];
+					}
+				}
+			}
+			i++;
+		}
+		return textHover;
+	}
+
+	/**
+	 * Returns the undo manager for the given source viewer.<br />
+	 * Note: Clients cannot override this method because this method returns a
+	 * specially configured undo manager for the StructuredTextViewer.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return an undo manager specially configured for StructuredTextViewer
+	 */
+	final public IUndoManager getUndoManager(ISourceViewer sourceViewer) {
+		/*
+		 * This implementation returns an UndoManager that is used exclusively
+		 * in StructuredTextViewer
+		 */
+		return new StructuredTextViewerUndoManager();
+	}
+	
+	public void setHighlighter(ReconcilerHighlighter highlighter) {
+		fHighlighter = highlighter;
+	}
+	
+	/**
+	 * @return the associated content assistnat
+	 */
+	protected StructuredContentAssistant getContentAssistant() {
+		return this.fContentAssistant;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextViewerUndoManager.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextViewerUndoManager.java
new file mode 100644
index 0000000..1564bc5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextViewerUndoManager.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.IUndoManager;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+
+
+/**
+ * Undo manager exclusively for StructuredTextViewers ONLY. This undo manager
+ * is aware that structured documents have their own undo manager. This
+ * handles communication between IUndoManager and IStructuredTextUndoManager.
+ */
+class StructuredTextViewerUndoManager implements IUndoManager {
+	class UndoNotifier implements ISelectionChangedListener {
+		public void selectionChanged(SelectionChangedEvent event) {
+			if ((fUndoManager != null) && (event != null)) {
+				if (event.getSelection() instanceof ITextSelection) {
+					fUndoManager.forceEndOfPendingCommand(this, ((ITextSelection) event.getSelection()).getOffset(), ((ITextSelection) event.getSelection()).getLength());
+				}
+			}
+		}
+
+	}
+
+	private StructuredTextViewer fTextViewer = null;
+	private IStructuredTextUndoManager fUndoManager = null;
+	private ISelectionChangedListener fUndoNotifier = new UndoNotifier();
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#beginCompoundChange()
+	 */
+	public void beginCompoundChange() {
+		// forward the request to the model-based undo manager
+		if (fUndoManager != null)
+			fUndoManager.beginRecording(fTextViewer);
+	}
+
+	/**
+	 * Associates a viewer to this undo manager and also attempts to get the
+	 * correct document-specific undo manager.
+	 * 
+	 * @param viewer -
+	 *            Assumes viewer instanceof StructuredTextViewer
+	 */
+	public void connect(ITextViewer viewer) {
+		// future_TODO could probably optimize this to check if already
+		// connected to same viewer/undo manager, dont do anything
+
+		// disconnect from any old manager/viewer
+		disconnect();
+
+		// connect to new viewer/undo manager
+		fTextViewer = (StructuredTextViewer) viewer;
+		IDocument doc = fTextViewer.getDocument();
+		if (doc instanceof IStructuredDocument) {
+			IStructuredDocument structuredDocument = (IStructuredDocument) doc;
+			setDocument(structuredDocument);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#disconnect()
+	 */
+	public void disconnect() {
+		// disconnect the viewer from the undo manager
+		if (fUndoManager != null) {
+			fTextViewer.removeSelectionChangedListener(fUndoNotifier);
+			fUndoManager.disconnect(fTextViewer);
+		}
+
+		// null out the viewer and undo manager
+		fTextViewer = null;
+		fUndoManager = null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#endCompoundChange()
+	 */
+	public void endCompoundChange() {
+		// forward the request to the model-based undo manager
+		if (fUndoManager != null)
+			fUndoManager.endRecording(fTextViewer);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#redo()
+	 */
+	public void redo() {
+		// forward the request to the model-based undo manager
+		if (fUndoManager != null)
+			fUndoManager.redo(fTextViewer);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#redoable()
+	 */
+	public boolean redoable() {
+		boolean canRedo = false;
+
+		// forward the request to the model-based undo manager
+		if (fUndoManager != null)
+			canRedo = fUndoManager.redoable();
+
+		return canRedo;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#reset()
+	 */
+	public void reset() {
+		// cannot really reset model-based undo manager because other clients
+		// will be affected
+	}
+
+	/**
+	 * Disconnect from the old undo manager and connect to the undo manager
+	 * associated with the new document.
+	 * 
+	 * @param document -
+	 *            assumes document is not null
+	 */
+	public void setDocument(IStructuredDocument document) {
+		if (fUndoManager != null) {
+			fTextViewer.removeSelectionChangedListener(fUndoNotifier);
+			fUndoManager.disconnect(fTextViewer);
+		}
+
+		fUndoManager = document.getUndoManager();
+		if (fUndoManager != null) {
+			fUndoManager.connect(fTextViewer);
+			fTextViewer.addSelectionChangedListener(fUndoNotifier);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#setMaximalUndoLevel(int)
+	 */
+	public void setMaximalUndoLevel(int undoLevel) {
+		// cannot really set maximal undo level on model-based undo manager
+		// because other clients will be affected
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#undo()
+	 */
+	public void undo() {
+		// forward the request to the model-based undo manager
+		if (fUndoManager != null)
+			fUndoManager.undo(fTextViewer);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.IUndoManager#undoable()
+	 */
+	public boolean undoable() {
+		boolean canUndo = false;
+
+		// forward the request to the model-based undo manager
+		if (fUndoManager != null)
+			canUndo = fUndoManager.undoable();
+
+		return canUndo;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/TextHoverInformationProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/TextHoverInformationProvider.java
new file mode 100644
index 0000000..b6e2c1f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/TextHoverInformationProvider.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui;
+
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.IInformationProviderExtension;
+import org.eclipse.jface.text.information.IInformationProviderExtension2;
+
+class TextHoverInformationProvider implements IInformationProvider, IInformationProviderExtension, IInformationProviderExtension2 {
+	private ITextHover fTextHover;
+
+	public TextHoverInformationProvider(ITextHover hover) {
+		fTextHover = hover;
+	}
+
+	public String getInformation(ITextViewer textViewer, IRegion subject) {
+		return (String) getInformation2(textViewer, subject);
+	}
+
+	public Object getInformation2(ITextViewer textViewer, IRegion subject) {
+		return fTextHover.getHoverInfo(textViewer, subject);
+	}
+
+	public IInformationControlCreator getInformationPresenterControlCreator() {
+		return null;
+	}
+
+	public IRegion getSubject(ITextViewer textViewer, int offset) {
+		return fTextHover.getHoverRegion(textViewer, offset);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/AutoActivationDelegate.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/AutoActivationDelegate.java
new file mode 100644
index 0000000..932db61
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/AutoActivationDelegate.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.contentassist;
+
+public abstract class AutoActivationDelegate {
+
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return null;
+	}
+
+	public char[] getContextInformationAutoActivationCharacters() {
+		return null;
+	}
+
+	public abstract void dispose();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/CompletionProposalInvocationContext.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/CompletionProposalInvocationContext.java
new file mode 100644
index 0000000..9ac2f0c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/CompletionProposalInvocationContext.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.contentassist;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+/**
+ * <p>Helpful class for passing around information about the invocation context
+ * of a content assist request</p>
+ * 
+ * @base org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext
+ */
+public class CompletionProposalInvocationContext {
+	/** the viewer that was used to invoke content assist */
+	private final ITextViewer fViewer;
+	
+	/** the character offset where content assist was invoked in the viewer */
+	private final int fInvocationOffset;
+	
+	/** the partition type where content assist was invoked */
+	private String fPartitionType;
+	
+	/**
+	 * <p>Create a new context</p>
+	 * 
+	 * @param viewer {@link ITextViewer} that was used to invoke content assist
+	 * @param invocationOffset character offset where content assist was invoked in the viewer
+	 */
+	public CompletionProposalInvocationContext(ITextViewer viewer, int invocationOffset) {
+		fViewer = viewer;
+		fInvocationOffset = invocationOffset;
+		fPartitionType = null;
+	}
+	
+	/**
+	 * @return {@link IDocument} that content assist was invoked on
+	 */
+	public IDocument getDocument() {
+		return fViewer.getDocument();
+	}
+	
+	/**
+	 * @return {@link ITextViewer} that was used to invoke content assist
+	 */
+	public ITextViewer getViewer() {
+		return fViewer;
+	}
+	
+	/**
+	 * @return character offset where content assist was invoked in the viewer
+	 */
+	public int getInvocationOffset() {
+		return fInvocationOffset;
+	}
+	
+	/**
+	 * @return the partition type where content assist was invoked
+	 */
+	public String getInvocationPartitionType() {
+		if(fPartitionType == null) {
+			fPartitionType = ""; //$NON-NLS-1$
+			try {
+				fPartitionType = this.getDocument().getPartition(this.fInvocationOffset).getType();
+			} catch (BadLocationException e) {
+				// should never happen, nothing we can do about it if it does
+				Logger.logException("Could not get the partition type at content assist invocation offset", e); //$NON-NLS-1$
+			}
+		}
+		return fPartitionType;
+	}
+	
+	/**
+	 * <p>Invocation contexts are equal if they describe the same context and are of the same type.
+	 * This implementation checks for <code>null</code> values and class equality. Subclasses
+	 * should extend this method by adding checks for their context relevant fields (but not
+	 * necessarily cached values).</p>
+	 * <p>
+	 * Example:
+	 *
+	 * <pre>
+	 * class MyContext extends ContentAssistInvocationContext {
+	 * 	private final Object fState;
+	 * 	private Object fCachedInfo;
+	 *
+	 * 	...
+	 *
+	 * 	public boolean equals(Object obj) {
+	 * 		if (!super.equals(obj))
+	 * 			return false;
+	 * 		MyContext other= (MyContext) obj;
+	 * 		return fState.equals(other.fState);
+	 * 	}
+	 * }
+	 * </pre>
+	 *
+	 * </p>
+	 * <p>
+	 * Subclasses should also extend {@link Object#hashCode()}.
+	 * </p>
+	 *
+	 * @param obj {@inheritDoc}
+	 * @return {@inheritDoc}
+	 */
+	public boolean equals(Object obj) {
+		boolean equal = false;
+		if(obj instanceof CompletionProposalInvocationContext) {
+			CompletionProposalInvocationContext other = (CompletionProposalInvocationContext) obj;
+			equal = (fViewer == null && other.fViewer == null || fViewer != null && fViewer.equals(other.fViewer)) &&
+					fInvocationOffset == other.fInvocationOffset;
+		}
+		return equal;
+	}
+
+	/**
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return 23459213 << 5 | (fViewer == null ? 0 : fViewer.hashCode() << 3) | fInvocationOffset;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/ICompletionProposalComputer.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/ICompletionProposalComputer.java
new file mode 100644
index 0000000..b4f608a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/ICompletionProposalComputer.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.contentassist;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+
+/**
+ * <p>Computes completions and context information displayed by the SSE editor content assistant.
+ * Contributions to the <tt>org.eclipse.wst.sse.ui.completionProposal</tt> extension point
+ * must implement this interface.</p>
+ * 
+ * @base org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer
+ */
+public interface ICompletionProposalComputer {
+	/**
+	 * Informs the computer that a content assist session has started. This call will always be
+	 * followed by a {@link #sessionEnded()} call, but not necessarily by calls to
+	 * {@link #computeCompletionProposals(CompletionProposalInvocationContext, IProgressMonitor) computeCompletionProposals}
+	 * or
+	 * {@link #computeContextInformation(CompletionProposalInvocationContext, IProgressMonitor) computeContextInformation}.
+	 */
+	void sessionStarted();
+
+	/**
+	 * Returns a list of completion proposals valid at the given invocation context.
+	 *
+	 * @param context the context of the content assist invocation
+	 * @param monitor a progress monitor to report progress. The monitor is private to this
+	 *        invocation, i.e. there is no need for the receiver to spawn a sub monitor.
+	 * @return a list of completion proposals (element type: {@link ICompletionProposal})
+	 */
+	List computeCompletionProposals(CompletionProposalInvocationContext context, IProgressMonitor monitor);
+
+	/**
+	 * Returns context information objects valid at the given invocation context.
+	 *
+	 * @param context the context of the content assist invocation
+	 * @param monitor a progress monitor to report progress. The monitor is private to this
+	 *        invocation, i.e. there is no need for the receiver to spawn a sub monitor.
+	 * @return a list of context information objects (element type: {@link IContextInformation})
+	 */
+	List computeContextInformation(CompletionProposalInvocationContext context, IProgressMonitor monitor);
+
+	/**
+	 * Returns the reason why this computer was unable to produce any completion proposals or
+	 * context information.
+	 *
+	 * @return an error message or <code>null</code> if no error occurred
+	 */
+	String getErrorMessage();
+
+	/**
+	 * Informs the computer that a content assist session has ended. This call will always be after
+	 * any calls to
+	 * {@linkplain #computeCompletionProposals(CompletionProposalInvocationContext, IProgressMonitor) computeCompletionProposals}
+	 * and
+	 * {@linkplain #computeContextInformation(CompletionProposalInvocationContext, IProgressMonitor) computeContextInformation}.
+	 */
+	void sessionEnded();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/StructuredContentAssistProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/StructuredContentAssistProcessor.java
new file mode 100644
index 0000000..80c7417
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/contentassist/StructuredContentAssistProcessor.java
@@ -0,0 +1,938 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.contentassist;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.action.LegacyActionTools;
+import org.eclipse.jface.bindings.TriggerSequence;
+import org.eclipse.jface.bindings.keys.KeySequence;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ContentAssistEvent;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.ICompletionListener;
+import org.eclipse.jface.text.contentassist.ICompletionListenerExtension;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistantExtension2;
+import org.eclipse.jface.text.contentassist.IContentAssistantExtension3;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposalCategory;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposalComputerRegistry;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposoalCatigoriesConfigurationRegistry;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompoundContentAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContextInformationValidator;
+import org.eclipse.wst.sse.ui.internal.contentassist.OptionalMessageDialog;
+import org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader;
+import org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter;
+
+
+/**
+ * <p>A content assist processor that aggregates the proposals of the
+ * {@link org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer}s contributed via the
+ * <code>org.eclipse.wst.sse.ui.completionProposal</code> extension point.</p>
+ * <p>
+ * Extenders may extend:
+ * <ul>
+ * <li>{@link #propertyChange(PropertyChangeEvent)}to react to property change events
+ * that occur in the {@link IPreferenceStore} given to the constructor in case the behavior
+ * of the processor needs to change according to user preferences</li>
+ * <li>{@link #getCompletionProposalAutoActivationCharacters()}</li>
+ * <li>{@link #getContextInformationAutoActivationCharacters()}</li>
+ * <li>{@link #filterAndSortProposals(List, IProgressMonitor, CompletionProposalInvocationContext)}
+ * to add sorting and filtering</li>
+ * <li>{@link #filterAndSortContextInformation(List, IProgressMonitor)} to add sorting and filtering</li>
+ * <li>{@link #createProgressMonitor()} to change the way progress is reported</li>
+ * <li>{@link #createContext(ITextViewer, int)} to provide the context object
+ * passed to the computers</li>
+ * <li>{@link #getContextInformationValidator()} to add context validation (needed if any
+ * contexts are provided)</li>
+ * <li>{@link #getErrorMessage()} to change error reporting</li>
+ * </ul>
+ * </p>
+ * 
+ * @base org.eclipse.jdt.internal.ui.text.java.ContentAssistProcessor
+ */
+public class StructuredContentAssistProcessor implements IContentAssistProcessor, IPropertyChangeListener, IReleasable {
+
+	/** Legacy editor configuration extension point. */
+	private static final String CONTENT_ASSIST_PROCESSOR_EXTENDED_ID = "contentassistprocessor"; //$NON-NLS-1$
+
+	/** Content assist processors added through the now legacy editor configuration extension point */
+	private List fLegacyExtendedContentAssistProcessors;
+	
+	/**
+	 * Dialog settings key for the "all categories are disabled" warning dialog. See
+	 * {@link OptionalMessageDialog}.
+	 */
+	private static final String PREF_WARN_ABOUT_EMPTY_ASSIST_CATEGORY= "EmptyDefaultAssistCategory"; //$NON-NLS-1$
+
+	/**
+	 * Used to sort categories by their page order so they are cycled in the correct order
+	 */
+	private final Comparator PAGE_ORDER_COMPARATOR = new Comparator() {
+		public int compare(Object o1, Object o2) {
+			CompletionProposalCategory d1= (CompletionProposalCategory) o1;
+			CompletionProposalCategory d2= (CompletionProposalCategory) o2;
+
+			return d1.getPageSortRank(fContentTypeID) - d2.getPageSortRank(fContentTypeID);
+		}
+	};
+	
+	/**
+	 * Used to sort categories by their default page order so they are
+	 * ordered correctly on the default page
+	 */
+	private final Comparator DEFAULT_PAGE_ORDER_COMPARATOR = new Comparator() {
+		public int compare(Object o1, Object o2) {
+			CompletionProposalCategory d1= (CompletionProposalCategory) o1;
+			CompletionProposalCategory d2= (CompletionProposalCategory) o2;
+
+			return d1.getDefaultPageSortRank(fContentTypeID) - d2.getDefaultPageSortRank(fContentTypeID);
+		}
+	};
+
+	/** List of {@link CompletionProposalCategory}s supported by this processor */
+	private List fCategories;
+	
+	/** content type ID this processor is associated with */
+	String fContentTypeID;
+	
+	/** partition type ID this processor is associated with */
+	private final String fPartitionTypeID;
+	
+	/** Content assistant used for giving the user status messages and listening to completion results*/
+	private ContentAssistant fAssistant;
+
+	/* cycling stuff */
+	private int fRepetition= -1;
+	private List fCategoryIteration = null;
+	private String fIterationGesture = null;
+	private int fNumberOfComputedResults = 0;
+	private String fErrorMessage;
+	
+	/** Optionally specified preference store for listening to property change events */
+	private IPreferenceStore fPreferenceStore;
+	
+	/** The viewer this processor is associated with */
+	private ITextViewer fViewer;
+
+	/**
+	 * the {@link ITextInputListener} used to set the content type when
+	 * a document is set for this processors associated viewer.
+	 */
+	private ITextInputListener fTextInputListener;
+
+	private CompletionListener fCompletionListener;
+	
+	/** the context information validator for this processor */
+	private IContextInformationValidator fContextInformationValidator;
+	
+	private AutoActivationDelegate fAutoActivation;
+
+	/**
+	 * <p>Create a new content assist processor for a specific partition type. 
+	 * The content type will be determined when a document is set on the viewer</p>
+	 * 
+	 * <p>If the given {@link IPreferenceStore} is not <code>null</code> then this
+	 * processor will be registered as a {@link IPropertyChangeListener} on the given store
+	 * so that implementers of this class can change the way the processor acts based on
+	 * user preferences</p>
+	 * 
+	 * @param assistant {@link ContentAssistant} to use
+	 * @param partitionTypeID the partition type this processor is for
+	 * @param viewer {@link ITextViewer} this processor is acting in
+	 * @param preferenceStore This processor will be registered as a {@link IPropertyChangeListener}
+	 * on this store and the processor itself will take care of removing itself as a listener, if
+	 * <code>null</code> then will not be registered as a {@link IPropertyChangeListener}
+	 */
+	public StructuredContentAssistProcessor(ContentAssistant assistant, String partitionTypeID,
+			ITextViewer viewer, IPreferenceStore preferenceStore) {
+		
+		Assert.isNotNull(partitionTypeID);
+		Assert.isNotNull(assistant);
+		
+		//be sure the registry has been loaded, none blocking
+		CompletionProposalComputerRegistry.getDefault().initialize();
+		
+		//register on the preference store
+		this.fPreferenceStore = preferenceStore;
+		if(this.fPreferenceStore != null) {
+			this.fPreferenceStore.addPropertyChangeListener(this);
+		}
+		
+		//The content type can not be determined until a document has been set
+		this.fContentTypeID = null;
+		this.fViewer = viewer;
+		if(viewer != null) {
+			this.fTextInputListener = new TextInputListener();
+			viewer.addTextInputListener(this.fTextInputListener);
+		
+			if(viewer.getDocument() != null) {
+				/* it is highly unlike the document has already been set, but check
+				 * just for sanity
+				 */
+				this.fTextInputListener.inputDocumentChanged(null, viewer.getDocument());
+			}
+		}
+		
+		//set the associated partition type
+		this.fPartitionTypeID = partitionTypeID;
+		
+		//add completion listener
+		fAssistant = assistant;
+		fCompletionListener = new CompletionListener();
+		fAssistant.addCompletionListener(fCompletionListener);
+		
+		//lazy load these to speed up initial editor opening
+		fLegacyExtendedContentAssistProcessors = null;
+		fCategories = null;
+	}
+
+	/**
+	 * <p>Collect the proposals using the extension points</p>
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int)
+	 */
+	public final ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+		clearState();
+
+		IProgressMonitor monitor= createProgressMonitor();
+		monitor.beginTask(SSEUIMessages.ContentAssist_computing_proposals, getProposalCategories().size() + 1);
+
+		CompletionProposalInvocationContext context = createContext(viewer, offset);
+
+		monitor.subTask(SSEUIMessages.ContentAssist_collecting_proposals);
+		List proposals = collectProposals(viewer, offset, monitor, context);
+
+		monitor.subTask(SSEUIMessages.ContentAssist_sorting_proposals);
+		List filtered = filterAndSortProposals(proposals, monitor, context);
+		fNumberOfComputedResults= filtered.size();
+
+		ICompletionProposal[] result= (ICompletionProposal[]) filtered.toArray(new ICompletionProposal[filtered.size()]);
+		monitor.done();
+
+		return result;
+	}
+
+	/**
+	 * <p>Collect the context information using the extension points</p>
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer, int)
+	 */
+	public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+		clearState();
+
+		IProgressMonitor monitor= createProgressMonitor();
+		monitor.beginTask(SSEUIMessages.ContentAssist_computing_contexts, getProposalCategories().size() + 1);
+
+		monitor.subTask(SSEUIMessages.ContentAssist_collecting_contexts);
+		List proposals= collectContextInformation(viewer, offset, monitor);
+
+		monitor.subTask(SSEUIMessages.ContentAssist_sorting_contexts);
+		List filtered= filterAndSortContextInformation(proposals, monitor);
+		fNumberOfComputedResults= filtered.size();
+
+		IContextInformation[] result= (IContextInformation[]) filtered.toArray(new IContextInformation[filtered.size()]);
+		monitor.done();
+		return result;
+	}
+
+	/**
+	 * <p>Default implementation is to return <code>null</code></p>
+	 * <p>Extenders may override</p>
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return (fAutoActivation != null) ? fAutoActivation.getCompletionProposalAutoActivationCharacters() : null;
+	}
+
+	/**
+	 * <p>Default implementation is to return <code>null</code></p>
+	 * <p>Extenders may override</p>
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters()
+	 */
+	public char[] getContextInformationAutoActivationCharacters() {
+		return (fAutoActivation != null) ? fAutoActivation.getContextInformationAutoActivationCharacters() : null;
+	}
+
+	/**
+	 * <p>Extenders may override this function to change error reporting</p>
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getErrorMessage()
+	 */
+	public String getErrorMessage() {
+		if (fErrorMessage != null)
+			return fErrorMessage;
+		if (fNumberOfComputedResults > 0)
+			return null;
+		return SSEUIMessages.ContentAssist_no_completions;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#getContextInformationValidator()
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		if (this.fContextInformationValidator == null) {
+			this.fContextInformationValidator = new ContextInformationValidator();
+		}
+		return this.fContextInformationValidator;
+	}
+	
+	public void install(ITextViewer viewer) {
+		if (fPreferenceStore != null) {
+			fPreferenceStore.addPropertyChangeListener(this);
+		}
+		if (fViewer != null) {
+			fViewer.removeTextInputListener(fTextInputListener);
+		}
+		fViewer = viewer;
+		if (fViewer != null) {
+			fViewer.addTextInputListener(fTextInputListener);
+		}
+		if (fAssistant != null) {
+			fAssistant.addCompletionListener(fCompletionListener);
+		}
+	}
+
+	/**
+	 * <p>Extenders may override, but should always be sure to call the super implementation</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.IReleasable#release()
+	 */
+	public void release() {
+		if (fAutoActivation != null) {
+			fAutoActivation.dispose();
+			fAutoActivation = null;
+		}
+		if(this.fPreferenceStore != null) {
+			this.fPreferenceStore.removePropertyChangeListener(this);
+		}
+		
+		if(this.fViewer != null) {
+			this.fViewer.removeTextInputListener(this.fTextInputListener);
+			this.fViewer = null;
+		}
+		if (this.fAssistant != null) {
+			this.fAssistant.removeCompletionListener(fCompletionListener);
+		}
+	}
+	
+	/**
+	 * <p>Intended to be overridden by extenders wishing to change the behavior
+	 * of the processor based on user preferences from the store optionally 
+	 * associated with this processor.  If no store was given to the constructor
+	 * when creating this assistant then this method will never be invoked.</p>
+	 * 
+	 * <p>The default implementation does not react to the events in any way</p>
+	 * 
+	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+	 */
+	public void propertyChange(PropertyChangeEvent event) {
+	}
+	
+	/**
+	 * <p>Filters and sorts the proposals. The passed list may be modified
+	 * and returned, or a new list may be created and returned.</p>
+	 * 
+	 * <p>The default implementation does not do any sorting or filtering.</p>
+	 * <p>Extenders may override this function.</p>
+	 *
+	 * @param proposals the list of collected proposals (element type:
+	 *        {@link ICompletionProposal})
+	 * @param monitor a progress monitor
+	 * @param context TODO
+	 * @return the list of filtered and sorted proposals, ready for
+	 *         display (element type: {@link ICompletionProposal})
+	 */
+	protected List filterAndSortProposals(List proposals, IProgressMonitor monitor, CompletionProposalInvocationContext context) {
+		return proposals;
+	}
+	
+	/**
+	 * <p>Filters and sorts the context information objects. The passed
+	 * list may be modified and returned, or a new list may be created
+	 * and returned.</p>
+	 * 
+	 * <p>The default implementation does not do any sorting or filtering</p>
+	 * <p>Extenders may override this method</p>
+	 *
+	 * @param contexts the list of collected proposals (element type:
+	 *        {@link IContextInformation})
+	 * @param monitor a progress monitor
+	 * @return the list of filtered and sorted proposals, ready for
+	 *         display (element type: {@link IContextInformation})
+	 */
+	protected List filterAndSortContextInformation(List contexts, IProgressMonitor monitor) {
+		return contexts;
+	}
+
+	/**
+	 * <p>Creates a progress monitor.</p>
+	 * <p>The default implementation creates a {@link NullProgressMonitor}.</p>
+	 *
+	 * <p>Extenders may override this method</p>
+	 *
+	 * @return a progress monitor
+	 */
+	protected IProgressMonitor createProgressMonitor() {
+		return new NullProgressMonitor();
+	}
+
+	/**
+	 * <p>Creates the context that is passed to the completion proposal
+	 * computers.</p>
+	 * 
+	 * <p>Extenders may override this method</p>
+	 *
+	 * @param viewer the viewer that content assist is invoked on
+	 * @param offset the content assist offset
+	 * @return the context to be passed to the computers
+	 */
+	protected CompletionProposalInvocationContext createContext(ITextViewer viewer, int offset) {
+		return new CompletionProposalInvocationContext(viewer, offset);
+	}
+	
+	/**
+	 * @return the associated preference store
+	 */
+	protected IPreferenceStore getPreferenceStore() {
+		return this.fPreferenceStore;
+	}
+	
+	/**
+	 * Clears the state
+	 */
+	private void clearState() {
+		fErrorMessage=null;
+		fNumberOfComputedResults= 0;
+	}
+
+	/**
+	 * <p>Collects the proposals from the extensions.</p>
+	 *
+	 * @param viewer the text viewer
+	 * @param offset the offset
+	 * @param monitor the progress monitor
+	 * @param context the code assist invocation context
+	 * @return the list of proposals
+	 */
+	private List collectProposals(ITextViewer viewer, int offset, IProgressMonitor monitor, CompletionProposalInvocationContext context) {
+		List proposals = new ArrayList();
+		List categories = getCategories();
+		for (Iterator it = categories.iterator(); it.hasNext();) {
+			CompletionProposalCategory cat = (CompletionProposalCategory) it.next();
+			List computed = cat.computeCompletionProposals(context, this.fContentTypeID, this.fPartitionTypeID, new SubProgressMonitor(monitor, 1));
+			proposals.addAll(computed);
+			if (fErrorMessage == null) {
+				fErrorMessage= cat.getErrorMessage();
+			}
+		}
+		
+		// if default page
+		// Deal with adding in proposals from processors added through the legacy extension
+		if (isFirstPage() && getLegacyExtendedContentAssistProcessors() != null &&
+				!getLegacyExtendedContentAssistProcessors().isEmpty()) {
+			
+			Iterator iter = getLegacyExtendedContentAssistProcessors().iterator();
+			while (iter.hasNext()) {
+				IContentAssistProcessor legacyProcessor = (IContentAssistProcessor) iter.next();
+				ICompletionProposal[] legacyComputed = legacyProcessor.computeCompletionProposals(viewer, offset);
+				if (legacyComputed != null) {
+					proposals.addAll(Arrays.asList(legacyComputed));
+				}
+			}
+		}
+		
+		return proposals;
+	}
+	
+	/**
+	 * <p>Collects the context information from the extensions.</p>
+	 * 
+	 * @param viewer
+	 * @param offset
+	 * @param monitor
+	 * @return
+	 */
+	private List collectContextInformation(ITextViewer viewer, int offset, IProgressMonitor monitor) {
+		List proposals = new ArrayList();
+		CompletionProposalInvocationContext context= createContext(viewer, offset);
+
+		List providers= getCategories();
+		for (Iterator it= providers.iterator(); it.hasNext();) {
+			CompletionProposalCategory cat= (CompletionProposalCategory) it.next();
+			List computed= cat.computeContextInformation(context, this.fContentTypeID, this.fPartitionTypeID, new SubProgressMonitor(monitor, 1));
+			proposals.addAll(computed);
+			if (fErrorMessage == null) {
+				fErrorMessage= cat.getErrorMessage();
+			}
+		}
+		
+		// Deal with adding in contexts from processors added through the legacy extension
+		if (getLegacyExtendedContentAssistProcessors() != null &&
+				!getLegacyExtendedContentAssistProcessors().isEmpty()) {
+			
+			Iterator iter = getLegacyExtendedContentAssistProcessors().iterator();
+			while (iter.hasNext()) {
+				IContentAssistProcessor legacyProcessor = (IContentAssistProcessor) iter.next();
+				IContextInformation[] legacyComputed = legacyProcessor.computeContextInformation(viewer, offset);
+				if(legacyComputed != null) {
+					proposals.addAll(Arrays.asList(legacyComputed));
+				}
+			}
+		}
+
+		return proposals;
+	}
+
+	/**
+	 * @return the next set of categories
+	 */
+	private List getCategories() {
+		List categories;
+		if (fCategoryIteration == null) {
+			categories =  getProposalCategories();
+		} else {
+			int iteration= fRepetition % fCategoryIteration.size();
+			fAssistant.setStatusMessage(createIterationMessage());
+			fAssistant.setEmptyMessage(createEmptyMessage());
+			fRepetition++;
+	
+			categories = (List) fCategoryIteration.get(iteration);
+		}
+		
+		return categories;
+	}
+
+	/**
+	 *  This may show the warning dialog if all categories are disabled
+	 */
+	private void resetCategoryIteration() {
+		fCategoryIteration = getCategoryIteration();
+	}
+
+	/**
+	 * @return {@link List} of {@link List}s of {@link CompletionProposalCategory}s, this is
+	 * the ordered list of the completion categories to cycle through
+	 */
+	private List getCategoryIteration() {
+		List sequence= new ArrayList();
+		sequence.add(getDefaultCategories());
+		for (Iterator it= getSortedOwnPageCategories().iterator(); it.hasNext();) {
+			CompletionProposalCategory cat= (CompletionProposalCategory) it.next();
+			sequence.add(Collections.singletonList(cat));
+		}
+		return sequence;
+	}
+
+	/**
+	 * @return the sorted categories for the default page
+	 */
+	private List getDefaultCategories() {
+		// default mix - enable all included computers
+		List included= getDefaultCategoriesUnchecked();
+
+		if (included.size() == 0 && CompletionProposalComputerRegistry.getDefault().hasUninstalledComputers()) {
+			if (informUserAboutEmptyDefaultCategory()) {
+				// preferences were restored - recompute the default categories
+				included= getDefaultCategoriesUnchecked();
+			}
+			CompletionProposalComputerRegistry.getDefault().resetUnistalledComputers();
+		}
+		
+		Collections.sort(included, DEFAULT_PAGE_ORDER_COMPARATOR);
+
+		return included;
+	}
+
+	/**
+	 * <p>Gets the default categories with no error checking.</p>
+	 * 
+	 * @return the default {@link CompletionProposalCategory}s
+	 */
+	private List getDefaultCategoriesUnchecked() {
+		List included = new ArrayList();
+		for (Iterator it = getProposalCategories().iterator(); it.hasNext();) {
+			CompletionProposalCategory category = (CompletionProposalCategory) it.next();
+			if (category.isIncludedOnDefaultPage(this.fContentTypeID) && category.hasComputers(fContentTypeID, fPartitionTypeID))
+				included.add(category);
+		}
+		return included;
+	}
+
+	/**
+	 * <p>Informs the user about the fact that there are no enabled categories in the default content
+	 * assist set and shows a link to the preferences.</p>
+	 *
+	 * @return  <code>true</code> if the default should be restored
+	 */
+	private boolean informUserAboutEmptyDefaultCategory() {
+		/*If warn about empty default category and there are associated properties for this
+		 * processors content type and those properties have an associated properties page then
+		 * display warning message to user.
+		 */
+		ICompletionProposalCategoriesConfigurationReader properties = CompletionProposoalCatigoriesConfigurationRegistry.getDefault().getReadableConfiguration(this.fContentTypeID);
+		if (OptionalMessageDialog.isDialogEnabled(PREF_WARN_ABOUT_EMPTY_ASSIST_CATEGORY) &&
+				properties instanceof ICompletionProposalCategoriesConfigurationWriter  &&
+				((ICompletionProposalCategoriesConfigurationWriter)properties).hasAssociatedPropertiesPage()) {
+			
+			ICompletionProposalCategoriesConfigurationWriter propertiesExtension = (ICompletionProposalCategoriesConfigurationWriter)properties;
+			
+			final Shell shell= SSEUIPlugin.getActiveWorkbenchShell();
+			String title= SSEUIMessages.ContentAssist_all_disabled_title;
+			String message= SSEUIMessages.ContentAssist_all_disabled_message;
+			// see PreferencePage#createControl for the 'defaults' label
+			final String restoreButtonLabel= JFaceResources.getString("defaults"); //$NON-NLS-1$
+			final String linkMessage= NLS.bind(SSEUIMessages.ContentAssist_all_disabled_preference_link, LegacyActionTools.removeMnemonics(restoreButtonLabel));
+			final int restoreId= IDialogConstants.CLIENT_ID + 10;
+			final int settingsId= IDialogConstants.CLIENT_ID + 11;
+			final OptionalMessageDialog dialog= new OptionalMessageDialog(PREF_WARN_ABOUT_EMPTY_ASSIST_CATEGORY, shell, title, null /* default image */, message, MessageDialog.WARNING, new String[] { restoreButtonLabel, IDialogConstants.CLOSE_LABEL }, 1) {
+				/*
+				 * @see org.eclipse.jdt.internal.ui.dialogs.OptionalMessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
+				 */
+				protected Control createCustomArea(Composite composite) {
+					// wrap link and checkbox in one composite without space
+					Composite parent= new Composite(composite, SWT.NONE);
+					GridLayout layout= new GridLayout();
+					layout.marginHeight= 0;
+					layout.marginWidth= 0;
+					layout.verticalSpacing= 0;
+					parent.setLayout(layout);
+
+					Composite linkComposite= new Composite(parent, SWT.NONE);
+					layout= new GridLayout();
+					layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+					layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+					layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+					linkComposite.setLayout(layout);
+
+	        		Link link= new Link(linkComposite, SWT.NONE);
+	        		link.setText(linkMessage);
+	        		link.addSelectionListener(new SelectionAdapter() {
+	        			public void widgetSelected(SelectionEvent e) {
+	        				setReturnCode(settingsId);
+	        				close();
+	        			}
+	        		});
+	        		GridData gridData= new GridData(SWT.FILL, SWT.BEGINNING, true, false);
+	        		gridData.widthHint= this.getMinimumMessageWidth();
+					link.setLayoutData(gridData);
+
+					// create checkbox and "don't show this message" prompt
+					super.createCustomArea(parent);
+
+					return parent;
+	        	}
+
+				/*
+				 * @see org.eclipse.jface.dialogs.MessageDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+				 */
+				protected void createButtonsForButtonBar(Composite parent) {
+			        Button[] buttons= new Button[2];
+					buttons[0]= createButton(parent, restoreId, restoreButtonLabel, false);
+			        buttons[1]= createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, true);
+			        setButtons(buttons);
+				}
+	        };
+	        int returnValue = dialog.open();
+	        
+	        //based on user actions either reset defaults or open preference dialog
+	        if (restoreId == returnValue || settingsId == returnValue) {
+	        	if (restoreId == returnValue) {
+	        		propertiesExtension.loadDefaults();
+	        		propertiesExtension.saveConfiguration();
+	        	}
+	        	if (settingsId == returnValue) {
+					PreferencesUtil.createPreferenceDialogOn(shell,
+							propertiesExtension.getPropertiesPageID(), null, null).open();
+	        	}
+	        	
+	        	return true;
+	        }
+		}
+		return false;
+	}
+
+	/**
+	 * @return a sorted {@link List} of {@link CompletionProposalCategory}s that
+	 * should be displayed on their own content assist page
+	 */
+	private List getSortedOwnPageCategories() {
+		ArrayList sorted= new ArrayList();
+		for (Iterator it= getProposalCategories().iterator(); it.hasNext();) {
+			CompletionProposalCategory category= (CompletionProposalCategory) it.next();
+			if (category.isDisplayedOnOwnPage(this.fContentTypeID) && 
+					category.hasComputers(fContentTypeID, fPartitionTypeID)) {
+				
+				sorted.add(category);
+			}
+		}
+		Collections.sort(sorted, PAGE_ORDER_COMPARATOR);
+		return sorted;
+	}
+
+	/**
+	 * @return a user message describing that there are no content assist suggestions for the current page
+	 */
+	private String createEmptyMessage() {
+		return NLS.bind(SSEUIMessages.ContentAssist_no_message, new String[]{getCategoryLabel(fRepetition)});
+	}
+
+	/**
+	 * @return user message describing what the next page of content assist holds
+	 */
+	private String createIterationMessage() {
+		return NLS.bind(SSEUIMessages.ContentAssist_toggle_affordance_update_message,
+				new String[]{ getCategoryLabel(fRepetition), fIterationGesture, getCategoryLabel(fRepetition + 1) });
+	}
+
+	/**
+	 * @param repetition which category to get the label for
+	 * @return the label of the category
+	 */
+	private String getCategoryLabel(int repetition) {
+		int iteration= (fCategoryIteration != null ? repetition % fCategoryIteration.size() : 0);
+		if (iteration == 0)
+			return SSEUIMessages.ContentAssist_defaultProposalCategory_title;
+		return ((CompletionProposalCategory) ((List) fCategoryIteration.get(iteration)).get(0)).getDisplayName();
+	}
+
+	/**
+	 * @return {@link String} representing the user command to iterate to the next page
+	 */
+	private String getIterationGesture() {
+		TriggerSequence binding= getIterationBinding();
+		return binding != null ?
+				NLS.bind(SSEUIMessages.ContentAssist_press, new Object[] { binding.format() })
+				: SSEUIMessages.ContentAssist_click;
+	}
+
+	/**
+	 * @return {@link KeySequence} used by user to iterate to the next page
+	 */
+	private KeySequence getIterationBinding() {
+	    final IBindingService bindingSvc= (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class);
+		TriggerSequence binding= bindingSvc.getBestActiveBindingFor(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+		if (binding instanceof KeySequence)
+			return (KeySequence) binding;
+		return null;
+    }
+	
+	/**
+	 * @return <code>true</code> if displaying first page, <code>false</code> otherwise
+	 */
+	private boolean isFirstPage() {
+		return fCategoryIteration == null || fCategoryIteration.size() == 1 || fRepetition % fCategoryIteration.size() == 1;
+	}
+	
+	/**
+	 * <p><b>NOTE: </b>This method should be used over accessing the
+	 * {@link #fLegacyExtendedContentAssistProcessors} field directly so as to
+	 * facilitate the lazy initialization of the field.</p>
+	 * 
+	 * @return the legacy extended content assist processors
+	 */
+	private List getLegacyExtendedContentAssistProcessors() {
+		if(fLegacyExtendedContentAssistProcessors == null) {
+			fLegacyExtendedContentAssistProcessors =
+				ExtendedConfigurationBuilder.getInstance().getConfigurations(
+						CONTENT_ASSIST_PROCESSOR_EXTENDED_ID, fPartitionTypeID);
+		}
+		
+		return fLegacyExtendedContentAssistProcessors;
+	}
+	
+	/**
+	 * <p><b>NOTE: </b>This method should be used over accessing the {@link #fCategories}
+	 * field directly so as to facilitate the lazy initialization of the field.</p>
+	 * 
+	 * @return the categories associated with the content type this processor is associated with
+	 */
+	private List getProposalCategories() {
+		if(fCategories == null) {
+			fCategories =
+				CompletionProposalComputerRegistry.getDefault().getProposalCategories(fContentTypeID);
+		}
+		
+		return fCategories;
+	}
+	
+	/**
+	 * The completion listener class for this processor.
+	 */
+	private final class CompletionListener implements ICompletionListener, ICompletionListenerExtension {
+		/**
+		 * @see org.eclipse.jface.text.contentassist.ICompletionListener#assistSessionStarted(org.eclipse.jface.text.contentassist.ContentAssistEvent)
+		 */
+		public void assistSessionStarted(ContentAssistEvent event) {
+			if (event.processor == StructuredContentAssistProcessor.this ||
+					(event.processor instanceof CompoundContentAssistProcessor &&
+							((CompoundContentAssistProcessor)event.processor).containsProcessor(StructuredContentAssistProcessor.this))) {
+				
+				fIterationGesture= getIterationGesture();
+				KeySequence binding= getIterationBinding();
+	
+				// This may show the warning dialog if all categories are disabled
+				resetCategoryIteration();
+				for (Iterator it= StructuredContentAssistProcessor.this.getProposalCategories().iterator(); it.hasNext();) {
+					CompletionProposalCategory cat= (CompletionProposalCategory) it.next();
+					cat.sessionStarted();
+				}
+	
+				fRepetition= 0;
+				if (event.assistant instanceof IContentAssistantExtension2) {
+					IContentAssistantExtension2 extension= (IContentAssistantExtension2) event.assistant;
+	
+					if (fCategoryIteration.size() == 1) {
+						extension.setRepeatedInvocationMode(false);
+						extension.setShowEmptyList(false);
+					} else {
+						extension.setRepeatedInvocationMode(true);
+						extension.setStatusLineVisible(true);
+						extension.setStatusMessage(createIterationMessage());
+						extension.setShowEmptyList(true);
+						if (extension instanceof IContentAssistantExtension3) {
+							IContentAssistantExtension3 ext3= (IContentAssistantExtension3) extension;
+							((ContentAssistant) ext3).setRepeatedInvocationTrigger(binding);
+						}
+					}
+				}
+			}
+		}
+
+		/**
+		 * @see org.eclipse.jface.text.contentassist.ICompletionListener#assistSessionEnded(org.eclipse.jface.text.contentassist.ContentAssistEvent)
+		 */
+		public void assistSessionEnded(ContentAssistEvent event) {
+			if (event.processor == StructuredContentAssistProcessor.this ||	(event.processor instanceof CompoundContentAssistProcessor && ((CompoundContentAssistProcessor)event.processor).containsProcessor(StructuredContentAssistProcessor.this))) {
+				for (Iterator it= StructuredContentAssistProcessor.this.getProposalCategories().iterator(); it.hasNext();) {
+					CompletionProposalCategory cat= (CompletionProposalCategory) it.next();
+					cat.sessionEnded();
+				}
+	
+				fCategoryIteration= null;
+				fRepetition= -1;
+				fIterationGesture= null;
+				if (event.assistant instanceof IContentAssistantExtension2) {
+					IContentAssistantExtension2 extension= (IContentAssistantExtension2) event.assistant;
+					extension.setShowEmptyList(false);
+					extension.setRepeatedInvocationMode(false);
+					extension.setStatusLineVisible(false);
+					if (extension instanceof IContentAssistantExtension3) {
+						IContentAssistantExtension3 ext3= (IContentAssistantExtension3) extension;
+						((ContentAssistant) ext3).setRepeatedInvocationTrigger(null);
+					}
+				}
+			}
+		}
+
+		/**
+		 * @see org.eclipse.jface.text.contentassist.ICompletionListener#selectionChanged(org.eclipse.jface.text.contentassist.ICompletionProposal, boolean)
+		 */
+		public void selectionChanged(ICompletionProposal proposal, boolean smartToggle) {
+			//ignore
+		}
+
+		/**
+		 * @see org.eclipse.jface.text.contentassist.ICompletionListenerExtension#assistSessionRestarted(org.eclipse.jface.text.contentassist.ContentAssistEvent)
+		 */
+		public void assistSessionRestarted(ContentAssistEvent event) {
+			fRepetition= 0;
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	private class TextInputListener implements ITextInputListener {
+
+		/**
+		 * <p>Set the content type based on the new document if it has not already been
+		 * set yet.</p>
+		 * 
+		 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IDocument)
+		 */
+		public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+			if(fContentTypeID == null) {
+				if(newInput instanceof IStructuredDocument) {
+					IStructuredModel model = null;
+					try {
+						model = StructuredModelManager.getModelManager().getModelForRead((IStructuredDocument)newInput);
+						if(model != null) {
+							fContentTypeID = model.getContentTypeIdentifier();
+							if (fAutoActivation != null) {
+								fAutoActivation.dispose();
+							}
+							fAutoActivation = CompletionProposalComputerRegistry.getDefault().getActivator(fContentTypeID, fPartitionTypeID);
+						}
+					} finally {
+						if(model != null) {
+							model.releaseFromRead();
+						}
+					}
+				}
+			}
+		}
+		
+		/**
+		 * <p>Ignored</p>
+		 * 
+		 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IDocument)
+		 */
+		public void inputDocumentAboutToBeChanged(IDocument oldInput,
+				IDocument newInput) {
+			//ignore
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/AbstractDropAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/AbstractDropAction.java
new file mode 100644
index 0000000..cd54849
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/AbstractDropAction.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+
+/**
+ */
+public abstract class AbstractDropAction implements IDropAction {
+
+	/*
+	 * Replaces targetEditor's current selection by "text"
+	 */
+	protected boolean insert(String text, IEditorPart targetEditor) {
+		if (text == null || text.length() == 0) {
+			return true;
+		}
+
+		ITextSelection textSelection = null;
+		IDocument doc = null;
+		ISelection selection = null;
+
+		ISourceEditingTextTools tools = (ISourceEditingTextTools) targetEditor.getAdapter(ISourceEditingTextTools.class);
+		if (tools != null) {
+			doc = tools.getDocument();
+			selection = tools.getSelection();
+		}
+
+		ITextEditor textEditor = null;
+		if (targetEditor instanceof ITextEditor) {
+			textEditor = (ITextEditor) targetEditor;
+		}
+		if (textEditor == null) {
+			textEditor = (ITextEditor) ((IAdaptable) targetEditor).getAdapter(ITextEditor.class);
+		}
+		if (textEditor == null && tools != null && tools.getEditorPart() instanceof ITextEditor) {
+			textEditor = (ITextEditor) tools.getEditorPart();
+		}
+		if (textEditor == null && tools != null && tools.getEditorPart() != null) {
+			textEditor = (ITextEditor) tools.getEditorPart().getAdapter(ITextEditor.class);
+		}
+
+		if (selection == null && textEditor != null) {
+			selection = textEditor.getSelectionProvider().getSelection();
+		}
+		if (doc == null && textEditor != null) {
+			doc = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+		}
+
+		if (selection instanceof ITextSelection) {
+			textSelection = (ITextSelection) selection;
+			try {
+				doc.replace(textSelection.getOffset(), textSelection.getLength(), text);
+			}
+			catch (BadLocationException e) {
+				return false;
+			}
+		}
+		if (textEditor != null && textSelection != null) {
+			ISelectionProvider sp = textEditor.getSelectionProvider();
+			ITextSelection sel = new TextSelection(textSelection.getOffset(), text.length());
+			sp.setSelection(sel);
+			textEditor.selectAndReveal(sel.getOffset(), sel.getLength());
+		}
+
+		return true;
+	}
+
+	public boolean isSupportedData(Object data) {
+		return true;
+	}
+
+	public abstract boolean run(DropTargetEvent event, IEditorPart targetEditor);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/CaretMediator.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/CaretMediator.java
new file mode 100644
index 0000000..33f0311
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/CaretMediator.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.core.internal.util.Utilities;
+import org.eclipse.wst.sse.ui.internal.view.events.CaretEvent;
+import org.eclipse.wst.sse.ui.internal.view.events.ICaretListener;
+
+/**
+ * Has the responsibility of listening for key events, and mouse events,
+ * deciding if the caret has moved (without a text change), and if so, will
+ * notify CaretListeners that the caret has moved. Objects which are
+ * interested in ALL caret postion changes will also have to listen for
+ * textChanged events.
+ * 
+ * @deprecated - use base selection notification
+ */
+public class CaretMediator implements Listener {
+
+	class CaretMediatorListener implements KeyListener, MouseListener {
+		public void keyPressed(KeyEvent e) {
+			internalKeyPressed(e);
+		}
+
+		public void keyReleased(KeyEvent e) {
+			internalKeyReleased(e);
+		}
+
+		public void mouseDoubleClick(MouseEvent e) {
+		}
+
+		public void mouseDown(MouseEvent e) {
+			internalMouseDown(e);
+		}
+
+		public void mouseUp(MouseEvent e) {
+			internalMouseUp(e);
+		}
+	}
+
+	class RefreshDelayJob extends Job {
+		private int fDelay = 0;
+		RefreshDelayJob(int delay) {
+			super(SSEUIMessages.caret_update); //$NON-NLS-1$
+			setSystem(true);
+			fDelay = delay;
+		}
+
+		/**
+		 * Setup a delayed CaretEvent firing
+		 */
+		void touch() {
+			cancel();
+			schedule(fDelay);
+		}
+
+		protected IStatus run(IProgressMonitor monitor) {
+			handleEvent(null);
+			return Status.OK_STATUS;
+		}
+	}
+	
+	RefreshDelayJob fDelayer = null;
+	private static final int DELAY = 300;
+
+	/** used just for debug print outs */
+	private long endTime;
+	private long startTime;
+
+	protected ICaretListener[] fCaretListeners;
+	protected CaretMediatorListener internalListener;
+	protected StyledText textWidget;
+
+	/**
+	 * CaretMediator constructor comment.
+	 */
+	public CaretMediator() {
+		super();
+	}
+
+	/**
+	 * CaretMediator constructor comment. Must always provide the widget its
+	 * supposed to listen to.
+	 */
+	public CaretMediator(StyledText styledTextWidget) {
+		this();
+		setTextWidget(styledTextWidget);
+	}
+
+	public synchronized void addCaretListener(ICaretListener listener) {
+		if (Debug.debugStructuredDocument) {
+			System.out.println("CaretMediator::addCaretListener. Request to add an instance of " + listener.getClass() + " as a listener on caretlistner.");//$NON-NLS-2$//$NON-NLS-1$
+		}
+		// make sure listener is not already in listening array
+		// (and if it is, print a warning to aid debugging, if needed)
+
+		if (Utilities.contains(fCaretListeners, listener)) {
+			if (Debug.displayWarnings) {
+				System.out.println("CaretMediator::addCaretListener. listener " + listener + " was added more than once. ");//$NON-NLS-2$//$NON-NLS-1$
+			}
+		} else {
+			if (Debug.debugStructuredDocument) {
+				System.out.println("CaretMediator::addCaretListener. Adding an instance of " + listener.getClass() + " as a listener on caret mediator.");//$NON-NLS-2$//$NON-NLS-1$
+			}
+			int oldSize = 0;
+			if (fCaretListeners != null) {
+				// normally won't be null, but we need to be sure, for first
+				// time through
+				oldSize = fCaretListeners.length;
+			}
+			int newSize = oldSize + 1;
+			ICaretListener[] newListeners = new ICaretListener[newSize];
+			if (fCaretListeners != null) {
+				System.arraycopy(fCaretListeners, 0, newListeners, 0, oldSize);
+			}
+			// add listener to last position
+			newListeners[newSize - 1] = listener;
+			//
+			// now switch new for old
+			fCaretListeners = newListeners;
+
+		}
+	}
+
+	protected void fireCaretEvent(CaretEvent event) {
+		if (fCaretListeners != null) {
+			// we must assign listeners to local variable to be thread safe,
+			// since the add and remove listner methods
+			// can change this object's actual instance of the listener array
+			// from another thread
+			// (and since object assignment is atomic, we don't need to
+			// synchronize
+			ICaretListener[] holdListeners = fCaretListeners;
+			//
+			for (int i = 0; i < holdListeners.length; i++) {
+				holdListeners[i].caretMoved(event);
+			}
+		}
+	}
+
+	public void handleEvent(Event e) {
+		Display display = null;
+
+		if (Debug.debugCaretMediator) {
+			endTime = System.currentTimeMillis();
+			System.out.println("Timer fired: " + (endTime - startTime)); //$NON-NLS-1$
+		}
+
+		// check if 'okToUse'
+		if (textWidget != null && !textWidget.isDisposed()) {
+			display = textWidget.getDisplay();
+			if ((display != null) && (!display.isDisposed())) {
+				display.asyncExec(new Runnable() {
+					public void run() {
+						if (textWidget != null && !textWidget.isDisposed()) {
+							fireCaretEvent(new CaretEvent(textWidget, textWidget.getCaretOffset()));
+						}
+					}
+				});
+			}
+		}
+	}
+
+	protected void internalKeyPressed(KeyEvent e) {
+		fDelayer.cancel();
+	}
+
+	protected void internalKeyReleased(KeyEvent e) {
+		switch (e.keyCode) {
+			case SWT.ARROW_DOWN :
+			case SWT.ARROW_UP :
+			case SWT.ARROW_LEFT :
+			case SWT.ARROW_RIGHT :
+			case SWT.HOME :
+			case SWT.END :
+			case SWT.PAGE_DOWN :
+			case SWT.PAGE_UP : {
+				fDelayer.touch();
+				break;
+			}
+			default : {
+				// always update cursor postion, even during normal typing
+				// (the logic may look funny, since we always to the same
+				// thing, but we haven't always done the same thing, so I
+				// wanted to leave that fact documented via code.)
+				fDelayer.touch();
+			}
+		}
+	}
+
+	protected void internalMouseDown(MouseEvent e) {
+		fDelayer.cancel();
+	}
+
+	protected void internalMouseUp(MouseEvent e) {
+		// Note, even during a swipe select, when the mouse button goes up,
+		// and the widget is
+		// queried for the current caret postion, it always returns the
+		// beginning of the selection,
+		// which is desirable (at least for the known use of this feature,
+		// which is to signal
+		// that the property sheet can update itself.
+		fDelayer.touch();
+	}
+
+	public void release() {
+		fDelayer.cancel();
+		if (textWidget != null && !textWidget.isDisposed()) {
+			textWidget.removeKeyListener(internalListener);
+			textWidget.removeMouseListener(internalListener);
+			textWidget = null;
+		}
+	}
+
+	public synchronized void removeCaretListener(ICaretListener listener) {
+		if ((fCaretListeners != null) && (listener != null)) {
+			// if its not in the listeners, we'll ignore the request
+			if (Utilities.contains(fCaretListeners, listener)) {
+				int oldSize = fCaretListeners.length;
+				int newSize = oldSize - 1;
+				ICaretListener[] newListeners = new ICaretListener[newSize];
+				int index = 0;
+				for (int i = 0; i < oldSize; i++) {
+					if (fCaretListeners[i] == listener) { // ignore
+					} else {
+						// copy old to new if its not the one we are removing
+						newListeners[index++] = fCaretListeners[i];
+					}
+				}
+				// now that we have a new array, let's switch it for the old
+				// one
+				fCaretListeners = newListeners;
+			}
+		}
+	}
+
+	public void setTextWidget(StyledText newTextWidget) {
+		if(fDelayer == null) {
+			fDelayer = new RefreshDelayJob(DELAY);
+		}
+
+		// unhook from previous, if any
+		if (this.textWidget != null) {
+			fDelayer.cancel();
+			this.textWidget.removeKeyListener(internalListener);
+			this.textWidget.removeMouseListener(internalListener);
+		}
+
+		this.textWidget = newTextWidget;
+
+		if (internalListener == null) {
+			internalListener = new CaretMediatorListener();
+		}
+
+		if (this.textWidget != null) {
+			this.textWidget.addKeyListener(internalListener);
+			this.textWidget.addMouseListener(internalListener);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedConfigurationBuilder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedConfigurationBuilder.java
new file mode 100644
index 0000000..8ec6fa8
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedConfigurationBuilder.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Simple generic ID to class to mapping. Loads a specified class defined in a
+ * configuration element with the matching type and target ID. Example
+ * plugin.xml section:
+ * 
+ * &lt;extension
+ * point=&quot;org.eclipse.wst.sse.ui.editorConfiguration&quot;&gt;contentoutlineconfiguration
+ * target=&quot;org.eclipse.wst.sse.dtd.core.dtdsource&quot;
+ * class=&quot;org.eclipse.wst.sse.ui.dtd.views.contentoutline.DTDContentOutlineConfiguration&quot;/&gt;
+ * &lt;/extension&gt;
+ * 
+ * Used in code by getConfiguration(&quot;contentoutlineconfiguration&quot;,
+ * &quot;org.eclipse.wst.dtd.ui.StructuredTextEditorDTD&quot;);
+ * 
+ */
+public class ExtendedConfigurationBuilder extends RegistryReader {
+	/**
+	 * Extension type to pass into getConfigurations to get content outline
+	 * configuration
+	 */
+	public static final String CONTENTOUTLINECONFIGURATION = "contentOutlineConfiguration"; //$NON-NLS-1$
+	/**
+	 * Extension type to pass into getConfigurations to get property sheet
+	 * configuration
+	 */
+	public static final String PROPERTYSHEETCONFIGURATION = "propertySheetConfiguration"; //$NON-NLS-1$
+	/**
+	 * Extension type to pass into getConfigurations to get source viewer
+	 * configuration
+	 */
+	public static final String SOURCEVIEWERCONFIGURATION = "sourceViewerConfiguration"; //$NON-NLS-1$
+	/**
+	 * Extension type to pass into getConfigurations to get documentation text
+	 * hover
+	 */
+	public static final String DOCUMENTATIONTEXTHOVER = "documentationTextHover"; //$NON-NLS-1$
+	/**
+	 * Extension type to pass into getConfigurations to get double click
+	 * strategy
+	 */
+	public static final String DOUBLECLICKSTRATEGY = "doubleClickStrategy"; //$NON-NLS-1$
+	/**
+	 * Extension type to pass into getConfigurations to get quick outline
+	 * configuration
+	 */
+	public static final String QUICKOUTLINECONFIGURATION = "quickOutlineConfiguration"; //$NON-NLS-1$
+
+	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
+	private static final String ATT_TARGET = "target"; //$NON-NLS-1$
+	private static final String ATT_TYPE = "type"; //$NON-NLS-1$
+	private static final String CONFIGURATION = "provisionalConfiguration"; //$NON-NLS-1$
+	private static Map configurationMap = null;
+	private final static boolean debugTime = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/extendedconfigurationbuilder/time")); //$NON-NLS-1$  //$NON-NLS-2$
+	private static final String DEFINITION = "provisionalDefinition"; //$NON-NLS-1$
+	private static final String EP_EXTENDEDCONFIGURATION = "editorConfiguration"; //$NON-NLS-1$
+	private static ExtendedConfigurationBuilder instance = null;
+	public static final String VALUE = "value"; //$NON-NLS-1$
+
+	/**
+	 * Creates an extension. If the extension plugin has not been loaded a
+	 * busy cursor will be activated during the duration of the load.
+	 * 
+	 * @param element
+	 *            the config element defining the extension
+	 * @param classAttribute
+	 *            the name of the attribute carrying the class
+	 * @returns the extension object if successful. If an error occurs when
+	 *          createing executable extension, the exception is logged, and
+	 *          null returned.
+	 */
+	static Object createExtension(final IConfigurationElement element, final String classAttribute, final String targetID) {
+		final Object[] result = new Object[1];
+		String pluginId = element.getDeclaringExtension().getNamespace();
+		Bundle bundle = Platform.getBundle(pluginId);
+		if (bundle.getState() == Bundle.ACTIVE) {
+			try {
+				result[0] = element.createExecutableExtension(classAttribute);
+			}
+			catch (Exception e) {
+				// catch and log ANY exception while creating the extension
+				Logger.logException("error loading class " + classAttribute + " for " + targetID, e); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = element.createExecutableExtension(classAttribute);
+					}
+					catch (Exception e) {
+						// catch and log ANY exception from extension point
+						Logger.logException("error loading class " + classAttribute + " for " + targetID, e); //$NON-NLS-1$ //$NON-NLS-2$
+					}
+				}
+			});
+		}
+		return result[0];
+	}
+
+	public synchronized static ExtendedConfigurationBuilder getInstance() {
+		if (instance == null)
+			instance = new ExtendedConfigurationBuilder();
+		return instance;
+	}
+
+	long time0 = 0;
+
+	private ExtendedConfigurationBuilder() {
+		super();
+	}
+
+	private List createConfigurations(List configurations, String extensionType, String targetID) {
+		if (configurations == null)
+			return new ArrayList(0);
+		List result = new ArrayList(1);
+		for (int i = 0; i < configurations.size(); i++) {
+			IConfigurationElement element = (IConfigurationElement) configurations.get(i);
+			if ((element.getName().equals(extensionType) || (element.getName().equals(CONFIGURATION) && extensionType.equals(element.getAttribute(ATT_TYPE))))) {
+				String[] targets = StringUtils.unpack(element.getAttribute(ATT_TARGET));
+				for (int j = 0; j < targets.length; j++) {
+					if (targetID.equals(targets[j].trim())) {
+						Object o = createExtension(element, ATT_CLASS, targetID);
+						if (o != null) {
+							result.add(o);
+						}
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	private IConfigurationElement[] findConfigurationElements(List configurations, String extensionType, String targetID) {
+		if (configurations == null)
+			return new IConfigurationElement[0];
+		List result = new ArrayList(1);
+		for (int i = 0; i < configurations.size(); i++) {
+			IConfigurationElement element = (IConfigurationElement) configurations.get(i);
+			if ((element.getName().equals(extensionType) || (element.getName().equals(DEFINITION) && extensionType.equals(element.getAttribute(ATT_TYPE))))) {
+				String[] targets = StringUtils.unpack(element.getAttribute(ATT_TARGET));
+				for (int j = 0; j < targets.length; j++) {
+					if (targetID.equals(targets[j].trim())) {
+						result.add(element);
+					}
+				}
+			}
+		}
+		return (IConfigurationElement[]) result.toArray(new IConfigurationElement[0]);
+	}
+
+	/**
+	 * Returns a configuration for the given extensionType matching the
+	 * targetID, if one is available. If more than one configuration is
+	 * defined, the first one found is returned.
+	 * 
+	 * @param extensionType
+	 * @param targetID
+	 * @return a configuration object, if one was defined
+	 */
+	public Object getConfiguration(String extensionType, String targetID) {
+		if (targetID == null || targetID.length() == 0)
+			return null;
+		List configurations = getConfigurations(extensionType, targetID);
+		if (configurations.isEmpty())
+			return null;
+		return configurations.get(0);
+	}
+
+	/**
+	 * Returns all configurations for the given extensionType matching the
+	 * targetID, if any are available.
+	 * 
+	 * @param extensionType
+	 * @param targetID
+	 * @return a List of configuration objects, which may or may not be empty
+	 */
+	public List getConfigurations(String extensionType, String targetID) {
+		if (targetID == null || targetID.length() == 0)
+			return new ArrayList(0);
+		if (configurationMap == null) {
+			configurationMap = new HashMap(0);
+			synchronized (configurationMap) {
+				readRegistry(Platform.getExtensionRegistry(), SSEUIPlugin.ID, EP_EXTENDEDCONFIGURATION);
+				if (debugTime) {
+					System.out.println(getClass().getName() + "#readRegistry():  " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+					time0 = System.currentTimeMillis();
+				}
+			}
+		}
+		List extensions = (List) configurationMap.get(extensionType);
+		List configurations = createConfigurations(extensions, extensionType, targetID);
+		if (debugTime) {
+			if (!configurations.isEmpty())
+				System.out.println(getClass().getName() + "#getConfiguration(" + extensionType + ", " + targetID + "): configurations loaded in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			else
+				System.out.println(getClass().getName() + "#getConfiguration(" + extensionType + ", " + targetID + "): ran in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		}
+		return configurations;
+	}
+
+	/**
+	 * Returns all declared definitions for the given extensionType matching
+	 * the targetID, if any are available.
+	 * 
+	 * @param extensionType
+	 * @param targetID
+	 * @return An array containing the definitions, empty if none were
+	 *         declared
+	 */
+	public String[] getDefinitions(String extensionType, String targetID) {
+		if (targetID == null || targetID.length() == 0)
+			return new String[0];
+		if (debugTime) {
+			time0 = System.currentTimeMillis();
+		}
+		if (configurationMap == null) {
+			configurationMap = new HashMap(0);
+			synchronized (configurationMap) {
+				readRegistry(Platform.getExtensionRegistry(), SSEUIPlugin.ID, EP_EXTENDEDCONFIGURATION);
+				if (debugTime) {
+					System.out.println(getClass().getName() + "#readRegistry():  " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+					time0 = System.currentTimeMillis();
+				}
+			}
+		}
+		List definitions = (List) configurationMap.get(extensionType);
+		IConfigurationElement[] elements = findConfigurationElements(definitions, extensionType, targetID);
+		String[] values = new String[elements.length];
+		for (int i = 0; i < values.length; i++) {
+			values[i] = elements[i].getAttribute(VALUE);
+		}
+		if (debugTime) {
+			if (values.length > 0)
+				System.out.println(getClass().getName() + "#getDefinitions(" + extensionType + ", " + targetID + "): definition loaded in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			else
+				System.out.println(getClass().getName() + "#getDefinitions(" + extensionType + ", " + targetID + "): ran in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		}
+		return values;
+	}
+
+	protected boolean readElement(IConfigurationElement element) {
+		String name = element.getName();
+		if (name.equals(CONFIGURATION) || name.equals(DEFINITION))
+			name = element.getAttribute(ATT_TYPE);
+		List configurations = (List) configurationMap.get(name);
+		if (configurations == null) {
+			configurations = new ArrayList(1);
+			configurationMap.put(name, configurations);
+		}
+		configurations.add(element);
+		return true;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorActionBuilder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorActionBuilder.java
new file mode 100644
index 0000000..0277646
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorActionBuilder.java
@@ -0,0 +1,789 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IKeyBindingService;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.wst.sse.ui.internal.extension.ActionDescriptor;
+import org.eclipse.wst.sse.ui.internal.extension.IExtendedEditorActionProxyForDelayLoading;
+import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+
+
+/**
+ * This class reads the registry for extensions that plug into 'editorActions'
+ * extension point.
+ */
+
+public class ExtendedEditorActionBuilder extends RegistryReader {
+
+	public class ExtendedContributor implements IExtendedContributor, IMenuListener {
+		private IExtendedSimpleEditor activeExtendedEditor = null;
+
+		private List cache;
+		private Map map = new HashMap();
+		private IMenuManager menuBar = null;
+
+		private Set menus = new HashSet();
+
+		public ExtendedContributor(List cache) {
+			this.cache = cache;
+		}
+
+		private IExtendedSimpleEditor computeExtendedEditor(final IEditorPart editor) {
+			IExtendedSimpleEditor simpleEditor = null;
+			if (editor instanceof IExtendedSimpleEditor) {
+				simpleEditor = (IExtendedSimpleEditor) editor;
+			}
+			if (editor != null && simpleEditor == null) {
+				final ISourceEditingTextTools tools = (ISourceEditingTextTools) editor.getAdapter(ISourceEditingTextTools.class);
+				if (tools != null) {
+					simpleEditor = new IExtendedSimpleEditor() {
+						public int getCaretPosition() {
+							return tools.getCaretOffset();
+						}
+
+						public IDocument getDocument() {
+							return tools.getDocument();
+						}
+
+						public IEditorPart getEditorPart() {
+							return tools.getEditorPart();
+						}
+
+						public Point getSelectionRange() {
+							ITextSelection selection = tools.getSelection();
+							return new Point(selection.getOffset(), selection.getOffset() + selection.getLength());
+						}
+
+					};
+				}
+			}
+			return simpleEditor;
+		}
+
+		public void contributeToMenu(IMenuManager menu) {
+			menuBar = menu;
+			long time0 = System.currentTimeMillis();
+			for (int i = 0; i < cache.size(); i++) {
+				Object obj = cache.get(i);
+				if (obj instanceof IConfigurationElement) {
+					IConfigurationElement menuElement = (IConfigurationElement) obj;
+					if ((menuElement.getName()).equals(TAG_MENU)) {
+						contributeMenu(menuElement, menu, true);
+						if (debugMenu)
+							System.out.println(getClass().getName() + "#contributeToMenu() added: " + menuElement.getAttribute(ATT_ID)); //$NON-NLS-1$
+					}
+				}
+				else if (obj instanceof ActionDescriptor) {
+					try {
+						ActionDescriptor ad = (ActionDescriptor) obj;
+						IMenuManager mm = contributeMenuAction(ad, menu, true, false);
+						if (mm != null) {
+							map.put(ad.getContributionItem(), mm);
+							mm.addMenuListener(this);
+							menus.add(mm);
+							if (debugMenu)
+								System.out.println(getClass().getName() + "#contributeToMenu() added: " + ad.getId()); //$NON-NLS-1$
+						}
+					}
+					catch (Exception e) {
+						Logger.logException("contributing to menu", e); //$NON-NLS-1$
+					}
+				}
+			}
+			if (debugContributeTime)
+				System.out.println(getClass().getName() + "#contributeToMenu(): ran in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+
+		public void contributeToPopupMenu(IMenuManager menu) {
+			long time0 = System.currentTimeMillis();
+			for (int i = 0; i < cache.size(); i++) {
+				Object obj = cache.get(i);
+				if (obj instanceof IConfigurationElement) {
+					IConfigurationElement menuElement = (IConfigurationElement) obj;
+					if ((menuElement.getName()).equals(TAG_POPUPMENU)) {
+						contributeMenu(menuElement, menu, true);
+					}
+				}
+				else if (obj instanceof ActionDescriptor) {
+					try {
+						ActionDescriptor ad = (ActionDescriptor) obj;
+						IAction a = ad.getAction();
+						if (a instanceof IExtendedEditorAction) {
+							// uncaught exceptions could cause the menu to not
+							// be shown
+							try {
+								if (((ad.getPopupMenuPath() != null) || (ad.getPopupMenuGroup() != null)) && (a instanceof IExtendedEditorActionProxyForDelayLoading)) {
+								    ((IExtendedEditorActionProxyForDelayLoading)a).realize();
+								}
+
+								IExtendedEditorAction eea = (IExtendedEditorAction) a;
+								eea.setActiveExtendedEditor(activeExtendedEditor);
+								eea.update();
+								if (eea.isVisible()) {
+									IMenuManager parent = contributeMenuAction(ad, menu, true, true);
+									if (debugPopup && parent != null)
+										System.out.println(getClass().getName() + "#contributeToPopupMenu() added: " + ad.getId()); //$NON-NLS-1$
+								}
+							}
+							catch (Exception e) {
+								Logger.logException(e);
+							}
+
+						}
+						else {
+							IMenuManager parent = contributeMenuAction(ad, menu, true, true);
+							if (debugPopup && parent != null)
+								System.out.println(getClass().getName() + "#contributeToPopupMenu() added: " + ad.getId()); //$NON-NLS-1$
+						}
+					}
+					catch (Exception e) {
+						Logger.logException("contributing to popup", e); //$NON-NLS-1$
+					}
+				}
+			}
+			if (debugContributeTime)
+				System.out.println(getClass().getName() + "#contributeToPopupMenu(): ran in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+
+		public void contributeToStatusLine(IStatusLineManager manager) {
+			// nothing from here
+		}
+
+		public void contributeToToolBar(IToolBarManager manager) {
+			long time0 = System.currentTimeMillis();
+			for (int i = 0; i < cache.size(); i++) {
+				Object obj = cache.get(i);
+				if (obj instanceof ActionDescriptor) {
+					try {
+						ActionDescriptor ad = (ActionDescriptor) obj;
+						IAction a = ad.getAction();
+						if (a instanceof IExtendedEditorAction) {
+							if (((ad.getToolbarPath() != null) || (ad.getToolbarGroup() != null)) && (a instanceof IExtendedEditorActionProxyForDelayLoading)) {
+							    ((IExtendedEditorActionProxyForDelayLoading)a).realize();
+							}
+							IExtendedEditorAction eea = (IExtendedEditorAction) a;
+							eea.setActiveExtendedEditor(activeExtendedEditor);
+							eea.update();
+							if (eea.isVisible()) {
+								boolean contributed = contributeToolbarAction(ad, manager, true);
+								if (debugToolbar && contributed)
+									System.out.println(getClass().getName() + "#contributeToToolBar() added: " + ad.getId()); //$NON-NLS-1$
+							}
+							else {
+								if (debugToolbar)
+									System.out.println(getClass().getName() + "#contributeToToolBar(): [skipped] " + ad.getId()); //$NON-NLS-1$
+							}
+						}
+						else {
+							boolean contributed = contributeToolbarAction(ad, manager, true);
+							if (debugToolbar && contributed)
+								System.out.println(getClass().getName() + "#contributeToToolBar() added: " + ad.getId()); //$NON-NLS-1$
+						}
+					}
+					catch (Exception e) {
+						Logger.logException("contributing to toolbar", e); //$NON-NLS-1$
+					}
+				}
+			}
+			if (debugContributeTime)
+				System.out.println(getClass().getName() + "#contributeToToolBar(): ran in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+
+		public void dispose() {
+			Iterator it = menus.iterator();
+			while (it.hasNext()) {
+				Object o = it.next();
+				if (o instanceof IMenuManager) {
+					((IMenuManager) o).removeMenuListener(this);
+				}
+			}
+		}
+
+		public void init(IActionBars bars, IWorkbenchPage page) {
+			// nothing from here
+		}
+
+		public void menuAboutToShow(IMenuManager menu) {
+			// slows down the menu and interferes with it for other editors;
+			// optimize on visibility
+			IEditorSite site = null;
+			boolean activeEditorIsVisible = false;
+
+			if (activeExtendedEditor != null && activeExtendedEditor.getEditorPart() != null)
+				site = activeExtendedEditor.getEditorPart().getEditorSite();
+			if (site == null)
+				return;
+
+			// Eclipse bug 48784 - [MPE] ClassCast exception Workbench page
+			// isPartVisiable for MultiPageSite
+			if (site instanceof MultiPageEditorSite) {
+				Object multiPageEditor = ((MultiPageEditorSite) site).getMultiPageEditor();
+				activeEditorIsVisible = multiPageEditor.equals(site.getPage().getActiveEditor()) || multiPageEditor.equals(site.getPage().getActivePart());
+			}
+			else {
+				activeEditorIsVisible = site.getWorkbenchWindow().getPartService().getActivePart().equals(activeExtendedEditor.getEditorPart());
+			}
+			// due to a delay class loading, don't return now
+//			if (!activeEditorIsVisible)
+//				return;
+
+			IContributionItem[] items = menu.getItems();
+			if (items == null || items.length == 0)
+				return;
+
+			for (int i = 0; i < items.length; ++i) {
+				// add menu listener to submenu
+				if (items[i] instanceof IMenuManager) {
+					((IMenuManager) items[i]).addMenuListener(this);
+					menus.add(items[i]);
+				}
+			}
+
+			Set keys = map.keySet();
+			Iterator it = keys.iterator();
+			boolean needActionContributionItemUpdate = false;
+			while (it.hasNext()) {
+				IContributionItem item = (IContributionItem) it.next();
+				IMenuManager mm = (IMenuManager) map.get(item);
+				if (menu.getId() != null && menu.getId().equals(mm.getId()) && item instanceof ActionContributionItem) {
+					try {
+						IAction action = ((ActionContributionItem) item).getAction();
+
+						if (action instanceof IExtendedEditorActionProxyForDelayLoading) {
+						    IExtendedEditorActionProxyForDelayLoading eea = (IExtendedEditorActionProxyForDelayLoading)action;
+						    if (eea.isBundleActive() == true && eea.isRealized() == false) {
+						        eea.realize();
+						        needActionContributionItemUpdate = true;
+						    }
+						}
+
+						if (activeEditorIsVisible || needActionContributionItemUpdate) {
+							if (action instanceof IUpdate) {
+								((IUpdate) action).update();
+							}
+						}
+
+						if (activeEditorIsVisible || needActionContributionItemUpdate) {
+							boolean visible = true;
+							if (action instanceof IExtendedEditorAction) {
+								visible = ((IExtendedEditorAction) action).isVisible();
+							}
+							item.setVisible(visible);
+						}
+
+						if (needActionContributionItemUpdate) {
+						    ((ActionContributionItem)item).update();
+						}
+
+					}
+					catch (Exception e) {
+						Logger.logException("updating actions", e); //$NON-NLS-1$
+					}
+				}
+			}
+			if (activeEditorIsVisible || needActionContributionItemUpdate) {
+			    if (needActionContributionItemUpdate) {
+			        // the action is realized so that need to update the menu w/
+			        // force set to true
+			        menu.update(true);
+			    } else {
+			        menu.update(false);
+			    }
+			}
+		}
+
+		public void setActiveEditor(IEditorPart editor) {
+			activeExtendedEditor = computeExtendedEditor(editor);
+			IKeyBindingService svc = (editor != null) ? editor.getEditorSite().getKeyBindingService() : null;
+			for (int i = 0; i < cache.size(); i++) {
+				Object obj = cache.get(i);
+				if (obj instanceof ActionDescriptor) {
+					ActionDescriptor ad = (ActionDescriptor) obj;
+					try {
+						IAction action = ad.getAction();
+						if (action instanceof IExtendedEditorAction) {
+							((IExtendedEditorAction) action).setActiveExtendedEditor(activeExtendedEditor);
+							((IExtendedEditorAction) action).update();
+							// update visibility right now so that the menu
+							// will show/hide properly
+							if (!((IExtendedEditorAction) action).isVisible() && ad.getContributionItem() != null)
+								ad.getContributionItem().setVisible(false);
+							if (svc != null && action.getActionDefinitionId() != null) {
+								svc.registerAction(action);
+							}
+						}
+					}
+					catch (Exception e) {
+						Logger.logException("setting active editor on actions", e); //$NON-NLS-1$
+					}
+				}
+			}
+
+			if (menuBar != null && editor != null) {
+				// Class clz = editor.getClass();
+				// while (clz != null) {
+				// if (clz.getName().equals(targetID)) {
+				// contributeToMenu(menuBar);
+				// break;
+				// }
+				// clz = clz.getSuperclass();
+				// }
+				if (targetIDs.contains(editor.getEditorSite().getId())) {
+					contributeToMenu(menuBar);
+				}
+			}
+
+			updateToolbarActions();
+		}
+
+		public void updateToolbarActions() {
+			for (int i = 0; i < cache.size(); i++) {
+				Object obj = cache.get(i);
+				if (obj instanceof ActionDescriptor) {
+					try {
+						ActionDescriptor ad = (ActionDescriptor) obj;
+						if (ad.getToolbarPath() != null) {
+							IAction action = ad.getAction();
+							if (action instanceof IUpdate) {
+								((IUpdate) action).update();
+							}
+						}
+					}
+					catch (Exception e) {
+						Logger.logException("updating toolbar actions", e); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+	}
+
+	public static final String ATT_ID = "id"; //$NON-NLS-1$
+	public static final String ATT_LABEL = "label"; //$NON-NLS-1$
+	public static final String ATT_NAME = "name"; //$NON-NLS-1$
+	public static final String ATT_PATH = "path"; //$NON-NLS-1$
+
+	public static final String ATT_TARGET_ID = "targetID"; //$NON-NLS-1$
+	protected final static boolean debugContributeTime = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/extendededitoractionbuilder/contributetime")); //$NON-NLS-1$  //$NON-NLS-2$
+
+	protected final static boolean debugMenu = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugmenu")); //$NON-NLS-1$  //$NON-NLS-2$;
+	protected final static boolean debugPopup = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugpopup")); //$NON-NLS-1$  //$NON-NLS-2$;
+	protected final static boolean debugReadTime = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/extendededitoractionbuilder/readtime")); //$NON-NLS-1$  //$NON-NLS-2$
+	protected final static boolean debugToolbar = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugtoolbar")); //$NON-NLS-1$  //$NON-NLS-2$;
+
+	private static final String EXTENDED_EDITOR = "extendedEditor"; //$NON-NLS-1$
+
+	public static final String PL_EXTENDED_EDITOR_ACTIONS = "extendedEditorActions"; //$NON-NLS-1$
+
+	public static final String PLUGIN_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+	public static final String TAG_ACTION = "action"; //$NON-NLS-1$
+
+	public static final String TAG_CONTRIBUTION_TYPE = "editorContribution"; //$NON-NLS-1$
+
+	public static final String TAG_MENU = "menu"; //$NON-NLS-1$
+	public static final String TAG_POPUPMENU = "popupmenu"; //$NON-NLS-1$
+	public static final String TAG_RULERMENU = "rulermenu"; //$NON-NLS-1$
+	public static final String TAG_SEPARATOR = "separator"; //$NON-NLS-1$
+
+	protected List readingCache;
+
+	protected String targetContributionTag;
+	protected List targetIDs;
+
+	/**
+	 * The constructor.
+	 */
+	public ExtendedEditorActionBuilder() {
+		super();
+	}
+
+	/**
+	 * Creates a menu from the information in the menu configuration element
+	 * and adds it into the provided menu manager. If 'appendIfMissing' is
+	 * true, and menu path slot is not found, it will be created and menu will
+	 * be added into it. Otherwise, add operation will fail.
+	 */
+	protected void contributeMenu(IConfigurationElement menuElement, IMenuManager mng, boolean appendIfMissing) {
+		// Get config data.
+		String id = menuElement.getAttribute(ATT_ID);
+		String label = menuElement.getAttribute(ATT_LABEL);
+		String path = menuElement.getAttribute(ATT_PATH);
+		if (label == null) {
+			Logger.log(Logger.ERROR, "Invalid Menu Extension (label == null): " + id); //$NON-NLS-1$
+			return;
+		}
+
+		// Calculate menu path and group.
+		String group = null;
+		if (path != null) {
+			int loc = path.lastIndexOf('/');
+			if (loc != -1) {
+				group = path.substring(loc + 1);
+				path = path.substring(0, loc);
+			}
+			else {
+				// assume that path represents a slot
+				// so actual path portion should be null
+				group = path;
+				path = null;
+			}
+		}
+
+		// Find parent menu.
+		IMenuManager parent = mng;
+		if (path != null) {
+			parent = mng.findMenuUsingPath(path);
+			if (parent == null) {
+				// Logger.log("Invalid Menu Extension (Path is invalid): " +
+				// id);//$NON-NLS-1$
+				return;
+			}
+			// IMenuManager.findMenuUsingPath() returns invisible menu item if
+			// the manager can't find
+			// the specified path and create new MenuManager for it.
+			// I don't know this is a specification or bug.
+			// Anyway, to ensure the menu can be visible, setVisible(true)
+			// needs to be called.
+			parent.setVisible(true);
+		}
+
+		// Find reference group.
+		if (group == null)
+			group = IWorkbenchActionConstants.MB_ADDITIONS;
+		IContributionItem sep = parent.find(group);
+		if (sep == null) {
+			if (appendIfMissing)
+				parent.add(new Separator(group));
+			else {
+				Logger.log(Logger.ERROR, "Invalid Menu Extension (Group is invalid): " + id); //$NON-NLS-1$
+				return;
+			}
+		}
+
+		// If the menu does not exist create it.
+		IMenuManager newMenu = parent.findMenuUsingPath(id);
+		if (newMenu == null)
+			newMenu = new MenuManager(label, id);
+
+		// Create separators.
+		IConfigurationElement[] children = menuElement.getChildren(TAG_SEPARATOR);
+		for (int i = 0; i < children.length; i++) {
+			contributeSeparator(newMenu, children[i]);
+		}
+
+		// Add new menu
+		try {
+			parent.insertAfter(group, newMenu);
+		}
+		catch (IllegalArgumentException e) {
+			Logger.log(Logger.ERROR, "Invalid Menu Extension (Group is missing): " + id); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Contributes action from action descriptor into the provided menu
+	 * manager.
+	 */
+	protected IMenuManager contributeMenuAction(ActionDescriptor ad, IMenuManager menu, boolean appendIfMissing, boolean popupmenu) {
+		if (ad.getContributionItem() == null || ad.getAction() == null)
+			return null;
+
+		// Get config data.
+		String mpath = popupmenu ? ad.getPopupMenuPath() : ad.getMenuPath();
+		String mgroup = popupmenu ? ad.getPopupMenuGroup() : ad.getMenuGroup();
+		if (mpath == null && mgroup == null)
+			return null;
+
+		// Find parent menu.
+		IMenuManager parent = menu;
+		if (mpath != null) {
+			parent = parent.findMenuUsingPath(mpath);
+			if (parent == null) {
+				// Logger.log("Invalid Menu Extension (Path is invalid): " +
+				// ad.getId()); //$NON-NLS-1$
+				return null;
+			}
+			// IMenuManager.findMenuUsingPath() returns invisible menu item if
+			// the manager can't find
+			// the specified path and create new MenuManager for it.
+			// I don't know this is a specification or bug.
+			// Anyway, to ensure the menu can be visible, setVisible(true)
+			// needs to be called.
+			parent.setVisible(true);
+		}
+
+		// First remove existing menu item
+		IContributionItem item = parent.find(ad.getId());
+		if (item != null) {
+			parent.remove(ad.getId());
+		}
+
+		// Find reference group.
+		if (mgroup == null)
+			mgroup = IWorkbenchActionConstants.MB_ADDITIONS;
+		IContributionItem sep = parent.find(mgroup);
+		if (sep == null) {
+			if (appendIfMissing)
+				parent.add(sep = new Separator(mgroup));
+			else {
+				Logger.log(Logger.ERROR, "Invalid Menu Extension (Group is invalid): " + ad.getId()); //$NON-NLS-1$
+				return null;
+			}
+		}
+
+		// Add action.
+		try {
+			if (popupmenu) {
+				// Context menu need a newly created contribution item
+				if (sep != null && sep.isGroupMarker())
+					parent.appendToGroup(sep.getId(), ad.getAction());
+				else
+					parent.insertAfter(mgroup, ad.getAction());
+			}
+			else {
+				// Normal menu need to add existing contribution item to
+				// remove it from menu listener
+				if (sep != null && sep.isGroupMarker())
+					parent.appendToGroup(sep.getId(), ad.getContributionItem());
+				else
+					parent.insertAfter(mgroup, ad.getContributionItem());
+			}
+		}
+		catch (IllegalArgumentException e) {
+			Logger.log(Logger.ERROR, "Invalid Menu Extension (Group is missing): " + ad.getId()); //$NON-NLS-1$
+			parent = null;
+		}
+
+		return parent;
+	}
+
+	/**
+	 * Creates a named menu separator from the information in the
+	 * configuration element. If the separator already exists do not create a
+	 * second.
+	 */
+	protected boolean contributeSeparator(IMenuManager menu, IConfigurationElement element) {
+		String id = element.getAttribute(ATT_NAME);
+		if (id == null || id.length() <= 0)
+			return false;
+		IContributionItem sep = menu.find(id);
+		if (sep != null)
+			return false;
+		menu.add(new Separator(id));
+		return true;
+	}
+
+	/**
+	 * Contributes action from the action descriptor into the provided tool
+	 * bar manager.
+	 */
+	protected boolean contributeToolbarAction(ActionDescriptor ad, IToolBarManager toolbar, boolean appendIfMissing) {
+		if (ad.getContributionItem() == null || ad.getAction() == null)
+			return false;
+
+		// Get config data.
+		String tpath = ad.getToolbarPath();
+		String tgroup = ad.getToolbarGroup();
+		if (tpath == null && tgroup == null)
+			return false;
+
+		// First remove existing toolbar item
+		IContributionItem item = toolbar.find(ad.getId());
+		if (item != null) {
+			toolbar.remove(ad.getId());
+		}
+
+		// Find reference group.
+		if (tgroup == null)
+			tgroup = IWorkbenchActionConstants.MB_ADDITIONS;
+		IContributionItem sep = toolbar.find(tgroup);
+		if (sep == null) {
+			if (appendIfMissing)
+				toolbar.add(new Separator(tgroup));
+			else {
+				Logger.log(Logger.ERROR, "Invalid Toolbar Extension (Group is invalid): " + ad.getId()); //$NON-NLS-1$
+				return false;
+			}
+		}
+
+		// Add action to tool bar.
+		try {
+			if (sep != null && sep.isGroupMarker())
+				toolbar.appendToGroup(sep.getId(), ad.getAction());
+			else
+				toolbar.insertAfter(tgroup, ad.getAction());
+		}
+		catch (IllegalArgumentException e) {
+			Logger.log(Logger.ERROR, "Invalid Toolbar Extension (Group is missing): " + ad.getId()); //$NON-NLS-1$
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * This factory method returns a new ActionDescriptor for the
+	 * configuration element. It should be implemented by subclasses.
+	 */
+	protected ActionDescriptor createActionDescriptor(IConfigurationElement element) {
+		ActionDescriptor ad = null;
+		try {
+			ad = new ActionDescriptor(element);
+			// these cases like "class not found" are handled
+			// at lower level, so no action if formed. In that
+			// case, we also don't want to form an action descriptor.
+			if ((ad != null) && (ad.getAction() == null)) {
+				ad = null;
+			}
+		}
+		catch (Exception e) {
+			Logger.traceException(EXTENDED_EDITOR, e);
+			ad = null;
+		}
+		return ad;
+	}
+
+	/**
+	 * Returns the name of the part ID attribute that is expected in the
+	 * target extension.
+	 */
+	protected String getTargetID(IConfigurationElement element) {
+		String value = element.getAttribute(ATT_TARGET_ID);
+		return value != null ? value : "???"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Reads editor contributor if specified directly in the 'editor'
+	 * extension point, and all external contributions for this editor's ID
+	 * registered in 'editorActions' extension point.
+	 */
+	public IExtendedContributor readActionExtensions(String editorId) {
+		return readActionExtensions(new String[]{editorId});
+	}
+
+	/**
+	 * Reads editor contributor if specified directly in the 'editor'
+	 * extension point, and all external contributions for this editor's ID
+	 * registered in 'editorActions' extension point.
+	 */
+	public IExtendedContributor readActionExtensions(String[] ids) {
+		long time0 = System.currentTimeMillis();
+		ExtendedContributor ext = null;
+		readContributions(ids, TAG_CONTRIBUTION_TYPE, PL_EXTENDED_EDITOR_ACTIONS);
+		if (debugReadTime) {
+			String idlist = ""; //$NON-NLS-1$
+			if (ids.length > 0) {
+				for (int i = 0; i < ids.length; i++) {
+					idlist += ids[i];
+					if (i < ids.length - 1)
+						idlist += ","; //$NON-NLS-1$
+				}
+			}
+			System.out.println(getClass().getName() + "#readActionExtensions(" + idlist + "): read in " + (System.currentTimeMillis() - time0) + "ms [" + (readingCache != null ? readingCache.size() : 0) + " contributions]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		}
+		if (readingCache != null) {
+			ext = new ExtendedContributor(readingCache);
+			readingCache = null;
+		}
+		return ext;
+	}
+
+	/**
+	 * Reads the contributions from the registry for the provided workbench
+	 * part and the provided extension point IDs.
+	 */
+	protected void readContributions(String[] ids, String tag, String extensionPoint) {
+		readingCache = null;
+		targetIDs = Arrays.asList(ids);
+		targetContributionTag = tag;
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		readRegistry(registry, PLUGIN_ID, extensionPoint);
+	}
+
+	/**
+	 * Implements abstract method to handle the provided XML element in the
+	 * registry.
+	 */
+	protected boolean readElement(IConfigurationElement element) {
+		String tag = element.getName();
+		if (tag.equals(targetContributionTag)) {
+			String id = getTargetID(element);
+			if (id == null || !targetIDs.contains(id)) {
+				// This is not of interest to us - don't go deeper
+				return true;
+			}
+		}
+		else if (tag.equals(TAG_MENU)) {
+			if (readingCache == null)
+				readingCache = new ArrayList();
+			readingCache.add(element);
+			return true; // just cache the element - don't go into it
+		}
+		else if (tag.equals(TAG_POPUPMENU)) {
+			if (readingCache == null)
+				readingCache = new ArrayList();
+			readingCache.add(element);
+			return true; // just cache the element - don't go into it
+		}
+		else if (tag.equals(TAG_RULERMENU)) {
+			if (readingCache == null)
+				readingCache = new ArrayList();
+			readingCache.add(element);
+			return true; // just cache the element - don't go into it
+		}
+		else if (tag.equals(TAG_ACTION)) {
+			if (readingCache == null)
+				readingCache = new ArrayList();
+			ActionDescriptor ad = createActionDescriptor(element);
+			if (ad != null)
+				readingCache.add(ad);
+			return true; // just cache the action - don't go into
+		}
+		else {
+			return false;
+		}
+
+		readElementChildren(element);
+		return true;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorDropTargetAdapter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorDropTargetAdapter.java
new file mode 100644
index 0000000..bf0b04e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorDropTargetAdapter.java
@@ -0,0 +1,213 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.TransferBuilder.TransferProxyForDelayLoading;
+
+/**
+ * ExtendedEditorDropTargetAdapter
+ */
+public class ExtendedEditorDropTargetAdapter extends DropTargetAdapter {
+	private String[] editorIds;
+	private Point originalRange = null;
+	private IEditorPart targetEditor = null;
+	private ITextViewer textViewer = null;
+
+	private Transfer[] transfers = null;
+
+	private boolean useProxy;
+
+	/**
+	 * @deprecated use ExtendedEditorDropTargetAdapter(boolean useProxy) for
+	 *             the performance
+	 */
+	public ExtendedEditorDropTargetAdapter() {
+		this(false);
+	}
+
+	public ExtendedEditorDropTargetAdapter(boolean useProxy) {
+		super();
+		this.useProxy = useProxy;
+	}
+
+	protected boolean doDrop(Transfer transfer, DropTargetEvent event) {
+		TransferBuilder tb = new TransferBuilder(useProxy);
+
+		IDropAction[] as = null;
+		if (editorIds != null && editorIds.length > 0)
+			as = tb.getDropActions(editorIds, transfer);
+		else
+			as = tb.getDropActions(getTargetEditor().getClass().getName(), transfer);
+
+		for (int i = 0; i < as.length; ++i) {
+			IDropAction da = as[i];
+			Transfer actualTransfer;
+			if (transfer instanceof TransferProxyForDelayLoading) {
+				actualTransfer = ((TransferProxyForDelayLoading) transfer).getTransferClass();
+			}
+			else {
+				actualTransfer = transfer;
+			}
+			if (actualTransfer instanceof FileTransfer) {
+				if (event.data == null) {
+					Logger.log(Logger.ERROR, "No data in DropTargetEvent from " + event.widget); //$NON-NLS-1$
+					return false;
+				}
+				String[] strs = (String[]) event.data;
+				boolean[] bs = new boolean[strs.length];
+				int c = 0;
+				for (int j = 0; j < strs.length; ++j) {
+					bs[j] = false;
+					if (da.isSupportedData(strs[j])) {
+						event.data = new String[]{strs[j]};
+						if (!da.run(event, targetEditor)) {
+							bs[j] = true;
+							c++;
+						}
+					}
+					else {
+						bs[j] = true;
+						c++;
+					}
+				}
+				if (c == 0) {
+					return true;
+				}
+
+				int k = 0;
+				String[] rests = new String[c];
+				for (int j = 0; j < strs.length; ++j) {
+					if (bs[j])
+						rests[k++] = strs[j];
+				}
+				event.data = rests;
+			}
+			else if (da.isSupportedData(event.data)) {
+				if (da.run(event, targetEditor)) {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 */
+	public void dragEnter(DropTargetEvent event) {
+		TransferData data = null;
+		Transfer[] ts = getTransfers();
+		for (int i = 0; i < ts.length; i++) {
+			for (int j = 0; j < event.dataTypes.length; j++) {
+				if (ts[i].isSupportedType(event.dataTypes[j])) {
+					data = event.dataTypes[j];
+					break;
+				}
+			}
+			if (data != null) {
+				event.currentDataType = data;
+				break;
+			}
+		}
+
+		if (textViewer != null) {
+			originalRange = textViewer.getSelectedRange();
+		}
+	}
+
+	public void dragLeave(DropTargetEvent event) {
+		if (textViewer != null) {
+			textViewer.setSelectedRange(originalRange.x, originalRange.y);
+		}
+		else {
+			originalRange = null;
+		}
+	}
+
+	/**
+	 * Scroll the visible area as needed
+	 */
+	public void dragOver(DropTargetEvent event) {
+		event.operations &= ~DND.DROP_MOVE;
+		event.detail = DND.DROP_COPY;
+		event.feedback |= DND.FEEDBACK_SCROLL;
+	}
+
+	/**
+	 */
+	public void drop(DropTargetEvent event) {
+		if (event.operations == DND.DROP_NONE)
+			return;
+
+		Transfer[] ts = getTransfers();
+		for (int i = 0; i < ts.length; i++) {
+			if (ts[i].isSupportedType(event.currentDataType)) {
+				if (doDrop(ts[i], event)) {
+					IEditorPart part = targetEditor;
+					if (targetEditor instanceof StructuredTextEditor){
+						part = ((StructuredTextEditor) targetEditor).getEditorPart();
+					}
+					targetEditor.getSite().getPage().activate(part);
+					break;
+				}
+			}
+		}
+	}
+
+	public IEditorPart getTargetEditor() {
+		return targetEditor;
+	}
+
+	public ITextViewer getTextViewer() {
+		return textViewer;
+	}
+
+	/**
+	 * @return org.eclipse.swt.dnd.Transfer[]
+	 */
+	public Transfer[] getTransfers() {
+		if (transfers == null) {
+			TransferBuilder tb = new TransferBuilder(useProxy);
+			if (editorIds == null || editorIds.length == 0)
+				transfers = tb.getDropTargetTransfers(getTargetEditor().getClass().getName());
+			else
+				transfers = tb.getDropTargetTransfers(editorIds);
+		}
+		return transfers;
+	}
+
+	/**
+	 */
+	public void setTargetEditor(IEditorPart targetEditor) {
+		this.targetEditor = targetEditor;
+	}
+
+	public void setTargetIDs(String[] ids) {
+		editorIds = ids;
+	}
+
+	public void setTextViewer(ITextViewer textViewer) {
+		this.textViewer = textViewer;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/FileDropAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/FileDropAction.java
new file mode 100644
index 0000000..a68de9e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/FileDropAction.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * Action for file drop
+ */
+public class FileDropAction extends AbstractDropAction {
+	public boolean run(DropTargetEvent event, IEditorPart targetEditor) {
+		String[] strs = (String[]) event.data;
+		if (strs == null || strs.length == 0) {
+			return false;
+		}
+
+		String str = ""; //$NON-NLS-1$
+		for (int i = 0; i < strs.length; ++i) {
+			IPath path = new Path(strs[i]);
+			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+			IFile file = root.getFileForLocation(path);
+			if (file != null) {
+				path = file.getProjectRelativePath();
+			}
+
+			str += "\"" + path.toString() + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+		}
+
+		return insert(str, targetEditor);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/FormatProcessorsExtensionReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/FormatProcessorsExtensionReader.java
new file mode 100644
index 0000000..a8f10ab
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/FormatProcessorsExtensionReader.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
+import org.osgi.framework.Bundle;
+
+public class FormatProcessorsExtensionReader extends RegistryReader {
+	private static FormatProcessorsExtensionReader instance;
+
+	public synchronized static FormatProcessorsExtensionReader getInstance() {
+		if (instance == null) {
+			instance = new FormatProcessorsExtensionReader();
+
+			IExtensionRegistry registry = Platform.getExtensionRegistry();
+			instance.readRegistry(registry, "org.eclipse.wst.sse.core", "formatProcessors"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return instance;
+	}
+
+	private Map map = new HashMap();
+//	 TODO: private field never read locally
+	String processorClassName;
+
+	public IStructuredFormatProcessor getFormatProcessor(String contentTypeId) {
+		if (contentTypeId == null)
+			return null;
+
+		IStructuredFormatProcessor formatProcessor = null;
+		if (map.containsKey(contentTypeId)) {
+			formatProcessor = (IStructuredFormatProcessor) map.get(contentTypeId);
+		} else {
+			IContentTypeManager manager = Platform.getContentTypeManager();
+			IContentType queryContentType = manager.getContentType(contentTypeId);
+			boolean found = false;
+			for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
+				String elementContentTypeId = (String) iter.next();
+				IContentType elementContentType = manager.getContentType(elementContentTypeId);
+				if (queryContentType.isKindOf(elementContentType)) {
+					formatProcessor = (IStructuredFormatProcessor) map.get(elementContentTypeId);
+					map.put(contentTypeId, formatProcessor);
+					found = true;
+					break;
+				}
+			}
+
+			if (!found)
+				map.put(contentTypeId, null);
+		}
+
+		return formatProcessor;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.extension.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
+	 */
+	protected boolean readElement(IConfigurationElement element) {
+		if (element.getName().equals("processor")) { //$NON-NLS-1$
+			String contentTypeId = element.getAttribute("contentTypeId"); //$NON-NLS-1$
+			String processorClassName = element.getAttribute("class"); //$NON-NLS-1$
+			String pluginID = element.getDeclaringExtension().getNamespace();
+			Bundle bundle = Platform.getBundle(pluginID);
+
+			try {
+				IStructuredFormatProcessor processor = (IStructuredFormatProcessor)bundle.loadClass(processorClassName).newInstance();
+				map.put(contentTypeId, processor);
+
+				return true;
+			} catch (InstantiationException e) {
+				e.printStackTrace();
+			} catch (IllegalAccessException e) {
+				e.printStackTrace();
+			} catch (ClassNotFoundException e) {
+				e.printStackTrace();
+			}
+		}
+
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/GotoAnnotationAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/GotoAnnotationAction.java
new file mode 100644
index 0000000..67de28a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/GotoAnnotationAction.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.part.EditorActionBarContributor;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.IEditorStatusLine;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
+import org.eclipse.ui.texteditor.TextEditorAction;
+
+/**
+ * Based on org.eclipse.jdt.internal.ui.javaeditor.GotoAnnotationAction and
+ * the org.eclipse.jdt.internal.ui.JavaEditor's gotoError() method. Rewritten
+ * based on 3.0M7 version to operate generically.
+ * 
+ * @deprecated - use org.eclipse.ui.texteditor.GotoAnnotationAction
+ * 
+ */
+public class GotoAnnotationAction extends TextEditorAction {
+
+	private static final boolean _debug = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/gotoNextAnnotation")); //$NON-NLS-1$  //$NON-NLS-2$
+
+	/**
+	 * Clears the status line on selection changed.
+	 */
+	protected class StatusLineClearer implements ISelectionChangedListener {
+		IStatusLineManager fStatusLineManager = null;
+
+		protected StatusLineClearer(IStatusLineManager mgr) {
+			super();
+			fStatusLineManager = mgr;
+		}
+
+		/*
+		 * @see ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+		 */
+		public void selectionChanged(SelectionChangedEvent event) {
+			getTextEditor().getSelectionProvider().removeSelectionChangedListener(StatusLineClearer.this);
+
+			fStatusLineManager.setErrorMessage(null, null);
+			fStatusLineManager.setMessage(null, null);
+		}
+	}
+
+	private boolean fForward;
+	private String fLabel;
+
+	private String fPrefix;
+
+	/**
+	 * @param prefix
+	 * @param editor
+	 */
+	public GotoAnnotationAction(String prefix, boolean forward) {
+		super(SSEUIMessages.getResourceBundle(), prefix, null);
+		fForward = forward;
+		fPrefix = prefix;
+		fLabel = SSEUIMessages.getResourceBundle().getString(fPrefix);
+	}
+
+	/*
+	 * This is the default label used for description
+	 */
+	public String getDefaultLabel() {
+		return fLabel;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#getDescription()
+	 */
+	public String getDescription() {
+		return getDefaultLabel();
+	}
+
+	/**
+	 * Returns the annotation closest to the given range respecting the given
+	 * direction. If an annotation is found, the annotations current position
+	 * is copied into the provided annotation position.
+	 * 
+	 * @param offset
+	 *            the region offset
+	 * @param length
+	 *            the region length
+	 * @param forward
+	 *            <code>true</code> for forwards, <code>false</code> for
+	 *            backward
+	 * @param annotationPosition
+	 *            the position of the found annotation
+	 * @return the found annotation
+	 */
+	protected Annotation getNextAnnotation(final int offset, final int length, boolean forward, Position annotationPosition) {
+		Annotation nextAnnotation = null;
+		Position nextAnnotationPosition = null;
+		Annotation containingAnnotation = null;
+		Position containingAnnotationPosition = null;
+		boolean currentAnnotation = false;
+
+		IDocument document = getTextEditor().getDocumentProvider().getDocument(getTextEditor().getEditorInput());
+		int endOfDocument = document.getLength();
+		int distance = Integer.MAX_VALUE;
+
+		IAnnotationModel model = getTextEditor().getDocumentProvider().getAnnotationModel(getTextEditor().getEditorInput());
+		// external files may not have an annotation model
+		if (model != null) {
+			Iterator e = model.getAnnotationIterator();
+			while (e.hasNext()) {
+				Annotation a = (Annotation) e.next();
+				if (!isNavigationTarget(a))
+					continue;
+
+				Position p = model.getPosition(a);
+				if (p == null)
+					continue;
+
+				if (forward && p.offset == offset || !forward && p.offset + p.getLength() == offset + length) {
+					if (containingAnnotation == null || (forward && p.length >= containingAnnotationPosition.length || !forward && p.length >= containingAnnotationPosition.length)) {
+						containingAnnotation = a;
+						containingAnnotationPosition = p;
+						currentAnnotation = p.length == length;
+					}
+				}
+				else {
+					int currentDistance = 0;
+
+					if (forward) {
+						currentDistance = p.getOffset() - offset;
+						if (currentDistance < 0) {
+							currentDistance = endOfDocument + currentDistance;
+						}
+
+						if (currentDistance < distance || currentDistance == distance && p.length < nextAnnotationPosition.length) {
+							distance = currentDistance;
+							nextAnnotation = a;
+							nextAnnotationPosition = p;
+						}
+					}
+					else {
+						currentDistance = offset + length - (p.getOffset() + p.length);
+						if (currentDistance < 0)
+							currentDistance = endOfDocument + currentDistance;
+
+						if (currentDistance < distance || currentDistance == distance && p.length < nextAnnotationPosition.length) {
+							distance = currentDistance;
+							nextAnnotation = a;
+							nextAnnotationPosition = p;
+						}
+					}
+				}
+			}
+		}
+		if (containingAnnotationPosition != null && (!currentAnnotation || nextAnnotation == null)) {
+			annotationPosition.setOffset(containingAnnotationPosition.getOffset());
+			annotationPosition.setLength(containingAnnotationPosition.getLength());
+			return containingAnnotation;
+		}
+		if (nextAnnotationPosition != null) {
+			annotationPosition.setOffset(nextAnnotationPosition.getOffset());
+			annotationPosition.setLength(nextAnnotationPosition.getLength());
+		}
+
+		return nextAnnotation;
+	}
+
+	private IStatusLineManager getStatusLineManager() {
+		// The original JavaEditor M7 implementation made use of an adapter,
+		// but that approach
+		// fails with a MultiPageEditorSite
+		
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (window == null)
+			return null;
+		IWorkbenchPage page = window.getActivePage();
+		if (page == null)
+			return null;
+		IEditorPart editor = page.getActiveEditor();
+		if (editor == null)
+			return null;
+		IEditorActionBarContributor contributor = editor.getEditorSite().getActionBarContributor();
+		if (contributor instanceof EditorActionBarContributor) {
+			return ((EditorActionBarContributor) contributor).getActionBars().getStatusLineManager();
+		}
+		return null;
+	}
+
+	public String getText() {
+		return getDefaultLabel();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#getToolTipText()
+	 */
+	public String getToolTipText() {
+		return getDefaultLabel();
+	}
+
+	/**
+	 * Jumps to the error next according to the given direction based off
+	 * JavaEditor#gotoAnnotation()
+	 * 
+	 * @param forward
+	 *            is the direction
+	 */
+	public void gotoAnnotation(boolean forward) {
+		ITextSelection selection = (ITextSelection) getTextEditor().getSelectionProvider().getSelection();
+		Position position = new Position(0, 0);
+		if (false /* delayed - see bug 18316 */) {
+			getNextAnnotation(selection.getOffset(), selection.getLength(), forward, position);
+			getTextEditor().selectAndReveal(position.getOffset(), position.getLength());
+		}
+		else /* no delay - see bug 18316 */{
+			Annotation annotation = getNextAnnotation(selection.getOffset(), selection.getLength(), forward, position);
+			IEditorStatusLine editorStatusLine = (IEditorStatusLine) getTextEditor().getAdapter(IEditorStatusLine.class);
+			if (editorStatusLine != null) {
+				editorStatusLine.setMessage(true, null, null);
+				editorStatusLine.setMessage(false, null, null);
+			}
+			else {
+				IStatusLineManager mgr = getStatusLineManager();
+				if (mgr != null) {
+					mgr.setErrorMessage(null);
+					mgr.setMessage(null, null);
+				}
+			}
+			if (annotation != null) {
+				updateAnnotationViews(annotation);
+				if (_debug) {
+					System.out.println("select and reveal " + annotation.getType() + "@" + position.getOffset() + ":" + position.getLength()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				getTextEditor().selectAndReveal(position.getOffset(), position.getLength());
+				if (editorStatusLine != null) {
+					editorStatusLine.setMessage(true, null, null);
+					editorStatusLine.setMessage(false, annotation.getText(), null);
+				}
+				else {
+					IStatusLineManager mgr = getStatusLineManager();
+					if (mgr != null) {
+						mgr.setErrorMessage(null);
+						mgr.setMessage(null, annotation.getText());
+					}
+					getTextEditor().getSelectionProvider().addSelectionChangedListener(new StatusLineClearer(mgr));
+				}
+			}
+		}
+	}
+
+	/**
+	 * Returns whether the given annotation is configured as a target for the
+	 * "Go to Next/Previous Annotation" actions
+	 * 
+	 * @param annotation
+	 *            the annotation
+	 * @return <code>true</code> if this is a target, <code>false</code>
+	 *         otherwise
+	 * @see Eclipse 3.0
+	 */
+	protected boolean isNavigationTarget(Annotation annotation) {
+		Preferences preferences = EditorsUI.getPluginPreferences();
+		AnnotationPreference preference = EditorsUI.getAnnotationPreferenceLookup().getAnnotationPreference(annotation);
+		// See bug 41689
+		// String key= forward ? preference.getIsGoToNextNavigationTargetKey()
+		// : preference.getIsGoToPreviousNavigationTargetKey();
+		String key = preference == null ? null : preference.getIsGoToNextNavigationTargetKey();
+		return (key != null && preferences.getBoolean(key));
+	}
+
+	public void run() {
+		gotoAnnotation(fForward);
+	}
+
+	public void setEditor(ITextEditor editor) {
+		super.setEditor(editor);
+		update();
+	}
+
+	/**
+	 * Updates the annotation views that show the given annotation.
+	 * 
+	 * @param annotation
+	 *            the annotation
+	 */
+	protected void updateAnnotationViews(Annotation annotation) {
+		IMarker marker = null;
+		if (annotation instanceof SimpleMarkerAnnotation)
+			marker = ((SimpleMarkerAnnotation) annotation).getMarker();
+
+		if (marker != null) {
+			try {
+				IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+				if (window != null) {
+					IWorkbenchPage page = window.getActivePage();
+					if (page != null) {
+						IViewPart view = null;
+						if (marker.isSubtypeOf(IMarker.PROBLEM)) {
+							view = page.findView(IPageLayout.ID_PROBLEM_VIEW);
+						}
+						else if (marker.isSubtypeOf(IMarker.TASK)) {
+							view = page.findView(IPageLayout.ID_TASK_LIST);
+						}
+						else if (marker.isSubtypeOf(IMarker.BOOKMARK)) {
+							view = page.findView(IPageLayout.ID_BOOKMARKS);
+						}
+//						else if (marker.isSubtypeOf(IBreakpoint.BREAKPOINT_MARKER)) {
+//							view = page.findView(IDebugUIConstants.ID_BREAKPOINT_VIEW);
+//						}
+						
+						if (view == null) {
+							view = page.findView("org.eclipse.ui.views.AllMarkersView");
+						}
+						// If the view isn't open on this perspective, don't
+						// interact with it
+						if (view != null) {
+							Method method = view.getClass().getMethod("setSelection", new Class[]{IStructuredSelection.class, boolean.class}); //$NON-NLS-1$
+							if (method != null) {
+								method.invoke(view, new Object[]{new StructuredSelection(marker), Boolean.TRUE});
+								page.bringToTop(view);
+							}
+						}
+					}
+				}
+			}
+			// ignore exceptions, don't update any of the lists, just set
+			// statusline
+			catch (CoreException x) {
+				//
+			}
+			catch (NoSuchMethodException x) {
+				//
+			}
+			catch (IllegalAccessException x) {
+				//
+			}
+			catch (InvocationTargetException x) {
+				//
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IActionValidator.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IActionValidator.java
new file mode 100644
index 0000000..7995be7
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IActionValidator.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+public interface IActionValidator {
+	boolean isValidAction();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IDropAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IDropAction.java
new file mode 100644
index 0000000..7c751bb
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IDropAction.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ */
+public interface IDropAction {
+
+
+	/**
+	 * @param data
+	 *            DropTargetEvent.data will be passed.
+	 * @return boolean true for supported data type
+	 */
+	public boolean isSupportedData(Object data);
+
+	/**
+	 * @return boolean true for the action is actually processed false for the
+	 *         action is not processed.
+	 */
+	public boolean run(DropTargetEvent event, IEditorPart targetEditor);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedContributor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedContributor.java
new file mode 100644
index 0000000..e178a36
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedContributor.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.ui.IEditorActionBarContributor;
+
+public interface IExtendedContributor extends IEditorActionBarContributor, IPopupMenuContributor {
+	public void contributeToMenu(IMenuManager menu);
+
+	public void contributeToStatusLine(IStatusLineManager manager);
+
+	public void contributeToToolBar(IToolBarManager manager);
+
+	public void updateToolbarActions();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedEditorAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedEditorAction.java
new file mode 100644
index 0000000..1bfe47c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedEditorAction.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.ui.texteditor.IUpdate;
+
+public interface IExtendedEditorAction extends IUpdate {
+
+	/**
+	 * Returns whether this action item is visible
+	 * 
+	 * @return <code>true</code> if this item is visible, and
+	 *         <code>false</code> otherwise
+	 */
+	public boolean isVisible();
+
+	/**
+	 * Sets the active editor for the action. Implementors should disconnect
+	 * from the old editor, connect to the new editor, and update the action
+	 * to reflect the new editor.
+	 * 
+	 * @param targetEditor
+	 *            the new editor target
+	 */
+	public void setActiveExtendedEditor(IExtendedSimpleEditor targetEditor);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedMarkupEditor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedMarkupEditor.java
new file mode 100644
index 0000000..4f646d3
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedMarkupEditor.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import java.util.List;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * IExtendedMarkupEditor
+ * 
+ * @deprecated use the editor's ISourceEditingTextTools adapter and cast to
+ *             IDOMSourceEditingTextTools when appropriate
+ */
+public interface IExtendedMarkupEditor  {
+
+	/**
+	 * @deprecated - use the IDOMSourceEditingTextTools.getNode(int) method
+	 *             with ISourceEditingTextTools.getCaretOffset()
+	 * @return
+	 */
+	public Node getCaretNode();
+
+	/**
+	 * @deprecated - use method on IDOMSourceEditingTextTools
+	 */
+	public Document getDOMDocument();
+
+	/**
+	 * @deprecated - some editors will provide the list of selected nodes as
+	 *             part of ISourceEditingTextTools.getSelection()
+	 */
+	public List getSelectedNodes();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedSimpleEditor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedSimpleEditor.java
new file mode 100644
index 0000000..b187827
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedSimpleEditor.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+/**
+ * @deprecated, obtain a ISourceEditingTextTools adapter from the editor part
+ */
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.IEditorPart;
+
+public interface IExtendedSimpleEditor {
+
+	public int getCaretPosition();
+
+	public IDocument getDocument();
+
+	public IEditorPart getEditorPart();
+
+	public Point getSelectionRange();
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IModelProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IModelProvider.java
new file mode 100644
index 0000000..f25e288
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IModelProvider.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+
+
+public interface IModelProvider extends IDocumentProvider {
+	IStructuredModel getModel(Object element);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IPopupMenuContributor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IPopupMenuContributor.java
new file mode 100644
index 0000000..9647204
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IPopupMenuContributor.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.jface.action.IMenuManager;
+
+public interface IPopupMenuContributor {
+
+	public void contributeToPopupMenu(IMenuManager menu);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IReleasable.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IReleasable.java
new file mode 100644
index 0000000..44a599d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IReleasable.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+public interface IReleasable {
+	/**
+	 * Generic catch-all for releasing resources and other references
+	 */
+	void release();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ISourceViewerActionBarContributor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ISourceViewerActionBarContributor.java
new file mode 100644
index 0000000..228a968
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ISourceViewerActionBarContributor.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.ui.IEditorActionBarContributor;
+
+public interface ISourceViewerActionBarContributor extends IEditorActionBarContributor {
+
+	/**
+	 * Enables disables actions that are specific to the source viewer (and
+	 * should only work when the source viewer is enabled)
+	 * 
+	 * @param enabled
+	 *            true if source viewer is currently enabled, false otherwise
+	 */
+	public void setViewerSpecificContributionsEnabled(boolean enabled);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IStructuredTextEditorActionConstants.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IStructuredTextEditorActionConstants.java
new file mode 100644
index 0000000..d4b131c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IStructuredTextEditorActionConstants.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+public interface IStructuredTextEditorActionConstants {
+	String SOURCE_CONTEXT_MENU_ID = "sourcePopupMenuId"; //$NON-NLS-1$
+	String SOURCE_BEGIN = "sourceBegin"; //$NON-NLS-1$
+	String SOURCE_ADDITIONS = "additions"; //$NON-NLS-1$
+	String SOURCE_END = "sourceEnd"; //$NON-NLS-1$
+
+	String REFACTOR_CONTEXT_MENU_ID = "refactorPopupMenuId"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ITemporaryAnnotation.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ITemporaryAnnotation.java
new file mode 100644
index 0000000..68f6441
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ITemporaryAnnotation.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+public interface ITemporaryAnnotation {
+	Object getKey();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/Logger.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/Logger.java
new file mode 100644
index 0000000..906e3f2
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/Logger.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.Bundle;
+
+import com.ibm.icu.util.StringTokenizer;
+
+/**
+ * Small convenience class to log messages to plugin's log file and also, if
+ * desired, the console. This class should only be used by classes in this
+ * plugin. Other plugins should make their own copy, with appropriate ID.
+ */
+public class Logger {
+	private static final String PLUGIN_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+	
+	public static final int ERROR = IStatus.ERROR; // 4
+	public static final int ERROR_DEBUG = 200 + ERROR;
+	public static final int INFO = IStatus.INFO; // 1
+	public static final int INFO_DEBUG = 200 + INFO;
+
+	public static final int OK = IStatus.OK; // 0
+
+	public static final int OK_DEBUG = 200 + OK;
+
+	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
+	public static final int WARNING = IStatus.WARNING; // 2
+	public static final int WARNING_DEBUG = 200 + WARNING;
+
+	/**
+	 * Adds message to log.
+	 * 
+	 * @param level
+	 *            severity level of the message (OK, INFO, WARNING, ERROR,
+	 *            OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
+	 * @param message
+	 *            text to add to the log
+	 * @param exception
+	 *            exception thrown
+	 */
+	protected static void _log(int level, String message, Throwable exception) {
+		if (level == OK_DEBUG || level == INFO_DEBUG || level == WARNING_DEBUG || level == ERROR_DEBUG) {
+			if (!isDebugging())
+				return;
+		}
+
+		int severity = IStatus.OK;
+		switch (level) {
+			case INFO_DEBUG :
+			case INFO :
+				severity = IStatus.INFO;
+				break;
+			case WARNING_DEBUG :
+			case WARNING :
+				severity = IStatus.WARNING;
+				break;
+			case ERROR_DEBUG :
+			case ERROR :
+				severity = IStatus.ERROR;
+		}
+		message = (message != null) ? message : "null"; //$NON-NLS-1$
+		Status statusObj = new Status(severity, PLUGIN_ID, severity, message, exception);
+		_log(statusObj);
+
+	}
+	
+	/**
+	 * Adds {@link IStatus} to the log.
+	 * 
+	 * @param statusObj {@link IStatus} to add to the log
+	 */
+	protected static void _log(IStatus statusObj) {
+		Bundle bundle = Platform.getBundle(PLUGIN_ID);
+		if (bundle != null) {
+			Platform.getLog(bundle).log(statusObj);
+		}
+	}
+
+	/**
+	 * Prints message to log if category matches /debug/tracefilter option.
+	 * 
+	 * @param message
+	 *            text to print
+	 * @param category
+	 *            category of the message, to be compared with
+	 *            /debug/tracefilter
+	 */
+	protected static void _trace(String category, String message, Throwable exception) {
+		if (isTracing(category)) {
+			message = (message != null) ? message : "null"; //$NON-NLS-1$
+			Status statusObj = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, exception);
+			Bundle bundle = Platform.getBundle(PLUGIN_ID);
+			if (bundle != null) 
+				Platform.getLog(bundle).log(statusObj);
+
+		}
+	}
+
+	/**
+	 * @return true if the platform is debugging
+	 */
+	public static boolean isDebugging() {
+		return Platform.inDebugMode();
+	}
+
+	/**
+	 * Determines if currently tracing a category
+	 * 
+	 * @param category
+	 * @return true if tracing category, false otherwise
+	 */
+	public static boolean isTracing(String category) {
+		if (!isDebugging())
+			return false;
+
+		String traceFilter = Platform.getDebugOption(PLUGIN_ID + TRACEFILTER_LOCATION);
+		if (traceFilter != null) {
+			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
+			while (tokenizer.hasMoreTokens()) {
+				String cat = tokenizer.nextToken().trim();
+				if (category.equals(cat)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	public static void log(int level, String message) {
+		_log(level, message, null);
+	}
+
+	public static void log(int level, String message, Throwable exception) {
+		_log(level, message, exception);
+	}
+	
+	/**
+	 * <p>Allows an already constructed status to be logged</p>
+	 * 
+	 * @param status {@link IStatus} to log.
+	 */
+	public static void log(IStatus status) {
+		_log(status);
+	}
+
+	public static void logException(String message, Throwable exception) {
+		_log(ERROR, message, exception);
+	}
+
+	public static void logException(Throwable exception) {
+		_log(ERROR, exception.getMessage(), exception);
+	}
+
+	public static void trace(String category, String message) {
+		_trace(category, message, null);
+	}
+
+	public static void traceException(String category, String message, Throwable exception) {
+		_trace(category, message, exception);
+	}
+
+	public static void traceException(String category, Throwable exception) {
+		_trace(category, exception.getMessage(), exception);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/PreferenceInitializer.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/PreferenceInitializer.java
new file mode 100644
index 0000000..20c8cca
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/PreferenceInitializer.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingStrategy;
+import org.eclipse.wst.sse.ui.internal.provisional.preferences.CommonEditorPreferenceNames;
+
+
+public class PreferenceInitializer extends AbstractPreferenceInitializer {
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	public void initializeDefaultPreferences() {
+		IPreferenceStore store = SSEUIPlugin.getDefault().getPreferenceStore();
+		ColorRegistry registry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry();
+		
+		// use the base annotation & quick diff preference page
+		EditorsUI.useAnnotationsPreferencePage(store);
+		EditorsUI.useQuickDiffPreferencePage(store);
+
+		// let annotations show up in the vertical ruler if that's what the
+		// preference is
+		//		// these annotation preferences have a different default value than
+		// the one the base provides
+		//		store.setDefault("errorIndicationInVerticalRuler", false);
+		// //$NON-NLS-1$
+		//		store.setDefault("warningIndicationInVerticalRuler", false);
+		// //$NON-NLS-1$
+
+		// these annotation preferences are not part of base text editor
+		// preference
+		store.setDefault(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS, true);
+
+		setMatchingBracketsPreferences(store, registry);
+
+		// hover help preferences are not part of base text editor preference
+		String mod2Name = Action.findModifierString(SWT.MOD2); // SWT.COMMAND
+		// on Mac;
+		// SWT.CONTROL
+		// elsewhere
+		store.setDefault(EditorPreferenceNames.EDITOR_TEXT_HOVER_MODIFIERS, "combinationHover|true|0;problemHover|false|0;documentationHover|false|0;annotationHover|true|" + mod2Name); //$NON-NLS-1$
+
+		// set default read-only foreground color scale value
+		store.setDefault(EditorPreferenceNames.READ_ONLY_FOREGROUND_SCALE, 30);
+		
+		// set default enable folding value
+		store.setDefault(AbstractStructuredFoldingStrategy.FOLDING_ENABLED, true);
+		
+		// set default for show message dialog when unknown content type in editor
+		store.setDefault(EditorPreferenceNames.SHOW_UNKNOWN_CONTENT_TYPE_MSG, true);
+		
+		// set content assist defaults
+		store.setDefault(EditorPreferenceNames.CODEASSIST_AUTOACTIVATION_DELAY, 500);
+		PreferenceConverter.setDefault(store, EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND, ColorHelper.findRGB(registry, EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND, new RGB(255, 255, 255)));
+		PreferenceConverter.setDefault(store, EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND, ColorHelper.findRGB(registry, EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND, new RGB(0, 0, 0)));
+		PreferenceConverter.setDefault(store, EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND, ColorHelper.findRGB(registry, EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND, new RGB(255, 255, 255)));
+		PreferenceConverter.setDefault(store, EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND, ColorHelper.findRGB(registry, EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND, new RGB(0, 0, 0)));
+
+		store.setDefault(EditorPreferenceNames.SEMANTIC_HIGHLIGHTING, true);
+	}
+
+	private void setMatchingBracketsPreferences(IPreferenceStore store, ColorRegistry registry) {
+		// matching brackets is not part of base text editor preference
+		store.setDefault(EditorPreferenceNames.MATCHING_BRACKETS, true);
+		PreferenceConverter.setDefault(store, EditorPreferenceNames.MATCHING_BRACKETS_COLOR, ColorHelper.findRGB(registry, EditorPreferenceNames.MATCHING_BRACKETS_COLOR, new RGB(192, 192, 192)));
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ReadOnlyAwareDropTargetAdapter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ReadOnlyAwareDropTargetAdapter.java
new file mode 100644
index 0000000..69a968b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ReadOnlyAwareDropTargetAdapter.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+
+public class ReadOnlyAwareDropTargetAdapter extends ExtendedEditorDropTargetAdapter {
+
+	/**
+	 * @deprecated - use ReadOnlyAwareDropTargetAdapter(boolean useProxy) for
+	 *             the performance
+	 */
+	public ReadOnlyAwareDropTargetAdapter() {
+		super();
+	}
+
+	public ReadOnlyAwareDropTargetAdapter(boolean useProxy) {
+		super(useProxy);
+	}
+
+	public void drop(DropTargetEvent event) {
+		IDocument document = getTextViewer().getDocument();
+		if (document instanceof IStructuredDocument) {
+			Point range = getTextViewer().getSelectedRange();
+			if (((IStructuredDocument) document).containsReadOnly(range.x, range.y)) {
+				event.operations = DND.DROP_NONE;
+				event.detail = DND.DROP_NONE;
+				getTextViewer().getTextWidget().redraw();
+				getTextViewer().getTextWidget().update();
+				getTextViewer().getTextWidget().getDisplay().beep();
+			}
+		}
+		super.drop(event);
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIMessages.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIMessages.java
new file mode 100644
index 0000000..8a7c7b0
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIMessages.java
@@ -0,0 +1,467 @@
+/**********************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others. All rights reserved.   This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: 
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Strings used by SSE UI
+ * 
+ * @plannedfor 1.0
+ */
+public class SSEUIMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.sse.ui.internal.SSEUIPluginResources";//$NON-NLS-1$
+	private static ResourceBundle fResourceBundle;
+
+	public static ResourceBundle getResourceBundle() {
+		try {
+			if (fResourceBundle == null)
+				fResourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
+		}
+		catch (MissingResourceException x) {
+			fResourceBundle = null;
+		}
+		return fResourceBundle;
+	}
+
+	private SSEUIMessages() {
+		// cannot create new instance
+	}
+
+    static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, SSEUIMessages.class);
+	}
+
+	public static String Error_opening_file_UI_;
+	public static String _UI_File_is_read_only;
+	public static String _32concat_EXC_;
+	public static String Multiple_errors;
+	public static String _Undo_Text_Change__Ctrl_Z_UI_;
+	public static String Undo_Text_Change__UI_;
+	public static String _Undo__0___Ctrl_Z_UI_;
+	public static String Undo___0___UI_;
+	public static String _Redo_Text_Change__Ctrl_Y_UI_;
+	public static String Redo_Text_Change__UI_;
+	public static String _Redo__0___Ctrl_Y_UI_;
+	public static String Redo___0___UI_;
+	public static String Format_Document_UI_;
+	public static String Format_Active_Elements_UI_;
+	public static String Text_Cut_UI_;
+	public static String Text_Paste_UI_;
+
+	public static String Cleanup_Document_UI_;
+
+	public static String Editor_Cut_label;
+	public static String Editor_Cut_tooltip;
+	public static String Editor_Cut_image;
+	public static String Editor_Cut_description;
+	public static String Editor_Copy_label;
+	public static String Editor_Copy_tooltip;
+	public static String Editor_Copy_image;
+	public static String Editor_Copy_description;
+	public static String Editor_Paste_label;
+	public static String Editor_Paste_tooltip;
+	public static String Editor_Paste_image;
+	public static String Editor_Paste_description;
+	public static String Editor_Delete_label;
+	public static String Editor_Delete_tooltip;
+	public static String Editor_Delete_image;
+	public static String Editor_Delete_description;
+
+	public static String ContentAssistProposals_label;
+	public static String ContentAssistProposals_tooltip;
+	public static String ContentAssistProposals_description;
+	public static String QuickFix_label;
+	public static String QuickFix_tooltip;
+	public static String QuickFix_image;
+	public static String QuickFix_description;
+	public static String ToggleComment_label;
+	public static String ToggleComment_tooltip;
+	public static String ToggleComment_image;
+	public static String ToggleComment_description;
+	public static String ToggleComment_progress;
+	public static String AddBlockComment_label;
+	public static String AddBlockComment_tooltip;
+	public static String AddBlockComment_image;
+	public static String AddBlockComment_description;
+	public static String RemoveBlockComment_label;
+	public static String RemoveBlockComment_tooltip;
+	public static String RemoveBlockComment_image;
+	public static String RemoveBlockComment_description;
+	public static String CleanupDocument_label;
+	public static String CleanupDocument_tooltip;
+	public static String CleanupDocument_image;
+	public static String CleanupDocument_description;
+	public static String FormatDocument_label;
+	public static String FormatDocument_tooltip;
+	public static String FormatDocument_image;
+	public static String FormatDocument_description;
+	public static String FormatActiveElements_label;
+	public static String FormatActiveElements_tooltip;
+	public static String FormatActiveElements_image;
+	public static String FormatActiveElements_description;
+	public static String OpenFileFromSource_label;
+	public static String OpenFileFromSource_tooltip;
+	public static String OpenFileFromSource_image;
+	public static String OpenFileFromSource_description;
+	public static String StructureSelectEnclosing_label;
+	public static String StructureSelectEnclosing_tooltip;
+	public static String StructureSelectEnclosing_description;
+	public static String StructureSelectNext_label;
+	public static String StructureSelectNext_tooltip;
+	public static String StructureSelectNext_description;
+	public static String StructureSelectPrevious_label;
+	public static String StructureSelectPrevious_tooltip;
+	public static String StructureSelectPrevious_description;
+	public static String StructureSelectHistory_label;
+	public static String StructureSelectHistory_tooltip;
+	public static String StructureSelectHistory_description;
+	public static String Text_Shift_Right_UI_;
+	public static String Text_Shift_Left_UI_;
+
+	public static String _4concat;
+	public static String Content_type__UI_;
+	public static String Foreground_UI_;
+	public static String Background_UI_;
+	public static String Bold_UI_;
+	public static String Italics_UI;
+	public static String Restore_Default_UI_;
+	public static String Sample_text__UI_;
+
+	public static String AddBreakpoint_label;
+	public static String AddBreakpoint_tooltip;
+	public static String AddBreakpoint_description;
+	public static String AddBreakpoint_error_dialog_title;
+	public static String AddBreakpoint_error_dialog_message;
+	public static String ToggleBreakpoint_label;
+	public static String ToggleBreakpoint_tooltip;
+	public static String ToggleBreakpoint_description;
+	public static String EnableBreakpoint_label;
+	public static String EnableBreakpoint_tooltip;
+	public static String EnableBreakpoint_description;
+	public static String DisableBreakpoint_label;
+	public static String DisableBreakpoint_tooltip;
+	public static String DisableBreakpoint_description;
+	public static String ManageBreakpoints_add_label;
+	public static String ManageBreakpoints_remove_label;
+	public static String ManageBreakpoints_tooltip;
+	public static String ManageBreakpoints_error_adding_title1;
+	public static String ManageBreakpoints_error_adding_message1;
+
+	public static String AbstractColorPageDescription;
+	public static String SyntaxColoring_Link;
+	public static String SyntaxColoring_Description;
+	public static String EditorModelUtil_0;
+	public static String EditorModelUtil_1;
+
+	// TODO: These should be removed when ContentSettingsPropertyPage is
+	// deleted
+	// web content settings
+	public static String UI_Default_HTML_DOCTYPE_ID___1;
+	public static String UI_CSS_profile___2;
+	public static String UI_Target_Device___3;
+
+	public static String Editor_ToggleInsertMode_label;
+
+	//
+	// These strings are used in Workbench menu bar
+	//
+	public static String ExpandSelectionToMenu_label;
+	public static String SourceMenu_label;
+	public static String RefactorMenu_label;
+
+	public static String FindOccurrencesActionProvider_0;
+	public static String RemoveAction_0;
+	public static String ShowPropertiesAction_0;
+	public static String ContentOutlineConfiguration_0;
+	public static String ContentOutlineConfiguration_1;
+	public static String AbstractOpenOn_0;
+	public static String FormatActionDelegate_jobName;
+	public static String FormatActionDelegate_errorStatusMessage;
+	public static String FormatActionDelegate_3;
+	public static String FormatActionDelegate_4;
+	public static String FormatActionDelegate_5;
+
+	public static String TranslucencyPreferenceTab_0;
+	public static String TranslucencyPreferenceTab_1;
+	public static String StructuredTextEditorPreferencePage_2;
+	public static String StructuredTextEditorPreferencePage_6;
+	public static String StructuredTextEditorPreferencePage_20;
+	public static String StructuredTextEditorPreferencePage_23;
+	public static String StructuredTextEditorPreferencePage_24;
+	public static String StructuredTextEditorPreferencePage_30;
+	public static String StructuredTextEditorPreferencePage_37;
+	public static String StructuredTextEditorPreferencePage_38;
+	public static String StructuredTextEditorPreferencePage_40;
+	public static String StructuredTextEditorPreferencePage_41;
+	public static String StructuredTextEditorPreferencePage_42;
+	public static String StructuredTextEditorPreferencePage_43;
+	public static String StructuredTextEditorPreferencePage_44;
+	public static String TaskTagPreferenceTab_0;
+	public static String TaskTagPreferenceTab_1;
+	public static String TaskTagPreferenceTab_2;
+	public static String TaskTagPreferenceTab_3;
+	public static String TaskTagPreferenceTab_5;
+	public static String TaskTagPreferenceTab_6;
+	public static String TaskTagPreferenceTab_7;
+	public static String TaskTagPreferenceTab_12;
+	public static String TaskTagPreferenceTab_13;
+	public static String TaskTagPreferenceTab_14;
+	public static String TaskTagPreferenceTab_15;
+	public static String TaskTagPreferenceTab_16;
+	public static String TaskTagPreferenceTab_17;
+	public static String TaskTagPreferenceTab_18;
+	public static String TaskTagPreferenceTab_19;
+	public static String TaskTagPreferenceTab_20;
+	public static String TaskTagPreferenceTab_22;
+	public static String TaskTagPreferenceTab_23;
+	public static String TaskTagPreferenceTab_24;
+	public static String TaskTagPreferenceTab_25;
+	public static String TaskTagPreferenceTab_26;
+	public static String TaskTagPreferenceTab_27;
+	public static String TaskTagPreferenceTab_28;
+	public static String TaskTagPreferenceTab_29;
+	public static String TaskTagPreferenceTab_30;
+	public static String TaskTagPreferenceTab_31;
+	public static String TaskTagPreferencePage_32;
+	public static String TaskTagPreferenceTab_33;
+	public static String TaskTagExclusionTab_01;
+	public static String TaskTagExclusionTab_02;
+	public static String TaskTagExclusionTab_03;
+
+	public static String PropertyPreferencePage_01;
+	public static String PropertyPreferencePage_02;
+
+	public static String FilePreferencePage_0;
+	public static String NoModificationCompletionProposal_0;
+	public static String ToggleBreakpointAction_0;
+	public static String ManageBreakpointAction_0;
+	public static String ManageBreakpointAction_1;
+	public static String EditBreakpointAction_0;
+	// Used in Structured Text Editor Preference Page / Hovers Tab
+	public static String TextHoverPreferenceTab_title;
+	public static String TextHoverPreferenceTab_hoverPreferences;
+	public static String TextHoverPreferenceTab_keyModifier;
+	public static String TextHoverPreferenceTab_description;
+	public static String TextHoverPreferenceTab_modifierIsNotValid;
+	public static String TextHoverPreferenceTab_modifierIsNotValidForHover;
+	public static String TextHoverPreferenceTab_duplicateModifier;
+	public static String TextHoverPreferenceTab_nameColumnTitle;
+	public static String TextHoverPreferenceTab_modifierColumnTitle;
+	public static String TextHoverPreferenceTab_delimiter;
+	public static String TextHoverPreferenceTab_insertDelimiterAndModifierAndDelimiter;
+	public static String TextHoverPreferenceTab_insertModifierAndDelimiter;
+	public static String TextHoverPreferenceTab_insertDelimiterAndModifier;
+
+	// used dynamically
+	public static String combinationHover_label;
+	public static String combinationHover_desc;
+	public static String problemHover_label;
+	public static String problemHover_desc;
+	public static String documentationHover_label;
+	public static String documentationHover_desc;
+	public static String annotationHover_label;
+	public static String annotationHover_desc;
+
+	public static String EditStructuredTextEditorPreferencesAction_0;
+	public static String StructuredTextEditorPreferencePage_0;
+	public static String StructuredTextEditorPreferencePage_1;
+	public static String PreferenceManager_0;
+
+	public static String OccurrencesSearchQuery_0;
+	public static String OccurrencesSearchQuery_2;
+	public static String ShowView_errorTitle;
+	public static String proc_dirty_regions_0;
+
+	public static String textHoverMakeStickyHint;
+
+	// Encoding
+	public static String EncodingPreferencePage_0;
+	public static String EncodingPreferencePage_1;
+
+	public static String busy;
+	public static String caret_update;
+	public static String EmptyFilePreferencePage_0;
+
+	public static String OffsetStatusLineContributionItem_0;
+	public static String OffsetStatusLineContributionItem_2;
+	public static String OffsetStatusLineContributionItem_3;
+	public static String OffsetStatusLineContributionItem_4;
+	public static String OffsetStatusLineContributionItem_5;
+	public static String OffsetStatusLineContributionItem_6;
+	public static String OffsetStatusLineContributionItem_7;
+	public static String OffsetStatusLineContributionItem_8;
+	public static String OffsetStatusLineContributionItem_9;
+	public static String OffsetStatusLineContributionItem_10;
+	public static String OffsetStatusLineContributionItem_11;
+	public static String OffsetStatusLineContributionItem_12;
+	public static String OffsetStatusLineContributionItem_13;
+	public static String OffsetStatusLineContributionItem_14;
+	public static String OffsetStatusLineContributionItem_15;
+	public static String OffsetStatusLineContributionItem_16;
+	public static String OffsetStatusLineContributionItem_17;
+	public static String OffsetStatusLineContributionItem_18;
+	public static String OffsetStatusLineContributionItem_19;
+	public static String OffsetStatusLineContributionItem_20;
+
+	/*
+	 * *****Below are possibly unused strings that may be removed *****
+	 */
+	public static String Save_label;
+	public static String An_error_has_occurred_when_ERROR_;
+	public static String Problems_During_Save_As_UI_;
+	public static String Save_could_not_be_complete_UI_;
+	public static String SemanticHighlightingReconciler_0;
+	public static String ManageBreakpoints_error_removing_title1;
+	public static String ManageBreakpoints_error_removing_message1;
+	public static String ManageBreakpoints_error_retrieving_message;
+	public static String JSPSourcePreferencePageDescription;
+	public static String Editor_error_save_message;
+	public static String Editor_error_save_title;
+	public static String Editor_warning_save_delete;
+
+	public static String Previous_annotation;
+	public static String Next_annotation;
+
+	public static String AnnotationTypes_Errors;
+	public static String AnnotationTypes_Warnings;
+	public static String AnnotationTypes_Tasks;
+	public static String AnnotationTypes_SearchResults;
+	public static String AnnotationTypes_Bookmarks;
+	public static String AnnotationTypes_Others;
+
+	public static String Editor_ConvertToWindows_label;
+	public static String Editor_ConvertToWindows_tooltip;
+	public static String Editor_ConvertToWindows_image;
+	public static String Editor_ConvertToWindows_description;
+
+	public static String Editor_ConvertToUNIX_label;
+	public static String Editor_ConvertToUNIX_tooltip;
+	public static String Editor_ConvertToUNIX_image;
+	public static String Editor_ConvertToUNIX_description;
+
+	public static String Editor_ConvertToMac_label;
+	public static String Editor_ConvertToMac_tooltip;
+	public static String Editor_ConvertToMac_image;
+	public static String Editor_ConvertToMac_description;
+	public static String ConvertLineDelimitersMenu_label;
+	public static String FindOccurrences_label;
+
+	public static String ConvertLineDelimitersToCRLFActionDelegate_jobName;
+	public static String ConvertLineDelimitersToCRLFActionDelegate_errorStatusMessage;
+	public static String ConvertLineDelimitersToCRLFActionDelegate_3;
+	public static String ConvertLineDelimitersToCRLFActionDelegate_4;
+
+	public static String TextHoverPreferenceTab_annotationRollover;
+	public static String TextHoverPreferenceTab_showAffordance;
+	public static String TextHoverPreferenceTab_enabled;
+
+	public static String BasicFindOccurrencesAction_0;
+	public static String BasicSearchLabelProvider_0;
+	public static String NavigationPreferenceTab_0;
+	public static String OccurrencesSearchQuery_1;
+	public static String FileModelProvider_0;
+	public static String JFaceNodeAdapter_0;
+
+	public static String ConfigureProjectSettings;
+	public static String ConfigureWorkspaceSettings;
+	public static String EnableProjectSettings;
+	
+	public static String GotoMatchingBracket_label;
+	public static String GotoMatchingBracket_description;
+	public static String GotoMatchingBracket_tooltip;
+	public static String GotoMatchingBracket_error_invalidSelection;
+	public static String GotoMatchingBracket_error_noMatchingBracket;
+	public static String GotoMatchingBracket_error_bracketOutsideSelectedElement;
+
+	public static String LoadingReferencedGrammars;
+
+	public static String Folding;
+	public static String StructuredTextEditorPreferencePage_3;
+	public static String Projection_Toggle_label;
+	public static String Projection_Toggle_tooltip;
+	public static String Projection_Toggle_description;
+	public static String Projection_Toggle_image;
+	public static String Projection_ExpandAll_label;
+	public static String Projection_ExpandAll_tooltip;
+	public static String Projection_ExpandAll_description;
+	public static String Projection_ExpandAll_image;
+	public static String Projection_CollapseAll_label;
+	public static String Projection_CollapseAll_tooltip;
+	public static String Projection_CollapseAll_description;
+	public static String Projection_CollapseAll_image;
+
+	// These strings are accessed using resource bundle and in properties
+	// file, need to use '.' instead of '_' in some keys
+	public static String Editor_ManageBookmarks_tooltip;
+	public static String Editor_ManageBookmarks_image;
+	public static String Editor_ManageBookmarks_description;
+	public static String Editor_ManageBookmarks_add_label;
+	public static String Editor_ManageBookmarks_remove_label;
+	public static String Editor_ManageBookmarks_add_dialog_title;
+	public static String Editor_ManageBookmarks_add_dialog_message;
+	public static String Editor_ManageBookmarks_error_dialog_title;
+	public static String Editor_ManageBookmarks_error_dialog_message;
+	public static String Editor_ManageTasks_tooltip;
+	public static String Editor_ManageTasks_image;
+	public static String Editor_ManageTasks_description;
+	public static String Editor_ManageTasks_add_label;
+	public static String Editor_ManageTasks_remove_label;
+	public static String Editor_ManageTasks_add_dialog_title;
+	public static String Editor_ManageTasks_add_dialog_message;
+	public static String Editor_ManageTasks_error_dialog_title;
+	public static String Editor_ManageTasks_error_dialog_message;
+	/*
+	 * *****Above are possibly unused strings that may be removed*****
+	 */
+	
+	public static String StructuredTextEditorPreferencePage_39;
+	public static String StructuredTextEditor_0;
+	public static String UnknownContentTypeDialog_0;
+	public static String UnknownContentTypeDialog_1;
+	public static String UnknownContentTypeDialog_2;
+	public static String StyledTextColorPicker_0;
+	
+	public static String TextSearchLabelProvider_matchCountFormat;
+	
+	//content assist messages
+	public static String ContentAssist_computing_proposals;
+	public static String ContentAssist_collecting_proposals;
+	public static String ContentAssist_sorting_proposals;
+	public static String ContentAssist_collecting_contexts;
+	public static String ContentAssist_computing_contexts;
+	public static String ContentAssist_sorting_contexts;
+	public static String ContentAssist_no_completions;
+	public static String ContentAssist_all_disabled_title;
+	public static String ContentAssist_all_disabled_message;
+	public static String ContentAssist_all_disabled_preference_link;
+	public static String ContentAssist_no_message;
+	public static String ContentAssist_toggle_affordance_update_message;
+	public static String ContentAssist_defaultProposalCategory_title;
+	public static String ContentAssist_press;
+	public static String ContentAssist_click;
+	public static String OptionalMessageDialog_dontShowAgain;
+	
+	//content assist preference messages
+	public static String CodeAssistAdvancedConfigurationBlock_page_description;
+	public static String CodeAssistAdvancedConfigurationBlock_no_shortcut;
+	public static String CodeAssistAdvancedConfigurationBlock_Up;
+	public static String CodeAssistAdvancedConfigurationBlock_Down;
+	public static String CodeAssistAdvancedConfigurationBlock_separate_table_description;
+	public static String CodeAssistAdvancedConfigurationBlock_default_table_description;
+	public static String CodeAssistAdvancedConfigurationBlock_default_table_category_column_title;
+	public static String CodeAssistAdvancedConfigurationBlock_PagesDown;
+	public static String CodeAssistAdvancedConfigurationBlock_PagesUp;
+	public static String CodeAssistAdvancedConfigurationBlock_separate_table_category_column_title;
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIPlugin.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIPlugin.java
new file mode 100644
index 0000000..d46cf03
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIPlugin.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistry;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistryImpl;
+import org.eclipse.wst.sse.ui.internal.taginfo.TextHoverManager;
+import org.osgi.framework.BundleContext;
+
+
+public class SSEUIPlugin extends AbstractUIPlugin {
+
+	public final static String ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+
+	static SSEUIPlugin instance = null;
+	
+	private FormToolkit fDialogsFormToolkit;
+
+	public static SSEUIPlugin getDefault() {
+		return instance;
+	}
+
+	public synchronized static SSEUIPlugin getInstance() {
+		return instance;
+	}
+
+	private TextHoverManager fTextHoverManager;
+
+	public SSEUIPlugin() {
+		super();
+		instance = this;
+	}
+
+	public AdapterFactoryRegistry getAdapterFactoryRegistry() {
+		return AdapterFactoryRegistryImpl.getInstance();
+
+	}
+
+	/**
+	 * Return text hover manager
+	 * 
+	 * @return TextHoverManager
+	 */
+	public TextHoverManager getTextHoverManager() {
+		if (fTextHoverManager == null) {
+			fTextHoverManager = new TextHoverManager();
+		}
+		return fTextHoverManager;
+	}
+
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+	
+	public FormToolkit getDialogsFormToolkit() {
+		if (fDialogsFormToolkit == null) {
+			FormColors colors= new FormColors(Display.getCurrent());
+			colors.setBackground(null);
+			colors.setForeground(null);	
+			fDialogsFormToolkit= new FormToolkit(colors);
+		}
+		return fDialogsFormToolkit;
+	}
+
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+	}
+
+	/**
+	 * <p>A utility function for getting the active workbench shell.</p>
+	 * 
+	 * @return the active workbench {@link Shell}
+	 */
+	public static Shell getActiveWorkbenchShell() {
+		 IWorkbenchWindow window = getDefault().getWorkbench().getActiveWorkbenchWindow();
+		 if (window != null) {
+		 	return window.getShell();
+		 }
+		 return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIPluginResources.properties b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIPluginResources.properties
new file mode 100644
index 0000000..f45338f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/SSEUIPluginResources.properties
@@ -0,0 +1,445 @@
+###############################################################################
+# Copyright (c) 2001, 2009 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Jens Lukowski/Innoopract - initial renaming/restructuring
+#
+###############################################################################
+Error_opening_file_UI_=Error opening file
+_UI_File_is_read_only=File {0} is read-only.
+_32concat_EXC_=Editor could not be open on {0}
+Multiple_errors=Multiple annotations found at this line:
+_Undo_Text_Change__Ctrl_Z_UI_=&Undo Text Change @Ctrl+Z
+Undo_Text_Change__UI_=Undo Text Change.
+_Undo__0___Ctrl_Z_UI_=&Undo {0} @Ctrl+Z
+Undo___0___UI_=Undo: {0}.
+_Redo_Text_Change__Ctrl_Y_UI_=&Redo Text Change @Ctrl+Y
+Redo_Text_Change__UI_=Redo Text Change.
+_Redo__0___Ctrl_Y_UI_=&Redo {0} @Ctrl+Y
+Redo___0___UI_=Redo: {0}.
+Format_Document_UI_=Format
+Format_Active_Elements_UI_=Format Active Elements
+Text_Cut_UI_=Text Cut
+Text_Paste_UI_=Text Paste
+###############################################################################
+Cleanup_Document_UI_=Cleanup Document
+
+Editor_Cut_label=Cu&t@Ctrl+X
+Editor_Cut_tooltip=Cut
+Editor_Cut_image=
+Editor_Cut_description=Cut
+
+Editor_Copy_label=&Copy@Ctrl+C
+Editor_Copy_tooltip=Copy
+Editor_Copy_image=
+Editor_Copy_description=Copy
+
+Editor_Paste_label=&Paste@Ctrl+V
+Editor_Paste_tooltip=Paste
+Editor_Paste_image=
+Editor_Paste_description=Paste
+
+Editor_Delete_label=&Delete@Delete
+Editor_Delete_tooltip=Delete
+Editor_Delete_image=
+Editor_Delete_description=Delete
+
+ContentAssistProposals_label=Con&tent Assist
+ContentAssistProposals_tooltip=Content Assist
+ContentAssistProposals_description=Content Assist
+
+QuickFix_label=&Quick Fix
+QuickFix_tooltip=Quick Fix
+QuickFix_image=
+QuickFix_description=Quick Fix
+
+ToggleComment_label=Togg&le Comment
+ToggleComment_tooltip=Toggle Comment
+ToggleComment_image=
+ToggleComment_description=Toggle Comment
+ToggleComment_progress=Toggling line comments...
+AddBlockComment_label=Add &Block Comment
+AddBlockComment_tooltip=Add Block Comment
+AddBlockComment_image=
+AddBlockComment_description=Add Block Comment
+RemoveBlockComment_label=Remove Bloc&k Comment
+RemoveBlockComment_tooltip=Remove Block Comment
+RemoveBlockComment_image=
+RemoveBlockComment_description=Remove Block Comment
+CleanupDocument_label=C&leanup Document...
+CleanupDocument_tooltip=Cleanup Document
+CleanupDocument_image=
+CleanupDocument_description=Cleanup Document
+FormatDocument_label=&Format
+FormatDocument_tooltip=Format
+FormatDocument_image=
+FormatDocument_description=Format
+FormatActiveElements_label=Format Act&ive Elements
+FormatActiveElements_tooltip=Format Active Elements
+FormatActiveElements_image=
+FormatActiveElements_description=Format Active Elements
+OpenFileFromSource_label=Op&en Selection
+OpenFileFromSource_tooltip=Open an editor on the selected link
+OpenFileFromSource_image=
+OpenFileFromSource_description=Open an editor on the selected link
+StructureSelectEnclosing_label=&Enclosing Element
+StructureSelectEnclosing_tooltip=Expand selection to include enclosing element
+StructureSelectEnclosing_description=Expand selection to include enclosing element
+StructureSelectNext_label=&Next Element
+StructureSelectNext_tooltip=Expand selection to include next sibling
+StructureSelectNext_description=Expand selection to include next sibling
+StructureSelectPrevious_label=&Previous Element
+StructureSelectPrevious_tooltip=Expand selection to include previous sibling
+StructureSelectPrevious_description=Expand selection to include previous sibling
+StructureSelectHistory_label=&Restore Last Selection
+StructureSelectHistory_tooltip=Restore last selection
+StructureSelectHistory_description=Restore last selection
+Text_Shift_Right_UI_=Text Shift Right
+Text_Shift_Left_UI_=Text Shift Left
+
+_4concat=''{0}'' is not a valid input
+## The following strings are for "XML->XML Source->XML Style" Preferences, "Web Tools->Source->HTML Style" Preferences, and "Web Tools->Source->JavaScript Style" Preferences
+Content_type__UI_=Co&ntent type:
+Foreground_UI_=&Foreground:
+Background_UI_=Backgr&ound:
+Bold_UI_=B&old
+Italics_UI=Italics
+Restore_Default_UI_=&Restore Default
+Sample_text__UI_=&Sample text:
+##
+AddBreakpoint_label=Add &Breakpoint
+AddBreakpoint_tooltip=Add Breakpoint
+AddBreakpoint_description=Add Breakpoint
+AddBreakpoint_error_dialog_title=Add Breakpoint
+AddBreakpoint_error_dialog_message=Cannot add breakpoint
+##
+ToggleBreakpoint_label=Toggle Breakpoint
+ToggleBreakpoint_tooltip=Toggle Breakpoint
+ToggleBreakpoint_description=Toggle Breakpoint
+##
+EnableBreakpoint_label=Enable Breakpoint
+EnableBreakpoint_tooltip=Enable Breakpoint
+EnableBreakpoint_description=Enable Breakpoint
+##
+DisableBreakpoint_label=Disable Breakpoint
+DisableBreakpoint_tooltip=Disable Breakpoint
+DisableBreakpoint_description=Disable Breakpoint
+##
+ManageBreakpoints_add_label=Add &Breakpoint
+ManageBreakpoints_remove_label=Remove Breakpoint
+ManageBreakpoints_tooltip=Add/Remove Breakpoint
+ManageBreakpoints_error_adding_title1=Add Breakpoint
+ManageBreakpoints_error_adding_message1=Cannot add breakpoint
+
+AbstractColorPageDescription=Customize the syntax highlighting by selecting the type of text whose style you want to customize from either the combo box or the sample text area
+##
+EditorModelUtil_0=model in invalid state
+EditorModelUtil_1=There was a problem adding adapter factories
+
+# web content settings
+UI_Default_HTML_DOCTYPE_ID___1=&Document type:
+UI_CSS_profile___2=&CSS profile:
+UI_Target_Device___3=&Target device:
+
+Editor_ToggleInsertMode_label=Sma&rt Insert Mode
+
+##########################################################################
+# These strings are used in Workbench menu bar
+##########################################################################
+ExpandSelectionToMenu_label=E&xpand Selection To
+SourceMenu_label=&Source
+RefactorMenu_label=Refac&tor
+#
+FindOccurrencesActionProvider_0=Current selection does not resolve to a searchable element
+RemoveAction_0=Remove Property
+ShowPropertiesAction_0=P&roperties
+ContentOutlineConfiguration_0=Collapse All
+ContentOutlineConfiguration_1=Link with Editor
+AbstractOpenOn_0=Current text selection does not resolve to a file
+FormatActionDelegate_jobName=Formatting...
+FormatActionDelegate_errorStatusMessage=Exceptions occurred while formatting documents
+FormatActionDelegate_3=Formatting {0}
+FormatActionDelegate_4=Exception occurred while formatting document {0}
+FormatActionDelegate_5=MalformedInputException occurred while formatting document {0}
+TranslucencyPreferenceTab_0=Read-Only text style
+TranslucencyPreferenceTab_1=Read-Only contrast percentage:
+StructuredTextEditorPreferencePage_2=Matching brackets highlight
+StructuredTextEditorPreferencePage_6=The following preferences apply to the HTML, JSP, XML, and other source editors.
+StructuredTextEditorPreferencePage_20=Highlight &matching brackets
+StructuredTextEditorPreferencePage_23=Appearance co&lor options:
+StructuredTextEditorPreferencePage_24=C&olor:
+StructuredTextEditorPreferencePage_30=&Report problems as you type
+StructuredTextEditorPreferencePage_37=Empty input
+StructuredTextEditorPreferencePage_38=is not a valid input.
+StructuredTextEditorPreferencePage_39=Inform when &unsupported content type is in editor
+StructuredTextEditorPreferencePage_40=Also see the <a>''{0}''</a> preferences.
+StructuredTextEditorPreferencePage_41=Completion proposal background
+StructuredTextEditorPreferencePage_42=Completion proposal foreground
+StructuredTextEditorPreferencePage_43=Parameter hints background
+StructuredTextEditorPreferencePage_44=Parameter hints foreground
+TaskTagPreferenceTab_0=Low
+TaskTagPreferenceTab_1=Normal
+TaskTagPreferenceTab_2=High
+TaskTagPreferenceTab_3=N/A
+TaskTagPreferenceTab_5=Task Tag
+TaskTagPreferenceTab_6=Tag:
+TaskTagPreferenceTab_7=Priority:
+TaskTagPreferenceTab_12=Tag
+TaskTagPreferenceTab_13=Priority
+TaskTagPreferenceTab_14=New...
+TaskTagPreferenceTab_15=Edit...
+TaskTagPreferenceTab_16=Remove
+TaskTagPreferenceTab_17=Select All
+TaskTagPreferenceTab_18=Deselect All
+TaskTagPreferenceTab_19=Note: tags are case insensitive
+TaskTagPreferenceTab_20=Task Tags
+TaskTagPreferenceTab_22=Task Tags Settings Changed
+TaskTagPreferenceTab_23=The task tags settings have changed.  Make these changes effective now?
+TaskTagPreferenceTab_24=Yes
+TaskTagPreferenceTab_25=No
+TaskTagPreferenceTab_26=Cancel
+TaskTagPreferenceTab_27=Scanning files for tasks
+TaskTagPreferenceTab_28=detection aborted
+TaskTagPreferenceTab_29=detection completed
+TaskTagPreferenceTab_30=detection encountered errors
+TaskTagPreferenceTab_31=Enable searching for Task Tags
+TaskTagPreferencePage_32=Clean and redetect Tasks
+TaskTagPreferenceTab_33=Tags in comments indicating Tasks:
+TaskTagExclusionTab_01=Filters
+TaskTagExclusionTab_02=Scan the selected Content Types:
+TaskTagExclusionTab_03=Affected Content Types:
+
+PropertyPreferencePage_01=Project Specific Configuration
+PropertyPreferencePage_02=Select the project to configure:
+
+FilePreferencePage_0=Expand the tree to edit preferences for a specific content type.
+NoModificationCompletionProposal_0=No corrections available
+ToggleBreakpointAction_0=Toggle &Breakpoints
+ManageBreakpointAction_0=&Enable Breakpoints
+ManageBreakpointAction_1=&Disable Breakpoints
+EditBreakpointAction_0=Breakpoint &Properties...
+## Used in Structured Text Editor Preference Page / Hovers Tab
+TextHoverPreferenceTab_title=Hovers
+TextHoverPreferenceTab_hoverPreferences=Text &Hover key modifier preferences:
+TextHoverPreferenceTab_keyModifier=Pressed key &modifier while hovering:
+TextHoverPreferenceTab_description=Description:
+TextHoverPreferenceTab_modifierIsNotValid=Modifier ''{0}'' is not valid.
+TextHoverPreferenceTab_modifierIsNotValidForHover=Modifier ''{0}'' for ''{1}'' hover is not valid.
+TextHoverPreferenceTab_duplicateModifier=''{0}'' hover uses the same modifier as ''{1}'' hover.
+TextHoverPreferenceTab_nameColumnTitle=Text Hover Name
+TextHoverPreferenceTab_modifierColumnTitle=Pressed Key Modifier While Hovering
+TextHoverPreferenceTab_delimiter=+
+TextHoverPreferenceTab_insertDelimiterAndModifierAndDelimiter=\ + {0} +
+TextHoverPreferenceTab_insertModifierAndDelimiter=\ {0} +
+TextHoverPreferenceTab_insertDelimiterAndModifier=\ + {0}
+combinationHover_label=Combined Hover
+combinationHover_desc=Tries the hovers in the sequence listed in the table below this one and uses the one which fits best for the selected element and the current context.
+problemHover_label=Problem Description
+problemHover_desc=Shows the description of the selected problem.
+documentationHover_label=Documentation Description
+documentationHover_desc=Shows the documentation of the selected element.
+annotationHover_label=Annotation Description
+annotationHover_desc=Shows the description of the selected annotation.
+EditStructuredTextEditorPreferencesAction_0=Editor Preferences
+StructuredTextEditorPreferencePage_0=Appearance
+StructuredTextEditorPreferencePage_1=Enable &semantic highlighting
+PreferenceManager_0=Original Error:
+
+OccurrencesSearchQuery_0={0} - {1} occurrences in {2}
+OccurrencesSearchQuery_2=file
+ShowView_errorTitle=Problems Showing View
+proc_dirty_regions_0 = Processing Dirty Regions
+
+textHoverMakeStickyHint=Press ''{0}'' for focus.
+
+## Encoding
+EncodingPreferencePage_0=Encoding settings for Web and XML files:
+EncodingPreferencePage_1=Use 3 byte BOM (Byte Order Mark) when saving UTF-8 encoded files
+busy=busy
+caret_update=caret update
+EmptyFilePreferencePage_0=This category ID has been replaced by 'org.eclipse.wst.xml.ui.preferences.xml' and 'org.eclipse.wst.html.ui.preferences.web'
+OffsetStatusLineContributionItem_0=Selection Information:
+OffsetStatusLineContributionItem_2=Partitions
+OffsetStatusLineContributionItem_3=ITextRegions
+OffsetStatusLineContributionItem_4=Structured Model Content-Type: 
+OffsetStatusLineContributionItem_5=Model Handler: 
+OffsetStatusLineContributionItem_6=Document Class: 
+OffsetStatusLineContributionItem_7=Document Provider Class: 
+OffsetStatusLineContributionItem_8=Partitionings:
+OffsetStatusLineContributionItem_9=Start
+OffsetStatusLineContributionItem_10=Length
+OffsetStatusLineContributionItem_11=Type
+OffsetStatusLineContributionItem_12=Input Type: 
+OffsetStatusLineContributionItem_13=Partitioner: 
+OffsetStatusLineContributionItem_14=Structured Selection
+OffsetStatusLineContributionItem_15=Start
+OffsetStatusLineContributionItem_16=Length
+OffsetStatusLineContributionItem_17=Text Length
+OffsetStatusLineContributionItem_18=Context
+OffsetStatusLineContributionItem_19=Workbench Selection
+OffsetStatusLineContributionItem_20=Indexed Regions
+
+StructuredTextEditor_0=Unsupported content type warning
+UnknownContentTypeDialog_0=Unsupported Content Type
+UnknownContentTypeDialog_1=Do not show this message again
+UnknownContentTypeDialog_2=Unsupported content type in editor.\nTo associate file extension with a supported content type,\nplease see <a>Content Types Preference Page</a>
+
+################################################################################
+## Below are possibly unused strings that may be removed
+################################################################################
+Save_label=&Save
+An_error_has_occurred_when_ERROR_=An error has occurred when retrieving resources for the source editor. The Eclipse Workbench installation may have been corrupted.
+## save as problems (next two) should match what is in workbench
+Problems_During_Save_As_UI_=Problems During Save As...
+Save_could_not_be_complete_UI_=Save could not be completed.
+SemanticHighlightingReconciler_0=Semantic Highlighting Job
+ManageBreakpoints_error_removing_title1=Remove Breakpoint
+ManageBreakpoints_error_removing_message1=Cannot remove breakpoint
+ManageBreakpoints_error_retrieving_message=Retrieving markers failed:
+JSPSourcePreferencePageDescription=Embedded content type\'s source preferences will be used. Select the file type for customization
+# The following lines copied from org\eclipse\ui\editors\text\TextEditorMessages.properties in org.eclipse.ui plugin
+Editor_error_save_message=Save could not be completed. {0}
+Editor_error_save_title=Problems During Save As...
+Editor_warning_save_delete=The original file ''{0}'' has been deleted.
+
+# actions
+Previous_annotation=Previous Annotation
+Next_annotation=Next Annotation
+# Annotation Types
+AnnotationTypes_Errors=Errors
+AnnotationTypes_Warnings=Warnings
+AnnotationTypes_Tasks=Tasks
+AnnotationTypes_SearchResults=Search Results
+AnnotationTypes_Bookmarks=Bookmarks
+AnnotationTypes_Others=Others
+
+Editor_ConvertToWindows_label=&Windows
+Editor_ConvertToWindows_tooltip=Converts line delimiters to Windows
+Editor_ConvertToWindows_image=
+Editor_ConvertToWindows_description=Converts line delimiters to Windows
+
+Editor_ConvertToUNIX_label=&UNIX
+Editor_ConvertToUNIX_tooltip=Converts line delimiters to UNIX
+Editor_ConvertToUNIX_image=
+Editor_ConvertToUNIX_description=Converts line delimiters to UNIX
+
+Editor_ConvertToMac_label=&Mac
+Editor_ConvertToMac_tooltip=Converts line delimiters to Mac
+Editor_ConvertToMac_image=
+Editor_ConvertToMac_description=Converts line delimiters to Mac
+ConvertLineDelimitersMenu_label=Co&nvert Line Delimiters to
+FindOccurrences_label=O&ccurrences in File
+
+ConvertLineDelimitersToCRLFActionDelegate_jobName=Converting line delimiters
+ConvertLineDelimitersToCRLFActionDelegate_errorStatusMessage=Exceptions occurred while converting line delimiters
+ConvertLineDelimitersToCRLFActionDelegate_3=Converting line delimiters for {0}
+ConvertLineDelimitersToCRLFActionDelegate_4=Exception occurred while converting line delimiters for document {0}
+TextHoverPreferenceTab_annotationRollover=&Enable annotation roll-over (on new editors)
+TextHoverPreferenceTab_showAffordance=&Show affordance in hover on how to make it sticky
+TextHoverPreferenceTab_enabled=&Enabled
+
+BasicFindOccurrencesAction_0=region match:
+BasicSearchLabelProvider_0=line
+NavigationPreferenceTab_0=Modifier ''{0}'' is not valid.
+OccurrencesSearchQuery_1={0} - 1 Occurrence in {1}
+FileModelProvider_0=Error reloading {0}
+JFaceNodeAdapter_0=Update Outline
+
+ConfigureProjectSettings=Configure Project Specific Settings...
+ConfigureWorkspaceSettings=Configure Workspace Settings...
+EnableProjectSettings=Enable project specific settings
+
+LoadingReferencedGrammars=Loading referenced grammars
+
+## Folding
+Folding=Folding
+StructuredTextEditorPreferencePage_3=Enable &folding
+Projection_Toggle_label= &Enable Folding
+Projection_Toggle_tooltip= Toggles Folding
+Projection_Toggle_description= Toggles folding for the current editor
+Projection_Toggle_image=
+Projection_ExpandAll_label= Expand &All
+Projection_ExpandAll_tooltip= Expands All Collapsed Regions
+Projection_ExpandAll_description= Expands any collapsed regions in the current editor
+Projection_ExpandAll_image=
+Projection_CollapseAll_label= Collapse A&ll
+Projection_CollapseAll_tooltip= Collapses All Expanded Regions
+Projection_CollapseAll_description= Collapse any expanded regions in the current editor
+Projection_CollapseAll_image=
+
+## These are copied from org.eclipse.ui.texteditor.EditorMessages.properties
+## They are needed temporarily until CMVC defect 203158 / Bugzilla defect 20054 is fixed
+Editor_ManageBookmarks_tooltip=Adds and Removes Bookmarks
+Editor_ManageBookmarks_image=
+Editor_ManageBookmarks_description=Adds and removes Bookmarks
+Editor_ManageBookmarks_add_label=Add Boo&kmark...
+Editor_ManageBookmarks_remove_label=Remove Boo&kmark
+Editor_ManageBookmarks_add_dialog_title=Add Bookmark
+Editor_ManageBookmarks_add_dialog_message=Enter Bookmark name
+Editor_ManageBookmarks_error_dialog_title=Managing Bookmarks
+Editor_ManageBookmarks_error_dialog_message=Problems managing bookmarks
+
+Editor_ManageTasks_tooltip=Adds and Removes Tasks
+Editor_ManageTasks_image=
+Editor_ManageTasks_description=Adds and removes Tasks
+Editor_ManageTasks_add_label=Add &Task...
+Editor_ManageTasks_remove_label=Remove &Task
+Editor_ManageTasks_add_dialog_title=Add Task
+Editor_ManageTasks_add_dialog_message=Enter Task description
+Editor_ManageTasks_error_dialog_title=Managing Tasks
+Editor_ManageTasks_error_dialog_message=Problems managing tasks
+################################################################################
+## Above are possibly unused strings that may be removed
+###############################################################################
+StyledTextColorPicker_0=Pick a color
+SyntaxColoring_Link=Default colors and font can be configured on the <a href=\"org.eclipse.ui.preferencePages.GeneralTextEditor\">Text Editors</a> and on the <a href=\"org.eclipse.ui.preferencePages.ColorsAndFonts\">Colors and Fonts</a> preference pages.  Decorations for annotations can be configured on the <a href=\"org.eclipse.ui.editors.preferencePages.Annotations\">Annotations</a> preference page.
+SyntaxColoring_Description=Customize the syntax highlighting by selecting the type of text whose style you want to customize from either the list or the example text area.
+
+GotoMatchingBracket_label= Matching &Bracket
+GotoMatchingBracket_tooltip=Go to Matching Bracket
+GotoMatchingBracket_description=Go to Matching Bracket
+GotoMatchingBracket_error_invalidSelection=No bracket selected
+GotoMatchingBracket_error_noMatchingBracket=No matching bracket found
+GotoMatchingBracket_error_bracketOutsideSelectedElement=Matching bracket is outside the selected element
+
+TextSearchLabelProvider_matchCountFormat=({0} matches)
+
+
+##################################################
+## Content Assist Strings
+##################################################
+ContentAssist_computing_proposals=Computing completion proposals
+ContentAssist_collecting_proposals=Collecting completion proposals
+ContentAssist_sorting_proposals=Sorting completion proposals
+ContentAssist_collecting_contexts=Collecting context information
+ContentAssist_computing_contexts=Computing context information
+ContentAssist_sorting_contexts=Sorting context information
+ContentAssist_no_completions=No completions available.
+ContentAssist_all_disabled_title=Content Assist Problem
+ContentAssist_all_disabled_message=Some content proposal kinds have been uninstalled. It is recommended to review the content assist settings.
+ContentAssist_all_disabled_preference_link=Change the settings on the <a>Content Assist preference page</a> or click ''{0}'' to restore the default behavior.
+ContentAssist_no_message= No {0}
+ContentAssist_toggle_affordance_update_message={1} to show {2}
+ContentAssist_defaultProposalCategory_title=Default Proposals
+ContentAssist_press=Press ''{0}''
+ContentAssist_click=Click
+OptionalMessageDialog_dontShowAgain= Do not show this &message again
+
+##################################################
+## Content Assist Properties page Strings
+##################################################
+CodeAssistAdvancedConfigurationBlock_page_description=Configure the behavior of the content assist ({0}) command.
+CodeAssistAdvancedConfigurationBlock_no_shortcut=no shortcut
+CodeAssistAdvancedConfigurationBlock_Up=&Up
+CodeAssistAdvancedConfigurationBlock_Down=D&own
+CodeAssistAdvancedConfigurationBlock_default_table_description=Select the proposal &categories contained in the 'default' content assist list:
+CodeAssistAdvancedConfigurationBlock_default_table_category_column_title=Default Proposal Categories
+CodeAssistAdvancedConfigurationBlock_PagesDown=Do&wn
+CodeAssistAdvancedConfigurationBlock_PagesUp=U&p
+CodeAssistAdvancedConfigurationBlock_separate_table_description=Select the &enablement and order of proposal categories that are cycled through when repeatedly invoking content assist:
+CodeAssistAdvancedConfigurationBlock_separate_table_category_column_title=Content Assist Pages
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ShowViewAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ShowViewAction.java
new file mode 100644
index 0000000..6e3aa63
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ShowViewAction.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * Surfaces a View.
+ * 
+ * @author Nitin Dahyabhai
+ */
+public abstract class ShowViewAction extends Action {
+	/**
+	 *  
+	 */
+	public ShowViewAction() {
+		super();
+	}
+
+	/**
+	 * @param text
+	 */
+	public ShowViewAction(String text) {
+		super(text);
+	}
+
+	/**
+	 * @param text
+	 * @param image
+	 */
+	public ShowViewAction(String text, ImageDescriptor image) {
+		super(text, image);
+	}
+
+	/**
+	 * @param text
+	 * @param style
+	 */
+	public ShowViewAction(String text, int style) {
+		super(text, style);
+	}
+
+	/**
+	 * @return
+	 */
+	protected abstract String getViewID();
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		super.run();
+		showView();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event)
+	 */
+	public void runWithEvent(Event event) {
+		super.runWithEvent(event);
+		showView();
+	}
+
+	/**
+	 *  
+	 */
+	private void showView() {
+		IWorkbenchWindow window = SSEUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+		IWorkbenchPage page = window.getActivePage();
+		if (page != null) {
+			try {
+				page.showView(getViewID());
+			} catch (PartInitException e) {
+				ErrorDialog.openError(window.getShell(), SSEUIMessages.ShowView_errorTitle, //$NON-NLS-1$
+							e.getMessage(), e.getStatus());
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java
new file mode 100644
index 0000000..5082372
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java
@@ -0,0 +1,763 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IEncodedStorage;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.editors.text.FileDocumentProvider;
+import org.eclipse.ui.editors.text.ILocationProvider;
+import org.eclipse.ui.editors.text.StorageDocumentProvider;
+import org.eclipse.ui.texteditor.DocumentProviderRegistry;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.IElementStateListener;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.encoding.CodedReaderCreator;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.util.Utilities;
+import org.eclipse.wst.sse.ui.internal.debug.BreakpointRulerAction;
+import org.eclipse.wst.sse.ui.internal.editor.EditorModelUtil;
+import org.eclipse.wst.sse.ui.internal.extension.BreakpointProviderBuilder;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IExtendedStorageEditorInput;
+
+/**
+ * A StorageDocumentProvider that is IStructuredModel aware
+ */
+public class StorageModelProvider extends StorageDocumentProvider implements IModelProvider {
+
+	private class InternalElementStateListener implements IElementStateListener {
+		public void elementContentAboutToBeReplaced(Object element) {
+			if (debugElementStatelistener) {
+				System.out.println("StorageModelProvider: elementContentAboutToBeReplaced: " + ((IEditorInput) element).getName()); //$NON-NLS-1$
+			}
+			// we just forward the event
+			StorageModelProvider.this.fireElementContentAboutToBeReplaced(element);
+		}
+
+		public void elementContentReplaced(Object element) {
+			if (debugElementStatelistener) {
+				System.out.println("StorageModelProvider: elementContentReplaced: " + ((IEditorInput) element).getName()); //$NON-NLS-1$
+			}
+
+			StorageInfo info = (StorageInfo) getElementInfo(element);
+			
+			if (info == null)
+				return;
+
+			/**
+			 * Force a reload of the markers into annotations since their
+			 * previous Positions have been deleted. Disconnecting and
+			 * reconnecting forces a call to the private catchupWithMarkers
+			 * method.
+			 */
+			if (info.fModel != null) {
+				info.fModel.disconnect(info.fDocument);
+			}
+
+			Reader reader = null;
+			IStructuredDocument innerdocument = null;
+			try {
+				// update document from input's contents
+				CodedReaderCreator codedReaderCreator = new CodedReaderCreator(calculateID((IStorageEditorInput) element), Utilities.getMarkSupportedStream(((IStorageEditorInput) element).getStorage().getContents()));
+				reader = codedReaderCreator.getCodedReader();
+
+				innerdocument = (IStructuredDocument) info.fDocument;
+
+				int originalLengthToReplace = innerdocument.getLength();
+
+				StringBuffer stringBuffer = new StringBuffer();
+				int bufferSize = 2048;
+				char[] buffer = new char[bufferSize];
+				int nRead = 0;
+				boolean eof = false;
+				while (!eof) {
+					nRead = reader.read(buffer, 0, bufferSize);
+					if (nRead == -1) {
+						eof = true;
+					}
+					else {
+						stringBuffer.append(buffer, 0, nRead);
+					}
+				}
+				innerdocument.replaceText(this, 0, originalLengthToReplace, stringBuffer.toString(), true);
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+			catch (IOException e) {
+				Logger.logException(e);
+			}
+			finally {
+				if (reader != null) {
+					try {
+						reader.close();
+					}
+					catch (IOException e1) {
+						// would be highly unusual
+						Logger.logException(e1);
+					}
+				}
+			}
+
+			// forward the event
+			if (info.fCanBeSaved) {
+				info.fCanBeSaved = false;
+				addUnchangedElementListeners(element, info);
+			}
+			fireElementContentReplaced(element);
+			fireElementDirtyStateChanged(element, false);
+
+			if (info != null && info.fModel != null) {
+				info.fModel.connect(info.fDocument);
+			}
+		}
+
+		public void elementDeleted(Object element) {
+			if (debugElementStatelistener) {
+				System.out.println("StorageModelProvider: elementDeleted: " + ((IEditorInput) element).getName()); //$NON-NLS-1$
+			}
+			// we just forward the event
+			StorageModelProvider.this.fireElementDeleted(element);
+		}
+
+		public void elementDirtyStateChanged(Object element, boolean isDirty) {
+			if (debugElementStatelistener) {
+				System.out.println("StorageModelProvider: elementDirtyStateChanged: " + ((IEditorInput) element).getName() + " (" + isDirty + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+			// we just forward the event
+			StorageModelProvider.this.fireElementDirtyStateChanged(element, isDirty);
+		}
+
+		public void elementMoved(Object originalElement, Object movedElement) {
+			if (debugElementStatelistener) {
+				System.out.println("StorageModelProvider: elementMoved " + originalElement + " --> " + movedElement); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			// we just forward the event
+			StorageModelProvider.this.fireElementMoved(originalElement, movedElement);
+		}
+	}
+
+	/**
+	 * Collection of info that goes with a model.
+	 */
+	private class ModelInfo {
+		public IEditorInput fElement;
+		public boolean fShouldReleaseOnInfoDispose;
+		public IStructuredModel fStructuredModel;
+
+		public ModelInfo(IStructuredModel structuredModel, IEditorInput element, boolean selfCreated) {
+			fElement = element;
+			fStructuredModel = structuredModel;
+			fShouldReleaseOnInfoDispose = selfCreated;
+		}
+	}
+
+	static final boolean debugElementStatelistener = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/storagemodelprovider/elementstatelistener")); //$NON-NLS-1$ //$NON-NLS-2$
+	static final boolean debugOperations = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/storagemodelprovider/operations")); //$NON-NLS-1$ //$NON-NLS-2$
+
+	private static StorageModelProvider fInstance = null;
+
+	public synchronized static StorageModelProvider getInstance() {
+		if (fInstance == null)
+			fInstance = new StorageModelProvider();
+		return fInstance;
+	}
+
+	private IElementStateListener fInternalListener;
+	/** IStructuredModel information of all connected elements */
+	private Map fModelInfoMap = new HashMap();
+	private boolean fReuseModelDocument = true;
+
+	private StorageModelProvider() {
+		super();
+		fInternalListener = new InternalElementStateListener();
+	}
+
+	String calculateBaseLocation(IStorageEditorInput input) {
+		String location = null;
+		if (input instanceof IPathEditorInput) {
+			IPath path = ((IPathEditorInput) input).getPath();
+			if (path != null) {
+				location = path.toString();
+			}
+		}
+		if (location == null && input instanceof ILocationProvider) {
+			IPath path = ((ILocationProvider) input).getPath(input);
+			if (path != null) {
+				location = path.toString();
+			}
+		}
+		if (location == null) {
+			try {
+				IStorage storage = input.getStorage();
+				if (storage != null) {
+					IPath storagePath = storage.getFullPath();
+					String name = storage.getName();
+					if (storagePath != null) {
+						// If they are different, the IStorage contract is not
+						// being honored
+						// (https://bugs.eclipse.org/bugs/show_bug.cgi?id=73098).
+						// Favor the name.
+						if (!storagePath.lastSegment().equals(name)) {
+							IPath workingPath = storagePath.addTrailingSeparator();
+							location = workingPath.append(name).toString();
+						}
+						else {
+							location = storagePath.makeAbsolute().toString();
+						}
+					}
+					if (location == null)
+						location = name;
+				}
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+			finally {
+				if (location == null)
+					location = input.getName();
+			}
+		}
+		return location;
+	}
+
+	String calculateID(IStorageEditorInput input) {
+		/**
+		 * Typically CVS will return a path of "filename.ext" and the input's
+		 * name will be "filename.ext version". The path must be used to load
+		 * the model so that the suffix will be available to compute the
+		 * contentType properly. The editor input name can then be set as the
+		 * base location for display on the editor title bar.
+		 * 
+		 */
+		String path = null;
+		if (input instanceof ILocationProvider) {
+			IPath ipath = ((ILocationProvider) input).getPath(input);
+			if (ipath != null) {
+				path = ipath.toString();
+			}
+		}
+		if (path == null) {
+			try {
+				IStorage storage = input.getStorage();
+				if (storage != null) {
+					IPath storagePath = storage.getFullPath();
+					String name = storage.getName();
+					if (storagePath != null) {
+						// If they are different, the IStorage contract is not
+						// being honored
+						// (https://bugs.eclipse.org/bugs/show_bug.cgi?id=73098).
+						// Favor the name.
+						if (!storagePath.lastSegment().equals(name)) {
+							IPath workingPath = storagePath.addTrailingSeparator();
+							path = workingPath.append(name).toString();
+						}
+						else {
+							path = storagePath.makeAbsolute().toString();
+						}
+					}
+					if (path == null)
+						path = name;
+				}
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+			finally {
+				if (path == null)
+					path = input.getName(); //$NON-NLS-1$
+			}
+		}
+		/*
+		 * Prepend the hash to the path value so that we have a 1:1:1 match
+		 * between editor inputs, element info, and models. The editor manager
+		 * should help prevent needlessly duplicated models as long as two
+		 * editor inputs from the same storage indicate they're equals().
+		 */
+		path = input.hashCode() + "#" + path; //$NON-NLS-1$
+		return path;
+	}
+
+	// public boolean canSaveDocument(Object element) {
+	// return false;
+	// }
+
+	protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {
+		IAnnotationModel model = null;
+		if (debugOperations) {
+			if (element instanceof IStorageEditorInput)
+				System.out.println("StorageModelProvider: createAnnotationModel for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+			else
+				System.out.println("StorageModelProvider: createAnnotationModel for " + element); //$NON-NLS-1$
+		}
+		if (element instanceof IStorageEditorInput) {
+			IStorageEditorInput input = (IStorageEditorInput) element;
+			String contentType = (getModel(input) != null ? getModel(input).getContentTypeIdentifier() : null);
+			String ext = BreakpointRulerAction.getFileExtension((IEditorInput) element);
+			IResource res = BreakpointProviderBuilder.getInstance().getResource(input, contentType, ext);
+			String id = input.getName();
+			if (input.getStorage() != null && input.getStorage().getFullPath() != null) {
+				id = input.getStorage().getFullPath().toString();
+			}
+			// we can only create a resource marker annotationmodel off of a
+			// valid resource
+			if (res != null)
+				model = new StructuredResourceMarkerAnnotationModel(res, id);
+			else
+				model = new AnnotationModel();
+		}
+		if (model == null) {
+			model = super.createAnnotationModel(element);
+		}
+		return model;
+	}
+
+	protected IDocument createDocument(Object element) {
+		if (debugOperations) {
+			if (element instanceof IStorageEditorInput)
+				try {
+					System.out.println("StorageModelProvider: createDocument for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+				}
+				catch (CoreException e) {
+					System.out.println("StorageModelProvider: createDocument for " + element + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			else {
+				System.out.println("StorageModelProvider: createDocument for " + element); //$NON-NLS-1$
+			}
+		}
+
+		// The following is largely copied from FileModelProvider
+
+		IDocument document = null;
+		if (element instanceof IEditorInput) {
+			// create a new IDocument for the element; should always reflect
+			// the contents of the resource
+			ModelInfo info = getModelInfoFor((IEditorInput) element);
+			if (info == null) {
+				throw new IllegalArgumentException("no corresponding model info found"); //$NON-NLS-1$
+			}
+			IStructuredModel model = info.fStructuredModel;
+			if (model != null) {
+				if (!fReuseModelDocument && element instanceof IStorageEditorInput) {
+					Reader reader = null;
+					IStructuredDocument innerdocument = null;
+					try {
+						// update document from input's contents
+
+						CodedReaderCreator codedReaderCreator = new CodedReaderCreator(calculateID((IStorageEditorInput) element), Utilities.getMarkSupportedStream(((IStorageEditorInput) element).getStorage().getContents()));
+						reader = codedReaderCreator.getCodedReader();
+
+						innerdocument = model.getStructuredDocument();
+
+						int originalLengthToReplace = innerdocument.getLength();
+
+						/*
+						 * TODO_future: we could implement with sequential
+						 * rewrite, if we don't pickup automatically from
+						 * FileBuffer support, so not so much has to be pulled
+						 * into memory (as an extra big string), but we need
+						 * to carry that API through so that StructuredModel
+						 * is not notified until done.
+						 */
+
+						// innerdocument.startSequentialRewrite(true);
+						// innerdocument.replaceText(this, 0,
+						// innerdocument.getLength(), "");
+						StringBuffer stringBuffer = new StringBuffer();
+						int bufferSize = 2048;
+						char[] buffer = new char[bufferSize];
+						int nRead = 0;
+						boolean eof = false;
+						while (!eof) {
+							nRead = reader.read(buffer, 0, bufferSize);
+							if (nRead == -1) {
+								eof = true;
+							}
+							else {
+								stringBuffer.append(buffer, 0, nRead);
+								// innerdocument.replaceText(this,
+								// innerdocument.getLength(), 0, new
+								// String(buffer, 0, nRead));
+							}
+						}
+						// ignore read-only settings if reverting whole
+						// document
+						innerdocument.replaceText(this, 0, originalLengthToReplace, stringBuffer.toString(), true);
+						model.setDirtyState(false);
+
+					}
+					catch (CoreException e) {
+						Logger.logException(e);
+					}
+					catch (IOException e) {
+						Logger.logException(e);
+					}
+					finally {
+						if (reader != null) {
+							try {
+								reader.close();
+							}
+							catch (IOException e1) {
+								// would be highly unusual
+								Logger.logException(e1);
+							}
+						}
+						// if (innerdocument != null) {
+						// innerdocument.stopSequentialRewrite();
+						// }
+					}
+
+				}
+				if (document == null) {
+					document = model.getStructuredDocument();
+				}
+			}
+		}
+		return document;
+	}
+
+	/**
+	 * Also create ModelInfo - extra resource synchronization classes should
+	 * be stored within the ModelInfo
+	 */
+	protected ElementInfo createElementInfo(Object element) throws CoreException {
+		// create the corresponding ModelInfo if necessary
+		if (debugOperations) {
+			if (element instanceof IStorageEditorInput)
+				try {
+					System.out.println("StorageModelProvider: createElementInfo for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+				}
+				catch (CoreException e) {
+					System.out.println("StorageModelProvider: createElementInfo for " + element + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			else
+				System.out.println("storageModelProvider: createElementInfo for " + element); //$NON-NLS-1$
+		}
+
+		if (getModelInfoFor((IEditorInput) element) == null) {
+			createModelInfo((IEditorInput) element);
+		}
+
+		ElementInfo info = super.createElementInfo(element);
+		return info;
+	}
+
+	public void createModelInfo(IEditorInput input) {
+		if (getModelInfoFor(input) == null) {
+			IStructuredModel structuredModel = selfCreateModel(input);
+			if (structuredModel != null) {
+				createModelInfo(input, structuredModel, true);
+			}
+		}
+	}
+
+	/**
+	 * To be used when model is provided to us, ensures that when setInput is
+	 * used on this input, the given model will be used.
+	 */
+	public void createModelInfo(IEditorInput input, IStructuredModel structuredModel, boolean releaseModelOnDisconnect) {
+		// we have to make sure factories are added, whether we created or
+		// not.
+		if (getModelInfoFor(input) != null || getModelInfoFor(structuredModel) != null) {
+			if (debugOperations) {
+				if (input instanceof IStorageEditorInput) {
+
+					try {
+						System.out.println("StorageModelProvider: DUPLICATE createModelInfo for " + ((IStorageEditorInput) input).getStorage().getFullPath()); //$NON-NLS-1$
+					}
+					catch (CoreException e) {
+						System.out.println("StorageModelProvider: DUPLICATE createModelInfo for " + input + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+					}
+				}
+				else {
+					System.out.println("storageModelProvider: DUPLICATE createModelInfo for " + input); //$NON-NLS-1$
+				}
+			}
+			return;
+		}
+
+		if (debugOperations) {
+			if (input instanceof IStorageEditorInput) {
+				try {
+					System.out.println("StorageModelProvider: createModelInfo for " + ((IStorageEditorInput) input).getStorage().getFullPath()); //$NON-NLS-1$
+				}
+				catch (CoreException e) {
+					System.out.println("StorageModelProvider: createModelInfo for " + input + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+			else {
+				System.out.println("StorageModelProvider: createModelInfo for " + input); //$NON-NLS-1$
+			}
+		}
+
+
+		if (input instanceof IExtendedStorageEditorInput) {
+			((IExtendedStorageEditorInput) input).addElementStateListener(fInternalListener);
+		}
+
+		EditorModelUtil.addFactoriesTo(structuredModel);
+
+		ModelInfo modelInfo = new ModelInfo(structuredModel, input, releaseModelOnDisconnect);
+		fModelInfoMap.put(input, modelInfo);
+	}
+
+	protected void disposeElementInfo(Object element, ElementInfo info) {
+		if (debugOperations) {
+			if (element instanceof IStorageEditorInput) {
+				try {
+					System.out.println("StorageModelProvider: disposeElementInfo for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+				}
+				catch (CoreException e) {
+					System.out.println("StorageModelProvider: disposeElementInfo for " + element + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+			else {
+				System.out.println("StorageModelProvider: disposeElementInfo for " + element); //$NON-NLS-1$
+			}
+		}
+
+		if (element instanceof IEditorInput) {
+			IEditorInput input = (IEditorInput) element;
+			ModelInfo modelInfo = getModelInfoFor(input);
+			disposeModelInfo(modelInfo);
+		}
+		super.disposeElementInfo(element, info);
+	}
+
+	/**
+	 * disconnect from this model info
+	 * 
+	 * @param info
+	 */
+	public void disposeModelInfo(ModelInfo info) {
+		if (debugOperations) {
+			if (info.fElement instanceof IStorageEditorInput) {
+				try {
+					System.out.println("StorageModelProvider: disposeModelInfo for " + ((IStorageEditorInput) info.fElement).getStorage().getFullPath()); //$NON-NLS-1$
+				}
+				catch (CoreException e) {
+					System.out.println("StorageModelProvider: disposeModelInfo for " + info.fElement + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+			else {
+				System.out.println("StorageModelProvider: disposeModelInfo for " + info.fElement); //$NON-NLS-1$
+			}
+		}
+
+		if (info.fElement instanceof IStorageEditorInput) {
+			if (info.fElement instanceof IExtendedStorageEditorInput) {
+				((IExtendedStorageEditorInput) info.fElement).removeElementStateListener(fInternalListener);
+			}
+			if (info.fShouldReleaseOnInfoDispose) {
+				info.fStructuredModel.releaseFromEdit();
+			}
+		}
+		fModelInfoMap.remove(info.fElement);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doResetDocument(java.lang.Object,
+	 *      org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected void doResetDocument(Object element, IProgressMonitor monitor) throws CoreException {
+		fReuseModelDocument = false;
+		super.doResetDocument(element, monitor);
+		fReuseModelDocument = true;
+	}
+
+	/**
+	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doSaveDocument(org.eclipse.core.runtime.IProgressMonitor,
+	 *      java.lang.Object, org.eclipse.jface.text.IDocument, boolean)
+	 */
+	protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {
+		IDocumentProvider provider = null;
+		// BUG119211 - try to use registered document provider if possible
+		if (element instanceof IEditorInput) {
+			provider = DocumentProviderRegistry.getDefault().getDocumentProvider((IEditorInput) element);
+		}
+		if (provider == null)
+			provider = new FileDocumentProvider();
+		provider.saveDocument(monitor, element, document, overwrite);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.editors.text.StorageDocumentProvider#getPersistedEncoding(java.lang.Object)
+	 */
+	protected String getPersistedEncoding(Object element) {
+		String charset = super.getPersistedEncoding(element);
+		if (charset == null && element instanceof IStorageEditorInput) {
+			IStorage storage;
+			try {
+				storage = ((IStorageEditorInput) element).getStorage();
+				if (storage != null && !(storage instanceof IEncodedStorage)) {
+					InputStream contents = null;
+					try {
+						contents = storage.getContents();
+						if (contents != null) {
+							QualifiedName[] detectionOptions = new QualifiedName[]{IContentDescription.BYTE_ORDER_MARK, IContentDescription.CHARSET};
+							IContentDescription description = Platform.getContentTypeManager().getDescriptionFor(contents, storage.getName(), detectionOptions);
+							if (description != null) {
+								charset = description.getCharset();
+							}
+						}
+
+					}
+					catch (IOException e) {
+					}
+					finally {
+						if (contents != null)
+							try {
+								contents.close();
+							}
+							catch (IOException e) {
+								// do nothing
+							}
+					}
+				}
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+		return charset;
+	}
+
+	public IStructuredModel getModel(IEditorInput element) {
+		IStructuredModel result = null;
+		ModelInfo info = getModelInfoFor(element);
+		if (info != null) {
+			result = info.fStructuredModel;
+		}
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.IModelProvider#getModel(java.lang.Object)
+	 */
+	public IStructuredModel getModel(Object element) {
+		if (element instanceof IEditorInput)
+			return getModel((IEditorInput) element);
+		return null;
+	}
+
+	private ModelInfo getModelInfoFor(IEditorInput element) {
+		ModelInfo result = (ModelInfo) fModelInfoMap.get(element);
+		return result;
+	}
+
+	private ModelInfo getModelInfoFor(IStructuredModel structuredModel) {
+		ModelInfo result = null;
+		if (structuredModel != null) {
+			ModelInfo[] modelInfos = (ModelInfo[]) fModelInfoMap.values().toArray(new ModelInfo[0]);
+			for (int i = 0; i < modelInfos.length; i++) {
+				ModelInfo info = modelInfos[i];
+				if (structuredModel.equals(info.fStructuredModel)) {
+					result = info;
+					break;
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Method loadModel.
+	 * 
+	 * @param input
+	 * @return IStructuredModel
+	 */
+	public IStructuredModel loadModel(IStorageEditorInput input) {
+		return loadModel(input, false);
+	}
+
+	/**
+	 * Method loadModel.
+	 * 
+	 * @param input
+	 * @param logExceptions
+	 * @return IStructuredModel
+	 */
+	public IStructuredModel loadModel(IStorageEditorInput input, boolean logExceptions) {
+		String id = calculateID(input);
+		if (id == null) {
+			return null;
+		}
+
+		InputStream contents = null;
+		try {
+			contents = input.getStorage().getContents();
+		}
+		catch (CoreException noStorageExc) {
+			if (logExceptions)
+				Logger.logException(NLS.bind(SSEUIMessages._32concat_EXC_, new Object[]{input.getName()}), noStorageExc);
+		}
+
+		IStructuredModel model = null;
+		try {
+			// first parameter must be unique
+			model = StructuredModelManager.getModelManager().getModelForEdit(id, contents, null);
+			model.setBaseLocation(calculateBaseLocation(input));
+		}
+		catch (IOException e) {
+			if (logExceptions)
+				Logger.logException(NLS.bind(SSEUIMessages._32concat_EXC_, new Object[]{input}), e);
+		}
+		finally {
+			if (contents != null) {
+				try {
+					contents.close();
+				}
+				catch (IOException e) {
+					// nothing
+				}
+				catch (Exception e) {
+					Logger.logException(e);
+				}
+			}
+		}
+		return model;
+	}
+
+	/**
+	 * @param input
+	 * @return
+	 */
+	private IStructuredModel selfCreateModel(IEditorInput input) {
+		return loadModel((IStorageEditorInput) input);
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredDocumentToTextAdapter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredDocumentToTextAdapter.java
new file mode 100644
index 0000000..4a276fd
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredDocumentToTextAdapter.java
@@ -0,0 +1,1332 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.jobs.ILock;
+import org.eclipse.jface.text.AbstractDocument;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.ConfigurableLineTracker;
+import org.eclipse.jface.text.DefaultLineTracker;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentAdapter;
+import org.eclipse.jface.text.IDocumentAdapterExtension;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.IRepairableDocument;
+import org.eclipse.jface.text.ITextStore;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.projection.ProjectionDocument;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.TextChangeListener;
+import org.eclipse.swt.custom.TextChangedEvent;
+import org.eclipse.swt.custom.TextChangingEvent;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.internal.ILockable;
+import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
+import org.eclipse.wst.sse.core.internal.provisional.events.NewDocumentEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.core.internal.util.Utilities;
+import org.eclipse.wst.sse.ui.internal.util.Assert;
+
+
+/**
+ * Adapts IStructuredDocument events and methods to StyledTextContent events
+ * and methods
+ */
+public class StructuredDocumentToTextAdapter implements IDocumentAdapter, IDocumentAdapterExtension {
+
+	private class DocumentClone extends AbstractDocument {
+
+
+		/**
+		 * Creates a new document clone with the given content.
+		 * 
+		 * @param content
+		 *            the content
+		 * @param lineDelimiters
+		 *            the line delimiters
+		 */
+		public DocumentClone(String content, String[] lineDelimiters) {
+			super();
+			setTextStore(new StringTextStore(content));
+			ConfigurableLineTracker tracker = new ConfigurableLineTracker(lineDelimiters);
+			setLineTracker(tracker);
+			getTracker().set(content);
+			completeInitialization();
+		}
+	}
+
+	// A pre-notification listener for the viewer's Document
+	class DocumentListener implements IDocumentListener {
+		protected boolean allTextChanged = false;
+
+		protected DocumentEvent currentEvent;
+
+		synchronized public void documentAboutToBeChanged(DocumentEvent event) {
+			if (isStoppedForwardingChanges())
+				return;
+
+			pendingDocumentChangedEvent = true;
+			allTextChanged = event.getOffset() <= 0 && event.getLength() >= StructuredDocumentToTextAdapter.this.getDocument().getLength();
+			currentEvent = event;
+
+			StructuredDocumentToTextAdapter.this.relayTextChanging(event.getOffset(), event.getLength(), event.getText());
+		}
+
+		synchronized public void documentChanged(DocumentEvent event) {
+			if (isStoppedForwardingChanges())
+				return;
+
+			if (currentEvent != null && event == currentEvent) {
+				if (allTextChanged) {
+					StructuredDocumentToTextAdapter.this.relayTextSet();
+				}
+				else {
+					// temp work around for immediate thread
+					// problem.
+					// should have more general solution
+					// soon. 'syncExec' are rumored to be
+					// prone to hang.
+					StructuredDocumentToTextAdapter.this.relayTextChanged();
+				}
+			}
+
+			currentEvent = null;
+			pendingDocumentChangedEvent = false;
+			handlePendingEvents();
+			lastEvent = null;
+
+		}
+	}
+
+	private static class StringTextStore implements ITextStore {
+
+		private String fContent;
+
+		/**
+		 * Creates a new string text store with the given content.
+		 * 
+		 * @param content
+		 *            the content
+		 */
+		public StringTextStore(String content) {
+			Assert.isNotNull(content, "content can not be null when setting text store"); //$NON-NLS-1$
+			fContent = content;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextStore#get(int)
+		 */
+		public char get(int offset) {
+			return fContent.charAt(offset);
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextStore#get(int, int)
+		 */
+		public String get(int offset, int length) {
+			return fContent.substring(offset, offset + length);
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextStore#getLength()
+		 */
+		public int getLength() {
+			return fContent.length();
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextStore#replace(int, int,
+		 *      java.lang.String)
+		 */
+		public void replace(int offset, int length, String text) {
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextStore#set(java.lang.String)
+		 */
+		public void set(String text) {
+		}
+
+	}
+
+	/**
+	 * Changes to the Document/IStructuredDocument can extend beyond the text
+	 * change area and require more redrawing to keep the hilighting correct.
+	 * The event must be saved so that the redraw is only sent after a
+	 * textChanged event is received.
+	 */
+	class StructuredDocumentListener implements IStructuredDocumentListener {
+
+		public void newModel(NewDocumentEvent structuredDocumentEvent) {
+
+			if (isStoppedForwardingChanges()) {
+				// if
+				// (StructuredDocumentToTextAdapter.this.fStopRelayingChanges)
+				// {
+				if (Debug.debugStructuredDocument) {
+					System.out.println("skipped relaying StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+				}
+				return;
+			}
+			// should use textSet when all contents have
+			// changed
+			// otherwise need to use the pair of
+			// textChanging and
+			// textChanged.
+			StructuredDocumentToTextAdapter.this.lastEvent = structuredDocumentEvent;
+		}
+
+		public void noChange(final NoChangeEvent structuredDocumentEvent) {
+
+			if (Debug.debugStructuredDocument) {
+				System.out.println("skipped relaying StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+			}
+			if (structuredDocumentEvent.reason == NoChangeEvent.READ_ONLY_STATE_CHANGE) {
+				if (pendingDocumentChangedEvent) {
+					if (lastEventQueue == null) {
+						lastEventQueue = new ArrayList();
+					}
+					lastEventQueue.add(structuredDocumentEvent);
+				}
+				else {
+					StructuredDocumentToTextAdapter.this.lastEvent = structuredDocumentEvent;
+				}
+			}
+		}
+
+		public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {
+
+			if (isStoppedForwardingChanges()) {
+				// if
+				// (StructuredDocumentToTextAdapter.this.fStopRelayingChanges)
+				// {
+				if (Debug.debugStructuredDocument) {
+					System.out.println("not relaying StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+				}
+				return;
+			}
+			if (Debug.debugStructuredDocument) {
+				System.out.println("saving StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+			}
+			StructuredDocumentToTextAdapter.this.lastEvent = structuredDocumentEvent;
+		}
+
+		public void regionChanged(RegionChangedEvent structuredDocumentEvent) {
+
+			if (isStoppedForwardingChanges()) {
+				// if
+				// (StructuredDocumentToTextAdapter.this.fStopRelayingChanges)
+				// {
+				if (Debug.debugStructuredDocument) {
+					System.out.println("not relaying StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+				}
+				return;
+			}
+			if (Debug.debugStructuredDocument) {
+				System.out.println("saving StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+			}
+			StructuredDocumentToTextAdapter.this.lastEvent = structuredDocumentEvent;
+		}
+
+		public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {
+
+			if (isStoppedForwardingChanges()) {
+				// if
+				// (StructuredDocumentToTextAdapter.this.fStopRelayingChanges)
+				// {
+				if (Debug.debugStructuredDocument) {
+					System.out.println("not relaying StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+				}
+				return;
+			}
+			if (Debug.debugStructuredDocument) {
+				System.out.println("saving StructuredDocumentEvent " + structuredDocumentEvent.getClass().getName()); //$NON-NLS-1$
+			}
+			StructuredDocumentToTextAdapter.this.lastEvent = structuredDocumentEvent;
+		}
+	}
+
+	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+
+	private final static boolean redrawBackground = true;
+
+	/** The visible child document. */
+	private ProjectionDocument fChildDocument;
+
+	/** The master document */
+	private IDocument fDocument;
+	/** The document clone for the non-forwarding case. */
+	private IDocument fDocumentClone;
+
+	// only use this temp work around if on GTK
+	// it causes funny "cursor blinking" if used on windows
+	private final boolean forceRedrawOnRegionChanged = Platform.getWS().equals("gtk"); //$NON-NLS-1$
+	/** The original content */
+	private String fOriginalContent;
+	/** The original line delimiters */
+	private String[] fOriginalLineDelimiters;
+
+	private int fStopRelayingChangesRequests = 0;
+
+	private StyledText fStyledTextWidget;
+
+	/** The registered text changed listeners */
+	TextChangeListener[] fTextChangeListeners;
+	protected DocumentListener internalDocumentListener;
+
+	// The listeners for relaying DocumentEvents and
+	// requesting repaints
+	// after modification
+	private IStructuredDocumentListener internalStructuredDocumentListener;
+
+	protected StructuredDocumentEvent lastEvent = null;
+	List lastEventQueue;
+	boolean pendingDocumentChangedEvent;
+
+	private static final boolean DEBUG = false;
+
+	/**
+	 * TEST ONLY - TEST ONLY - TEST ONLY NOT API use this constructor only for
+	 * tests. Creates a new document adapter which is initiallly not connected
+	 * to any document.
+	 */
+	public StructuredDocumentToTextAdapter() {
+
+		internalStructuredDocumentListener = new StructuredDocumentListener();
+		internalDocumentListener = new DocumentListener();
+		// for testing only
+		// setDocument(getModelManager().createStructuredDocumentFor(ContentTypeIdentifierForXML.ContentTypeID_XML));
+	}
+
+	/**
+	 * Creates a new document adapter which is initiallly not connected to any
+	 * document.
+	 */
+	public StructuredDocumentToTextAdapter(StyledText styledTextWidget) {
+
+		// do not use 'this()' in this case
+		super();
+		internalStructuredDocumentListener = new StructuredDocumentListener();
+		internalDocumentListener = new DocumentListener();
+		fStyledTextWidget = styledTextWidget;
+	}
+
+	private void _setDocument(IDocument newDoc) {
+		if (fDocument instanceof IStructuredDocument) {
+			((IStructuredDocument) fDocument).removeDocumentChangedListener(internalStructuredDocumentListener);
+		}
+		fDocument = newDoc;
+		if (!isStoppedForwardingChanges()) {
+			fDocumentClone = null;
+			fOriginalContent = getDocument() != null ? getDocument().get() : null;
+			fOriginalLineDelimiters = getDocument() != null ? getDocument().getLegalLineDelimiters() : null;
+		}
+
+		if (DEBUG && fDocument != null && !(fDocument instanceof ILockable)) {
+
+			System.out.println("Warning: non ILockable document used in StructuredDocumentToTextAdapter"); //$NON-NLS-1$
+			System.out.println("         document updates on non-display thread will not be safe if editor open"); //$NON-NLS-1$
+		}
+		if (fDocument instanceof IStructuredDocument) {
+			((IStructuredDocument) fDocument).addDocumentChangedListener(internalStructuredDocumentListener);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.custom.StyledTextContent#addTextChangeListener(org.eclipse.swt.custom.TextChangeListener)
+	 */
+	public synchronized void addTextChangeListener(TextChangeListener listener) {
+
+		// make sure listener is not already in listening
+		// (and if it is, print a warning to aid debugging,
+		// if needed)
+
+		if (Utilities.contains(fTextChangeListeners, listener)) {
+			if (Debug.displayWarnings) {
+				System.out.println("StructuredDocumentToTextAdapter::addTextChangedListeners. listener " + listener + " was added more than once. "); //$NON-NLS-2$//$NON-NLS-1$
+			}
+		}
+		else {
+			if (Debug.debugStructuredDocument) {
+				System.out.println("StructuredDocumentToTextAdapter::addTextChangedListeners. Adding an instance of " + listener.getClass() + " as a listener on text adapter."); //$NON-NLS-2$//$NON-NLS-1$
+			}
+			int oldSize = 0;
+			if (fTextChangeListeners != null) {
+				// normally won't be null, but we need to be
+				// sure, for first time through
+				oldSize = fTextChangeListeners.length;
+			}
+			int newSize = oldSize + 1;
+			TextChangeListener[] newListeners = new TextChangeListener[newSize];
+			if (fTextChangeListeners != null) {
+				System.arraycopy(fTextChangeListeners, 0, newListeners, 0, oldSize);
+			}
+			// add listener to last position
+			newListeners[newSize - 1] = listener;
+			//
+			// now switch new for old
+			fTextChangeListeners = newListeners;
+			//
+		}
+	}
+
+	/*
+	 * @see org.eclipse.swt.custom.StyledTextContent#getCharCount()
+	 */
+	public int getCharCount() {
+
+		// getDocument can sometimes be null during startup
+		// and dispose
+		int result = 0;
+		IDocument doc = getDocument();
+		if (doc != null) {
+			result = getSafeDocument().getLength();
+		}
+		return result;
+	}
+
+	private IDocument getClonedDocument() {
+		if (fDocumentClone == null) {
+			String content = fOriginalContent == null ? "" : fOriginalContent; //$NON-NLS-1$
+			String[] delims = fOriginalLineDelimiters == null ? DefaultLineTracker.DELIMITERS : fOriginalLineDelimiters;
+			fDocumentClone = new DocumentClone(content, delims);
+		}
+		return fDocumentClone;
+	}
+
+	Display getDisplay() {
+
+		// Note: the workbench should always have a display
+		// (unless running headless), whereas Display.getCurrent()
+		// only returns the display if the currently executing thread
+		// has one.
+		if (PlatformUI.isWorkbenchRunning())
+			return PlatformUI.getWorkbench().getDisplay();
+		else
+			return null;
+	}
+
+	/**
+	 * Returns the visible document.
+	 * 
+	 * @return IDocument
+	 */
+	protected IDocument getDocument() {
+
+		if (fChildDocument == null)
+			return fDocument;
+		return fChildDocument;
+	}
+
+	/**
+	 * Returns region in master document of given region (should be region in
+	 * projection document)
+	 * 
+	 * @return region if no projection document exists, region of master
+	 *         document if possible, null otherwise
+	 */
+	private IRegion getProjectionToMasterRegion(IRegion region) {
+		IRegion originalRegion = region;
+		if (fChildDocument != null) {
+			try {
+				originalRegion = fChildDocument.getProjectionMapping().toOriginRegion(region);
+			}
+			catch (BadLocationException e) {
+				Logger.logException(e);
+			}
+		}
+
+		return originalRegion;
+	}
+
+	/**
+	 * Returns offset in projection document of given offset (should be offset
+	 * in master document)
+	 * 
+	 * @return offset if no projection document exists, offset of projection
+	 *         document if possible, -1 otherwise
+	 */
+	private int getMasterToProjectionOffset(int offset) {
+		int originalOffset = offset;
+		if (fChildDocument != null) {
+			try {
+				originalOffset = fChildDocument.getProjectionMapping().toImageOffset(offset);
+			}
+			catch (BadLocationException e) {
+				Logger.logException(e);
+			}
+		}
+
+		return originalOffset;
+	}
+
+	/**
+	 * Return the line at the given character offset without delimiters.
+	 * <p>
+	 * 
+	 * @param offset
+	 *            offset of the line to return. Does not include delimiters of
+	 *            preceeding lines. Offset 0 is the first character of the
+	 *            document.
+	 * @return the line text without delimiters
+	 */
+	public java.lang.String getLine(int lineNumber) {
+
+		String result = null;
+		if (lineNumber >= getLineCount()) {
+			if (Debug.displayWarnings) {
+				System.out.println("Development Debug: IStructuredDocument:getLine() error. lineNumber requested (" + lineNumber + ") was greater than number of lines(" + getLineCount() + "). EmptyString returned"); //$NON-NLS-1$//$NON-NLS-3$//$NON-NLS-2$
+			}
+			result = EMPTY_STRING;
+		}
+		else {
+			IDocument doc = getSafeDocument();
+			if (doc == null) {
+				result = EMPTY_STRING;
+			}
+			else {
+				try {
+					IRegion r = doc.getLineInformation(lineNumber);
+					if (r.getLength() > 0) {
+						result = doc.get(r.getOffset(), r.getLength());
+					}
+					else {
+						result = EMPTY_STRING;
+					}
+				}
+				catch (BadLocationException e) {
+					result = EMPTY_STRING;
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Tries to repair the line information.
+	 * 
+	 * @param document
+	 *            the document
+	 * @see IRepairableDocument#repairLineInformation()
+	 * @see Eclipse 3.0
+	 */
+	private void repairLineInformation(IDocument document) {
+		if (document instanceof IRepairableDocument) {
+			IRepairableDocument repairable = (IRepairableDocument) document;
+			repairable.repairLineInformation();
+		}
+	}
+
+	/**
+	 * Return the line index at the given character offset.
+	 * <p>
+	 * 
+	 * @param offset
+	 *            offset of the line to return. The first character of the
+	 *            document is at offset 0. An offset of getLength() is valid
+	 *            and should answer the number of lines.
+	 * @return the line index. The first line is at index 0. If the character
+	 *         at offset is a delimiter character, answer the line index of
+	 *         the line that is delimited. For example, text = "\r\n\r\n",
+	 *         delimiter = "\r\n", then: getLineAtOffset(0) == 0
+	 *         getLineAtOffset(1) == 0 getLineAtOffset(2) == 1
+	 *         getLineAtOffset(3) == 1 getLineAtOffset(4) == 2
+	 */
+	public int getLineAtOffset(int offset) {
+
+		int result = 0;
+		IDocument doc = getSafeDocument();
+		if (doc != null) {
+			try {
+				result = doc.getLineOfOffset(offset);
+			}
+			catch (BadLocationException x) {
+				repairLineInformation(doc);
+				try {
+					result = doc.getLineOfOffset(offset);
+				}
+				catch (BadLocationException x2) {
+					// should not occur, but seems to for projection
+					// documents, related to repainting overview ruler
+					result = 0;
+				}
+			}
+		}
+		return result;
+	}
+
+	public int getLineCount() {
+		int result = 0;
+		IDocument doc = getSafeDocument();
+		if (doc != null) {
+			result = doc.getNumberOfLines();
+		}
+		return result;
+	}
+
+	/*
+	 * @see org.eclipse.swt.custom.StyledTextContent#getLineDelimiter
+	 */
+	public String getLineDelimiter() {
+		String result = null;
+		if (getParentDocument() instanceof IStructuredDocument) {
+			result = ((IStructuredDocument) getParentDocument()).getLineDelimiter();
+		}
+		else {
+			IDocument doc = getSafeDocument();
+			result = TextUtilities.getDefaultLineDelimiter(doc);
+		}
+		return result;
+	}
+
+	/**
+	 * Return the character offset of the first character of the given line.
+	 * <p>
+	 * 
+	 * @param lineIndex
+	 *            index of the line. The first line is at index 0.
+	 * @return offset offset of the first character of the line. The first
+	 *         character of the document is at offset 0. The return value
+	 *         should include line delimiters. For example, text =
+	 *         "\r\ntest\r\n", delimiter = "\r\n", then: getOffsetAtLine(0) ==
+	 *         0 getOffsetAtLine(1) == 2 getOffsetAtLine(2) == 8 NOTE: When
+	 *         there is no text (i.e., no lines), getOffsetAtLine(0) is a
+	 *         valid call that should return 0.
+	 */
+	public int getOffsetAtLine(int lineIndex) {
+
+		int result = 0;
+		IDocument doc = getSafeDocument();
+		if (doc != null) {
+			try {
+				result = doc.getLineOffset(lineIndex);
+			}
+			catch (BadLocationException e) {
+				result = 0;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Returns the parent document
+	 * 
+	 * @return the parent document
+	 */
+	private IDocument getParentDocument() {
+		return fDocument;
+	}
+
+	/**
+	 * This is the document to use for request from the StyledText widget. Its
+	 * either the live documnet or a clone of it, depending on stop/resume
+	 * state.
+	 */
+	private IDocument getSafeDocument() {
+		IDocument result = null;
+		if (isStoppedForwardingChanges()) {
+			result = getClonedDocument();
+		}
+		else {
+			// note, this document can be normal structured text document,
+			// or the projection/child document
+			result = getDocument();
+		}
+		return result;
+	}
+
+	/**
+	 * @return org.eclipse.swt.custom.StyledText
+	 */
+	StyledText getStyledTextWidget() {
+		return fStyledTextWidget;
+	}
+
+	/**
+	 * Returns a string representing the content at the given range.
+	 * <p>
+	 * 
+	 * @param start
+	 *            the start offset of the text to return. Offset 0 is the
+	 *            first character of the document.
+	 * @param length
+	 *            the length of the text to return
+	 * @return the text at the given range
+	 */
+	public String getTextRange(int start, int length) {
+		String result = null;
+		try {
+			IDocument doc = getSafeDocument();
+			result = doc.get(start, length);
+		}
+		catch (BadLocationException e) {
+			result = EMPTY_STRING;
+		}
+		return result;
+	}
+
+	/**
+	 * assume only for "no change" events, for now
+	 */
+	protected void handlePendingEvents() {
+
+		if (lastEventQueue == null)
+			return;
+
+		Iterator iterator = lastEventQueue.iterator();
+		while (iterator.hasNext()) {
+			NoChangeEvent noChangeEvent = (NoChangeEvent) iterator.next();
+			redrawNoChange(noChangeEvent);
+		}
+
+		lastEventQueue = null;
+		lastEvent = null;
+	}
+
+	boolean isStoppedForwardingChanges() {
+		return fStopRelayingChangesRequests > 0;
+	}
+
+	/**
+	 * this method is assumed to be called only for read only region changes.
+	 */
+	protected void redrawNoChange(NoChangeEvent structuredDocumentEvent) {
+
+		if (isStoppedForwardingChanges())
+			return;
+		if (Debug.debugStructuredDocument) {
+			System.out.println("maybe redraw stuff"); //$NON-NLS-1$
+		}
+
+		int startOffset = structuredDocumentEvent.getOffset();
+		int length = structuredDocumentEvent.getLength();
+		redrawRangeWithLength(startOffset, length);
+
+	}
+
+	/**
+	 * Request a redraw of the text range occupied by the given
+	 * StructuredDocumentRegionsReplacedEvent
+	 * 
+	 * @param structuredDocumentEvent
+	 */
+	protected void redrawNodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {
+
+		if (isStoppedForwardingChanges())
+			return;
+		if (Debug.debugStructuredDocument) {
+			System.out.println("maybe redraw stuff"); //$NON-NLS-1$
+		}
+		// just the new stuff
+		IStructuredDocumentRegionList newStructuredDocumentRegions = structuredDocumentEvent.getNewStructuredDocumentRegions();
+
+		int nNewNodes = newStructuredDocumentRegions.getLength();
+		if (nNewNodes > 0) {
+			IStructuredDocumentRegion firstNode = newStructuredDocumentRegions.item(0);
+			IStructuredDocumentRegion lastNode = newStructuredDocumentRegions.item(nNewNodes - 1);
+			redrawRange(firstNode.getStartOffset(), lastNode.getEndOffset());
+		}
+	}
+
+	/**
+	 * Redraws the give offsets in terms of the StructuredDocument. If only
+	 * part of the model is visible, ensures that only the visible portion of
+	 * the given range is redrawn.
+	 * 
+	 * @param startModelOffset
+	 * @param endModelOffset
+	 */
+	private void redrawRange(final int startModelOffset, final int endModelOffset) {
+
+		if (getDocument() == null)
+			return;
+		if (Debug.debugStructuredDocument) {
+			System.out.println("redraw stuff: " + startModelOffset + "-" + endModelOffset); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		if (fChildDocument == null) {
+			Runnable runnable = new Runnable() {
+				public void run() {
+					getStyledTextWidget().redrawRange(startModelOffset, endModelOffset - startModelOffset, redrawBackground);
+				}
+			};
+			runOnDisplayThreadIfNeedede(runnable);
+
+		}
+		else {
+			int high = getDocument().getLength();
+			int startOffset = getMasterToProjectionOffset(startModelOffset);
+
+			int endOffset = getMasterToProjectionOffset(endModelOffset);
+
+			// if offsets were not visible, just try to redraw everything in
+			// the child document
+			// // not visible
+			// if (endOffset < 0 || startOffset > high)
+			// return;
+			// restrict lower bound
+			if (startOffset < 0) {
+				startOffset = 0;
+			}
+			// restrict upper bound
+			// if (endOffset > high) {
+			// endOffset = high;
+			// }
+			if (endOffset < 0) {
+				endOffset = high;
+			}
+
+			int length = endOffset - startOffset;
+			// redrawBackground with false would be faster
+			// but assumes background (or font) is not
+			// changing
+			final int finalStartOffset = startOffset;
+			final int finallength = length;
+
+			Runnable runnable = new Runnable() {
+				public void run() {
+					getStyledTextWidget().redrawRange(finalStartOffset, finallength, redrawBackground);
+				}
+			};
+			runOnDisplayThreadIfNeedede(runnable);
+
+		}
+	}
+
+	/**
+	 * Redraws the give offsets in terms of the Flat Node model. If only part
+	 * of the model is visible, ensures that only the visible portion of the
+	 * given range is redrawn.
+	 * 
+	 * @param startModelOffset
+	 * @param endModelOffset
+	 */
+	private void redrawRangeWithLength(final int startModelOffset, final int length) {
+
+		if (getDocument() == null)
+			return;
+		if (Debug.debugStructuredDocument) {
+			System.out.println("redraw stuff: " + startModelOffset + "-" + length); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		if (fChildDocument == null) {
+			Runnable runnable = new Runnable() {
+				public void run() {
+					getStyledTextWidget().redrawRange(startModelOffset, length, redrawBackground);
+				}
+			};
+			runOnDisplayThreadIfNeedede(runnable);
+		}
+		else {
+			int high = getDocument().getLength();
+			// TODO need to take into account segmented visible regions
+			int startOffset = getMasterToProjectionOffset(startModelOffset);
+			// not visible
+			if (startOffset > high || length < 1)
+				return;
+			// restrict lower bound
+			if (startOffset < 0) {
+				startOffset = 0;
+			}
+			int endOffset = startOffset + length - 1;
+			// restrict upper bound
+			if (endOffset > high) {
+				endOffset = high;
+			}
+
+			// note: length of the child documnet should be
+			// updated,
+			// need to investigate why its not at this
+			// point, but is
+			// probably just because the document event
+			// handling is not
+			// completely finished.
+			int newLength = endOffset - startOffset; // d283007
+
+			// redrawBackground with false would be faster
+			// but assumes background (or font) is not
+			// changing
+			final int finalStartOffset = startOffset;
+			final int finalNewLength = newLength;
+			Runnable runnable = new Runnable() {
+				public void run() {
+					getStyledTextWidget().redrawRange(finalStartOffset, finalNewLength, redrawBackground);
+				}
+			};
+			runOnDisplayThreadIfNeedede(runnable);
+		}
+	}
+
+	/**
+	 * Request a redraw of the text range occupied by the given
+	 * RegionChangedEvent for certain (not all) ITextRegion contexts
+	 * 
+	 * @param structuredDocumentEvent
+	 */
+	protected void redrawRegionChanged(RegionChangedEvent structuredDocumentEvent) {
+
+		if (isStoppedForwardingChanges()) {
+			return;
+		}
+		if (Debug.debugStructuredDocument) {
+			System.out.println("maybe redraw stuff"); //$NON-NLS-1$
+		}
+
+
+		// (nsd) TODO: try to make this reliable somehow
+		// without being directly content dependent
+		// if ((region instanceof ITextRegionContainer) ||
+		// (type == XMLJSPRegionContexts.BLOCK_TEXT) ||
+		// (type == XMLJSPRegionContexts.JSP_CONTENT)) {
+		// IStructuredDocumentRegion flatNode =
+		// structuredDocumentEvent.getStructuredDocumentRegion();
+		// // redraw background of false is faster,
+		// // but assumes background (or font) is not
+		// changing
+		// redrawRange(flatNode.getStartOffset(region),
+		// flatNode.getEndOffset(region));
+		// }
+		if (forceRedrawOnRegionChanged) {
+			// workaround for redrawing problems on Linux-GTK
+			int startOffset = structuredDocumentEvent.getOffset();
+			int endOffset = structuredDocumentEvent.getOffset() + structuredDocumentEvent.getLength();
+			try {
+				IRegion startLine = structuredDocumentEvent.fDocument.getLineInformationOfOffset(startOffset);
+				IRegion endLine = structuredDocumentEvent.fDocument.getLineInformationOfOffset(endOffset);
+				if (startLine != null && endLine != null) {
+					redrawRange(startLine.getOffset(), endLine.getOffset() + endLine.getLength());
+				}
+			}
+			catch (BadLocationException e) {
+				// nothing for now
+			}
+		}
+	}
+
+	/**
+	 * Request a redraw of the text range occupied by the given
+	 * RegionsReplacedEvent
+	 * 
+	 * @param structuredDocumentEvent
+	 */
+	protected void redrawRegionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {
+
+		if (isStoppedForwardingChanges())
+			return;
+		if (Debug.debugStructuredDocument) {
+			System.out.println("maybe redraw stuff"); //$NON-NLS-1$
+		}
+		ITextRegionList newRegions = structuredDocumentEvent.getNewRegions();
+		int nRegions = newRegions.size();
+		if (nRegions > 0) {
+			ITextRegion firstRegion = newRegions.get(0);
+			ITextRegion lastRegion = newRegions.get(nRegions - 1);
+			IStructuredDocumentRegion flatNode = structuredDocumentEvent.getStructuredDocumentRegion();
+			redrawRange(flatNode.getStartOffset(firstRegion), flatNode.getEndOffset(lastRegion));
+		}
+	}
+
+	protected void redrawTextChanged() {
+
+		if (lastEvent != null) {
+			// update display, since some cases can effect
+			// highlighting beyond the changed text area.
+			if (lastEvent instanceof StructuredDocumentRegionsReplacedEvent)
+				redrawNodesReplaced((StructuredDocumentRegionsReplacedEvent) lastEvent);
+			if (lastEvent instanceof RegionsReplacedEvent)
+				redrawRegionsReplaced((RegionsReplacedEvent) lastEvent);
+			if (lastEvent instanceof RegionChangedEvent)
+				redrawRegionChanged((RegionChangedEvent) lastEvent);
+			// moved following line to 'document changed' so
+			// the "last event" can be
+			// re-drawn after pending re-draws
+			// lastEvent = null;
+		}
+	}
+
+	/**
+	 * Sends a text replace event to all registered listeners.
+	 */
+	protected void relayTextChanged() {
+
+		if (isStoppedForwardingChanges()) {
+			if (Debug.debugStructuredDocument && getDocument() != null) {
+				System.out.println("NOT relaying text changed (" + getDocument().getLength() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			return;
+		}
+		if (Debug.debugStructuredDocument && getDocument() != null) {
+			System.out.println("relaying text changed (" + getDocument().getLength() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		final TextChangedEvent textChangedEvent = new TextChangedEvent(this);
+
+		// we must assign listeners to local variable, since
+		// the add and remove listener
+		// methods can change the actual instance of the
+		// listener array from another thread
+
+		Runnable runnable = new Runnable() {
+			public void run() {
+				if (fTextChangeListeners != null) {
+					Object[] holdListeners = fTextChangeListeners;
+					for (int i = 0; i < holdListeners.length; i++) {
+						// this is a safe cast, since addListeners
+						// requires a IStructuredDocumentListener
+						((TextChangeListener) holdListeners[i]).textChanged(textChangedEvent);
+					}
+				}
+			}
+		};
+		runOnDisplayThreadIfNeedede(runnable);
+		redrawTextChanged();
+	}
+
+	/**
+	 * Sends a text change to all registered listeners
+	 */
+	protected void relayTextChanging(int requestedStart, int requestedLength, String requestedChange) {
+
+		if (getDocument() == null)
+			return;
+		if (isStoppedForwardingChanges()) {
+			if (Debug.debugStructuredDocument && getDocument() != null) {
+				System.out.println("NOT relaying text changing: " + requestedStart + ":" + getDocument().getLength()); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			return;
+		}
+		if (Debug.debugStructuredDocument && getDocument() != null) {
+			System.out.println("relaying text changing: " + requestedStart + ":" + getDocument().getLength()); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		lastEvent = null;
+		try {
+			final TextChangingEvent textChangingEvent = new TextChangingEvent(this);
+
+			textChangingEvent.start = requestedStart;
+			textChangingEvent.replaceCharCount = requestedLength;
+			textChangingEvent.newCharCount = (requestedChange == null ? 0 : requestedChange.length());
+			textChangingEvent.replaceLineCount = getDocument().getNumberOfLines(requestedStart, requestedLength) - 1;
+			textChangingEvent.newText = requestedChange;
+			textChangingEvent.newLineCount = (requestedChange == null ? 0 : getDocument().computeNumberOfLines(requestedChange));
+
+			// we must assign listeners to local variable,
+			// since the add and remove listner
+			// methods can change the actual instance of the
+			// listener array from another thread
+			Runnable runnable = new Runnable() {
+				public void run() {
+					if (fTextChangeListeners != null) {
+						TextChangeListener[] holdListeners = fTextChangeListeners;
+						for (int i = 0; i < holdListeners.length; i++) {
+							// this is a safe cast, since
+							// addListeners requires a
+							// IStructuredDocumentListener
+							holdListeners[i].textChanging(textChangingEvent);
+						}
+					}
+				}
+			};
+			runOnDisplayThreadIfNeedede(runnable);
+		}
+		catch (BadLocationException e) {
+			// log for now, unless we find reason not to
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+	}
+
+	/**
+	 * Sends a text set event to all registered listeners. Widget should
+	 * redraw itself automatically.
+	 */
+	protected void relayTextSet() {
+
+		if (isStoppedForwardingChanges()) {
+			if (Debug.debugStructuredDocument && getDocument() != null) {
+				System.out.println("NOT relaying text set (" + getDocument().getLength() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			return;
+		}
+		if (Debug.debugStructuredDocument && getDocument() != null) {
+			System.out.println("relaying text set (" + getDocument().getLength() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		lastEvent = null;
+		final TextChangedEvent textChangedEvent = new TextChangedEvent(this);
+
+		// we must assign listeners to local variable, since
+		// the add and remove listner
+		// methods can change the actual instance of the
+		// listener array from another thread
+		Runnable runnable = new Runnable() {
+			public void run() {
+				if (fTextChangeListeners != null) {
+					TextChangeListener[] holdListeners = fTextChangeListeners;
+					for (int i = 0; i < holdListeners.length; i++) {
+						holdListeners[i].textSet(textChangedEvent);
+					}
+				}
+			}
+		};
+		runOnDisplayThreadIfNeedede(runnable);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.custom.StyledTextContent#removeTextChangeListener(org.eclipse.swt.custom.TextChangeListener)
+	 */
+	public synchronized void removeTextChangeListener(final TextChangeListener listener) {
+
+		if ((fTextChangeListeners != null) && (listener != null)) {
+			// if its not in the listeners, we'll ignore the
+			// request
+			if (!Utilities.contains(fTextChangeListeners, listener)) {
+				if (Debug.displayWarnings) {
+					System.out.println("StructuredDocumentToTextAdapter::removeTextChangedListeners. listener " + listener + " was not present. "); //$NON-NLS-2$//$NON-NLS-1$
+				}
+			}
+			else {
+				if (Debug.debugStructuredDocument) {
+					System.out.println("StructuredDocumentToTextAdapter::addTextChangedListeners. Removing an instance of " + listener.getClass() + " as a listener on text adapter."); //$NON-NLS-2$//$NON-NLS-1$
+				}
+				final int oldSize = fTextChangeListeners.length;
+				int newSize = oldSize - 1;
+				final TextChangeListener[] newListeners = new TextChangeListener[newSize];
+
+				Runnable runnable = new Runnable() {
+					public void run() {
+						int index = 0;
+						for (int i = 0; i < oldSize; i++) {
+							if (fTextChangeListeners[i] != listener) {
+								// copy old to new if its not the
+								// one we are removing
+								newListeners[index++] = fTextChangeListeners[i];
+							}
+						}
+					}
+				};
+				runOnDisplayThreadIfNeedede(runnable);
+				// now that we have a new array, let's
+				// switch it for the old one
+				fTextChangeListeners = newListeners;
+			}
+		}
+	}
+
+	/**
+	 * Replace the text with "newText" starting at position "start" for a
+	 * length of "replaceLength".
+	 * <p>
+	 * Implementors have to notify TextChanged listeners after the content has
+	 * been updated. The TextChangedEvent should be set as follows:
+	 * <ul>
+	 * <li>event.type = SWT.TextReplaced
+	 * <li>event.start = start of the replaced text
+	 * <li>event.numReplacedLines = number of replaced lines
+	 * <li>event.numNewLines = number of new lines
+	 * <li>event.replacedLength = length of the replaced text
+	 * <li>event.newLength = length of the new text
+	 * </ul>
+	 * <b>NOTE: </b> numNewLines is the number of inserted lines and
+	 * numReplacedLines is the number of deleted lines based on the change
+	 * that occurs visually. For example:
+	 * <ul>
+	 * <li>(replacedText, newText) ==> (numReplacedLines, numNewLines)
+	 * <li>("", "\n") ==> (0, 1)
+	 * <li>("\n\n", "a") ==> (2, 0)
+	 * <li>("a", "\n\n") ==> (0, 2)
+	 * <li>("\n", "") ==> (1, 0)
+	 * </ul>
+	 * </p>
+	 * 
+	 * @param start
+	 *            start offset of text to replace, none of the offsets include
+	 *            delimiters of preceeding lines, offset 0 is the first
+	 *            character of the document
+	 * @param replaceLength
+	 *            start offset of text to replace
+	 * @param newText
+	 *            start offset of text to replace
+	 */
+	public void replaceTextRange(int start, int replaceLength, String text) {
+
+		if (getParentDocument() instanceof IStructuredDocument) {
+			// the structuredDocument initiates the "changing"
+			// and "changed" events.
+			// they are both fired by the time this method
+			// returns.
+			IRegion region = getProjectionToMasterRegion(new Region(start, replaceLength));
+			if (region != null) {
+				((IStructuredDocument) getParentDocument()).replaceText(this, region.getOffset(), region.getLength(), text);
+				return;
+			}
+		}
+		// default is to just try and replace text range in current document
+		try {
+			getDocument().replace(start, replaceLength, text);
+		}
+		catch (BadLocationException e) {
+			// log for now, unless we find reason not to
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.IDocumentAdapterExtension#resumeForwardingDocumentChanges()
+	 */
+	public void resumeForwardingDocumentChanges() {
+
+		// from re-reading the textSet API in StyledText, we
+		// must call
+		// textSet if all the contents changed. If all the
+		// contents did
+		// not change, we need to call the pair of APIs,
+		// textChanging and
+		// textChanged. So, if we ever keep careful track of
+		// changes
+		// during stop forwarding and resume forwarding, we
+		// can
+		// investigate change make use of the pair of APIs.
+		fStopRelayingChangesRequests--;
+		if (fStopRelayingChangesRequests == 0) {
+			// fIsForwarding= true;
+			fDocumentClone = null;
+			fOriginalContent = null;
+			fOriginalLineDelimiters = null;
+			// fireTextSet();
+			relayTextSet();
+		}
+	}
+
+	/**
+	 * This 'Runnable' should be very brief, and should not "call out" to
+	 * other code which itself might call syncExec, or deadlock might occur.
+	 * 
+	 * @param r
+	 */
+	private void runOnDisplayThreadIfNeedede(Runnable r) {
+		// if there is no Display at all (that is, running headless),
+		// or if we are already running on the display thread, then
+		// simply execute the runnable.
+		if (getDisplay() == null || (Thread.currentThread() == getDisplay().getThread())) {
+			r.run();
+		}
+		else {
+			// otherwise force the runnable to run on the display thread.
+			//
+			// Its unclear if we need this at all, once
+			// we "force" document update to always take place on display
+			// thread.
+			IDocument doc = getDocument();
+			if (doc instanceof ILockable) {
+
+				ILock lock = null;
+				try {
+					lock = ((ILockable) doc).getLockObject();
+					lock.acquire();
+					getDisplay().syncExec(r);
+				}
+				finally {
+					if (lock != null) {
+						lock.release();
+					}
+				}
+			}
+			else {
+				// else, ignore!, since risk of deadlock
+				throw new IllegalStateException("non lockable document used for structuredDocumentToTextAdapter"); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * @param newModel
+	 */
+	public void setDocument(IDocument document) {
+
+		if (getDocument() != null) {
+			getDocument().removePrenotifiedDocumentListener(internalDocumentListener);
+		}
+		lastEvent = null;
+		if (document instanceof ProjectionDocument) {
+			fChildDocument = (ProjectionDocument) document;
+			_setDocument(fChildDocument.getMasterDocument());
+		}
+		else {
+			fChildDocument = null;
+			_setDocument(document);
+		}
+		if (getDocument() != null) {
+			getDocument().addPrenotifiedDocumentListener(internalDocumentListener);
+		}
+	}
+
+	/**
+	 * @see IDocument#setText
+	 */
+	public void setText(String string) {
+
+		if (isStoppedForwardingChanges()) {
+			fDocumentClone = null;
+			fOriginalContent = getDocument().get();
+			fOriginalLineDelimiters = getDocument().getLegalLineDelimiters();
+		}
+		else if (getParentDocument() instanceof IStructuredDocument) {
+			((IStructuredDocument) getDocument()).setText(this, string);
+		}
+		else {
+			getDocument().set(string);
+		}
+		relayTextSet();
+	}
+
+	/**
+	 * This method was added to make testing easier. Normally, the widget is
+	 * specified on the constructor.
+	 */
+	public void setWidget(StyledText widget) {
+
+		fStyledTextWidget = widget;
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.IDocumentAdapterExtension#stopForwardingDocumentChanges()
+	 */
+	public void stopForwardingDocumentChanges() {
+
+		fStopRelayingChangesRequests++;
+		// only need to take snapshot on first request
+		if (fStopRelayingChangesRequests == 1) {
+			fDocumentClone = null;
+			fOriginalContent = getDocument().get();
+			fOriginalLineDelimiters = getDocument().getLegalLineDelimiters();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredLineChangeHover.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredLineChangeHover.java
new file mode 100644
index 0000000..69d5d28
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredLineChangeHover.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.source.LineChangeHover;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Escapes diff hover presentation text (converts < to &lt; > to &gt; etc...)
+ * so that html in the diff file (displayed in hover) isn't presented as style
+ * (bold, italic, colors, etc...)
+ * 
+ * @deprecated
+ */
+public class StructuredLineChangeHover extends LineChangeHover {
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.IAnnotationHoverExtension#getHoverControlCreator()
+	 */
+	public IInformationControlCreator getHoverControlCreator() {
+		// use the default information control creator that just displays text
+		// as text, not html content
+		// because there is no special html that should be presented when just
+		// showing diff
+		// in the future, sourceviewer should be used instead of this plain
+		// text control like java uses
+		// SourceViewerInformationControl
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				return new DefaultInformationControl(parent);
+			}
+		};
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredMarkerAnnotation.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredMarkerAnnotation.java
new file mode 100644
index 0000000..2a725b5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredMarkerAnnotation.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.source.IAnnotationPresentation;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+
+
+/**
+ * This is overridden to get around the problem of being registered as a
+ * org.eclipse.wst.validation.core.problemmarker rather than a
+ * org.eclipse.core.resource.problemmarker causing all problems to be skipped
+ * in the OverviewRuler
+ */
+public class StructuredMarkerAnnotation extends MarkerAnnotation implements IAnnotationPresentation {
+	// controls if icon should be painted gray
+	private boolean fIsGrayed = false;
+	String fAnnotationType = null;
+
+	StructuredMarkerAnnotation(IMarker marker) {
+		super(marker);
+	}
+
+	public final String getAnnotationType() {
+		if (fAnnotationType==null){
+			initAnnotationType();
+		}
+		return fAnnotationType;
+	}
+
+	/**
+	 * Eventually will have to use IAnnotationPresentation &
+	 * IAnnotationExtension
+	 * 
+	 * @see org.eclipse.ui.texteditor.MarkerAnnotation#getImage(org.eclipse.swt.widgets.Display)
+	 */
+	protected Image getImage(Display display) {
+		Image image = null;
+		String annotationType = getAnnotationType();
+		if (annotationType == TemporaryAnnotation.ANNOT_ERROR) {
+			image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
+		}
+		else if (annotationType == TemporaryAnnotation.ANNOT_WARNING) {
+			image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
+		}
+		else if (annotationType == TemporaryAnnotation.ANNOT_INFO) {
+			image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK);
+		}
+
+		if (image != null && isGrayed())
+			setImage(getGrayImage(display, image));
+		else
+			setImage(image);
+
+		return super.getImage(display);
+	}
+
+	private Image getGrayImage(Display display, Image image) {
+		if (image != null) {
+			String key = Integer.toString(image.hashCode());
+			// make sure we cache the gray image
+			Image grayImage = JFaceResources.getImageRegistry().get(key);
+			if (grayImage == null) {
+				grayImage = new Image(display, image, SWT.IMAGE_GRAY);
+				JFaceResources.getImageRegistry().put(key, grayImage);
+			}
+			image = grayImage;
+		}
+		return image;
+	}
+
+	public final boolean isGrayed() {
+		return fIsGrayed;
+	}
+
+	public final void setGrayed(boolean grayed) {
+		fIsGrayed = grayed;
+	}
+
+	/**
+	 * Initializes the annotation's icon representation and its drawing layer
+	 * based upon the properties of the underlying marker.
+	 */
+	protected void initAnnotationType() {
+
+		IMarker marker = getMarker();
+		fAnnotationType = TemporaryAnnotation.ANNOT_UNKNOWN;
+		try {
+			if (marker.exists() && marker.isSubtypeOf(IMarker.PROBLEM)) {
+				int severity = marker.getAttribute(IMarker.SEVERITY, -1);
+				switch (severity) {
+					case IMarker.SEVERITY_ERROR :
+						fAnnotationType = TemporaryAnnotation.ANNOT_ERROR;
+						break;
+					case IMarker.SEVERITY_WARNING :
+						fAnnotationType = TemporaryAnnotation.ANNOT_WARNING;
+						break;
+					case IMarker.SEVERITY_INFO :
+						fAnnotationType = TemporaryAnnotation.ANNOT_INFO;
+						break;
+				}
+			}
+
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredResourceMarkerAnnotationModel.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredResourceMarkerAnnotationModel.java
new file mode 100644
index 0000000..73d6bab
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredResourceMarkerAnnotationModel.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.Position;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
+import org.eclipse.ui.texteditor.MarkerUtilities;
+import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointConstants;
+
+
+/**
+ * Source editor resource marker annotation model implementation
+ */
+public class StructuredResourceMarkerAnnotationModel extends ResourceMarkerAnnotationModel {
+	/**
+	 * Loading of markers when working with non-IResources is accomplished by
+	 * adding the markers to the workspace root with an additional key, whose
+	 * value uses '/' for segment separators when representing paths,
+	 * determining whether they're added into the annotation model.
+	 * 
+	 * Setters of this attribute should use '/'for segment separators when
+	 * representing paths.
+	 */
+	public final static String SECONDARY_ID_KEY = IBreakpointConstants.RESOURCE_PATH;
+	
+	protected IResource fMarkerResource;
+	protected String fSecondaryMarkerAttributeValue;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param resource
+	 */
+	public StructuredResourceMarkerAnnotationModel(IResource resource) {
+		super(resource);
+		fMarkerResource = resource;
+	}
+
+	public StructuredResourceMarkerAnnotationModel(IResource resource, String secondaryID) {
+		super(resource);
+		fMarkerResource = resource;
+		fSecondaryMarkerAttributeValue = secondaryID;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#createMarkerAnnotation(org.eclipse.core.resources.IMarker)
+	 */
+	protected MarkerAnnotation createMarkerAnnotation(IMarker marker) {
+		/*
+		 * We need to do some special processing if marker is a validation
+		 * (aka problem) marker or if marker is a breakpoint marker so create
+		 * a special marker annotation for those markers. Otherwise, use
+		 * default.
+		 */
+		if (MarkerUtilities.isMarkerType(marker, IMarker.PROBLEM)) {
+			return new StructuredMarkerAnnotation(marker);
+		}
+		return super.createMarkerAnnotation(marker);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#getMarkerPosition(org.eclipse.core.resources.IMarker)
+	 */
+	public Position getMarkerPosition(IMarker marker) {
+		Position pos = super.getMarkerPosition(marker);
+
+		// if ((pos == null || pos.getLength() == 0) && marker.getType() ==
+		// IInternalDebugUIConstants.ANN_INSTR_POINTER_CURRENT) {
+		if (pos == null || pos.getLength() == 0) {
+			// We probably should create position from marker if marker
+			// attributes specify a valid position
+			pos = createPositionFromMarker(marker);
+		}
+
+		return pos;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#isAcceptable(org.eclipse.core.resources.IMarker)
+	 */
+	protected boolean isAcceptable(IMarker marker) {
+		try {
+			Object attr = marker.getAttribute(IBreakpointConstants.ATTR_HIDDEN);
+			if (attr != null && Boolean.TRUE.equals(attr))
+				return false;
+		}
+		catch (CoreException e) {
+			// ignore
+		}
+
+		if (fSecondaryMarkerAttributeValue == null)
+			return super.isAcceptable(marker);
+		String markerSecondaryMarkerAttributeValue = marker.getAttribute(SECONDARY_ID_KEY, ""); //$NON-NLS-1$
+		boolean isSameFile = fSecondaryMarkerAttributeValue.equalsIgnoreCase(markerSecondaryMarkerAttributeValue);
+		return super.isAcceptable(marker) && isSameFile;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredResourceMarkerAnnotationModelFactory.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredResourceMarkerAnnotationModelFactory.java
new file mode 100644
index 0000000..6e5b235
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredResourceMarkerAnnotationModelFactory.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModelFactory;
+
+/**
+ * 
+ * @author nsd
+ * 
+ * Used by the org.eclipse.core.filebuffers.annotationModelCreation extension
+ * point
+ */
+public class StructuredResourceMarkerAnnotationModelFactory extends ResourceMarkerAnnotationModelFactory {
+
+	public StructuredResourceMarkerAnnotationModelFactory() {
+		super();
+	}
+
+	/*
+	 * @see org.eclipse.core.filebuffers.IAnnotationModelFactory#createAnnotationModel(org.eclipse.core.runtime.IPath)
+	 */
+	public IAnnotationModel createAnnotationModel(IPath location) {
+		IAnnotationModel model = null;
+		IFile file = FileBuffers.getWorkspaceFileAtLocation(location);
+		if (file != null) {
+			model = new StructuredResourceMarkerAnnotationModel(file);
+		}
+		else {
+			model = new StructuredResourceMarkerAnnotationModel(ResourcesPlugin.getWorkspace().getRoot(), location.toString());
+		}
+		return model;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextAnnotationHover.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextAnnotationHover.java
new file mode 100644
index 0000000..624a3f7
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextAnnotationHover.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.internal.text.html.HTMLPrinter;
+import org.eclipse.jface.text.source.DefaultAnnotationHover;
+
+/**
+ * Determines all messages for the given line and collects, concatenates, and
+ * formats them in HTML. Use of the internal HTMLPrinter was observed in
+ * org.eclipse.jdt.internal.ui.text.HTMLAnnotationHover .
+ */
+public class StructuredTextAnnotationHover extends DefaultAnnotationHover {
+
+	public StructuredTextAnnotationHover() {
+		super();
+	}
+
+	public StructuredTextAnnotationHover(boolean showLineNumber) {
+		super(showLineNumber);
+	}
+
+	/*
+	 * Formats a message as HTML text.
+	 */
+	protected String formatSingleMessage(String message) {
+		StringBuffer buffer = new StringBuffer();
+		HTMLPrinter.addPageProlog(buffer);
+		HTMLPrinter.addParagraph(buffer, HTMLPrinter.convertToHTMLContent(message));
+		HTMLPrinter.addPageEpilog(buffer);
+		return buffer.toString();
+	}
+
+	/*
+	 * Formats several message as HTML text.
+	 */
+	protected String formatMultipleMessages(List messages) {
+		StringBuffer buffer = new StringBuffer();
+		HTMLPrinter.addPageProlog(buffer);
+		HTMLPrinter.addParagraph(buffer, HTMLPrinter.convertToHTMLContent(SSEUIMessages.Multiple_errors));
+
+		HTMLPrinter.startBulletList(buffer);
+		Set collectedMessages = new HashSet();
+		Iterator e = messages.iterator();
+		while (e.hasNext()) {
+			String converted = HTMLPrinter.convertToHTMLContent((String) e.next());
+			collectedMessages.add(converted);
+		}
+		e = collectedMessages.iterator();
+		while (e.hasNext()) {
+			HTMLPrinter.addBullet(buffer, e.next().toString());
+		}
+		HTMLPrinter.endBulletList(buffer);
+
+		HTMLPrinter.addPageEpilog(buffer);
+		return buffer.toString();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.IReleasable#release()
+	 */
+	public void release() {
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextLineBreakingReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextLineBreakingReader.java
new file mode 100644
index 0000000..7fe3deb
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextLineBreakingReader.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+
+import org.eclipse.swt.graphics.GC;
+
+/*
+ * Not a real reader. Could change if requested
+ */
+public class StructuredTextLineBreakingReader {
+	private GC fGC;
+	private int fIndex;
+	private String fLine;
+	private int fMaxWidth;
+
+	private BufferedReader fReader;
+
+	/**
+	 * Creates a reader that breaks an input text to fit in a given width.
+	 * 
+	 * @param reader
+	 *            Reader of the input text
+	 * @param gc
+	 *            The graphic context that defines the currently used font
+	 *            sizes
+	 * @param maxLineWidth
+	 *            The max width (pixes) where the text has to fit in
+	 */
+	public StructuredTextLineBreakingReader(Reader reader, GC gc, int maxLineWidth) {
+		fReader = new BufferedReader(reader);
+		fGC = gc;
+		fMaxWidth = maxLineWidth;
+		fLine = null;
+		fIndex = 0;
+	}
+
+	private int findNextBreakIndex(int currIndex) {
+		int currWidth = 0;
+		int lineLength = fLine.length();
+
+		while (currIndex < lineLength) {
+			char ch = fLine.charAt(currIndex);
+			int nextIndex = currIndex + 1;
+			// leading whitespaces are counted to the following word
+			if (Character.isWhitespace(ch)) {
+				while (nextIndex < lineLength && Character.isWhitespace(fLine.charAt(nextIndex))) {
+					nextIndex++;
+				}
+			}
+			while (nextIndex < lineLength && !Character.isWhitespace(fLine.charAt(nextIndex))) {
+				nextIndex++;
+			}
+			String word = fLine.substring(currIndex, nextIndex);
+			int wordWidth = fGC.textExtent(word).x;
+			int nextWidth = wordWidth + currWidth;
+			if (nextWidth > fMaxWidth && wordWidth < fMaxWidth) {
+				return currIndex;
+			}
+			currWidth = nextWidth;
+			currIndex = nextIndex;
+		}
+		return currIndex;
+	}
+
+	private int findWordBegin(int idx) {
+		while (idx < fLine.length() && Character.isWhitespace(fLine.charAt(idx))) {
+			idx++;
+		}
+		return idx;
+	}
+
+	/**
+	 * Reads the next line. The lengths of the line will not exceed the gived
+	 * maximum width.
+	 */
+	public String readLine() throws IOException {
+		if (fLine == null) {
+			String line = fReader.readLine();
+			if (line == null) {
+				return null;
+			}
+			int lineLen = fGC.textExtent(line).x;
+			if (lineLen < fMaxWidth) {
+				return line;
+			}
+			fLine = line;
+			fIndex = 0;
+		}
+		int breakIdx = findNextBreakIndex(fIndex);
+		String res = fLine.substring(fIndex, breakIdx);
+		if (breakIdx < fLine.length()) {
+			fIndex = findWordBegin(breakIdx);
+		} else {
+			fLine = null;
+		}
+		return res;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextSelectionChangedEvent.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextSelectionChangedEvent.java
new file mode 100644
index 0000000..bb8dc2d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextSelectionChangedEvent.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+
+/**
+ * This event is used by the SourceEditorTreeViewer to tell the
+ * ViewerSelectionManager that the selection really came from a user click on
+ * the content outliner, instead of being set programatically.
+ */
+public class StructuredTextSelectionChangedEvent extends org.eclipse.jface.viewers.SelectionChangedEvent {
+
+	/**
+	 * Comment for <code>serialVersionUID</code>
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public StructuredTextSelectionChangedEvent(ISelectionProvider source, ISelection selection) {
+		super(source, selection);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextViewer.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextViewer.java
new file mode 100644
index 0000000..58f483d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextViewer.java
@@ -0,0 +1,969 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentRewriteSession;
+import org.eclipse.jface.text.DocumentRewriteSessionType;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentAdapter;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextPresentationListener;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewerExtension2;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistantExtension2;
+import org.eclipse.jface.text.contentassist.IContentAssistantExtension4;
+import org.eclipse.jface.text.formatter.FormattingContext;
+import org.eclipse.jface.text.formatter.FormattingContextProperties;
+import org.eclipse.jface.text.formatter.IContentFormatterExtension;
+import org.eclipse.jface.text.formatter.IFormattingContext;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.information.IInformationPresenter;
+import org.eclipse.jface.text.projection.ProjectionDocument;
+import org.eclipse.jface.text.quickassist.IQuickAssistAssistant;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.ContentAssistantFacade;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.sse.core.internal.cleanup.StructuredContentCleanupHandler;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator;
+import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
+import org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.provisional.style.AbstractLineStyleProvider;
+import org.eclipse.wst.sse.ui.internal.provisional.style.CompatibleHighlighter;
+import org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.sse.ui.internal.provisional.style.ReconcilerHighlighter;
+import org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor;
+import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil;
+
+/**
+ * <p>
+ * Like {@link org.eclipse.wst.sse.ui.StructuredTextEditor}, this class is not
+ * meant to be subclassed.<br />
+ */
+public class StructuredTextViewer extends ProjectionViewer implements IDocumentSelectionMediator {
+	/** Text operation codes */
+	private static final int BASE = ProjectionViewer.COLLAPSE_ALL; // see
+	// ProjectionViewer.COLLAPSE_ALL
+	private static final int CLEANUP_DOCUMENT = BASE + 4;
+	public static final int FORMAT_ACTIVE_ELEMENTS = BASE + 3;
+
+	private static final String FORMAT_ACTIVE_ELEMENTS_TEXT = SSEUIMessages.Format_Active_Elements_UI_; //$NON-NLS-1$
+	public static final int FORMAT_DOCUMENT = BASE + 2;
+	private static final String FORMAT_DOCUMENT_TEXT = SSEUIMessages.Format_Document_UI_; //$NON-NLS-1$
+	private static final String TEXT_CUT = SSEUIMessages.Text_Cut_UI_; //$NON-NLS-1$
+	private static final String TEXT_PASTE = SSEUIMessages.Text_Paste_UI_; //$NON-NLS-1$
+	private static final String TEXT_SHIFT_LEFT = SSEUIMessages.Text_Shift_Left_UI_; //$NON-NLS-1$ = "Text Shift Left"
+	private static final String TEXT_SHIFT_RIGHT = SSEUIMessages.Text_Shift_Right_UI_; //$NON-NLS-1$ = "Text Shift Right"
+	private static final boolean TRACE_EXCEPTIONS = true;
+
+	/*
+	 * Max length of chars to format before it is considered a "big format"
+	 * This is used to indication a small unrestricted rewrite session.
+	 */
+	private final int MAX_SMALL_FORMAT_LENGTH = 1000;
+	private boolean fBackgroundupdateInProgress;
+	private StructuredContentCleanupHandler fContentCleanupHandler = null;
+	//private IDocumentAdapter fDocAdapter;
+
+	private Highlighter fHighlighter;
+	
+	private ReconcilerHighlighter fRecHighlighter = null;
+
+	// private ViewerSelectionManager fViewerSelectionManager;
+	private SourceViewerConfiguration fConfiguration;
+	/*
+	 * True if formatter has been set
+	 */
+	private boolean fFormatterSet = false;
+
+	private ContentAssistantFacade fContentAssistantFacade;
+
+	/**
+	 * @see org.eclipse.jface.text.source.SourceViewer#SourceViewer(Composite,
+	 *      IVerticalRuler, IOverviewRuler, boolean, int)
+	 */
+	public StructuredTextViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean showAnnotationsOverview, int styles) {
+		super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles);
+	}
+
+	/**
+	 * 
+	 */
+	private void beep() {
+		getTextWidget().getDisplay().beep();
+	}
+
+	public void beginBackgroundUpdate() {
+		fBackgroundupdateInProgress = true;
+		setRedraw(false);
+	}
+
+	protected void createControl(Composite parent, int styles) {
+		// Forces LEFT_TO_RIGHT orientation unless otherwise suggested
+		if ((styles & SWT.LEFT_TO_RIGHT) == 0 && (styles & SWT.RIGHT_TO_LEFT) == 0)
+			styles |= SWT.LEFT_TO_RIGHT;
+		super.createControl(parent, styles);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextOperationTarget#canDoOperation(int)
+	 */
+	public boolean canDoOperation(int operation) {
+		if (fBackgroundupdateInProgress) {
+			return false;
+		}
+		switch (operation) {
+			case CONTENTASSIST_PROPOSALS : {
+				// (pa) if position isn't READ_ONLY (containsReadOnly()
+				// returns false),
+				// Otherwise, you DO want content assist (return true)
+				IDocument doc = getDocument();
+				if (doc != null && doc instanceof IStructuredDocument) {
+					return isEditable() && (!((IStructuredDocument) doc).containsReadOnly(getSelectedRange().x, 0));
+				}
+				break;
+			}
+			case CLEANUP_DOCUMENT : {
+				return (fContentCleanupHandler != null && isEditable());
+			}
+			case FORMAT_DOCUMENT :
+			case FORMAT_ACTIVE_ELEMENTS : {
+				// if formatter not set yet, contentformatter can be null
+				return ((fContentFormatter != null || !fFormatterSet) && isEditable());
+			}
+		}
+		return super.canDoOperation(operation);
+	}
+
+	/**
+	 * Should be identical to superclass version. Plus, we get our own special
+	 * Highlighter. Plus we uninstall before installing.
+	 */
+	public void configure(SourceViewerConfiguration configuration) {
+
+		if (getTextWidget() == null)
+			return;
+
+		setDocumentPartitioning(configuration.getConfiguredDocumentPartitioning(this));
+
+		// always uninstall highlighter and null it out on new configuration
+		if (fHighlighter != null) {
+			fHighlighter.uninstall();
+			fHighlighter = null;
+		}
+
+		if(fRecHighlighter != null) {
+			fRecHighlighter.uninstall();
+			fRecHighlighter = null;
+		}
+		
+		// Bug 230297 - Uninstall presentation reconciler in preparation of a new one
+		if(fPresentationReconciler != null) {
+			fPresentationReconciler.uninstall();
+			fPresentationReconciler = null;
+		}
+
+		IReconciler newReconciler = configuration.getReconciler(this);
+
+		if (newReconciler != fReconciler || newReconciler == null || fReconciler == null) {
+
+			if (fReconciler != null) {
+				fReconciler.uninstall();
+			}
+
+			fReconciler = newReconciler;
+
+			if (fReconciler != null) {
+				fReconciler.install(this);
+				// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=3858
+				// still need set document on the reconciler (strategies)
+				if (fReconciler instanceof StructuredRegionProcessor)
+					((StructuredRegionProcessor) fReconciler).setDocument(getDocument());
+			}
+		}
+
+		IContentAssistant newAssistant = configuration.getContentAssistant(this);
+		if (newAssistant != fContentAssistant || newAssistant == null || fContentAssistant == null) {
+			if (fContentAssistant != null)
+				fContentAssistant.uninstall();
+
+			fContentAssistant = newAssistant;
+
+			if (fContentAssistant != null) {
+				fContentAssistant.install(this);
+				if (fContentAssistant instanceof IContentAssistantExtension2 && fContentAssistant instanceof IContentAssistantExtension4)
+					fContentAssistantFacade= new ContentAssistantFacade(fContentAssistant);
+				fContentAssistantInstalled = true;
+			}
+			else {
+				// 248036
+				// disable the content assist operation if no content
+				// assistant
+				enableOperation(CONTENTASSIST_PROPOSALS, false);
+			}
+		}
+
+		IQuickAssistAssistant quickAssistant = configuration.getQuickAssistAssistant(this);
+		if (quickAssistant != fQuickAssistAssistant || quickAssistant == null || fQuickAssistAssistant == null) {
+			if (fQuickAssistAssistant != null)
+				fQuickAssistAssistant.uninstall();
+
+			fQuickAssistAssistant = quickAssistant;
+
+			if (fQuickAssistAssistant != null) {
+				fQuickAssistAssistant.install(this);
+				fQuickAssistAssistantInstalled = true;
+			}
+			else {
+				// 248036
+				// disable the content assist operation if no content
+				// assistant
+				enableOperation(QUICK_ASSIST, false);
+			}
+		}
+
+		fContentFormatter = configuration.getContentFormatter(this);
+
+		// do not uninstall old information presenter if it's the same
+		IInformationPresenter newInformationPresenter = configuration.getInformationPresenter(this);
+		if (newInformationPresenter == null || fInformationPresenter == null || !(newInformationPresenter.equals(fInformationPresenter))) {
+			if (fInformationPresenter != null)
+				fInformationPresenter.uninstall();
+			fInformationPresenter = newInformationPresenter;
+			if (fInformationPresenter != null)
+				fInformationPresenter.install(this);
+		}
+
+		// disconnect from the old undo manager before setting the new one
+		if (fUndoManager != null) {
+			fUndoManager.disconnect();
+		}
+		setUndoManager(configuration.getUndoManager(this));
+
+		// release old annotation hover before setting new one
+		if (fAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover) fAnnotationHover).release();
+		}
+		setAnnotationHover(configuration.getAnnotationHover(this));
+
+		// release old annotation hover before setting new one
+		if (fOverviewRulerAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover) fOverviewRulerAnnotationHover).release();
+		}
+		setOverviewRulerAnnotationHover(configuration.getOverviewRulerAnnotationHover(this));
+
+		getTextWidget().setTabs(configuration.getTabWidth(this));
+		setHoverControlCreator(configuration.getInformationControlCreator(this));
+
+		// if hyperlink manager has already been created, uninstall it
+		if (fHyperlinkManager != null) {
+			setHyperlinkDetectors(null, SWT.NONE);
+		}
+		setHyperlinkPresenter(configuration.getHyperlinkPresenter(this));
+		IHyperlinkDetector[] hyperlinkDetectors = configuration.getHyperlinkDetectors(this);
+		int eventStateMask = configuration.getHyperlinkStateMask(this);
+		setHyperlinkDetectors(hyperlinkDetectors, eventStateMask);
+
+		String[] types = configuration.getConfiguredContentTypes(this);
+
+		// clear autoindent/autoedit strategies
+		fAutoIndentStrategies = null;
+		
+		for (int i = 0; i < types.length; i++) {
+			String t = types[i];
+			setAutoEditStrategies(configuration.getAutoEditStrategies(this, t), t);
+			setTextDoubleClickStrategy(configuration.getDoubleClickStrategy(this, t), t);
+
+			int[] stateMasks = configuration.getConfiguredTextHoverStateMasks(this, t);
+			if (stateMasks != null) {
+				for (int j = 0; j < stateMasks.length; j++) {
+					int stateMask = stateMasks[j];
+					setTextHover(configuration.getTextHover(this, t, stateMask), t, stateMask);
+				}
+			}
+			else {
+				setTextHover(configuration.getTextHover(this, t), t, ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK);
+			}
+
+			String[] prefixes = configuration.getIndentPrefixes(this, t);
+			if (prefixes != null && prefixes.length > 0)
+				setIndentPrefixes(prefixes, t);
+
+			prefixes = configuration.getDefaultPrefixes(this, t);
+			if (prefixes != null && prefixes.length > 0)
+				setDefaultPrefixes(prefixes, t);
+
+			// Bug 230297 - Add LineStyleProviders from the new configuration if
+			// the document is set
+			if(getDocument() != null) {
+				// add highlighter/linestyleprovider
+				LineStyleProvider[] providers = ((StructuredTextViewerConfiguration) configuration).getLineStyleProviders(this, t);
+				if (providers != null) {
+					for (int j = 0; j < providers.length; ++j) {
+						
+						if(fRecHighlighter == null) {
+							fRecHighlighter = new ReconcilerHighlighter();
+							((StructuredTextViewerConfiguration) configuration).setHighlighter(fRecHighlighter);
+						}
+						if (providers[j] instanceof AbstractLineStyleProvider) {
+							((AbstractLineStyleProvider) providers[j]).init((IStructuredDocument) getDocument(), fRecHighlighter);
+							fRecHighlighter.addProvider(t, providers[j]);
+						}
+						else {
+							// init with compatibility instance
+							if (fHighlighter == null) {
+								fHighlighter = new CompatibleHighlighter();
+							}
+							Logger.log(Logger.INFO_DEBUG, "CompatibleHighlighter installing compatibility for " + providers[j].getClass()); //$NON-NLS-1$
+							providers[j].init((IStructuredDocument) getDocument(), fHighlighter);
+							fHighlighter.addProvider(t, providers[j]);
+						}
+					}
+				}
+			}
+		}
+
+		// initialize highlighter after linestyleproviders were added
+		if (fHighlighter != null) {
+			fHighlighter.setDocumentPartitioning(configuration.getConfiguredDocumentPartitioning(this));
+			fHighlighter.setDocument((IStructuredDocument) getDocument());
+			fHighlighter.install(this);
+		}
+		
+		if (fRecHighlighter != null)
+			fRecHighlighter.install(this);
+
+		activatePlugins();
+
+		fConfiguration = configuration;
+		
+		// Update the viewer's presentation reconciler
+		fPresentationReconciler = configuration.getPresentationReconciler(this);
+		
+		if(fPresentationReconciler != null)
+			fPresentationReconciler.install(this);
+	}
+
+	/**
+	 * @param document
+	 * @param startOffset
+	 * @param endOffset
+	 * @return
+	 */
+	private boolean containsReadOnly(IDocument document, int startOffset, int endOffset) {
+
+		int start = startOffset;
+		int end = endOffset;
+		IStructuredDocument structuredDocument = null;
+		if (document instanceof IStructuredDocument) {
+			structuredDocument = (IStructuredDocument) document;
+		}
+		else {
+			if (document instanceof ProjectionDocument) {
+				IDocument doc = ((ProjectionDocument) document).getMasterDocument();
+				if (doc instanceof IStructuredDocument) {
+					structuredDocument = (IStructuredDocument) doc;
+					int adjust = ((ProjectionDocument) document).getProjectionMapping().getCoverage().getOffset();
+					start = adjust + start;
+					end = adjust + end;
+				}
+			}
+		}
+		if (structuredDocument == null) {
+			return false;
+		}
+		else {
+			int length = end - start;
+			return structuredDocument.containsReadOnly(start, length);
+		}
+	}
+
+	/**
+	 * @deprecated - present for compatibility only
+	 */
+	protected IDocumentAdapter createDocumentAdapter() {
+		return super.createDocumentAdapter();
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextOperationTarget#doOperation(int)
+	 */
+	public void doOperation(int operation) {
+
+		Point selection = getTextWidget().getSelection();
+		int cursorPosition = selection.x;
+		int selectionLength = selection.y - selection.x;
+		switch (operation) {
+			case CUT :
+				beginRecording(TEXT_CUT, TEXT_CUT, cursorPosition, selectionLength);
+				super.doOperation(operation);
+				selection = getTextWidget().getSelection();
+				cursorPosition = selection.x;
+				selectionLength = selection.y - selection.x;
+				endRecording(cursorPosition, selectionLength);
+				break;
+			case PASTE :
+				beginRecording(TEXT_PASTE, TEXT_PASTE, cursorPosition, selectionLength);
+				super.doOperation(operation);
+				selection = getTextWidget().getSelection();
+				cursorPosition = selection.x;
+				selectionLength = selection.y - selection.x;
+				endRecording(cursorPosition, selectionLength);
+				break;
+			case CONTENTASSIST_PROPOSALS :
+				// maybe not configured?
+				if (fContentAssistant != null && isEditable()) {
+					// CMVC 263269
+					// need an explicit check here because the
+					// contentAssistAction is no longer being updated on
+					// cursor
+					// position
+					if (canDoOperation(CONTENTASSIST_PROPOSALS)) {
+						String err = fContentAssistant.showPossibleCompletions();
+						if (err != null) {
+							// don't wanna beep if there is no error
+							PlatformStatusLineUtil.displayTemporaryErrorMessage(this, err);
+						}
+					}
+					else
+						beep();
+				}
+				break;
+			case CONTENTASSIST_CONTEXT_INFORMATION :
+				if (fContentAssistant != null) {
+					String err = fContentAssistant.showContextInformation();
+					if (err != null) {
+						// don't wanna beep if there is no error
+						PlatformStatusLineUtil.displayTemporaryErrorMessage(this, err);
+					}
+				}
+				break;
+			case SHIFT_RIGHT :
+				beginRecording(TEXT_SHIFT_RIGHT, TEXT_SHIFT_RIGHT, cursorPosition, selectionLength);
+				updateIndentationPrefixes();
+				super.doOperation(SHIFT_RIGHT);
+				selection = getTextWidget().getSelection();
+				cursorPosition = selection.x;
+				selectionLength = selection.y - selection.x;
+				endRecording(cursorPosition, selectionLength);
+				break;
+			case SHIFT_LEFT :
+				beginRecording(TEXT_SHIFT_LEFT, TEXT_SHIFT_LEFT, cursorPosition, selectionLength);
+				updateIndentationPrefixes();
+				super.doOperation(SHIFT_LEFT);
+				selection = getTextWidget().getSelection();
+				cursorPosition = selection.x;
+				selectionLength = selection.y - selection.x;
+				endRecording(cursorPosition, selectionLength);
+				break;
+			case FORMAT_DOCUMENT :
+				DocumentRewriteSession rewriteSession = null;
+				IDocument document = getDocument();
+				try {
+					/*
+					 * This command will actually format selection if text is
+					 * selected, otherwise format entire document
+					 */
+					// begin recording
+					beginRecording(FORMAT_DOCUMENT_TEXT, FORMAT_DOCUMENT_TEXT, cursorPosition, selectionLength);
+					boolean formatDocument = false;
+					IRegion region = null;
+					Point s = getSelectedRange();
+					if (s.y > 0) {
+						// only format currently selected text
+						region = new Region(s.x, s.y);
+					}
+					else {
+						// no selection, so format entire document
+						region = getModelCoverage();
+						formatDocument = true;
+					}
+
+					if (document instanceof IDocumentExtension4) {
+						IDocumentExtension4 extension = (IDocumentExtension4) document;
+						DocumentRewriteSessionType type = (selection.y == 0 || selection.y > MAX_SMALL_FORMAT_LENGTH) ? DocumentRewriteSessionType.UNRESTRICTED : DocumentRewriteSessionType.UNRESTRICTED_SMALL;
+						rewriteSession = (extension.getActiveRewriteSession() != null) ? null : extension.startRewriteSession(type);
+					}
+					else {
+						setRedraw(false);
+					}
+
+					if (fContentFormatter instanceof IContentFormatterExtension) {
+						IContentFormatterExtension extension = (IContentFormatterExtension) fContentFormatter;
+						IFormattingContext context = new FormattingContext();
+						context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.valueOf(formatDocument));
+						context.setProperty(FormattingContextProperties.CONTEXT_REGION, region);
+						extension.format(document, context);
+					}
+					else {
+						fContentFormatter.format(document, region);
+					}
+				}
+				finally {
+					try {
+						if (rewriteSession != null) {
+							IDocumentExtension4 extension = (IDocumentExtension4) document;
+							extension.stopRewriteSession(rewriteSession);
+						}
+						else {
+							setRedraw(true);
+						}
+					}
+					finally {
+						// end recording
+						selection = getTextWidget().getSelection();
+						cursorPosition = selection.x;
+						selectionLength = selection.y - selection.x;
+						endRecording(cursorPosition, selectionLength);
+					}
+				}
+				break;
+			case FORMAT_ACTIVE_ELEMENTS :
+				rewriteSession = null;
+				document = getDocument();
+				try {
+					/*
+					 * This command will format the node at cursor position
+					 * (and all its children)
+					 */
+					// begin recording
+					beginRecording(FORMAT_ACTIVE_ELEMENTS_TEXT, FORMAT_ACTIVE_ELEMENTS_TEXT, cursorPosition, selectionLength);
+					IRegion region = null;
+					Point s = getSelectedRange();
+					if (s.y > -1) {
+						// only format node at cursor position
+						region = new Region(s.x, s.y);
+					}
+
+					if (document instanceof IDocumentExtension4) {
+						IDocumentExtension4 extension = (IDocumentExtension4) document;
+						DocumentRewriteSessionType type = (selection.y == 0 || selection.y > MAX_SMALL_FORMAT_LENGTH) ? DocumentRewriteSessionType.UNRESTRICTED : DocumentRewriteSessionType.UNRESTRICTED_SMALL;
+						rewriteSession = (extension.getActiveRewriteSession() != null) ? null : extension.startRewriteSession(type);
+					}
+					else {
+						setRedraw(false);
+					}
+
+					if (fContentFormatter instanceof IContentFormatterExtension) {
+						IContentFormatterExtension extension = (IContentFormatterExtension) fContentFormatter;
+						IFormattingContext context = new FormattingContext();
+						context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.FALSE);
+						context.setProperty(FormattingContextProperties.CONTEXT_REGION, region);
+						extension.format(getDocument(), context);
+					}
+					else {
+						fContentFormatter.format(getDocument(), region);
+					}
+				}
+				finally {
+					try {
+						if (rewriteSession != null) {
+							IDocumentExtension4 extension = (IDocumentExtension4) document;
+							extension.stopRewriteSession(rewriteSession);
+						}
+						else {
+							setRedraw(true);
+						}
+					}
+					finally {
+						// end recording
+						selection = getTextWidget().getSelection();
+						cursorPosition = selection.x;
+						selectionLength = selection.y - selection.x;
+						endRecording(cursorPosition, selectionLength);
+					}
+				}
+				break;
+			default :
+				super.doOperation(operation);
+		}
+	}
+
+	private void endRecording(int cursorPosition, int selectionLength) {
+		IDocument doc = getDocument();
+		if (doc instanceof IStructuredDocument) {
+			IStructuredDocument structuredDocument = (IStructuredDocument) doc;
+			IStructuredTextUndoManager undoManager = structuredDocument.getUndoManager();
+
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=198617
+			// undo after paste in document with folds - wrong behavior
+			IRegion widgetSelection = new Region(cursorPosition, selectionLength);
+			IRegion documentSelection = widgetRange2ModelRange(widgetSelection);
+			if (documentSelection == null)
+				documentSelection = widgetSelection;
+			undoManager.endRecording(this, documentSelection.getOffset(), documentSelection.getLength());
+		}
+		else {
+			// TODO: how to handle other document types?
+		}
+	}
+
+	private void beginRecording(String label, String description, int cursorPosition, int selectionLength) {
+		IDocument doc = getDocument();
+		if (doc instanceof IStructuredDocument) {
+			IStructuredDocument structuredDocument = (IStructuredDocument) doc;
+			IStructuredTextUndoManager undoManager = structuredDocument.getUndoManager();
+
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=198617
+			// undo after paste in document with folds - wrong behavior
+			IRegion widgetSelection = new Region(cursorPosition, selectionLength);
+			IRegion documentSelection = widgetRange2ModelRange(widgetSelection);
+			if (documentSelection == null)
+				documentSelection = widgetSelection;
+			undoManager.beginRecording(this, label, description, documentSelection.getOffset(), documentSelection.getLength());
+		}
+		else {
+			// TODO: how to handle other document types?
+		}
+	}
+
+	public void endBackgroundUpdate() {
+		fBackgroundupdateInProgress = false;
+		setRedraw(true);
+	}
+
+	protected void handleDispose() {
+		Logger.trace("Source Editor", "StructuredTextViewer::handleDispose entry"); //$NON-NLS-1$ //$NON-NLS-2$
+
+		// before we dispose, we set a special "empty" selection, to prevent
+		// the "leak one document" that
+		// otherwise occurs when editor closed (since last selection stays in
+		// SelectedResourceManager.
+		// the occurance of the "leak" isn't so bad, but makes debugging other
+		// leaks very hard.
+		setSelection(TextSelection.emptySelection());
+
+		if (fHighlighter != null) {
+			fHighlighter.uninstall();
+			fHighlighter = null;
+		}
+		
+		if (fRecHighlighter != null) {
+			fRecHighlighter.uninstall();
+			fRecHighlighter = null;
+		}
+		super.handleDispose();
+
+		Logger.trace("Source Editor", "StructuredTextViewer::handleDispose exit"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/*
+	 * Overridden for special support of background update and read-only
+	 * regions
+	 */
+	protected void handleVerifyEvent(VerifyEvent e) {
+		IRegion modelRange = event2ModelRange(e);
+		if (exposeModelRange(modelRange)) {
+			e.doit = false;
+			return;
+		}
+
+		if (fEventConsumer != null) {
+			fEventConsumer.processEvent(e);
+			if (!e.doit)
+				return;
+		}
+		if (fBackgroundupdateInProgress) {
+			e.doit = false;
+			beep();
+			return;
+		}
+		
+		// for read-only support
+		if (containsReadOnly(getVisibleDocument(), e.start, e.end)) {
+			e.doit = false;
+			beep();
+			return;
+		}
+
+		try {
+			super.handleVerifyEvent(e);
+		}
+		catch (Exception x) {
+			/*
+			 * Note, we catch and log any exception, since an otherwise can
+			 * actually prevent typing! see
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=111318
+			 */
+
+			if (TRACE_EXCEPTIONS)
+				Logger.logException("StructuredTextViewer.exception.verifyText", x); //$NON-NLS-1$
+		}
+	}
+
+	public int modelLine2WidgetLine(int modelLine) {
+		/**
+		 * need to override this method as a workaround for Bug 85709
+		 */
+		if (fInformationMapping == null) {
+			IDocument document = getDocument();
+			if (document != null) {
+				try {
+					IRegion modelLineRegion = getDocument().getLineInformation(modelLine);
+					IRegion region = getModelCoverage();
+					if (modelLineRegion != null && region != null) {
+						int modelEnd = modelLineRegion.getOffset() + modelLineRegion.getLength();
+						int regionEnd = region.getOffset() + region.getLength();
+						// returns -1 if modelLine is invalid
+						if ((modelLineRegion.getOffset() < region.getOffset()) || (modelEnd > regionEnd))
+							return -1;
+					}
+				}
+				catch (BadLocationException e) {
+					// returns -1 if modelLine is invalid
+					return -1;
+				}
+			}
+		}
+		return super.modelLine2WidgetLine(modelLine);
+	}
+
+	public int modelOffset2WidgetOffset(int modelOffset) {
+		/**
+		 * need to override this method as a workaround for Bug 85709
+		 */
+		if (fInformationMapping == null) {
+			IRegion region = getModelCoverage();
+			if (region != null) {
+				// returns -1 if modelOffset is invalid
+				if (modelOffset < region.getOffset() || modelOffset > (region.getOffset() + region.getLength()))
+					return -1;
+			}
+		}
+		return super.modelOffset2WidgetOffset(modelOffset);
+	}
+
+	public IRegion modelRange2WidgetRange(IRegion modelRange) {
+		// need to override this method as workaround for Bug85709
+		if (fInformationMapping == null) {
+			IRegion region = getModelCoverage();
+			if (region != null && modelRange != null) {
+				int modelEnd = modelRange.getOffset() + modelRange.getLength();
+				int regionEnd = region.getOffset() + region.getLength();
+				// returns null if modelRange is invalid
+				if ((modelRange.getOffset() < region.getOffset()) || (modelEnd > regionEnd))
+					return null;
+			}
+		}
+		return super.modelRange2WidgetRange(modelRange);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.ISourceViewer#setDocument(org.eclipse.jface.text.IDocument,
+	 *      org.eclipse.jface.text.source.IAnnotationModel, int, int)
+	 */
+	public void setDocument(IDocument document, IAnnotationModel annotationModel, int modelRangeOffset, int modelRangeLength) {
+		// partial fix for:
+		// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=1970
+		// when our document is set, especially to null during close,
+		// immediately uninstall the reconciler.
+		// this is to avoid an unnecessary final "reconcile"
+		// that blocks display thread
+		if (document == null) {
+			if (fReconciler != null) {
+				fReconciler.uninstall();
+			}
+		}
+
+		super.setDocument(document, annotationModel, modelRangeOffset, modelRangeLength);
+
+		if (document instanceof IStructuredDocument) {
+			IStructuredDocument structuredDocument = (IStructuredDocument) document;
+
+			// notify highlighter
+			updateHighlighter(structuredDocument);
+
+			// set the formatter again now that document has been set
+			if (!fFormatterSet && fConfiguration != null) {
+				fContentFormatter = fConfiguration.getContentFormatter(this);
+				fFormatterSet = true;
+			}
+
+			// set document in the viewer-based undo manager
+			if (fUndoManager != null) {
+				fUndoManager.disconnect();
+				fUndoManager.connect(this);
+			}
+			// CaretEvent is not sent to ViewerSelectionManager after Save As.
+			// Need to notify ViewerSelectionManager here.
+			// notifyViewerSelectionManager(getSelectedRange().x,
+			// getSelectedRange().y);
+		}
+	}
+
+	public ContentAssistantFacade getContentAssistFacade() {
+		return fContentAssistantFacade;
+	}
+
+	/**
+	 * Uninstalls anything that was installed by configure
+	 */
+	public void unconfigure() {
+		Logger.trace("Source Editor", "StructuredTextViewer::unconfigure entry"); //$NON-NLS-1$ //$NON-NLS-2$
+		if (fHighlighter != null) {
+			fHighlighter.uninstall();
+			fHighlighter = null;
+		}
+		
+		if (fRecHighlighter != null) {
+			fRecHighlighter.uninstall();
+			fRecHighlighter = null;
+		}
+
+		if (fAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover) fAnnotationHover).release();
+		}
+
+		if (fOverviewRulerAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover) fOverviewRulerAnnotationHover).release();
+		}
+
+		super.unconfigure();
+		fConfiguration = null;
+		Logger.trace("Source Editor", "StructuredTextViewer::unconfigure exit"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.core.undo.IDocumentSelectionMediator#undoOperationSelectionChanged(org.eclipse.wst.sse.core.undo.UndoDocumentEvent)
+	 */
+	public void undoOperationSelectionChanged(UndoDocumentEvent event) {
+		if (event.getRequester() != null && event.getRequester().equals(this) && event.getDocument().equals(getDocument())) {
+			// BUG107687: Undo/redo do not scroll editor
+			ITextSelection selection = new TextSelection(event.getOffset(), event.getLength());
+			setSelection(selection, true);
+		}
+	}
+
+	private void updateHighlighter(IStructuredDocument document) {
+		boolean documentSet = false;
+		
+		// if highlighter has not been created yet, initialize and install it
+		if (fRecHighlighter == null && fConfiguration instanceof StructuredTextViewerConfiguration) {
+			String[] types = fConfiguration.getConfiguredContentTypes(this);
+			for (int i = 0; i < types.length; i++) {
+				String t = types[i];
+
+				// add highlighter/linestyleprovider
+				LineStyleProvider[] providers = ((StructuredTextViewerConfiguration) fConfiguration).getLineStyleProviders(this, t);
+				if (providers != null) {
+					for (int j = 0; j < providers.length; ++j) {
+						
+						if(fRecHighlighter == null) {
+							fRecHighlighter = new ReconcilerHighlighter();
+							((StructuredTextViewerConfiguration) fConfiguration).setHighlighter(fRecHighlighter);
+						}
+						if (providers[j] instanceof AbstractLineStyleProvider) {
+							((AbstractLineStyleProvider) providers[j]).init(document, fRecHighlighter);
+							fRecHighlighter.addProvider(t, providers[j]);
+						}
+						else {
+							// init with compatibility instance
+							if (fHighlighter == null) {
+								fHighlighter = new CompatibleHighlighter();
+							}
+							Logger.log(Logger.INFO_DEBUG, "CompatibleHighlighter installing compatibility for " + providers[j].getClass()); //$NON-NLS-1$
+							providers[j].init(document, fHighlighter);
+							fHighlighter.addProvider(t, providers[j]);
+						}
+					}
+				}
+			}
+			
+			if(fRecHighlighter != null)
+				fRecHighlighter.install(this);
+			if(fHighlighter != null) {
+				fHighlighter.setDocumentPartitioning(fConfiguration.getConfiguredDocumentPartitioning(this));
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=203347
+				// make sure to set document before install
+				fHighlighter.setDocument(document);
+				fHighlighter.install(this);
+				documentSet = true;
+			}
+		}
+		if (fHighlighter != null && !documentSet)
+			fHighlighter.setDocument(document);
+		
+		// install content type independent plugins
+		if (fPresentationReconciler != null)
+			fPresentationReconciler.uninstall();
+		// 228847 - XSL Content Assist tests fail with Null Pointer on Highlighter
+		if(fConfiguration != null)
+			fPresentationReconciler = fConfiguration.getPresentationReconciler(this);
+		
+		if (fPresentationReconciler != null)
+			fPresentationReconciler.install(this);
+
+	}
+
+	/**
+	 * Make sure indentation is correct before using.
+	 */
+	private void updateIndentationPrefixes() {
+		SourceViewerConfiguration configuration = fConfiguration;
+		if (fConfiguration != null) {
+			String[] types = configuration.getConfiguredContentTypes(this);
+			for (int i = 0; i < types.length; i++) {
+				String[] prefixes = configuration.getIndentPrefixes(this, types[i]);
+				if (prefixes != null && prefixes.length > 0)
+					setIndentPrefixes(prefixes, types[i]);
+			}
+		}
+	}
+	
+	/**
+	 * Prepends the text presentation listener at the beginning of the viewer's
+	 * list of text presentation listeners.  If the listener is already registered
+	 * with the viewer this call moves the listener to the beginning of
+	 * the list.
+	 *
+	 * @param listener the text presentation listener
+	 * @since 3.1
+	 */
+	public void prependTextPresentationListener(ITextPresentationListener listener) {
+
+		Assert.isNotNull(listener);
+
+		if (fTextPresentationListeners == null)
+			fTextPresentationListeners= new ArrayList();
+
+		fTextPresentationListeners.remove(listener);
+		fTextPresentationListeners.add(0, listener);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/TextDropAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/TextDropAction.java
new file mode 100644
index 0000000..82bc336
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/TextDropAction.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * TextDropAction
+ */
+public class TextDropAction extends AbstractDropAction {
+	public boolean run(DropTargetEvent event, IEditorPart targetEditor) {
+		return insert((String) event.data, targetEditor);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/TransferBuilder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/TransferBuilder.java
new file mode 100644
index 0000000..1d7d64a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/TransferBuilder.java
@@ -0,0 +1,667 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.wst.sse.ui.internal.extension.DropActionProxy;
+import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Builds drop target transfers, drag source transfers, and drop actions
+ */
+public class TransferBuilder extends RegistryReader {
+
+	public static final String ATT_CLASS = "class"; //$NON-NLS-1$
+	public static final String ATT_ID = "id"; //$NON-NLS-1$
+	public static final String ATT_METHOD = "method"; //$NON-NLS-1$
+	public static final String ATT_PRIORITY = "priority"; //$NON-NLS-1$
+	public static final String ATT_SINGLETON = "singleton"; //$NON-NLS-1$
+	public static final String ATT_TARGET_ID = "targetID"; //$NON-NLS-1$
+	public static final String ATT_TRANSFER_ID = "transferID"; //$NON-NLS-1$
+
+	private final static boolean debugTime = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/transferbuilder/time")); //$NON-NLS-1$  //$NON-NLS-2$
+
+	public static final String PL_DRAG_SOURCE_TRANSFERS = "dragSourceTransfers"; //$NON-NLS-1$
+	public static final String PL_DROP_TARGET_TRANSFERS = "dropTargetTransfers"; //$NON-NLS-1$
+
+	public static final String PLUGIN_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+
+	public static final String[] PRIORITIES = {"highest", "high", "mid", "low", "lowest"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+
+	public static final String TAG_DRAG_SOURCE_CONTRIBUTION = "dragSourceContribution"; //$NON-NLS-1$
+	public static final String TAG_DROP_ACTION = "dropAction"; //$NON-NLS-1$
+	public static final String TAG_DROP_TARGET_CONTRIBUTION = "dropTargetContribution"; //$NON-NLS-1$
+
+	public static final String TAG_TRANSFER = "transfer"; //$NON-NLS-1$
+
+	public static final String TRUE = "true"; //$NON-NLS-1$
+
+	private boolean useProxy;
+
+	class TransferProxyForDelayLoading extends Transfer {
+	    private IConfigurationElement element;
+	    private String classAttribute;
+	    private Transfer proxy;
+        private Method getTypeIdsMethod, getTypeNamesMethod, javaToNativeMethod, nativeToJavaMethod;
+
+	    TransferProxyForDelayLoading() {
+	        super();
+	    }
+
+	    TransferProxyForDelayLoading(IConfigurationElement elm, String clsAttr) {
+	        super();
+	        this.element = elm;
+	        this.classAttribute = clsAttr;
+	    }
+	    
+	    private Transfer newInstance() {
+	        if ((element != null) && (classAttribute != null)) {
+		        Object o = createExtension(element, classAttribute);
+		        if (o instanceof Transfer) {
+		            element = null;
+		            classAttribute = null;
+		            return (Transfer)o;
+		        }
+	        }
+	        return null;
+	    }
+
+	    public TransferData[] getSupportedTypes() {
+	        if (proxy == null) {
+	            proxy = newInstance();
+	        }
+	        if (proxy != null) {
+	            return proxy.getSupportedTypes();
+	        }
+	        return new TransferData[0];
+        }
+        protected int[] getTypeIds() {
+	        if (proxy == null) {
+	            proxy = newInstance();
+	        }
+	        if (proxy != null) {
+                if (getTypeIdsMethod == null) {
+    	            Class runtimeClass = proxy.getClass();
+                    NoSuchMethodException e = null;
+                    while (runtimeClass != null) {
+        	            try {
+        	                getTypeIdsMethod = runtimeClass.getDeclaredMethod("getTypeIds", new Class[0]);//$NON-NLS-1$
+                            getTypeIdsMethod.setAccessible(true);
+                            break;
+        	            } catch (NoSuchMethodException e1) {
+                            e = e1;
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            } catch (SecurityException e2) {
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            }
+                    }
+                    if ((getTypeIdsMethod == null) && (e != null)) {
+                        Logger.logException(e);
+                    }
+                }
+                if (getTypeIdsMethod != null) {
+                    try {
+                         // changed Integer[] return type to int[]
+                        int[] r = (int[])getTypeIdsMethod.invoke(proxy, new Object[0]);
+                        if ((r != null) && (r.length > 0)) {
+                            int[] ret = new int[r.length];
+                            for(int i = 0; i < r.length; i++) {
+                                ret[i] = r[i];
+                            }
+                            return ret;
+                        }
+                    } catch (IllegalAccessException e2) {
+                        Logger.logException(e2);
+                    } catch (InvocationTargetException e3) {
+                        Logger.logException(e3);
+                    }
+                }
+	        }
+            return new int[0];
+        }
+        protected String[] getTypeNames() {
+	        if (proxy == null) {
+	            proxy = newInstance();
+	        }
+	        if (proxy != null) {
+                if (getTypeNamesMethod == null) {
+    	            Class runtimeClass = proxy.getClass();
+                    NoSuchMethodException e = null;
+                    while (runtimeClass != null) {
+        	            try {
+        	                getTypeNamesMethod = runtimeClass.getDeclaredMethod("getTypeNames", new Class[0]);//$NON-NLS-1$
+                            getTypeNamesMethod.setAccessible(true);
+                            break;
+        	            } catch (NoSuchMethodException e1) {
+                            e = e1;
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            } catch (SecurityException e2) {
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            }
+                    }
+                    if ((getTypeNamesMethod == null) && (e != null)) {
+                        Logger.logException(e);
+                    }
+                }
+                if (getTypeNamesMethod != null) {
+                    try {
+                        return (String[])getTypeNamesMethod.invoke(proxy, new Object[0]);
+                    } catch (IllegalAccessException e2) {
+                        Logger.logException(e2);
+                    } catch (InvocationTargetException e3) {
+                        Logger.logException(e3);
+                    }
+                }
+	        }
+            return new String[0];
+        }
+        public boolean isSupportedType(TransferData transferData) {
+	        if (proxy == null) {
+	            proxy = newInstance();
+	        }
+	        if (proxy != null) {
+	            return proxy.isSupportedType(transferData);
+	        }
+            return false;
+        }
+        protected void javaToNative(Object object, TransferData transferData) {
+	        if (proxy == null) {
+	            proxy = newInstance();
+	        }
+	        if (proxy != null) {
+                if (javaToNativeMethod == null) {
+                    Class runtimeClass = proxy.getClass();
+                    NoSuchMethodException e = null;
+                    while (runtimeClass != null) {
+        	            try {
+        	                javaToNativeMethod = runtimeClass.getDeclaredMethod("javaToNative", new Class[]{object.getClass(), transferData.getClass()});//$NON-NLS-1$
+        	                javaToNativeMethod.setAccessible(true);
+                            break;
+        	            } catch (NoSuchMethodException e1) {
+                            e = e1;
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            } catch (SecurityException e2) {
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            }
+                    }
+                    if ((javaToNativeMethod == null) && (e != null)) {
+                        Logger.logException(e);
+                    }
+                }
+                if (javaToNativeMethod != null) {
+                    try {
+                        javaToNativeMethod.invoke(proxy, new Object[]{object, transferData});
+                    } catch (IllegalAccessException e2) {
+                        Logger.logException(e2);
+                    } catch (InvocationTargetException e3) {
+                        Logger.logException(e3);
+                    }
+                }
+	        }
+        }
+        protected Object nativeToJava(TransferData transferData) {
+	        if (proxy == null) {
+	            proxy = newInstance();
+	        }
+	        if (proxy != null) {
+                if (nativeToJavaMethod == null) {
+                    Class runtimeClass = proxy.getClass();
+                    NoSuchMethodException e = null;
+                    while (runtimeClass != null) {
+                        try {
+                            nativeToJavaMethod = runtimeClass.getDeclaredMethod("nativeToJava", new Class[]{transferData.getClass()});//$NON-NLS-1$
+                            nativeToJavaMethod.setAccessible(true);
+                            break;
+                        } catch (NoSuchMethodException e1) {
+                            e = e1;
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            } catch (SecurityException e2) {
+                            runtimeClass = runtimeClass.getSuperclass();
+        	            }
+                    }
+                    if ((nativeToJavaMethod == null) && (e != null)) {
+                        Logger.logException(e);
+                    }
+                }
+                if (nativeToJavaMethod != null) {
+                    try {
+    	                return nativeToJavaMethod.invoke(proxy, new Object[]{transferData});
+    	            } catch (IllegalAccessException e2) {
+                   		Logger.logException(e2);
+    	            } catch (InvocationTargetException e3) {
+                   		Logger.logException(e3);
+    	            }
+                }
+	        }
+            return new Object();
+        }
+        Transfer getTransferClass() {
+	        if (proxy == null) {
+	            proxy = newInstance();
+	        }
+	        return proxy;
+        }
+        
+        public String toString() {
+        	String clazz = element.getAttribute(classAttribute);
+        	return clazz != null ? clazz : super.toString();
+        }
+	}
+	/**
+	 * @param element
+	 * @param classAttribute
+	 * @return Object
+	 * @throws CoreException
+	 */
+	static Object createExecutableExtension(final IConfigurationElement element, final String classAttribute) throws CoreException {
+
+		Object obj = null;
+
+		String singleton = element.getAttribute(ATT_SINGLETON);
+		String method = element.getAttribute(ATT_METHOD);
+		if (TRUE.equalsIgnoreCase(singleton) && method != null) {
+			try {
+				String name = element.getAttribute(ATT_CLASS);
+				String pluginId = element.getDeclaringExtension().getNamespace();
+				Class cls = Platform.getBundle(pluginId).loadClass(name);
+				Method mtd = cls.getMethod(method, new Class[]{});
+
+				obj = mtd.invoke(null, null);
+			} catch (ClassNotFoundException e) {
+				obj = null;
+			} catch (NoSuchMethodException e) {
+				obj = null;
+			} catch (IllegalAccessException e) {
+				obj = null;
+			} catch (InvocationTargetException e) {
+				obj = null;
+			}
+		} else {
+			obj = element.createExecutableExtension(classAttribute);
+		}
+
+		return obj;
+	}
+
+	/**
+	 * Creates an extension. If the extension plugin has not been loaded a
+	 * busy cursor will be activated during the duration of the load.
+	 * 
+	 * @param element
+	 * @param classAttribute
+	 * @return Object
+	 * @throws CoreException
+	 */
+	public static Object createExtension(final IConfigurationElement element, final String classAttribute) {
+		// If plugin has been loaded create extension.
+		// Otherwise, show busy cursor then create extension.
+		final Object[] result = new Object[1];
+		String pluginId = element.getDeclaringExtension().getNamespace();
+		Bundle bundle = Platform.getBundle(pluginId);
+		if (bundle.getState() == Bundle.ACTIVE) {
+			try {
+				return createExecutableExtension(element, classAttribute);
+			} catch (CoreException e) {
+				handleCreateExecutableException(result, e);
+			}
+		} else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = createExecutableExtension(element, classAttribute);
+					} catch (Exception e) {
+						handleCreateExecutableException(result, e);
+					}
+				}
+			});
+		}
+		return result[0];
+	}
+
+	/**
+	 * @param result
+	 * @param e
+	 */
+	protected static void handleCreateExecutableException(Object[] result, Throwable e) {
+		Logger.logException(e);
+		result[0] = null;
+
+	}
+
+	protected List cache;
+	protected String targetContributionTag;
+
+	protected List targetIDs;
+
+	/**
+	 * @param element
+	 * @return IDropAction
+	 */
+	protected IDropAction createDropAction(IConfigurationElement element) {
+		Object obj = null;
+		obj = createExtension(element, ATT_CLASS);
+		if (obj == null)
+			return null;
+		return (obj instanceof IDropAction) ? (IDropAction) DropActionProxy.newInstance(obj) : null;
+	}
+
+	/**
+	 * @param transferId
+	 * @return IDropAction[]
+	 */
+	protected IDropAction[] createDropActions(String transferId) {
+		if (cache == null)
+			return new IDropAction[0];
+
+		final int num = cache.size();
+		if (num == 0)
+			return new IDropAction[0];
+
+		IDropAction[] as = new IDropAction[num];
+		int j = 0;
+		for (int p = 0; p < PRIORITIES.length; p++) {
+			for (int i = 0; i < num; i++) {
+				Object obj = cache.get(i);
+				if (!(obj instanceof IConfigurationElement))
+					continue;
+
+				IConfigurationElement element = (IConfigurationElement) obj;
+				if (!(TAG_DROP_ACTION.equals(element.getName())) || !(transferId.equals(element.getAttribute(ATT_TRANSFER_ID))))
+					continue;
+
+				if (PRIORITIES[p].equals(element.getAttribute(ATT_PRIORITY)) || (p == 2 && element.getAttribute(ATT_PRIORITY) == null)) {
+					IDropAction a = createDropAction(element);
+					if (a != null) {
+						as[j] = a;
+						j++;
+					}
+				}
+			}
+		}
+
+		if (num == j)
+			return as;
+
+		IDropAction[] as2 = new IDropAction[j];
+		for (int i = 0; i < j; i++) {
+			as2[i] = as[i];
+		}
+
+		return as2;
+	}
+
+	/**
+	 * @param element
+	 * @return Transfer
+	 */
+	protected Transfer createTransfer(IConfigurationElement element) {
+	    Object obj = null;
+	    if (useProxy) {
+	        obj = new TransferProxyForDelayLoading(element, ATT_CLASS);
+	    } else {
+	        obj = createExtension(element, ATT_CLASS);
+	    }
+		if (obj == null)
+			return null;
+		return (obj instanceof Transfer) ? (Transfer) obj : null;
+	}
+
+	/**
+	 * @return Transfer[]
+	 */
+	protected Transfer[] createTransfers() {
+		if (cache == null)
+			return new Transfer[0];
+
+		final int num = cache.size();
+		if (num == 0)
+			return new Transfer[0];
+
+		Transfer[] ts = new Transfer[num];
+		int j = 0;
+		for (int p = 0; p < PRIORITIES.length; p++) {
+			for (int i = 0; i < num; i++) {
+				Object obj = cache.get(i);
+				if (!(obj instanceof IConfigurationElement))
+					continue;
+
+				IConfigurationElement element = (IConfigurationElement) obj;
+				if (!TAG_TRANSFER.equals(element.getName()))
+					continue;
+
+				if (PRIORITIES[p].equals(element.getAttribute(ATT_PRIORITY)) || (p == 2 && element.getAttribute(ATT_PRIORITY) == null)) {
+					Transfer t = createTransfer(element);
+					if (t != null) {
+						ts[j] = t;
+						j++;
+					}
+				}
+			}
+		}
+
+		if (num == j)
+			return ts;
+
+		Transfer[] ts2 = new Transfer[j];
+		for (int i = 0; i < j; i++) {
+			ts2[i] = ts[i];
+		}
+
+		return ts2;
+	}
+
+	/**
+	 * @param editorId
+	 * @return Transfer[]
+	 */
+	public Transfer[] getDragSourceTransfers(String editorId) {
+		return getDragSourceTransfers(new String[]{editorId});
+	}
+
+	/**
+	 * @param editorIds
+	 * @return Transfer[]
+	 */
+	public Transfer[] getDragSourceTransfers(String[] editorIds) {
+		long time0 = System.currentTimeMillis();
+		readContributions(editorIds, TAG_DRAG_SOURCE_CONTRIBUTION, PL_DRAG_SOURCE_TRANSFERS);
+		Transfer[] transfers = createTransfers();
+		if (debugTime)
+			System.out.println(getClass().getName() + "#getDragSourceTransfers(" + editorIds + "): " + transfers.length + " transfers created in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		return transfers;
+	}
+
+	/**
+	 * @deprecated use getDropActions(String editorId, Transfer transfer) for the performance
+	 * @param editorId
+	 * @param className
+	 * @return IDropAction[]
+	 */
+	public IDropAction[] getDropActions(String editorId, String transferClassName) {
+		return getDropActions(new String[]{editorId}, transferClassName);
+	}
+	
+	/**
+	 * @param editorId
+	 * @param class
+	 * @return IDropAction[]
+	 */
+	public IDropAction[] getDropActions(String editorId, Transfer transfer) {
+		return getDropActions(new String[]{editorId}, transfer);
+	}
+	/**
+	 * @deprecated use getDropActions(String[] editorIds, Transfer transfer) for the performance
+	 * @param editorId
+	 * @param className
+	 * @return IDropAction[]
+	 */
+	public IDropAction[] getDropActions(String[] editorIds, String transferClassName) {
+		long time0 = System.currentTimeMillis();
+		readContributions(editorIds, TAG_DROP_TARGET_CONTRIBUTION, PL_DROP_TARGET_TRANSFERS);
+		String transferId = getTransferIdOfClassName(transferClassName);
+		IDropAction[] actions = createDropActions(transferId);
+		if (debugTime)
+			System.out.println(getClass().getName() + "#getDropActions(" + editorIds + "): " + actions.length + " drop actions created in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		return actions;
+	}
+
+	/**
+	 * @param editorId
+	 * @param class
+	 * @return IDropAction[]
+	 */
+	public IDropAction[] getDropActions(String[] editorIds, Transfer transfer) {
+	    String transferClassName;
+	    if (transfer instanceof TransferProxyForDelayLoading) {
+	        transferClassName = ((TransferProxyForDelayLoading)transfer).getTransferClass().getClass().getName();
+	    } else {
+	        transferClassName = transfer.getClass().getName();
+	    }
+	    return getDropActions(editorIds, transferClassName);
+	}
+	/**
+	 * @param editorId
+	 * @return Transfer[]
+	 */
+	public Transfer[] getDropTargetTransfers(String editorId) {
+		return getDropTargetTransfers(new String[]{editorId});
+	}
+
+	/**
+	 * @param editorIds
+	 * @return Transfer[]
+	 */
+	public Transfer[] getDropTargetTransfers(String[] editorIds) {
+		long time0 = System.currentTimeMillis();
+		readContributions(editorIds, TAG_DROP_TARGET_CONTRIBUTION, PL_DROP_TARGET_TRANSFERS);
+		Transfer[] transfers = createTransfers();
+		if (debugTime) {
+			String idlist = ""; //$NON-NLS-1$
+			if (editorIds.length > 0) {
+				for (int i = 0; i < editorIds.length; i++) {
+					idlist += editorIds[i];
+					if (i < editorIds.length - 1)
+						idlist += ","; //$NON-NLS-1$
+				}
+			}
+			System.out.println(getClass().getName() + "#getDropTargetTransfers(" + idlist + "): " + transfers.length + " transfers created in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		}
+		return transfers;
+	}
+
+	/**
+	 * Returns the name of the part ID attribute that is expected in the
+	 * target extension.
+	 * 
+	 * @param element
+	 * @return String
+	 */
+	protected String getTargetID(IConfigurationElement element) {
+		String value = element.getAttribute(ATT_TARGET_ID);
+		return value != null ? value : "???"; //$NON-NLS-1$
+	}
+
+	/**
+	 * @param className
+	 * @return String
+	 */
+	private String getTransferIdOfClassName(String className) {
+		String id = ""; //$NON-NLS-1$
+		final int num = cache.size();
+		if (className == null || cache == null || num == 0)
+			return id;
+
+		for (int i = 0; i < num; i++) {
+			Object obj = cache.get(i);
+			if (obj instanceof IConfigurationElement) {
+				IConfigurationElement element = (IConfigurationElement) obj;
+				if (className.equals(element.getAttribute(ATT_CLASS))) {
+					id = element.getAttribute(ATT_ID);
+					break;
+				}
+			}
+		}
+
+		return (id.length() != 0 ? id : className);
+	}
+
+	/**
+	 * Reads the contributions from the registry for the provided workbench
+	 * part and the provided extension point ID.
+	 * 
+	 * @param id
+	 * @param tag
+	 * @param extensionPoint
+	 */
+	protected void readContributions(String[] ids, String tag, String extensionPoint) {
+		cache = null;
+		targetIDs = Arrays.asList(ids);
+		targetContributionTag = tag;
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		readRegistry(registry, PLUGIN_ID, extensionPoint);
+	}
+
+	protected boolean readElement(IConfigurationElement element) {
+		String tag = element.getName();
+		if (tag.equals(targetContributionTag)) {
+			String id = getTargetID(element);
+			if (id == null || !targetIDs.contains(id)) {
+				// This is not of interest to us - don't go deeper
+				return true;
+			}
+		} else if (tag.equals(TAG_TRANSFER)) {
+			if (cache == null)
+				cache = new ArrayList();
+			cache.add(element);
+			return true; // just cache the element - don't go into it
+		} else if (tag.equals(TAG_DROP_ACTION)) {
+			if (cache == null)
+				cache = new ArrayList();
+			//cache.add(createActionDescriptor(element));
+			cache.add(element);
+			return true; // just cache the action - don't go into
+		} else {
+			return false;
+		}
+
+		readElementChildren(element);
+		return true;
+	}
+	/**
+	 * @deprecated - use TransferBuilder(boolean useProxy) for the performance
+	 */
+	public TransferBuilder() {
+        this(false);
+    }
+
+    public TransferBuilder(boolean useProxy) {
+        super();
+        this.useProxy = useProxy;
+    }
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/UnknownContentTypeDialog.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/UnknownContentTypeDialog.java
new file mode 100644
index 0000000..9bd2f89
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/UnknownContentTypeDialog.java
@@ -0,0 +1,67 @@
+package org.eclipse.wst.sse.ui.internal;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+
+/**
+ * Message dialog informing user that an editor was open on unsupported
+ * content type
+ */
+public class UnknownContentTypeDialog extends MessageDialogWithToggle {
+
+	public UnknownContentTypeDialog(Shell parent, IPreferenceStore store, String key) {
+		// set message to null in super so that message does not appear twice
+		super(parent, SSEUIMessages.UnknownContentTypeDialog_0, null, null, INFORMATION, new String[]{IDialogConstants.OK_LABEL}, 0, SSEUIMessages.UnknownContentTypeDialog_1, false);
+		setPrefStore(store);
+		setPrefKey(key);
+	}
+
+	protected void buttonPressed(int buttonId) {
+		super.buttonPressed(buttonId);
+
+		// overwritten so that value stored is boolean, not string
+		if (buttonId != IDialogConstants.CANCEL_ID && getToggleState() && getPrefStore() != null && getPrefKey() != null) {
+			switch (buttonId) {
+				case IDialogConstants.YES_ID :
+				case IDialogConstants.YES_TO_ALL_ID :
+				case IDialogConstants.PROCEED_ID :
+				case IDialogConstants.OK_ID :
+					getPrefStore().setValue(getPrefKey(), false);
+					break;
+				case IDialogConstants.NO_ID :
+				case IDialogConstants.NO_TO_ALL_ID :
+					getPrefStore().setValue(getPrefKey(), true);
+					break;
+			}
+		}
+
+	}
+
+	protected Control createMessageArea(Composite composite) {
+		super.createMessageArea(composite);
+		Link messageLink = new Link(composite, SWT.NONE);
+		messageLink.setText(SSEUIMessages.UnknownContentTypeDialog_2);
+		messageLink.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				linkClicked();
+			}
+		});
+		return composite;
+	}
+
+	private void linkClicked() {
+		String pageId = "org.eclipse.ui.preferencePages.ContentTypes"; //$NON-NLS-1$
+		PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(getShell(), pageId, new String[]{pageId}, null);
+		dialog.open();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActionContributor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActionContributor.java
new file mode 100644
index 0000000..5002931
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActionContributor.java
@@ -0,0 +1,400 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     David Carver/STAR - [212330] can't contribute to the XML or any SSE based menu
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.actions;
+
+//import java.util.ResourceBundle;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.search.ui.IContextMenuConstants;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.editors.text.TextEditorActionContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.ITextEditorExtension;
+import org.eclipse.ui.texteditor.RetargetTextEditorAction;
+import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
+import org.eclipse.wst.sse.ui.internal.GotoAnnotationAction;
+import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
+import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.ui.OffsetStatusLineContributionItem;
+
+/**
+ * This class should not be used inside multi page editor's
+ * ActionBarContributor, since cascaded init() call from the
+ * ActionBarContributor will causes exception and it leads to lose whole
+ * toolbars.
+ * 
+ * Instead, use SourcePageActionContributor for source page contributor of
+ * multi page editor.
+ * 
+ * Note that this class is still valid for single page editor
+ */
+public class ActionContributor extends TextEditorActionContributor implements ISourceViewerActionBarContributor, IExtendedContributor {
+
+	public static final boolean _showDebugStatus = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/actioncontributor/debugstatusfields")) || Platform.inDebugMode() || Platform.inDevelopmentMode(); //$NON-NLS-1$ //$NON-NLS-2$
+
+	private static final String[] EDITOR_IDS = {"org.eclipse.wst.sse.ui.StructuredTextEditor"}; //$NON-NLS-1$
+
+	protected IExtendedContributor extendedContributor;
+	protected RetargetTextEditorAction fAddBlockComment = null;
+
+	protected Separator fCommandsSeparator = null;
+
+	private OffsetStatusLineContributionItem fDebugStatusOffset = null;
+	protected MenuManager fExpandSelectionToMenu = null;
+	protected GroupMarker fMenuAdditionsGroupMarker = null;
+	protected GotoAnnotationAction fNextAnnotation = null;
+
+	protected GotoAnnotationAction fPreviousAnnotation = null;
+	protected RetargetTextEditorAction fRemoveBlockComment = null;
+	protected RetargetTextEditorAction fShiftLeft = null;
+	protected RetargetTextEditorAction fShiftRight = null;
+	protected RetargetTextEditorAction fStructureSelectEnclosingAction = null;
+	protected RetargetTextEditorAction fStructureSelectHistoryAction = null;
+	protected RetargetTextEditorAction fStructureSelectNextAction = null;
+	protected RetargetTextEditorAction fStructureSelectPreviousAction = null;
+
+	protected RetargetTextEditorAction fToggleComment = null;
+	protected RetargetTextEditorAction fToggleInsertModeAction;
+	protected GroupMarker fToolbarAdditionsGroupMarker = null;
+	protected Separator fToolbarSeparator = null;
+	
+	protected RetargetTextEditorAction fGotoMatchingBracketAction = null;
+
+	public ActionContributor() {
+		super();
+
+		ResourceBundle resourceBundle = SSEUIMessages.getResourceBundle();
+
+		fCommandsSeparator = new Separator();
+
+		// edit commands
+		fStructureSelectEnclosingAction = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_ENCLOSING + StructuredTextEditorActionConstants.UNDERSCORE);
+		fStructureSelectEnclosingAction.setActionDefinitionId(ActionDefinitionIds.STRUCTURE_SELECT_ENCLOSING);
+
+		fStructureSelectNextAction = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_NEXT + StructuredTextEditorActionConstants.UNDERSCORE);
+		fStructureSelectNextAction.setActionDefinitionId(ActionDefinitionIds.STRUCTURE_SELECT_NEXT);
+
+		fStructureSelectPreviousAction = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_PREVIOUS + StructuredTextEditorActionConstants.UNDERSCORE);
+		fStructureSelectPreviousAction.setActionDefinitionId(ActionDefinitionIds.STRUCTURE_SELECT_PREVIOUS);
+
+		fStructureSelectHistoryAction = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_HISTORY + StructuredTextEditorActionConstants.UNDERSCORE);
+		fStructureSelectHistoryAction.setActionDefinitionId(ActionDefinitionIds.STRUCTURE_SELECT_HISTORY);
+
+		fExpandSelectionToMenu = new MenuManager(SSEUIMessages.ExpandSelectionToMenu_label); //$NON-NLS-1$
+		fExpandSelectionToMenu.add(fStructureSelectEnclosingAction);
+		fExpandSelectionToMenu.add(fStructureSelectNextAction);
+		fExpandSelectionToMenu.add(fStructureSelectPreviousAction);
+		fExpandSelectionToMenu.add(fStructureSelectHistoryAction);
+
+		// source commands
+		fShiftRight = new RetargetTextEditorAction(resourceBundle, ITextEditorActionConstants.SHIFT_RIGHT + StructuredTextEditorActionConstants.UNDERSCORE);
+		fShiftRight.setActionDefinitionId(ITextEditorActionDefinitionIds.SHIFT_RIGHT);
+
+		fShiftLeft = new RetargetTextEditorAction(resourceBundle, ITextEditorActionConstants.SHIFT_LEFT + StructuredTextEditorActionConstants.UNDERSCORE);
+		fShiftLeft.setActionDefinitionId(ITextEditorActionDefinitionIds.SHIFT_LEFT);
+
+		fToggleComment = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_TOGGLE_COMMENT + StructuredTextEditorActionConstants.UNDERSCORE);
+		fToggleComment.setActionDefinitionId(ActionDefinitionIds.TOGGLE_COMMENT);
+
+		fAddBlockComment = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_ADD_BLOCK_COMMENT + StructuredTextEditorActionConstants.UNDERSCORE);
+		fAddBlockComment.setActionDefinitionId(ActionDefinitionIds.ADD_BLOCK_COMMENT);
+
+		fRemoveBlockComment = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_REMOVE_BLOCK_COMMENT + StructuredTextEditorActionConstants.UNDERSCORE);
+		fRemoveBlockComment.setActionDefinitionId(ActionDefinitionIds.REMOVE_BLOCK_COMMENT);
+
+		// goto prev/next error
+		// CMVC 249017 for JavaEditor consistancy
+		fPreviousAnnotation = new GotoAnnotationAction("Previous_annotation", false); //$NON-NLS-1$
+		fPreviousAnnotation.setActionDefinitionId("org.eclipse.ui.navigate.previous"); //$NON-NLS-1$
+
+		fNextAnnotation = new GotoAnnotationAction("Next_annotation", true); //$NON-NLS-1$
+		fNextAnnotation.setActionDefinitionId("org.eclipse.ui.navigate.next"); //$NON-NLS-1$
+
+		fGotoMatchingBracketAction = new RetargetTextEditorAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_GOTO_MATCHING_BRACKET + StructuredTextEditorActionConstants.UNDERSCORE);
+		fGotoMatchingBracketAction.setActionDefinitionId(ActionDefinitionIds.GOTO_MATCHING_BRACKET);
+
+		// Read action extensions.
+		ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
+		extendedContributor = builder.readActionExtensions(getExtensionIDs());
+
+		fMenuAdditionsGroupMarker = new GroupMarker(StructuredTextEditorActionConstants.GROUP_NAME_MENU_ADDITIONS);
+		fToolbarSeparator = new Separator();
+		fToolbarAdditionsGroupMarker = new GroupMarker(StructuredTextEditorActionConstants.GROUP_NAME_TOOLBAR_ADDITIONS);
+
+		fToggleInsertModeAction = new RetargetTextEditorAction(resourceBundle, "Editor.ToggleInsertMode.", IAction.AS_CHECK_BOX); //$NON-NLS-1$
+		fToggleInsertModeAction.setActionDefinitionId(ITextEditorActionDefinitionIds.TOGGLE_INSERT_MODE);
+
+		if (_showDebugStatus) {
+			fDebugStatusOffset = new OffsetStatusLineContributionItem(StructuredTextEditorActionConstants.STATUS_CATEGORY_OFFSET, true, 20);
+		}
+	}
+
+	protected void addToMenu(IMenuManager menu) {
+		// edit commands
+/*		IMenuManager editMenu = menu.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
+		if (editMenu != null) {
+			editMenu.add(fCommandsSeparator);
+			editMenu.add(fToggleInsertModeAction);
+			editMenu.add(fCommandsSeparator);
+			editMenu.add(fExpandSelectionToMenu);
+			editMenu.add(fCommandsSeparator);
+			editMenu.add(fMenuAdditionsGroupMarker);
+		}
+
+		// source commands
+		String sourceMenuLabel = SSEUIMessages.SourceMenu_label; //$NON-NLS-1$
+		String sourceMenuId = "sourceMenuId"; // This is just a menu id. No //$NON-NLS-1$
+		// need to translate.
+		// //$NON-NLS-1$
+		IMenuManager sourceMenu = new MenuManager(sourceMenuLabel, sourceMenuId);
+		menu.insertAfter(IWorkbenchActionConstants.M_EDIT, sourceMenu);
+		if (sourceMenu != null) {
+			sourceMenu.add(fCommandsSeparator);
+			sourceMenu.add(fToggleComment);
+			sourceMenu.add(fAddBlockComment);
+			sourceMenu.add(fRemoveBlockComment);
+			sourceMenu.add(fShiftRight);
+			sourceMenu.add(fShiftLeft);
+		}
+		
+		IMenuManager gotoMenu = menu.findMenuUsingPath(IWorkbenchActionConstants.GO_TO);
+		if (gotoMenu != null) {
+			gotoMenu.add(fGotoMatchingBracketAction);
+		}
+*/
+	}
+
+	protected void addToPopupMenu(IMenuManager menu) {
+		// add nothing
+	}
+
+	protected void addToStatusLine(IStatusLineManager manager) {
+		if (_showDebugStatus) {
+			manager.add(fDebugStatusOffset);
+		}
+	}
+
+	protected void addToToolBar(IToolBarManager toolBarManager) {
+/*		toolBarManager.add(fToolbarSeparator);
+		toolBarManager.add(fToolbarAdditionsGroupMarker);
+*/	}
+
+	/**
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager)
+	 */
+	public void contributeToMenu(IMenuManager menu) {
+		super.contributeToMenu(menu);
+
+		IMenuManager editMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
+		if (editMenu != null) {
+			editMenu.appendToGroup(IContextMenuConstants.GROUP_ADDITIONS, fToggleInsertModeAction);
+		}
+/*
+		addToMenu(menu);
+*/
+		if (extendedContributor != null) {
+			extendedContributor.contributeToMenu(menu);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.extension.IPopupMenuContributor#contributeToPopupMenu(org.eclipse.jface.action.IMenuManager)
+	 */
+	public void contributeToPopupMenu(IMenuManager menu) {
+/*
+		addToPopupMenu(menu);
+*/
+		if (extendedContributor != null) {
+			extendedContributor.contributeToPopupMenu(menu);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToStatusLine(org.eclipse.jface.action.IStatusLineManager)
+	 */
+	public void contributeToStatusLine(IStatusLineManager manager) {
+		super.contributeToStatusLine(manager);
+
+		addToStatusLine(manager);
+
+		if (extendedContributor != null) {
+			extendedContributor.contributeToStatusLine(manager);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(IToolBarManager)
+	 */
+	public void contributeToToolBar(IToolBarManager toolBarManager) {
+		super.contributeToToolBar(toolBarManager);
+
+/*		addToToolBar(toolBarManager);
+*/
+		if (extendedContributor != null) {
+			extendedContributor.contributeToToolBar(toolBarManager);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#dispose()
+	 */
+	public void dispose() {
+		// need to call setActiveEditor before super.dispose because in both
+		// setActiveEditor & super.setActiveEditor if getEditorPart ==
+		// activeEditor,
+		// the method is just returned. so to get both methods to run,
+		// setActiveEditor
+		// needs to be called so that it correctly calls super.setActiveEditor
+		setActiveEditor(null);
+
+		super.dispose();
+
+		if (extendedContributor != null)
+			extendedContributor.dispose();
+	}
+
+	protected String[] getExtensionIDs() {
+		return EDITOR_IDS;
+	}
+
+	/**
+	 * @param editor
+	 * @return
+	 */
+	protected ITextEditor getTextEditor(IEditorPart editor) {
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		if (textEditor == null && editor != null)
+			textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);
+		return textEditor;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorActionBarContributor#init(org.eclipse.ui.IActionBars,
+	 *      org.eclipse.ui.IWorkbenchPage)
+	 */
+	public void init(IActionBars bars, IWorkbenchPage page) {
+		super.init(bars, page);
+	}
+
+	/**
+	 * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(IEditorPart)
+	 */
+	public void setActiveEditor(IEditorPart activeEditor) {
+		if (getActiveEditorPart() == activeEditor)
+			return;
+		super.setActiveEditor(activeEditor);
+
+		ITextEditor textEditor = getTextEditor(activeEditor);
+
+/*		IActionBars actionBars = getActionBars();
+		if (actionBars != null) {
+			actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_NEXT_ANNOTATION, fNextAnnotation);
+			actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_PREVIOUS_ANNOTATION, fPreviousAnnotation);
+			actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), fPreviousAnnotation);
+			actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), fNextAnnotation);
+
+			if (textEditor != null) {
+				actionBars.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(), getAction(textEditor, IDEActionFactory.ADD_TASK.getId()));
+				actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(), getAction(textEditor, IDEActionFactory.BOOKMARK.getId()));
+			}
+		}
+
+		fStructureSelectEnclosingAction.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_ENCLOSING));
+		fStructureSelectNextAction.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_NEXT));
+		fStructureSelectPreviousAction.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_PREVIOUS));
+		fStructureSelectHistoryAction.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_STRUCTURE_SELECT_HISTORY));
+
+		fShiftRight.setAction(getAction(textEditor, ITextEditorActionConstants.SHIFT_RIGHT));
+		fShiftLeft.setAction(getAction(textEditor, ITextEditorActionConstants.SHIFT_LEFT));
+
+		fToggleComment.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_TOGGLE_COMMENT));
+		fAddBlockComment.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_ADD_BLOCK_COMMENT));
+		fRemoveBlockComment.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_REMOVE_BLOCK_COMMENT));
+
+		// go to prev/next error
+		// CMVC 249017 for JavaEditor consistancy
+		fPreviousAnnotation.setEditor(textEditor);
+		fNextAnnotation.setEditor(textEditor);
+		fGotoMatchingBracketAction.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_GOTO_MATCHING_BRACKET));
+*/
+		fToggleInsertModeAction.setAction(getAction(textEditor, ITextEditorActionConstants.TOGGLE_INSERT_MODE));
+
+		if (extendedContributor != null) {
+			extendedContributor.setActiveEditor(activeEditor);
+		}
+
+		if (_showDebugStatus && textEditor instanceof ITextEditorExtension) {
+			((ITextEditorExtension) textEditor).setStatusField(fDebugStatusOffset, StructuredTextEditorActionConstants.STATUS_CATEGORY_OFFSET);
+			fDebugStatusOffset.setActiveEditor(textEditor);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.ISourceViewerActionBarContributor#setViewerSpecificContributionsEnabled(boolean)
+	 */
+	public void setViewerSpecificContributionsEnabled(boolean enabled) {
+		fToggleInsertModeAction.setEnabled(enabled);
+/*		fShiftRight.setEnabled(enabled);
+		fShiftLeft.setEnabled(enabled);
+		fNextAnnotation.setEnabled(enabled);
+		fPreviousAnnotation.setEnabled(enabled);
+*/
+		/*
+		 * fComment.setEnabled(enabled); fUncomment.setEnabled(enabled);
+		 */
+/*		
+		fToggleComment.setEnabled(enabled);
+		fAddBlockComment.setEnabled(enabled);
+		fRemoveBlockComment.setEnabled(enabled);
+*/		
+		// convert line delimiters are not source viewer-specific
+		
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.extension.IExtendedContributor#updateToolbarActions()
+	 */
+	public void updateToolbarActions() {
+		if (extendedContributor != null) {
+			extendedContributor.updateToolbarActions();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActionDefinitionIds.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActionDefinitionIds.java
new file mode 100644
index 0000000..ae26969
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActionDefinitionIds.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.actions;
+
+
+
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+/**
+ * Defines the definitions ids for editor actions.
+ */
+public interface ActionDefinitionIds {
+	// TODO: Can these be better defined with a "plugin prefix" to be more
+	// portable?
+	public final static String ADD_BLOCK_COMMENT = "org.eclipse.wst.sse.ui.add.block.comment";//$NON-NLS-1$
+
+	public final static String CLEANUP_DOCUMENT = "org.eclipse.wst.sse.ui.cleanup.document";//$NON-NLS-1$
+	public final static String COMMENT = "org.eclipse.wst.sse.ui.comment";//$NON-NLS-1$
+	public final static String EDIT_BREAKPOINTS = "org.eclipse.wst.sse.ui.breakpoints.edit";//$NON-NLS-1$
+	public final static String FIND_OCCURRENCES = "org.eclipse.wst.sse.ui.search.find.occurrences";//$NON-NLS-1$
+	public final static String FORMAT_ACTIVE_ELEMENTS = "org.eclipse.wst.sse.ui.format.active.elements";//$NON-NLS-1$
+	public final static String FORMAT_DOCUMENT = "org.eclipse.wst.sse.ui.format.document";//$NON-NLS-1$
+	public final static String MANAGE_BREAKPOINTS = "org.eclipse.wst.sse.ui.breakpoints.manage";//$NON-NLS-1$
+	public final static String OPEN_FILE = "org.eclipse.wst.sse.ui.open.file.from.source";//$NON-NLS-1$
+	public final static String REMOVE_BLOCK_COMMENT = "org.eclipse.wst.sse.ui.remove.block.comment";//$NON-NLS-1$
+	public final static String STRUCTURE_SELECT_ENCLOSING = "org.eclipse.wst.sse.ui.structure.select.enclosing";//$NON-NLS-1$
+	public final static String STRUCTURE_SELECT_HISTORY = "org.eclipse.wst.sse.ui.structure.select.last";//$NON-NLS-1$
+	public final static String STRUCTURE_SELECT_NEXT = "org.eclipse.wst.sse.ui.structure.select.next";//$NON-NLS-1$
+	public final static String STRUCTURE_SELECT_PREVIOUS = "org.eclipse.wst.sse.ui.structure.select.previous";//$NON-NLS-1$
+	public final static String TOGGLE_COMMENT = "org.eclipse.wst.sse.ui.toggle.comment";//$NON-NLS-1$
+	public final static String TOGGLE_BREAKPOINTS = "org.eclipse.wst.sse.ui.breakpoints.toggle";//$NON-NLS-1$
+	public final static String UNCOMMENT = "org.eclipse.wst.sse.ui.uncomment";//$NON-NLS-1$
+	public final static String SHOW_OUTLINE = "org.eclipse.wst.sse.ui.quick_outline";//$NON-NLS-1$
+
+	// registered command IDs, so we pick up the declared key bindings
+	public static final String GOTO_MATCHING_BRACKET= "org.eclipse.wst.sse.ui.goto.matching.bracket"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActiveEditorActionHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActiveEditorActionHandler.java
new file mode 100644
index 0000000..54586eb
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActiveEditorActionHandler.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.swt.events.HelpListener;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @deprecated actions are not properly activated with this handler so do not
+ *             use
+ */
+public class ActiveEditorActionHandler implements IAction {
+
+	private String fActionId;
+	private IWorkbenchSite fSite;
+	private IAction fTargetAction;
+
+	public ActiveEditorActionHandler(IWorkbenchSite site, String id) {
+		super();
+		fActionId = id;
+		fSite = site;
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+	 */
+	public void addPropertyChangeListener(IPropertyChangeListener listener) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getAccelerator()
+	 */
+	public int getAccelerator() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getAccelerator() : 0);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getActionDefinitionId()
+	 */
+	public String getActionDefinitionId() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getActionDefinitionId() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getDescription()
+	 */
+	public String getDescription() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getDescription() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getDisabledImageDescriptor()
+	 */
+	public ImageDescriptor getDisabledImageDescriptor() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getDisabledImageDescriptor() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getHelpListener()
+	 */
+	public HelpListener getHelpListener() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getHelpListener() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getHoverImageDescriptor()
+	 */
+	public ImageDescriptor getHoverImageDescriptor() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getHoverImageDescriptor() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getId()
+	 */
+	public String getId() {
+		return getClass().getName() + hashCode();
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getImageDescriptor()
+	 */
+	public ImageDescriptor getImageDescriptor() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getImageDescriptor() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getMenuCreator()
+	 */
+	public IMenuCreator getMenuCreator() {
+		return null;
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getStyle()
+	 */
+	public int getStyle() {
+		return IAction.AS_PUSH_BUTTON;
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getText()
+	 */
+	public String getText() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getText() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#getToolTipText()
+	 */
+	public String getToolTipText() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.getToolTipText() : null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#isChecked()
+	 */
+	public boolean isChecked() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.isChecked() : true);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#isEnabled()
+	 */
+	public boolean isEnabled() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.isEnabled() : false);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.IAction#isHandled()
+	 */
+	public boolean isHandled() {
+		updateTargetAction();
+		return (fTargetAction != null ? fTargetAction.isHandled() : false);
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+	 */
+	public void removePropertyChangeListener(IPropertyChangeListener listener) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		updateTargetAction();
+		if (fTargetAction != null)
+			fTargetAction.run();
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#runWithEvent(org.eclipse.swt.widgets.Event)
+	 */
+	public void runWithEvent(Event event) {
+		updateTargetAction();
+		if (fTargetAction != null)
+			fTargetAction.runWithEvent(event);
+	}
+
+	/**
+	 * NOT SUPPORTED
+	 * 
+	 * @see org.eclipse.jface.action.IAction#setAccelerator(int)
+	 */
+	public void setAccelerator(int keycode) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setActionDefinitionId(java.lang.String)
+	 */
+	public void setActionDefinitionId(String id) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setChecked(boolean)
+	 */
+	public void setChecked(boolean checked) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setDescription(java.lang.String)
+	 */
+	public void setDescription(String text) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setDisabledImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+	 */
+	public void setDisabledImageDescriptor(ImageDescriptor newImage) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setEnabled(boolean)
+	 */
+	public void setEnabled(boolean enabled) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setHelpListener(org.eclipse.swt.events.HelpListener)
+	 */
+	public void setHelpListener(HelpListener listener) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setHoverImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+	 */
+	public void setHoverImageDescriptor(ImageDescriptor newImage) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setId(java.lang.String)
+	 */
+	public void setId(String id) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+	 */
+	public void setImageDescriptor(ImageDescriptor newImage) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setMenuCreator(org.eclipse.jface.action.IMenuCreator)
+	 */
+	public void setMenuCreator(IMenuCreator creator) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setText(java.lang.String)
+	 */
+	public void setText(String text) {
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#setToolTipText(java.lang.String)
+	 */
+	public void setToolTipText(String text) {
+	}
+
+	private void updateTargetAction() {
+		if (fSite != null && fSite.getWorkbenchWindow() != null && fSite.getWorkbenchWindow().getActivePage() != null) {
+			IEditorPart part = fSite.getWorkbenchWindow().getActivePage().getActiveEditor();
+			ITextEditor editor = null;
+			if (part instanceof ITextEditor)
+				editor = (ITextEditor) part;
+			else
+				editor = (ITextEditor) (part != null ? part.getAdapter(ITextEditor.class) : null);
+			if (editor != null) {
+				fTargetAction = editor.getAction(fActionId);
+			} else {
+				fTargetAction = null;
+			}
+		} else
+			fTargetAction = null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/CleanupAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/CleanupAction.java
new file mode 100644
index 0000000..804df2c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/CleanupAction.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.actions;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextEditorAction;
+import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+public abstract class CleanupAction extends TextEditorAction {
+	protected Dialog fCleanupDialog;
+
+	public CleanupAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+		super(bundle, prefix, editor);
+	}
+
+	protected abstract Dialog getCleanupDialog(Shell shell);
+
+	protected abstract IStructuredCleanupProcessor getCleanupProcessor();
+
+	public void run() {
+		if (getTextEditor() instanceof StructuredTextEditor) {
+			final StructuredTextEditor editor = (StructuredTextEditor) getTextEditor();
+			Dialog cleanupDialog = getCleanupDialog(editor.getSite().getShell());
+			if (cleanupDialog != null) {
+				if (cleanupDialog.open() == Window.OK) {
+					// setup runnable
+					Runnable runnable = new Runnable() {
+						public void run() {
+							IStructuredCleanupProcessor cleanupProcessor = getCleanupProcessor();
+							if (cleanupProcessor != null)
+								cleanupProcessor.cleanupModel(editor.getModel());
+						}
+					};
+
+					// TODO: make independent of 'model'.
+					IStructuredModel model = editor.getModel();
+					if (model != null) {
+						try {
+							// begin recording
+							ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+							model.beginRecording(this, SSEUIMessages.Cleanup_Document_UI_, SSEUIMessages.Cleanup_Document_UI_, selection.getOffset(), selection.getLength()); //$NON-NLS-1$ //$NON-NLS-2$
+
+							// tell the model that we are about to make a big
+							// model change
+							model.aboutToChangeModel();
+
+							// run
+							BusyIndicator.showWhile(editor.getTextViewer().getControl().getDisplay(), runnable);
+						} finally {
+							// tell the model that we are done with the big
+							// model
+							// change
+							model.changedModel();
+
+							// end recording
+							ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+							model.endRecording(this, selection.getOffset(), selection.getLength());
+						}
+					}
+				}
+
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/FormatActionDelegate.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/FormatActionDelegate.java
new file mode 100644
index 0000000..ed11b90
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/FormatActionDelegate.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.actions;
+
+import java.io.IOException;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.ITextFileBuffer;
+import org.eclipse.core.filebuffers.ITextFileBufferManager;
+import org.eclipse.core.filebuffers.LocationKind;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.internal.exceptions.MalformedInputExceptionWithDetail;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.ui.internal.FormatProcessorsExtensionReader;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+public class FormatActionDelegate extends ResourceActionDelegate {
+
+	class FormatJob extends Job {
+
+		public FormatJob(String name) {
+			super(name);
+		}
+
+		protected IStatus run(IProgressMonitor monitor) {
+			IStatus status = Status.OK_STATUS;
+
+			Object[] elements = fSelection.toArray();
+			monitor.beginTask("", elements.length); //$NON-NLS-1$
+			for (int i = 0; i < elements.length; i++) {
+				if (elements[i] instanceof IResource) {
+					process(new SubProgressMonitor(monitor, 1), (IResource) elements[i]);
+				}
+				else {
+					monitor.worked(1);
+				}
+			}
+			monitor.done();
+
+			if (fErrorStatus.getChildren().length > 0) {
+				status = fErrorStatus;
+				fErrorStatus = new MultiStatus(SSEUIPlugin.ID, IStatus.ERROR, SSEUIMessages.FormatActionDelegate_errorStatusMessage, null); //$NON-NLS-1$
+			}
+
+			return status;
+		}
+
+	}
+
+	private MultiStatus fErrorStatus = new MultiStatus(SSEUIPlugin.ID, IStatus.ERROR, SSEUIMessages.FormatActionDelegate_errorStatusMessage, null); //$NON-NLS-1$
+
+	protected void format(IProgressMonitor monitor, IFile file) {
+		if(monitor == null || monitor.isCanceled())
+			return;
+		
+		try {
+			monitor.beginTask("", 100);
+			IContentDescription contentDescription = file.getContentDescription();
+			monitor.worked(5);
+			if (contentDescription != null) {
+				IContentType contentType = contentDescription.getContentType();
+				IStructuredFormatProcessor formatProcessor = getFormatProcessor(contentType.getId());
+				if (formatProcessor != null && (monitor == null || !monitor.isCanceled())) {
+					String message = NLS.bind(SSEUIMessages.FormatActionDelegate_3, new String[]{file.getFullPath().toString().substring(1)});					monitor.subTask(message);
+					formatProcessor.setProgressMonitor(monitor);
+					formatProcessor.formatFile(file);
+				}
+			}
+			monitor.worked(95);
+			monitor.done();
+		} catch (MalformedInputExceptionWithDetail e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_5, new String[]{file.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		} catch (IOException e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{file.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		} catch (CoreException e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{file.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		}
+	}
+	
+	private Display getDisplay() {
+
+		// Note: the workbench should always have a display
+		// (unless running headless), whereas Display.getCurrent()
+		// only returns the display if the currently executing thread
+		// has one.
+		if (PlatformUI.isWorkbenchRunning())
+			return PlatformUI.getWorkbench().getDisplay();
+		else
+			return null;
+	}
+
+	protected void format(final IProgressMonitor monitor, IResource resource) {
+		if (resource instanceof IFile) {
+			final IFile file = (IFile) resource;
+			
+			// BUG 178598 - If the resource is shared, and it's possible to
+			// get the workbench Display, the UI thread is asked to execute the
+			// format of the file when it can
+			try {
+				ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
+				ITextFileBuffer buffer = null;
+				
+				try {
+					if(manager != null) {
+						manager.connect(file.getFullPath(), LocationKind.IFILE, monitor);
+						buffer = manager.getTextFileBuffer(resource.getFullPath(), LocationKind.IFILE);
+					}
+					
+					if(buffer != null && buffer.isShared()) {
+						Display display = getDisplay();
+						display.syncExec(new Runnable() {
+							public void run() {
+								format(monitor, file);
+							}
+						});
+					}
+					else
+						format(monitor, file);
+				}
+				finally {
+					if(manager != null)
+						manager.disconnect(file.getFullPath(), LocationKind.IFILE, new SubProgressMonitor(monitor, 1));
+				}
+			}
+			catch(CoreException e) {
+				String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{file.getFullPath().toString()});
+				fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+			}
+			finally {
+				if(monitor != null)
+					monitor.done();
+			}
+			
+		} else if (resource instanceof IContainer) {
+			IContainer container = (IContainer) resource;
+			
+			try {
+				IResource[] members = container.members();
+				monitor.beginTask("", members.length);
+				for (int i = 0; i < members.length; i++) {
+					if (monitor != null && !monitor.isCanceled())
+						format(new SubProgressMonitor(monitor, 1), members[i]);
+				}
+				monitor.done();
+			} catch (CoreException e) {
+				String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{resource.getFullPath().toString()});
+				fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+			}
+		}
+	}
+
+	protected IStructuredFormatProcessor getFormatProcessor(String contentTypeId) {
+		return FormatProcessorsExtensionReader.getInstance().getFormatProcessor(contentTypeId);
+	}
+
+	protected Job getJob() {
+		return new FormatJob(SSEUIMessages.FormatActionDelegate_jobName); //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.edit.util.ResourceActionDelegate#process(org.eclipse.core.runtime.IProgressMonitor,
+	 *      org.eclipse.core.resources.IResource)
+	 */
+	protected void process(IProgressMonitor monitor, IResource resource) {
+		monitor.beginTask("", 100);
+		format(new SubProgressMonitor(monitor, 98), resource);
+
+		try {
+			resource.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 2));
+		} catch (CoreException e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{resource.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		}
+		monitor.done();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.internal.actions.ResourceActionDelegate#processorAvailable(org.eclipse.core.resources.IResource)
+	 */
+	protected boolean processorAvailable(IResource resource) {
+		boolean result = false;
+		if (resource.isAccessible()) {
+			try {
+				if (resource instanceof IFile) {
+					IFile file = (IFile) resource;
+
+					IStructuredFormatProcessor formatProcessor = null;
+					IContentDescription contentDescription = file.getContentDescription();
+					if (contentDescription != null) {
+						IContentType contentType = contentDescription.getContentType();
+						formatProcessor = getFormatProcessor(contentType.getId());
+					}
+					if (formatProcessor != null)
+						result = true;
+				}
+				else if (resource instanceof IContainer) {
+					IContainer container = (IContainer) resource;
+					IResource[] members;
+					members = container.members();
+					for (int i = 0; i < members.length; i++) {
+						boolean available = processorAvailable(members[i]);
+
+						if (available) {
+							result = true;
+							break;
+						}
+					}
+				}
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ResourceActionDelegate.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ResourceActionDelegate.java
new file mode 100644
index 0000000..2907928
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ResourceActionDelegate.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.actions;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+
+public class ResourceActionDelegate implements IActionDelegate {
+	protected IStructuredSelection fSelection;
+
+	private IWorkbenchSiteProgressService getActiveProgressService() {
+		IWorkbenchSiteProgressService service = null;
+		if (PlatformUI.isWorkbenchRunning()) {
+			IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			if (activeWorkbenchWindow != null) {
+				IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+				if (activePage != null) {
+					IWorkbenchPart activePart = activePage.getActivePart();
+					if (activePart != null) {
+						service = (IWorkbenchSiteProgressService) activePart.getSite().getAdapter(IWorkbenchSiteProgressService.class);
+					}
+				}
+			}
+		}
+		return service;
+	}
+
+	protected Job getJob() {
+		// ResourceActionDelegate does not create background job
+		// subclass creates the background job for the action
+		return null;
+	}
+
+	protected boolean processorAvailable(IResource resource) {
+		// ResourceActionDelegate returns false by default
+		// subclass returns true if processor is available; false otherwise
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		if (fSelection != null && !fSelection.isEmpty()) {
+			Job job = getJob();
+			if (job != null) {
+				IWorkbenchSiteProgressService progressService = getActiveProgressService();
+				if (progressService != null) {
+					progressService.schedule(job);
+				}
+				else {
+					job.schedule();
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof IStructuredSelection) {
+			fSelection = (IStructuredSelection) selection;
+			boolean available = false;
+
+			Object[] elements = fSelection.toArray();
+			for (int i = 0; i < elements.length; i++) {
+				if (elements[i] instanceof IResource) {
+					available = processorAvailable((IResource) elements[i]);
+
+					if (available)
+						break;
+				}
+			}
+
+			action.setEnabled(available);
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/StructuredTextEditorActionConstants.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/StructuredTextEditorActionConstants.java
new file mode 100644
index 0000000..286d8cc
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/StructuredTextEditorActionConstants.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.actions;
+
+
+
+public interface StructuredTextEditorActionConstants {
+	public final static String ACTION_NAME_ADD_BLOCK_COMMENT = "AddBlockComment";//$NON-NLS-1$
+	public final static String ACTION_NAME_CLEANUP_DOCUMENT = "CleanupDocument";//$NON-NLS-1$
+	public final static String ACTION_NAME_COMMENT = "Comment";//$NON-NLS-1$
+	public final static String ACTION_NAME_CONTENTASSIST_CONTEXT_INFORMATION = "ContentAssistContextInformation";//$NON-NLS-1$
+	public final static String ACTION_NAME_CONTENTASSIST_PROPOSALS = "ContentAssistProposals";//$NON-NLS-1$
+	public final static String ACTION_NAME_FIND_OCCURRENCES = "FindOccurrences"; //$NON-NLS-1$
+	public final static String ACTION_NAME_FORMAT_ACTIVE_ELEMENTS = "FormatActiveElements";//$NON-NLS-1$
+	public final static String ACTION_NAME_FORMAT_DOCUMENT = "FormatDocument";//$NON-NLS-1$
+	public final static String ACTION_NAME_MANAGE_BREAKPOINTS = "ManageBreakpoints";//$NON-NLS-1$
+	public final static String ACTION_NAME_OPEN_FILE = "OpenFileFromSource";//$NON-NLS-1$
+	public final static String ACTION_NAME_REMOVE_BLOCK_COMMENT = "RemoveBlockComment";//$NON-NLS-1$
+	public final static String ACTION_NAME_STRUCTURE_SELECT_ENCLOSING = "StructureSelectEnclosing";//$NON-NLS-1$
+	public final static String ACTION_NAME_STRUCTURE_SELECT_HISTORY = "StructureSelectHistory";//$NON-NLS-1$
+	public final static String ACTION_NAME_STRUCTURE_SELECT_NEXT = "StructureSelectNext";//$NON-NLS-1$
+	public final static String ACTION_NAME_STRUCTURE_SELECT_PREVIOUS = "StructureSelectPrevious";//$NON-NLS-1$
+	public final static String ACTION_NAME_TOGGLE_COMMENT = "ToggleComment";//$NON-NLS-1$
+	public final static String ACTION_NAME_UNCOMMENT = "Uncomment";//$NON-NLS-1$
+	public final static String ACTION_NAME_GOTO_MATCHING_BRACKET = "GotoMatchingBracket";//$NON-NLS-1$
+	public final static String ACTION_NAME_SHOW_OUTLINE = "ShowQuickOutline"; //$NON-NLS-1$
+
+	/**
+	 * @deprecated use UNDERSCORE instead
+	 */
+	public final static String DOT = ".";//$NON-NLS-1$
+	public final static String UNDERSCORE = "_"; //$NON-NLS-1$
+
+	public final static String GROUP_NAME_MENU_ADDITIONS = "MenuAdditions";//$NON-NLS-1$
+	public final static String GROUP_NAME_TOOLBAR_ADDITIONS = "ToolbarAdditions";//$NON-NLS-1$
+
+	public final static String STATUS_CATEGORY_OFFSET = "Offset";//$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/BlockCommentingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/BlockCommentingStrategy.java
new file mode 100644
index 0000000..5dade3e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/BlockCommentingStrategy.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.comment;
+
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+/**
+ * <p>Represents a Block Comment commenting strategy</p>
+ */
+public class BlockCommentingStrategy extends CommentingStrategy {
+	/** the prefix of the block comment associated with this strategy */
+	private String fPrefix;
+	
+	/** the suffix of the block comment associated with this strategy */
+	private String fSuffix;
+	
+	/**
+	 * @param prefix the prefix of the block comment associated with this strategy
+	 * @param suffix the suffix of the block comment associated with this strategy
+	 */
+	public BlockCommentingStrategy(String prefix, String suffix) {
+		super();
+		this.fPrefix = prefix;
+		this.fSuffix = suffix;
+	}
+
+	/**
+	 * <p>When applying a block comment it also removes any block comments associated
+	 * with this strategy that would now be enclosed by the new block comment</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#apply(
+	 * 	org.eclipse.wst.sse.core.internal.provisional.IStructuredModel, int, int)
+	 */
+	public void apply(IStructuredDocument document, int offset, int length) throws BadLocationException {
+		int commentPrefixOffset = offset;
+		int commentSuffixOffset = commentPrefixOffset + length;
+		
+		try {
+			document.replace(commentSuffixOffset, 0, " " + this.fSuffix); //$NON-NLS-1$
+			this.remove(document, commentPrefixOffset + this.fPrefix.length(), length, false);
+			document.replace(commentPrefixOffset, 0, this.fPrefix + " "); //$NON-NLS-1$
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#remove(
+	 * 	org.eclipse.jface.text.IDocument, int, int)
+	 */
+	public void remove(IStructuredDocument document, int offset, int length, boolean removeEnclosing) throws BadLocationException {
+		IRegion region = new Region(offset, length);
+		ITypedRegion[] typedRegions = document.computePartitioning(region.getOffset(), region.getLength());
+		List commentRegions = this.getAssociatedCommentedRegions(typedRegions);
+		
+		//remove in reverse order as to not effect offset of other regions
+		for(int i = commentRegions.size()-1; i >= 0; --i) {
+			try {
+				//get the comment region
+				ITypedRegion typedRegion = (ITypedRegion)commentRegions.get(i);
+				IRegion commentRegion = new Region(typedRegion.getOffset(), typedRegion.getLength());
+
+				/* because of the nature of structured regions the comment region could actually be a
+				 * sub region that needs to be drilled down too
+				 */
+				if(!this.alreadyCommenting(document, commentRegion)) {
+					IStructuredDocumentRegion structuredRegion =
+						document.getRegionAtCharacterOffset(commentRegion.getOffset());
+					
+					commentRegion = new Region(structuredRegion.getStartOffset(), structuredRegion.getLength());
+					
+					if(!this.alreadyCommenting(document, commentRegion)) {
+						ITextRegion enclosedRegion = structuredRegion.getRegionAtCharacterOffset(typedRegion.getOffset());
+						int enclosedOffset = structuredRegion.getStartOffset(enclosedRegion);
+						commentRegion = new Region(enclosedOffset, structuredRegion.getTextEndOffset(enclosedRegion)-enclosedOffset);
+					}
+				}
+				
+				//at this point should have found the comment region, if not there is an issue
+				if(this.alreadyCommenting(document, commentRegion)) {
+					String regionContent = document.get(commentRegion.getOffset(), commentRegion.getLength());
+					
+					//if found the comment prefix and suffix then uncomment, otherwise log error
+					int commentPrefixOffset = commentRegion.getOffset() + regionContent.indexOf(this.fPrefix);
+					int commentSuffixOffset = commentRegion.getOffset();
+					commentSuffixOffset += regionContent.lastIndexOf(this.fSuffix);
+					
+					//remove comment block depending on if its an enclosing comment block and weather that is allowed
+					if(removeEnclosing || (commentPrefixOffset >= offset && commentSuffixOffset <= offset+length)) {
+						uncomment(document, commentPrefixOffset, this.fPrefix, commentSuffixOffset, this.fSuffix);
+					}
+				} else {
+					Logger.log(Logger.ERROR,
+							"BlockCommentingStrategy#remove could not find the commenting region to remove"); //$NON-NLS-1$
+				}
+			} catch(BadLocationException e) {
+				Logger.logException("This should only ever happen if something has gone wrong with the partitioning", e); //$NON-NLS-1$
+			}
+		}
+	}
+	
+	/**
+	 * <p>A region is already commented by this strategy if it starts with the strategy's associated
+	 * prefix and ends with its associated suffix, ignoring any trailing or leading whitespace</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#alreadyCommenting(
+	 * 	org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IRegion)
+	 */
+	public boolean alreadyCommenting(IStructuredDocument document, IRegion region) throws BadLocationException {
+		String regionContent = document.get(region.getOffset(), region.getLength()).trim();
+		return regionContent.startsWith(this.fPrefix) && regionContent.endsWith(this.fSuffix);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#clone()
+	 */
+	public Object clone() {
+		return new BlockCommentingStrategy(this.fPrefix, this.fSuffix);
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/CommentingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/CommentingStrategy.java
new file mode 100644
index 0000000..c46248c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/CommentingStrategy.java
@@ -0,0 +1,355 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.comment;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+/**
+ * <p>Defines a commenting strategy defined by the <code>org.eclipse.wst.sse.ui.commentinStrategy</code>
+ * extension point and tracked by the {@link CommentingStrategyRegistry}.  Though it is important to
+ * note it is not a one to one relationship of {@link CommentingStrategy}s to extensions, there is actually
+ * one {@link CommentingStrategy} for each content type defined for each 
+ * <code>org.eclipse.wst.sse.ui.commentinStrategy</code> extension.<p>
+ * 
+ * <p>The expected use case is that a {@link CommentingStrategy} is created off the basic configuration
+ * of the extension point and then cloned for each associated content type and then each clone has
+ * its partition information set using {@link #setPartitionInformation}.
+ * Then the {@link CommentingStrategyRegistry} can be used to retrieve applicable {@link CommentingStrategy}s
+ * and apply them to documents.</p>
+ * 
+ * <p>It is important to note that any instance of a {@link CommentingStrategy} is only valid for a specific
+ * content type ID but this relationship is tracked by the {@link CommentingStrategyRegistry} and not by
+ * the strategy itself.  Thus any reference to the strategy being valid for specific or general partition
+ * types is implying it is already only valid for a specific content type</p>
+ */
+public abstract class CommentingStrategy {
+	/** <code>true</code> if this strategy has any required partition types, <code>false</code> otherwise */
+	private boolean fHasRequiredPartitionTypes;
+	
+	/**
+	 * <p>required partition type IDs that must be seen for this strategy to be valid, the number of them
+	 * that must be seen for the strategy to be valid is determined by {@link #fRequireAllRequiredPartitionTypes}
+	 * this requirement is waved if the optional {@link #fAssociatedCommentPartitionTypeID} is specified and
+	 * present because this strategy must be valid if its {@link #fAssociatedCommentPartitionTypeID} is present</p>
+	 * 
+	 * @see #fRequireAllRequiredPartitionTypes
+	 * @see #fAssociatedCommentPartitionTypeID
+	 */
+	private List fRequriedPartitionTypeIDs;
+	
+	/**
+	 * <p>if <code>true</code> then {@link #fAllowablePartitionTypeIDs} is ignored because
+	 * this strategy is valid for any partition type, if <code>false</code> then this
+	 * strategy is only valid for those partition types listed in {@link #fAllowablePartitionTypeIDs}</p>
+	 * 
+	 * @see #fAllowablePartitionTypeIDs
+	 */
+	private boolean fAllPartitionTypesAllowable;
+	
+	/**
+	 * <p>the partition types that this strategy is valid for, it is also automatically valid for
+	 * any partition types listed in {@link #fRequriedPartitionTypeIDs} and the optionally
+	 * specified {@link #fAssociatedCommentPartitionTypeID}</p>
+	 * 
+	 * @see #fAllPartitionTypesAllowable
+	 * @see #fRequriedPartitionTypeIDs
+	 * @see #fAssociatedCommentPartitionTypeID
+	 */
+	private List fAllowablePartitionTypeIDs;
+	
+	/**
+	 * an optional associated comment partition type ID, if this partition type is seen then the
+	 * the {@link #fRequriedPartitionTypeIDs} requirement is waved as to weather this strategy is
+	 * valid or not
+	 * 
+	 * @see #fRequriedPartitionTypeIDs
+	 */
+	private String fAssociatedCommentPartitionTypeID;
+	
+	/**
+	 * <p>Default constructor, the specific initialization is done by
+	 * {@link #setPartitionInformation}</p>
+	 */
+	public CommentingStrategy() {
+		this.fAssociatedCommentPartitionTypeID = null;
+		this.fRequriedPartitionTypeIDs = Collections.EMPTY_LIST;
+		this.fAllowablePartitionTypeIDs = Collections.EMPTY_LIST;
+		this.fHasRequiredPartitionTypes = false;
+		this.fAllPartitionTypesAllowable = false;
+	}
+	
+	/**
+	 * <p>Used to set up the partition information for this strategy</p>
+	 * <p>This information is used to determine if a strategy is valid for a set of
+	 * {@link ITypedRegion}s.</p>
+	 * 
+	 * @param allowablePartitionTypeIDs the partition types this strategy is valid for, the strategy will also
+	 * be considered valid for any of the required partition types
+	 * @param allPartitionTypesAllowable if <code>true</code> then this strategy is valid for any partition types
+	 * thus ignoring the <code>allowablePartitionTypeIDs</code>, <code>false</code> otherwise
+	 * @param requiredPartitionTypeIDs partition type IDs that must be seen for this strategy to be valid, there
+	 * are exceptions to this rule, see {@link #isApplicableFor(ITypedRegion[])}
+	 * @param requireAllRequiredPartitionTypes <code>true</code> if all of the <code>requiredPartitionTypeIDs must
+	 * be seen for this strategy to be valid, <code>false</code> otherwise, there are exceptions to these rules, see
+	 * {@link #isApplicableFor(ITypedRegion[])}
+	 * @param associatedCommentPartitionTypeID optional comment partition type associated with this strategy,
+	 * maybe <code>null</code>
+	 * 
+	 * @see #isApplicableFor(ITypedRegion[])
+	 */
+	protected final void setPartitionInformation(List allowablePartitionTypeIDs, boolean allPartitionTypesAllowable,
+			List requiredPartitionTypeIDs, String associatedCommentPartitionTypeID) {
+		
+		this.fAllPartitionTypesAllowable = allPartitionTypesAllowable;
+		
+		this.fRequriedPartitionTypeIDs = requiredPartitionTypeIDs;
+		if(this.fRequriedPartitionTypeIDs == null) {
+			this.fRequriedPartitionTypeIDs = Collections.EMPTY_LIST;
+		}
+		
+		this.fHasRequiredPartitionTypes = this.fRequriedPartitionTypeIDs.size() != 0;
+		
+		this.fAllowablePartitionTypeIDs = allowablePartitionTypeIDs;
+		if(this.fAllowablePartitionTypeIDs == null) {
+			this.fAllowablePartitionTypeIDs = Collections.EMPTY_LIST;
+		}
+		
+		this.fAssociatedCommentPartitionTypeID = associatedCommentPartitionTypeID;
+	}
+	
+	/**
+	 * <p>Applies this strategy to the given model starting at the given offset for the given length</p>
+	 * 
+	 * @param document {@link IStructuredDocument} to apply this strategy too
+	 * @param offset the offset to start this comment at
+	 * @param length the length of the region to apply this comment too
+	 * 
+	 * @throws BadLocationException it is not the fault of the strategy if callers passes a bad
+	 * <code>offset</code> and/or <code>length</code> for the given <code>model</code>
+	 */
+	public abstract void apply(IStructuredDocument document, int offset, int length) throws BadLocationException;
+	
+	/**
+	 * <p>Remove any comments associated with this strategy from the given model for the given offset to
+	 * the given length.  Weather a comment surrounding the given range should be removed can also be
+	 * specified</p>
+	 * 
+	 * @param document {@link IStructuredDocument} to remove comments associated with this strategy from
+	 * @param offset the location to start removing comments associated with this strategy from
+	 * @param length the length of the region to remove associated comments from
+	 * @param removeEnclosing weather a comment should be removed if it incloses the region specified
+	 * by the given <code>offset</code> and <code>length</code>
+	 * 
+	 * @throws BadLocationException it is not the fault of the strategy if callers passes a bad
+	 * <code>offset</code> and/or <code>length</code> for the given <code>model</code>
+	 */
+	public abstract void remove(IStructuredDocument document, int offset, int length, boolean removeEnclosing) throws BadLocationException;
+	
+	/**
+	 * <p>Determines if the given region is a comment region commented by this strategy.</p>
+	 * 
+	 * @param document {@link IStructuredDocument} containing the given <code>region</code>
+	 * @param region determine if this region is a comment region commented by this strategy
+	 * @return <code>true</code> if the given <code>region</code> has already been
+	 * commented by this strategy, <code>false</code> otherwise
+	 * 
+	 * @throws BadLocationException it is not the fault of the strategy if callers passes a bad
+	 * <code>offset</code> and/or <code>length</code> for the given <code>model</code>
+	 */
+	public abstract boolean alreadyCommenting(IStructuredDocument document, IRegion region) throws BadLocationException;
+	
+	/** 
+	 * <p>Implementers should return a copy of themselves</p>
+	 * <p>Allows the {@link CommentingStrategyRegistry} to create a {@link CommentingStrategy} for
+	 * each of its associated content types.</p>
+	 * 
+	 * @return implementers should return an object of type {@link CommentingStrategy}
+	 * 
+	 * @see java.lang.Object#clone()
+	 */
+	public abstract Object clone();
+	
+	/**
+	 * <p>Determines if this strategy is applicable for the given regions for either commenting or un-commenting. 
+	 * For this strategy to be applicable the given regions must contain at least one or all of the
+	 * {@link #fRequriedPartitionTypeIDs} (depending on the value of {@link #fRequireAllRequiredPartitionTypes})
+	 * or contain at least one region of type {@link #fAssociatedCommentPartitionTypeID}.  Also if the value of
+	 * {@link #fAllPartitionTypesAllowable} is <code>false</code> the given regions must all be of type
+	 * {@link #fAllowablePartitionTypeIDs} and/or {@link #fRequriedPartitionTypeIDs} and/or
+	 * {@link #fAssociatedCommentPartitionTypeID} otherwise the regions can be of any type except for they still
+	 * must beet the required partition type requirements</p>
+	 * 
+	 * @param regions determine if this strategy is applicable for these regions
+	 * @return <code>true</code> if this strategy is applicable for the given <code>regions</code>
+	 * <code>false</code> otherwise.
+	 */
+	public final boolean isApplicableFor(ITypedRegion[] regions) {
+		List partitionTypeIDs = getPartitionTypeIDs(regions);
+		
+		boolean foundAssociatedCommentPartitions = false;
+		if(this.fAssociatedCommentPartitionTypeID != null) {
+			foundAssociatedCommentPartitions = partitionTypeIDs.contains(this.fAssociatedCommentPartitionTypeID);
+			if(foundAssociatedCommentPartitions) {
+				//remove all instances of the comment partition type
+				boolean removed;
+				do {
+					removed = partitionTypeIDs.remove(this.fAssociatedCommentPartitionTypeID);
+				} while(removed);
+			}
+		}
+		
+		//determine if required partitions requirements are met
+		boolean requiredPartitionsRequirementsMet = !this.fHasRequiredPartitionTypes ||
+			partitionTypeIDs.removeAll(this.fRequriedPartitionTypeIDs);
+		
+		//determine if allowable partitions requirements are met
+		boolean allowablePartitionsRequirementsMet = false;
+		if(this.fAllPartitionTypesAllowable) {
+			allowablePartitionsRequirementsMet = true;
+		} else {
+			partitionTypeIDs.removeAll(this.fAllowablePartitionTypeIDs);
+			
+			//at this point all required partitions and allowable partitions have been removed
+			allowablePartitionsRequirementsMet = partitionTypeIDs.size() == 0;
+		}
+		
+		return (requiredPartitionsRequirementsMet || foundAssociatedCommentPartitions) && allowablePartitionsRequirementsMet;
+	}
+	
+	/**
+	 * <p>Convenience method to take a list of regions and create one encompassing region to pass to
+	 * {@link #alreadyCommenting(IDocument, IRegion)}</p>
+	 * 
+	 * @param document {@link IDocument} that contains the given <code>regions</code>
+	 * @param regions {@link IRegion}s to combine into one region and pass onto
+	 * {@link #alreadyCommenting(IDocument, IRegion)}
+	 * 
+	 * @return the result of a call to {@link #alreadyCommenting(IDocument, IRegion)} combining
+	 * all of the given <code>regions</code> into one region
+	 * 
+	 * @throws BadLocationException it is not the fault of the strategy if callers passes a bad
+	 * <code>offset</code> and/or <code>length</code> for the given <code>model</code>
+	 */
+	public final boolean alreadyCommenting(IStructuredDocument document, IRegion[] regions) throws BadLocationException {
+		boolean alreadyCommenting = false;
+		if(regions != null && regions.length > 0) {
+			//create one region spanning all the given regions
+			int offset = regions[0].getOffset();
+			int length = regions[regions.length-1].getOffset() +
+					regions[regions.length-1].getLength() - offset;
+		
+			IRegion region = new Region(offset, length);
+			alreadyCommenting = this.alreadyCommenting(document, region);
+		}
+		
+		return alreadyCommenting;
+	}
+	/**
+	 * <p>Given a list of {@link ITypedRegion}s returns the sub set of that list that
+	 * are of the comment region type associated with this strategy</p>
+	 * 
+	 * @param typedRegions {@link ITypedRegion}s to filter down to only the comment regions
+	 * associated with this strategy
+	 * 
+	 * @return {@link List} of {@link ITypedRegion}s from the given <code>typedRegions</code>
+	 * that are of the comment partition type associated with this strategy
+	 */
+	protected List getAssociatedCommentedRegions(ITypedRegion[] typedRegions) {
+		List commentedRegions = new ArrayList();
+		
+		for(int i = 0; i < typedRegions.length; ++i) {
+			if(typedRegions[i].getType().equals(this.fAssociatedCommentPartitionTypeID)) {
+				commentedRegions.add(typedRegions[i]);
+			}
+		}
+		
+		return commentedRegions;
+	}
+	
+	/**
+	 * <p>Given a list of {@link ITypedRegion}s returns a list of the partition
+	 * type IDs taken from the given regions.</p>
+	 * 
+	 * @param regions {@link ITypedRegion}s to get the partition type IDs from
+	 * @return {@link List} of the partition type IDs taken from the given <code>regions</code>
+	 */
+	private static List getPartitionTypeIDs(ITypedRegion[] regions) {
+		List partitionTypes = new ArrayList(regions.length);
+		for(int i = 0; i < regions.length; ++i) {
+			partitionTypes.add(regions[i].getType());
+		}
+		
+		return partitionTypes;
+	}
+	
+	/**
+	 * <p>This method modifies the given document to remove the given comment
+	 * prefix at the given comment prefix offset and the given comment
+	 * suffix at the given comment suffix offset.  In the case of removing
+	 * a line comment that does not have a suffix, pass <code>null</code>
+	 * for the comment suffix and it and its associated offset will
+	 * be ignored.</p>
+	 * 
+	 * <p><b>NOTE:</b> it is a good idea if a model is at hand when calling this to
+	 * warn the model of an impending update</p>
+	 * 
+	 * @param document the document to remove the comment from
+	 * @param commentPrefixOffset the offset of the comment prefix
+	 * @param commentSuffixOffset the offset of the comment suffix
+	 * (ignored if <code>commentSuffix</code> is <code>null</code>)
+	 * @param commentPrefix the prefix of the comment to remove from its associated given offset
+	 * @param commentSuffix the suffix of the comment to remove from its associated given offset,
+	 * or null if there is not suffix to remove for this comment
+	 */
+	protected static void uncomment(IDocument document, int commentPrefixOffset, String commentPrefix,
+			int commentSuffixOffset,  String commentSuffix) {
+		
+		try {
+			//determine if there is a space after the comment prefix that should also be removed
+			int commentPrefixLength = commentPrefix.length();
+			String postCommentPrefixChar = document.get(commentPrefixOffset + commentPrefix.length(), 1);
+			if(postCommentPrefixChar.equals(" ")) {
+				commentPrefixLength++;
+			}
+			
+			//remove the comment prefix
+			document.replace(commentPrefixOffset, commentPrefixLength, ""); //$NON-NLS-1$
+			
+			if(commentSuffix != null) {
+				commentSuffixOffset -= commentPrefixLength;
+				
+				//determine if there is a space before the comment suffix that should also be removed
+				int commentSuffixLength = commentSuffix.length();
+				String preCommentSuffixChar = document.get(commentSuffixOffset-1, 1);
+				if(preCommentSuffixChar.equals(" ")) {
+					commentSuffixLength++;
+					commentSuffixOffset--;
+				}
+				
+				//remove the comment suffix
+				document.replace(commentSuffixOffset, commentSuffixLength, ""); //$NON-NLS-1$
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/CommentingStrategyRegistry.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/CommentingStrategyRegistry.java
new file mode 100644
index 0000000..dbc9582
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/CommentingStrategyRegistry.java
@@ -0,0 +1,351 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.comment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * <p>The registry of {@link CommentingStrategy}s defined by the <code>org.eclipse.wst.sse.ui.commentinStrategy</code>
+ * extension point.</p>
+ */
+public class CommentingStrategyRegistry {
+	/** The extension schema name of the extension point */
+	private static final String EXTENSION_POINT = "commentingStrategy"; //$NON-NLS-1$
+	
+	/** The extension schema name of proposal block comment child elements. */
+	private static final String ELEM_PROPOSAL_BLOCK_COMMENTING_STRATEGY = "blockCommentingStrategy"; //$NON-NLS-1$
+	
+	/** The extension schema name of proposal line comment child elements. */
+	private static final String ELEM_PROPOSAL_LINE_COMMENTING_STRATEGY = "lineCommentingStrategy"; //$NON-NLS-1$
+	
+	/** The extension schema name of the content type child elements. */
+	private static final String ELEM_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
+	
+	/** The extension schema name of the required partition types child elements */
+	private static final String ELEM_REQUIRED_PARTITION_TYPES= "requiredPartitionTypes"; //$NON-NLS-1$
+	
+	/** The extension schema name of the allowable partition types child elements */
+	private static final String ELEM_ALLOWABLE_PARTITION_TYPES= "allowablePartitionTypes"; //$NON-NLS-1$
+	
+	/** The extension schema name of partition type child elements */
+	private static final String ELEM_PARTITION_TYPE= "partitionType"; //$NON-NLS-1$
+	
+	/** The extension schema name of the prefix attribute */
+	private static final String ATTR_PREFIX = "prefix"; //$NON-NLS-1$
+	
+	/** The extension schema name of the suffix attribute */
+	private static final String ATTR_SUFFIX = "suffix"; //$NON-NLS-1$
+	
+	/** The extension schema name of the associatedCommentPartitionTypeID attribute */
+	private static final String ATTR_ASSOCIATED_COMMENT_PARTITION_TPYPE_ID = "associatedCommentPartitionTypeID"; //$NON-NLS-1$
+	
+	/** The extension schema name of the anyPartitionType attribute */
+	private static final String ATTR_ANY_PARTITION_TYPE = "anyPartitionType";  //$NON-NLS-1$
+	
+	/** The extension schema name for ID attribute */
+	private static final String ATTR_ID= "id"; //$NON-NLS-1$
+	
+	/** the singleton instance of the registry */
+	private static CommentingStrategyRegistry fSingleton = null;
+	
+	/** <code>true</code> if this registry has been loaded. */
+	private boolean fLoaded;
+	
+	/**
+	 * <p>Registry of content type IDs to {@link BlockCommentingStrategy}s</p>
+	 * 
+	 * <code>{@link Map}&lt{@link String}, {@link List}&lt{@link BlockContentType}&gt&gt</code>
+	 * <ul>
+	 * <li><b>key:</b> content type ID</li>
+	 * <li><b>value:</b> {@link List} of associated {@link BlockContentType}s</li>
+	 * <ul>
+	 */
+	private Map fBlockCommentTypes;
+	
+	/**
+	 * <p>Registry of content type IDs to {@link LineCommentingStrategy}s</p>
+	 *
+	 * <code>{@link Map}&lt{@link String}, {@link List}&lt{@link LineContentType}&gt&gt</code>
+	 * <ul>
+	 * <li><b>key:</b> content type ID</li>
+	 * <li><b>value:</b> {@link List} of associated {@link LineContentType}s</li>
+	 * <ul>
+	 */
+	private Map fLineCommentTypes;
+	
+	/**
+	 * @return the single instance of the {@link CommentingStrategyRegistry}
+	 */
+	public static synchronized CommentingStrategyRegistry getDefault() {
+		if(fSingleton == null) {
+			fSingleton = new CommentingStrategyRegistry();
+		}
+		
+		return fSingleton;
+	}
+	
+	/**
+	 * Singleton constructor for the registry
+	 */
+	private CommentingStrategyRegistry() {
+		this.fLoaded = false;
+		this.fBlockCommentTypes = new HashMap();
+		this.fLineCommentTypes = new HashMap();
+	}
+	
+	/**
+	 * @param contentTypeID get only {@link BlockCommentingStrategy}s associated with this content type
+	 * @param regions get only {@link BlockCommentingStrategy}s associated with these types of regions
+	 * @return all the {@link BlockCommentingStrategy}s associated with the given content type and regions
+	 */
+	public CommentingStrategy getBlockCommentingStrategy(String contentTypeID, ITypedRegion[] regions) {
+		return getCommentingStrategy(contentTypeID, regions, this.fBlockCommentTypes);
+	}
+	
+	/**
+	 * @param contentTypeID get only {@link LineCommentingStrategy}s associated with this content type
+	 * @param regions get only {@link LineCommentingStrategy}s associated with these types of regions
+	 * @return all the {@link LineCommentingStrategy}s associated with the given content type and regions
+	 */
+	public CommentingStrategy getLineCommentingStrategy(String contentTypeID, ITypedRegion[] regions) {
+		return getCommentingStrategy(contentTypeID, regions, this.fLineCommentTypes);
+	}
+	
+	/**
+	 * <p>get all the {@link CommentingStrategy}s associated with the given content type and regions
+	 * from the given registry</p>
+	 * 
+	 * @param contentTypeID  get only {@link CommentingStrategy}s associated with this content type
+	 * @param regions get only {@link CommentingStrategy}s associated with these types of regions
+	 * @param registry get the {@link CommentingStrategy}s from this registry
+	 * @return all the {@link CommentingStrategy}s associated with the given content type and regions
+	 * from the given registry
+	 */
+	private CommentingStrategy getCommentingStrategy(String contentTypeID, ITypedRegion[] regions, Map registry) {
+		ensureExtensionPointRead();
+		
+		CommentingStrategy match = null;
+		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID);
+		
+		/* get all the commenting strategies for the given content type id,
+		 * including those registered for parent content types
+		 */
+		List possibleCommentingStrategies = new ArrayList();
+		while(contentType != null) {
+			List contentTypeCommentingStrategies = (List)registry.get(contentType.getId());
+			if(contentTypeCommentingStrategies != null && contentTypeCommentingStrategies.size() > 0) {
+				possibleCommentingStrategies.addAll(contentTypeCommentingStrategies);
+			}
+			contentType = contentType.getBaseType();
+		}
+		
+		/* find the commenting strategy applicable for the given regions,
+		 * because strategies were added starting from the most specific
+		 * content type first, the most specific strategy will always be chosen
+		 */
+		for(int i = 0; i < possibleCommentingStrategies.size() && match == null; ++i) {
+			CommentingStrategy commentType = (CommentingStrategy)possibleCommentingStrategies.get(i);
+			if(commentType.isApplicableFor(regions)) {
+				match = commentType;
+			}
+		}
+		
+		return match;
+	}
+	
+	/**
+	 * <p>Ensures that the extensions are read and this registry is built</p>
+	 */
+	private void ensureExtensionPointRead() {
+		if(!fLoaded) {
+			load();
+			fLoaded = true;
+		}
+	}
+	
+	/**
+	 * <p>Load the extension points into the registry</p>
+	 */
+	private void load() {
+		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+		List extensionElements = new ArrayList(Arrays.asList(extensionRegistry.getConfigurationElementsFor(SSEUIPlugin.ID, EXTENSION_POINT)));
+	
+		//for each extension
+		for (Iterator iter= extensionElements.iterator(); iter.hasNext();) {
+			IConfigurationElement element = (IConfigurationElement) iter.next();
+			try {
+				CommentingStrategy newCommentingStrategy = null;
+				Map commentingStrategyRegistry = null;
+				//either a block or line commenting strategy
+				if(element.getName().equals(ELEM_PROPOSAL_BLOCK_COMMENTING_STRATEGY)) {
+					String prefix = element.getAttribute(ATTR_PREFIX);
+					checkExtensionAttributeNotNull(prefix, ATTR_PREFIX, element);
+					
+					String suffix = element.getAttribute(ATTR_SUFFIX);
+					checkExtensionAttributeNotNull(suffix, ATTR_SUFFIX, element);
+					
+					if(prefix != null && suffix != null) {
+						newCommentingStrategy = new BlockCommentingStrategy(prefix, suffix);
+						commentingStrategyRegistry = this.fBlockCommentTypes;
+					}
+				} else if(element.getName().equals(ELEM_PROPOSAL_LINE_COMMENTING_STRATEGY)) {
+					String prefix = element.getAttribute(ATTR_PREFIX);
+					checkExtensionAttributeNotNull(prefix, ATTR_PREFIX, element);
+					
+					if(prefix != null) {
+						newCommentingStrategy = new LineCommentingStrategy(prefix);
+						commentingStrategyRegistry = this.fLineCommentTypes;
+					}
+				}
+				
+				//add the new strategy to the registry
+				if(commentingStrategyRegistry != null && newCommentingStrategy != null) {
+					addCommentingStrategyToRegistry(element, commentingStrategyRegistry, newCommentingStrategy);
+				} else {
+					Logger.log(Logger.WARNING, "Invalid CommentingStrategy extension: " + element); //$NON-NLS-1$
+				}
+			} catch (CoreException e) {
+				Logger.logException(e);
+			} catch (InvalidRegistryObjectException x) {
+				/* Element is not valid any longer as the contributing plug-in was unloaded or for
+				 * some other reason. Do not include the extension in the list and log it
+				 */
+				String message = "The extension ''" + element.toString() + "'' is invalid."; //$NON-NLS-1$ //$NON-NLS-2$
+				IStatus status= new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.WARNING, message, x);
+				Logger.log(status);
+			}
+		}
+	}
+	
+	/**
+	 * <p>Checks that the given attribute value is not <code>null</code>.</p>
+	 *
+	 * @param value the object to check if not null
+	 * @param attribute the attribute
+	 * 
+	 * @throws InvalidRegistryObjectException if the registry element is no longer valid
+	 * @throws CoreException if <code>value</code> is <code>null</code>
+	 */
+	private static void checkExtensionAttributeNotNull(Object value, String attribute,
+			IConfigurationElement element) throws InvalidRegistryObjectException, CoreException {
+		
+		if (value == null) {
+			String message = "The extension \"" + element.getDeclaringExtension().getUniqueIdentifier() + //$NON-NLS-1$
+				"\" from plug-in \"" + element.getContributor().getName() + //$NON-NLS-1$
+				"\" did not specify a value for the required \"" + attribute + //$NON-NLS-1$
+				"\" attribute for the element \"" + element.getName() + "\". Disabling the extension."; //$NON-NLS-1$ //$NON-NLS-2$
+			IStatus status= new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, message, null);
+			throw new CoreException(status);
+		}
+	}
+	
+	/**
+	 * <p>Using the content type element children of the given element add a copy of the given
+	 * base commenting strategy to the given registry</p>
+	 * 
+	 * @param element a {@link IConfigurationElement} with contentType element children
+	 * @param commentingStrategyRegistry {@link Map} of content type ids to {@link CommentingStrategy}s to register
+	 * the given {@link CommentingStrategy} with based on the <code>element</code>
+	 * @param baseCommentingStrategy {@link CommentingStrategy} that will be cloned and configured for each
+	 * content type in the given <code>element</code>
+	 */
+	private static void addCommentingStrategyToRegistry(IConfigurationElement element,
+			Map commentingStrategyRegistry, CommentingStrategy baseCommentingStrategy) {
+		
+		//get all the content type elements
+		IConfigurationElement[] contentTypeElements = element.getChildren(ELEM_CONTENT_TYPE);
+		if(contentTypeElements.length > 0) {
+			for(int contentTypeIndex = 0; contentTypeIndex < contentTypeElements.length; ++contentTypeIndex) {
+				try {
+					String contentTypeID = contentTypeElements[contentTypeIndex].getAttribute(ATTR_ID);
+					checkExtensionAttributeNotNull(contentTypeID, ATTR_ID, contentTypeElements[contentTypeIndex]);
+					
+					List commentTypes = (List)commentingStrategyRegistry.get(contentTypeID);
+					if(commentTypes == null) {
+						commentTypes = new ArrayList();
+						commentingStrategyRegistry.put(contentTypeID, commentTypes);
+					}
+					
+					//this element is required
+					List allowablePartitionTypeIDs = new ArrayList();
+					IConfigurationElement[] allowablePartitionTypes =
+						contentTypeElements[contentTypeIndex].getChildren(ELEM_ALLOWABLE_PARTITION_TYPES);
+					boolean anyPartitionType = false;
+					//determine anyPartitionType attribute value
+					String anyPartitionTypeValue = allowablePartitionTypes[0].getAttribute(ATTR_ANY_PARTITION_TYPE);
+					if(anyPartitionTypeValue != null) {
+						anyPartitionType = Boolean.valueOf(anyPartitionTypeValue).booleanValue();
+					}
+					
+					//get the optional partition types
+					allowablePartitionTypes = allowablePartitionTypes[0].getChildren(ELEM_PARTITION_TYPE);
+					if(allowablePartitionTypes.length > 0) {
+						for (int partitionTypeIndex = 0; partitionTypeIndex < allowablePartitionTypes.length; ++partitionTypeIndex) {
+							String partitionTypeID = allowablePartitionTypes[partitionTypeIndex].getAttribute(ATTR_ID);
+							checkExtensionAttributeNotNull(partitionTypeID, ATTR_ID, allowablePartitionTypes[partitionTypeIndex]);
+							
+							allowablePartitionTypeIDs.add(partitionTypeID);
+						}
+					}
+					
+					//this element is optional
+					List requiredPartitionTypeIDs = new ArrayList();
+					IConfigurationElement[] requiredPartitionTypes =
+						contentTypeElements[contentTypeIndex].getChildren(ELEM_REQUIRED_PARTITION_TYPES);
+					if(requiredPartitionTypes.length > 0) {
+						//get the required partition types
+						requiredPartitionTypes = requiredPartitionTypes[0].getChildren(ELEM_PARTITION_TYPE);
+						if(requiredPartitionTypes.length > 0) {
+							for (int partitionTypeIndex = 0; partitionTypeIndex < requiredPartitionTypes.length; ++partitionTypeIndex) {
+								String partitionTypeID = requiredPartitionTypes[partitionTypeIndex].getAttribute(ATTR_ID);
+								checkExtensionAttributeNotNull(partitionTypeID, ATTR_ID, requiredPartitionTypes[partitionTypeIndex]);
+								
+								requiredPartitionTypeIDs.add(partitionTypeID);
+							}
+						}
+					}
+					
+					//get the optional associated comment partition type ID
+					String associatedCommentPartitionTypeID =
+						contentTypeElements[contentTypeIndex].getAttribute(ATTR_ASSOCIATED_COMMENT_PARTITION_TPYPE_ID);
+					
+					//register the strategy
+					CommentingStrategy newCommentingStrategy = (CommentingStrategy)baseCommentingStrategy.clone();
+					newCommentingStrategy.setPartitionInformation(allowablePartitionTypeIDs, anyPartitionType,
+							requiredPartitionTypeIDs, associatedCommentPartitionTypeID);
+					commentTypes.add(newCommentingStrategy);
+				} catch(CoreException e) {
+					Logger.logException(e);
+				}
+			}
+		} else {
+			Logger.log(Logger.WARNING, "The commmenting strategy element: " + element +//$NON-NLS-1$
+					" does not contain any required " + ELEM_CONTENT_TYPE + "s"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/LineCommentingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/LineCommentingStrategy.java
new file mode 100644
index 0000000..b8d8697
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/comment/LineCommentingStrategy.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.comment;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * <p>Represents a Line Comment commenting strategy</p>
+ */
+public class LineCommentingStrategy extends CommentingStrategy {
+	/** the prefix of the line comment associated with this strategy */
+	private String fPrefix;
+	
+	/**
+	 * @param prefix the prefix of the line comment associated with this strategy
+	 */
+	public LineCommentingStrategy(String prefix) {
+		super();
+		this.fPrefix = prefix;
+	}
+	
+	/**
+	 * <p>Assumes that the given offset is at the begining of a line and adds the line
+	 * comment prefix there</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#apply(
+	 * 	org.eclipse.wst.sse.core.internal.provisional.IStructuredModel, int, int)
+	 */
+	public void apply(IStructuredDocument document, int offset, int length)
+			throws BadLocationException {
+		
+		document.replace(offset, 0, this.fPrefix + " ");
+	}
+
+	/**
+	 * <p>Assumes that the given offset is at the beginning of a line that is commented and removes
+	 * the comment prefix from the beginning of the line, leading whitespace on the line will not
+	 * prevent this method from finishing correctly</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#remove(
+	 * 	org.eclipse.wst.sse.core.internal.provisional.IStructuredModel, int, int, boolean)
+	 */
+	public void remove(IStructuredDocument document, int offset, int length, boolean removeEnclosing) throws BadLocationException{
+		String content = document.get(offset, length);
+		int innerOffset = content.indexOf(this.fPrefix);
+		if(innerOffset > 0) {
+			offset += innerOffset;
+		}
+		
+		uncomment(document, offset, this.fPrefix, -1,  null);
+	}
+	
+	/**
+	 * <p>A region is already commented if it begins with the the associated prefix ignoring any
+	 * leading whitespace</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#alreadyCommenting(
+	 * 	org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IRegion)
+	 */
+	public boolean alreadyCommenting(IStructuredDocument document, IRegion region)
+			throws BadLocationException {
+		
+		String regionContent = document.get(region.getOffset(), region.getLength()).trim();
+		return regionContent.startsWith(this.fPrefix);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy#clone()
+	 */
+	public Object clone() {
+		return new LineCommentingStrategy(this.fPrefix);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalCategory.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalCategory.java
new file mode 100644
index 0000000..83abfa3
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalCategory.java
@@ -0,0 +1,374 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.action.LegacyActionTools;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.sse.core.internal.util.Assert;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader;
+import org.osgi.framework.Bundle;
+
+/**
+ * Describes a category extension to the
+ * <code>org.eclipse.wst.sse.ui.completionProposal</code> extension point.
+ */
+public final class CompletionProposalCategory {
+	/** The extension schema name of the icon attribute. */
+	private static final String ICON= "icon"; //$NON-NLS-1$
+	
+	/** The extension schema name of the ID attribute. */
+	private static final String ID= "id"; //$NON-NLS-1$
+	
+	/** The extension schema name of the name attribute. */
+	private static final String NAME= "name"; //$NON-NLS-1$
+
+	/** ID of this completion category */
+	private final String fId;
+	
+	/** Name of this completion category */
+	private final String fName;
+	
+	/** The image descriptor for this category, or <code>null</code> if none specified. */
+	private final ImageDescriptor fImage;
+	
+	/** The last error reported by this category */
+	private String fLastError = null;
+
+	/**
+	 * <p>Construct the category by parsing the given element.</p>
+	 * 
+	 * @param element {@link IConfigurationElement} containing the configuration of this category
+	 * @throws CoreException if the given {@link IConfigurationElement} does not contain the correct
+	 * elements and attributes.
+	 */
+	CompletionProposalCategory(IConfigurationElement element) throws CoreException {
+		Assert.isLegal(element != null);
+		
+		//get & verify ID
+		fId = element.getAttribute(ID);
+		ContentAssistUtils.checkExtensionAttributeNotNull(fId, ID, element);
+		
+		//get & verify optional name
+		String name= element.getAttribute(NAME);
+		if (name == null) {
+			fName = fId;
+		} else {
+			fName= name;
+		}
+
+		//get & verify optional icon
+		String icon= element.getAttribute(ICON);
+		ImageDescriptor img= null;
+		if (icon != null) {
+			Bundle bundle= ContentAssistUtils.getBundle(element);
+			if (bundle != null) {
+				Path path= new Path(icon);
+				URL url= FileLocator.find(bundle, path, null);
+				img= ImageDescriptor.createFromURL(url);
+			}
+		}
+		fImage= img;
+	}
+
+	/**
+	 * <p>Creates a category with the given name and ID</p>
+	 * 
+	 * @param id the unique ID of the new category
+	 * @param name the name of the new category
+	 */
+	CompletionProposalCategory(String id, String name) {
+		fId= id;
+		fName= name;
+		fImage= null;
+	}
+
+	/**
+	 * <p>Returns the unique identifier of the category</p>
+	 *
+	 * @return Returns the id
+	 */
+	public String getId() {
+		return fId;
+	}
+
+	/**
+	 * <p>Returns the human readable name of the category.
+	 * It may contain mnemonics.</p>
+	 *
+	 * @return Returns the name
+	 */
+	public String getName() {
+		return fName;
+	}
+
+	/**
+	 * <p>Returns the human readable name of the category
+	 * without mnemonic hint in order to be displayed
+	 * in a message.</p>
+	 *
+	 * @return Returns the name
+	 */
+	public String getDisplayName() {
+		return LegacyActionTools.removeMnemonics(fName);
+	}
+
+	/**
+	 * <p>Returns the image descriptor of the category.</p>
+	 *
+	 * @return the image descriptor of the category
+	 */
+	public ImageDescriptor getImageDescriptor() {
+		return fImage;
+	}
+
+	/**
+	 * @return <code>true</code> if this category should be displayed on
+	 * its own content assist page, <code>false</code> otherwise
+	 */
+	public boolean isDisplayedOnOwnPage(String contentTypeID) {
+		boolean displayOnOwnPage = ICompletionProposalCategoriesConfigurationReader.DEFAULT_DISPLAY_ON_OWN_PAGE;
+		
+		ICompletionProposalCategoriesConfigurationReader properties =
+			CompletionProposoalCatigoriesConfigurationRegistry.getDefault().getReadableConfiguration(contentTypeID);
+		if(properties != null) {
+			displayOnOwnPage = properties.shouldDisplayOnOwnPage(this.fId);
+		}
+		
+		return displayOnOwnPage;
+	}
+
+	/**
+	 * @return <code>true</code> if this category should be displayed in
+	 * the default content assist page, <code>false</code> otherwise
+	 */
+	public boolean isIncludedOnDefaultPage(String contentTypeID) {
+		boolean includeOnDefaultPage = ICompletionProposalCategoriesConfigurationReader.DEFAULT_INCLUDE_ON_DEFAULTS_PAGE;
+		
+		ICompletionProposalCategoriesConfigurationReader properties =
+			CompletionProposoalCatigoriesConfigurationRegistry.getDefault().getReadableConfiguration(contentTypeID);
+		if(properties != null) {
+			includeOnDefaultPage = properties.shouldDisplayOnDefaultPage(this.fId);
+		}
+		
+		return includeOnDefaultPage;
+	}
+	
+	/**
+	 * <p>Given a content type ID determines the rank of this
+	 * category for sorting the content assist pages</p>
+	 * 
+	 * @return the sort rank of this category
+	 */
+	public int getPageSortRank(String contentTypeID) {
+		int sortOrder = ICompletionProposalCategoriesConfigurationReader.DEFAULT_SORT_ORDER;
+		
+		ICompletionProposalCategoriesConfigurationReader properties =
+			CompletionProposoalCatigoriesConfigurationRegistry.getDefault().getReadableConfiguration(contentTypeID);
+		if(properties != null) {
+			sortOrder = properties.getPageSortOrder(this.fId);
+		}
+		
+		return sortOrder;
+	}
+	
+	/**
+	 * <p>Given a content type ID determines the rank of this
+	 * category for sorting on the default content assist page
+	 * with other categories</p>
+	 * 
+	 * @return the sort rank of this category
+	 */
+	public int getDefaultPageSortRank(String contentTypeID) {
+		int sortOrder = ICompletionProposalCategoriesConfigurationReader.DEFAULT_SORT_ORDER;
+		
+		ICompletionProposalCategoriesConfigurationReader properties =
+			CompletionProposoalCatigoriesConfigurationRegistry.getDefault().getReadableConfiguration(contentTypeID);
+		if(properties != null) {
+			sortOrder = properties.getDefaultPageSortOrder(this.fId);
+		}
+		
+		return sortOrder;
+	}
+	
+	/**
+	 * <p><b>NOTE: </b> enablement is not the same as weather a category
+	 * should be displayed on its own page or the default page, it describes
+	 * if the category should be used at all.  Currently categories are always
+	 * enabled.  There maybe cases in the future where a category should be
+	 * disabled entirely though.</p>
+	 * 
+	 * @return <code>true</code> if this category is enabled,
+	 * <code>false</code> otherwise
+	 */
+	public boolean isEnabled() {
+		return true;
+	}
+
+	/**
+	 * @return <code>true</code> if the category contains any computers, <code>false</code>
+	 *         otherwise
+	 */
+	public boolean hasComputers() {
+		List descriptors=  CompletionProposalComputerRegistry.getDefault().getProposalComputerDescriptors();
+		for (Iterator it= descriptors.iterator(); it.hasNext();) {
+			CompletionProposalComputerDescriptor desc= (CompletionProposalComputerDescriptor) it.next();
+			if (desc.getCategory() == this) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * @param contentTypeID the content type ID
+	 * @param partitionTypeID the partition
+	 * @return <code>true</code> if the category contains any computers, in the given partition type
+	 * in the given content type, <code>false</code> otherwise
+	 */
+	public boolean hasComputers(String contentTypeID, String partitionTypeID) {
+		List descriptors = CompletionProposalComputerRegistry.getDefault().getProposalComputerDescriptors(contentTypeID, partitionTypeID);
+		for (Iterator it = descriptors.iterator(); it.hasNext();) {
+			CompletionProposalComputerDescriptor desc= (CompletionProposalComputerDescriptor) it.next();
+			if (desc.getCategory() == this) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * @param contentTypeID the content type ID
+	 * @return <code>true</code> if the category contains any computers, in the given partition type
+	 * in the given content type, <code>false</code> otherwise
+	 */
+	public boolean hasComputers(String contentTypeID) {
+		List descriptors = CompletionProposalComputerRegistry.getDefault().getProposalComputerDescriptors(contentTypeID);
+		for (Iterator it = descriptors.iterator(); it.hasNext();) {
+			CompletionProposalComputerDescriptor desc= (CompletionProposalComputerDescriptor) it.next();
+			if (desc.getCategory() == this) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * <p>Safely computes completion proposals of all computers of this category through their
+	 * extension.</p>
+	 *
+	 * @param context the invocation context passed on to the extension
+	 * @param contentTypeID the content type ID where the invocation occurred
+	 * @param partitionTypeID the partition type where the invocation occurred
+	 * @param monitor the progress monitor passed on to the extension
+	 * @return the list of computed completion proposals (element type:
+	 *         {@link org.eclipse.jface.text.contentassist.ICompletionProposal})
+	 */
+	public List computeCompletionProposals(CompletionProposalInvocationContext context,
+			String contentTypeID, String partitionTypeID, SubProgressMonitor monitor) {
+		
+		fLastError = null;
+		List result = new ArrayList();
+		List descriptors = new ArrayList(CompletionProposalComputerRegistry.getDefault().getProposalComputerDescriptors(contentTypeID, partitionTypeID));
+		for (Iterator it = descriptors.iterator(); it.hasNext();) {
+			CompletionProposalComputerDescriptor desc = (CompletionProposalComputerDescriptor) it.next();
+			if (desc.getCategory() == this) {
+				result.addAll(desc.computeCompletionProposals(context, monitor));
+			}
+			
+			if (fLastError == null && desc.getErrorMessage() != null) {
+				fLastError = desc.getErrorMessage();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * <p>Safely computes context information objects of all computers of this category through their
+	 * extension.</p>
+	 *
+	 * @param context the invocation context passed on to the extension
+	 * @param contentTypeID the content type ID where the invocation occurred
+	 * @param partitionTypeID the partition type where the invocation occurred
+	 * @param monitor the progress monitor passed on to the extension
+	 * @return the list of computed context information objects (element type:
+	 *         {@link org.eclipse.jface.text.contentassist.IContextInformation})
+	 */
+	public List computeContextInformation(CompletionProposalInvocationContext context,
+			String contentTypeID, String partitionTypeID, SubProgressMonitor monitor) {
+		
+		fLastError= null;
+		List result= new ArrayList();
+		List descriptors= new ArrayList(CompletionProposalComputerRegistry.getDefault().getProposalComputerDescriptors(contentTypeID, partitionTypeID));
+		for (Iterator it= descriptors.iterator(); it.hasNext();) {
+			CompletionProposalComputerDescriptor desc= (CompletionProposalComputerDescriptor) it.next();
+			if (desc.getCategory() == this && (isIncludedOnDefaultPage(contentTypeID) || isDisplayedOnOwnPage(contentTypeID))) {
+				result.addAll(desc.computeContextInformation(context, monitor));
+			}
+			if (fLastError == null) {
+				fLastError= desc.getErrorMessage();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @return the last error message reported by a computer in this category
+	 */
+	public String getErrorMessage() {
+		return fLastError;
+	}
+
+	/**
+	 * <p>Notifies the computers in this category of a proposal computation session start.</p>
+	 */
+	public void sessionStarted() {
+		List descriptors= new ArrayList(CompletionProposalComputerRegistry.getDefault().getProposalComputerDescriptors());
+		for (Iterator it= descriptors.iterator(); it.hasNext();) {
+			CompletionProposalComputerDescriptor desc= (CompletionProposalComputerDescriptor) it.next();
+			if (desc.getCategory() == this)
+				desc.sessionStarted();
+			if (fLastError == null)
+				fLastError= desc.getErrorMessage();
+		}
+	}
+
+	/**
+	 * <p>Notifies the computers in this category of a proposal computation session end.</p>
+	 */
+	public void sessionEnded() {
+		List descriptors= new ArrayList(CompletionProposalComputerRegistry.getDefault().getProposalComputerDescriptors());
+		for (Iterator it= descriptors.iterator(); it.hasNext();) {
+			CompletionProposalComputerDescriptor desc= (CompletionProposalComputerDescriptor) it.next();
+			if (desc.getCategory() == this)
+				desc.sessionEnded();
+			if (fLastError == null)
+				fLastError= desc.getErrorMessage();
+		}
+	}
+	
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return fId + ": " + fName; //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalComputerDescriptor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalComputerDescriptor.java
new file mode 100644
index 0000000..d36cca0
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalComputerDescriptor.java
@@ -0,0 +1,648 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IContributor;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.PerformanceStats;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * Wraps an {@link ICompletionProposalComputer} provided by an extension to the
+ * <code>org.eclipse.wst.sse.ui.completionProposal</code> extension point.
+ * Instances are immutable. Instances can be obtained from a
+ * {@link CompletionProposalComputerRegistry}.
+ *
+ * @see CompletionProposalComputerRegistry
+ */
+final class CompletionProposalComputerDescriptor {
+	/** The default category id. */
+	private static final String DEFAULT_CATEGORY_ID= "org.eclipse.wst.sse.ui.defaultProposalCategory"; //$NON-NLS-1$
+	
+	/** The extension schema name of the category id attribute. */
+	private static final String ATTR_CATEGORY_ID= "categoryId"; //$NON-NLS-1$
+	
+	/** The extension schema name for element ID attributes */
+	private static final String ATTR_ID= "id"; //$NON-NLS-1$
+	
+	/** The extension schema name for element name attributes */
+	private static final String ATTR_NAME= "name"; //$NON-NLS-1$
+	
+	/** The extension schema name of the class attribute. */
+	private static final String ATTR_CLASS= "class"; //$NON-NLS-1$
+	
+	/** The extension schema name of the activate attribute. */
+	private static final String ATTRACTIVATE= "activate"; //$NON-NLS-1$
+	
+	/** The extension schema name of the content type child elements. */
+	private static final String ELEM_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
+	
+	/** The extension schema name of the partition type child elements. */
+	private static final String ELEM_PARTITION_TYPE= "partitionType"; //$NON-NLS-1$
+	
+	/** The name of the performance event used to trace extensions. */
+	private static final String PERFORMANCE_EVENT= SSEUIPlugin.ID + "/perf/content_assist/extensions"; //$NON-NLS-1$
+	
+	/**
+	 * If <code>true</code>, execution time of extensions is measured and the data forwarded to
+	 * core's {@link PerformanceStats} service.
+	 */
+	private static final boolean MEASURE_PERFORMANCE= PerformanceStats.isEnabled(PERFORMANCE_EVENT);
+	
+	/**
+	 * Independently of the {@link PerformanceStats} service, any operation that takes longer than
+	 * {@value} milliseconds will be flagged as an violation. This timeout does not apply to the
+	 * first invocation, as it may take longer due to plug-in initialization etc. See also
+	 * {@link #fIsReportingDelay}.
+	 */
+	private static final long MAX_DELAY= 500000;
+
+	/* log constants */
+	private static final String COMPUTE_COMPLETION_PROPOSALS= "computeCompletionProposals()"; //$NON-NLS-1$
+	private static final String COMPUTE_CONTEXT_INFORMATION= "computeContextInformation()"; //$NON-NLS-1$
+	private static final String SESSION_STARTED= "sessionStarted()"; //$NON-NLS-1$
+	private static final String SESSION_ENDED= "sessionEnded()"; //$NON-NLS-1$
+
+	/** The identifier of the extension. */
+	private final String fId;
+	
+	/** The name of the extension. */
+	private final String fName;
+	
+	/** The class name of the provided <code>ISSECompletionProposalComputer</code>. */
+	private final String fClass;
+	
+	/** The activate attribute value. */
+	private final boolean fActivate;
+	
+	/** The configuration element of this extension. */
+	private final IConfigurationElement fElement;
+	
+	/** The computer, if instantiated, <code>null</code> otherwise. */
+	private ICompletionProposalComputer fComputer;
+	
+	/** The UI category. */
+	private final CompletionProposalCategory fCategory;
+	
+	/** The first error message in the most recent operation, or <code>null</code>. */
+	private String fLastError;
+	
+	/**
+	 * Tells whether to inform the user when <code>MAX_DELAY</code> has been exceeded.
+	 * We start timing execution after the first session because the first may take
+	 * longer due to plug-in activation and initialization.
+	 */
+	private boolean fIsReportingDelay = false;
+	
+	/** The start of the last operation. */
+	private long fStart;
+	
+	/**
+	 * Tells whether we tried to load the computer.
+	 * @since 3.4
+	 */
+	boolean fTriedLoadingComputer = false;
+
+	/**
+	 * <p>Creates a new descriptor.</p>
+	 * <p><b>NOTE: </b> This will not add this new descriptor to the given
+	 * {@link CompletionProposalComputerRegistry}. That can not be done
+	 * until this descriptor is done being constructed.  Therefore be sure
+	 * to call {@link #addToRegistry()} after creating a new descriptor.</p>
+	 *
+	 * @param element the configuration element to read
+	 * @param categories the categories
+	 * 
+	 * @throws InvalidRegistryObjectException if this extension is no longer valid
+	 * @throws CoreException if the extension contains invalid values
+	 */
+	CompletionProposalComputerDescriptor(IConfigurationElement element, List categories) throws InvalidRegistryObjectException, CoreException {
+		Assert.isLegal(element != null);
+		fElement = element;
+		
+		//get & verify ID
+		fId = fElement.getAttribute(ATTR_ID);
+		ContentAssistUtils.checkExtensionAttributeNotNull(fId, ATTR_ID, fElement);
+
+		//get & verify optional name
+		String name= fElement.getAttribute(ATTR_NAME);
+		if (name == null) {
+			fName= fId;
+		} else {
+			fName= name;
+		}
+
+		//get & verify activate plugin attribute
+		String activateAttribute= fElement.getAttribute(ATTRACTIVATE);
+		fActivate = Boolean.valueOf(activateAttribute).booleanValue();
+
+		//get & verify class
+		fClass= fElement.getAttribute(ATTR_CLASS);
+		ContentAssistUtils.checkExtensionAttributeNotNull(fClass, ATTR_CLASS, fElement);
+
+		//get & verify optional category id
+		String categoryId= fElement.getAttribute(ATTR_CATEGORY_ID);
+		if (categoryId == null) {
+			categoryId= DEFAULT_CATEGORY_ID;
+		}
+		
+		//find the category with the determined category id
+		CompletionProposalCategory category= null;
+		for (Iterator it= categories.iterator(); it.hasNext();) {
+			CompletionProposalCategory cat= (CompletionProposalCategory) it.next();
+			if (cat.getId().equals(categoryId)) {
+				category= cat;
+				break;
+			}
+		}
+		
+		/* create a category if it does not exist
+		 * else just set the category
+		 */
+		if (category == null) {
+			fCategory = new CompletionProposalCategory(categoryId, fName);
+			
+			/* will add the new category to the registers list of categories,
+			 *  by the magic of object references
+			 */
+			categories.add(fCategory);
+		} else {
+			fCategory = category;
+		}
+	}
+	
+	/**
+	 * <p>Adds this descriptor to the {@link CompletionProposalComputerRegistry}.</p>
+	 * <p><b>NOTE: </b>Must be done after descriptor creation or the descriptor will
+	 * not be added to the registry. Can not be done in constructor because
+	 * descriptor must be constructed before it can be added to the registry</p>
+	 * 
+	 * 
+	 * @throws InvalidRegistryObjectException
+	 * @throws CoreException
+	 */
+	void addToRegistry() throws InvalidRegistryObjectException, CoreException {
+		parseActivationAndAddToRegistry(this.fElement, this);
+	}
+	
+	/**
+	 * @return the category that the wrapped {@link ICompletionProposalComputer} is
+	 * associated with.
+	 */
+	CompletionProposalCategory getCategory() {
+		return fCategory;
+	}
+	
+	/**
+	 * @return the contributor of the described {@link ICompletionProposalComputer}
+	 */
+    IContributor getContributor()  {
+        try {
+	        return fElement.getContributor();
+        } catch (InvalidRegistryObjectException e) {
+        	return null;
+        }
+    }
+
+	/**
+	 * @return Returns the id of the described {@link ICompletionProposalComputer}
+	 */
+	public String getId() {
+		return fId;
+	}
+
+	/**
+	 * @return the name of the described {@link ICompletionProposalComputer}
+	 */
+	public String getName() {
+		return fName;
+	}
+
+	/**
+	 * Returns a new instance of the computer as described in the
+	 * extension's xml. Note that the safest way to access the computer
+	 * is by using the
+	 * {@linkplain #computeCompletionProposals(ContentAssistInvocationContext, IProgressMonitor) computeCompletionProposals}
+	 * and
+	 * {@linkplain #computeContextInformation(ContentAssistInvocationContext, IProgressMonitor) computeContextInformation}
+	 * methods. These delegate the functionality to the contributed
+	 * computer, but handle instance creation and any exceptions thrown.
+	 *
+	 * @return a new instance of the completion proposal computer as
+	 *         described by this descriptor
+	 *         
+	 * @throws CoreException if the creation fails
+	 * @throws InvalidRegistryObjectException if the extension is not
+	 *         valid any longer (e.g. due to plug-in unloading)
+	 */
+	public ICompletionProposalComputer createComputer() throws CoreException, InvalidRegistryObjectException {
+		return (ICompletionProposalComputer) fElement.createExecutableExtension(ATTR_CLASS);
+	}
+
+	/**
+	 * <p>Safely computes completion proposals through the described extension.</p>
+	 *
+	 * @param context the invocation context passed on to the extension
+	 * @param monitor the progress monitor passed on to the extension
+	 * @return the list of computed completion proposals (element type:
+	 *         {@link org.eclipse.jface.text.contentassist.ICompletionProposal})
+	 */
+	public List computeCompletionProposals(CompletionProposalInvocationContext context, IProgressMonitor monitor) {
+		List completionProposals = Collections.EMPTY_LIST;
+		if (isEnabled()) {
+			IStatus status = null;
+			try {
+				// plugin must be active to get computer
+				ICompletionProposalComputer computer = getComputer(true);
+				if (computer != null) {
+					try {
+						PerformanceStats stats= startMeter(context, computer);
+						//ask the computer for the proposals
+						List proposals = computer.computeCompletionProposals(context, monitor);
+						stopMeter(stats, COMPUTE_COMPLETION_PROPOSALS);
+		
+						if (proposals != null) {
+							fLastError = computer.getErrorMessage();
+							completionProposals = proposals;
+						} else {
+							status = createAPIViolationStatus(COMPUTE_COMPLETION_PROPOSALS);
+						}
+					} finally {
+						fIsReportingDelay = true;
+					}
+				}
+			} catch (InvalidRegistryObjectException x) {
+				status= createExceptionStatus(x);
+			} catch (CoreException x) {
+				status= createExceptionStatus(x);
+			} catch (RuntimeException x) {
+				status= createExceptionStatus(x);
+			} finally {
+				monitor.done();
+			}
+	
+			if(status != null) {
+				Logger.log(status);
+			}
+		}
+
+		return completionProposals;
+	}
+
+	/**
+	 * <p>Safely computes context information objects through the described extension.</p>
+	 *
+	 * @param context the invocation context passed on to the extension
+	 * @param monitor the progress monitor passed on to the extension
+	 * @return the list of computed context information objects (element type:
+	 *         {@link org.eclipse.jface.text.contentassist.IContextInformation})
+	 */
+	public List computeContextInformation(CompletionProposalInvocationContext context, IProgressMonitor monitor) {
+		List contextInformation = Collections.EMPTY_LIST;
+		if (isEnabled()) {
+			IStatus status = null;
+			try {
+				// plugin must be active to get computer
+				ICompletionProposalComputer computer = getComputer(true);
+				if (computer != null) {
+					PerformanceStats stats= startMeter(context, computer);
+					List proposals= computer.computeContextInformation(context, monitor);
+					stopMeter(stats, COMPUTE_CONTEXT_INFORMATION);
+		
+					if (proposals != null) {
+						fLastError= computer.getErrorMessage();
+						contextInformation = proposals;
+					} else {
+						status = createAPIViolationStatus(COMPUTE_CONTEXT_INFORMATION);
+					}
+				}
+			} catch (InvalidRegistryObjectException x) {
+				status= createExceptionStatus(x);
+			} catch (CoreException x) {
+				status= createExceptionStatus(x);
+			} catch (RuntimeException x) {
+				status= createExceptionStatus(x);
+			} finally {
+				monitor.done();
+			}
+	
+			if(status != null) {
+				Logger.log(status);
+			}
+		}
+		
+		return contextInformation;
+	}
+
+	/**
+	 * <p>Notifies the described extension of a proposal computation session start.</p>
+	 * 
+	 * <p><b>Note: </b>This method is called every time code assist is invoked and
+	 * is <strong>not</strong> filtered by content type or partition type.</p>
+	 */
+	public void sessionStarted() {
+		if (isEnabled()) {
+			IStatus status = null;
+			try {
+				// plugin must be active to get computer
+				ICompletionProposalComputer computer = getComputer(true);
+				if (computer != null) {
+					PerformanceStats stats = startMeter(SESSION_STARTED, computer);
+					computer.sessionStarted();
+					stopMeter(stats, SESSION_ENDED);
+				}
+			} catch (InvalidRegistryObjectException x) {
+				status= createExceptionStatus(x);
+			} catch (CoreException x) {
+				status= createExceptionStatus(x);
+			} catch (RuntimeException x) {
+				status= createExceptionStatus(x);
+			}
+	
+			if(status != null) {
+				Logger.log(status);
+			}
+		}
+	}
+
+	/**
+	 * <p>Notifies the described extension of a proposal computation session end.</p>
+	 * 
+	 * <p><b>Note: </b>This method is called every time code assist is invoked and
+	 * is <strong>not</strong> filtered by content type or partition type.</p>
+	 */
+	public void sessionEnded() {
+		if (isEnabled()) {
+			IStatus status = null;
+			try {
+				// plugin must be active to get computer
+				ICompletionProposalComputer computer = getComputer(true);
+				if (computer != null) {
+					PerformanceStats stats= startMeter(SESSION_ENDED, computer);
+					computer.sessionEnded();
+					stopMeter(stats, SESSION_ENDED);
+				}
+			} catch (InvalidRegistryObjectException x) {
+				status= createExceptionStatus(x);
+			} catch (CoreException x) {
+				status= createExceptionStatus(x);
+			} catch (RuntimeException x) {
+				status= createExceptionStatus(x);
+			}
+	
+			if(status != null) {
+				Logger.log(status);
+			}
+		}
+	}
+	
+	/**
+	 * @return the error message from the described {@link ICompletionProposalComputer}
+	 */
+	public String getErrorMessage() {
+		return fLastError;
+	}
+	
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return fId + ": " + fName; //$NON-NLS-1$
+	}
+	
+	/**
+	 * <p>Parses the given configuration element for its activation context,
+	 * that is to say the content types and partiton types and updates the registry
+	 * to associated the given computer descriptor with the parsed activation contexts.</P>
+	 * 
+	 * <p>This is useful for parsing both <tt>proposalComputer</tt> elements and
+	 * <tt>proposalComputerExtendedActivation</tt> elements.</p>
+	 * 
+	 * @param element {@link IConfigurationElement} containing the activation context
+	 * @param desc {@link CompletionProposalComputerDescriptor} to associate with the parsed activation context
+	 * 
+	 * @throws InvalidRegistryObjectException
+	 * @throws CoreException
+	 */
+	protected static void parseActivationAndAddToRegistry(IConfigurationElement element,
+			CompletionProposalComputerDescriptor desc) throws InvalidRegistryObjectException, CoreException {
+		
+		/* if this descriptor is specific to a content type/s add it to the registry as such
+		 * else add to registry for all content types
+		 */
+		IConfigurationElement[] contentTypes = element.getChildren(ELEM_CONTENT_TYPE);
+		if(contentTypes.length > 0) {
+			for(int contentTypeIndex = 0; contentTypeIndex < contentTypes.length; ++contentTypeIndex) {
+				String contentTypeID = contentTypes[contentTypeIndex].getAttribute(ATTR_ID);
+				ContentAssistUtils.checkExtensionAttributeNotNull(contentTypeID, ATTR_ID, contentTypes[contentTypeIndex]);
+				
+				/* if this descriptor is for specific partition types in the content type
+				 * add it to the registry as such
+				 * else add to the registry for all partition types in the content type
+				 */
+				IConfigurationElement[] partitionTypes = contentTypes[contentTypeIndex].getChildren(ELEM_PARTITION_TYPE);
+				if(partitionTypes.length > 0) {
+					for (int partitionTypeIndex = 0; partitionTypeIndex < partitionTypes.length; ++partitionTypeIndex) {
+						String partitionTypeID = partitionTypes[partitionTypeIndex].getAttribute(ATTR_ID);
+						ContentAssistUtils.checkExtensionAttributeNotNull(partitionTypeID, ATTR_ID, partitionTypes[partitionTypeIndex]);
+						
+						CompletionProposalComputerRegistry.getDefault().putDescription(contentTypeID, partitionTypeID, desc);
+						CompletionProposalComputerRegistry.getDefault().putAutoActivator(contentTypeID, partitionTypeID, partitionTypes[partitionTypeIndex]);
+					}
+				} else {
+					CompletionProposalComputerRegistry.getDefault().putDescription(contentTypeID, null, desc);
+				}
+			}
+		} else {
+			Logger.log(Logger.WARNING, "The configuration element: " + element + " does not contain any content types."); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/**
+	 * @return <code>true</code> if the plugin that contains the {@link IConfigurationElement}
+	 * associated with this descriptor is loaded, <code>false</code> otherwise.
+	 */
+	private boolean isPluginLoaded() {
+		Bundle bundle= getBundle();
+		return bundle != null && bundle.getState() == Bundle.ACTIVE;
+	}
+
+	/**
+	 * @return the {@link Bundle} that contains the {@link IConfigurationElement} associated
+	 * with this descriptor
+	 */
+	private Bundle getBundle() {
+		String namespace= fElement.getDeclaringExtension().getContributor().getName();
+		Bundle bundle= Platform.getBundle(namespace);
+		return bundle;
+	}
+	
+	/**
+	 * <p>Returns a cached instance of the computer as described in the
+	 * extension's xml. If the computer is not yet created and
+	 * <code>canCreate</code> is <code>true</code> then {@link #createComputer()}
+	 * is called and the result cached.</p>
+	 *
+	 * @param canCreate <code>true</code> if the proposal computer can be created
+	 * @return a new instance of the completion proposal computer as
+	 *         described by this descriptor
+	 *         
+	 * @throws CoreException if the creation fails
+	 * @throws InvalidRegistryObjectException if the extension is not
+	 *         valid any longer (e.g. due to plug-in unloading)
+	 */
+	private synchronized ICompletionProposalComputer getComputer(boolean canCreate) throws CoreException, InvalidRegistryObjectException {
+		if (fComputer == null && canCreate && !fTriedLoadingComputer && (fActivate || isPluginLoaded())) {
+			fTriedLoadingComputer= true;
+			fComputer= createComputer();
+		}
+		return fComputer;
+	}
+	
+	/**
+	 * @return the enablement state of the category this describer is associated with
+	 */
+	private boolean isEnabled() {
+		return fCategory.isEnabled();
+	}
+	
+	/**
+	 * <p>Starts the meter for measuring the computers performance</p>
+	 * 
+	 * @param context
+	 * @param computer
+	 * @return
+	 */
+	private PerformanceStats startMeter(Object context, ICompletionProposalComputer computer) {
+		final PerformanceStats stats;
+		if (MEASURE_PERFORMANCE) {
+			stats= PerformanceStats.getStats(PERFORMANCE_EVENT, computer);
+			stats.startRun(context.toString());
+		} else {
+			stats= null;
+		}
+
+		if (fIsReportingDelay) {
+			fStart= System.currentTimeMillis();
+		}
+
+		return stats;
+	}
+
+	/**
+	 * <p>Stops the meter for measuring the computers performance</p>
+	 * 
+	 * @param context
+	 * @param computer
+	 * @return
+	 */
+	private void stopMeter(final PerformanceStats stats, String operation) {
+		if (MEASURE_PERFORMANCE) {
+			stats.endRun();
+			if (stats.isFailure()) {
+				IStatus status= createPerformanceStatus(operation);
+				Logger.log(status);
+				return;
+			}
+		}
+
+		if (fIsReportingDelay) {
+			long current= System.currentTimeMillis();
+			if (current - fStart > MAX_DELAY) {
+				IStatus status= createPerformanceStatus(operation);
+				Logger.log(status);
+			}
+		}
+	}
+	
+	/**
+	 * @return A message explaining that the described {@link ICompletionProposalComputer} failed in some way
+	 */
+	private String createBlameMessage() {
+		return "The ''" + getName() + "'' proposal computer from the ''" + //$NON-NLS-1$ //$NON-NLS-2$
+			fElement.getDeclaringExtension().getContributor().getName() + "'' plug-in did not complete normally."; //$NON-NLS-1$
+	}
+	
+	/**
+	 * <p>Create a status message describing that the extension has become invalid</p>
+	 * 
+	 * @param x the associated {@link InvalidRegistryObjectException}
+	 * @return the created {@link IStatus}
+	 */
+	private IStatus createExceptionStatus(InvalidRegistryObjectException x) {
+		String blame= createBlameMessage();
+		String reason= "The extension has become invalid."; //$NON-NLS-1$
+		return new Status(IStatus.INFO, SSEUIPlugin.ID, IStatus.OK, blame + " " + reason, x); //$NON-NLS-1$
+	}
+
+	/**
+	 * <p>create a status message explaining that the extension could not be instantiated</p>
+	 * 
+	 * @param x the associated {@link CoreException}
+	 * @return the created {@link IStatus}
+	 */
+	private IStatus createExceptionStatus(CoreException x) {
+		String blame = createBlameMessage();
+		String reason = "Unable to instantiate the extension."; //$NON-NLS-1$
+		return new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.OK, blame + " " + reason, x); //$NON-NLS-1$
+	}
+
+	/**
+	 * <p>Create a status message explaining the extension has thrown a runtime exception</p>
+	 * 
+	 * @param x the associated {@link RuntimeException}
+	 * @return the created {@link IStatus}
+	 */
+	private IStatus createExceptionStatus(RuntimeException x) {
+		String blame= createBlameMessage();
+		String reason= "The extension has thrown a runtime exception."; //$NON-NLS-1$
+		return new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, blame + " " + reason, x); //$NON-NLS-1$
+	}
+
+	/**
+	 * <p>Create a status message explaining the extension has violated the API of the extension point</p>
+	 * 
+	 * @param operation the operation that created the API violation
+	 * @return the created {@link IStatus}
+	 */
+	private IStatus createAPIViolationStatus(String operation) {
+		String blame = createBlameMessage();
+		String reason = "The extension violated the API contract of the ''" + operation + "'' operation."; //$NON-NLS-1$ //$NON-NLS-2$
+		return new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, blame + " " + reason, null); //$NON-NLS-1$
+	}
+
+	/**
+	 * <p>Create a status message explaining that the extension took to long during an operation</p>
+	 * 
+	 * @param operation the operation that took to long
+	 * @return the created {@link IStatus}
+	 */
+	private IStatus createPerformanceStatus(String operation) {
+		String blame= createBlameMessage();
+		String reason = "The extension took too long to return from the ''" + operation + "'' operation."; //$NON-NLS-1$ //$NON-NLS-2$
+		return new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, blame + " " + reason, null); //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalComputerRegistry.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalComputerRegistry.java
new file mode 100644
index 0000000..f3189a5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalComputerRegistry.java
@@ -0,0 +1,559 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.wst.sse.ui.contentassist.AutoActivationDelegate;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+
+/**
+ * <p>A registry for all extensions to the
+ * <code>org.eclipse.wst.sse.ui.completionProposal</code>
+ * extension point.</p>
+ */
+public final class CompletionProposalComputerRegistry {
+
+	/** The extension schema name of the extension point */
+	private static final String EXTENSION_POINT = "completionProposal"; //$NON-NLS-1$
+	
+	/** The extension schema name of proposal category child elements. */
+	private static final String ELEM_PROPOSAL_CATEGORY = "proposalCategory"; //$NON-NLS-1$
+	
+	/** The extension schema name of proposal computer child elements. */
+	private static final String ELEM_PROPOSAL_COMPUTER = "proposalComputer"; //$NON-NLS-1$
+	
+	/** The extension schema name of proposal computer activation child elements. */
+	private static final String ELEM_PROPOSAL_COMPUTER_EXTENDED_ACTIVATION = "proposalComputerExtendedActivation"; //$NON-NLS-1$
+	
+	/** The extension schema name for element ID attributes */
+	private static final String ATTR_ID= "id"; //$NON-NLS-1$
+
+	/** The extension schema name for the partition's auto-activation class */
+	private static final String ATTR_AUTO_ACTIVATION_CLASS = "autoActivationDelegate"; //$NON-NLS-1$
+	
+	/** preference key to keep track of the last known number of content assist computers */
+	private static final String NUM_COMPUTERS_PREF_KEY = "content_assist_number_of_computers"; //$NON-NLS-1$
+	
+	/**
+	 * A fake partition type ID stating used to say a {@link CompletionProposalComputerDescriptor} should
+	 * be associated with all partition types in a given content type.
+	 */
+	private static final String ALL_PARTITION_TYPES_ID = "all_partition_types_fake_ID"; //$NON-NLS-1$
+	
+	/** State where in the registry has not yet been loaded */
+	private static final byte NONE = 0;
+
+	/** State where the registry is being initialized */
+	private static final byte INITIALIZING = 1;
+	
+	/** State where in the registry is currently being loaded */
+	private static final byte LOADING = 2;
+	
+	/** State where in the registry has been loaded */
+	private static final byte LOADED = 3;
+
+	/** The singleton instance. */
+	private static CompletionProposalComputerRegistry fgSingleton= null;
+
+	/**
+	 * @return the singleton instance of the registry
+	 */
+	public static synchronized CompletionProposalComputerRegistry getDefault() {
+		if (fgSingleton == null) {
+			fgSingleton= new CompletionProposalComputerRegistry();
+		}
+
+		return fgSingleton;
+	}
+
+	/**
+	 * <code>{@link Map}&lt{@link String}, {@link CompletionProposalContentTypeContext}&gt</code>
+	 * <ul>
+	 * <li><b>key:</b> content type ID</li>
+	 * <li><b>value:</b> the context for the associated content type ID</li>
+	 * <ul>
+	 */
+	private final Map fActivationContexts;
+	
+	/**
+	 * <code>{@link Map}&lt{@link String}, {@link CompletionProposalComputerDescriptor}&gt</code>
+	 * <ul>
+	 * <li><b>key:</b> descriptor ID</li>
+	 * <li><b>value:</b> descriptor</li>
+	 * <ul>
+	 */
+	private final Map fDescriptors = new HashMap();
+
+	/** A map maintaining the relationship between content types, partition types and their associated {@link AutoActivationDelegate}s*/
+	private Map fAutoActivators = new HashMap();
+
+	/** The {@link CompletionProposalCategory}s tracked by this registry */
+	private final List fCategories = new ArrayList();
+	
+	/** Unmodifiable public list of the {@link CompletionProposalCategory}s tracked by this registry */
+	private final List fPublicCategories = Collections.unmodifiableList(fCategories);
+	
+	/**
+	 * <p>The current state of the registry</p>
+	 * 
+	 * @see #NONE
+	 * @see #LOADING
+	 * @see #LOADED
+	 */
+	private byte fState;
+	
+	/**
+	 * Lock that is held while loading, operations waiting for
+	 * load to finish can lock on this as well
+	 */
+	private final Object fLoadingLock;
+
+	/** <code>true</code> if computers have been uninstalled since last load */
+	private boolean fHasUninstalledComputers= false;
+
+	/**
+	 * Creates a new instance.
+	 */
+	private CompletionProposalComputerRegistry() {
+		this.fActivationContexts = new HashMap();
+		this.fState = CompletionProposalComputerRegistry.NONE;
+		this.fLoadingLock = new Object();
+	}
+	
+	/**
+	 * <p>Calling this when the registry has not yet been loaded will start a
+	 * {@link Thread} to start loading the registry.  All other operations on
+	 * the registry will be blocked until the loading has completed.  If
+	 * the registry has already been loaded or is loading then this
+	 * method does nothing.</p>
+	 */
+	public synchronized void initialize() {
+		if(fState == CompletionProposalComputerRegistry.NONE) {
+			fState = CompletionProposalComputerRegistry.INITIALIZING;
+			new Thread() {
+				public void run() {
+					CompletionProposalComputerRegistry.this.load();
+				}
+			}.start();
+		}
+	}
+	
+	/**
+	 * <p><b>NOTE: </b>The returned list is read-only and is sorted in the order that the
+	 * extensions were read in. There are no duplicate elements in the returned list.
+	 * The returned list may change if plug-ins are loaded or unloaded while the
+	 * application is running.</p>
+	 *
+	 * @return the list of proposal categories contributed to the
+	 * <code>org.eclipse.wst.sse.ui.completionProposal</code> extension point (element type:
+	 *         {@link CompletionProposalCategory})
+	 */
+	public List getProposalCategories() {
+		internalEnsureLoaded();
+		return fPublicCategories;
+	}
+	
+	/**
+	 * <p><b>NOTE: </b>The returned list is read-only and is sorted in the order that the
+	 * extensions were read in. There are no duplicate elements in the returned list.
+	 * The returned list may change if plug-ins are loaded or unloaded while the
+	 * application is running.</p>
+	 * 
+	 * @param contentTypeID get the {@link CompletionProposalCategory}s associated with this ID
+	 * @return the {@link CompletionProposalCategory}s associated with the given content type ID
+	 */
+	public List getProposalCategories(String contentTypeID) {
+		internalEnsureLoaded();
+		List result = new ArrayList();
+		for(int i = 0; i < fCategories.size(); ++i) {
+			CompletionProposalCategory category = ((CompletionProposalCategory)fCategories.get(i));
+			if(category.hasComputers(contentTypeID)) {
+				result.add(category);
+			}
+		}
+		
+		return Collections.unmodifiableList(result);
+	}
+	
+	/**
+	 * @return <code>true</code> if the registry detected that computers got uninstalled since the last run
+	 * 			<code>false</code> otherwise or if {@link #resetUnistalledComputers()} has been called
+	 */
+	public boolean hasUninstalledComputers() {
+		return fHasUninstalledComputers;
+	}
+	
+	/**
+	 * <p>Clears the setting that uninstalled computers have been detected.
+	 * This setting is used to decide weather a helpful message should be
+	 * displayed to the user</p>
+	 */
+	public void resetUnistalledComputers() {
+		fHasUninstalledComputers = false;
+	}
+	
+	/**
+	 * <p>Adds the given {@link CompletionProposalComputerDescriptor} to the registry.</p>
+	 * 
+	 * @param contentTypeID the ID of the content type to associated the descriptor with
+	 * @param partitionTypeID the ID of the partition type in the content type to associate
+	 * the descriptor with, or <code>null</code> to associate with all partition types in
+	 * the content type.
+	 * @param descriptor the {@link CompletionProposalComputerDescriptor} to associate with
+	 * the given content type and partition type
+	 */
+	void putDescription(String contentTypeID, String partitionTypeID,
+			CompletionProposalComputerDescriptor descriptor) {
+		
+		if(partitionTypeID == null) {
+			partitionTypeID = ALL_PARTITION_TYPES_ID;
+		}
+		
+		CompletionProposalContentTypeContext context = getContext(contentTypeID);
+		context.putDescriptor(partitionTypeID, descriptor);
+	}
+
+	void putAutoActivator(String contentTypeID, String partitionTypeID, IConfigurationElement element) {
+		String autoActivationClass = element.getAttribute(ATTR_AUTO_ACTIVATION_CLASS);
+		if (autoActivationClass == null)
+			return;
+
+		Map partitionMap = (Map) fAutoActivators.get(contentTypeID);
+		if (partitionMap == null) {
+			partitionMap = new HashMap();
+			fAutoActivators.put(contentTypeID, partitionMap);
+		}
+		partitionMap.put(partitionTypeID, new Activator(element));
+	}
+
+	public AutoActivationDelegate getActivator(String contentTypeID, String partitionTypeID) {
+		Map partitionMap = (Map) fAutoActivators.get(contentTypeID);
+		if (partitionMap != null) {
+			Activator activator = (Activator) partitionMap.get(partitionTypeID);
+			if (activator != null) {
+				return activator.createAutoActivation();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * @param contentTypeID get only descriptors associated with this content type
+	 * @param partitionTypeID get only descriptors associated with this partition type as well
+	 * as describers associated with any partition type in the given content type
+	 * @return all of the {@link CompletionProposalComputerDescriptor}s associated with the
+	 * given content type and partition type (including any describers associated with all
+	 * partition types in the given content type)
+	 */
+	List getProposalComputerDescriptors(String contentTypeID, String partitionTypeID) {
+		internalEnsureLoaded();
+		
+		Set descriptorsSet = new HashSet();
+		List contexts = this.getContexts(contentTypeID);
+		for(int i = 0; i < contexts.size(); ++i) {
+			CompletionProposalContentTypeContext contentSpecificContext =
+				(CompletionProposalContentTypeContext)contexts.get(i);
+			
+			//add all descriptors specific to the given content type and the given partition type
+			descriptorsSet.addAll(contentSpecificContext.getDescriptors(partitionTypeID));
+			
+			//add all descriptors specific to the given content type but not specific to a partition type
+			descriptorsSet.addAll(contentSpecificContext.getDescriptors(ALL_PARTITION_TYPES_ID));
+		}
+		
+		List descriptors = new ArrayList(descriptorsSet);
+		return descriptors != null ? Collections.unmodifiableList(descriptors) : Collections.EMPTY_LIST;
+	}
+	
+	/**
+	 * @param contentTypeID get only descriptors associated with this content type
+	 * @return all of the {@link CompletionProposalComputerDescriptor}s associated with the
+	 * given content type
+	 */
+	List getProposalComputerDescriptors(String contentTypeID) {
+		internalEnsureLoaded();
+		
+		Set descriptorsSet = new HashSet();
+		
+		List contexts = this.getContexts(contentTypeID);
+		for(int i = 0; i < contexts.size(); ++i) {
+			CompletionProposalContentTypeContext contentSpecificContext =
+				(CompletionProposalContentTypeContext)contexts.get(i);
+			
+			//add all descriptors specific to the given content type
+			descriptorsSet.addAll(contentSpecificContext.getDescriptors());
+		}
+		
+		List descriptors = new ArrayList(descriptorsSet);
+		return descriptors != null ? Collections.unmodifiableList(descriptors) : Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * @return Unmodifiable list of all of the {@link CompletionProposalComputerDescriptor}s associated with
+	 * this registry
+	 */
+	List getProposalComputerDescriptors() {
+		internalEnsureLoaded();
+		return Collections.unmodifiableList( new ArrayList(fDescriptors.values()));
+	}
+
+	/**
+	 * <p>This method performs differently depending on the state of the registry</p>
+	 * <ul>
+	 * <li>{@link #NONE} - forces the registry to load now on the current thread</li>
+	 * <li>{@link #LOADING} - blocks until the registry has finished loading on
+	 * whichever thread it is being loaded on</li>
+	 * <li>{@link #LOADED} - immediately returns</li>
+	 * </ul>
+	 */
+	private void internalEnsureLoaded() {
+		switch (fState) {
+			case CompletionProposalComputerRegistry.NONE:
+			case CompletionProposalComputerRegistry.INITIALIZING: {
+				load();
+				break;
+			}
+			case CompletionProposalComputerRegistry.LOADING: {
+				//as soon as this lock is released the loading process is done
+				synchronized (fLoadingLock) {
+					//sanity check
+					Assert.isTrue(fState == CompletionProposalComputerRegistry.LOADED,
+							"The state of the registry should be guaranteed to be LOADED " + //$NON-NLS-1$
+							" once the loading lock has been released."); //$NON-NLS-1$
+				}
+				break;
+			}
+		}
+	}
+	
+	/**
+	 * <p>Loads the completion proposal extension points if they
+	 * have not been loaded already</p>
+	 */
+	private void load() {
+		/* hold this lock while loading, others waiting for load to
+		 * finish can synchronize on this lock to be guaranteed the load
+		 * will be done when the lock is released
+		 */
+		synchronized (fLoadingLock) {
+			if(fState == CompletionProposalComputerRegistry.NONE || fState == CompletionProposalComputerRegistry.INITIALIZING) {
+				//update the state
+				fState = CompletionProposalComputerRegistry.LOADING;
+				
+				IExtensionRegistry registry= Platform.getExtensionRegistry();
+				List extensionElements= new ArrayList(Arrays.asList(registry.getConfigurationElementsFor(SSEUIPlugin.ID, EXTENSION_POINT)));
+		
+				Map loadedDescriptors = new HashMap();
+				List extendedComputerActivations = new ArrayList();
+		
+				//get the categories and remove them from the extension elements
+				List categories= getCategories(extensionElements);
+				
+				//deal with the proposal computers and set aside the proposal computer activation extensions
+				for (Iterator iter= extensionElements.iterator(); iter.hasNext();) {
+					IConfigurationElement element= (IConfigurationElement) iter.next();
+					try {
+						if (element.getName().equals(ELEM_PROPOSAL_COMPUTER)) {
+							//create the descriptor and add it to the registry
+							CompletionProposalComputerDescriptor desc = new CompletionProposalComputerDescriptor(element, categories);
+							desc.addToRegistry();
+							loadedDescriptors.put(desc.getId(), desc);
+						} else if(element.getName().equals(ELEM_PROPOSAL_COMPUTER_EXTENDED_ACTIVATION)) {
+							extendedComputerActivations.add(element);
+						}
+		
+					} catch (InvalidRegistryObjectException x) {
+						/*
+						 * Element is not valid any longer as the contributing plug-in was unloaded or for
+						 * some other reason. Do not include the extension in the list and log it
+						 */
+						String message = "The extension ''" + element.toString() + "'' is invalid."; //$NON-NLS-1$ //$NON-NLS-2$
+						IStatus status= new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, message, x);
+						Logger.log(status);
+					} catch (CoreException x) {
+						Logger.log(x.getStatus());
+					}
+				}
+				
+				//deal with extended computer activations
+				for(int i = 0; i < extendedComputerActivations.size(); ++i) {
+					IConfigurationElement element = (IConfigurationElement)extendedComputerActivations.get(i);
+					String proposalComputerID = element.getAttribute(ATTR_ID);
+					CompletionProposalComputerDescriptor descriptor =
+						(CompletionProposalComputerDescriptor)loadedDescriptors.get(proposalComputerID);
+					if(descriptor != null) {
+						try {
+							//add the extra activation contexts to the registry
+							CompletionProposalComputerDescriptor.parseActivationAndAddToRegistry(element, descriptor);
+						} catch (InvalidRegistryObjectException x) {
+							/*
+							 * Element is not valid any longer as the contributing plug-in was unloaded or for
+							 * some other reason. Do not include the extension in the list and log it
+							 */
+							String message = "The extension ''" + element.toString() + "'' is invalid."; //$NON-NLS-1$ //$NON-NLS-2$
+							IStatus status= new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, message, x);
+							Logger.log(status);
+						} catch (CoreException x) {
+							Logger.log(x.getStatus());
+						}
+						
+					} else {
+						//activation extension has invalid computer ID
+						Logger.log(Logger.WARNING, "Configuration element " + element + //$NON-NLS-1$
+								" intented to extend an existing completion proposal computer" + //$NON-NLS-1$
+								" specified an invalid completion proposal computer ID " + //$NON-NLS-1$
+								proposalComputerID);
+					}
+				}
+		
+				fCategories.clear();
+				fCategories.addAll(categories);
+		
+				fDescriptors.clear();
+				fDescriptors.putAll(loadedDescriptors);
+				
+				updateUninstalledComputerCount();
+				
+				//update the state
+				fState = CompletionProposalComputerRegistry.LOADED;
+			}
+		}
+	}
+
+	/**
+	 * <p>Updates the uninstalled computer count</p>
+	 */
+	private void updateUninstalledComputerCount() {
+		IPreferenceStore preferenceStore = SSEUIPlugin.getDefault().getPreferenceStore();
+		int lastNumberOfComputers= preferenceStore.getInt(NUM_COMPUTERS_PREF_KEY);
+		int currNumber= fDescriptors.size();
+		fHasUninstalledComputers= lastNumberOfComputers > currNumber;
+		preferenceStore.putValue(NUM_COMPUTERS_PREF_KEY, Integer.toString(currNumber));
+	}
+
+	/**
+	 * <p>Configures the categories found in the given {@link IConfigurationElement}s
+	 * and removes them from the given list.</p>
+	 * 
+	 * @param extensionElements {@link IConfigurationElement}s that include proposal
+	 * category extensions
+	 * @return {@link CompletionProposalCategory}s created from the given
+	 * {@link IConfigurationElement}s that defined new proposal categories.
+	 */
+	private List getCategories(List extensionElements) {
+		List categories= new ArrayList();
+		for (Iterator iter= extensionElements.iterator(); iter.hasNext();) {
+			IConfigurationElement element= (IConfigurationElement) iter.next();
+			try {
+				if (element.getName().equals(ELEM_PROPOSAL_CATEGORY)) {
+					iter.remove(); // remove from list to leave only computers
+
+					CompletionProposalCategory category= new CompletionProposalCategory(element);
+					categories.add(category);
+				}
+			} catch (InvalidRegistryObjectException x) {
+				/* Element is not valid any longer as the contributing plug-in was unloaded or for
+				 * some other reason. Do not include the extension in the list and log it
+				 */
+				String message = "The extension ''" + element.toString() + "'' has become invalid."; //$NON-NLS-1$ //$NON-NLS-2$
+				IStatus status= new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, message, x);
+				Logger.log(status);
+			} catch (CoreException x) {
+				Logger.log(x.getStatus());
+			}
+		}
+		
+		return categories;
+	}
+	
+	/**
+	 * <p>Gets the {@link CompletionProposalContentTypeContext} associated with the given content type,
+	 * if one does not already exist then one is created</p>
+	 * 
+	 * @param contentTypeID get the {@link CompletionProposalContentTypeContext} associated with this content type
+	 * @return the existing or new {@link CompletionProposalContentTypeContext} associated with the given content type
+	 */
+	private CompletionProposalContentTypeContext getContext(String contentTypeID) {
+		CompletionProposalContentTypeContext context = (CompletionProposalContentTypeContext)this.fActivationContexts.get(contentTypeID);
+		if(context == null) {
+			context = new CompletionProposalContentTypeContext(contentTypeID);
+			this.fActivationContexts.put(contentTypeID, context);
+		}
+		
+		return context;
+	}
+	
+	/**
+	 * <p>Gets all of the {@link CompletionProposalContentTypeContext}s associated with
+	 * the given content type ID.  A context is considered associated if its associated content type ID
+	 * is either the given content type ID or is a base content type ID of the given content type ID.</p>
+	 * 
+	 * @param contentTypeID get the contexts for this content type ID
+	 * @return {@link List} of {@link CompletionProposalContentTypeContext}s associated with the given
+	 * content type ID
+	 */
+	private List getContexts(String contentTypeID) {
+		List contexts = new ArrayList();
+		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID);
+		
+		while(contentType != null) {
+			Object context = this.fActivationContexts.get(contentType.getId());
+			if(context != null) {
+				contexts.add(context);
+			}
+			
+			contentType = contentType.getBaseType();
+		}
+		
+		return contexts;
+	}
+
+	private static class Activator {
+		IConfigurationElement fElement;
+
+		public Activator(IConfigurationElement element) {
+			fElement = element;
+		}
+
+		AutoActivationDelegate createAutoActivation() {
+			AutoActivationDelegate activation = null;
+			if (fElement != null) {
+				try {
+					activation = (AutoActivationDelegate) fElement.createExecutableExtension(ATTR_AUTO_ACTIVATION_CLASS);
+				} catch (CoreException e) {
+				}
+			}
+			return activation;
+		}
+
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalContentTypeContext.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalContentTypeContext.java
new file mode 100644
index 0000000..75ffdf0
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposalContentTypeContext.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <p>There should be one context for each content type. It keeps track
+ * of the describers associated with different partition types for its unique
+ * content type.</p>
+ */
+public class CompletionProposalContentTypeContext {
+
+	/** the content type this context is associated with */
+	private final String fContentTypeID;
+	
+	/**
+	 * 
+	 * <code>{@link Map}&lt{@link String}, {@link Set}&lt{@link CompletionProposalComputerDescriptor}&gt&gt</code>
+	 * <ul>
+	 * <li><b>key:</b> partition type ID</li>
+	 * <li><b>value:</b> {@link Set} of associated computer descriptors</li>
+	 * </ul>
+	 */
+	private Map fPartitionTypesToDescriptors;
+	
+	/**
+	 * <p>Create a new context for the given content type ID.</p>
+	 * <p>There should only ever be one context for any unique content type</p>
+	 * @param contentTypeID the content type this context is for
+	 */
+	public CompletionProposalContentTypeContext(String contentTypeID) {
+		this.fContentTypeID = contentTypeID;
+		this.fPartitionTypesToDescriptors = new HashMap();
+	}
+	
+	/**
+	 * <p>Adds a describer to this context for a given partition type.  There
+	 * can be more then one describer for one partition type.</p>
+	 * 
+	 * @param partitionTypeID the partition type to associate the given descriptor with
+	 * @param descriptor {@link CompletionProposalComputerDescriptor} to associate with the given
+	 * partition type in this context
+	 */
+	public void putDescriptor(String partitionTypeID, CompletionProposalComputerDescriptor descriptor) {
+		Set descriptors = (Set)this.fPartitionTypesToDescriptors.get(partitionTypeID);
+		if(descriptors != null) {
+			descriptors.add(descriptor);
+		} else {
+			descriptors = new HashSet();
+			descriptors.add(descriptor);
+			this.fPartitionTypesToDescriptors.put(partitionTypeID, descriptors);
+		}
+	}
+	
+	/**
+	 * @return All of the {@link CompletionProposalComputerDescriptor}s associated with
+	 * any partition type in this context
+	 */
+	public Set getDescriptors() {
+		Set allDescriptors = new HashSet();
+		Collection descriptorSets = this.fPartitionTypesToDescriptors.values();
+		Iterator iter = descriptorSets.iterator();
+		while(iter.hasNext()) {
+			Set descriptorSet = (Set)iter.next();
+			allDescriptors.addAll(descriptorSet);
+		}
+		
+		return Collections.unmodifiableSet(allDescriptors);
+	}
+	
+	/**
+	 * @param partitionTypeID get {@link CompletionProposalComputerDescriptor}s for only this partition type
+	 * for this context
+	 * @return {@link CompletionProposalComputerDescriptor}s assoicated with the given partition type
+	 * in this context
+	 */
+	public Set getDescriptors(String partitionTypeID) {
+		Set descriptors = (Set)this.fPartitionTypesToDescriptors.get(partitionTypeID);
+		return descriptors != null ? Collections.unmodifiableSet(descriptors) : Collections.EMPTY_SET;
+	}
+	
+	/**
+	 * @return the content type this context is for
+	 */
+	public String getContentTypeID() {
+		return fContentTypeID;
+	}
+	
+	/**
+	 * @return the hash code of the content type ID
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return fContentTypeID.hashCode();
+	}
+	
+	/**
+	 * <p>Two {@link CompletionProposalContentTypeContext} are equal if they have the
+	 * same content type ID.</p>
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		boolean equal = false;
+		if(obj instanceof CompletionProposalContentTypeContext) {
+			equal = this.fContentTypeID.equals(((CompletionProposalContentTypeContext)obj).fContentTypeID);
+		}
+		
+		return equal;
+	}
+	
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		StringBuffer buff = new StringBuffer(this.fContentTypeID);
+		Set partitions = this.fPartitionTypesToDescriptors.keySet();
+		Iterator partitionsIter = partitions.iterator();
+		while(partitionsIter.hasNext()) {
+			String partitionType = (String)partitionsIter.next();
+			buff.append("\n\t" + partitionType); //$NON-NLS-1$
+			List descriptors = (List)this.fPartitionTypesToDescriptors.get(partitionType);
+			for(int i = 0; i < descriptors.size(); ++i) {
+				buff.append("\n\t\t" + descriptors.get(i).toString()); //$NON-NLS-1$
+			}
+		}
+		
+		return buff.toString();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposoalCatigoriesConfigurationRegistry.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposoalCatigoriesConfigurationRegistry.java
new file mode 100644
index 0000000..a84944a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompletionProposoalCatigoriesConfigurationRegistry.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader;
+import org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter;
+
+/**
+ * <p>A registry for all extensions to the
+ * <code>org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration</code>
+ * extension point.</p>
+ */
+public final class CompletionProposoalCatigoriesConfigurationRegistry {
+	/** The extension schema name of the extension point */
+	private static final String EXTENSION_POINT = "completionProposalCategoriesConfiguration"; //$NON-NLS-1$
+
+	/** The extension schema name of categories properties child elements */
+	private static final String ELEM_CATEGORIES_PROPERTIES = "categoriesConfiguration"; //$NON-NLS-1$
+	
+	/** The extension schema name of the content type id attribute */
+	private static final String ATTR_CONTENT_TYPE_ID = "contentTypeID"; //$NON-NLS-1$
+	
+	/** The extension schema name of the class attribute */
+	private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+	
+	/** The singleton instance. */
+	private static CompletionProposoalCatigoriesConfigurationRegistry fgSingleton = null;
+	
+	/** <code>true</code> if this registry has been loaded. */
+	private boolean fLoaded;
+	
+	/**
+	 * <code>{@link Map}<{@link String}, {@link ICompletionProposalCategoriesConfigurationReader}></code>
+	 * <ul>
+	 * <li><b>key:</b> Content Type ID</li>
+	 * <li><b>value:</b> Categories Properties</li>
+	 */
+	private Map fPropertiesByContentTypeID;
+	
+	/**
+	 * @return the singleton instance of this registry
+	 */
+	public static synchronized CompletionProposoalCatigoriesConfigurationRegistry getDefault() {
+		if (fgSingleton == null) {
+			fgSingleton = new CompletionProposoalCatigoriesConfigurationRegistry();
+		}
+
+		return fgSingleton;
+	}
+	
+	/**
+	 * Private constructor to create singleton instance
+	 */
+	private CompletionProposoalCatigoriesConfigurationRegistry() {
+		this.fLoaded = false;
+		this.fPropertiesByContentTypeID = new HashMap();
+	}
+	
+	/**
+	 * @param contentTypeID get the {@link ICompletionProposalCategoriesConfigurationReader} associated
+	 * with the given content type
+	 * @return the {@link ICompletionProposalCategoriesConfigurationReader} associated
+	 * with the given content type, or <code>null</code> if one does not exist.
+	 */
+	public ICompletionProposalCategoriesConfigurationReader getReadableConfiguration(String contentTypeID) {
+		this.ensureLoaded();
+		return (ICompletionProposalCategoriesConfigurationReader)this.fPropertiesByContentTypeID.get(contentTypeID);
+	}
+	
+	/**
+	 * @param contentTypeID get the {@link ICompletionProposalCategoriesConfigurationWriter} associated
+	 * with the given content type
+	 * @return the {@link ICompletionProposalCategoriesConfigurationWriter} associated
+	 * with the given content type, or <code>null</code> if one does not exist.
+	 */
+	public ICompletionProposalCategoriesConfigurationWriter getWritableConfiguration(String contentTypeID) {
+		this.ensureLoaded();
+		
+		ICompletionProposalCategoriesConfigurationReader reader = getReadableConfiguration(contentTypeID);
+		ICompletionProposalCategoriesConfigurationWriter writer = null;
+		if(reader instanceof ICompletionProposalCategoriesConfigurationWriter) {
+			writer = (ICompletionProposalCategoriesConfigurationWriter)reader;
+		}
+		
+		return writer;
+	}
+	
+	/**
+	 * Ensures the <code>org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration</code>
+	 * extensions have been loaded
+	 */
+	private void ensureLoaded() {
+		if(!this.fLoaded) {
+			this.load();
+			this.fLoaded = true;
+		}
+	}
+	
+	/**
+	 * Loads the <code>org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration</code> extensions
+	 */
+	private void load() {
+		//get the extensions
+		IExtensionRegistry registry= Platform.getExtensionRegistry();
+		List extensionElements= new ArrayList(Arrays.asList(registry.getConfigurationElementsFor(SSEUIPlugin.ID, EXTENSION_POINT)));
+		
+		//for each element get its attributes and add it to the map of properties
+		Iterator elementsIter = extensionElements.iterator();
+		while(elementsIter.hasNext()) {
+			IConfigurationElement element = (IConfigurationElement)elementsIter.next();
+			
+			try {
+				if(element.getName().equals(ELEM_CATEGORIES_PROPERTIES)) {				
+					String contentTypeID = element.getAttribute(ATTR_CONTENT_TYPE_ID);
+					ContentAssistUtils.checkExtensionAttributeNotNull(contentTypeID, ATTR_CONTENT_TYPE_ID, element);
+					
+					String pageClass = element.getAttribute(ATTR_CLASS);
+					ContentAssistUtils.checkExtensionAttributeNotNull(pageClass, ATTR_CLASS, element);
+					
+					ICompletionProposalCategoriesConfigurationReader props =
+						(ICompletionProposalCategoriesConfigurationReader)element.createExecutableExtension(ATTR_CLASS);
+				
+					if(!this.fPropertiesByContentTypeID.containsKey(contentTypeID)){
+						this.fPropertiesByContentTypeID.put(contentTypeID, props);
+					} else {
+						Logger.log(Logger.ERROR, "Extension " + element.getDeclaringExtension() + //$NON-NLS-1$
+								" is attempting to to define itself as the proposal cateigories" + //$NON-NLS-1$
+								" configuration for content type " + contentTypeID + " when another" + //$NON-NLS-1$ //$NON-NLS-2$
+								" extensions has already done so."); //$NON-NLS-1$
+					}
+				} else {
+					//extension specified element that is not valid for this extension
+					Logger.log(Logger.WARNING, "The element " + element + " is not valid for the" + //$NON-NLS-1$ //$NON-NLS-2$
+							"org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration" + //$NON-NLS-1$
+							" extension point.  Only " + ELEM_CATEGORIES_PROPERTIES + //$NON-NLS-1$
+							" elements are valid."); //$NON-NLS-1$
+				}
+			} catch (InvalidRegistryObjectException x) {
+				/*
+				 * Element is not valid any longer as the contributing plug-in was unloaded
+				 * or for some other reason. 
+				 */
+				String message = "The extension ''" + element.toString() + "'' has become invalid."; //$NON-NLS-1$ //$NON-NLS-2$
+				IStatus status= new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, message, x);
+				Logger.log(status);
+			} catch (CoreException x) {
+				Logger.log(x.getStatus());
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompoundContentAssistProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompoundContentAssistProcessor.java
new file mode 100644
index 0000000..7e89b43
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompoundContentAssistProcessor.java
@@ -0,0 +1,570 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.contentassist.IContentAssistSubjectControl;
+import org.eclipse.jface.contentassist.ISubjectControlContentAssistProcessor;
+import org.eclipse.jface.contentassist.ISubjectControlContextInformationPresenter;
+import org.eclipse.jface.contentassist.ISubjectControlContextInformationValidator;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationExtension;
+import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+/**
+ * <p>A processor that aggregates the proposals of multiple other processors.
+ * When proposals are requested, the contained processors are queried in the
+ * order they were added to the compound object. Copied from
+ * org.eclipse.jdt.internal.ui.text.CompoundContentAssistProcessor.
+ * Modification was made to add a dispose() method.</p>
+ */
+public class CompoundContentAssistProcessor implements IContentAssistProcessor, ISubjectControlContentAssistProcessor, IReleasable {
+
+	/** the compound processors */
+	private final Set fProcessors = new LinkedHashSet();
+	
+	/** Aggregated error message from the compound processors */
+	private String fErrorMessage;
+
+	/**
+	 * Creates a new instance.
+	 */
+	public CompoundContentAssistProcessor() {
+	}
+
+	/**
+	 * Creates a new instance with one child processor.
+	 * 
+	 * @param processor
+	 *            the processor to add
+	 */
+	public CompoundContentAssistProcessor(IContentAssistProcessor processor) {
+		add(processor);
+	}
+
+	/**
+	 * Adds a processor to this compound processor.
+	 * 
+	 * @param processor
+	 *            the processor to add
+	 */
+	public void add(IContentAssistProcessor processor) {
+		Assert.isNotNull(processor);
+		fProcessors.add(processor);
+	}
+	
+	/**
+	 * @param processor check to see if this {@link IContentAssistProcessor} is one
+	 * in this compound processor.
+	 * 
+	 * @return <code>true</code> if this compound processor contains the given processor,
+	 * <code>false</code> otherwise
+	 */
+	public boolean containsProcessor(IContentAssistProcessor processor) {
+		return fProcessors.contains(processor);
+	}
+
+	/**
+	 * Removes a processor from this compound processor.
+	 * 
+	 * @param processor
+	 *            the processor to remove
+	 */
+	public void remove(IContentAssistProcessor processor) {
+		fProcessors.remove(processor);
+	}
+
+	/**
+	 * Creates a new instance and adds all specified processors.
+	 * 
+	 * @param processors
+	 */
+	public CompoundContentAssistProcessor(IContentAssistProcessor[] processors) {
+		for (int i = 0; i < processors.length; i++) {
+			add(processors[i]);
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
+		fErrorMessage = null;
+		List ret = new LinkedList();
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			try {
+				// isolate calls to each processor
+				ICompletionProposal[] proposals = p.computeCompletionProposals(viewer, documentOffset);
+				if (proposals != null && proposals.length > 0) {
+					ret.addAll(Arrays.asList(proposals));
+					fErrorMessage = null; // Hide previous errors
+				}
+				else {
+					if (fErrorMessage == null && ret.isEmpty()) {
+						String errorMessage = p.getErrorMessage();
+						if (errorMessage != null) {
+							fErrorMessage = errorMessage;
+						}
+					}
+				}
+			}
+			catch (Exception e) {
+				Logger.logException(e);
+			}
+		}
+		return (ICompletionProposal[]) ret.toArray(new ICompletionProposal[ret.size()]);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * The returned objects are wrapper objects around the real information
+	 * containers.
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
+		fErrorMessage = null;
+		List ret = new LinkedList();
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			IContextInformation[] informations = p.computeContextInformation(viewer, documentOffset);
+			if (informations != null && informations.length > 0) {
+				for (int i = 0; i < informations.length; i++)
+					ret.add(new WrappedContextInformation(informations[i], p));
+				fErrorMessage = null; // Hide previous errors
+			} else {
+				if (fErrorMessage == null && ret.isEmpty()) {
+					String errorMessage = p.getErrorMessage();
+					if (errorMessage != null) {
+						fErrorMessage = errorMessage;
+					}
+				}
+			}
+		}
+		return (IContextInformation[]) ret.toArray(new IContextInformation[ret.size()]);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		Set ret = new LinkedHashSet();
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			char[] chars = p.getCompletionProposalAutoActivationCharacters();
+			if (chars != null)
+				for (int i = 0; i < chars.length; i++)
+					ret.add(new Character(chars[i]));
+		}
+
+		char[] chars = new char[ret.size()];
+		int i = 0;
+		for (Iterator it = ret.iterator(); it.hasNext(); i++) {
+			Character ch = (Character) it.next();
+			chars[i] = ch.charValue();
+		}
+		return chars;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters()
+	 */
+	public char[] getContextInformationAutoActivationCharacters() {
+		Set ret = new LinkedHashSet();
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			char[] chars = p.getContextInformationAutoActivationCharacters();
+			if (chars != null)
+				for (int i = 0; i < chars.length; i++)
+					ret.add(new Character(chars[i]));
+		}
+
+		char[] chars = new char[ret.size()];
+		int i = 0;
+		for (Iterator it = ret.iterator(); it.hasNext(); i++) {
+			Character ch = (Character) it.next();
+			chars[i] = ch.charValue();
+		}
+		return chars;
+	}
+
+	/**
+	 * Returns the error message of one of
+	 * contained processor if any, or <code>null</code> if no processor has an
+	 * error message.
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getErrorMessage()
+	 * @return {@inheritDoc}
+	 */
+	public String getErrorMessage() {
+		return fErrorMessage;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * The returned validator is a wrapper around the validators provided by
+	 * the child processors.
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator()
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		boolean hasValidator = false;
+		boolean hasPresenter = false;
+		boolean hasExtension = false;
+
+		Iterator itp = fProcessors.iterator();
+		while (itp.hasNext() && (!hasPresenter || !hasExtension)) {
+			IContentAssistProcessor p = (IContentAssistProcessor) itp.next();
+			IContextInformationValidator v = p.getContextInformationValidator();
+			if (v != null) {
+				hasValidator = true;
+				if (v instanceof IContextInformationPresenter) {
+					hasPresenter = true;
+				}
+				if (v instanceof ISubjectControlContextInformationPresenter || v instanceof ISubjectControlContextInformationValidator) {
+					hasExtension = true;
+				}
+			}
+		}
+
+		CompoundContentAssistValidator validator = null;
+		if (hasPresenter && hasExtension)
+			validator = new CompoundContentAssistValidatorPresenterEx();
+		else if (hasPresenter)
+			validator = new CompoundContentAssistValidatorPresenter();
+		else if (hasExtension)
+			validator = new CompoundContentAssistValidatorEx();
+		else if (hasValidator)
+			validator = new CompoundContentAssistValidator();
+
+		if (validator != null)
+			for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+				IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+				IContextInformationValidator v = p.getContextInformationValidator();
+				if (v != null)
+					validator.add(v);
+			}
+
+		return validator;
+	}
+
+	/*
+	 * @see ISubjectControlContentAssistProcessor#computeCompletionProposals(IContentAssistSubjectControl,
+	 *      int)
+	 */
+	public ICompletionProposal[] computeCompletionProposals(IContentAssistSubjectControl contentAssistSubjectControl, int documentOffset) {
+		fErrorMessage = null;
+		List ret = new LinkedList();
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			Object o = it.next();
+			if (o instanceof ISubjectControlContentAssistProcessor) {
+				ISubjectControlContentAssistProcessor p = (ISubjectControlContentAssistProcessor) o;
+				ICompletionProposal[] proposals = p.computeCompletionProposals(contentAssistSubjectControl, documentOffset);
+				if (proposals != null && proposals.length > 0) {
+					ret.addAll(Arrays.asList(proposals));
+					fErrorMessage = null; // Hide previous errors
+				} else {
+					if (fErrorMessage == null && ret.isEmpty()) {
+						String errorMessage = p.getErrorMessage();
+						if (errorMessage != null) {
+							fErrorMessage = errorMessage;
+						}
+					}
+				}
+			}
+		}
+
+		return (ICompletionProposal[]) ret.toArray(new ICompletionProposal[ret.size()]);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * <p>
+	 * The returned objects are wrapper objects around the real information
+	 * containers.
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.contentassist.ISubjectControlContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.contentassist.IContentAssistSubject,
+	 *      int)
+	 */
+	public IContextInformation[] computeContextInformation(IContentAssistSubjectControl contentAssistSubjectControl, int documentOffset) {
+		fErrorMessage = null;
+		List ret = new LinkedList();
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			Object o = it.next();
+			if (o instanceof ISubjectControlContentAssistProcessor) {
+				ISubjectControlContentAssistProcessor p = (ISubjectControlContentAssistProcessor) o;
+				IContextInformation[] informations = p.computeContextInformation(contentAssistSubjectControl, documentOffset);
+				if (informations != null && informations.length > 0) {
+					for (int i = 0; i < informations.length; i++)
+						ret.add(new WrappedContextInformation(informations[i], p));
+					fErrorMessage = null; // Hide previous errors
+				} else {
+					if (fErrorMessage == null && ret.isEmpty()) {
+						String errorMessage = p.getErrorMessage();
+						if (errorMessage != null) {
+							fErrorMessage = errorMessage;
+						}
+					}
+				}
+			}
+		}
+		return (IContextInformation[]) ret.toArray(new IContextInformation[ret.size()]);
+	}
+
+	/**
+	 * Dispose of any content assist processors that need disposing
+	 * @deprecated use {@link #release()}
+	 */
+	public void dispose() {
+		this.release();
+	}
+	
+	public void install(ITextViewer viewer) {
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			if (p instanceof StructuredContentAssistProcessor) {
+				((StructuredContentAssistProcessor) p).install(viewer);
+			}
+		}
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.IReleasable#release()
+	 */
+	public void release() {
+		// go through list of content assist processors and dispose
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			if (p instanceof IReleasable) {
+				((IReleasable) p).release();
+			}
+		}
+	}
+	
+	private static class WrappedContextInformation implements IContextInformation, IContextInformationExtension {
+		private IContextInformation fInfo;
+		private IContentAssistProcessor fProcessor;
+
+		WrappedContextInformation(IContextInformation info, IContentAssistProcessor processor) {
+			fInfo = info;
+			fProcessor = processor;
+		}
+
+		/*
+		 * @see java.lang.Object#equals(java.lang.Object)
+		 */
+		public boolean equals(Object obj) {
+			return fInfo.equals(obj);
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.contentassist.IContextInformation#getContextDisplayString()
+		 */
+		public String getContextDisplayString() {
+			return fInfo.getContextDisplayString();
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.contentassist.IContextInformation#getImage()
+		 */
+		public Image getImage() {
+			return fInfo.getImage();
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.contentassist.IContextInformation#getInformationDisplayString()
+		 */
+		public String getInformationDisplayString() {
+			return fInfo.getInformationDisplayString();
+		}
+
+		/*
+		 * @see java.lang.Object#hashCode()
+		 */
+		public int hashCode() {
+			return fInfo.hashCode();
+		}
+
+		/*
+		 * @see java.lang.Object#toString()
+		 */
+		public String toString() {
+			return fInfo.toString();
+		}
+
+		IContentAssistProcessor getProcessor() {
+			return fProcessor;
+		}
+
+		IContextInformation getContextInformation() {
+			return fInfo;
+		}
+
+		public int getContextInformationPosition() {
+			int position = -1;
+			if (fInfo instanceof IContextInformationExtension)
+				position = ((IContextInformationExtension)fInfo).getContextInformationPosition();
+			return position;
+		}
+	}
+	
+	private static class CompoundContentAssistValidator implements IContextInformationValidator {
+		List fValidators = new ArrayList();
+		IContextInformationValidator fValidator;
+
+		void add(IContextInformationValidator validator) {
+			fValidators.add(validator);
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.contentassist.IContextInformationValidator#install(org.eclipse.jface.text.contentassist.IContextInformation,
+		 *      org.eclipse.jface.text.ITextViewer, int)
+		 */
+		public void install(IContextInformation info, ITextViewer viewer, int documentPosition) {
+			// install either the validator in the info, or all validators
+			fValidator = getValidator(info);
+			IContextInformation realInfo = getContextInformation(info);
+			if (fValidator != null)
+				fValidator.install(realInfo, viewer, documentPosition);
+			else {
+				for (Iterator it = fValidators.iterator(); it.hasNext();) {
+					IContextInformationValidator v = (IContextInformationValidator) it.next();
+					v.install(realInfo, viewer, documentPosition);
+				}
+			}
+		}
+
+		IContextInformationValidator getValidator(IContextInformation info) {
+			if (info instanceof WrappedContextInformation) {
+				WrappedContextInformation wrap = (WrappedContextInformation) info;
+				return wrap.getProcessor().getContextInformationValidator();
+			}
+
+			return null;
+		}
+
+		IContextInformation getContextInformation(IContextInformation info) {
+			IContextInformation realInfo = info;
+			if (info instanceof WrappedContextInformation) {
+				WrappedContextInformation wrap = (WrappedContextInformation) info;
+				realInfo = wrap.getContextInformation();
+			}
+
+			return realInfo;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.contentassist.IContextInformationValidator#isContextInformationValid(int)
+		 */
+		public boolean isContextInformationValid(int documentPosition) {
+			// use either the validator in the info, or all validators
+			boolean isValid = false;
+			if (fValidator != null)
+				isValid = fValidator.isContextInformationValid(documentPosition);
+			else {
+				for (Iterator it = fValidators.iterator(); it.hasNext();) {
+					IContextInformationValidator v = (IContextInformationValidator) it.next();
+					isValid |= v.isContextInformationValid(documentPosition);
+				}
+			}
+			return isValid;
+		}
+
+	}
+
+	private static class CompoundContentAssistValidatorPresenter extends CompoundContentAssistValidator implements IContextInformationPresenter {
+		public boolean updatePresentation(int offset, TextPresentation presentation) {
+			// use either the validator in the info, or all validators
+			boolean presentationUpdated = false;
+			if (fValidator instanceof IContextInformationPresenter)
+				presentationUpdated = ((IContextInformationPresenter) fValidator).updatePresentation(offset, presentation);
+			else {
+				for (Iterator it = fValidators.iterator(); it.hasNext();) {
+					IContextInformationValidator v = (IContextInformationValidator) it.next();
+					if (v instanceof IContextInformationPresenter)
+						presentationUpdated |= ((IContextInformationPresenter) v).updatePresentation(offset, presentation);
+				}
+			}
+			return presentationUpdated;
+		}
+	}
+
+	private static class CompoundContentAssistValidatorEx extends CompoundContentAssistValidator implements ISubjectControlContextInformationValidator {
+		/*
+		 * @see ISubjectControlContextInformationValidator#install(IContextInformation,
+		 *      IContentAssistSubjectControl, int)
+		 */
+		public void install(IContextInformation info, IContentAssistSubjectControl contentAssistSubjectControl, int documentPosition) {
+			// install either the validator in the info, or all validators
+			fValidator = getValidator(info);
+			IContextInformation realInfo = getContextInformation(info);
+			if (fValidator instanceof ISubjectControlContextInformationValidator)
+				((ISubjectControlContextInformationValidator) fValidator).install(realInfo, contentAssistSubjectControl, documentPosition);
+			else {
+				for (Iterator it = fValidators.iterator(); it.hasNext();) {
+					if (it.next() instanceof ISubjectControlContextInformationValidator)
+						((ISubjectControlContextInformationValidator) it.next()).install(realInfo, contentAssistSubjectControl, documentPosition);
+				}
+			}
+		}
+
+	}
+
+	private static class CompoundContentAssistValidatorPresenterEx extends CompoundContentAssistValidatorPresenter implements ISubjectControlContextInformationPresenter, ISubjectControlContextInformationValidator {
+		/*
+		 * @see ISubjectControlContextInformationPresenter#install(IContextInformation,
+		 *      IContentAssistSubjectControl, int)
+		 */
+		public void install(IContextInformation info, IContentAssistSubjectControl contentAssistSubjectControl, int documentPosition) {
+			// install either the validator in the info, or all validators
+			fValidator = getValidator(info);
+			IContextInformation realInfo = getContextInformation(info);
+
+			if (fValidator instanceof ISubjectControlContextInformationValidator)
+				((ISubjectControlContextInformationValidator) fValidator).install(realInfo, contentAssistSubjectControl, documentPosition);
+			else {
+				for (Iterator it = fValidators.iterator(); it.hasNext();) {
+					if (it.next() instanceof ISubjectControlContextInformationValidator)
+						((ISubjectControlContextInformationValidator) it.next()).install(realInfo, contentAssistSubjectControl, documentPosition);
+				}
+			}
+		}
+
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/ContentAssistUtils.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/ContentAssistUtils.java
new file mode 100644
index 0000000..9b1fa92
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/ContentAssistUtils.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * @author pavery
+ *  
+ */
+public class ContentAssistUtils {
+
+	/**
+	 * Returns the closest IndexedRegion for the offset and viewer allowing
+	 * for differences between viewer offsets and model positions. note: this
+	 * method returns an IndexedRegion for read only
+	 * 
+	 * @param viewer
+	 *            the viewer whose document is used to compute the proposals
+	 * @param documentOffset
+	 *            an offset within the document for which completions should
+	 *            be computed
+	 * @return an IndexedRegion
+	 */
+	public static IndexedRegion getNodeAt(ITextViewer viewer, int documentOffset) {
+
+		if (viewer == null)
+			return null;
+
+		IndexedRegion node = null;
+		IModelManager mm = StructuredModelManager.getModelManager();
+		IStructuredModel model = null;
+		if (mm != null)
+			model = mm.getExistingModelForRead(viewer.getDocument());
+		try {
+			if (model != null) {
+				int lastOffset = documentOffset;
+				node = model.getIndexedRegion(documentOffset);
+				while (node == null && lastOffset >= 0) {
+					lastOffset--;
+					node = model.getIndexedRegion(lastOffset);
+				}
+			}
+		} finally {
+			if (model != null)
+				model.releaseFromRead();
+		}
+		return node;
+	}
+
+	/**
+	 * Returns the closest IStructuredDocumentRegion for the offest and
+	 * viewer.
+	 * 
+	 * @param viewer
+	 * @param documentOffset
+	 * @return the closest IStructuredDocumentRegion for the offest and
+	 *         viewer.
+	 */
+	public static IStructuredDocumentRegion getStructuredDocumentRegion(ITextViewer viewer, int documentOffset) {
+		IStructuredDocumentRegion sdRegion = null;
+		if (viewer == null || viewer.getDocument() == null)
+			return null;
+
+		int lastOffset = documentOffset;
+		IStructuredDocument doc = (IStructuredDocument) viewer.getDocument();
+		sdRegion = doc.getRegionAtCharacterOffset(documentOffset);
+		while (sdRegion == null && lastOffset >= 0) {
+			lastOffset--;
+			sdRegion = doc.getRegionAtCharacterOffset(lastOffset);
+		}
+		return sdRegion;
+	}
+	
+	/**
+	 * @return the bundle that defined the {@link IConfigurationElement} that defines
+	 * this category.
+	 */
+	public static Bundle getBundle(IConfigurationElement element) {
+		String namespace= element.getDeclaringExtension().getContributor().getName();
+		Bundle bundle= Platform.getBundle(namespace);
+		return bundle;
+	}
+	
+	/**
+	 * <p>Checks that the given attribute value is not <code>null</code>.</p>
+	 *
+	 * @param value the object to check if not null
+	 * @param attribute the attribute
+	 * 
+	 * @throws InvalidRegistryObjectException if the registry element is no longer valid
+	 * @throws CoreException if <code>value</code> is <code>null</code>
+	 */
+	public static void checkExtensionAttributeNotNull(Object value, String attribute,
+			IConfigurationElement element) throws InvalidRegistryObjectException, CoreException {
+		
+		if (value == null) {
+			String message = "The extension \"" + element.getDeclaringExtension().getUniqueIdentifier() + //$NON-NLS-1$
+				"\" from plug-in \"" + element.getContributor().getName() + //$NON-NLS-1$
+				"\" did not specify a value for the required \"" + attribute + //$NON-NLS-1$
+				"\" attribute for the element \"" + element.getName() + "\". Disabling the extension."; //$NON-NLS-1$ //$NON-NLS-2$
+			IStatus status= new Status(IStatus.WARNING, SSEUIPlugin.ID, IStatus.OK, message, null);
+			throw new CoreException(status);
+		}
+	}
+	
+	/**
+	 * @param textViewer check to see if this viewer is empty
+	 * @return <code>true</code> if there is no text or it's all white space,
+	 * <code>false</code> otherwise
+	 */
+	public static boolean isViewerEmpty(ITextViewer textViewer) {
+		boolean isEmpty = false;
+		String text = textViewer.getTextWidget().getText();
+		if ((text == null) || ((text != null) && text.trim().equals(""))) { //$NON-NLS-1$
+			isEmpty = true;
+		}
+		return isEmpty;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/ContextInformationValidator.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/ContextInformationValidator.java
new file mode 100644
index 0000000..cbaf65f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/ContextInformationValidator.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * <p>A {@link IContextInformationValidator} for structured documents</p>
+ */
+public class ContextInformationValidator implements IContextInformationValidator {
+
+	/** the installed document position */
+	private int fDocumentPosition;
+
+	/** the installed document */
+	private IStructuredDocument fDocument;
+	
+	/** the installed region start*/
+	private IndexedRegion fRegion;
+	
+	/**
+	 * <p>Default constructor</p>
+	 */
+	public ContextInformationValidator() {
+		fDocumentPosition = -1;
+		fDocument = null;
+	}
+	
+	/**
+	 * @see org.eclipse.jface.text.contentassist.IContextInformationValidator#install(org.eclipse.jface.text.contentassist.IContextInformation,
+	 *      org.eclipse.jface.text.ITextViewer, int)
+	 */
+	public void install(IContextInformation info, ITextViewer viewer, int documentPosition) {
+		fDocumentPosition = documentPosition;
+		fDocument = (IStructuredDocument)viewer.getDocument();
+	}
+	
+	/**
+	 * @see org.eclipse.jface.text.contentassist.IContextInformationValidator#isContextInformationValid(int)
+	 */
+	public boolean isContextInformationValid(int documentPosition) {
+		/*
+		 * determine whether or not this context info should still be
+		 * showing... if cursor still within the same region then it's valid
+		 */
+		boolean result = false;
+
+		calculateInstalledIndexedRegion();
+		
+		if (fRegion != null) {
+			int start = fRegion.getStartOffset();
+			int end = fRegion.getEndOffset();
+			result = (documentPosition < end) && (documentPosition > start + 1);
+		}
+		return result;
+	}
+	
+	/**
+	 * @return {@link IndexedRegion} that this validator was installed on
+	 */
+	private void calculateInstalledIndexedRegion() {
+		if (fRegion == null) {
+			IStructuredModel model = null;
+			try {
+				model = StructuredModelManager.getModelManager().getModelForRead(fDocument);
+				if (model != null) {
+					fRegion = model.getIndexedRegion(fDocumentPosition);
+				}
+			}
+			finally {
+				if (model != null)
+					model.releaseFromRead();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CustomCompletionProposal.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CustomCompletionProposal.java
new file mode 100644
index 0000000..f39ba52
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CustomCompletionProposal.java
@@ -0,0 +1,334 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+
+/**
+ * An implementation of ICompletionProposal whose values can be read after
+ * creation.
+ */
+public class CustomCompletionProposal implements ICompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, IRelevanceCompletionProposal {
+
+	private String fAdditionalProposalInfo;
+
+	private IContextInformation fContextInformation;
+
+	private int fCursorPosition = 0;
+
+	private String fDisplayString;
+
+	private String fAlternateMatch;
+
+	private Image fImage;
+
+	private int fRelevance = IRelevanceConstants.R_NONE;
+
+	private int fReplacementLength = 0;
+
+	private int fReplacementOffset = 0;
+
+	private String fReplacementString = null;
+
+	private boolean fUpdateLengthOnValidate;
+
+	private char[] fTriggers;
+
+	/**
+	 * Constructor with relevance and replacement length update flag.
+	 * 
+	 * If the <code>updateReplacementLengthOnValidate</code> flag is true,
+	 * then when the user types, the replacement length will be incremented by
+	 * the number of new characters inserted from the original position.
+	 * Otherwise the replacement length will not change on validate.
+	 * 
+	 * ex.
+	 * 
+	 * <tag |name="attr"> - the replacement length is 4 <tag i|name="attr"> -
+	 * the replacement length is now 5 <tag id|name="attr"> - the replacement
+	 * length is now 6 <tag |name="attr"> - the replacementlength is now 4
+	 * again <tag |name="attr"> - the replacment length remains 4
+	 * 
+	 */
+	public CustomCompletionProposal(String replacementString, int replacementOffset, int replacementLength, int cursorPosition, Image image, String displayString, IContextInformation contextInformation, String additionalProposalInfo, int relevance, boolean updateReplacementLengthOnValidate) {
+		this(replacementString, replacementOffset, replacementLength, cursorPosition, image, displayString, null, contextInformation, additionalProposalInfo, relevance, updateReplacementLengthOnValidate);
+	}
+
+	public CustomCompletionProposal(String replacementString, int replacementOffset, int replacementLength, int cursorPosition, Image image, String displayString, IContextInformation contextInformation, String additionalProposalInfo, int relevance) {
+		this(replacementString, replacementOffset, replacementLength, cursorPosition, image, displayString, contextInformation, additionalProposalInfo, relevance, true);
+	}
+
+	public CustomCompletionProposal(String replacementString, int replacementOffset, int replacementLength, int cursorPosition, Image image, String displayString, String alternateMatch, IContextInformation contextInformation, String additionalProposalInfo, int relevance, boolean updateReplacementLengthOnValidate) {
+		fReplacementString = replacementString;
+		fReplacementOffset = replacementOffset;
+		fReplacementLength = replacementLength;
+		fCursorPosition = cursorPosition;
+		fImage = image;
+		fDisplayString = displayString;
+		fAlternateMatch = alternateMatch;
+		fContextInformation = contextInformation;
+		fAdditionalProposalInfo = additionalProposalInfo;
+		fRelevance = relevance;
+		fUpdateLengthOnValidate = updateReplacementLengthOnValidate;
+	}
+
+	public void apply(IDocument document) {
+		CompletionProposal proposal = new CompletionProposal(getReplacementString(), getReplacementOffset(), getReplacementLength(), getCursorPosition(), getImage(), getDisplayString(), getContextInformation(), getAdditionalProposalInfo());
+		proposal.apply(document);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension#apply(org.eclipse.jface.text.IDocument,
+	 *      char, int)
+	 */
+	public void apply(IDocument document, char trigger, int offset) {
+		CompletionProposal proposal = new CompletionProposal(getReplacementString(), getReplacementOffset(), getReplacementLength(), getCursorPosition(), getImage(), getDisplayString(), getContextInformation(), getAdditionalProposalInfo());
+		// we currently don't do anything special for which character
+		// selected the proposal, and where the cursor offset is
+		// but we might in the future...
+		proposal.apply(document);
+		// we want to ContextInformationPresenter.updatePresentation() here
+	}
+
+	public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
+		IDocument document = viewer.getDocument();
+		// CMVC 252634 to compensate for "invisible" initial region
+		int caretOffset = viewer.getTextWidget().getCaretOffset();
+		if (viewer instanceof ITextViewerExtension5) {
+			ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
+			caretOffset = extension.widgetOffset2ModelOffset(caretOffset);
+		}
+		else {
+			caretOffset = viewer.getTextWidget().getCaretOffset() + viewer.getVisibleRegion().getOffset();
+		}
+
+		if (caretOffset == getReplacementOffset()) {
+			apply(document);
+		}
+		else {
+			// replace the text without affecting the caret Position as this
+			// causes the cursor to move on its own
+			try {
+				int endOffsetOfChanges = getReplacementString().length() + getReplacementOffset();
+				// Insert the portion of the new text that comes after the
+				// current caret position
+				if (endOffsetOfChanges >= caretOffset) {
+					int postCaretReplacementLength = getReplacementOffset() + getReplacementLength() - caretOffset;
+					int preCaretReplacementLength = getReplacementString().length() - (endOffsetOfChanges - caretOffset);
+					if (postCaretReplacementLength < 0) {
+						if (Debug.displayWarnings) {
+							System.out.println("** postCaretReplacementLength was negative: " + postCaretReplacementLength); //$NON-NLS-1$
+						}
+						// This is just a quick fix while I figure out what
+						// replacement length is supposed to be
+						// in each case, otherwise we'll get negative
+						// replacment length sometimes
+						postCaretReplacementLength = 0;
+					}
+					document.replace(caretOffset, postCaretReplacementLength, getReplacementString().substring(preCaretReplacementLength));
+				}
+				// Insert the portion of the new text that comes before the
+				// current caret position
+				// Done second since offsets would change for the post text
+				// otherwise
+				// Outright insertions are handled here
+				if (caretOffset > getReplacementOffset()) {
+					int preCaretTextLength = caretOffset - getReplacementOffset();
+					document.replace(getReplacementOffset(), preCaretTextLength, getReplacementString().substring(0, preCaretTextLength));
+				}
+			}
+			catch (BadLocationException x) {
+				apply(document);
+			}
+			catch (StringIndexOutOfBoundsException e) {
+				apply(document);
+			}
+		}
+	}
+
+	public String getAdditionalProposalInfo() {
+		// return fProposal.getAdditionalProposalInfo();
+		return fAdditionalProposalInfo;
+	}
+
+	public IContextInformation getContextInformation() {
+		// return fProposal.getContextInformation();
+		return fContextInformation;
+	}
+
+	public void setContextInformation(IContextInformation contextInfo) {
+		fContextInformation = contextInfo;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension#getContextInformationPosition()
+	 */
+	public int getContextInformationPosition() {
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=110355
+		// return getCursorPosition();
+		if (getContextInformation() == null)
+			return getReplacementOffset() - 1;
+		return getReplacementOffset() + getCursorPosition();
+	}
+
+	public int getCursorPosition() {
+		return fCursorPosition;
+	}
+
+	public void setCursorPosition(int pos) {
+		fCursorPosition = pos;
+	}
+
+	public void setDisplayString(String newDisplayString) {
+		fDisplayString = newDisplayString;
+	}
+
+	public String getDisplayString() {
+		// return fProposal.getDisplayString();
+		return fDisplayString;
+	}
+
+	public Image getImage() {
+		// return fProposal.getImage();
+		return fImage;
+	}
+
+	public int getRelevance() {
+		return fRelevance;
+	}
+
+	public void setReplacementLength(int newReplacementLength) {
+		fReplacementLength = newReplacementLength;
+	}
+
+	public int getReplacementLength() {
+		return fReplacementLength;
+	}
+
+	public int getReplacementOffset() {
+		return fReplacementOffset;
+	}
+
+	public String getReplacementString() {
+		return fReplacementString;
+	}
+
+	public Point getSelection(IDocument document) {
+		// return fProposal.getSelection(document);
+		CompletionProposal proposal = new CompletionProposal(getReplacementString(), getReplacementOffset(), getReplacementLength(), getCursorPosition(), getImage(), getDisplayString(), getContextInformation(), getAdditionalProposalInfo());
+		return proposal.getSelection(document);
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension#getTriggerCharacters()
+	 */
+
+	public char[] getTriggerCharacters() {
+		return fTriggers;
+	}
+
+	public void setTriggerCharacters(char[] triggers) {
+		fTriggers = triggers;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension#isValidFor(org.eclipse.jface.text.IDocument,
+	 *      int)
+	 */
+	public boolean isValidFor(IDocument document, int offset) {
+		return validate(document, offset, null);
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#selected(org.eclipse.jface.text.ITextViewer,
+	 *      boolean)
+	 */
+	public void selected(ITextViewer viewer, boolean smartToggle) {
+	}
+
+	// code is borrowed from JavaCompletionProposal
+	protected boolean startsWith(IDocument document, int offset, String word) {
+
+		int wordLength = word == null ? 0 : word.length();
+		if (offset > fReplacementOffset + wordLength)
+			return false;
+
+		try {
+			int length = offset - fReplacementOffset;
+			String start = document.get(fReplacementOffset, length);
+
+			return (word != null && word.substring(0, length).equalsIgnoreCase(start)) || (fAlternateMatch != null && length <= fAlternateMatch.length() && fAlternateMatch.substring(0, length).equalsIgnoreCase(start));
+		}
+		catch (BadLocationException x) {
+		}
+
+		return false;
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#unselected(org.eclipse.jface.text.ITextViewer)
+	 */
+	public void unselected(ITextViewer viewer) {
+	}
+
+	/**
+	 * borrowed from JavaCompletionProposal
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#validate(org.eclipse.jface.text.IDocument,
+	 *      int, org.eclipse.jface.text.DocumentEvent)
+	 */
+	public boolean validate(IDocument document, int offset, DocumentEvent event) {
+		if (offset < fReplacementOffset)
+			return false;
+		boolean validated = startsWith(document, offset, fDisplayString);
+
+		if (fUpdateLengthOnValidate && event != null) {
+			fReplacementLength += event.fText.length() - event.fLength; //adjust the replacement length by the event's text replacement
+		}
+		return validated;
+	}
+
+	/**
+	 * @param replacementOffset
+	 *            The fReplacementOffset to set.
+	 */
+	public void setReplacementOffset(int replacementOffset) {
+		fReplacementOffset = replacementOffset;
+	}
+
+	/**
+	 * @param replacementString
+	 *            The fReplacementString to set.
+	 */
+	public void setReplacementString(String replacementString) {
+		fReplacementString = replacementString;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IRelevanceCompletionProposal.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IRelevanceCompletionProposal.java
new file mode 100644
index 0000000..7e3f7a6
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IRelevanceCompletionProposal.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+
+/**
+ * CompletionProposal with a relevance value. The relevance value is used to
+ * sort the completion proposals. Proposals with higher relevance should be
+ * listed before proposals with lower relevance.
+ * 
+ * @author pavery
+ */
+public interface IRelevanceCompletionProposal {
+	/**
+	 * Returns the relevance of the proposal.
+	 */
+	int getRelevance();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IRelevanceConstants.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IRelevanceConstants.java
new file mode 100644
index 0000000..ba5a16e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IRelevanceConstants.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+public interface IRelevanceConstants {
+	int R_NONE = 0;
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/OptionalMessageDialog.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/OptionalMessageDialog.java
new file mode 100644
index 0000000..04cde16
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/OptionalMessageDialog.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * <p>This is a <code>MessageDialog</code> which allows the user
+ * to choose that the dialog isn't shown again the next time.</p>
+ * 
+ * @base org.eclipse.jdt.internal.ui.dialogs.OptionalMessageDialog
+ */
+public class OptionalMessageDialog extends MessageDialog {
+
+	// String constants for widgets
+	private static final String CHECKBOX_TEXT = SSEUIMessages.OptionalMessageDialog_dontShowAgain;
+
+	// Dialog store id constants
+	private static final String STORE_ID = "ContentAssist_OptionalMessageDialog.hide."; //$NON-NLS-1$
+
+	public static final int NOT_SHOWN = IDialogConstants.CLIENT_ID + 1;
+
+	private final String fId;
+	private final String fCheckBoxText;
+
+	private Button fHideDialogCheckBox;
+
+
+	/**
+	 * Opens the dialog but only if the user hasn't chosen to hide it.
+	 *
+	 * @return the index of the pressed button or {@link SWT#DEFAULT} if the dialog got dismissed
+	 *         without pressing a button (e.g. via Esc) or {{@link #NOT_SHOWN} if the dialog was not
+	 *         shown
+	 */
+	public static int open(String id, Shell parent, String title, Image titleImage, String message, int dialogType, String[] buttonLabels, int defaultButtonIndex) {
+		return open(id, parent, title, titleImage, message, dialogType, buttonLabels, defaultButtonIndex, CHECKBOX_TEXT);
+	}
+
+	/**
+	 * Opens the dialog but only if the user hasn't chosen to hide it.
+	 *
+	 * @return the index of the pressed button or {@link SWT#DEFAULT} if the dialog got dismissed
+	 *         without pressing a button (e.g. via Esc) or {{@link #NOT_SHOWN} if the dialog was not
+	 *         shown
+	 */
+	public static int open(String id, Shell parent, String title, Image titleImage, String message, int dialogType, String[] buttonLabels, int defaultButtonIndex, String checkboxText) {
+		if (!isDialogEnabled(id))
+			return OptionalMessageDialog.NOT_SHOWN;
+
+		MessageDialog dialog= new OptionalMessageDialog(id, parent, title, titleImage, message, dialogType, buttonLabels, defaultButtonIndex, checkboxText);
+		return dialog.open();
+	}
+
+	protected OptionalMessageDialog(String id, Shell parent, String title, Image titleImage, String message, int dialogType, String[] buttonLabels, int defaultButtonIndex) {
+		this(id, parent, title, titleImage, message, dialogType, buttonLabels, defaultButtonIndex, CHECKBOX_TEXT);
+	}
+
+	protected OptionalMessageDialog(String id, Shell parent, String title, Image titleImage, String message, int dialogType, String[] buttonLabels, int defaultButtonIndex, String checkBoxText) {
+		super(parent, title, titleImage, message, dialogType, buttonLabels, defaultButtonIndex);
+		fId= id;
+		fCheckBoxText= checkBoxText;
+	}
+
+	protected Control createCustomArea(Composite parent) {
+		Composite composite= new Composite(parent, SWT.NONE);
+		GridLayout layout= new GridLayout();
+		layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+		layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+		layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		fHideDialogCheckBox= new Button(composite, SWT.CHECK | SWT.LEFT);
+		fHideDialogCheckBox.setText(fCheckBoxText);
+		fHideDialogCheckBox.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				setDialogEnabled(fId, !((Button)e.widget).getSelection());
+			}
+		});
+		applyDialogFont(fHideDialogCheckBox);
+		return fHideDialogCheckBox;
+	}
+
+	//--------------- Configuration handling --------------
+
+	/**
+	 * Returns this dialog
+	 *
+	 * @return the settings to be used
+	 */
+	private static IDialogSettings getDialogSettings() {
+		IDialogSettings settings= SSEUIPlugin.getDefault().getDialogSettings();
+		settings= settings.getSection(STORE_ID);
+		if (settings == null)
+			settings= SSEUIPlugin.getDefault().getDialogSettings().addNewSection(STORE_ID);
+		return settings;
+	}
+
+	/**
+	 * Answers whether the optional dialog is enabled and should be shown.
+	 */
+	public static boolean isDialogEnabled(String key) {
+		IDialogSettings settings= getDialogSettings();
+		return !settings.getBoolean(key);
+	}
+
+	/**
+	 * Sets whether the optional dialog is enabled and should be shown.
+	 */
+	public static void setDialogEnabled(String key, boolean isEnabled) {
+		IDialogSettings settings= getDialogSettings();
+		settings.put(key, !isEnabled);
+	}
+
+	/**
+	 * Clears all remembered information about hidden dialogs
+	 */
+	public static void clearAllRememberedStates() {
+		IDialogSettings settings= SSEUIPlugin.getDefault().getDialogSettings();
+		settings.addNewSection(STORE_ID);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/StructuredContentAssistant.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/StructuredContentAssistant.java
new file mode 100644
index 0000000..8d124ce
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/StructuredContentAssistant.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+
+/**
+ * <p>Content assistant that uses {@link CompoundContentAssistProcessor}s so that multiple
+ * processors can be registered for each partition type</p>
+ */
+public class StructuredContentAssistant extends ContentAssistant {
+	/** need to retain copy of all releasable processors so they can be released on uninstall */
+	private List fReleasableProcessors;
+	
+	/** 
+	 * <code>true</code> if a content assist processor has been added to this assistant,
+	 * <code>false</code> otherwise
+	 */
+	private boolean fIsInitalized;
+	
+	private boolean fProcessorsReleased = false;
+
+	/**
+	 * <p>Construct the assistant</p>
+	 */
+	public StructuredContentAssistant() {
+		this.fIsInitalized = false;
+		this.fReleasableProcessors = new ArrayList();
+	}
+	
+	/**
+	 * <p>Each set content assist processor is placed inside a
+	 * CompoundContentAssistProcessor which allows multiple processors per
+	 * partition type</p>
+	 * 
+	 * @param processor
+	 *            the content assist processor to register, or
+	 *            <code>null</code> to remove an existing one
+	 * @param contentType
+	 *            the content type under which to register
+	 *            
+	 * @see org.eclipse.jface.text.contentassist.ContentAssistant#setContentAssistProcessor(org.eclipse.jface.text.contentassist.IContentAssistProcessor, java.lang.String)
+	 */
+	public void setContentAssistProcessor(IContentAssistProcessor processor, String partitionType) {
+		this.fIsInitalized = true;
+		
+		CompoundContentAssistProcessor compoundProcessor = getExistingContentAssistProcessor(partitionType);
+		if(compoundProcessor == null) {
+			compoundProcessor = new CompoundContentAssistProcessor();
+			this.fReleasableProcessors.add(compoundProcessor);
+		}
+		
+		compoundProcessor.add(processor);
+		super.setContentAssistProcessor(compoundProcessor, partitionType);
+	}
+	
+	/**
+	 * Returns true if content assist has been initialized with some content
+	 * assist processors. False otherwise.
+	 * 
+	 * @return true if content assistant has been initialized
+	 */
+	public boolean isInitialized() {
+		return this.fIsInitalized;
+	}
+	
+	/**
+	 * 
+	 * @param partitionType
+	 * @return
+	 */
+	private CompoundContentAssistProcessor getExistingContentAssistProcessor(String partitionType) {
+		CompoundContentAssistProcessor compoundContentAssistProcessor = null;
+		IContentAssistProcessor processor = super.getContentAssistProcessor(partitionType);
+		if (processor != null) {
+			if (processor instanceof CompoundContentAssistProcessor) {
+				compoundContentAssistProcessor = (CompoundContentAssistProcessor) processor;
+			}
+		}
+		return compoundContentAssistProcessor;
+	}
+
+	public void install(ITextViewer textViewer) {
+		if (fProcessorsReleased) {
+			if (this.fReleasableProcessors != null && !this.fReleasableProcessors.isEmpty()) {
+				for(int i = 0; i < this.fReleasableProcessors.size(); ++i) {
+					((CompoundContentAssistProcessor)this.fReleasableProcessors.get(i)).install(textViewer);
+				}
+			}
+			fProcessorsReleased = false;
+		}
+		super.install(textViewer);
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.ContentAssistant#uninstall()
+	 */
+	public void uninstall() {
+		// dispose of all content assist processors
+		if (this.fReleasableProcessors != null && !this.fReleasableProcessors.isEmpty()) {
+			for(int i = 0; i < this.fReleasableProcessors.size(); ++i) {
+				((IReleasable)this.fReleasableProcessors.get(i)).release();
+			}
+		}
+		fProcessorsReleased = true;
+		super.uninstall();
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
new file mode 100644
index 0000000..ca87d75
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
@@ -0,0 +1,757 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentoutline;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.util.DelegatingDragAdapter;
+import org.eclipse.jface.util.DelegatingDropAdapter;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.util.TransferDragSourceListener;
+import org.eclipse.jface.util.TransferDropTargetListener;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.IShowInSource;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.part.IShowInTargetList;
+import org.eclipse.ui.part.ShowInContext;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration;
+
+
+public class ConfigurableContentOutlinePage extends ContentOutlinePage implements IAdaptable {
+	/*
+	 * Menu listener to create the additions group and add any menu items
+	 * contributed by the configuration; required since the context menu is
+	 * cleared every time it is shown
+	 */
+	class AdditionGroupAdder implements IMenuListener {
+		public void menuAboutToShow(IMenuManager manager) {
+			IContributionItem[] items = manager.getItems();
+			if (items.length > 0 && items[items.length - 1].getId() != null) {
+				manager.insertAfter(items[items.length - 1].getId(), new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+			}
+			else {
+				manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+			}
+
+			// add configuration's menu items
+			IMenuListener listener = getConfiguration().getMenuListener(getTreeViewer());
+			if (listener != null) {
+				listener.menuAboutToShow(manager);
+			}
+		}
+	}
+
+	/**
+	 * Provides double-click registration so it can be done before the Control
+	 * is created.
+	 */
+	class DoubleClickProvider implements IDoubleClickListener {
+		private IDoubleClickListener[] listeners = null;
+
+		void addDoubleClickListener(IDoubleClickListener newListener) {
+			if (listeners == null) {
+				listeners = new IDoubleClickListener[]{newListener};
+			}
+			else {
+				IDoubleClickListener[] newListeners = new IDoubleClickListener[listeners.length + 1];
+				System.arraycopy(listeners, 0, newListeners, 0, listeners.length);
+				newListeners[listeners.length] = newListener;
+				listeners = newListeners;
+			}
+		}
+
+		public void doubleClick(DoubleClickEvent event) {
+			fireDoubleClickEvent(event);
+		}
+
+		private void fireDoubleClickEvent(final DoubleClickEvent event) {
+			IDoubleClickListener[] firingListeners = listeners;
+			for (int i = 0; i < firingListeners.length; ++i) {
+				final IDoubleClickListener l = firingListeners[i];
+				SafeRunner.run(new SafeRunnable() {
+					public void run() {
+						l.doubleClick(event);
+					}
+				});
+			}
+		}
+
+		void removeDoubleClickListener(IDoubleClickListener oldListener) {
+			if (listeners != null) {
+				if (listeners.length == 1 && listeners[0].equals(oldListener)) {
+					listeners = null;
+				}
+				else {
+					List newListeners = new ArrayList(Arrays.asList(listeners));
+					newListeners.remove(oldListener);
+					listeners = (IDoubleClickListener[]) newListeners.toArray(new IDoubleClickListener[listeners.length - 1]);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Listens to post selection from the selection service, applying it to
+	 * the tree viewer.
+	 */
+	class PostSelectionServiceListener implements ISelectionListener {
+		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+			// from selection service
+			if (_DEBUG) {
+				_DEBUG_TIME = System.currentTimeMillis();
+			} /*
+			 * Bug 136310, unless this page is that part's
+			 * IContentOutlinePage, ignore the selection change
+			 */
+			if (part == null || part.getAdapter(IContentOutlinePage.class) == ConfigurableContentOutlinePage.this) {
+				ISelection validContentSelection = getConfiguration().getSelection(getTreeViewer(), selection);
+
+				boolean isLinked = getConfiguration().isLinkedWithEditor(getTreeViewer());
+				if (isLinked) {
+					if (!getTreeViewer().getSelection().equals(validContentSelection)) {
+						try {
+							fIsReceivingSelection = true;
+							getTreeViewer().setSelection(validContentSelection, true);
+						}
+						finally {
+							fIsReceivingSelection = false;
+						}
+					}
+				}
+			}
+			if (_DEBUG) {
+				System.out.println("(O:" + (System.currentTimeMillis() - _DEBUG_TIME) + "ms) " + part + " : " + selection); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+		}
+	}
+
+	/**
+	 * Forwards post-selection from the tree viewer to the listeners while
+	 * acting as this page's selection provider.
+	 */
+	private class SelectionProvider implements IPostSelectionProvider {
+		private class PostSelectionChangedListener implements ISelectionChangedListener {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if (!isFiringSelection() && !fIsReceivingSelection) {
+					fireSelectionChanged(event, postListeners);
+					updateStatusLine(getSite().getActionBars().getStatusLineManager(), event.getSelection());
+				}
+			}
+		}
+
+		private class SelectionChangedListener implements ISelectionChangedListener {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if (!isFiringSelection() && !fIsReceivingSelection) {
+					fireSelectionChanged(event, listeners);
+				}
+			}
+		}
+
+		private boolean isFiringSelection = false;
+		private ListenerList listeners = new ListenerList();
+		private ListenerList postListeners = new ListenerList();
+		private ISelectionChangedListener postSelectionChangedListener = new PostSelectionChangedListener();
+		private ISelectionChangedListener selectionChangedListener = new SelectionChangedListener();
+
+		public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
+			postListeners.add(listener);
+		}
+
+		public void addSelectionChangedListener(ISelectionChangedListener listener) {
+			listeners.add(listener);
+		}
+
+		public void fireSelectionChanged(final SelectionChangedEvent event, ListenerList listenerList) {
+			isFiringSelection = true;
+			Object[] listeners = listenerList.getListeners();
+			for (int i = 0; i < listeners.length; ++i) {
+				final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
+				SafeRunner.run(new SafeRunnable() {
+					public void run() {
+						l.selectionChanged(event);
+					}
+				});
+			}
+			isFiringSelection = false;
+		}
+
+		public ISelectionChangedListener getPostSelectionChangedListener() {
+			return postSelectionChangedListener;
+		}
+
+		public ISelection getSelection() {
+			if (getTreeViewer() != null) {
+				return getTreeViewer().getSelection();
+			}
+			return StructuredSelection.EMPTY;
+		}
+
+		public ISelectionChangedListener getSelectionChangedListener() {
+			return selectionChangedListener;
+		}
+
+		public boolean isFiringSelection() {
+			return isFiringSelection;
+		}
+
+		public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
+			postListeners.remove(listener);
+		}
+
+		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+			listeners.remove(listener);
+		}
+
+		public void setSelection(ISelection selection) {
+			if (!isFiringSelection) {
+				getTreeViewer().setSelection(selection);
+			}
+		}
+	}
+
+	private class ShowInTarget implements IShowInTarget {
+		/*
+		 * @see org.eclipse.ui.part.IShowInTarget#show(org.eclipse.ui.part.ShowInContext)
+		 */
+		public boolean show(ShowInContext context) {
+			setSelection(context.getSelection());
+			return getTreeViewer().getSelection().equals(context.getSelection());
+		}
+	}
+
+	protected static final ContentOutlineConfiguration NULL_CONFIGURATION = new ContentOutlineConfiguration() {
+		public IContentProvider getContentProvider(TreeViewer viewer) {
+			return new ITreeContentProvider() {
+				public void dispose() {
+				}
+
+				public Object[] getChildren(Object parentElement) {
+					return null;
+				}
+
+				public Object[] getElements(Object inputElement) {
+					return null;
+				}
+
+				public Object getParent(Object element) {
+					return null;
+				}
+
+				public boolean hasChildren(Object element) {
+					return false;
+				}
+
+				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+				}
+			};
+		}
+	};
+
+	private static final String OUTLINE_CONTEXT_MENU_ID = "org.eclipse.wst.sse.ui.StructuredTextEditor.OutlineContext"; //$NON-NLS-1$
+
+	private static final String OUTLINE_CONTEXT_MENU_SUFFIX = ".source.OutlineContext"; //$NON-NLS-1$
+	private static final boolean _DEBUG = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/contentOutline")); //$NON-NLS-1$  //$NON-NLS-2$;
+
+	private long _DEBUG_TIME = 0;
+
+	private TransferDragSourceListener[] fActiveDragListeners;
+	private TransferDropTargetListener[] fActiveDropListeners;
+	private ContentOutlineConfiguration fConfiguration;
+
+	private Menu fContextMenu;
+	private String fContextMenuId;
+
+	private MenuManager fContextMenuManager;
+	private DoubleClickProvider fDoubleClickProvider = null;
+
+	private DelegatingDragAdapter fDragAdapter;
+	private DragSource fDragSource;
+	private DelegatingDropAdapter fDropAdapter;
+	private DropTarget fDropTarget;
+	private IEditorPart fEditor;
+	private IMenuListener fGroupAdder = null;
+	private Object fInput = null;
+
+	private String fInputContentTypeIdentifier = null;
+	private ISelectionListener fSelectionListener = null;
+
+	SelectionProvider fSelectionProvider = null;
+
+	boolean fIsReceivingSelection;
+
+	/**
+	 * A ContentOutlinePage that abstract as much behavior as possible away
+	 * from the Controls and varies it by content type.
+	 */
+	public ConfigurableContentOutlinePage() {
+		super();
+		fGroupAdder = new AdditionGroupAdder();
+		fSelectionProvider = new SelectionProvider();
+	}
+
+	/**
+	 * Adds a listener to a list of those notified when someone double-clicks
+	 * in the page.
+	 * 
+	 * @param newListener - the listener to add
+	 */
+	public void addDoubleClickListener(IDoubleClickListener newListener) {
+		if (fDoubleClickProvider == null) {
+			fDoubleClickProvider = new DoubleClickProvider();
+		}
+		fDoubleClickProvider.addDoubleClickListener(newListener);
+	}
+
+	private String computeContextMenuID() {
+		String id = null;
+		if (fInputContentTypeIdentifier != null) {
+			id = fInputContentTypeIdentifier + OUTLINE_CONTEXT_MENU_SUFFIX;
+		}
+		return id;
+	}
+
+	/**
+	 * @see ContentOutlinePage#createControl
+	 */
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+		ColumnViewerToolTipSupport.enableFor(getTreeViewer());
+
+		IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
+		if (page != null) {
+			fEditor = page.getActiveEditor();
+		}
+
+		fDragAdapter = new DelegatingDragAdapter();
+		fDragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+		fDropAdapter = new DelegatingDropAdapter();
+		fDropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+
+		setConfiguration(getConfiguration());
+
+		/*
+		 * ContentOutlinePage only implements ISelectionProvider while the
+		 * tree viewer implements both ISelectionProvider and
+		 * IPostSelectionProvider. Use an ISelectionProvider that listens to
+		 * post selection from the tree viewer and forward only post selection
+		 * to the selection service.
+		 */
+		getTreeViewer().addPostSelectionChangedListener(fSelectionProvider.getPostSelectionChangedListener());
+		getTreeViewer().addSelectionChangedListener(fSelectionProvider.getSelectionChangedListener());
+		if (fDoubleClickProvider == null) {
+			fDoubleClickProvider = new DoubleClickProvider();
+		}
+		getTreeViewer().addDoubleClickListener(fDoubleClickProvider);
+		getSite().setSelectionProvider(fSelectionProvider);
+	}
+
+	public void dispose() {
+		getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(getSelectionServiceListener());
+		if (fDoubleClickProvider != null) {
+			getTreeViewer().removeDoubleClickListener(fDoubleClickProvider);
+		}
+
+		// dispose menu controls
+		if (fContextMenu != null) {
+			fContextMenu.dispose();
+		}
+		if (fContextMenuManager != null) {
+			fContextMenuManager.removeMenuListener(fGroupAdder);
+			fContextMenuManager.removeAll();
+			fContextMenuManager.dispose();
+		}
+
+		fDropTarget.dispose();
+		fDragSource.dispose();
+
+		IStatusLineManager statusLineManager = getSite().getActionBars().getStatusLineManager();
+		if (statusLineManager != null) {
+			statusLineManager.setMessage(null);
+		}
+		setConfiguration(NULL_CONFIGURATION);
+		super.dispose();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class key) {
+		Object adapter = null;
+		if (key.equals(IShowInTarget.class)) {
+			adapter = new ShowInTarget();
+		}
+		final IEditorPart editor = fEditor;
+
+		if (key.equals(IShowInSource.class) && editor != null) {
+			adapter = new IShowInSource() {
+				public ShowInContext getShowInContext() {
+					return new ShowInContext(editor.getEditorInput(), editor.getEditorSite().getSelectionProvider().getSelection());
+				}
+			};
+		}
+		else if (key.equals(IShowInTargetList.class) && editor != null) {
+			adapter = editor.getAdapter(key);
+		}
+		return adapter;
+	}
+
+	/**
+	 * @return the currently used ContentOutlineConfiguration
+	 */
+	public ContentOutlineConfiguration getConfiguration() {
+		if (fConfiguration == null) {
+			fConfiguration = NULL_CONFIGURATION;
+		}
+		return fConfiguration;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+	 */
+	public ISelection getSelection() {
+		return fSelectionProvider.getSelection();
+	}
+
+	ISelectionListener getSelectionServiceListener() {
+		if (fSelectionListener == null) {
+			fSelectionListener = new PostSelectionServiceListener();
+		}
+		return fSelectionListener;
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.part.IPageBookViewPage#init(org.eclipse.ui.part.IPageSite
+	 * )
+	 */
+	public void init(IPageSite pageSite) {
+		super.init(pageSite);
+		pageSite.getWorkbenchWindow().getSelectionService().addPostSelectionListener(getSelectionServiceListener());
+	}
+
+	/**
+	 * Removes a listener to a list of those notified when someone
+	 * double-clicks in the page.
+	 * 
+	 * @param oldListener - the listener to remove
+	 */
+	public void removeDoubleClickListener(IDoubleClickListener oldListener) {
+		if (fDoubleClickProvider != null) {
+			fDoubleClickProvider.removeDoubleClickListener(oldListener);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		if (!fIsReceivingSelection)
+			super.selectionChanged(event);
+	}
+
+	/**
+	 * Configures (or reconfigures) the page according to the given
+	 * configuration.
+	 * 
+	 * @param configuration
+	 */
+	public void setConfiguration(ContentOutlineConfiguration configuration) {
+		// intentionally do not check to see if the new configuration != old
+		// configuration
+		if (getTreeViewer() != null) {
+			// remove the key listeners
+			if (getControl() != null && !getControl().isDisposed()) {
+				KeyListener[] listeners = getConfiguration().getKeyListeners(getTreeViewer());
+				if (listeners != null) {
+					for (int i = 0; i < listeners.length; i++) {
+						getControl().removeKeyListener(listeners[i]);
+					}
+				}
+			}
+
+			IContributionManager toolbar = getSite().getActionBars().getToolBarManager();
+			if (toolbar != null) {
+				IContributionItem[] toolbarItems = getConfiguration().getToolbarContributions(getTreeViewer());
+				if (toolbarItems != null && toolbarItems.length > 0) {
+					for (int i = 0; i < toolbarItems.length; i++) {
+						toolbar.remove(toolbarItems[i]);
+					}
+					toolbar.update(false);
+				}
+			}
+
+			IContributionManager menubar = getSite().getActionBars().getMenuManager();
+			if (menubar != null) {
+				IContributionItem[] menuItems = getConfiguration().getMenuContributions(getTreeViewer());
+				if (menuItems != null && menuItems.length > 0) {
+					for (int i = 0; i < menuItems.length; i++) {
+						menubar.remove(menuItems[i]);
+					}
+					menubar.remove(IWorkbenchActionConstants.MB_ADDITIONS);
+					menubar.update(false);
+				}
+			}
+			// clear the DnD listeners and transfer types
+			if (fDragAdapter != null && !fDragAdapter.isEmpty() && fDragSource != null && !fDragSource.isDisposed() && fDragSource.getTransfer().length > 0) {
+				if (fActiveDragListeners != null) {
+					for (int i = 0; i < fActiveDragListeners.length; i++) {
+						fDragAdapter.removeDragSourceListener(fActiveDragListeners[i]);
+					}
+				}
+				fActiveDragListeners = null;
+				fDragSource.removeDragListener(fDragAdapter);
+				fDragSource.setTransfer(new Transfer[0]);
+			}
+			if (fDropAdapter != null && !fDropAdapter.isEmpty() && fDropTarget != null && !fDropTarget.isDisposed() && fDropTarget.getTransfer().length > 0) {
+				if (fActiveDropListeners != null) {
+					for (int i = 0; i < fActiveDropListeners.length; i++) {
+						fDropAdapter.removeDropTargetListener(fActiveDropListeners[i]);
+					}
+				}
+				fActiveDropListeners = null;
+				fDropTarget.removeDropListener(fDropAdapter);
+				fDropTarget.setTransfer(new Transfer[0]);
+			}
+			getConfiguration().getContentProvider(getTreeViewer()).inputChanged(getTreeViewer(), fInput, null);
+			// release any ties to this tree viewer
+			getConfiguration().unconfigure(getTreeViewer());
+		}
+
+		fConfiguration = configuration;
+
+		if (getTreeViewer() != null && getControl() != null && !getControl().isDisposed()) {
+			// (re)set the providers
+			getTreeViewer().setLabelProvider(getConfiguration().getLabelProvider(getTreeViewer()));
+			getTreeViewer().setContentProvider(getConfiguration().getContentProvider(getTreeViewer()));
+
+			// view toolbar
+			IContributionManager toolbar = getSite().getActionBars().getToolBarManager();
+			if (toolbar != null) {
+				IContributionItem[] toolbarItems = getConfiguration().getToolbarContributions(getTreeViewer());
+				if (toolbarItems != null) {
+					for (int i = 0; i < toolbarItems.length; i++) {
+						toolbar.add(toolbarItems[i]);
+					}
+					toolbar.update(true);
+				}
+			}
+			// view menu
+			IContributionManager menu = getSite().getActionBars().getMenuManager();
+			if (menu != null) {
+				IContributionItem[] menuItems = getConfiguration().getMenuContributions(getTreeViewer());
+				if (menuItems != null) {
+					for (int i = 0; i < menuItems.length; i++) {
+						menuItems[i].setVisible(true);
+						menu.add(menuItems[i]);
+						menuItems[i].update();
+					}
+					menu.update(true);
+				}
+			}
+			// add the allowed DnD listeners and types
+			TransferDragSourceListener[] dragListeners = getConfiguration().getTransferDragSourceListeners(getTreeViewer());
+			if (fDragAdapter != null && dragListeners.length > 0) {
+				for (int i = 0; i < dragListeners.length; i++) {
+					fDragAdapter.addDragSourceListener(dragListeners[i]);
+				}
+				fActiveDragListeners = dragListeners;
+				fDragSource.addDragListener(fDragAdapter);
+				fDragSource.setTransfer(fDragAdapter.getTransfers());
+			}
+			TransferDropTargetListener[] dropListeners = getConfiguration().getTransferDropTargetListeners(getTreeViewer());
+			if (fDropAdapter != null && dropListeners.length > 0) {
+				for (int i = 0; i < dropListeners.length; i++) {
+					fDropAdapter.addDropTargetListener(dropListeners[i]);
+				}
+				fActiveDropListeners = dropListeners;
+				fDropTarget.addDropListener(fDropAdapter);
+				fDropTarget.setTransfer(fDropAdapter.getTransfers());
+			}
+			// add the key listeners
+			KeyListener[] listeners = getConfiguration().getKeyListeners(getTreeViewer());
+			if (listeners != null) {
+				for (int i = 0; i < listeners.length; i++) {
+					getControl().addKeyListener(listeners[i]);
+				}
+			}
+		}
+
+		if (fInput != null) {
+			setInput(fInput);
+		}
+	}
+
+	/**
+	 * @param editor
+	 *            The IEditorPart that "owns" this page. Used to support the
+	 *            "Show In..." menu.
+	 */
+	public void setEditorPart(IEditorPart editor) {
+		fEditor = editor;
+	}
+
+	/**
+	 * @param newInput
+	 *            The input for the page's viewer. Should only be set after a
+	 *            configuration has been applied.
+	 */
+	public void setInput(Object newInput) {
+		fInput = newInput;
+		/*
+		 * Intentionally not optimized for checking new input vs. old input so
+		 * that any existing content providers can be updated
+		 */
+		if (getControl() != null && !getControl().isDisposed()) {
+			getTreeViewer().setInput(fInput);
+			updateContextMenuId();
+		}
+	}
+
+	/**
+	 * @param id - the content type identifier to use for further extension
+	 */
+	public void setInputContentTypeIdentifier(String id) {
+		fInputContentTypeIdentifier = id;
+	}
+
+	/**
+	 * Updates the outline page's context menu for the current input
+	 */
+	private void updateContextMenuId() {
+		String computedContextMenuId = null;
+		// update outline view's context menu control and ID
+
+		if (fEditor == null) {
+			IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
+			if (page != null) {
+				fEditor = page.getActiveEditor();
+			}
+		}
+
+		computedContextMenuId = computeContextMenuID();
+
+		if (computedContextMenuId == null) {
+			computedContextMenuId = OUTLINE_CONTEXT_MENU_ID;
+		}
+
+		/*
+		 * Update outline context menu id if updating to a new id or if
+		 * context menu is not already set up
+		 */
+		if (!computedContextMenuId.equals(fContextMenuId) || (fContextMenu == null)) {
+			fContextMenuId = computedContextMenuId;
+
+			if (getControl() != null && !getControl().isDisposed()) {
+				// dispose of previous context menu
+				if (fContextMenu != null) {
+					fContextMenu.dispose();
+				}
+				if (fContextMenuManager != null) {
+					fContextMenuManager.removeMenuListener(fGroupAdder);
+					fContextMenuManager.removeAll();
+					fContextMenuManager.dispose();
+				}
+
+				fContextMenuManager = new MenuManager(fContextMenuId, fContextMenuId);
+				fContextMenuManager.setRemoveAllWhenShown(true);
+
+				fContextMenuManager.addMenuListener(fGroupAdder);
+
+				fContextMenu = fContextMenuManager.createContextMenu(getControl());
+				getControl().setMenu(fContextMenu);
+
+				getSite().registerContextMenu(fContextMenuId, fContextMenuManager, this);
+
+				/*
+				 * also register this menu for source page part and structured
+				 * text outline view ids
+				 */
+				if (fEditor != null) {
+					String partId = fEditor.getSite().getId();
+					if (partId != null) {
+						getSite().registerContextMenu(partId + OUTLINE_CONTEXT_MENU_SUFFIX, fContextMenuManager, this);
+					}
+				}
+				getSite().registerContextMenu(OUTLINE_CONTEXT_MENU_ID, fContextMenuManager, this);
+			}
+		}
+	}
+
+	void updateStatusLine(IStatusLineManager mgr, ISelection selection) {
+		String text = null;
+		Image image = null;
+		ILabelProvider statusLineLabelProvider = getConfiguration().getStatusLineLabelProvider(getTreeViewer());
+		if (statusLineLabelProvider != null && selection instanceof IStructuredSelection && !selection.isEmpty()) {
+			Object firstElement = ((IStructuredSelection) selection).getFirstElement();
+			text = statusLineLabelProvider.getText(firstElement);
+			image = statusLineLabelProvider.getImage(firstElement);
+		}
+		if (image == null) {
+			mgr.setMessage(text);
+		}
+		else {
+			mgr.setMessage(image, text);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/IJFaceNodeAdapter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/IJFaceNodeAdapter.java
new file mode 100644
index 0000000..4789341
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/IJFaceNodeAdapter.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentoutline;
+
+
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+
+
+/**
+ * Adapter interface to provide JFace-style children and property information.
+ * The factory returning this adapter is expected to implement
+ * IJFaceNodeAdapterFactory
+ * 
+ */
+public interface IJFaceNodeAdapter extends INodeAdapter {
+
+    /**
+     * Returns the child elements of the given parent element.
+     * The result is not modified by the viewer.
+     *
+     * @param node the parent object
+     * @return an array of child elements
+     */
+	public Object[] getChildren(Object node);
+
+	/**
+	 * Returns an enumeration with the elements belonging to the passed
+	 * element. These are the top level items in a list, tree, table, etc...
+	 */
+	public Object[] getElements(Object node);
+
+	/**
+	 * Fetches the label image specific to this object instance.
+	 */
+	public Image getLabelImage(Object node);
+
+	/**
+	 * Fetches the label text specific to this object instance.
+	 */
+	public String getLabelText(Object node);
+
+	public Object getParent(Object node);
+
+	public boolean hasChildren(Object node);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/IJFaceNodeAdapterFactory.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/IJFaceNodeAdapterFactory.java
new file mode 100644
index 0000000..cf7a53e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/IJFaceNodeAdapterFactory.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentoutline;
+
+import java.util.Collection;
+
+public interface IJFaceNodeAdapterFactory {
+	public void addListener(Object listener);
+
+	/**
+	 * returns "copy" so no one can modify our list. Its is a shallow copy.
+	 */
+	public Collection getListeners();
+
+	public void removeListener(Object listener);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/PropertyChangeUpdateAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/PropertyChangeUpdateAction.java
new file mode 100644
index 0000000..fef880b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/PropertyChangeUpdateAction.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentoutline;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.texteditor.IUpdate;
+
+/**
+ * An IAction.AS_CHECK_BOX action that sets and gets its checked state along
+ * with a value from a preference store. Should be used with
+ * PropertyChangeUpdateActionContributionItem to listen to changes in the
+ * store and update the checked state from PropertyChangeEvents.
+ */
+public class PropertyChangeUpdateAction extends Action implements IUpdate {
+	private String fPreferenceKey;
+	private IPreferenceStore fStore;
+	private boolean fUpdateFromPropertyChange = true;
+
+	public PropertyChangeUpdateAction(String text, IPreferenceStore store, String preferenceKey, boolean defaultValue) {
+		super(text, IAction.AS_CHECK_BOX);
+		fPreferenceKey = preferenceKey;
+		fStore = store;
+		fStore.setDefault(getPreferenceKey(), defaultValue);
+		setId(getPreferenceKey());
+		setChecked(getPreferenceStore().getBoolean(getPreferenceKey()));
+	}
+
+	/**
+	 * @return Returns the orderPreferenceKey.
+	 */
+	public String getPreferenceKey() {
+		return fPreferenceKey;
+	}
+
+	/**
+	 * @return Returns the store.
+	 */
+	public IPreferenceStore getPreferenceStore() {
+		return fStore;
+	}
+
+	/**
+	 * @return Returns the updateFromPropertyChange.
+	 */
+	public boolean isUpdateFromPropertyChange() {
+		return fUpdateFromPropertyChange;
+	}
+
+	public final void run() {
+		super.run();
+		fStore.setValue(getPreferenceKey(), isChecked());
+		if (!isUpdateFromPropertyChange())
+			update();
+	}
+
+	/**
+	 * @param updateFromPropertyChange
+	 *            The updateFromPropertyChange to set.
+	 */
+	public void setUpdateFromPropertyChange(boolean updateFromPropertyChange) {
+		fUpdateFromPropertyChange = updateFromPropertyChange;
+	}
+
+	public void update() {
+		setChecked(fStore.getBoolean(getPreferenceKey()));
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/PropertyChangeUpdateActionContributionItem.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/PropertyChangeUpdateActionContributionItem.java
new file mode 100644
index 0000000..67d0aec
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/PropertyChangeUpdateActionContributionItem.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentoutline;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.ui.texteditor.IUpdate;
+
+/**
+ * A listener on the given action's PreferenceStore. It calls .update() on the
+ * action when the given key changes value.
+ */
+public class PropertyChangeUpdateActionContributionItem extends ActionContributionItem {
+
+	private class PreferenceUpdateListener implements IPropertyChangeListener {
+		public void propertyChange(PropertyChangeEvent event) {
+			if (event.getProperty().equals(fProperty)) {
+				if (debug) {
+					System.out.println(fProperty + " preference changed, updating " + getAction()); //$NON-NLS-1$
+				}
+				((IUpdate) getAction()).update();
+			}
+		}
+	}
+
+	static final boolean debug = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/propertyChangeUpdateActionContributionItem")); //$NON-NLS-1$  //$NON-NLS-2$;
+
+	private IPropertyChangeListener fListener = null;
+
+	protected String fProperty = null;
+	private IPreferenceStore fStore;
+
+	public PropertyChangeUpdateActionContributionItem(PropertyChangeUpdateAction action) {
+		super(action);
+		fProperty = action.getPreferenceKey();
+		fStore = action.getPreferenceStore();
+		fListener = new PreferenceUpdateListener();
+		connect();
+	}
+
+	public void connect() {
+		if (debug) {
+			System.out.println("PropertyChangeUpdateActionContributionItem started listening for " + fProperty); //$NON-NLS-1$
+		}
+		if (fStore != null) {
+			fStore.addPropertyChangeListener(fListener);
+		}
+	}
+
+	public void disconnect() {
+		if (debug) {
+			System.out.println("PropertyChangeUpdateActionContributionItem stopped listening for " + fProperty); //$NON-NLS-1$
+		}
+		if (fStore != null) {
+			fStore.removePropertyChangeListener(fListener);
+		}
+	}
+
+	public void dispose() {
+		super.dispose();
+		disconnect();
+		fProperty = null;
+		fStore = null;
+	}
+
+	public String toString() {
+		if (getAction().getId() != null)
+			return super.toString();
+		else
+			return getClass().getName() + "(text=" + getAction().getText() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ComboList.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ComboList.java
new file mode 100644
index 0000000..8b8eb59
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ComboList.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentproperties.ui;
+
+
+
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+/**
+ * @deprecated People should manage their own combo/list
+ */
+public class ComboList {
+	private Combo combo;
+
+
+	private List list;
+
+	public ComboList(Composite parent, int style) {
+		combo = new Combo(parent, style);
+		list = new ArrayList();
+	}
+
+
+	/*
+	 * following methods is original method of Combo class.
+	 */
+	public void add(String key) {
+		checkError();
+		combo.add(key);
+		list.add(key);
+	}
+
+	public void add(String key, int index) {
+		checkError();
+		combo.add(key, index);
+		list.add(index, key);
+	}
+
+	public void add(String key, String value) {
+		checkError();
+		combo.add(key);
+		list.add(value);
+	}
+
+	public void add(String key, String value, int index) {
+		checkError();
+		combo.add(key, index);
+		list.add(index, value);
+	}
+
+	public void addFocusListener(FocusListener listener) {
+		combo.addFocusListener(listener);
+	}
+
+	public void addModifyListener(org.eclipse.swt.events.ModifyListener listener) {
+		combo.addModifyListener(listener);
+	}
+
+	public void addSelectionListener(org.eclipse.swt.events.SelectionListener listener) {
+		combo.addSelectionListener(listener);
+
+	}
+
+	private void checkError() {
+		if (!isConsistency()) {
+			Logger.log(Logger.WARNING, "Difference between the number of keys[" + combo.getItemCount() + "] and the number of values[" + list.size() + "] in ComboList"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+	}
+
+	public org.eclipse.swt.graphics.Point computeSize(int wHint, int hHint) {
+		return combo.computeSize(wHint, hHint);
+	}
+
+	public Map createHashtable() {
+		checkError();
+		Map m = new Hashtable();
+		for (int i = 0; i < list.size(); i++)
+			m.put(combo.getItem(i), list.get(i));
+		return m;
+	}
+
+	public void deselect(int i) {
+		combo.deselect(i);
+	}
+
+	public void deselectAll() {
+		combo.deselectAll();
+	}
+
+	public boolean equals(Object obj) {
+		return combo.equals(obj);
+	}
+
+	private void exchangePosition(int i, int j) {
+		String tmpKey = getItem(i);
+		Object tmpValue = list.remove(i);
+
+		combo.setItem(i, getItem(j));
+		list.add(i, list.remove(j - 1));
+
+		combo.setItem(j, tmpKey);
+		list.add(j, tmpValue);
+	}
+
+	public boolean existsAsKey(String str) {
+		if (combo.indexOf(str) >= 0)
+			return true;
+		else
+			return false;
+	}
+
+	public boolean existsAsValue(String str) {
+		if (list.indexOf(str) >= 0)
+			return true;
+		else
+			return false;
+	}
+
+	public boolean getEnabled() {
+		return combo.getEnabled();
+	}
+
+	public String getItem(int index) {
+		return combo.getItem(index);
+	}
+
+	public int getItemCount() {
+		return combo.getItemCount();
+	}
+
+	public String getKey(String value) {
+		if (value == null)
+			return null;
+		int index = -1;
+		checkError();
+		for (int i = 0; i < list.size(); i++) {
+			if (!list.get(i).equals(value))
+				continue;
+			index = i;
+			break;
+		}
+		if (index != -1)
+			return combo.getItem(index);
+		else
+			return null;
+	}
+
+	public Object getLayoutData() {
+		return combo.getLayoutData();
+	}
+
+	public String getSelectedValue() {
+		checkError();
+		int index = getSelectionIndex();
+		if (index < 0)
+			return null;
+		return getValue(getItem(index));
+	}
+
+	public int getSelectionIndex() {
+		return combo.getSelectionIndex();
+	}
+
+	public String getText() {
+		return combo.getText();
+	}
+
+	public String getValue(String key) {
+		if (key == null)
+			return null;
+		int index = -1;
+		checkError();
+		for (int i = 0; i < combo.getItemCount(); i++) {
+			if (!combo.getItem(i).equals(key))
+				continue;
+			index = i;
+			break;
+		}
+		if (index != -1)
+			return (String) list.get(index);
+		else
+			return null;
+	}
+
+	public int indexOf(String str) {
+		return combo.indexOf(str);
+	}
+
+
+	public boolean isConsistency() {
+
+		if (list.size() == combo.getItemCount())
+			return true;
+		else
+			return false;
+	}
+
+
+	public void remove(int index) {
+		checkError();
+		combo.remove(index);
+		list.remove(index);
+	}
+
+	public void remove(String str) {
+		checkError();
+		combo.remove(str);
+		list.remove(str);
+	}
+
+	public void select(int index) {
+		combo.select(index);
+	}
+
+	public void setEnabled(boolean enabled) {
+		combo.setEnabled(enabled);
+	}
+
+	public boolean setFocus() {
+		return combo.setFocus();
+	}
+
+	public void setItem(int index, String str) {
+		checkError();
+		combo.setItem(index, str);
+		list.remove(index);
+		list.add(index, str);
+	}
+
+	public void setItem(String[] strArray) {
+		checkError();
+		combo.setItems(strArray);
+		for (int i = 0; i < strArray.length; i++)
+			list.add(strArray[i]);
+	}
+
+	public void setLayout(org.eclipse.swt.widgets.Layout lo) {
+		combo.setLayout(lo);
+	}
+
+	public void setLayoutData(Object layoutData) {
+		combo.setLayoutData(layoutData);
+	}
+
+	public void setSelection(Point point) {
+		combo.setSelection(point);
+	}
+
+	public void setText(String str) {
+		combo.setText(str);
+	}
+
+	public void sortByKey(int offset) {
+		if (offset < 0 || offset > this.combo.getItemCount() - 1)
+			return;
+		checkError();
+		//
+		for (int i = offset; i < combo.getItemCount() - 1; i++) {
+			for (int j = i + 1; j < combo.getItemCount(); j++) {
+				if (getItem(i).compareTo(getItem(j)) > 0) {
+					exchangePosition(i, j);
+				}
+			}
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ComboListOnPropertyPage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ComboListOnPropertyPage.java
new file mode 100644
index 0000000..f46c517
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ComboListOnPropertyPage.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentproperties.ui;
+
+
+
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @deprecated People should manage their own combo/list
+ */
+public final class ComboListOnPropertyPage extends ComboList {
+
+
+	private String currentApplyValue;
+
+	public ComboListOnPropertyPage(Composite parent, int style) {
+		super(parent, style);
+	}
+
+	public final String getApplyValue() {
+		return currentApplyValue;
+	}
+
+	public final void setApplyValue(String currentApplyValue) {
+		this.currentApplyValue = currentApplyValue;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ContentSettingsPropertyPage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ContentSettingsPropertyPage.java
new file mode 100644
index 0000000..f937860
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentproperties/ui/ContentSettingsPropertyPage.java
@@ -0,0 +1,297 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.contentproperties.ui;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.internal.contentproperties.ContentSettings;
+import org.eclipse.wst.sse.internal.contentproperties.ContentSettingsCreator;
+import org.eclipse.wst.sse.internal.contentproperties.IContentSettings;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * @deprecated Please use
+ *             org.eclipse.wst.html.ui.internal.contentproperties.ui.WebContentSettingsPropertyPage
+ *             or
+ *             eclipse.wst.css.ui.internal.contentproperties.ui.CSSWebContentSettingsPropertyPage
+ *             instead
+ */
+public abstract class ContentSettingsPropertyPage extends PropertyPage {
+	private static final IStatus STATUS_ERROR = new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.INFO, "ERROR", null); //$NON-NLS-1$
+
+	// for validateEdit()
+	private static final IStatus STATUS_OK = new Status(IStatus.OK, SSEUIPlugin.ID, IStatus.OK, "OK", null); //$NON-NLS-1$
+
+	/**
+	 * Method validateEdit.
+	 * 
+	 * @param file
+	 *            org.eclipse.core.resources.IFile
+	 * @param context
+	 *            org.eclipse.swt.widgets.Shell
+	 * @return IStatus
+	 */
+	private static IStatus validateEdit(IFile file, Shell context) {
+		if (file == null || !file.exists())
+			return STATUS_ERROR;
+		if (!(file.isReadOnly()))
+			return STATUS_OK;
+
+		IPath location = file.getLocation();
+
+		final long beforeModifiedFromJavaIO = (location != null) ? location.toFile().lastModified() : IResource.NULL_STAMP;
+		final long beforeModifiedFromIFile = file.getModificationStamp();
+
+		IStatus status = ResourcesPlugin.getWorkspace().validateEdit(new IFile[]{file}, context);
+		if (!status.isOK())
+			return status;
+
+		final long afterModifiedFromJavaIO = (location != null) ? location.toFile().lastModified() : IResource.NULL_STAMP;
+		final long afterModifiedFromIFile = file.getModificationStamp();
+
+		if (beforeModifiedFromJavaIO != afterModifiedFromJavaIO || beforeModifiedFromIFile != afterModifiedFromIFile) {
+			IModelManager manager = StructuredModelManager.getModelManager();
+			IStructuredModel model = manager.getExistingModelForRead(file);
+			if (model != null) {
+				if (!model.isDirty()) {
+					try {
+						file.refreshLocal(IResource.DEPTH_ONE, null);
+					}
+					catch (CoreException e) {
+						return STATUS_ERROR;
+					}
+					finally {
+						model.releaseFromRead();
+					}
+				}
+				else {
+					model.releaseFromRead();
+				}
+			}
+		}
+
+		if ((beforeModifiedFromJavaIO != afterModifiedFromJavaIO) || (beforeModifiedFromIFile != afterModifiedFromIFile)) {
+			// the file is replaced. Modification cannot be
+			// applied.
+			return STATUS_ERROR;
+		}
+		return STATUS_OK;
+	}
+
+	protected ComboListOnPropertyPage[] combo;
+	protected Composite composite;
+
+	protected IContentSettings contentSettings;
+	protected final String CSS_LABEL = SSEUIMessages.UI_CSS_profile___2; //$NON-NLS-1$
+	protected final String DEVICE_LABEL = SSEUIMessages.UI_Target_Device___3; //$NON-NLS-1$
+
+	protected final String DOCUMENT_LABEL = SSEUIMessages.UI_Default_HTML_DOCTYPE_ID___1; //$NON-NLS-1$
+	protected int numberOfCombo;
+	protected int numCols = 1;
+	protected int numRows = 1;
+	protected Composite propertyPage;
+
+	public ContentSettingsPropertyPage() {
+		super();
+	}
+
+	private void cleanUp() {
+		// Are There any way to guarantee to call cleanUp() to re-load
+		// downloaded .contentsettings file
+		// after ContentSettings.releaseCache() in ContentSettingSelfHandler
+		// class, which is called by resourceChangeEvent
+	}
+
+
+	protected ComboListOnPropertyPage createComboBoxOf(String title) {
+
+		Label label = new Label(propertyPage, SWT.LEFT);
+		label.setText(title);
+		if (title != null && title.startsWith(SSEUIMessages.UI_Default_HTML_DOCTYPE_ID___1)) { //$NON-NLS-1$
+			GridData data = new GridData();
+			data.horizontalIndent = 10;
+			label.setLayoutData(data);
+		}
+		ComboListOnPropertyPage combo = new ComboListOnPropertyPage(propertyPage, SWT.READ_ONLY);
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.FILL;
+		// data.horizontalAlignment= GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		combo.setLayoutData(data);
+		return combo;
+	}
+
+
+
+	protected Composite createComposite(Composite parent, int numColumns, int numRows) {
+		Composite composite = new Composite(parent, SWT.NONE);
+
+		// GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+
+		// GridData
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		// data.horizontalSpan=numColumns;
+		// data.verticalSpan=numRows;
+
+		composite.setLayoutData(data);
+		return composite;
+	}
+
+
+	protected Control createContents(Composite parent) {
+
+		contentSettings = ContentSettingsCreator.create();
+
+		propertyPage = createComposite(parent, numCols, numRows);
+
+		createSettingsPageGUI();
+
+		return propertyPage;
+
+
+	}
+
+	protected abstract void createSettingsPageGUI();
+
+	// protected abstract void applySelectedPropertyValue(String str,int
+	// index);
+	protected abstract void deleteNoneProperty(int index);
+
+
+
+	protected boolean isInitValueChanged(String before, String after) {
+		if (before == null && after == null)
+			return false;
+		if (before != null && before.equals(after))
+			return false;
+		return true;
+	}
+
+
+
+	protected void performDefaults() {
+		super.performDefaults();
+		// selected(applied) item is restored.
+		for (int i = 0; i < numberOfCombo; i++) {
+			// String appliedValue = combo[i].getApplyValue();
+			// setSelectionItem(combo[i],appliedValue);
+			combo[i].select(0); // select none.
+
+		}
+
+	}
+
+	public boolean performOk() {
+		Map properties = new Hashtable();
+		if (validateState() == false) {
+			cleanUp();
+			return true;
+		}
+		for (int i = 0; i < numberOfCombo; i++) {
+			// get selected item in Combo box.
+			String str = combo[i].getSelectedValue();
+			if (str == null)
+				continue;
+			// if no change, skip setProperty
+			if (!isInitValueChanged(combo[i].getApplyValue(), str))
+				continue;
+			// if NONE is selected, delete attr instance (and write
+			// .contentsettings.)
+			if (str != null && str.length() == 0)
+				deleteNoneProperty(i);
+			else
+				putSelectedPropertyInto(properties, str, i);
+			// applySelectedPropertyValue(str,i);
+
+			// set apply value in ComboListOnPropertyPage.
+			combo[i].setApplyValue(str);
+		}
+		if (properties != null && !properties.isEmpty())
+			contentSettings.setProperties((IResource) super.getElement(), properties);
+		if (properties != null)
+			properties.clear();
+		properties = null;
+		if (!contentSettings.existsProperties((IResource) super.getElement()))
+			contentSettings.deleteAllProperties((IResource) super.getElement());
+		return true;
+	}
+
+	protected abstract void putSelectedPropertyInto(Map properties, String str, int i);
+
+
+	protected void setSelectionItem(ComboListOnPropertyPage combo, String value) {
+		if (combo.getItemCount() <= 0)
+			return;
+		combo.setApplyValue(value);
+		String item = combo.getKey(value);
+		if (item != null)
+			combo.select(combo.indexOf(item));
+		else
+			combo.select(0);
+
+	}
+
+	/*
+	 * Validate Edit. Similar function will be in HTMLCommand.java
+	 * ContentSettingsPropertyPage.java CSSActionManager.java
+	 * DesignRedoAction.java DesignUndoAction.java
+	 * HTMLConversionProcessor.java
+	 */
+	private boolean validateState() {
+
+		// get IFile of .contentsettings
+		final String name = ContentSettings.getContentSettingsName();
+		final IResource resource = (IResource) super.getElement();
+		final IProject project = resource.getProject();
+		IFile file = project.getFile(name);
+
+		if (file != null && !file.exists())
+			return true; // Is this really OK?
+		// If false should be returned,
+		// This statemant can be removed,
+		// since ModelManagerUtil.validateEdit()
+		// returns error to this case.
+
+		Shell shell = getControl().getShell();
+		IStatus status = validateEdit(file, shell);
+		return status.isOK() ? true : false;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/AnnotationQuery.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/AnnotationQuery.java
new file mode 100644
index 0000000..b8d1936
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/AnnotationQuery.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import java.util.Map;
+
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+
+/*
+ * Copied from org.eclipse.ui.internal.ide.registry.MarkerQuery
+ */
+class AnnotationQuery {
+	/**
+	 * The annotation type targetted by this query. May be <code>null</code>.
+	 */
+	private String type;
+
+	/**
+	 * A sorted list of the attributes targetted by this query. The list is
+	 * sorted from least to greatest according to <code>Sting.compare</code>
+	 */
+	private String[] attributes;
+
+	/**
+	 * Cached hash code value
+	 */
+	private int hashCode;
+
+	/**
+	 * Creates a new annotation query with the given type and attributes.
+	 * <p>
+	 * The type may be <code>null</code>. The attributes may be empty, but
+	 * not <code>null</code>.
+	 * </p>
+	 * 
+	 * @param problemType
+	 *            the targeted annotation type
+	 * @param markerAttributes
+	 *            the targeted annotation attributes
+	 */
+	public AnnotationQuery(String annotationType, String[] annotationAttributes) {
+		if (annotationAttributes == null) {
+			throw new IllegalArgumentException();
+		}
+
+		type = annotationType;
+		attributes = annotationAttributes;
+		computeHashCode();
+	}
+
+	/**
+	 * Performs a query against the given annotation.
+	 * <p>
+	 * Returns a <code>AnnotationQueryResult</code> if the marker is
+	 * appropriate for this query (correct type and has all of the query
+	 * attributes), otherwise <code>null</code> is returned.
+	 * 
+	 * @param annotation
+	 *            the annotation to perform the query against
+	 * @return a annotation query result or <code>null</code>
+	 */
+	public AnnotationQueryResult performQuery(Annotation anno) {
+		if (!(anno instanceof TemporaryAnnotation))
+			return null;
+
+		Map annoAttributes = ((TemporaryAnnotation) anno).getAttributes();
+		/*
+		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=243660
+		 * 
+		 * May be null if the original validation IMessage contained no
+		 * attributes or this annotation was not based on a validation
+		 * IMessage
+		 */
+		if (annoAttributes == null) {
+			return null;
+		}
+		
+		// Check type
+		if (type != null) {
+			String problemType = (String) annoAttributes.get("problemType"); //$NON-NLS-1$;
+			if (!type.equals(problemType))
+				return null;
+		}
+
+		String[] values = new String[attributes.length];
+		for (int i = 0; i < attributes.length; i++) {
+			Object value = annoAttributes.get(attributes[i]);
+			if (value == null) {
+				return null;
+			}
+			values[i] = value.toString();
+		}
+		// Create and return the result
+		return new AnnotationQueryResult(values);
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on Object.
+	 */
+	public boolean equals(Object o) {
+		if (!(o instanceof AnnotationQuery)) {
+			return false;
+		}
+
+		if (o == this) {
+			return true;
+		}
+
+		AnnotationQuery mq = (AnnotationQuery) o;
+		if (!(type == null ? mq.type == null : type.equals(mq.type))) {
+			return false;
+		}
+
+		if (attributes.length != mq.attributes.length) {
+			return false;
+		}
+
+		for (int i = 0; i < attributes.length; i++) {
+			if (!(attributes[i].equals(mq.attributes[i]))) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on Object.
+	 */
+	public int hashCode() {
+		return hashCode;
+	}
+
+	/**
+	 * Computes the hash code for this instance.
+	 */
+	public void computeHashCode() {
+		hashCode = 19;
+
+		if (type != null) {
+			hashCode = hashCode * 37 + type.hashCode();
+		}
+
+		for (int i = 0; i < attributes.length; i++) {
+			hashCode = hashCode * 37 + attributes[i].hashCode();
+		}
+	}
+
+	/**
+	 * Returns the targetted marker type. May be <code>null</code>
+	 * 
+	 * @return the targetted marker type
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Returns the targetted attributes. The array may be empty.
+	 * 
+	 * @return the targetted attributes
+	 */
+	public String[] getAttributes() {
+		return attributes;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/AnnotationQueryResult.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/AnnotationQueryResult.java
new file mode 100644
index 0000000..51d1675
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/AnnotationQueryResult.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+/*
+ * Copied from rg.eclipse.ui.internal.ide.registr.MarkerQueryResult
+ */
+class AnnotationQueryResult {
+	/**
+	 * An ordered collection of annotation attribute values.
+	 */
+	private String[] values;
+
+	/**
+	 * Cached hash code value
+	 */
+	private int hashCode;
+
+	/**
+	 * Creates a new annotation query result with the given values.
+	 * <p>
+	 * The values may not be empty.
+	 * </p>
+	 * 
+	 * @param annotationAttributeValues
+	 *            the target annotation's attribute values
+	 */
+	public AnnotationQueryResult(String[] annotationAttributeValues) {
+		if (annotationAttributeValues == null) {
+			throw new IllegalArgumentException();
+		}
+		values = annotationAttributeValues;
+		computeHashCode();
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on Object.
+	 */
+	public boolean equals(Object o) {
+		if (!(o instanceof AnnotationQueryResult)) {
+			return false;
+		}
+
+		if (o == this) {
+			return true;
+		}
+
+		AnnotationQueryResult mqr = (AnnotationQueryResult) o;
+		if (values.length != mqr.values.length) {
+			return false;
+		}
+
+		for (int i = 0; i < values.length; i++) {
+			if (!(values[i].equals(mqr.values[i]))) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on Object.
+	 */
+	public int hashCode() {
+		return hashCode;
+	}
+
+	/**
+	 * Computes the hash code for this instance.
+	 */
+	public void computeHashCode() {
+		hashCode = 19;
+
+		for (int i = 0; i < values.length; i++) {
+			hashCode = hashCode * 37 + values[i].hashCode();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/CompoundQuickAssistProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/CompoundQuickAssistProcessor.java
new file mode 100644
index 0000000..7e410d4
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/CompoundQuickAssistProcessor.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+/**
+ * A quick assist processor that will allow for more than one quick assist
+ * processor. It includes quick assist processors contributed via the
+ * quickAssistProcessor extended configuration extension point. It also
+ * includes quick assist processors contributed via validators.
+ */
+public class CompoundQuickAssistProcessor implements IQuickAssistProcessor {
+	private final String QUICK_ASSIST_PROCESSOR_EXTENDED_ID = IQuickAssistProcessor.class.getName();
+	private Map fProcessors;
+	private IQuickAssistProcessor fQuickFixProcessor;
+	/**
+	 * list of partition types where extended processors have been installed
+	 */
+	private List fInstalledExtendedContentTypes;
+
+	private Set getQuickAssistProcessors(String partitionType) {
+		if (fInstalledExtendedContentTypes == null || !fInstalledExtendedContentTypes.contains(partitionType)) {
+			// get extended quick assist processors that have not already
+			// been set
+			List processors = ExtendedConfigurationBuilder.getInstance().getConfigurations(QUICK_ASSIST_PROCESSOR_EXTENDED_ID, partitionType);
+			if (processors != null && !processors.isEmpty()) {
+				Iterator iter = processors.iterator();
+				while (iter.hasNext()) {
+					IQuickAssistProcessor processor = (IQuickAssistProcessor) iter.next();
+					setQuickAssistProcessor(partitionType, processor);
+				}
+			}
+			// add partition type to list of extended partition types
+			// installed (regardless of whether or not any extended content
+			// assist processors were installed because dont want to look it
+			// up every time)
+			if (fInstalledExtendedContentTypes == null)
+				fInstalledExtendedContentTypes = new ArrayList();
+			fInstalledExtendedContentTypes.add(partitionType);
+		}
+
+		Set processors = null;
+		if (fProcessors != null)
+			processors = (Set) fProcessors.get(partitionType);
+
+		return processors;
+	}
+
+	/**
+	 * Gets all the quick assist processors relevant to the partion which is
+	 * calcuated from the given document and offset.
+	 * 
+	 * @param invocationContext
+	 * @return Set of quick assist processors or null if none exist
+	 */
+	private Set getQuickAssistProcessors(IQuickAssistInvocationContext invocationContext) {
+		Set processsors = null;
+
+		ISourceViewer sourceViewer = invocationContext.getSourceViewer();
+		if (sourceViewer != null) {
+			IDocument document = sourceViewer.getDocument();
+			try {
+				String partitionType;
+				if (document != null)
+					partitionType = TextUtilities.getContentType(document, IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, invocationContext.getOffset(), true);
+				else
+					partitionType = IDocument.DEFAULT_CONTENT_TYPE;
+
+				processsors = getQuickAssistProcessors(partitionType);
+			}
+			catch (BadLocationException x) {
+				Logger.log(Logger.WARNING_DEBUG, x.getMessage(), x);
+			}
+		}
+
+		return processsors;
+	}
+
+	/**
+	 * Gets the quick assist processor for validator contributed quick fixes
+	 * 
+	 * @return IQuickAssistProcessor
+	 */
+	private IQuickAssistProcessor getQuickFixProcessor() {
+		if (fQuickFixProcessor == null)
+			fQuickFixProcessor = new SourceValidationQuickAssistProcessor();
+
+		return fQuickFixProcessor;
+	}
+
+	/**
+	 * Associates a quick assist processor to a partition type and adds it to
+	 * the list of processors in this compound processor.
+	 * 
+	 * @param partitionType
+	 * @param processor
+	 */
+	private void setQuickAssistProcessor(String partitionType, IQuickAssistProcessor processor) {
+		if (fProcessors == null)
+			fProcessors = new HashMap();
+
+		Set processors = (Set) fProcessors.get(partitionType);
+
+		if (processor == null && processors != null) {
+			// removing quick assist processor for this partition type
+			processors.clear();
+			// check if it's the only
+			fProcessors.remove(partitionType);
+		}
+		else {
+			if (processors == null) {
+				processors = new LinkedHashSet();
+			}
+			processors.add(processor);
+			fProcessors.put(partitionType, processors);
+		}
+	}
+
+	public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
+		Set processors = getQuickAssistProcessors(invocationContext);
+		if (processors != null) {
+			// iterate through list of processors until one processor says
+			// canAssist
+			for (Iterator it = processors.iterator(); it.hasNext();) {
+				IQuickAssistProcessor p = (IQuickAssistProcessor) it.next();
+				if (p.canAssist(invocationContext))
+					return true;
+			}
+		}
+		return false;
+	}
+
+	public boolean canFix(Annotation annotation) {
+		// only quick fix processor contributes fixes so just check it
+		IQuickAssistProcessor processor = getQuickFixProcessor();
+		return processor.canFix(annotation);
+	}
+
+	public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext invocationContext) {
+		List proposalsList = new ArrayList();
+
+		// first get list of fixes
+		IQuickAssistProcessor processor = getQuickFixProcessor();
+		ICompletionProposal[] proposals = processor.computeQuickAssistProposals(invocationContext);
+		if (proposals != null && proposals.length > 0) {
+			proposalsList.addAll(Arrays.asList(proposals));
+		}
+
+		// no fixes, so try adding assists
+		if (proposalsList.isEmpty()) {
+			Set processors = getQuickAssistProcessors(invocationContext);
+			if (processors != null) {
+				// iterate through list of processors until one processor says
+				// canAssist
+				for (Iterator it = processors.iterator(); it.hasNext();) {
+					IQuickAssistProcessor assistProcessor = (IQuickAssistProcessor) it.next();
+					ICompletionProposal[] assistProposals = assistProcessor.computeQuickAssistProposals(invocationContext);
+					if (assistProposals != null && assistProposals.length > 0) {
+						proposalsList.addAll(Arrays.asList(assistProposals));
+					}
+				}
+			}
+		}
+
+		/*
+		 * Java editor currently returns a no modification completion proposal
+		 * but it seems better to just return null so user does not get
+		 * annoying proposal popup
+		 */
+		if (proposalsList.isEmpty()) {
+			// proposalsList.add(new NoModificationCompletionProposal());
+			return null;
+		}
+
+		return (ICompletionProposal[]) proposalsList.toArray(new ICompletionProposal[proposalsList.size()]);
+	}
+
+	public String getErrorMessage() {
+		// never have error messages
+		return null;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/ContributedProcessorDescriptor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/ContributedProcessorDescriptor.java
new file mode 100644
index 0000000..d64572a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/ContributedProcessorDescriptor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public class ContributedProcessorDescriptor {
+	private static final String CLASS = "class"; //$NON-NLS-1$
+
+	private IConfigurationElement fConfigurationElement;
+	private Object fProcessorInstance;
+
+	public ContributedProcessorDescriptor(IConfigurationElement element) {
+		fConfigurationElement = element;
+		fProcessorInstance = null;
+	}
+
+	public Object getProcessor() throws CoreException {
+		if (fProcessorInstance == null && fConfigurationElement != null) {
+			fProcessorInstance = fConfigurationElement.createExecutableExtension(CLASS);
+		}
+		return fProcessorInstance;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/CorrectionAssistantProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/CorrectionAssistantProvider.java
new file mode 100644
index 0000000..e044939
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/CorrectionAssistantProvider.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.source.ISourceViewer;
+
+/**
+ * Provides the appropriate correction assistant for a given source viewer.
+ * This class should only be a placeholder until the base implements a common
+ * way for quickfix/quick assist.
+ * 
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+abstract public class CorrectionAssistantProvider {
+	/**
+	 * Returns the correction assistant for the given sourceviewer.
+	 * 
+	 * @param sourceViewer
+	 * @return
+	 */
+	abstract public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/IQuickAssistProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/IQuickAssistProcessor.java
new file mode 100644
index 0000000..6720223
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/IQuickAssistProcessor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+
+/**
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public interface IQuickAssistProcessor {
+	/**
+	 * Returns true if the processor can assist at the given offset. This test
+	 * should be an optimistic guess and be extremly cheap.
+	 */
+	boolean canAssist(StructuredTextViewer viewer, int offset);
+
+	/**
+	 * Collects proposals for assistant at the given offset.
+	 */
+	ICompletionProposal[] getProposals(StructuredTextViewer viewer, int offset) throws CoreException;
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/IQuickFixProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/IQuickFixProcessor.java
new file mode 100644
index 0000000..c93d21e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/IQuickFixProcessor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public interface IQuickFixProcessor {
+	/**
+	 * Returns true if the processor can fix the given problem. This test
+	 * should be an optimistic guess and be extremly cheap.
+	 */
+	boolean canFix(Annotation annnotation);
+
+	/**
+	 * Collects proposals for fixing the given problem.
+	 */
+	ICompletionProposal[] getProposals(Annotation annnotation) throws CoreException;
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/NoModificationCompletionProposal.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/NoModificationCompletionProposal.java
new file mode 100644
index 0000000..babb1a8
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/NoModificationCompletionProposal.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+public class NoModificationCompletionProposal implements ICompletionProposal {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#apply(org.eclipse.jface.text.IDocument)
+	 */
+	public void apply(IDocument document) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo()
+	 */
+	public String getAdditionalProposalInfo() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getContextInformation()
+	 */
+	public IContextInformation getContextInformation() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
+	 */
+	public String getDisplayString() {
+		return SSEUIMessages.NoModificationCompletionProposal_0; //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
+	 */
+	public Image getImage() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection(org.eclipse.jface.text.IDocument)
+	 */
+	public Point getSelection(IDocument document) {
+		return null;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/QuickFixRegistry.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/QuickFixRegistry.java
new file mode 100644
index 0000000..2be196f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/QuickFixRegistry.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.wst.sse.core.internal.Logger;
+
+public class QuickFixRegistry {
+	private static QuickFixRegistry instance;
+
+	public synchronized static QuickFixRegistry getInstance() {
+		if (instance == null) {
+			instance = new QuickFixRegistry();
+			new QuickFixRegistryReader().addHelp(instance);
+		}
+		return instance;
+	}
+
+	/**
+	 * Table of queries for marker resolutions
+	 */
+	private Map resolutionQueries = new HashMap();
+	/**
+	 * Resolution class attribute name in configuration element
+	 */
+	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
+
+	/**
+	 * Adds a resolution query to the registry.
+	 * 
+	 * @param query
+	 *            a marker query
+	 * @param result
+	 *            a result for the given query
+	 * @param element
+	 *            the configuration element defining the result
+	 */
+	void addResolutionQuery(AnnotationQuery query, AnnotationQueryResult result, IConfigurationElement element) {
+		addQuery(resolutionQueries, query, result, element);
+	}
+
+	/**
+	 * Adds a query to the given table.
+	 * 
+	 * @param table
+	 *            the table to which the query is added
+	 * @param query
+	 *            a marker query
+	 * @param result
+	 *            a result for the given query
+	 * @param element
+	 *            the configuration element defining the result
+	 */
+	private void addQuery(Map table, AnnotationQuery query, AnnotationQueryResult result, IConfigurationElement element) {
+
+		// See if the query is already in the table
+		Map results = (Map) table.get(query);
+		if (results == null) {
+			// Create a new results table
+			results = new HashMap();
+
+			// Add the query to the table
+			table.put(query, results);
+		}
+
+		if (results.containsKey(result)) {
+			Collection currentElements = (Collection) results.get(result);
+			currentElements.add(element);
+		}
+		else {
+			Collection elements = new HashSet();
+			elements.add(element);
+
+			// Add the new result
+			results.put(result, elements);
+		}
+	}
+
+	public IQuickAssistProcessor[] getQuickFixProcessors(Annotation anno) {
+		// Collect all matches
+		List processors = new ArrayList();
+		for (Iterator iter = resolutionQueries.keySet().iterator(); iter.hasNext();) {
+			AnnotationQuery query = (AnnotationQuery) iter.next();
+			AnnotationQueryResult result = null;
+			try {
+				/* AnnotationQuery objects are contributed by extension point */
+				result = query.performQuery(anno);
+			}
+			catch (Exception e) {
+				Logger.logException(e);
+			}
+			if (result != null) {
+				// See if a matching result is registered
+				Map resultsTable = (Map) resolutionQueries.get(query);
+
+				if (resultsTable.containsKey(result)) {
+
+					Iterator elements = ((Collection) resultsTable.get(result)).iterator();
+					while (elements.hasNext()) {
+						IConfigurationElement element = (IConfigurationElement) elements.next();
+
+						IQuickAssistProcessor processor = null;
+						try {
+							processor = (IQuickAssistProcessor) element.createExecutableExtension(ATT_CLASS);
+						}
+						catch (CoreException e) {
+						}
+						if (processor != null) {
+							processors.add(processor);
+						}
+
+					}
+				}
+			}
+		}
+		return (IQuickAssistProcessor[]) processors.toArray(new IQuickAssistProcessor[processors.size()]);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/QuickFixRegistryReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/QuickFixRegistryReader.java
new file mode 100644
index 0000000..4341bde
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/QuickFixRegistryReader.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
+
+public class QuickFixRegistryReader extends RegistryReader {
+	private static final String QUICKFIXPROCESSOR = "quickFixProcessor"; //$NON-NLS-1$
+	private static final String ATT_PROBLEMTYPE = "problemType"; //$NON-NLS-1$
+
+	private static final String ATTRIBUTE = "attribute"; //$NON-NLS-1$
+	private static final String ATT_NAME = "name"; //$NON-NLS-1$
+	private static final String ATT_VALUE = "value"; //$NON-NLS-1$
+
+	private ArrayList currentAttributeNames;
+
+	private ArrayList currentAttributeValues;
+
+	private QuickFixRegistry quickFixProcessorRegistry;
+
+	protected boolean readElement(IConfigurationElement element) {
+		if (element.getName().equals(QUICKFIXPROCESSOR)) {
+			readQuickFixProcessorElement(element);
+			return true;
+		}
+		if (element.getName().equals(ATTRIBUTE)) {
+			readAttributeElement(element);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Processes a resolution configuration element.
+	 */
+	private void readQuickFixProcessorElement(IConfigurationElement element) {
+		// read type
+		String type = element.getAttribute(ATT_PROBLEMTYPE);
+
+		// read attributes and values
+		currentAttributeNames = new ArrayList();
+		currentAttributeValues = new ArrayList();
+		readElementChildren(element);
+		String[] attributeNames = (String[]) currentAttributeNames.toArray(new String[currentAttributeNames.size()]);
+		String[] attributeValues = (String[]) currentAttributeValues.toArray(new String[currentAttributeValues.size()]);
+
+		// add query to the registry
+		AnnotationQuery query = new AnnotationQuery(type, attributeNames);
+		AnnotationQueryResult result = new AnnotationQueryResult(attributeValues);
+		quickFixProcessorRegistry.addResolutionQuery(query, result, element);
+	}
+
+	/**
+	 * Get the marker help that is defined in the plugin registry and add it
+	 * to the given marker help registry.
+	 * <p>
+	 * Warning: The marker help registry must be passed in because this method
+	 * is called during the process of setting up the marker help registry and
+	 * at this time it has not been safely setup with the plugin.
+	 * </p>
+	 */
+	public void addHelp(QuickFixRegistry registry) {
+		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+		quickFixProcessorRegistry = registry;
+		readRegistry(extensionRegistry, SSEUIPlugin.ID, QUICKFIXPROCESSOR);
+	}
+
+	/**
+	 * Processes an attribute sub element.
+	 */
+	private void readAttributeElement(IConfigurationElement element) {
+		String name = element.getAttribute(ATT_NAME);
+		String value = element.getAttribute(ATT_VALUE);
+		if (name != null && value != null) {
+			currentAttributeNames.add(name);
+			currentAttributeValues.add(value);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/SourceValidationQuickAssistProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/SourceValidationQuickAssistProcessor.java
new file mode 100644
index 0000000..9033fd5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/SourceValidationQuickAssistProcessor.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.jface.text.quickassist.IQuickFixableAnnotation;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModelExtension2;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.ui.StructuredTextInvocationContext;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+
+/**
+ * This quick assist processor will provide quick fixes for source validation
+ * errors (Temporary Annotation)
+ */
+public class SourceValidationQuickAssistProcessor implements IQuickAssistProcessor {
+	public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
+		return false;
+	}
+
+	public boolean canFix(Annotation annotation) {
+		if (annotation instanceof IQuickFixableAnnotation) {
+			if (((IQuickFixableAnnotation) annotation).isQuickFixableStateSet()) {
+				return ((IQuickFixableAnnotation) annotation).isQuickFixable();
+			}
+		}
+		return false;
+	}
+
+	public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext quickAssistContext) {
+		ISourceViewer viewer = quickAssistContext.getSourceViewer();
+		int documentOffset = quickAssistContext.getOffset();
+		int length = viewer != null ? viewer.getSelectedRange().y : 0;
+
+		IAnnotationModel model = viewer.getAnnotationModel();
+		if (model == null)
+			return null;
+
+		List allProposals = new ArrayList();
+		if (model instanceof IAnnotationModelExtension2) {
+			Iterator iter = ((IAnnotationModelExtension2) model).getAnnotationIterator(documentOffset, length, true, true);
+			while (iter.hasNext()) {
+				List processors = new ArrayList();
+				Annotation anno = (Annotation) iter.next();
+				if (canFix(anno)) {
+					// first check to see if annotation already has a quick
+					// fix processor attached to it
+					if (anno instanceof TemporaryAnnotation) {
+						Object o = ((TemporaryAnnotation) anno).getAdditionalFixInfo();
+						if (o instanceof IQuickAssistProcessor) {
+							processors.add(o);
+						}
+					}
+
+					// get all relevant quick fixes for this annotation
+					QuickFixRegistry registry = QuickFixRegistry.getInstance();
+					processors.addAll(Arrays.asList(registry.getQuickFixProcessors(anno)));
+
+					// set up context
+					Map attributes = null;
+					if (anno instanceof TemporaryAnnotation) {
+						attributes = ((TemporaryAnnotation) anno).getAttributes();
+					}
+					Position pos = model.getPosition(anno);
+					StructuredTextInvocationContext sseContext = new StructuredTextInvocationContext(viewer, pos.getOffset(), pos.getLength(), attributes);
+
+					// call each processor
+					for (int i = 0; i < processors.size(); ++i) {
+						List proposals = new ArrayList();
+						collectProposals((IQuickAssistProcessor) processors.get(i), anno, sseContext, proposals);
+
+						if (proposals.size() > 0) {
+							allProposals.addAll(proposals);
+						}
+					}
+
+				}
+			}
+		}
+
+		if (allProposals.isEmpty())
+			return null;
+
+		return (ICompletionProposal[]) allProposals.toArray(new ICompletionProposal[allProposals.size()]);
+	}
+
+	private void collectProposals(IQuickAssistProcessor processor, Annotation annotation, IQuickAssistInvocationContext invocationContext, List proposalsList) {
+		ICompletionProposal[] proposals = processor.computeQuickAssistProposals(invocationContext);
+		if (proposals != null && proposals.length > 0) {
+			proposalsList.addAll(Arrays.asList(proposals));
+		}
+	}
+
+
+	public String getErrorMessage() {
+		return null;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/StructuredCorrectionProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/StructuredCorrectionProcessor.java
new file mode 100644
index 0000000..d19427c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/correction/StructuredCorrectionProcessor.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.correction;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+
+/**
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public class StructuredCorrectionProcessor implements IContentAssistProcessor {
+	protected IAnnotationModel fAnnotationModel;
+	protected IQuickAssistProcessor fQuickAssistProcessor;
+	protected IQuickFixProcessor fQuickFixProcessor;
+
+	public StructuredCorrectionProcessor(ISourceViewer sourceViewer) {
+		fAnnotationModel = sourceViewer.getAnnotationModel();
+	}
+
+	protected void addQuickAssistProposals(StructuredTextViewer viewer, ArrayList proposals, int documentOffset) {
+		try {
+			IQuickAssistProcessor processor = getQuickAssistProcessor();
+			if (processor != null && processor.canAssist(viewer, documentOffset)) {
+				ICompletionProposal[] res = processor.getProposals(viewer, documentOffset);
+				if (res != null) {
+					for (int k = 0; k < res.length; k++) {
+						proposals.add(res[k]);
+					}
+				}
+			}
+		} catch (CoreException e) {
+			// log for now, unless we find reason not to
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+	}
+
+	protected void addQuickFixProposals(StructuredTextViewer viewer, ArrayList proposals, int documentOffset) {
+		Iterator iter = fAnnotationModel.getAnnotationIterator();
+		while (iter.hasNext()) {
+			Annotation annotation = (Annotation) iter.next();
+			Position pos = fAnnotationModel.getPosition(annotation);
+			if (pos != null && documentOffset >= pos.offset && documentOffset <= pos.offset + pos.length) {
+				IQuickFixProcessor processor = getQuickFixProcessor();
+				if (processor != null && processor.canFix(annotation)) {
+					try {
+						ICompletionProposal[] res = processor.getProposals(annotation);
+						if (res != null) {
+							for (int k = 0; k < res.length; k++) {
+								proposals.add(res[k]);
+							}
+						}
+					} catch (CoreException e) {
+						// log for now, unless we find reason not to
+						Logger.log(Logger.INFO, e.getMessage());
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
+		ArrayList proposals = new ArrayList();
+
+		if (viewer instanceof StructuredTextViewer) {
+			addQuickFixProposals((StructuredTextViewer) viewer, proposals, documentOffset);
+
+			if (proposals.isEmpty()) {
+				addQuickAssistProposals((StructuredTextViewer) viewer, proposals, documentOffset);
+			}
+		}
+
+		if (proposals.isEmpty())
+			proposals.add(new NoModificationCompletionProposal());
+
+		return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters()
+	 */
+	public char[] getContextInformationAutoActivationCharacters() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator()
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getErrorMessage()
+	 */
+	public String getErrorMessage() {
+		return null;
+	}
+
+	protected IQuickAssistProcessor getQuickAssistProcessor() {
+		return null;
+	}
+
+	protected IQuickFixProcessor getQuickFixProcessor() {
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/BreakpointRulerAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/BreakpointRulerAction.java
new file mode 100644
index 0000000..dc8646e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/BreakpointRulerAction.java
@@ -0,0 +1,318 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Pete Carapetyan/Genuitec - 244835 - Enable/Disable breakpoint action does not refresh its label
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.extension.BreakpointProviderBuilder;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider;
+
+
+public abstract class BreakpointRulerAction extends Action implements IUpdate {
+
+	protected class MouseUpdater implements MouseListener {
+		public void mouseDoubleClick(MouseEvent e) {
+			// do nothing (here)
+		}
+
+		public void mouseDown(MouseEvent e) {
+			update();
+		}
+
+		public void mouseUp(MouseEvent e) {
+			// do nothing
+		}
+	}
+
+	public static final String getFileExtension(IEditorInput input) {
+		IPath path = null;
+		if (input instanceof IStorageEditorInput) {
+			try {
+				path = ((IStorageEditorInput) input).getStorage().getFullPath();
+			} catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+		if (path != null) {
+			return path.getFileExtension();
+		}
+		String name = input.getName();
+		int index = name.lastIndexOf('.');
+		if (index == -1)
+			return null;
+		if (index == (name.length() - 1))
+			return ""; //$NON-NLS-1$
+		return name.substring(index + 1);
+	}
+
+	public static final IResource getResource(IEditorInput input) {
+		IResource resource = null;
+
+		if (input instanceof IFileEditorInput)
+			resource = ((IFileEditorInput) input).getFile();
+		if (resource == null)
+			resource = (IResource) input.getAdapter(IFile.class);
+		if (resource == null)
+			resource = (IResource) input.getAdapter(IResource.class);
+
+		IEditorPart editorPart = null;
+		if (resource == null) {
+			IWorkbench workbench = SSEUIPlugin.getDefault().getWorkbench();
+			if (workbench != null) {
+				IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+				if (window != null) {
+					IPartService service = window.getPartService();
+					if (service != null) {
+						Object part = service.getActivePart();
+						if (part != null && part instanceof IEditorPart) {
+							editorPart = (IEditorPart) part;
+							if (editorPart != null) {
+								IStructuredModel model = null;
+								ITextEditor textEditor = null;
+								try {
+									if (editorPart instanceof ITextEditor) {
+										textEditor = (ITextEditor) editorPart;
+									}
+									if (textEditor == null) {
+										textEditor = (ITextEditor) editorPart.getAdapter(ITextEditor.class);
+									}
+									if (textEditor != null) {
+										IDocument textDocument = textEditor.getDocumentProvider().getDocument(input);
+										model = StructuredModelManager.getModelManager().getExistingModelForRead(textDocument);
+										if (model != null) {
+											resource = BreakpointProviderBuilder.getInstance().getResource(input, model.getContentTypeIdentifier(), getFileExtension(input));
+										}
+									}
+									if (resource == null) {
+										IBreakpointProvider[] providers = BreakpointProviderBuilder.getInstance().getBreakpointProviders(editorPart, null, getFileExtension(input));
+										for (int i = 0; i < providers.length && resource == null; i++) {
+											resource = providers[i].getResource(input);
+										}
+									}
+								} catch (Exception e) {
+									Logger.logException(e);
+								} finally {
+									if (model != null) {
+										model.releaseFromRead();
+									}
+								}
+							}
+
+						}
+					}
+				}
+
+			}
+		}
+		return resource;
+	}
+
+	protected MouseListener fMouseListener = null;
+
+	protected IVerticalRulerInfo fRulerInfo = null;
+	protected ITextEditor fTextEditor = null;
+
+	private IMenuListener menuListener;
+
+	public BreakpointRulerAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
+		super();
+		fTextEditor = editor;
+		if (rulerInfo != null) {
+			fRulerInfo = rulerInfo;
+			fMouseListener = new MouseUpdater();
+			rulerInfo.getControl().addMouseListener(fMouseListener);
+		}
+		if (editor instanceof ITextEditorExtension) {
+			ITextEditorExtension extension = (ITextEditorExtension) editor;
+			menuListener = new IMenuListener() {
+				public void menuAboutToShow(IMenuManager manager) {
+					update();
+				}
+			};
+			extension.addRulerContextMenuListener(menuListener);
+		}
+	}
+
+	/**
+	 * Returns the <code>AbstractMarkerAnnotationModel</code> of the
+	 * editor's input.
+	 * 
+	 * @return the marker annotation model
+	 */
+	protected AbstractMarkerAnnotationModel getAnnotationModel() {
+		IDocumentProvider provider = fTextEditor.getDocumentProvider();
+		IAnnotationModel model = provider.getAnnotationModel(fTextEditor.getEditorInput());
+		if (model instanceof AbstractMarkerAnnotationModel)
+			return (AbstractMarkerAnnotationModel) model;
+		return null;
+	}
+
+	protected IBreakpoint[] getBreakpoints(IMarker[] markers) {
+		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
+		List breakpoints = new ArrayList(markers.length);
+		for (int i = 0; i < markers.length; i++) {
+			IBreakpoint breakpoint = manager.getBreakpoint(markers[i]);
+			if (breakpoint != null) {
+				breakpoints.add(breakpoint);
+			}
+		}
+		return (IBreakpoint[]) breakpoints.toArray(new IBreakpoint[0]);
+	}
+
+	/**
+	 * Returns the <code>IDocument</code> of the editor's input.
+	 * 
+	 * @return the document of the editor's input
+	 */
+	protected IDocument getDocument() {
+		IDocumentProvider provider = fTextEditor.getDocumentProvider();
+		return provider.getDocument(fTextEditor.getEditorInput());
+	}
+
+	/**
+	 * Returns all markers which include the ruler's line of activity.
+	 * 
+	 * @return an array of markers which include the ruler's line of activity
+	 */
+	protected IMarker[] getMarkers() {
+		List markers = new ArrayList();
+
+		IResource resource = getResource();
+		IDocument document = getDocument();
+		AbstractMarkerAnnotationModel annotationModel = getAnnotationModel();
+
+		if (resource != null && annotationModel != null && resource.exists()) {
+			try {
+				IMarker[] allMarkers = resource.findMarkers(IBreakpoint.BREAKPOINT_MARKER, true, IResource.DEPTH_ZERO);
+				if (allMarkers != null) {
+					for (int i = 0; i < allMarkers.length; i++) {
+						if (includesRulerLine(annotationModel.getMarkerPosition(allMarkers[i]), document)) {
+							markers.add(allMarkers[i]);
+						}
+					}
+				}
+			} catch (CoreException x) {
+				//
+			}
+		}
+
+		return (IMarker[]) markers.toArray(new IMarker[0]);
+	}
+
+	protected IResource getResource() {
+		IEditorInput input = getTextEditor().getEditorInput();
+		IResource resource = getResource(input);
+		return resource;
+	}
+
+	/**
+	 * @return Returns the rulerInfo.
+	 */
+	public IVerticalRulerInfo getRulerInfo() {
+		return fRulerInfo;
+	}
+
+	/**
+	 * @return Returns the textEditor.
+	 */
+	public ITextEditor getTextEditor() {
+		return fTextEditor;
+	}
+
+	protected boolean hasMarkers() {
+		IResource resource = getResource();
+		IDocument document = getDocument();
+		AbstractMarkerAnnotationModel model = getAnnotationModel();
+
+		if (resource != null && model != null && resource.exists()) {
+			try {
+				IMarker[] allMarkers = resource.findMarkers(IBreakpoint.LINE_BREAKPOINT_MARKER, true, IResource.DEPTH_ZERO);
+				if (allMarkers != null) {
+					for (int i = 0; i < allMarkers.length; i++) {
+						if (includesRulerLine(model.getMarkerPosition(allMarkers[i]), document)) {
+							return true;
+						}
+					}
+				}
+			} catch (CoreException x) {
+				//
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Checks whether a position includes the ruler's line of activity.
+	 * 
+	 * @param position
+	 *            the position to be checked
+	 * @param document
+	 *            the document the position refers to
+	 * @return <code>true</code> if the line is included by the given
+	 *         position
+	 */
+	protected boolean includesRulerLine(Position position, IDocument document) {
+		if (position != null && fRulerInfo != null) {
+			try {
+				int markerLine = document.getLineOfOffset(position.getOffset());
+				int line = getRulerInfo().getLineOfLastMouseButtonActivity();
+				if (line == markerLine)
+					return true;
+				// commented because of "1GEUOZ9: ITPJUI:ALL - Confusing UI
+				// for
+				// multiline Bookmarks and Tasks"
+				// return (markerLine <= line && line <=
+				// document.getLineOfOffset(position.getOffset() +
+				// position.getLength()));
+			} catch (BadLocationException x) {
+				//
+			}
+		}
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/DebugTextEditor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/DebugTextEditor.java
new file mode 100644
index 0000000..c733782
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/DebugTextEditor.java
@@ -0,0 +1,438 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.debug;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.editors.text.FileDocumentProvider;
+import org.eclipse.ui.editors.text.ILocationProvider;
+import org.eclipse.ui.editors.text.StorageDocumentProvider;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.part.IShowInTargetList;
+import org.eclipse.ui.texteditor.AbstractDocumentProvider;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.IElementStateListener;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.MarkerRulerAction;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
+import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
+import org.eclipse.wst.sse.ui.internal.IPopupMenuContributor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.StructuredResourceMarkerAnnotationModel;
+import org.eclipse.wst.sse.ui.internal.actions.ActionDefinitionIds;
+import org.eclipse.wst.sse.ui.internal.extension.BreakpointProviderBuilder;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ConfigurationPointCalculator;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IExtendedStorageEditorInput;
+
+
+/**
+ * @author nitin
+ * 
+ * A text editor capable of using the IBreakpointProvider framework.
+ * 
+ * This class is intended to be used by clients who wish to use the
+ * IBreakpointProvider framework but not the StructuredTextEditor, e.g. VBS
+ * source editors. It is provided AS-IS and marked internal as it is
+ * unsupported and subject to change at any time.
+ */
+public class DebugTextEditor extends TextEditor {
+
+	private class ShowInTargetLister implements IShowInTargetList {
+		public String[] getShowInTargetIds() {
+			return fShowInTargetIds;
+		}
+	}
+
+	/**
+	 * DocumentProvider for IStorageEditorInputs - supports
+	 * IExtendedStorageEditorInput notifications and assigning breakpoint
+	 * markers.
+	 */
+	class StorageInputDocumentProvider extends StorageDocumentProvider implements IElementStateListener {
+		protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {
+			IAnnotationModel model = null;
+			IStorageEditorInput storageInput = (IStorageEditorInput) element;
+			String ext = BreakpointRulerAction.getFileExtension(storageInput);
+			IContentType[] types = getEditorInputContentTypes(storageInput);
+			IResource res = null;
+			for (int i = 0; res == null && i < types.length; i++) {
+				res = BreakpointProviderBuilder.getInstance().getResource(storageInput, types[i].getId(), ext);
+			}
+			String id = storageInput.getName();
+			if (storageInput.getStorage() != null) {
+				IPath fullPath = storageInput.getStorage().getFullPath();
+				if (fullPath != null)
+					id = fullPath.toString();
+				else
+					id = storageInput.getName();
+			}
+			if (res != null)
+				model = new StructuredResourceMarkerAnnotationModel(res, id);
+			else
+				model = new StructuredResourceMarkerAnnotationModel(ResourcesPlugin.getWorkspace().getRoot(), id);
+
+			return model;
+		}
+
+		protected AbstractDocumentProvider.ElementInfo createElementInfo(Object element) throws CoreException {
+			if (element instanceof IExtendedStorageEditorInput) {
+				((IExtendedStorageEditorInput) element).addElementStateListener(this);
+			}
+			return super.createElementInfo(element);
+		}
+
+		protected void disposeElementInfo(Object element, ElementInfo info) {
+			if (element instanceof IExtendedStorageEditorInput) {
+				((IExtendedStorageEditorInput) element).removeElementStateListener(this);
+			}
+			super.disposeElementInfo(element, info);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.ui.editors.text.StorageDocumentProvider#doSaveDocument(org.eclipse.core.runtime.IProgressMonitor,
+		 *      java.lang.Object, org.eclipse.jface.text.IDocument, boolean)
+		 */
+		protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {
+			// untested
+			new FileDocumentProvider().saveDocument(monitor, element, document, overwrite);
+		}
+
+		public void elementContentAboutToBeReplaced(Object element) {
+			fireElementContentAboutToBeReplaced(element);
+		}
+
+		public void elementContentReplaced(Object element) {
+			fireElementContentReplaced(element);
+		}
+
+		public void elementDeleted(Object element) {
+			fireElementDeleted(element);
+		}
+
+		public void elementDirtyStateChanged(Object element, boolean isDirty) {
+			fireElementDirtyStateChanged(element, isDirty);
+		}
+
+		public void elementMoved(Object originalElement, Object movedElement) {
+			fireElementMoved(originalElement, movedElement);
+		}
+	}
+
+	String[] fShowInTargetIds = new String[]{IPageLayout.ID_RES_NAV};
+	private IShowInTargetList fShowInTargetListAdapter = new ShowInTargetLister();
+
+	IDocumentProvider fStorageInputDocumentProvider = null;
+
+	public DebugTextEditor() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.editors.text.TextEditor#createActions()
+	 */
+	protected void createActions() {
+		super.createActions();
+
+		// StructuredTextEditor Action - toggle breakpoints
+		IAction action = new ToggleBreakpointAction(this, getVerticalRuler()) {
+			protected String getContentType(IDocument document) {
+				ILocationProvider provider = (ILocationProvider) getEditorInput().getAdapter(ILocationProvider.class);
+				if (provider != null) {
+					IPath location = provider.getPath(getEditorInput());
+					return detectContentType(location).getId();
+				}
+				else if (getEditorInput() instanceof IPathEditorInput) {
+					IPath location = ((IPathEditorInput) getEditorInput()).getPath();
+					return detectContentType(location).getId();
+				}
+				return IContentTypeManager.CT_TEXT;
+			}
+		};
+		setAction(ActionDefinitionIds.TOGGLE_BREAKPOINTS, action);
+		// StructuredTextEditor Action - manage breakpoints
+		action = new ManageBreakpointAction(this, getVerticalRuler());
+		setAction(ActionDefinitionIds.MANAGE_BREAKPOINTS, action);
+		// StructuredTextEditor Action - edit breakpoints
+		action = new EditBreakpointAction(this, getVerticalRuler());
+		setAction(ActionDefinitionIds.EDIT_BREAKPOINTS, action);
+	}
+
+	/**
+	 * Loads the Show In Target IDs from the Extended Configuration extension
+	 * point.
+	 * 
+	 * @return
+	 */
+	protected String[] createShowInTargetIds() {
+		List allIds = new ArrayList(0);
+		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+		String[] configurationIds = getConfigurationPoints();
+		for (int i = 0; i < configurationIds.length; i++) {
+			String[] definitions = builder.getDefinitions("showintarget", configurationIds[i]); //$NON-NLS-1$
+			for (int j = 0; j < definitions.length; j++) {
+				String someIds = definitions[j];
+				if (someIds != null && someIds.length() > 0) {
+					String[] ids = StringUtils.unpack(someIds);
+					for (int k = 0; k < ids.length; k++) {
+						// trim, just to keep things clean
+						String id = ids[k].trim();
+						if (!allIds.contains(id)) {
+							allIds.add(id);
+						}
+					}
+				}
+			}
+		}
+
+		if (!allIds.contains(IPageLayout.ID_RES_NAV)) {
+			allIds.add(IPageLayout.ID_RES_NAV);
+		}
+		return (String[]) allIds.toArray(new String[0]);
+	}
+
+	IContentType detectContentType(IPath location) {
+		IContentType type = null;
+
+		IResource resource = FileBuffers.getWorkspaceFileAtLocation(location);
+		if (resource != null) {
+			if (resource.getType() == IResource.FILE && resource.isAccessible()) {
+				IContentDescription d = null;
+				try {
+					// Optimized description lookup, might not succeed
+					d = ((IFile) resource).getContentDescription();
+					if (d != null) {
+						type = d.getContentType();
+					}
+				}
+				catch (CoreException e) {
+					// Should not be possible given the accessible and file
+					// type check above
+				}
+				if (type == null) {
+					type = Platform.getContentTypeManager().findContentTypeFor(resource.getName());
+				}
+			}
+		}
+		else {
+			File file = FileBuffers.getSystemFileAtLocation(location);
+			if (file != null) {
+				InputStream input = null;
+				try {
+					input = new FileInputStream(file);
+					type = Platform.getContentTypeManager().findContentTypeFor(input, location.toOSString());
+				}
+				catch (FileNotFoundException e) {
+				}
+				catch (IOException e) {
+				}
+				finally {
+					if (input != null) {
+						try {
+							input.close();
+						}
+						catch (IOException e1) {
+						}
+					}
+				}
+				if (type == null) {
+					type = Platform.getContentTypeManager().findContentTypeFor(file.getName());
+				}
+			}
+		}
+		if (type == null) {
+			type = Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT);
+		}
+		return type;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#editorContextMenuAboutToShow(org.eclipse.jface.action.IMenuManager)
+	 */
+	protected void editorContextMenuAboutToShow(IMenuManager menu) {
+		super.editorContextMenuAboutToShow(menu);
+
+		IEditorActionBarContributor c = getEditorSite().getActionBarContributor();
+		if (c instanceof IPopupMenuContributor) {
+			((IPopupMenuContributor) c).contributeToPopupMenu(menu);
+		}
+		else {
+			ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
+			IExtendedContributor pmc = builder.readActionExtensions(getConfigurationPoints());
+			if (pmc != null) {
+				pmc.setActiveEditor(this);
+				pmc.contributeToPopupMenu(menu);
+			}
+		}
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class required) {
+		// Navigate action set menu
+		if (IShowInTargetList.class.equals(required))
+			return fShowInTargetListAdapter;
+		return super.getAdapter(required);
+	}
+
+
+	protected String[] getConfigurationPoints() {
+		return ConfigurationPointCalculator.getConfigurationPoints(this, getInputContentType(getEditorInput()), ConfigurationPointCalculator.SOURCE, DebugTextEditor.class);
+	}
+
+	IContentType[] getEditorInputContentTypes(IEditorInput input) {
+		IContentType[] types = null;
+		IResource resource = null;
+
+		if (input.getAdapter(IFile.class) != null) {
+			resource = (IFile) input.getAdapter(IFile.class);
+		}
+		else if (input.getAdapter(IFile.class) != null) {
+			resource = (IResource) input.getAdapter(IResource.class);
+		}
+		if (resource.getType() == IResource.FILE && resource.isAccessible()) {
+			IContentDescription d = null;
+			try {
+				// optimized description lookup, might not succeed
+				d = ((IFile) resource).getContentDescription();
+				if (d != null) {
+					types = new IContentType[]{d.getContentType()};
+				}
+			}
+			catch (CoreException e) {
+				// should not be possible given the accessible and file type
+				// check above
+			}
+		}
+		if (types == null) {
+			types = Platform.getContentTypeManager().findContentTypesFor(input.getName());
+		}
+		return types;
+	}
+
+	/**
+	 * @param editorInput
+	 * @return
+	 */
+	private String getInputContentType(IEditorInput editorInput) {
+		IContentType[] types = getEditorInputContentTypes(editorInput);
+		if (types != null) {
+			return types[0].getId();
+		}
+		return null;
+	}
+
+	/**
+	 * 
+	 * @return
+	 */
+	private boolean isDebuggingAvailable() {
+		boolean debuggingAvailable = false;
+		IContentType[] types = getEditorInputContentTypes(getEditorInput());
+		for (int i = 0; !debuggingAvailable && i < types.length; i++) {
+			debuggingAvailable = debuggingAvailable || BreakpointProviderBuilder.getInstance().isAvailable(types[i].getId(), BreakpointRulerAction.getFileExtension(getEditorInput()));
+		}
+		return debuggingAvailable;
+	}
+
+	protected void rulerContextMenuAboutToShow(IMenuManager menu) {
+		if (isDebuggingAvailable()) {
+			menu.add(getAction(ActionDefinitionIds.TOGGLE_BREAKPOINTS));
+			menu.add(getAction(ActionDefinitionIds.MANAGE_BREAKPOINTS));
+			menu.add(getAction(ActionDefinitionIds.EDIT_BREAKPOINTS));
+			menu.add(new Separator());
+		}
+		else {
+			Logger.log(Logger.INFO, getClass().getName() + " could not enable debugging actions"); //$NON-NLS-1$
+		}
+		super.rulerContextMenuAboutToShow(menu);
+	}
+
+	/**
+	 * Ensure that the correct IDocumentProvider is used. For IFile and Files,
+	 * the default provider with a specified AnnotationModelFactory is used.
+	 * For StorageEditorInputs, use a custom provider that creates a usable
+	 * ResourceAnnotationModel
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#setDocumentProvider(org.eclipse.ui.IEditorInput)
+	 */
+	protected void setDocumentProvider(IEditorInput input) {
+		if (input instanceof IStorageEditorInput && !(input instanceof IFileEditorInput)) {
+			if (fStorageInputDocumentProvider == null) {
+				fStorageInputDocumentProvider = new StorageInputDocumentProvider();
+			}
+			setDocumentProvider(fStorageInputDocumentProvider);
+		}
+		else {
+			super.setDocumentProvider(input);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#updateContentDependentActions()
+	 */
+	protected void updateContentDependentActions() {
+		super.updateContentDependentActions();
+		if (isDebuggingAvailable()) {
+			setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK, getAction(ActionDefinitionIds.TOGGLE_BREAKPOINTS));
+		}
+		else {
+			// The Default Text Editor uses editorContribution to perform this
+			// mapping, but since it relies on the IEditorSite ID, it can't be
+			// relied on for MultiPageEditorParts. Instead, force the action
+			// registration manually.
+			setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK, new MarkerRulerAction(SSEUIMessages.getResourceBundle(), "Editor.ManageBookmarks.", this, getVerticalRuler(), IMarker.BOOKMARK, true)); //$NON-NLS-1$
+		}
+		fShowInTargetIds = createShowInTargetIds();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/EditBreakpointAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/EditBreakpointAction.java
new file mode 100644
index 0000000..15b988d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/EditBreakpointAction.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.debug;
+
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.dialogs.PropertyDialogAction;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+public class EditBreakpointAction extends BreakpointRulerAction {
+	protected IBreakpoint[] breakpoints = null;
+
+	/**
+	 * @param editor
+	 * @param rulerInfo
+	 */
+	public EditBreakpointAction(ITextEditor editor, IVerticalRuler rulerInfo) {
+		super(editor, rulerInfo);
+		setText(SSEUIMessages.EditBreakpointAction_0); //$NON-NLS-1$
+	}
+
+	public void run() {
+		PropertyDialogAction action = new PropertyDialogAction(getTextEditor().getEditorSite(), new ISelectionProvider() {
+			public void addSelectionChangedListener(ISelectionChangedListener listener) {
+				// do nothing
+			}
+
+			public ISelection getSelection() {
+				return new StructuredSelection(breakpoints);
+			}
+
+			public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+				// do nothing
+			}
+
+			public void setSelection(ISelection selection) {
+				// do nothing
+			}
+		});
+		action.run();
+	}
+
+	public void update() {
+		boolean enableThisAction = hasMarkers();
+		setEnabled(enableThisAction);
+		breakpoints = getBreakpoints(getMarkers());
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ManageBreakpointAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ManageBreakpointAction.java
new file mode 100644
index 0000000..8d7ff2d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ManageBreakpointAction.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.debug;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+/**
+ * ManageBreakpointAction - Enables and Disables
+ */
+public class ManageBreakpointAction extends BreakpointRulerAction {
+
+	protected IBreakpoint[] breakpoints = null;
+	private boolean doEnable = true;
+
+	/**
+	 * @param editor
+	 * @param rulerInfo
+	 */
+	public ManageBreakpointAction(ITextEditor editor, IVerticalRuler rulerInfo) {
+		super(editor, rulerInfo);
+		setEnabled(true);
+	}
+
+	/**
+	 *  
+	 */
+	protected void disableBreakpoints(IBreakpoint[] breakpoints) {
+		for (int i = 0; i < breakpoints.length; i++) {
+			try {
+				breakpoints[i].setEnabled(false);
+			} catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+	}
+
+	protected void enableBreakpoints(IBreakpoint[] breakpoints) {
+		for (int i = 0; i < breakpoints.length; i++) {
+			try {
+				breakpoints[i].setEnabled(true);
+			} catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+	}
+
+	public void run() {
+		if (doEnable)
+			enableBreakpoints(breakpoints);
+		else
+			disableBreakpoints(breakpoints);
+	}
+
+	public void update() {
+		// doEnable means "enable" instead of "disable"
+		doEnable = true;
+		breakpoints = getBreakpoints(getMarkers());
+		for (int i = 0; doEnable && i < breakpoints.length; i++) {
+			IBreakpoint breakpoint = breakpoints[i];
+			try {
+				if (breakpoint.isEnabled()) {
+					doEnable = false;
+				}
+			} catch (CoreException e) {
+				Logger.logException("breakpoint not responding to isEnabled: " + breakpoint, e); //$NON-NLS-1$
+			}
+		}
+		setEnabled(breakpoints != null && breakpoints.length > 0);
+		if (doEnable)
+			setText(SSEUIMessages.ManageBreakpointAction_0); //$NON-NLS-1$
+		else
+			setText(SSEUIMessages.ManageBreakpointAction_1); //$NON-NLS-1$
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ToggleBreakpointAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ToggleBreakpointAction.java
new file mode 100644
index 0000000..8cdb84f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ToggleBreakpointAction.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.IDocumentProviderExtension4;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.extension.BreakpointProviderBuilder;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider;
+
+/**
+ * ToggleBreakpointAction
+ */
+public class ToggleBreakpointAction extends BreakpointRulerAction {
+	IAction fFallbackAction;
+
+	/**
+	 * @param editor
+	 * @param rulerInfo
+	 */
+	public ToggleBreakpointAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
+		super(editor, rulerInfo);
+		setText(SSEUIMessages.ToggleBreakpointAction_0); //$NON-NLS-1$
+	}
+
+	public ToggleBreakpointAction(ITextEditor editor, IVerticalRulerInfo rulerInfo, IAction fallbackAction) {
+		this(editor, rulerInfo);
+		fFallbackAction = fallbackAction;
+	}
+
+	protected boolean createBreakpoints(int lineNumber) {
+		/*
+		 * Note: we'll always allow processing to continue, even for a "read
+		 * only" IStorageEditorInput, for the ActiveScript debugger. But this
+		 * means sometimes the ActiveScript provider might get an input from
+		 * CVS or something that is not related to debugging.
+		 */
+
+		ITextEditor editor = getTextEditor();
+		IEditorInput input = editor.getEditorInput();
+		IDocument document = editor.getDocumentProvider().getDocument(input);
+		if (document == null)
+			return false;
+
+		String contentType = getContentType(document);
+		IBreakpointProvider[] providers = BreakpointProviderBuilder.getInstance().getBreakpointProviders(editor, contentType, getFileExtension(input));
+
+		int pos = -1;
+		ISourceEditingTextTools tools = (ISourceEditingTextTools) editor.getAdapter(ISourceEditingTextTools.class);
+		if (tools != null) {
+			pos = tools.getCaretOffset();
+		}
+
+		final int n = providers.length;
+		List errors = new ArrayList(0);
+		for (int i = 0; i < n; i++) {
+			try {
+				if (Debug.debugBreakpoints)
+					System.out.println(providers[i].getClass().getName() + " adding breakpoint to line " + lineNumber); //$NON-NLS-1$
+				IStatus status = providers[i].addBreakpoint(document, input, lineNumber, pos);
+				if (status != null && !status.isOK()) {
+					errors.add(status);
+				}
+			}
+			catch (CoreException e) {
+				errors.add(e.getStatus());
+			}
+			catch (Exception t) {
+				Logger.logException("exception while adding breakpoint", t); //$NON-NLS-1$
+			}
+		}
+
+		IStatus status = null;
+		if (errors.size() > 0) {
+			Shell shell = editor.getSite().getShell();
+			if (errors.size() > 1) {
+				status = new MultiStatus(SSEUIPlugin.ID, IStatus.OK, (IStatus[]) errors.toArray(new IStatus[0]), SSEUIMessages.ManageBreakpoints_error_adding_message1, null); //$NON-NLS-1$
+			}
+			else {
+				status = (IStatus) errors.get(0);
+			}
+			if ((status.getSeverity() > IStatus.INFO) || (Platform.inDebugMode() && !status.isOK())) {
+				Platform.getLog(SSEUIPlugin.getDefault().getBundle()).log(status);
+			}
+			/*
+			 * Show for conditions more severe than INFO or when no
+			 * breakpoints were created
+			 */
+			if (status.getSeverity() > IStatus.INFO && getBreakpoints(getMarkers()).length < 1) {
+				ErrorDialog.openError(shell, SSEUIMessages.ManageBreakpoints_error_adding_title1, status.getMessage(), status); //$NON-NLS-1$ //$NON-NLS-2$
+				return false;
+			}
+		}
+		/*
+		 * Although no errors were reported, no breakpoints exist on this line
+		 * after having run the existing providers. Run the fallback action.
+		 */
+		if ((status == null || status.getSeverity() < IStatus.WARNING) && fFallbackAction != null && !hasMarkers()) {
+			if (fFallbackAction instanceof ISelectionListener) {
+				((ISelectionListener) fFallbackAction).selectionChanged(null, null);
+			}
+			fFallbackAction.run();
+		}
+		return true;
+	}
+
+	protected String getContentType(IDocument document) {
+		IModelManager mgr = StructuredModelManager.getModelManager();
+		String contentType = null;
+
+		IDocumentProvider provider = fTextEditor.getDocumentProvider();
+		if (provider instanceof IDocumentProviderExtension4) {
+			try {
+				IContentType type = ((IDocumentProviderExtension4) provider).getContentType(fTextEditor.getEditorInput());
+				if (type != null)
+					contentType = type.getId();
+			}
+			catch (CoreException e) {
+				/*
+				 * A failure accessing the underlying store really isn't
+				 * interesting, although it can be a problem for
+				 * IStorageEditorInputs.
+				 */
+			}
+		}
+
+		if (contentType == null) {
+			IStructuredModel model = null;
+			try {
+				model = mgr.getExistingModelForRead(document);
+				if (model != null) {
+					contentType = model.getContentTypeIdentifier();
+				}
+			}
+			finally {
+				if (model != null) {
+					model.releaseFromRead();
+				}
+			}
+		}
+		return contentType;
+	}
+
+	protected void removeBreakpoints(int lineNumber) {
+		IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
+		IBreakpoint[] breakpoints = getBreakpoints(getMarkers());
+		for (int i = 0; i < breakpoints.length; i++) {
+			try {
+				breakpointManager.removeBreakpoint(breakpoints[i], true);
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+	}
+
+	public void run() {
+		int lineNumber = fRulerInfo.getLineOfLastMouseButtonActivity() + 1;
+		boolean doAdd = !hasMarkers();
+		if (doAdd)
+			createBreakpoints(lineNumber);
+		else
+			removeBreakpoints(lineNumber);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IUpdate#update()
+	 */
+	public void update() {
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#getImageDescriptor()
+	 * overriding for lazy loading
+	 */
+	public ImageDescriptor getImageDescriptor() {
+		
+		ImageDescriptor image = super.getImageDescriptor();
+		if (image == null){
+			image = DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_OBJS_BREAKPOINT);
+			setImageDescriptor(image);
+		}
+		return image;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ToggleBreakpointsTarget.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ToggleBreakpointsTarget.java
new file mode 100644
index 0000000..57c8c5e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/debug/ToggleBreakpointsTarget.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author nsd
+ */
+public class ToggleBreakpointsTarget implements IToggleBreakpointsTarget {
+	static final IToggleBreakpointsTarget instance = new ToggleBreakpointsTarget();
+
+	public static IToggleBreakpointsTarget getInstance() {
+		return instance;
+	}
+
+	/**
+	 * 
+	 */
+	private ToggleBreakpointsTarget() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleLineBreakpoints(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public boolean canToggleLineBreakpoints(IWorkbenchPart part, ISelection selection) {
+		ITextEditor editor = (ITextEditor) part.getAdapter(ITextEditor.class);
+		if (selection instanceof ITextSelection) {
+			ITextSelection textSelection = (ITextSelection) selection;
+			IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
+			if (document != null && textSelection.getOffset() > -1) {
+				int lineNumber = -1;
+				try {
+					lineNumber = document.getLineOfOffset(textSelection.getOffset());
+				}
+				catch (BadLocationException e) {
+				}
+				if (lineNumber >= 0) {
+					ToggleBreakpointAction toggler = new ToggleBreakpointAction(editor, null);
+					toggler.update();
+					return toggler.isEnabled();
+				}
+			}
+		}
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleMethodBreakpoints(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public boolean canToggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleWatchpoints(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public boolean canToggleWatchpoints(IWorkbenchPart part, ISelection selection) {
+		return false;
+	}
+
+	private IBreakpoint[] getBreakpoints(IResource resource, IDocument document, AbstractMarkerAnnotationModel model, int lineNumber) {
+		List markers = new ArrayList();
+		if (resource != null && model != null && resource.exists()) {
+			try {
+				IMarker[] allMarkers = resource.findMarkers(IBreakpoint.LINE_BREAKPOINT_MARKER, true, IResource.DEPTH_ZERO);
+				if (allMarkers != null) {
+					for (int i = 0; i < allMarkers.length; i++) {
+						Position p = model.getMarkerPosition(allMarkers[i]);
+						int markerLine = -1;
+						try {
+							markerLine = document.getLineOfOffset(p.getOffset());
+						}
+						catch (BadLocationException e1) {
+						}
+						if (markerLine == lineNumber) {
+							markers.add(allMarkers[i]);
+						}
+					}
+				}
+			}
+			catch (CoreException x) {
+			}
+		}
+		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
+		List breakpoints = new ArrayList(markers.size());
+		for (int i = 0; i < markers.size(); i++) {
+			IBreakpoint breakpoint = manager.getBreakpoint((IMarker) markers.get(i));
+			if (breakpoint != null) {
+				breakpoints.add(breakpoint);
+			}
+		}
+		return (IBreakpoint[]) breakpoints.toArray(new IBreakpoint[0]);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleLineBreakpoints(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
+		ITextEditor editor = (ITextEditor) part.getAdapter(ITextEditor.class);
+		if (selection instanceof ITextSelection) {
+			ITextSelection textSelection = (ITextSelection) selection;
+			IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
+			int lineNumber = -1;
+			try {
+				lineNumber = document.getLineOfOffset(textSelection.getOffset());
+			}
+			catch (BadLocationException e) {
+			}
+			if (lineNumber >= 0) {
+				ToggleBreakpointAction toggler = new ToggleBreakpointAction(editor, null);
+				toggler.update();
+				if (toggler.isEnabled()) {
+					IResource resource = toggler.getResource();
+					AbstractMarkerAnnotationModel model = toggler.getAnnotationModel();
+					IBreakpoint[] breakpoints = getBreakpoints(resource, document, model, lineNumber);
+					if (breakpoints.length > 0) {
+						IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
+						for (int i = 0; i < breakpoints.length; i++) {
+							breakpoints[i].getMarker().delete();
+							breakpointManager.removeBreakpoint(breakpoints[i], true);
+						}
+					}
+					else {
+						toggler.createBreakpoints(lineNumber + 1);
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleMethodBreakpoints(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void toggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleWatchpoints(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void toggleWatchpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/HTML2TextReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/HTML2TextReader.java
new file mode 100644
index 0000000..27ac8cb
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/HTML2TextReader.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.derived;
+
+import java.io.IOException;
+import java.io.PushbackReader;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+
+/*
+ * Copied from org.eclipse.jdt.internal.ui.text.HTML2TextReader Modifications
+ * were made to add br/ tag and fix warnings
+ */
+/**
+ * Reads the text contents from a reader of HTML contents and translates the
+ * tags or cut them out.
+ */
+public class HTML2TextReader extends SubstitutionTextReader {
+
+	private static final String EMPTY_STRING= ""; //$NON-NLS-1$
+	private static final Map fgEntityLookup;
+	private static final Set fgTags;
+
+	static {
+
+		fgTags= new HashSet();
+		fgTags.add("b"); //$NON-NLS-1$
+		fgTags.add("br"); //$NON-NLS-1$
+		fgTags.add("br/");//$NON-NLS-1$
+		fgTags.add("h5"); //$NON-NLS-1$
+		fgTags.add("p"); //$NON-NLS-1$
+		fgTags.add("dl"); //$NON-NLS-1$
+		fgTags.add("dt"); //$NON-NLS-1$
+		fgTags.add("dd"); //$NON-NLS-1$
+		fgTags.add("li"); //$NON-NLS-1$
+		fgTags.add("ul"); //$NON-NLS-1$
+		fgTags.add("pre"); //$NON-NLS-1$
+
+		fgEntityLookup= new HashMap(7);
+		fgEntityLookup.put("lt", "<"); //$NON-NLS-1$ //$NON-NLS-2$
+		fgEntityLookup.put("gt", ">"); //$NON-NLS-1$ //$NON-NLS-2$
+		fgEntityLookup.put("nbsp", " "); //$NON-NLS-1$ //$NON-NLS-2$
+		fgEntityLookup.put("amp", "&"); //$NON-NLS-1$ //$NON-NLS-2$
+		fgEntityLookup.put("circ", "^"); //$NON-NLS-1$ //$NON-NLS-2$
+		fgEntityLookup.put("tilde", "~"); //$NON-NLS-2$ //$NON-NLS-1$
+		fgEntityLookup.put("quot", "\"");		 //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	private int fCounter= 0;
+	private TextPresentation fTextPresentation;
+	private int fBold= 0;
+	private int fStartOffset= -1;
+	private boolean fInParagraph= false;
+	private boolean fIsPreformattedText= false;
+
+	/**
+	 * Transforms the html text from the reader to formatted text.
+	 * @param presentation If not <code>null</code>, formattings will be applied to
+	 * the presentation.
+	*/
+	public HTML2TextReader(Reader reader, TextPresentation presentation) {
+		super(new PushbackReader(reader));
+		fTextPresentation= presentation;
+	}
+
+	public int read() throws IOException {
+		int c= super.read();
+		if (c != -1)
+			++ fCounter;
+		return c;
+	}
+
+	protected void startBold() {
+		if (fBold == 0)
+			fStartOffset= fCounter;
+		++ fBold;
+	}
+
+	protected void startPreformattedText() {
+		fIsPreformattedText= true;
+		setSkipWhitespace(false);
+	}
+
+	protected void stopPreformattedText() {
+		fIsPreformattedText= false;
+		setSkipWhitespace(true);
+	}
+
+	protected void stopBold() {
+		-- fBold;
+		if (fBold == 0) {
+			if (fTextPresentation != null) {
+				fTextPresentation.addStyleRange(new StyleRange(fStartOffset, fCounter - fStartOffset, null, null, SWT.BOLD));
+			}
+			fStartOffset= -1;
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jdt.internal.ui.text.SubstitutionTextReader#computeSubstitution(int)
+	 */
+	protected String computeSubstitution(int c) throws IOException {
+
+		if (c == '<')
+			return  processHTMLTag();
+		else if (c == '&')
+			return processEntity();
+		else if (fIsPreformattedText)
+			return processPreformattedText(c);
+
+		return null;
+	}
+
+	private String html2Text(String html) {
+
+		if (html == null || html.length() == 0)
+			return EMPTY_STRING;
+
+		String tag= html;
+		if ('/' == tag.charAt(0))
+			tag= tag.substring(1);
+
+		if (!fgTags.contains(tag))
+			return EMPTY_STRING;
+
+
+		if ("pre".equals(html)) { //$NON-NLS-1$
+			startPreformattedText();
+			return EMPTY_STRING;
+		}
+
+		if ("/pre".equals(html)) { //$NON-NLS-1$
+			stopPreformattedText();
+			return EMPTY_STRING;
+		}
+
+		if (fIsPreformattedText)
+			return EMPTY_STRING;
+
+		if ("b".equals(html)) { //$NON-NLS-1$
+			startBold();
+			return EMPTY_STRING;
+		}
+
+		if ("h5".equals(html) || "dt".equals(html)) { //$NON-NLS-1$ //$NON-NLS-2$
+			startBold();
+			return EMPTY_STRING;
+		}
+
+		if ("dl".equals(html)) //$NON-NLS-1$
+			return LINE_DELIM;
+
+		if ("dd".equals(html)) //$NON-NLS-1$
+			return "\t"; //$NON-NLS-1$
+
+		if ("li".equals(html)) //$NON-NLS-1$
+			return LINE_DELIM + "\t" + "- "; //$NON-NLS-1$ //$NON-NLS-2$
+
+		if ("/b".equals(html)) { //$NON-NLS-1$
+			stopBold();
+			return EMPTY_STRING;
+		}
+
+		if ("p".equals(html))  { //$NON-NLS-1$
+			fInParagraph= true;
+			return LINE_DELIM;
+		}
+
+		if ("br".equals(html) || "br/".equals(html)) //$NON-NLS-1$ //$NON-NLS-2$
+			return LINE_DELIM;
+
+		if ("/p".equals(html))  { //$NON-NLS-1$
+			boolean inParagraph= fInParagraph;
+			fInParagraph= false;
+			return inParagraph ? EMPTY_STRING : LINE_DELIM;
+		}
+
+		if ("/h5".equals(html) || "/dt".equals(html)) { //$NON-NLS-1$ //$NON-NLS-2$
+			stopBold();
+			return LINE_DELIM;
+		}
+
+		if ("/dd".equals(html)) //$NON-NLS-1$
+			return LINE_DELIM;
+
+		return EMPTY_STRING;
+	}
+
+	/*
+	 * A '<' has been read. Process a html tag
+	 */
+	private String processHTMLTag() throws IOException {
+
+		StringBuffer buf= new StringBuffer();
+		int ch;
+		do {
+
+			ch= nextChar();
+
+			while (ch != -1 && ch != '>') {
+				buf.append(Character.toLowerCase((char) ch));
+				ch= nextChar();
+				if (ch == '"'){
+					buf.append(Character.toLowerCase((char) ch));
+					ch= nextChar();
+					while (ch != -1 && ch != '"'){
+						buf.append(Character.toLowerCase((char) ch));
+						ch= nextChar();
+					}
+				}
+				if (ch == '<'){
+					unread(ch);
+					return '<' + buf.toString();
+				}
+			}
+
+			if (ch == -1)
+				return null;
+
+			int tagLen= buf.length();
+			// needs special treatment for comments
+			if ((tagLen >= 3 && "!--".equals(buf.substring(0, 3))) //$NON-NLS-1$
+				&& !(tagLen >= 5 && "--".equals(buf.substring(tagLen - 2)))) { //$NON-NLS-1$
+				// unfinished comment
+				buf.append(ch);
+			} else {
+				break;
+			}
+		} while (true);
+
+		return html2Text(buf.toString());
+	}
+
+	private String processPreformattedText(int c) {
+		if  (c == '\r' || c == '\n')
+			fCounter++;
+		return null;
+	}
+
+
+	private void unread(int ch) throws IOException {
+		((PushbackReader) getReader()).unread(ch);
+	}
+
+	protected String entity2Text(String symbol) {
+		if (symbol.length() > 1 && symbol.charAt(0) == '#') {
+			int ch;
+			try {
+				if (symbol.charAt(1) == 'x') {
+					ch= Integer.parseInt(symbol.substring(2), 16);
+				} else {
+					ch= Integer.parseInt(symbol.substring(1), 10);
+				}
+				return EMPTY_STRING + (char)ch;
+			} catch (NumberFormatException e) {
+				// log problem?
+			}
+		} else {
+			String str= (String) fgEntityLookup.get(symbol);
+			if (str != null) {
+				return str;
+			}
+		}
+		return "&" + symbol; // not found //$NON-NLS-1$
+	}
+
+	/*
+	 * A '&' has been read. Process a entity
+	 */
+	private String processEntity() throws IOException {
+		StringBuffer buf= new StringBuffer();
+		int ch= nextChar();
+		while (Character.isLetterOrDigit((char)ch) || ch == '#') {
+			buf.append((char) ch);
+			ch= nextChar();
+		}
+
+		if (ch == ';')
+			return entity2Text(buf.toString());
+
+		buf.insert(0, '&');
+		if (ch != -1)
+			buf.append((char) ch);
+		return buf.toString();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/HTMLTextPresenter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/HTMLTextPresenter.java
new file mode 100644
index 0000000..d56b2d5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/HTMLTextPresenter.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.derived;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Iterator;
+
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Drawable;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+/*
+ * Copied from org.eclipse.jdt.internal.ui.text.HTMLTextPresenter
+ * Modifications were made to use own Logger to log exception, and the
+ * ellipses constant
+ */
+public class HTMLTextPresenter implements DefaultInformationControl.IInformationPresenter, DefaultInformationControl.IInformationPresenterExtension {
+	private static final String ELLIPSES = "..."; //$NON-NLS-1$
+	private static final String LINE_DELIM = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+	private int fCounter;
+	private boolean fEnforceUpperLineLimit;
+
+	public HTMLTextPresenter(boolean enforceUpperLineLimit) {
+		super();
+		fEnforceUpperLineLimit = enforceUpperLineLimit;
+	}
+
+	public HTMLTextPresenter() {
+		this(true);
+	}
+
+	protected Reader createReader(String hoverInfo, TextPresentation presentation) {
+		return new HTML2TextReader(new StringReader(hoverInfo), presentation);
+	}
+
+	protected void adaptTextPresentation(TextPresentation presentation, int offset, int insertLength) {
+
+		int yoursStart = offset;
+		int yoursEnd = offset + insertLength - 1;
+		yoursEnd = Math.max(yoursStart, yoursEnd);
+
+		Iterator e = presentation.getAllStyleRangeIterator();
+		while (e.hasNext()) {
+
+			StyleRange range = (StyleRange) e.next();
+
+			int myStart = range.start;
+			int myEnd = range.start + range.length - 1;
+			myEnd = Math.max(myStart, myEnd);
+
+			if (myEnd < yoursStart)
+				continue;
+
+			if (myStart < yoursStart)
+				range.length += insertLength;
+			else
+				range.start += insertLength;
+		}
+	}
+
+	private void append(StringBuffer buffer, String string, TextPresentation presentation) {
+
+		int length = string.length();
+		buffer.append(string);
+
+		if (presentation != null)
+			adaptTextPresentation(presentation, fCounter, length);
+
+		fCounter += length;
+	}
+
+	private String getIndent(String line) {
+		int length = line.length();
+
+		int i = 0;
+		while (i < length && Character.isWhitespace(line.charAt(i)))
+			++i;
+
+		return (i == length ? line : line.substring(0, i)) + " "; //$NON-NLS-1$
+	}
+
+	/**
+	 * @see IHoverInformationPresenter#updatePresentation(Display display,
+	 *      String, TextPresentation, int, int)
+	 * @deprecated Use {@link #updatePresentation(Drawable, String, TextPresentation, int, int)}
+	 *             instead
+	 */
+	public String updatePresentation(Display display, String hoverInfo, TextPresentation presentation, int maxWidth, int maxHeight) {
+		return updatePresentation((Drawable)display, hoverInfo, presentation, maxWidth, maxHeight);
+	}
+
+	/*
+	 * @see IHoverInformationPresenterExtension#updatePresentation(Drawable drawable, String, TextPresentation, int, int)
+	 * @since 3.2
+	 */
+	public String updatePresentation(Drawable drawable, String hoverInfo, TextPresentation presentation, int maxWidth, int maxHeight) {
+
+		if (hoverInfo == null)
+			return null;
+
+		GC gc = new GC(drawable);
+		try {
+
+			StringBuffer buffer = new StringBuffer();
+			int maxNumberOfLines = Math.round(maxHeight / gc.getFontMetrics().getHeight());
+
+			fCounter = 0;
+			LineBreakingReader reader = new LineBreakingReader(createReader(hoverInfo, presentation), gc, maxWidth);
+
+			boolean lastLineFormatted = false;
+			String lastLineIndent = null;
+
+			String line = reader.readLine();
+			boolean lineFormatted = reader.isFormattedLine();
+			boolean firstLineProcessed = false;
+
+			while (line != null) {
+
+				if (fEnforceUpperLineLimit && maxNumberOfLines <= 0)
+					break;
+
+				if (firstLineProcessed) {
+					if (!lastLineFormatted)
+						append(buffer, LINE_DELIM, null);
+					else {
+						append(buffer, LINE_DELIM, presentation);
+						if (lastLineIndent != null)
+							append(buffer, lastLineIndent, presentation);
+					}
+				}
+
+				append(buffer, line, null);
+				firstLineProcessed = true;
+
+				lastLineFormatted = lineFormatted;
+				if (!lineFormatted)
+					lastLineIndent = null;
+				else if (lastLineIndent == null)
+					lastLineIndent = getIndent(line);
+
+				line = reader.readLine();
+				lineFormatted = reader.isFormattedLine();
+
+				maxNumberOfLines--;
+			}
+
+			if (line != null && buffer.length() > 0) {
+				append(buffer, LINE_DELIM, lineFormatted ? presentation : null);
+				append(buffer, ELLIPSES, presentation);
+			}
+
+			return trim(buffer, presentation);
+
+		} catch (IOException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			return null;
+
+		} finally {
+			gc.dispose();
+		}
+	}
+
+	private String trim(StringBuffer buffer, TextPresentation presentation) {
+
+		int length = buffer.length();
+
+		int end = length - 1;
+		while (end >= 0 && Character.isWhitespace(buffer.charAt(end)))
+			--end;
+
+		if (end == -1)
+			return ""; //$NON-NLS-1$
+
+		if (end < length - 1)
+			buffer.delete(end + 1, length);
+		else
+			end = length;
+
+		int start = 0;
+		while (start < end && Character.isWhitespace(buffer.charAt(start)))
+			++start;
+
+		buffer.delete(0, start);
+		presentation.setResultWindow(new Region(start, buffer.length()));
+		return buffer.toString();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/LineBreakingReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/LineBreakingReader.java
new file mode 100644
index 0000000..cea5449
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/LineBreakingReader.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.derived;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import com.ibm.icu.text.BreakIterator;
+
+import org.eclipse.swt.graphics.GC;
+
+/**
+ * Copied from org.eclipse.jdt.internal.ui.text.LineBreakingReader.
+ * Modifications were made to fix warnings.
+ */
+/*
+ * Not a real reader. Could change if requested
+ */
+public class LineBreakingReader {
+	private GC fGC;
+
+	private String fLine;
+
+	private BreakIterator fLineBreakIterator;
+	private int fMaxWidth;
+	private int fOffset;
+
+
+	private BufferedReader fReader;
+
+	/**
+	 * Creates a reader that breaks an input text to fit in a given width.
+	 * 
+	 * @param reader
+	 *            Reader of the input text
+	 * @param gc
+	 *            The graphic context that defines the currently used font
+	 *            sizes
+	 * @param maxLineWidth
+	 *            The max width (pixes) where the text has to fit in
+	 */
+	public LineBreakingReader(Reader reader, GC gc, int maxLineWidth) {
+		fReader = new BufferedReader(reader);
+		fGC = gc;
+		fMaxWidth = maxLineWidth;
+		fOffset = 0;
+		fLine = null;
+		fLineBreakIterator = BreakIterator.getLineInstance();
+	}
+
+	private int findNextBreakOffset(int currOffset) {
+		int currWidth = 0;
+		int nextOffset = fLineBreakIterator.following(currOffset);
+		while (nextOffset != BreakIterator.DONE) {
+			String word = fLine.substring(currOffset, nextOffset);
+			int wordWidth = fGC.textExtent(word).x;
+			int nextWidth = wordWidth + currWidth;
+			if (nextWidth > fMaxWidth) {
+				if (currWidth > 0) {
+					return currOffset;
+				}
+				return nextOffset;
+			}
+			currWidth = nextWidth;
+			currOffset = nextOffset;
+			nextOffset = fLineBreakIterator.next();
+		}
+		return nextOffset;
+	}
+
+	private int findWordBegin(int idx) {
+		while (idx < fLine.length() && Character.isWhitespace(fLine.charAt(idx))) {
+			idx++;
+		}
+		return idx;
+	}
+
+	public boolean isFormattedLine() {
+		return fLine != null;
+	}
+
+	/**
+	 * Reads the next line. The lengths of the line will not exceed the gived
+	 * maximum width.
+	 */
+	public String readLine() throws IOException {
+		if (fLine == null) {
+			String line = fReader.readLine();
+			if (line == null)
+				return null;
+
+			int lineLen = fGC.textExtent(line).x;
+			if (lineLen < fMaxWidth) {
+				return line;
+			}
+			fLine = line;
+			fLineBreakIterator.setText(line);
+			fOffset = 0;
+		}
+		int breakOffset = findNextBreakOffset(fOffset);
+		String res;
+		if (breakOffset != BreakIterator.DONE) {
+			res = fLine.substring(fOffset, breakOffset);
+			fOffset = findWordBegin(breakOffset);
+			if (fOffset == fLine.length()) {
+				fLine = null;
+			}
+		} else {
+			res = fLine.substring(fOffset);
+			fLine = null;
+		}
+		return res;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/SingleCharReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/SingleCharReader.java
new file mode 100644
index 0000000..56945ff
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/SingleCharReader.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.derived;
+
+import java.io.IOException;
+import java.io.Reader;
+
+/*
+ * Copied from org.eclipse.jdt.internal.corext.javadoc.SingleCharReader.
+ * Modification was made to fix statement unnecessarily nested within else
+ * clause warning in read(..).
+ */
+public abstract class SingleCharReader extends Reader {
+
+	/**
+	 * @see Reader#read()
+	 */
+	public abstract int read() throws IOException;
+
+	/**
+	 * @see Reader#read(char[],int,int)
+	 */
+	public int read(char cbuf[], int off, int len) throws IOException {
+		int end = off + len;
+		for (int i = off; i < end; i++) {
+			int ch = read();
+			if (ch == -1) {
+				if (i == off) {
+					return -1;
+				}
+				return i - off;
+			}
+			cbuf[i] = (char) ch;
+		}
+		return len;
+	}
+
+	/**
+	 * @see Reader#ready()
+	 */
+	public boolean ready() throws IOException {
+		return true;
+	}
+
+	/**
+	 * Gets the content as a String
+	 */
+	public String getString() throws IOException {
+		StringBuffer buf = new StringBuffer();
+		int ch;
+		while ((ch = read()) != -1) {
+			buf.append((char) ch);
+		}
+		return buf.toString();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/SubstitutionTextReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/SubstitutionTextReader.java
new file mode 100644
index 0000000..4d2a78f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/derived/SubstitutionTextReader.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.derived;
+
+import java.io.IOException;
+import java.io.Reader;
+
+/*
+ * Copied from org.eclipse.jdt.internal.ui.text.SubstitutionTextReader.
+ * Modifications were made to read() to allow whitespaces and fixed statement
+ * unnecessarily nested within else clause warning in nextChar()
+ */
+/**
+ * Reads the text contents from a reader and computes for each character a
+ * potential substitution. The substitution may eat more characters than only
+ * the one passed into the computation routine.
+ */
+public abstract class SubstitutionTextReader extends SingleCharReader {
+
+	protected static final String LINE_DELIM = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+	private Reader fReader;
+	protected boolean fWasWhiteSpace;
+	private int fCharAfterWhiteSpace;
+
+	/**
+	 * Tells whether white space characters are skipped.
+	 */
+	private boolean fSkipWhiteSpace = true;
+
+	private boolean fReadFromBuffer;
+	private StringBuffer fBuffer;
+	private int fIndex;
+
+
+	protected SubstitutionTextReader(Reader reader) {
+		fReader = reader;
+		fBuffer = new StringBuffer();
+		fIndex = 0;
+		fReadFromBuffer = false;
+		fCharAfterWhiteSpace = -1;
+		fWasWhiteSpace = true;
+	}
+
+	/**
+	 * Implement to compute the substitution for the given character and if
+	 * necessary subsequent characters. Use <code>nextChar</code> to read
+	 * subsequent characters.
+	 */
+	protected abstract String computeSubstitution(int c) throws IOException;
+
+	/**
+	 * Returns the internal reader.
+	 */
+	protected Reader getReader() {
+		return fReader;
+	}
+
+	/**
+	 * Returns the next character.
+	 */
+	protected int nextChar() throws IOException {
+		fReadFromBuffer = (fBuffer.length() > 0);
+		if (fReadFromBuffer) {
+			char ch = fBuffer.charAt(fIndex++);
+			if (fIndex >= fBuffer.length()) {
+				fBuffer.setLength(0);
+				fIndex = 0;
+			}
+			return ch;
+		}
+		int ch = fCharAfterWhiteSpace;
+		if (ch == -1) {
+			ch = fReader.read();
+		}
+		if (fSkipWhiteSpace && Character.isWhitespace((char) ch)) {
+			do {
+				ch = fReader.read();
+			} while (Character.isWhitespace((char) ch));
+			if (ch != -1) {
+				fCharAfterWhiteSpace = ch;
+				return ' ';
+			}
+		} else {
+			fCharAfterWhiteSpace = -1;
+		}
+		return ch;
+	}
+
+	/**
+	 * @see Reader#read()
+	 */
+	public int read() throws IOException {
+		int c;
+		do {
+
+			c = nextChar();
+			while (!fReadFromBuffer) {
+				String s = computeSubstitution(c);
+				if (s == null)
+					break;
+				if (s.length() > 0)
+					fBuffer.insert(0, s);
+				c = nextChar();
+			}
+
+		} while (fSkipWhiteSpace && fWasWhiteSpace && ((c == ' ') && !fReadFromBuffer));
+		/*
+		 * SSE: For above and below check, if whitespace is read from buffer,
+		 * do not skip
+		 */
+		fWasWhiteSpace = ((c == ' ' && !fReadFromBuffer) || c == '\r' || c == '\n');
+		return c;
+	}
+
+	/**
+	 * @see Reader#ready()
+	 */
+	public boolean ready() throws IOException {
+		return fReader.ready();
+	}
+
+	/**
+	 * @see Reader#close()
+	 */
+	public void close() throws IOException {
+		fReader.close();
+	}
+
+	/**
+	 * @see Reader#reset()
+	 */
+	public void reset() throws IOException {
+		fReader.reset();
+		fWasWhiteSpace = true;
+		fCharAfterWhiteSpace = -1;
+		fBuffer.setLength(0);
+		fIndex = 0;
+	}
+
+	protected final void setSkipWhitespace(boolean state) {
+		fSkipWhiteSpace = state;
+	}
+
+	protected final boolean isSkippingWhitespace() {
+		return fSkipWhiteSpace;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/edit/util/SharedEditorPluginImageHelper.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/edit/util/SharedEditorPluginImageHelper.java
new file mode 100644
index 0000000..3a9b0c9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/edit/util/SharedEditorPluginImageHelper.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.edit.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
+
+
+public class SharedEditorPluginImageHelper {
+	public static final String IMG_DLCL_COLLAPSEALL = EditorPluginImages.IMG_DLCL_COLLAPSEALL;
+	public static final String IMG_DLCL_DELETE = EditorPluginImages.IMG_DLCL_DELETE;
+	public static final String IMG_DLCL_SYNCED = EditorPluginImages.IMG_DLCL_SYNCED;
+	public static final String IMG_ELCL_COLLAPSEALL = EditorPluginImages.IMG_ELCL_COLLAPSEALL;
+	public static final String IMG_ELCL_DELETE = EditorPluginImages.IMG_ELCL_DELETE;
+	public static final String IMG_ELCL_SYNCED = EditorPluginImages.IMG_ELCL_SYNCED;
+
+	/**
+	 * Retrieves the specified image from the source editor plugin's image
+	 * registry. Note: The returned <code>Image</code> is managed by the
+	 * workbench; clients must <b>not </b> dispose of the returned image.
+	 * 
+	 * @param symbolicName
+	 *            the symbolic name of the image; there are constants declared
+	 *            in this class for build-in images that come with the source
+	 *            editor
+	 * @return the image, or <code>null</code> if not found
+	 */
+	public static Image getImage(String symbolicName) {
+		return EditorPluginImageHelper.getInstance().getImage(symbolicName);
+	}
+
+	/**
+	 * Retrieves the image descriptor for specified image from the source
+	 * editor plugin's image registry. Unlike <code>Image</code>s, image
+	 * descriptors themselves do not need to be disposed.
+	 * 
+	 * @param symbolicName
+	 *            the symbolic name of the image; there are constants declared
+	 *            in this interface for build-in images that come with the
+	 *            source editor
+	 * @return the image descriptor, or <code>null</code> if not found
+	 */
+	public static ImageDescriptor getImageDescriptor(String symbolicName) {
+		return EditorPluginImageHelper.getInstance().getImageDescriptor(symbolicName);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorModelUtil.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorModelUtil.java
new file mode 100644
index 0000000..be61761
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorModelUtil.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.editor;
+
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryProvider;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistry;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistryExtension;
+import org.eclipse.wst.sse.ui.internal.util.Assert;
+
+
+/**
+ * INTERNAL USAGE ONLY
+ * 
+ * @author nsd
+ */
+public class EditorModelUtil {
+
+	public static void addFactoriesTo(final IStructuredModel structuredModel) {
+		if (structuredModel == null)
+			return;
+		
+		AdapterFactoryRegistry adapterRegistry = SSEUIPlugin.getDefault().getAdapterFactoryRegistry();
+		String contentTypeId = structuredModel.getContentTypeIdentifier();
+
+		Iterator adapterFactoryProviders = null;
+		if (adapterRegistry instanceof AdapterFactoryRegistryExtension) {
+			adapterFactoryProviders = ((AdapterFactoryRegistryExtension) adapterRegistry).getAdapterFactories(contentTypeId);
+		}
+		else {
+			adapterFactoryProviders = adapterRegistry.getAdapterFactories();
+		}
+
+		FactoryRegistry factoryRegistry = structuredModel.getFactoryRegistry();
+		Assert.isNotNull(factoryRegistry, SSEUIMessages.EditorModelUtil_0); //$NON-NLS-1$
+		// Add all those appropriate for this particular type of content
+		while (adapterFactoryProviders.hasNext()) {
+			try {
+				final AdapterFactoryProvider provider = (AdapterFactoryProvider) adapterFactoryProviders.next();
+				/*
+				 * ContentType might have already been checked above, this
+				 * check is here for backwards compatability for those that
+				 * don't specify a content type
+				 */
+				if (provider.isFor(structuredModel.getModelHandler())) {
+					SafeRunner.run(new SafeRunnable(SSEUIMessages.EditorModelUtil_1) { //$NON-NLS-1$
+									public void run() {
+										provider.addAdapterFactories(structuredModel);
+									}
+								});
+				}
+			}
+			catch (Exception e) {
+				Logger.logException(e);
+			}
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorPluginImageHelper.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorPluginImageHelper.java
new file mode 100644
index 0000000..f78633f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorPluginImageHelper.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.editor;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+
+/**
+ * Helper class to handle images provided by this plug-in.
+ * 
+ * NOTE: For internal use only. For images used externally, please use the
+ * Shared***ImageHelper class instead.
+ * 
+ * @author amywu
+ */
+public class EditorPluginImageHelper {
+	private static EditorPluginImageHelper instance = null;
+
+	/**
+	 * Gets the instance.
+	 * 
+	 * @return Returns a EditorPluginImageHelper
+	 */
+	public synchronized static EditorPluginImageHelper getInstance() {
+		if (instance == null)
+			instance = new EditorPluginImageHelper();
+		return instance;
+	}
+
+	//	 save a descriptor for each image
+	private HashMap fImageDescRegistry = null;
+	private final String PLUGINID = SSEUIPlugin.ID;
+
+	/**
+	 * Creates an image from the given resource and adds the image to the
+	 * image registry.
+	 * 
+	 * @param resource
+	 * @return Image
+	 */
+	private Image createImage(String resource) {
+		ImageDescriptor desc = getImageDescriptor(resource);
+		Image image = null;
+
+		if (desc != null) {
+			image = desc.createImage();
+			// dont add the missing image descriptor image to the image
+			// registry
+			if (!desc.equals(ImageDescriptor.getMissingImageDescriptor()))
+				getImageRegistry().put(resource, image);
+		}
+		return image;
+	}
+
+	/**
+	 * Creates an image descriptor from the given imageFilePath and adds the
+	 * image descriptor to the image descriptor registry. If an image
+	 * descriptor could not be created, the default "missing" image descriptor
+	 * is returned but not added to the image descriptor registry.
+	 * 
+	 * @param imageFilePath
+	 * @return ImageDescriptor image descriptor for imageFilePath or default
+	 *         "missing" image descriptor if resource could not be found
+	 */
+	private ImageDescriptor createImageDescriptor(String imageFilePath) {
+		ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGINID, imageFilePath);
+		if (imageDescriptor != null) {
+			getImageDescriptorRegistry().put(imageFilePath, imageDescriptor);
+		} else {
+			imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
+		}
+
+		return imageDescriptor;
+	}
+
+	/**
+	 * Retrieves the image associated with resource from the image registry.
+	 * If the image cannot be retrieved, attempt to find and load the image at
+	 * the location specified in resource.
+	 * 
+	 * @param resource
+	 *            the image to retrieve
+	 * @return Image the image associated with resource or null if one could
+	 *         not be found
+	 */
+	public Image getImage(String resource) {
+		Image image = getImageRegistry().get(resource);
+		if (image == null) {
+			// create an image
+			image = createImage(resource);
+		}
+		return image;
+	}
+
+	/**
+	 * Retrieves the image descriptor associated with resource from the image
+	 * descriptor registry. If the image descriptor cannot be retrieved,
+	 * attempt to find and load the image descriptor at the location specified
+	 * in resource.
+	 * 
+	 * @param resource
+	 *            the image descriptor to retrieve
+	 * @return ImageDescriptor the image descriptor assocated with resource or
+	 *         the default "missing" image descriptor if one could not be
+	 *         found
+	 */
+	public ImageDescriptor getImageDescriptor(String resource) {
+		ImageDescriptor imageDescriptor = null;
+		Object o = getImageDescriptorRegistry().get(resource);
+		if (o == null) {
+			//create a descriptor
+			imageDescriptor = createImageDescriptor(resource);
+		} else {
+			imageDescriptor = (ImageDescriptor) o;
+		}
+		return imageDescriptor;
+	}
+
+	/**
+	 * Returns the image descriptor registry for this plugin.
+	 * 
+	 * @return HashMap - image descriptor registry for this plugin
+	 */
+	private HashMap getImageDescriptorRegistry() {
+		if (fImageDescRegistry == null)
+			fImageDescRegistry = new HashMap();
+		return fImageDescRegistry;
+	}
+
+	/**
+	 * Returns the image registry for this plugin.
+	 * 
+	 * @return ImageRegistry - image registry for this plugin
+	 */
+	private ImageRegistry getImageRegistry() {
+		return JFaceResources.getImageRegistry();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorPluginImages.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorPluginImages.java
new file mode 100644
index 0000000..7b38844
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/EditorPluginImages.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.editor;
+
+/**
+ * Bundle of most images used by the Source Editor plug-in.
+ */
+public class EditorPluginImages {
+
+	public static final String IMG_CTOOL16_SPELLCHECK = "icons/full/ctool16/spellcheck.gif"; //$NON-NLS-1$
+	public static final String IMG_DLCL_COLLAPSEALL = "icons/full/dlcl16/collapseall.gif"; //$NON-NLS-1$
+	public static final String IMG_DLCL_DELETE = "icons/full/dlcl16/delete.gif"; //$NON-NLS-1$
+	public static final String IMG_DLCL_SYNCED = "icons/full/dlcl16/synced.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL16_SPELLCHECK = "icons/full/dtool16/spellcheck.gif"; //$NON-NLS-1$
+	public static final String IMG_ELCL_COLLAPSEALL = "icons/full/elcl16/collapseall.gif"; //$NON-NLS-1$
+	public static final String IMG_ELCL_DELETE = "icons/full/elcl16/delete.gif"; //$NON-NLS-1$
+	public static final String IMG_ELCL_SYNCED = "icons/full/elcl16/synced.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL16_SPELLCHECK = "icons/full/etool16/spellcheck.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_OCC_MATCH = "icons/full/obj16/occ_match.gif"; //$NON-NLS-1$
+
+	public static final String IMG_OBJ_PREFERENCES = "icons/full/obj16/preferences.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_PROP_PS = "icons/full/obj16/prop_ps.gif"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/IHelpContextIds.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/IHelpContextIds.java
new file mode 100644
index 0000000..3ce5460
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/IHelpContextIds.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.editor;
+
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * Help context ids for the Source Editor.
+ * <p>
+ * This interface contains constants only; it is not intended to be
+ * implemented.
+ * </p>
+ *  
+ */
+public interface IHelpContextIds {
+
+	// org.eclipse.wst.sse.ui.
+	public static final String PREFIX = SSEUIPlugin.ID + "."; //$NON-NLS-1$
+	// Abstract Source Editor Context Menu
+	// Content Assist
+	public static final String CONTMNU_CONTENTASSIST_HELPID = PREFIX + "xmlm1010"; //$NON-NLS-1$
+	// Format Document
+	public static final String CONTMNU_FORMAT_DOC_HELPID = PREFIX + "xmlm1030"; //$NON-NLS-1$
+	// Format Active Elements
+	public static final String CONTMNU_FORMAT_ELEMENTS_HELPID = PREFIX + "xmlm1040"; //$NON-NLS-1$
+	// Cleanup Document
+	// public static final String CONTMNU_CLEANUP_DOC_HELPID = PREFIX +
+	// "xmlm1050"; //$NON-NLS-1$
+
+	// Properties
+	public static final String CONTMNU_PROPERTIES_HELPID = PREFIX + "xmlm1070"; //$NON-NLS-1$
+
+	// Structured Text Editor Preference Page
+	// Appearance
+	public static final String PREFSTE_APPEARANCE_HELPID = PREFIX + "sted0001"; //$NON-NLS-1$
+	// Hovers
+	public static final String PREFSTE_HOVERS_HELPID = PREFIX + "sted0003"; //$NON-NLS-1$
+
+//	// Read-Only Text Style
+//	public static final String PREFWEBX_READONLY_HELPID = PREFIX + "webx0001"; //$NON-NLS-1$
+
+	// Web and XML Preference Page
+	// Task Tags
+	public static final String PREFWEBX_TASKTAGS_HELPID = PREFIX + "webx0000"; //$NON-NLS-1$
+
+	// Source Editor View
+	public static final String XML_SOURCE_VIEW_HELPID = PREFIX + "xmlm2000"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SelectionConvertor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SelectionConvertor.java
new file mode 100644
index 0000000..b6f5601
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SelectionConvertor.java
@@ -0,0 +1,62 @@
+/*******************************************************************************

+ * Copyright (c) 2008 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.wst.sse.ui.internal.editor;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;

+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;

+

+/**

+ * This class/interface is part of an experimental API that is still under

+ * development and expected to change significantly before reaching stability.

+ * It is being made available at this early stage to solicit feedback from

+ * pioneering adopters on the understanding that any code that uses this API

+ * will almost certainly be broken (repeatedly) as the API evolves.

+ */

+public class SelectionConvertor {

+	/**

+	 * @param model

+	 * @param start

+	 * @param end

+	 * @return the most specific mapping of this text selection to

+	 *         implementors of IndexedRegion

+	 */

+	public Object[] getElements(IStructuredModel model, int start, int end) {

+		Object[] localSelectedStructures = null;

+		if (model != null) {

+			IndexedRegion region = model.getIndexedRegion(start);

+			if (region != null) {

+				if (end <= region.getEndOffset()) {

+					// single selection

+					localSelectedStructures = new Object[1];

+					localSelectedStructures[0] = region;

+				}

+				else {

+					// multiple selection

+					int maxLength = model.getStructuredDocument().getLength();

+					List structures = new ArrayList(2);

+					while (region != null && region.getEndOffset() <= end && region.getEndOffset() < maxLength) {

+						structures.add(region);

+						region = model.getIndexedRegion(region.getEndOffset() + 1);

+					}

+					localSelectedStructures = structures.toArray();

+				}

+			}

+		}

+		if (localSelectedStructures == null) {

+			localSelectedStructures = new Object[0];

+		}

+		return localSelectedStructures;

+	}

+}

diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/StructuredModelDocumentProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/StructuredModelDocumentProvider.java
new file mode 100644
index 0000000..91069ec
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/StructuredModelDocumentProvider.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.editor;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.IDocumentProviderExtension;
+import org.eclipse.ui.texteditor.IDocumentProviderExtension4;
+import org.eclipse.ui.texteditor.IElementStateListener;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+
+
+/**
+ * @author nitin
+ */
+public class StructuredModelDocumentProvider implements IDocumentProvider, IDocumentProviderExtension, IDocumentProviderExtension4 {
+	private static StructuredModelDocumentProvider _instance = null;
+
+	/**
+	 * @return Returns the instance.
+	 */
+	public static StructuredModelDocumentProvider getInstance() {
+		return _instance;
+	}
+
+	{
+		_instance = new StructuredModelDocumentProvider();
+	}
+
+	private StructuredModelDocumentProvider() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#aboutToChange(java.lang.Object)
+	 */
+	public void aboutToChange(Object element) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#addElementStateListener(org.eclipse.ui.texteditor.IElementStateListener)
+	 */
+	public void addElementStateListener(IElementStateListener listener) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#canSaveDocument(java.lang.Object)
+	 */
+	public boolean canSaveDocument(Object element) {
+		return ((IStructuredModel) element).isDirty();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#changed(java.lang.Object)
+	 */
+	public void changed(Object element) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#connect(java.lang.Object)
+	 */
+	public void connect(Object element) throws CoreException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#disconnect(java.lang.Object)
+	 */
+	public void disconnect(Object element) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#getAnnotationModel(java.lang.Object)
+	 */
+	public IAnnotationModel getAnnotationModel(Object element) {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#getDocument(java.lang.Object)
+	 */
+	public IDocument getDocument(Object element) {
+		return ((IStructuredModel) element).getStructuredDocument();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#getModificationStamp(java.lang.Object)
+	 */
+	public long getModificationStamp(Object element) {
+		return ((IStructuredModel) element).getSynchronizationStamp();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#getStatus(java.lang.Object)
+	 */
+	public IStatus getStatus(Object element) {
+		return Status.OK_STATUS;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#getSynchronizationStamp(java.lang.Object)
+	 */
+	public long getSynchronizationStamp(Object element) {
+		return 0;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#isDeleted(java.lang.Object)
+	 */
+	public boolean isDeleted(Object element) {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#isModifiable(java.lang.Object)
+	 */
+	public boolean isModifiable(Object element) {
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#isReadOnly(java.lang.Object)
+	 */
+	public boolean isReadOnly(Object element) {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#isStateValidated(java.lang.Object)
+	 */
+	public boolean isStateValidated(Object element) {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#mustSaveDocument(java.lang.Object)
+	 */
+	public boolean mustSaveDocument(Object element) {
+		return ((IStructuredModel) element).isDirty();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#removeElementStateListener(org.eclipse.ui.texteditor.IElementStateListener)
+	 */
+	public void removeElementStateListener(IElementStateListener listener) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#resetDocument(java.lang.Object)
+	 */
+	public void resetDocument(Object element) throws CoreException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProvider#saveDocument(org.eclipse.core.runtime.IProgressMonitor,
+	 *      java.lang.Object, org.eclipse.jface.text.IDocument, boolean)
+	 */
+	public void saveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {
+		try {
+			((IStructuredModel) element).save();
+		}
+		catch (UnsupportedEncodingException e) {
+		}
+		catch (IOException e) {
+		}
+		catch (CoreException e) {
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#setCanSaveDocument(java.lang.Object)
+	 */
+	public void setCanSaveDocument(Object element) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#synchronize(java.lang.Object)
+	 */
+	public void synchronize(Object element) throws CoreException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#updateStateCache(java.lang.Object)
+	 */
+	public void updateStateCache(Object element) throws CoreException {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IDocumentProviderExtension#validateState(java.lang.Object,
+	 *      java.lang.Object)
+	 */
+	public void validateState(Object element, Object computationContext) throws CoreException {
+	}
+
+	public IContentType getContentType(Object element) throws CoreException {
+		return Platform.getContentTypeManager().getContentType(((IStructuredModel) element).getContentTypeIdentifier());
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ActionDescriptor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ActionDescriptor.java
new file mode 100644
index 0000000..50108ff
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ActionDescriptor.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+
+
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.ui.internal.IActionValidator;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * When 'action' tag is found in the registry, an object of this class is
+ * created. It creates the appropriate action object and captures information
+ * that is later used to add this action object into menu/tool bar. This class
+ * is reused for global (workbench) menu/tool bar, popup menu actions, as well
+ * as view's pulldown and local tool bar.
+ */
+public class ActionDescriptor {
+	public static final String ATT_ACCELERATOR = "accelerator"; //$NON-NLS-1$
+	public static final String ATT_CLASS = "class"; //$NON-NLS-1$
+	public static final String ATT_DEFINITION_ID = "definitionId"; //$NON-NLS-1$
+	public static final String ATT_DESCRIPTION = "description"; //$NON-NLS-1$
+	public static final String ATT_DISABLEDICON = "disabledIcon"; //$NON-NLS-1$
+	public static final String ATT_HELP_CONTEXT_ID = "helpContextId"; //$NON-NLS-1$
+	public static final String ATT_HOVERICON = "hoverIcon"; //$NON-NLS-1$
+	public static final String ATT_ICON = "icon"; //$NON-NLS-1$
+
+	public static final String ATT_ID = "id"; //$NON-NLS-1$
+	public static final String ATT_LABEL = "label"; //$NON-NLS-1$
+	public static final String ATT_MENUBAR_PATH = "menubarPath"; //$NON-NLS-1$
+	public static final String ATT_POPUPMENU_PATH = "popupmenuPath"; //$NON-NLS-1$
+	public static final String ATT_STATE = "state"; //$NON-NLS-1$
+	public static final String ATT_TOOLBAR_PATH = "toolbarPath"; //$NON-NLS-1$
+	public static final String ATT_TOOLTIP = "tooltip"; //$NON-NLS-1$
+
+	/**
+	 * Creates an extension. If the extension plugin has not been loaded a
+	 * busy cursor will be activated during the duration of the load.
+	 * 
+	 * @param element
+	 *            the config element defining the extension
+	 * @param classAttribute
+	 *            the name of the attribute carrying the class
+	 * @returns the extension object if successful. If an error occurs when
+	 *          createing executable extension, the exception is logged, and
+	 *          null returned.
+	 */
+	public static Object createExtension(final IConfigurationElement element, final String classAttribute) {
+		final Object[] result = new Object[1];
+		// If plugin has been loaded create extension.
+		// Otherwise, show busy cursor then create extension.
+		String pluginId = element.getDeclaringExtension().getNamespace();
+		Bundle bundle = Platform.getBundle(pluginId);
+		if (bundle.getState() == Bundle.ACTIVE) {
+			try {
+				result[0] = element.createExecutableExtension(classAttribute);
+			} catch (Exception e) {
+				// catch and log ANY exception from extension point
+				handleCreateExecutableException(result, e);
+			}
+		} else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = element.createExecutableExtension(classAttribute);
+					} catch (Exception e) {
+						// catch and log ANY exception from extension point
+						handleCreateExecutableException(result, e);
+					}
+				}
+			});
+		}
+		return result[0];
+	}
+
+	private static void handleCreateExecutableException(final Object[] result, Throwable e) {
+		Logger.logException(e);
+		result[0] = null;
+	}
+
+	private String id;
+
+	private ActionContributionItem item;
+	private String menuGroup;
+	private String menuPath;
+	private String popupmenuGroup;
+	private String popupmenuPath;
+	private String toolbarGroup;
+	private String toolbarPath;
+
+	/**
+	 * Creates a new descriptor with the targetType
+	 */
+	public ActionDescriptor(IConfigurationElement actionElement) throws CoreException {
+
+		// Calculate menu and toolbar paths.
+		String mpath = actionElement.getAttribute(ATT_MENUBAR_PATH);
+		String mgroup = null;
+		if (mpath != null) {
+			int loc = mpath.lastIndexOf('/');
+			if (loc != -1) {
+				mgroup = mpath.substring(loc + 1);
+				mpath = mpath.substring(0, loc);
+			} else {
+				mgroup = mpath;
+				mpath = null;
+			}
+		}
+		menuPath = mpath;
+		menuGroup = mgroup;
+
+		String ppath = actionElement.getAttribute(ATT_POPUPMENU_PATH);
+		String pgroup = null;
+		if (ppath != null) {
+			int loc = ppath.lastIndexOf('/');
+			if (loc != -1) {
+				pgroup = ppath.substring(loc + 1);
+				ppath = ppath.substring(0, loc);
+			} else {
+				pgroup = ppath;
+				ppath = null;
+			}
+		}
+		popupmenuPath = ppath;
+		popupmenuGroup = pgroup;
+
+		String tpath = actionElement.getAttribute(ATT_TOOLBAR_PATH);
+		String tgroup = null;
+		if (tpath != null) {
+			int loc = tpath.lastIndexOf('/');
+			if (loc != -1) {
+				tgroup = tpath.substring(loc + 1);
+				tpath = tpath.substring(0, loc);
+			} else {
+				tgroup = tpath;
+				tpath = null;
+			}
+		}
+		toolbarPath = tpath;
+		toolbarGroup = tgroup;
+
+		// Create action.
+		IAction action = createAction(actionElement);
+		if (action == null)
+			return;
+
+		String label = actionElement.getAttribute(ATT_LABEL);
+		if (label != null)
+			action.setText(label);
+
+		id = actionElement.getAttribute(ATT_ID);
+		if (id == null) {
+			id = actionElement.getAttribute(ATT_CLASS);
+		}
+		if (id != null)
+			action.setId(id);
+
+		String defId = actionElement.getAttribute(ATT_DEFINITION_ID);
+		if (defId != null && defId.length() != 0) {
+			action.setActionDefinitionId(defId);
+		}
+
+		String tooltip = actionElement.getAttribute(ATT_TOOLTIP);
+		if (tooltip != null)
+			action.setToolTipText(tooltip);
+
+		String helpContextId = actionElement.getAttribute(ATT_HELP_CONTEXT_ID);
+		if (helpContextId != null) {
+			String fullID = helpContextId;
+			if (helpContextId.indexOf(".") == -1) //$NON-NLS-1$
+				// For backward compatibility we auto qualify the id if it is
+				// not qualified)
+				fullID = actionElement.getDeclaringExtension().getNamespace() + "." + helpContextId; //$NON-NLS-1$
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(action, fullID);
+		}
+
+		String description = actionElement.getAttribute(ATT_DESCRIPTION);
+		if (description != null)
+			action.setDescription(description);
+
+		String state = actionElement.getAttribute(ATT_STATE);
+		if (state != null) {
+			action.setChecked(state.equals("true")); //$NON-NLS-1$
+		}
+
+		String icon = actionElement.getAttribute(ATT_ICON);
+		if (icon != null) {
+			action.setImageDescriptor(ImageUtil.getImageDescriptorFromExtension(actionElement.getDeclaringExtension(), icon));
+		}
+
+		String hoverIcon = actionElement.getAttribute(ATT_HOVERICON);
+		if (hoverIcon != null) {
+			action.setHoverImageDescriptor(ImageUtil.getImageDescriptorFromExtension(actionElement.getDeclaringExtension(), hoverIcon));
+		}
+
+		String disabledIcon = actionElement.getAttribute(ATT_DISABLEDICON);
+		if (disabledIcon != null) {
+			action.setDisabledImageDescriptor(ImageUtil.getImageDescriptorFromExtension(actionElement.getDeclaringExtension(), disabledIcon));
+		}
+
+		String accelerator = actionElement.getAttribute(ATT_ACCELERATOR);
+		if (accelerator != null)
+			processAccelerator(action, accelerator);
+
+		item = new ActionContributionItem(action);
+	}
+
+	/**
+	 * Parses the given accelerator text, and converts it to an accelerator
+	 * key code.
+	 * 
+	 * @param acceleratorText
+	 *            the accelerator text
+	 * @result the SWT key code, or 0 if there is no accelerator
+	 */
+	private int convertAccelerator(String acceleratorText) {
+		int accelerator = 0;
+		StringTokenizer stok = new StringTokenizer(acceleratorText, "+"); //$NON-NLS-1$
+
+		int keyCode = -1;
+
+		boolean hasMoreTokens = stok.hasMoreTokens();
+		while (hasMoreTokens) {
+			String token = stok.nextToken();
+			hasMoreTokens = stok.hasMoreTokens();
+			// Every token except the last must be one of the modifiers
+			// Ctrl, Shift, or Alt.
+			if (hasMoreTokens) {
+				int modifier = Action.findModifier(token);
+				if (modifier != 0) {
+					accelerator |= modifier;
+				} else { //Leave if there are none
+					return 0;
+				}
+			} else {
+				keyCode = Action.findKeyCode(token);
+			}
+		}
+		if (keyCode != -1) {
+			accelerator |= keyCode;
+		}
+		return accelerator;
+	}
+
+	/**
+	 */
+	private IAction createAction(IConfigurationElement actionElement) {
+		Object action = new ExtendedEditorActionProxyForDelayLoading(actionElement, ATT_CLASS);
+		if (action == null)
+			return null;
+		if (action instanceof IActionValidator) {
+			if (!((IActionValidator) action).isValidAction())
+				return null;
+		}
+		return (action instanceof IAction ? (IAction) ExtendedEditorActionProxy.newInstance(action) : null);
+	}
+
+	/**
+	 * Returns the action object held in this descriptor.
+	 */
+	public IAction getAction() {
+		return (item != null ? item.getAction() : null);
+	}
+
+	/**
+	 * Returns the IContributionItem object held in this descriptor.
+	 */
+	public IContributionItem getContributionItem() {
+		return item;
+	}
+
+	/**
+	 * Returns action's id as defined in the registry.
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * Returns named slot (group) in the menu where this action should be
+	 * added.
+	 */
+	public String getMenuGroup() {
+		return menuGroup;
+	}
+
+	/**
+	 * Returns menu path where this action should be added. If null, the
+	 * action will not be added into the menu.
+	 */
+
+	public String getMenuPath() {
+		return menuPath;
+	}
+
+	/**
+	 * Returns named slot (group) in the popup menu where this action should
+	 * be added.
+	 */
+	public String getPopupMenuGroup() {
+		return popupmenuGroup;
+	}
+
+	/**
+	 * Returns popup menu path where this action should be added. If null, the
+	 * action will not be added into the popup menu.
+	 */
+
+	public String getPopupMenuPath() {
+		return popupmenuPath;
+	}
+
+	/**
+	 * Returns the named slot (group) in the tool bar where this action should
+	 * be added.
+	 */
+
+	public String getToolbarGroup() {
+		return toolbarGroup;
+	}
+
+	/**
+	 * Returns path in the tool bar where this action should be added. If
+	 * null, action will not be added to the tool bar.
+	 */
+	public String getToolbarPath() {
+		return toolbarPath;
+	}
+
+	/**
+	 * Process the accelerator definition. If it is a number then process the
+	 * code directly - if not then parse it and create the code
+	 */
+	private void processAccelerator(IAction action, String acceleratorText) {
+
+		if (acceleratorText.length() == 0)
+			return;
+
+		//Is it a numeric definition?
+		if (Character.isDigit(acceleratorText.charAt(0))) {
+			try {
+				action.setAccelerator(Integer.valueOf(acceleratorText).intValue());
+			} catch (NumberFormatException exception) {
+				Logger.log(Logger.ERROR, "Invalid accelerator declaration: " + id); //$NON-NLS-1$
+			}
+		} else
+			action.setAccelerator(convertAccelerator(acceleratorText));
+	}
+
+	/**
+	 * For debugging only.
+	 */
+	public String toString() {
+		return "ActionDescriptor(" + id + ")"; //$NON-NLS-2$//$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/BreakpointProviderBuilder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/BreakpointProviderBuilder.java
new file mode 100644
index 0000000..2a6f9b2
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/BreakpointProviderBuilder.java
@@ -0,0 +1,405 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Reads breakpoint extension registory and returns breakpoint provider
+ * instances
+ */
+public class BreakpointProviderBuilder extends RegistryReader {
+
+	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
+	// private static final String ATT_ID = "id"; //$NON-NLS-1$
+	private static final String ATT_CONTENT_TYPES = "contentTypes"; //$NON-NLS-1$
+	private static final String ATT_EXTENSIONS = "extensions"; //$NON-NLS-1$
+	private static BreakpointProviderBuilder instance;
+	private static final String PL_BREAKPOINT = "breakpoint"; //$NON-NLS-1$
+
+	private static final String PLUGIN_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+
+	private static final String TAG_BREAKPOINT_CONTRIBUTION = "breakpointContribution"; //$NON-NLS-1$
+	private static final String TAG_PROVIDER = "provider"; //$NON-NLS-1$
+
+	/*
+	 * Creates an executable extension. @param element the config element
+	 * defining the extension @param classAttribute the name of the attribute
+	 * carrying the class @return the extension object @throws CoreException
+	 */
+	static Object createExecutableExtension(final IConfigurationElement element, final String classAttribute) throws CoreException {
+		return element.createExecutableExtension(classAttribute);
+	}
+
+	/**
+	 * Creates an extension. If the extension plugin has not been loaded a
+	 * busy cursor will be activated during the duration of the load.
+	 * 
+	 * @param element
+	 *            the config element defining the extension
+	 * @param classAttribute
+	 *            the name of the attribute carrying the class
+	 * @return the extension object
+	 * @throws CoreException
+	 */
+	public static Object createExtension(final IConfigurationElement element, final String classAttribute) {
+		// If plugin has been loaded create extension.
+		// Otherwise, show busy cursor then create extension.
+		final Object[] result = new Object[1];
+		String pluginId = element.getDeclaringExtension().getNamespace();
+		Bundle bundle = Platform.getBundle(pluginId);
+		if (bundle.getState() == Bundle.ACTIVE) {
+			try {
+				result[0] = createExecutableExtension(element, classAttribute);
+			}
+			catch (Exception e) {
+				handleCreateExecutableException(result, e);
+			}
+		}
+		else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = createExecutableExtension(element, classAttribute);
+					}
+					catch (CoreException e) {
+						handleCreateExecutableException(result, e);
+					}
+				}
+			});
+
+		}
+		return result[0];
+	}
+
+	/**
+	 * returns singleton instance of BreakpointProviderBuilder
+	 * 
+	 * @return BreakpointProviderBuilder
+	 */
+	public synchronized static BreakpointProviderBuilder getInstance() {
+		if (instance == null) {
+			instance = new BreakpointProviderBuilder();
+		}
+		return instance;
+	}
+
+	/**
+	 * @param result
+	 * @param e
+	 */
+	private static void handleCreateExecutableException(Object[] result, Throwable e) {
+		Logger.logException(e);
+		result[0] = null;
+
+	}
+
+	protected List cache;
+	private Map map = new HashMap();
+
+	protected String targetContributionTag;
+
+	/*
+	 * Constructor
+	 */
+	private BreakpointProviderBuilder() {
+		super();
+	}
+
+	/*
+	 * Creates a breakpoint provider object to given element @param element
+	 * configuration element object @return IBreakpointProvider
+	 */
+	protected IBreakpointProvider createBreakpointProvider(IConfigurationElement element) {
+		Object obj = createExtension(element, ATT_CLASS);
+		if (obj == null)
+			return null;
+		return (obj instanceof IBreakpointProvider) ? (IBreakpointProvider) obj : null;
+	}
+
+	/*
+	 * Creates an array of breakpoint providers matching the given key to the
+	 * value of the IConfigurationElement attribute "attrName" @return
+	 * IBreakpointProvider[]
+	 */
+	protected IBreakpointProvider[] createBreakpointProviders(String attrName, String key) {
+		if (cache == null)
+			return new IBreakpointProvider[0];
+
+		final int num = cache.size();
+		if (num == 0)
+			return new IBreakpointProvider[0];
+
+		IBreakpointProvider[] bp = new IBreakpointProvider[num];
+		int j = 0;
+		for (int i = 0; i < num; i++) {
+			Object obj = cache.get(i);
+			if (!(obj instanceof IConfigurationElement))
+				continue;
+
+			IConfigurationElement element = (IConfigurationElement) obj;
+			if (!TAG_PROVIDER.equals(element.getName()))
+				continue;
+
+			boolean doCreate = false;
+
+			String attrValues = element.getAttribute(attrName);
+
+			if (attrValues != null) {
+				StringTokenizer tokenizer = new StringTokenizer(attrValues, ","); //$NON-NLS-1$
+				while (tokenizer.hasMoreTokens()) {
+					String type = tokenizer.nextToken();
+					if (type.trim().equalsIgnoreCase(key.trim())) {
+						doCreate = true;
+						break;
+					}
+				}
+			}
+
+			if (doCreate) {
+				IBreakpointProvider b = createBreakpointProvider(element);
+				if (b != null) {
+					bp[j] = b;
+					j++;
+				}
+			}
+		}
+
+		IBreakpointProvider[] bp2 = new IBreakpointProvider[j];
+		for (int i = 0; i < j; i++) {
+			bp2[i] = bp[i];
+		}
+
+		return bp2;
+	}
+
+	/*
+	 * Returns a matching array of extension points matching this key. Doesn't
+	 * cause instantiation of providers. @return IBreakpointProvider[]
+	 */
+	protected IConfigurationElement[] findElements(String key) {
+		initCache();
+
+		if (cache == null || cache.size() == 0)
+			return new IConfigurationElement[0];
+
+		int num = cache.size();
+		List elements = new ArrayList(1);
+		for (int i = 0; i < num; i++) {
+			Object obj = cache.get(i);
+			if (!(obj instanceof IConfigurationElement))
+				continue;
+
+			IConfigurationElement element = (IConfigurationElement) obj;
+			if (!TAG_PROVIDER.equals(element.getName()))
+				continue;
+
+			boolean add = false;
+			String types = element.getAttribute(ATT_CONTENT_TYPES);
+			String exts = element.getAttribute(ATT_EXTENSIONS);
+
+			if (types == null && exts == null) {
+				add = true;
+			}
+
+			if (!add && types != null && types.length() > 0) {
+				IContentType testType = Platform.getContentTypeManager().getContentType(key);
+				StringTokenizer tokenizer = new StringTokenizer(types, ","); //$NON-NLS-1$
+				while (tokenizer.hasMoreTokens()) {
+					String type = tokenizer.nextToken();
+					IContentType contentType = Platform.getContentTypeManager().getContentType(type);
+					if (contentType != null && testType != null && testType.isKindOf(contentType)) {
+						add = true;
+						break;
+					}
+				}
+			}
+
+			if (!add && exts != null) {
+				StringTokenizer tokenizer = new StringTokenizer(exts, ","); //$NON-NLS-1$
+				while (tokenizer.hasMoreTokens()) {
+					String ext = tokenizer.nextToken();
+					if (ext.trim().equals(key.trim())) {
+						add = true;
+						break;
+					}
+				}
+			}
+
+			if (add) {
+				elements.add(element);
+			}
+		}
+		return (IConfigurationElement[]) elements.toArray(new IConfigurationElement[0]);
+	}
+
+	/**
+	 * Returns an array of breakpoint providers for a specified content type
+	 * handler
+	 * 
+	 * @param handler
+	 *            a content type handler
+	 * @param ext
+	 *            file extension
+	 * @return IBreakpointProvider[]
+	 */
+	public IBreakpointProvider[] getBreakpointProviders(IEditorPart editorpart, String contentTypeID, String ext) {
+		initCache();
+
+		// Get breakpoint providers for this content type handler
+		IBreakpointProvider[] providers1 = new IBreakpointProvider[0];
+		IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID);
+		List holdProviders = new ArrayList(2);
+		while (contentType != null) {
+			IBreakpointProvider[] providers = (IBreakpointProvider[]) map.get(contentType.getId());
+			if (providers == null) {
+				providers = createBreakpointProviders(ATT_CONTENT_TYPES, contentType.getId());
+				if (providers != null) {
+					map.put(contentType.getId(), providers);
+				}
+			}
+			// providers were retrieved from cache or newly created
+			if(providers != null) {
+				holdProviders.addAll(Arrays.asList(providers));
+			}
+			contentType = contentType.getBaseType();
+		}
+		providers1 = (IBreakpointProvider[]) holdProviders.toArray(new IBreakpointProvider[holdProviders.size()]);
+
+		// Get breakpoint providers for this extension
+		IBreakpointProvider[] providers2 = new IBreakpointProvider[0];
+		if (ext != null) {
+			providers2 = (IBreakpointProvider[]) map.get(ext);
+			if (providers2 == null) {
+				providers2 = createBreakpointProviders(ATT_EXTENSIONS, ext);
+				if (providers2 != null) {
+					map.put(ext, providers2);
+				}
+			}
+		}
+
+		// create single hash set to remove duplication
+		Set s = new HashSet();
+		s.addAll(Arrays.asList(providers1));
+		s.addAll(Arrays.asList(providers2));
+
+		// create IBreakpointProvider[] to return
+		IBreakpointProvider[] providers = new IBreakpointProvider[s.size()];
+		Iterator itr = s.iterator();
+		int i = 0;
+		ISourceEditingTextTools tools = null;
+		if (editorpart != null && itr.hasNext())
+			tools = (ISourceEditingTextTools) editorpart.getAdapter(ISourceEditingTextTools.class);
+		while (itr.hasNext()) {
+			providers[i] = (IBreakpointProvider) itr.next();
+			providers[i].setSourceEditingTextTools(tools);
+			i++;
+		}
+		return providers;
+	}
+
+	/**
+	 * Returns corresponding resource from given parameters
+	 * 
+	 * @param input
+	 * @param handler
+	 * @param ext
+	 * @return IResource
+	 */
+	public IResource getResource(IEditorInput input, String contentType, String ext) {
+		IBreakpointProvider[] providers = getBreakpointProviders(null, contentType, ext);
+		IResource res = null;
+		for (int i = 0; i < providers.length; i++) {
+			res = providers[i].getResource(input);
+			if (res != null) {
+				break;
+			}
+		}
+		return res;
+	}
+
+	private void initCache() {
+		if (cache == null) {
+			cache = new ArrayList();
+			readContributions(TAG_BREAKPOINT_CONTRIBUTION, PL_BREAKPOINT);
+		}
+	}
+
+	/**
+	 * Returns an array of breakpoint providers for a specified content type
+	 * handler
+	 * 
+	 * @param contentType
+	 *            a content type ID or null
+	 * @param ext
+	 *            a filename extension or null
+	 * @return boolean
+	 */
+	public boolean isAvailable(String contentType, String ext) {
+		boolean available = false;
+		if (ext != null)
+			available = findElements(ext).length > 0;
+		if (!available && contentType != null)
+			available = findElements(contentType).length > 0;
+		return available;
+	}
+
+	/**
+	 * Reads the contributions from the registry for the provided workbench
+	 * part and the provided extension point ID.
+	 * 
+	 * @param tag
+	 * @param extensionPoint
+	 */
+	protected void readContributions(String tag, String extensionPoint) {
+		targetContributionTag = tag;
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		readRegistry(registry, PLUGIN_ID, extensionPoint);
+	}
+
+	protected boolean readElement(IConfigurationElement element) {
+		String tag = element.getName();
+		if (tag.equals(targetContributionTag)) {
+			readElementChildren(element);
+			return true;
+		}
+		else if (tag.equals(TAG_PROVIDER)) {
+			cache.add(element);
+			return true; // just cache the element - don't go into it
+		}
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/DropActionProxy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/DropActionProxy.java
new file mode 100644
index 0000000..104f49a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/DropActionProxy.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension2;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
+import org.eclipse.wst.sse.ui.internal.IExtendedSimpleEditor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISelfValidateEditAction;
+
+
+/**
+ */
+public class DropActionProxy implements InvocationHandler {
+	public static Object newInstance(Object obj) {
+		Object instance = null;
+		try {
+			Set set = new HashSet();
+			Class clazz = obj.getClass();
+			while (clazz != null) {
+				Class[] interfaces = clazz.getInterfaces();
+				for (int i = 0; i < interfaces.length; i++) {
+					set.add(interfaces[i]);
+				}
+				clazz = clazz.getSuperclass();
+			}
+			Class[] classes = new Class[set.size()];
+			Iterator itr = set.iterator();
+			int i = 0;
+			while (itr.hasNext()) {
+				classes[i] = (Class) itr.next();
+				i++;
+			}
+			instance = Proxy.newProxyInstance(obj.getClass().getClassLoader(), classes, new DropActionProxy(obj));
+		} catch (Error e) {
+			Logger.logException("Exception while proxying a drop action", e); //$NON-NLS-1$
+			instance = obj;
+		}
+		return instance;
+	}
+
+	private IExtendedSimpleEditor editor = null;
+	private IStructuredModel fRecorder;
+	private Object obj;
+
+	private DropActionProxy(Object obj) {
+		this.obj = obj;
+	}
+
+	private void beginRecording() {
+		IDocument document = null;
+		if (editor != null) {
+			document = editor.getDocument();
+			if (document != null)
+				fRecorder = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+			// Prepare for Undo
+			if (fRecorder != null) {
+				IStructuredTextUndoManager um = fRecorder.getUndoManager();
+				if (um != null) {
+					if (this.obj instanceof IAction)
+						um.beginRecording(this, ((IAction) this.obj).getText(), ((IAction) this.obj).getDescription());
+					else
+						um.beginRecording(this);
+				}
+			}
+		}
+	}
+
+	private void endRecording() {
+		if (fRecorder != null) {
+			IStructuredTextUndoManager um = fRecorder.getUndoManager();
+			if (um != null)
+				um.endRecording(this);
+			fRecorder.releaseFromEdit();
+			fRecorder = null;
+		}
+	}
+
+	/**
+	 * @see java.lang.reflect.InvocationHandler#invoke(Object, Method,
+	 *      Object[])
+	 */
+	public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
+		Object result;
+		String name = m.getName();
+		try {
+			if (name.equals("equals")) { //$NON-NLS-1$
+				// Workaround for JDK's bug 4652876
+				// "equals" always returns false even if both
+				// InvocationHandler
+				// class
+				// hold the same objects
+				// See
+				// http://developer.java.sun.com/developer/bugParade/bugs/4652876.html
+				// This problem is in the IBM SDK 1.3.1
+				// but I don't see the bug in Sun's JDK 1.4.1 (beta)
+				Object arg = args[0];
+				return (proxy.getClass() == arg.getClass() && equals(Proxy.getInvocationHandler(arg))) ? Boolean.TRUE : Boolean.FALSE;
+			} else if (name.equals("run")) { //$NON-NLS-1$
+				if (args[1] instanceof IExtendedSimpleEditor) {
+					editor = (IExtendedSimpleEditor) args[1];
+				}
+				beginRecording();
+				if ((args[1] instanceof ITextEditor) && !(obj instanceof ISelfValidateEditAction) && !isEditable((ITextEditor) args[1])) {
+					return Boolean.FALSE;
+				}
+			}
+			result = m.invoke(obj, args);
+		} catch (InvocationTargetException e) {
+			throw e.getTargetException();
+		} catch (Exception e) {
+			throw new RuntimeException(e.getMessage());
+		} finally {
+			if (name.equals("run")) { //$NON-NLS-1$
+				endRecording();
+			}
+		}
+		return result;
+	}
+
+	private boolean isEditable(ITextEditor editor) {
+		if (editor instanceof ITextEditorExtension2)
+			return ((ITextEditorExtension2) editor).validateEditorInputState();
+		return editor.isEditable();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxy.java
new file mode 100644
index 0000000..b11c7b9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxy.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
+import org.eclipse.wst.sse.ui.internal.IExtendedSimpleEditor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISelfValidateEditAction;
+
+
+/**
+ * Begins and ends UndoManager recording around run() and runWithEvent(...)
+ */
+public class ExtendedEditorActionProxy implements InvocationHandler {
+	public static Object newInstance(Object obj) {
+		Set set = new HashSet();
+		Class clazz = obj.getClass();
+		while (clazz != null) {
+			Class[] interfaces = clazz.getInterfaces();
+			for (int i = 0; i < interfaces.length; i++) {
+				set.add(interfaces[i]);
+			}
+			clazz = clazz.getSuperclass();
+		}
+		Class[] classes = new Class[set.size()];
+		Iterator itr = set.iterator();
+		int i = 0;
+		while (itr.hasNext()) {
+			classes[i] = (Class) itr.next();
+			i++;
+		}
+		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), classes, new ExtendedEditorActionProxy(obj));
+	}
+
+	private IExtendedSimpleEditor editor = null;
+	private IStructuredModel fRecorder;
+	private Object obj;
+
+	private ExtendedEditorActionProxy(Object obj) {
+		this.obj = obj;
+	}
+
+	private void beginRecording() {
+		IDocument document = null;
+		if (editor != null) {
+			document = editor.getDocument();
+			if (document != null)
+				fRecorder = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+			// Prepare for Undo
+			if (fRecorder != null) {
+				IStructuredTextUndoManager um = fRecorder.getUndoManager();
+				if (um != null) {
+					um.beginRecording(this, ((IAction) this.obj).getText(), ((IAction) this.obj).getDescription());
+				}
+			}
+		}
+	}
+
+	private void endRecording() {
+		if (fRecorder != null) {
+			IStructuredTextUndoManager um = fRecorder.getUndoManager();
+			if (um != null) {
+				um.endRecording(this);
+			}
+			fRecorder.releaseFromEdit();
+			fRecorder = null;
+		}
+	}
+
+	/**
+	 * @see java.lang.reflect.InvocationHandler#invoke(Object, Method,
+	 *      Object[])
+	 */
+	public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
+		Object result = null;
+		String name = m.getName();
+		try {
+			if (name.equals("equals")) { //$NON-NLS-1$
+				// Workaround for JDK's bug 4652876
+				// "equals" always returns false even if both
+				// InvocationHandler
+				// class
+				// hold the same objects
+				// See
+				// http://developer.java.sun.com/developer/bugParade/bugs/4652876.html
+				// This problem is in the IBM SDK 1.3.1
+				// but I don't see the bug in Sun's JDK 1.4.1 (beta)
+				Object arg = args[0];
+				return (proxy.getClass() == arg.getClass() && equals(Proxy.getInvocationHandler(arg))) ? Boolean.TRUE : Boolean.FALSE;
+			} else if (name.equals("runWithEvent") || name.equals("run")) { //$NON-NLS-1$  //$NON-NLS-2$
+				beginRecording();
+				if ((editor != null) && !(this.obj instanceof ISelfValidateEditAction)) {
+					
+					// TODO: cleanup validateEdit
+					// just leaving this check and following code here for transition. 
+					// I assume we'll remove all need for 'validateEdit'
+					// or move to platform editor's validateState 
+
+//					IStatus status = editor.validateEdit(getDisplay().getActiveShell());
+//					if (!status.isOK()) {
+//						return null;
+//					}
+				}
+			} else if (name.equals("setActiveExtendedEditor")) { //$NON-NLS-1$
+				if (args[0] instanceof IExtendedSimpleEditor) {
+					editor = (IExtendedSimpleEditor) args[0];
+				}
+			}
+			result = m.invoke(this.obj, args);
+		} catch (InvocationTargetException e) {
+			Logger.logException(e.getTargetException());
+			//throw e.getTargetException();
+		} catch (Exception e) {
+			Logger.logException(e);
+			if (name.equals("runWithEvent") || name.equals("run")) { //$NON-NLS-1$  //$NON-NLS-2$
+				// only expose user-driven exceptions from "running" to the
+				// user
+				throw new RuntimeException(e.getMessage());
+			}
+		} finally {
+			if (name.equals("runWithEvent") || name.equals("run")) { //$NON-NLS-1$  //$NON-NLS-2$
+				endRecording();
+			}
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxyForDelayLoading.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxyForDelayLoading.java
new file mode 100644
index 0000000..fc73c0d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxyForDelayLoading.java
@@ -0,0 +1,768 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.ListenerList;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.HelpListener;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.wst.sse.ui.internal.IExtendedEditorAction;
+import org.eclipse.wst.sse.ui.internal.IExtendedSimpleEditor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.osgi.framework.Bundle;
+
+public class ExtendedEditorActionProxyForDelayLoading implements IExtendedEditorAction, IExtendedEditorActionProxyForDelayLoading, IAction {
+    private IAction proxy;
+    private IAction dummy = new Action() { // this is for mainly its property change notify...
+    };
+    // proxy'ed properties
+    private String p_id;
+    private boolean set_p_id;
+    private String p_text;
+    private String p_description;
+    private boolean set_p_text;
+    private boolean set_p_description;
+    private String p_toolTipText;
+    private boolean set_p_toolTipText;
+    private String p_actionDefinitionId;
+    private boolean set_p_actionDefinitionId;
+    private ImageDescriptor p_image;
+    private boolean set_p_image;
+    private ImageDescriptor p_hoverImage;
+    private boolean set_p_hoverImage;
+    private ImageDescriptor p_disabledImage;
+    private boolean set_p_disabledImage;
+    private int p_accelerator;
+    private boolean set_p_accelerator;
+    private int p_style = AS_PUSH_BUTTON;
+    //private boolean set_p_style;
+    private HelpListener p_helpListener;
+    private boolean set_p_helpListener;
+    private boolean p_enabled = true; // should be same as what is done in
+    private boolean set_p_enabled;
+    private ListenerList p_listeners = new ListenerList(3);
+    private boolean set_p_listeners;
+    private boolean p_checked;
+    private boolean set_p_checked;
+    private IExtendedSimpleEditor p_targetEditor;
+    private boolean set_p_targetEditor;
+	private boolean p_isvisible = true; // should be true
+	
+	private IConfigurationElement element;
+	private String classAttribute;
+
+	 /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+     */
+    public void addPropertyChangeListener(IPropertyChangeListener listener) {
+        p_listeners.add(listener);
+        set_p_listeners = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.addPropertyChangeListener(listener);
+        } else {
+        	dummy.addPropertyChangeListener(listener);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getAccelerator()
+     */
+    public int getAccelerator() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getAccelerator();
+        }
+        return p_accelerator;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getActionDefinitionId()
+     */
+    public String getActionDefinitionId() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getActionDefinitionId();
+        }
+        return p_actionDefinitionId;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getDescription()
+     */
+    public String getDescription() {
+        //        System.out.println(p_id + ": getDescription");
+        //        System.out.flush();
+        if (proxy != null) {
+            return proxy.getDescription();
+        }
+        return p_description;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getDisabledImageDescriptor()
+     */
+    public ImageDescriptor getDisabledImageDescriptor() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getDisabledImageDescriptor();
+        }
+        return p_disabledImage;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getHelpListener()
+     */
+    public HelpListener getHelpListener() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getHelpListener();
+        }
+        return p_helpListener;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getHoverImageDescriptor()
+     */
+    public ImageDescriptor getHoverImageDescriptor() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getHoverImageDescriptor();
+        }
+        return p_hoverImage;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getId()
+     */
+    public String getId() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getId();
+        }
+        return p_id;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getImageDescriptor()
+     */
+    public ImageDescriptor getImageDescriptor() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getImageDescriptor();
+        }
+        return p_image;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getMenuCreator()
+     */
+    public IMenuCreator getMenuCreator() {
+        //        System.out.println(p_id + ": getMenuCreator");
+        //        System.out.flush();
+        realize();
+        if (proxy != null) {
+            return proxy.getMenuCreator();
+        }
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getStyle()
+     */
+    public int getStyle() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getStyle();
+        }
+        return p_style;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getText()
+     */
+    public String getText() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getText();
+        }
+        return p_text;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getToolTipText()
+     */
+    public String getToolTipText() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getToolTipText();
+        }
+        return p_toolTipText;
+    }
+    
+	/**
+	 * Check if the contributing bundle is active
+	 */
+	public boolean isBundleActive() {
+		Bundle bundle = Platform.getBundle(element.getDeclaringExtension().getNamespace());
+		if (bundle != null && bundle.getState() != Bundle.ACTIVE) {
+			return false;
+		}
+		return true;
+	}
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#isChecked()
+     */
+    public boolean isChecked() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.isChecked();
+        }
+        return p_checked;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#isEnabled()
+     */
+    public boolean isEnabled() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.isEnabled();
+        }
+        return p_enabled;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+     */
+    public void removePropertyChangeListener(IPropertyChangeListener listener) {
+        p_listeners.remove(listener);
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.removePropertyChangeListener(listener);
+        }
+        dummy.removePropertyChangeListener(listener);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#run()
+     */
+    public void run() {
+        realize();
+        if (proxy != null) {
+            // if this has a key accelerator, first update this action and to
+            // see if this action is enabled or not.
+            if ((proxy.getAccelerator() > 0) || (proxy.getActionDefinitionId() != null)) {
+                update();
+                if (isEnabled() == true) {
+                    proxy.run();
+                }
+            } else {
+                proxy.run();
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#runWithEvent(org.eclipse.swt.widgets.Event)
+     */
+    public void runWithEvent(Event event) {
+        realize();
+        if (proxy != null) {
+            // same as run()
+            if ((proxy.getAccelerator() > 0) || (proxy.getActionDefinitionId() != null)) {
+                update();
+                if (isEnabled() == true) {
+                    proxy.runWithEvent(event);
+                }
+            } else {
+                proxy.runWithEvent(event);
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setActionDefinitionId(java.lang.String)
+     */
+    public void setActionDefinitionId(String id) {
+        p_actionDefinitionId = id;
+        set_p_actionDefinitionId = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setActionDefinitionId(id);
+        } else {
+        	dummy.setActionDefinitionId(id);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setChecked(boolean)
+     */
+    public void setChecked(boolean checked) {
+        p_checked = checked;
+        set_p_checked = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setChecked(checked);
+        } else {
+        	dummy.setChecked(checked);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setDescription(java.lang.String)
+     */
+    public void setDescription(String description) {
+        p_description = description;
+        set_p_description = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setDescription(description);
+        } else {
+        	dummy.setDescription(description);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setDisabledImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+     */
+    public void setDisabledImageDescriptor(ImageDescriptor newImage) {
+        p_disabledImage = newImage;
+        set_p_disabledImage = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setDisabledImageDescriptor(newImage);
+        } else {
+        	dummy.setDisabledImageDescriptor(newImage);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setEnabled(boolean)
+     */
+    public void setEnabled(boolean enabled) {
+        p_enabled = enabled;
+        set_p_enabled = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setEnabled(enabled);
+        } else {
+        	dummy.setEnabled(enabled);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setHelpListener(org.eclipse.swt.events.HelpListener)
+     */
+    public void setHelpListener(HelpListener listener) {
+        p_helpListener = listener;
+        set_p_helpListener = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setHelpListener(listener);
+        } else {
+        	dummy.setHelpListener(listener);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setHoverImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+     */
+    public void setHoverImageDescriptor(ImageDescriptor newImage) {
+        p_hoverImage = newImage;
+        set_p_hoverImage = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setHoverImageDescriptor(newImage);
+        } else {
+        	dummy.setHoverImageDescriptor(newImage);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setId(java.lang.String)
+     */
+    public void setId(String id) {
+        p_id = id;
+        set_p_id = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setId(id);
+        } else {
+        	dummy.setId(id);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+     */
+    public void setImageDescriptor(ImageDescriptor newImage) {
+        p_image = newImage;
+        set_p_image = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setImageDescriptor(newImage);
+        } else {
+        	dummy.setImageDescriptor(newImage);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setMenuCreator(org.eclipse.jface.action.IMenuCreator)
+     */
+    public void setMenuCreator(IMenuCreator creator) {
+        //        System.out.println(p_id + ": setMenuCreator");
+        //        System.out.flush();
+        realize();
+        if (proxy != null) {
+            proxy.setMenuCreator(creator);
+        } else {
+        	dummy.setMenuCreator(creator);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setText(java.lang.String)
+     */
+    public void setText(String text) {
+        p_text = text;
+        set_p_text = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setText(text);
+        } else {
+        	dummy.setText(text);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setToolTipText(java.lang.String)
+     */
+    public void setToolTipText(String text) {
+        p_toolTipText = text;
+        set_p_toolTipText = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setToolTipText(text);
+        } else {
+        	dummy.setToolTipText(text);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setAccelerator(int)
+     */
+    public void setAccelerator(int keycode) {
+        p_accelerator = keycode;
+        set_p_accelerator = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setAccelerator(keycode);
+        } else {
+        	dummy.setAccelerator(keycode);
+        }
+    }
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.internal.IExtendedEditorAction#setActiveExtendedEditor(com.ibm.sse.editor.extension.IExtendedSimpleEditor)
+	 */
+	public void setActiveExtendedEditor(IExtendedSimpleEditor targetEditor) {
+		p_targetEditor = targetEditor;
+		set_p_targetEditor = true;
+        // don't realize class.
+        // realize();
+        if ((proxy != null) && (proxy instanceof IExtendedEditorAction)) {
+            ((IExtendedEditorAction)proxy).setActiveExtendedEditor(targetEditor);
+        }
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.sse.editor.extension.IExtendedEditorAction#isVisible()
+	 */
+	public boolean isVisible() {
+        // don't realize class.
+        // realize();
+        if ((proxy != null) && (proxy instanceof IExtendedEditorAction)) {
+            return ((IExtendedEditorAction)proxy).isVisible();
+        }
+        return p_isvisible;
+	}
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#isHandled
+     */
+	public boolean isHandled() {
+		return false;
+	}
+
+	// see ActionDescriptor#createExtension
+	private static IAction newInstance(final IConfigurationElement elm, final String cla) {
+		final Object[] result = new Object[1];
+		// If plugin has been loaded create extension.
+		// Otherwise, show busy cursor then create extension.
+		Bundle bundle= Platform.getBundle(elm.getDeclaringExtension().getNamespace());
+		if (bundle != null && bundle.getState() == Bundle.ACTIVE) {
+			try {
+				result[0] = elm.createExecutableExtension(cla);
+			}
+			catch (Exception e) {
+				// catch and log ANY exception from extension point
+				handleCreateExecutableException(result, e, elm.getAttribute(cla));
+			}
+		}
+		else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = elm.createExecutableExtension(cla);
+					}
+					catch (Exception e) {
+						// catch and log ANY exception from extension point
+						handleCreateExecutableException(result, e, elm.getAttribute(cla));
+					}
+				}
+			});
+		}
+		if ((result[0] != null) && (result[0] instanceof IAction)) {
+			return (IAction)result[0];
+		}
+		return null;
+    }
+	
+	private static void handleCreateExecutableException(final Object[] result, Throwable e, String classname) {
+		Logger.logException("Unable to create proxy action for " + classname, e);
+		result[0] = null;
+	}
+
+	/**
+     * Instantiate a real class here
+     */
+    public void realize() {
+        if ((proxy == null) && (element != null) && (classAttribute != null)) {
+            proxy = newInstance(element, classAttribute);
+	        if (proxy != null) {
+	            // propagate proxy'ed properties
+	            if (set_p_listeners == true) {
+	                if (p_listeners.size() > 0) {
+	                    Object[] l = p_listeners.getListeners();
+	                    int ls = l.length;
+	                    for (int i = 0; i < ls; i++) {
+	                        IPropertyChangeListener pl = (IPropertyChangeListener) l[i];
+	                        proxy.addPropertyChangeListener(pl);
+	                        dummy.removePropertyChangeListener(pl); // remove listener from dymmy so that we don't send notifications twice anymore
+	                    }
+	                }
+	            }
+	            if (set_p_accelerator == true) {
+	                proxy.setAccelerator(p_accelerator);
+	            }
+	            if (set_p_actionDefinitionId == true) {
+	                if (p_actionDefinitionId != null) {
+	                    proxy.setActionDefinitionId(p_actionDefinitionId);
+	                }
+	            }
+	            if (set_p_checked == true) {
+	                proxy.setChecked(p_checked);
+	            }
+	            if (set_p_disabledImage == true) {
+	                if (p_disabledImage != null) {
+	                    proxy.setDisabledImageDescriptor(p_disabledImage);
+	                }
+	            }
+	            if (set_p_enabled == true) {
+	                proxy.setEnabled(p_enabled);
+	            }
+	            if (set_p_helpListener == true) {
+	                if (p_helpListener != null) {
+	                    proxy.setHelpListener(p_helpListener);
+	                }
+	            }
+	            if (set_p_hoverImage == true) {
+	                if (p_hoverImage != null) {
+	                    proxy.setHoverImageDescriptor(p_hoverImage);
+	                }
+	            }
+	            if (set_p_id == true) {
+	                if (p_id != null) {
+	                    proxy.setId(p_id);
+	                }
+	            }
+	            if (set_p_image == true) {
+	                if (p_image != null) {
+	                    proxy.setImageDescriptor(p_image);
+	                }
+	            }
+	            if (set_p_text == true) {
+	                if (p_text != null) {
+	                    proxy.setText(p_text);
+	                }
+	            }
+	            if (set_p_description == true) {
+	                if (p_description != null) {
+	                    proxy.setDescription(p_description);
+	                }
+	            }
+	            if (set_p_toolTipText == true) {
+	                if (p_toolTipText != null) {
+	                    proxy.setToolTipText(p_toolTipText);
+	                }
+	            }
+	            if (set_p_targetEditor == true) {
+	                if (p_targetEditor != null) {
+				        if (proxy instanceof IExtendedEditorAction) {
+				            ((IExtendedEditorAction)proxy).setActiveExtendedEditor(p_targetEditor);
+				        }
+	                }
+	            }
+	        }
+        }
+    }
+
+    public boolean isRealized() {
+        return (proxy != null);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.ui.texteditor.IUpdate#update()
+     */
+    public void update() {
+        // don't realize class.
+        // realize();
+        if ((proxy != null) && (proxy instanceof IUpdate)) {
+            ((IUpdate) proxy).update();
+        }
+    }
+
+    /**
+     * get a real action class
+     */
+    public IAction getAction() {
+        realize();
+        return proxy;
+    }
+
+
+    /**
+     * These are Actions's constructors
+     */
+    ExtendedEditorActionProxyForDelayLoading() {
+        super();
+     }
+    public ExtendedEditorActionProxyForDelayLoading(final IConfigurationElement element, final String classAttribute) {
+        super();
+        this.element = element;
+        this.classAttribute = classAttribute;
+    }
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/IExtendedEditorActionProxyForDelayLoading.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/IExtendedEditorActionProxyForDelayLoading.java
new file mode 100644
index 0000000..773858b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/IExtendedEditorActionProxyForDelayLoading.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+import org.eclipse.jface.action.IAction;
+
+/**
+ * @deprecated
+ */
+public interface IExtendedEditorActionProxyForDelayLoading {
+    public IAction getAction();
+    public boolean isRealized();
+    public void realize();
+    boolean isBundleActive();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ImageUtil.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ImageUtil.java
new file mode 100644
index 0000000..aefc562
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ImageUtil.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.osgi.framework.Bundle;
+
+public class ImageUtil {
+
+
+	/**
+	 * Convenience Method. Returns an ImageDescriptor whose path, relative to
+	 * the plugin containing the <code>extension</code> is
+	 * <code>subdirectoryAndFilename</code>. If there isn't any value
+	 * associated with the name then <code>null
+	 * </code> is returned.
+	 * 
+	 * This method is convenience and only intended for use by the workbench
+	 * because it explicitly uses the workbench's registry for
+	 * caching/retrieving images from other extensions -- other plugins must
+	 * user their own registry. This convenience method is subject to removal.
+	 * 
+	 * Note: subdirectoryAndFilename must not have any leading "." or path
+	 * separators / or \ ISV's should use icons/mysample.gif and not
+	 * ./icons/mysample.gif
+	 * 
+	 * Note: This consults the plugin for extension and obtains its
+	 * installation location. all requested images are assumed to be in a
+	 * directory below and relative to that plugins installation directory.
+	 */
+	public static ImageDescriptor getImageDescriptorFromExtension(IExtension extension, String subdirectoryAndFilename) {
+		String pluginId = extension.getNamespace();
+		Bundle bundle = Platform.getBundle(pluginId);
+		return getImageDescriptorFromBundle(bundle, subdirectoryAndFilename);
+	}
+
+	/**
+	 * Convenience Method. Return an ImageDescriptor whose path relative to
+	 * the plugin described by <code>bundle</code> is
+	 * <code>subdirectoryAndFilename</code>. Returns <code>null</code> if
+	 * no image could be found.
+	 * 
+	 * This method is convenience and only intended for use by the workbench
+	 * because it explicitly uses the workbench's registry for
+	 * caching/retrieving images from other extensions -- other plugins must
+	 * user their own registry. This convenience method is subject to removal.
+	 * 
+	 * Note: subdirectoryAndFilename must not have any leading "." or path
+	 * separators / or \ ISV's should use icons/mysample.gif and not
+	 * ./icons/mysample.gif
+	 * 
+	 * Note: This consults the plugin for extension and obtains its
+	 * installation location. all requested images are assumed to be in a
+	 * directory below and relative to that plugins installation directory.
+	 */
+	public static ImageDescriptor getImageDescriptorFromBundle(Bundle bundle, String subdirectoryAndFilename) {
+
+		URL path = bundle.getEntry("/"); //$NON-NLS-1$
+		URL fullPathString = null;
+		try {
+			fullPathString = new URL(path, subdirectoryAndFilename);
+			return ImageDescriptor.createFromURL(fullPathString);
+		} catch (MalformedURLException e) {
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/RegistryReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/RegistryReader.java
new file mode 100644
index 0000000..a36e8ba
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/RegistryReader.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IPluginRegistry;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.util.Sorter;
+
+
+/**
+ * Template implementation of a registry reader that creates objects
+ * representing registry contents. Typically, an extension contains one
+ * element, but this reader handles multiple elements per extension.
+ * 
+ * To start reading the extensions from the registry for an extension point,
+ * call the method <code>readRegistry</code>.
+ * 
+ * To read children of an IConfigurationElement, call the method
+ * <code>readElementChildren</code> from your implementation of the method
+ * <code>readElement</code>, as it will not be done by default.
+ */
+public abstract class RegistryReader {
+
+
+	protected static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
+
+	/**
+	 * The constructor.
+	 */
+	protected RegistryReader() {
+	}
+
+	/**
+	 * This method extracts description as a subelement of the given element.
+	 * 
+	 * @return description string if defined, or empty string if not.
+	 */
+	protected String getDescription(IConfigurationElement config) {
+		IConfigurationElement[] children = config.getChildren(TAG_DESCRIPTION);
+		if (children.length >= 1) {
+			return children[0].getValue();
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * Logs the error in the workbench log using the provided text and the
+	 * information in the configuration element.
+	 */
+	protected void logError(IConfigurationElement element, String text) {
+		IExtension extension = element.getDeclaringExtension();
+		StringBuffer buf = new StringBuffer();
+		buf.append("Plugin " + extension.getNamespace() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-2$//$NON-NLS-1$
+		buf.append("\n" + text); //$NON-NLS-1$
+		Logger.log(Logger.ERROR, buf.toString());
+	}
+
+	/**
+	 * Logs a very common registry error when a required attribute is missing.
+	 */
+	protected void logMissingAttribute(IConfigurationElement element, String attributeName) {
+		logError(element, "Required attribute '" + attributeName + "' not defined"); //$NON-NLS-2$//$NON-NLS-1$
+	}
+
+	/**
+	 * Logs a registry error when the configuration element is unknown.
+	 */
+	protected void logUnknownElement(IConfigurationElement element) {
+		logError(element, "Unknown extension tag found: " + element.getName()); //$NON-NLS-1$
+	}
+
+	/**
+	 * Apply a reproducable order to the list of extensions provided, such
+	 * that the order will not change as extensions are added or removed.
+	 */
+	protected IExtension[] orderExtensions(IExtension[] extensions) {
+		// By default, the order is based on plugin id sorted
+		// in ascending order. The order for a plugin providing
+		// more than one extension for an extension point is
+		// dependent in the order listed in the XML file.
+		Sorter sorter = new Sorter() {
+			public boolean compare(Object extension1, Object extension2) {
+				String s1 = ((IExtension) extension1).getNamespace().toUpperCase();
+				String s2 = ((IExtension) extension2).getNamespace().toUpperCase();
+				//Return true if elementTwo is 'greater than' elementOne
+				return s2.compareTo(s1) > 0;
+			}
+		};
+
+		Object[] sorted = sorter.sort(extensions);
+		IExtension[] sortedExtension = new IExtension[sorted.length];
+		System.arraycopy(sorted, 0, sortedExtension, 0, sorted.length);
+		return sortedExtension;
+	}
+
+	/**
+	 * Implement this method to read element's attributes. If children should
+	 * also be read, then implementor is responsible for calling
+	 * <code>readElementChildren</code>. Implementor is also responsible
+	 * for logging missing attributes.
+	 * 
+	 * @return true if element was recognized, false if not.
+	 */
+	protected abstract boolean readElement(IConfigurationElement element);
+
+	/**
+	 * Read the element's children. This is called by the subclass'
+	 * readElement method when it wants to read the children of the element.
+	 */
+	protected void readElementChildren(IConfigurationElement element) {
+		readElements(element.getChildren());
+	}
+
+	/**
+	 * Read each element one at a time by calling the subclass implementation
+	 * of <code>readElement</code>.
+	 * 
+	 * Logs an error if the element was not recognized.
+	 */
+	protected void readElements(IConfigurationElement[] elements) {
+		for (int i = 0; i < elements.length; i++) {
+			if (!readElement(elements[i]))
+				logUnknownElement(elements[i]);
+		}
+	}
+
+	/**
+	 * Read one extension by looping through its configuration elements.
+	 */
+	protected void readExtension(IExtension extension) {
+		readElements(extension.getConfigurationElements());
+	}
+
+	/**
+	 * @deprecated use readRegistry(IExtensionRegistry registry, String pluginId, String extensionPoint)
+	 */
+	protected void readRegistry(IPluginRegistry registry, String pluginId, String extensionPoint) {
+		IExtensionPoint point = registry.getExtensionPoint(pluginId, extensionPoint);
+		if (point != null) {
+			IExtension[] extensions = point.getExtensions();
+			extensions = orderExtensions(extensions);
+			for (int i = 0; i < extensions.length; i++)
+				readExtension(extensions[i]);
+		}
+	}
+	
+	/**
+	 * Start the registry reading process using the supplied plugin ID and
+	 * extension point.
+	 */
+	protected void readRegistry(IExtensionRegistry registry, String pluginId, String extensionPoint) {
+		IExtensionPoint point = registry.getExtensionPoint(pluginId, extensionPoint);
+		if (point != null) {
+			IExtension[] extensions = point.getExtensions();
+			extensions = orderExtensions(extensions);
+			for (int i = 0; i < extensions.length; i++)
+				readExtension(extensions[i]);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/format/StructuredFormattingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/format/StructuredFormattingStrategy.java
new file mode 100644
index 0000000..40e5d7d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/format/StructuredFormattingStrategy.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.format;
+
+import java.io.IOException;
+import java.util.LinkedList;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TypedPosition;
+import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
+import org.eclipse.jface.text.formatter.FormattingContextProperties;
+import org.eclipse.jface.text.formatter.IFormattingContext;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+public class StructuredFormattingStrategy extends ContextBasedFormattingStrategy {
+
+	/** Documents to be formatted by this strategy */
+	private final LinkedList fDocuments = new LinkedList();
+	private IStructuredFormatProcessor fFormatProcessor;
+	/** Partitions to be formatted by this strategy */
+	private final LinkedList fPartitions = new LinkedList();
+	private IRegion fRegion;
+
+	/**
+	 * @param formatProcessor
+	 */
+	public StructuredFormattingStrategy(IStructuredFormatProcessor formatProcessor) {
+		super();
+
+		fFormatProcessor = formatProcessor;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#format()
+	 */
+	public void format() {
+		super.format();
+
+		final IDocument document = (IDocument) fDocuments.removeFirst();
+		final TypedPosition partition = (TypedPosition) fPartitions.removeFirst();
+
+		if (document != null && partition != null && fRegion != null && fFormatProcessor != null) {
+			try {
+				fFormatProcessor.formatDocument(document, fRegion.getOffset(), fRegion.getLength());
+			}
+			catch (IOException e) {
+				// log for now, unless we find reason not to
+				Logger.log(Logger.INFO, e.getMessage());
+			}
+			catch (CoreException e) {
+				// log for now, unless we find reason not to
+				Logger.log(Logger.INFO, e.getMessage());
+			}
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStarts(org.eclipse.jface.text.formatter.IFormattingContext)
+	 */
+	public void formatterStarts(final IFormattingContext context) {
+		super.formatterStarts(context);
+
+		fPartitions.addLast(context.getProperty(FormattingContextProperties.CONTEXT_PARTITION));
+		fDocuments.addLast(context.getProperty(FormattingContextProperties.CONTEXT_MEDIUM));
+		fRegion = (IRegion) context.getProperty(FormattingContextProperties.CONTEXT_REGION);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStops()
+	 */
+	public void formatterStops() {
+		super.formatterStops();
+
+		fPartitions.clear();
+		fDocuments.clear();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AbstractCommentHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AbstractCommentHandler.java
new file mode 100644
index 0000000..eab9187
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AbstractCommentHandler.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * This class contains all of the shared functionality for comment handlers
+ */
+public abstract class AbstractCommentHandler extends AbstractHandler {
+
+	/**
+	 * <p>Default constructor must exist because sub classes are created by java reflection</p>
+	 */
+	public AbstractCommentHandler() {
+		super();
+	}
+
+	/**
+	 * <p>Gets the important information out of the event and passes it onto 
+	 * the internal method {@link #processAction}</p>
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.handlers.CommentHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public final Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null && document instanceof IStructuredDocument) {
+				// get current text selection
+				ITextSelection textSelection = getCurrentSelection(textEditor);
+				if (!textSelection.isEmpty()) {
+					//call the implementers code to deal with the event
+					processAction(textEditor, (IStructuredDocument)document, textSelection);
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * <p>This method is called by the public {@link #execute} method whenever
+	 * the comment handler is invoked.  This method should be used for the
+	 * logic of handling the structured comment event.</p>
+	 * 
+	 * @param textEditor the text editor the initiating event was caused in
+	 * @param document the document the text editor is editing
+	 * @param textSelection the user selection when the event was caused
+	 */
+	protected abstract void processAction(ITextEditor textEditor, IStructuredDocument document, ITextSelection textSelection);
+	
+	/**
+	 * <p>Gets the current user selection in the given {@link ITextEditor}</p>
+	 * 
+	 * @param textEditor get the user selection from here
+	 * @return the current user selection in <code>textEdtior</code>
+	 */
+	private static ITextSelection getCurrentSelection(ITextEditor textEditor) {
+		ISelectionProvider provider = textEditor.getSelectionProvider();
+		if (provider != null) {
+			ISelection selection = provider.getSelection();
+			if (selection instanceof ITextSelection) {
+				return (ITextSelection) selection;
+			}
+		}
+		return TextSelection.emptySelection();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AbstractStructuredSelectHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AbstractStructuredSelectHandler.java
new file mode 100644
index 0000000..4579700
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AbstractStructuredSelectHandler.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.selection.SelectionHistory;
+
+abstract public class AbstractStructuredSelectHandler extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+			ISelection selection = textEditor.getSelectionProvider().getSelection();
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			// determine current text selection
+			if (selection instanceof ITextSelection && document != null) {
+				ITextSelection textSelection = (ITextSelection) selection;
+
+				if (textSelection.getLength() < document.getLength()) {
+					// get current indexed region
+					IndexedRegion cursorIndexedRegion = getCursorIndexedRegion(document, textSelection);
+
+					// determine new selection based on current indexed region
+					Region newSelectionRegion = getNewSelectionRegion(cursorIndexedRegion, textSelection);
+
+					// select new selection
+					if (newSelectionRegion != null) {
+						SelectionHistory history = (SelectionHistory) editor.getAdapter(SelectionHistory.class);
+						if (history != null) {
+							history.remember(new Region(textSelection.getOffset(), textSelection.getLength()));
+							try {
+								history.ignoreSelectionChanges();
+								textEditor.selectAndReveal(newSelectionRegion.getOffset(), newSelectionRegion.getLength());
+							}
+							finally {
+								history.listenToSelectionChanges();
+							}
+						}
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This method will probably be removed and replaced by using new
+	 * selection provider
+	 * 
+	 * @param document
+	 * @param offset
+	 * @return
+	 */
+	protected IndexedRegion getIndexedRegion(IDocument document, int offset) {
+		IndexedRegion indexedRegion = null;
+
+		int lastOffset = offset;
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+		if (model != null) {
+			try {
+				indexedRegion = model.getIndexedRegion(lastOffset);
+				while (indexedRegion == null && lastOffset >= 0) {
+					lastOffset--;
+					indexedRegion = model.getIndexedRegion(lastOffset);
+				}
+			}
+			finally {
+				model.releaseFromRead();
+			}
+		}
+
+		return indexedRegion;
+	}
+
+	abstract protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection);
+
+	abstract protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AddBlockCommentHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AddBlockCommentHandler.java
new file mode 100644
index 0000000..97f999e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/AddBlockCommentHandler.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentRewriteSession;
+import org.eclipse.jface.text.DocumentRewriteSessionType;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.Logger;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy;
+import org.eclipse.wst.sse.ui.internal.comment.CommentingStrategyRegistry;
+
+/**
+ * <p>A comment handler to add block comments</p>
+ */
+public final class AddBlockCommentHandler extends
+		AbstractCommentHandler {
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.handlers.AbstractCommentHandler#processAction(
+	 * 	org.eclipse.ui.texteditor.ITextEditor, org.eclipse.jface.text.IDocument, org.eclipse.jface.text.ITextSelection)
+	 */
+	protected void processAction(ITextEditor textEditor, IStructuredDocument document, ITextSelection textSelection) {
+		IStructuredModel model = null;
+		boolean changed = false;
+		DocumentRewriteSession session = null;
+		
+		try {
+			model = StructuredModelManager.getModelManager().getModelForEdit(document);
+			if(model != null) {
+				//makes it so one undo will undo all the edits to the document
+				model.beginRecording(this, SSEUIMessages.AddBlockComment_label, SSEUIMessages.AddBlockComment_description);
+				
+				//keeps listeners from doing anything until updates are all done
+				model.aboutToChangeModel();
+				if(document instanceof IDocumentExtension4) {
+					session = ((IDocumentExtension4)document).startRewriteSession(DocumentRewriteSessionType.UNRESTRICTED);
+				}
+				changed = true;
+				
+				ITypedRegion[] typedRegions = document.computePartitioning(textSelection.getOffset(), textSelection.getLength());
+				CommentingStrategy commentType = CommentingStrategyRegistry.getDefault().getBlockCommentingStrategy(model.getContentTypeIdentifier(), typedRegions);
+				
+				if(commentType != null) {
+					commentType.apply(document, textSelection.getOffset(), textSelection.getLength());
+				}
+			}
+		} catch (BadLocationException e) {
+			Logger.logException("The given selection " + textSelection + " must be invalid", e); //$NON-NLS-1$ //$NON-NLS-2$
+		} finally {
+			//clean everything up
+			if(session != null && document instanceof IDocumentExtension4) {
+				((IDocumentExtension4)document).stopRewriteSession(session);
+			}
+			
+			if(model != null) {
+				model.endRecording(this);
+				if(changed) {
+					model.changedModel();
+				}
+				model.releaseFromEdit();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/FindOccurrencesHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/FindOccurrencesHandler.java
new file mode 100644
index 0000000..e8a5add
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/FindOccurrencesHandler.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesProcessor;
+import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil;
+
+public abstract class FindOccurrencesHandler extends AbstractHandler {
+	
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editorPart = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editorPart instanceof ITextEditor)
+			textEditor = (ITextEditor) editorPart;
+		else {
+			Object o = editorPart.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		boolean okay = false;
+		if (textEditor != null) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null) {
+				ITextSelection textSelection = getTextSelection(textEditor);
+				FindOccurrencesProcessor findOccurrenceProcessor = getProcessorForCurrentSelection(document, textSelection);
+				if (findOccurrenceProcessor != null) {
+					if (textEditor.getEditorInput() instanceof IFileEditorInput) {
+						IFile file = ((IFileEditorInput) textEditor.getEditorInput()).getFile();
+						okay = findOccurrenceProcessor.findOccurrences(document, textSelection, file);
+					}
+				}
+			}
+		}
+		if (okay) {
+			// clear status message
+			PlatformStatusLineUtil.clearStatusLine();
+		}
+		else {
+			String errorMessage = SSEUIMessages.FindOccurrencesActionProvider_0; //$NON-NLS-1$
+			if (textEditor instanceof StructuredTextEditor) {
+				PlatformStatusLineUtil.displayTemporaryErrorMessage(((StructuredTextEditor) textEditor).getTextViewer(), errorMessage);
+
+			}
+			else {
+				PlatformStatusLineUtil.displayErrorMessage(errorMessage);
+				PlatformStatusLineUtil.addOneTimeClearListener();
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * Get the appropriate find occurrences processor
+	 * 
+	 * @param document -
+	 *            assumes not null
+	 * @param textSelection
+	 * @return
+	 */
+	private FindOccurrencesProcessor getProcessorForCurrentSelection(IDocument document, ITextSelection textSelection) {
+		// check if we have an action that's enabled on the current partition
+		ITypedRegion tr = getPartition(document, textSelection);
+		String partition = tr != null ? tr.getType() : ""; //$NON-NLS-1$
+
+		Iterator it = getProcessors().iterator();
+		FindOccurrencesProcessor processor = null;
+		while (it.hasNext()) {
+			processor = (FindOccurrencesProcessor) it.next();
+			// we just choose the first action that can handle the partition
+			if (processor.enabledForParitition(partition))
+				return processor;
+		}
+
+		List extendedFindOccurrencesProcessors = ExtendedConfigurationBuilder.getInstance().getConfigurations(FindOccurrencesProcessor.class.getName(), partition);
+		for (int i = 0; i < extendedFindOccurrencesProcessors.size(); i++) {
+			Object o = extendedFindOccurrencesProcessors.get(i);
+			if (o instanceof FindOccurrencesProcessor) {
+				/*
+				 * We just choose the first registered processor that
+				 * explicitly says it can handle the partition
+				 */
+				processor = (FindOccurrencesProcessor) o;
+				if (processor.enabledForParitition(partition))
+					return processor;
+			}
+		}
+		return null;
+	}
+
+	private ITypedRegion getPartition(IDocument document, ITextSelection textSelection) {
+		ITypedRegion region = null;
+		if (textSelection != null) {
+			try {
+				region = document.getPartition(textSelection.getOffset());
+			}
+			catch (BadLocationException e) {
+				region = null;
+			}
+		}
+		return region;
+	}
+
+	private ITextSelection getTextSelection(ITextEditor textEditor) {
+		ITextSelection textSelection = null;
+		ISelection selection = textEditor.getSelectionProvider().getSelection();
+		if (selection instanceof ITextSelection && !selection.isEmpty()) {
+			textSelection = (ITextSelection) selection;
+		}
+		return textSelection;
+	}
+	
+	abstract protected List getProcessors();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/FormatHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/FormatHandler.java
new file mode 100644
index 0000000..6b1b815
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/FormatHandler.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation - bug 212330 -
+ *                    Based off FormatActionDelegate.java
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import java.io.IOException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.ITextFileBuffer;
+import org.eclipse.core.filebuffers.ITextFileBufferManager;
+import org.eclipse.core.filebuffers.LocationKind;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.wst.sse.core.internal.exceptions.MalformedInputExceptionWithDetail;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.ui.internal.FormatProcessorsExtensionReader;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+public class FormatHandler extends AbstractHandler implements IHandler {
+
+	protected IStructuredSelection fSelection;
+	
+	public void dispose() {
+		// nulling out just in case
+	}
+	
+	private IWorkbenchSiteProgressService getActiveProgressService() {
+		IWorkbenchSiteProgressService service = null;
+		if (PlatformUI.isWorkbenchRunning()) {
+			IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			if (activeWorkbenchWindow != null) {
+				IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+				if (activePage != null) {
+					IWorkbenchPart activePart = activePage.getActivePart();
+					if (activePart != null) {
+						service = (IWorkbenchSiteProgressService) activePart.getSite().getAdapter(IWorkbenchSiteProgressService.class);
+					}
+				}
+			}
+		}
+		return service;
+	}
+	
+	
+	
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		
+	    ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getSelectionService().getSelection();
+		
+		if (selection instanceof IStructuredSelection) {
+			fSelection = (IStructuredSelection) selection;
+			boolean available = false;
+
+			Object[] elements = fSelection.toArray();
+			for (int i = 0; i < elements.length; i++) {
+				if (elements[i] instanceof IResource) {
+					available = processorAvailable((IResource) elements[i]);
+
+					if (available)
+						break;
+				}
+			}
+		}
+		
+		if (fSelection != null && !fSelection.isEmpty()) {
+			Job job = getJob();
+			if (job != null) {
+				IWorkbenchSiteProgressService progressService = getActiveProgressService();
+				if (progressService != null) {
+					progressService.schedule(job);
+				}
+				else {
+					job.schedule();
+				}
+			}
+		}
+	
+		return null;
+	}
+	
+	
+	class FormatJob extends Job {
+
+		public FormatJob(String name) {
+			super(name);
+		}
+
+		protected IStatus run(IProgressMonitor monitor) {
+			IStatus status = Status.OK_STATUS;
+
+			Object[] elements = fSelection.toArray();
+			monitor.beginTask("", elements.length); //$NON-NLS-1$
+			for (int i = 0; i < elements.length; i++) {
+				if (elements[i] instanceof IResource) {
+					process(new SubProgressMonitor(monitor, 1), (IResource) elements[i]);
+				}
+				else {
+					monitor.worked(1);
+				}
+			}
+			monitor.done();
+
+			if (fErrorStatus.getChildren().length > 0) {
+				status = fErrorStatus;
+				fErrorStatus = new MultiStatus(SSEUIPlugin.ID, IStatus.ERROR, SSEUIMessages.FormatActionDelegate_errorStatusMessage, null); //$NON-NLS-1$
+			}
+
+			return status;
+		}
+
+	}
+
+	private MultiStatus fErrorStatus = new MultiStatus(SSEUIPlugin.ID, IStatus.ERROR, SSEUIMessages.FormatActionDelegate_errorStatusMessage, null); //$NON-NLS-1$
+
+	protected void format(IProgressMonitor monitor, IFile file) {
+		if(monitor == null || monitor.isCanceled())
+			return;
+		
+		try {
+			monitor.beginTask("", 100);
+			IContentDescription contentDescription = file.getContentDescription();
+			monitor.worked(5);
+			if (contentDescription != null) {
+				IContentType contentType = contentDescription.getContentType();
+				IStructuredFormatProcessor formatProcessor = getFormatProcessor(contentType.getId());
+				if (formatProcessor != null && (monitor == null || !monitor.isCanceled())) {
+					String message = NLS.bind(SSEUIMessages.FormatActionDelegate_3, new String[]{file.getFullPath().toString().substring(1)});					monitor.subTask(message);
+					formatProcessor.setProgressMonitor(new SubProgressMonitor(monitor, 95));
+					formatProcessor.formatFile(file);
+				}
+			}
+			monitor.done();
+		} catch (MalformedInputExceptionWithDetail e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_5, new String[]{file.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		} catch (IOException e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{file.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		} catch (CoreException e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{file.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		}
+	}
+
+	protected void format(final IProgressMonitor monitor, IResource resource) {
+		if (resource instanceof IFile) {
+			final IFile file = (IFile) resource;
+
+			// BUG 178598 - If the resource is shared, and it's possible to
+			// get the workbench Display, the UI thread is asked to execute the
+			// format of the file when it can
+			monitor.beginTask("", 20); //$NON-NLS-1$
+			try {
+				ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
+				ITextFileBuffer buffer = null;
+				
+				try {
+					if(manager != null) {
+						manager.connect(file.getFullPath(), LocationKind.IFILE, new SubProgressMonitor(monitor, 1));
+						buffer = manager.getTextFileBuffer(resource.getFullPath(), LocationKind.IFILE);
+					}
+					
+					if(buffer != null && buffer.isShared()) {
+						Display display = getDisplay();
+						if (display != null) {
+							display.syncExec(new Runnable() {
+								public void run() {
+									format(new SubProgressMonitor(monitor, 18), file);
+								}
+							});
+						}
+					}
+					else
+						format(new SubProgressMonitor(monitor, 18), file);
+				}
+				finally {
+					if(manager != null)
+						manager.disconnect(file.getFullPath(), LocationKind.IFILE, new SubProgressMonitor(monitor, 1));
+				}
+				monitor.done();
+			}
+			catch(CoreException e) {
+				String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{file.getFullPath().toString()});
+				fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+			}
+			finally {
+				if(monitor != null)
+					monitor.done();
+			}
+			
+			
+		} else if (resource instanceof IContainer) {
+			IContainer container = (IContainer) resource;
+
+			try {
+				IResource[] members = container.members();
+				monitor.beginTask("", members.length); //$NON-NLS-1$
+				for (int i = 0; i < members.length; i++) {
+					if (monitor != null && !monitor.isCanceled())
+						format(new SubProgressMonitor(monitor, 1), members[i]);
+				}
+				monitor.done();
+			} catch (CoreException e) {
+				String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{resource.getFullPath().toString()});
+				fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+			}
+		}
+	}
+	
+	private Display getDisplay() {
+
+		// Note: the workbench should always have a display
+		// (unless running headless), whereas Display.getCurrent()
+		// only returns the display if the currently executing thread
+		// has one.
+		if (PlatformUI.isWorkbenchRunning())
+			return PlatformUI.getWorkbench().getDisplay();
+		else
+			return null;
+	}
+
+	protected IStructuredFormatProcessor getFormatProcessor(String contentTypeId) {
+		return FormatProcessorsExtensionReader.getInstance().getFormatProcessor(contentTypeId);
+	}
+
+	protected Job getJob() {
+		return new FormatJob(SSEUIMessages.FormatActionDelegate_jobName); //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.edit.util.ResourceActionDelegate#process(org.eclipse.core.runtime.IProgressMonitor,
+	 *      org.eclipse.core.resources.IResource)
+	 */
+	protected void process(IProgressMonitor monitor, IResource resource) {
+		monitor.beginTask("", 100);
+		format(new SubProgressMonitor(monitor, 98), resource);
+
+		try {
+			resource.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 2));
+		} catch (CoreException e) {
+			String message = NLS.bind(SSEUIMessages.FormatActionDelegate_4, new String[]{resource.getFullPath().toString()});
+			fErrorStatus.add(new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.ERROR, message, e));
+		}
+		monitor.done();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.internal.actions.ResourceActionDelegate#processorAvailable(org.eclipse.core.resources.IResource)
+	 */
+	protected boolean processorAvailable(IResource resource) {
+		boolean result = false;
+		if (resource.isAccessible()) {
+			try {
+				if (resource instanceof IFile) {
+					IFile file = (IFile) resource;
+
+					IStructuredFormatProcessor formatProcessor = null;
+					IContentDescription contentDescription = file.getContentDescription();
+					if (contentDescription != null) {
+						IContentType contentType = contentDescription.getContentType();
+						formatProcessor = getFormatProcessor(contentType.getId());
+					}
+					if (formatProcessor != null)
+						result = true;
+				}
+				else if (resource instanceof IContainer) {
+					IContainer container = (IContainer) resource;
+					IResource[] members;
+					members = container.members();
+					for (int i = 0; i < members.length; i++) {
+						boolean available = processorAvailable(members[i]);
+
+						if (available) {
+							result = true;
+							break;
+						}
+					}
+				}
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+
+		return result;
+	}
+	
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/RemoveBlockCommentHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/RemoveBlockCommentHandler.java
new file mode 100644
index 0000000..5cf0beb
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/RemoveBlockCommentHandler.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentRewriteSession;
+import org.eclipse.jface.text.DocumentRewriteSessionType;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy;
+import org.eclipse.wst.sse.ui.internal.comment.CommentingStrategyRegistry;
+
+/**
+ * <p>A comment handler to remove block comments</p>
+ */
+public final class RemoveBlockCommentHandler extends
+		AbstractCommentHandler {
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.handlers.AbstractCommentHandler#processAction(org.eclipse.ui.texteditor.ITextEditor, org.eclipse.jface.text.IDocument, org.eclipse.jface.text.ITextSelection)
+	 */
+	protected void processAction(ITextEditor textEditor, IStructuredDocument document, ITextSelection textSelection) {
+		
+		IStructuredModel model = null;
+		boolean changed = false;
+		DocumentRewriteSession session = null;
+		try {
+			model = StructuredModelManager.getModelManager().getModelForEdit(document);
+			
+			if(model != null) {
+				//makes it so one undo will undo all the edits to the document
+				model.beginRecording(this, SSEUIMessages.RemoveBlockComment_label,
+						SSEUIMessages.RemoveBlockComment_label);
+				
+				//keeps listeners from doing anything until updates are all done
+				model.aboutToChangeModel();
+				if(document instanceof IDocumentExtension4) {
+					session = ((IDocumentExtension4)document).startRewriteSession(
+							DocumentRewriteSessionType.UNRESTRICTED);
+				}
+				changed = true;
+				
+				ITypedRegion[] typedRegions = document.computePartitioning(
+						textSelection.getOffset(), textSelection.getLength());
+				CommentingStrategy commentType = CommentingStrategyRegistry.getDefault().getBlockCommentingStrategy(
+						model.getContentTypeIdentifier(), typedRegions);
+				
+				if(commentType != null) {
+					commentType.remove(document, textSelection.getOffset(), textSelection.getLength(), true);
+				}
+			}
+		} catch (BadLocationException e) {
+			Logger.logException("The given selection " + textSelection + " must be invalid", e); //$NON-NLS-1$ //$NON-NLS-2$
+		} finally {
+			//clean everything up
+			if(session != null && document instanceof IDocumentExtension4) {
+				((IDocumentExtension4)document).stopRewriteSession(session);
+			}
+			
+			if(model != null) {
+				model.endRecording(this);
+				if(changed) {
+					model.changedModel();
+				}
+				model.releaseFromEdit();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/StructuredSelectHistoryHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/StructuredSelectHistoryHandler.java
new file mode 100644
index 0000000..13c5528
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/StructuredSelectHistoryHandler.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.internal.selection.SelectionHistory;
+
+public class StructuredSelectHistoryHandler extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		SelectionHistory history = (SelectionHistory) editor.getAdapter(SelectionHistory.class);
+		if (history != null) {
+			IRegion old = history.getLast();
+			if (old != null) {
+				try {
+					history.ignoreSelectionChanges();
+
+					ITextEditor textEditor = null;
+					if (editor instanceof ITextEditor)
+						textEditor = (ITextEditor) editor;
+					else {
+						Object o = editor.getAdapter(ITextEditor.class);
+						if (o != null)
+							textEditor = (ITextEditor) o;
+					}
+					if (textEditor != null)
+						textEditor.selectAndReveal(old.getOffset(), old.getLength());
+				}
+				finally {
+					history.listenToSelectionChanges();
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/ToggleLineCommentHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/ToggleLineCommentHandler.java
new file mode 100644
index 0000000..d19d404
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/handlers/ToggleLineCommentHandler.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentRewriteSession;
+import org.eclipse.jface.text.DocumentRewriteSessionType;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.comment.BlockCommentingStrategy;
+import org.eclipse.wst.sse.ui.internal.comment.CommentingStrategy;
+import org.eclipse.wst.sse.ui.internal.comment.CommentingStrategyRegistry;
+import org.eclipse.wst.sse.ui.internal.comment.LineCommentingStrategy;
+
+/**
+ * <p>A comment handler to toggle line comments, this means that if a
+ * comment already exists on a line then toggling it will remove the comment,
+ * if the line in question is not already commented then it will not be commented.
+ * If multiple lines are selected each will be commented separately.  The handler
+ * first attempts to find a {@link LineCommentingStrategy} for a line, if it can
+ * not find one then it will try and find a {@link BlockCommentingStrategy} to
+ * wrap just that line in.</p>
+ * 
+ * <p>If a great number of lines are being toggled then a progress dialog will be
+ * displayed because this can be a timely process</p>
+ */
+public final class ToggleLineCommentHandler extends AbstractCommentHandler {
+	/** if toggling more then this many lines then use a busy indicator */
+	private static final int TOGGLE_LINES_MAX_NO_BUSY_INDICATOR = 10;
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.handlers.AbstractCommentHandler#processAction(
+	 * 	org.eclipse.ui.texteditor.ITextEditor, org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument,
+	 * 	org.eclipse.jface.text.ITextSelection)
+	 */
+	protected void processAction(ITextEditor textEditor,
+			final IStructuredDocument document, ITextSelection textSelection) {
+		
+		IStructuredModel model = null;
+		DocumentRewriteSession session = null;
+		boolean changed = false;
+		
+		try {
+			// get text selection lines info
+			int selectionStartLine = textSelection.getStartLine();
+			int selectionEndLine = textSelection.getEndLine();
+			
+			int selectionEndLineOffset = document.getLineOffset(selectionEndLine);
+			int selectionEndOffset = textSelection.getOffset() + textSelection.getLength();
+
+			// adjust selection end line
+			if ((selectionEndLine > selectionStartLine) && (selectionEndLineOffset == selectionEndOffset)) {
+				selectionEndLine--;
+			}
+
+			// save the selection position since it will be changing
+			Position selectionPosition = null;
+			selectionPosition = new Position(textSelection.getOffset(), textSelection.getLength());
+			document.addPosition(selectionPosition);
+
+			
+			model = StructuredModelManager.getModelManager().getModelForEdit(document);
+			if (model != null) {
+				//makes it so one undo will undo all the edits to the document
+				model.beginRecording(this, SSEUIMessages.ToggleComment_label, SSEUIMessages.ToggleComment_description);
+				
+				//keeps listeners from doing anything until updates are all done
+				model.aboutToChangeModel();
+				if(document instanceof IDocumentExtension4) {
+					session = ((IDocumentExtension4)document).startRewriteSession(DocumentRewriteSessionType.UNRESTRICTED);
+				}
+				changed = true;
+				
+				//get the display for the editor if we can
+				Display display = null;
+				if(textEditor instanceof StructuredTextEditor) {
+					StructuredTextViewer viewer = ((StructuredTextEditor)textEditor).getTextViewer();
+					if(viewer != null) {
+						display = viewer.getControl().getDisplay();
+					}
+				}
+				
+				//create the toggling operation
+				IRunnableWithProgress toggleCommentsRunnable = new ToggleLinesRunnable(
+						model.getContentTypeIdentifier(), document, selectionStartLine, selectionEndLine, display);
+				
+				//if toggling lots of lines then use progress monitor else just run the operation
+				if((selectionEndLine - selectionStartLine) > TOGGLE_LINES_MAX_NO_BUSY_INDICATOR && display != null) {
+					ProgressMonitorDialog dialog = new ProgressMonitorDialog(display.getActiveShell());
+					dialog.run(false, true, toggleCommentsRunnable);
+				} else {
+					toggleCommentsRunnable.run(new NullProgressMonitor());
+				}
+			}
+		} catch (InvocationTargetException e) {
+			Logger.logException("Problem running toggle comment progess dialog.", e);  //$NON-NLS-1$
+		} catch (InterruptedException e) {
+			Logger.logException("Problem running toggle comment progess dialog.", e);  //$NON-NLS-1$
+		} catch (BadLocationException e) {
+			Logger.logException("The given selection " + textSelection + " must be invalid", e); //$NON-NLS-1$ //$NON-NLS-2$
+		} finally {
+			//clean everything up
+			if(session != null && document instanceof IDocumentExtension4) {
+				((IDocumentExtension4)document).stopRewriteSession(session);
+			}
+			
+			if(model != null) {
+				model.endRecording(this);
+				if(changed) {
+					model.changedModel();
+				}
+				model.releaseFromEdit();
+			}
+		}
+	}
+	
+	/**
+	 * <p>The actual line toggling takes place in a runnable so it can be
+	 * run as part of a progress dialog if there are many lines to toggle
+	 * and thus the operation will take a noticeable amount of time the user
+	 * should be aware of, this also allows for the operation to be canceled 
+	 * by the user</p>
+	 * 
+	 */
+	private static class ToggleLinesRunnable implements IRunnableWithProgress {
+		/** the content type for the document being commented */
+		private String fContentType;
+		
+		/** the document that the lines will be toggled on */
+		private IStructuredDocument fDocument;
+		
+		/** the first line in the document to toggle */
+		private int fSelectionStartLine;
+		
+		/** the last line in the document to toggle */
+		private int fSelectionEndLine;
+		
+		/** the display, so that it can be updated during a long operation */
+		private Display fDisplay;
+		
+		/**
+		 * @param model {@link IStructuredModel} that the lines will be toggled on
+		 * @param document {@link IDocument} that the lines will be toggled on
+		 * @param selectionStartLine first line in the document to toggle
+		 * @param selectionEndLine last line in the document to toggle
+		 * @param display {@link Display}, so that it can be updated during a long operation
+		 */
+		protected ToggleLinesRunnable(String contentTypeIdentifier, IStructuredDocument document,
+				int selectionStartLine, int selectionEndLine, Display display) {
+			
+			this.fContentType = contentTypeIdentifier;
+			this.fDocument = document;
+			this.fSelectionStartLine = selectionStartLine;
+			this.fSelectionEndLine = selectionEndLine;
+			this.fDisplay = display;
+		}
+		
+		/**
+		 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
+		 */
+		public void run(IProgressMonitor monitor) {
+			//start work
+			monitor.beginTask(SSEUIMessages.ToggleComment_progress,
+					this.fSelectionEndLine-this.fSelectionStartLine);
+			try {
+				//toggle each line so long as task not canceled
+				for (int line = this.fSelectionStartLine;
+						line <= this.fSelectionEndLine && !monitor.isCanceled(); ++line) {
+					
+					//allows the user to be able to click the cancel button
+					readAndDispatch(this.fDisplay);
+					
+					//get the line region
+					IRegion lineRegion = this.fDocument.getLineInformation(line);
+					
+					//don't toggle empty lines
+					String content = this.fDocument.get(lineRegion.getOffset(), lineRegion.getLength());
+					if (content.trim().length() > 0) {
+						//try to get a line comment type
+						ITypedRegion[] lineTypedRegions =
+							this.fDocument.computePartitioning(lineRegion.getOffset(), lineRegion.getLength());
+						CommentingStrategy commentType = CommentingStrategyRegistry.getDefault().getLineCommentingStrategy(
+								this.fContentType, lineTypedRegions);
+						
+						//could not find line comment type so find block comment type to use on line
+						if(commentType == null) {
+							commentType = CommentingStrategyRegistry.getDefault().getBlockCommentingStrategy(
+									this.fContentType, lineTypedRegions);
+						}
+						
+						//toggle the comment on the line
+						if(commentType != null) {
+							if(commentType.alreadyCommenting(this.fDocument, lineTypedRegions)) {
+								commentType.remove(this.fDocument, lineRegion.getOffset(), lineRegion.getLength(), true);
+							} else {
+								commentType.apply(this.fDocument, lineRegion.getOffset(), lineRegion.getLength());
+							}
+						}
+					}
+					monitor.worked(1);
+				}
+			} catch(BadLocationException e) {
+				Logger.logException("Bad location while toggling comments.", e);  //$NON-NLS-1$
+			}
+			//done work
+			monitor.done();
+		}
+		
+		/**
+		 * <p>When calling {@link Display#readAndDispatch()} the game is off as to whose code you maybe
+		 * calling into because of event handling/listeners/etc.  The only important thing is that
+		 * the UI has been given a chance to react to user clicks.  Thus the logging of most {@link Exception}s
+		 * and {@link Error}s as caused by {@link Display#readAndDispatch()} because they are not caused
+		 * by this code and do not effect it.</p>
+		 * 
+		 * @param display the {@link Display} to call <code>readAndDispatch</code>
+		 * on with exception/error handling.
+		 */
+		private void readAndDispatch(Display display) {
+			try {
+				display.readAndDispatch();
+			}
+			catch (Exception e) {
+				Logger.log(Logger.WARNING,
+						"Exception caused by readAndDispatch, not caused by or fatal to caller", e);
+			}
+			catch (LinkageError e) {
+				Logger.log(Logger.WARNING,
+						"LinkageError caused by readAndDispatch, not caused by or fatal to caller", e);
+			}
+			catch (VirtualMachineError e) {
+				// re-throw these
+				throw e;
+			}
+			catch (ThreadDeath e) {
+				// re-throw these
+				throw e;
+			}
+			catch (Error e) {
+				// catch every error, except for a few that we don't want to handle
+				Logger.log(Logger.WARNING,
+						"Error caused by readAndDispatch, not caused by or fatal to caller", e);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/hyperlink/HighlighterHyperlinkPresenter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/hyperlink/HighlighterHyperlinkPresenter.java
new file mode 100644
index 0000000..5085fa4
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/hyperlink/HighlighterHyperlinkPresenter.java
@@ -0,0 +1,468 @@
+package org.eclipse.wst.sse.ui.internal.hyperlink;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.text.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension2;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ * The is almost an exact copy of DefaultHyperlinkPresenter. However this
+ * hyperlink presenter works with the StructuredTextEditor's Highlighter
+ * instead of TextPresentation.
+ * 
+ * The main difference is <code>text.redrawRange(offset, length, true);</code>
+ * is called instead of passing false for clearBackground. Also all mention of
+ * TextPresentation was removed since it does not really apply.
+ * 
+ * @see org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter
+ */
+public class HighlighterHyperlinkPresenter implements IHyperlinkPresenter, PaintListener, ITextInputListener, IDocumentListener, IPropertyChangeListener {
+
+	/**
+	 * A named preference that holds the color used for hyperlinks.
+	 * <p>
+	 * Value is of type <code>String</code>. A RGB color value encoded as a
+	 * string using class <code>PreferenceConverter</code>
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.resource.StringConverter
+	 * @see org.eclipse.jface.preference.PreferenceConverter
+	 */
+	public final static String HYPERLINK_COLOR = "hyperlinkColor"; //$NON-NLS-1$
+
+
+	/** The text viewer. */
+	private ITextViewer fTextViewer;
+	/** The hand cursor. */
+	private Cursor fCursor;
+	/** The link color. */
+	private Color fColor;
+	/** Tells whether to dispose the color on uninstall. */
+	private boolean fDisposeColor;
+	/** The currently active region. */
+	private IRegion fActiveRegion;
+	/** The currently active style range as position. */
+	private Position fRememberedPosition;
+	/** The optional preference store */
+	private IPreferenceStore fPreferenceStore;
+
+
+	/**
+	 * Creates a new default hyperlink presenter which uses
+	 * {@link #HYPERLINK_COLOR}to read the color from the given preference
+	 * store.
+	 * 
+	 * @param store
+	 *            the preference store
+	 */
+	public HighlighterHyperlinkPresenter(IPreferenceStore store) {
+		fPreferenceStore = store;
+		fDisposeColor = true;
+	}
+
+	/**
+	 * Creates a new default hyperlink presenter.
+	 * 
+	 * @param color
+	 *            the hyperlink color, to be disposed by the caller
+	 */
+	public HighlighterHyperlinkPresenter(Color color) {
+		fDisposeColor = false;
+		fColor = color;
+	}
+
+	public boolean canShowMultipleHyperlinks() {
+		return false;
+	}
+
+	public void showHyperlinks(IHyperlink[] hyperlinks) {
+		Assert.isLegal(hyperlinks != null && hyperlinks.length == 1);
+		highlightRegion(hyperlinks[0].getHyperlinkRegion());
+		activateCursor();
+	}
+
+	public void hideHyperlinks() {
+		repairRepresentation();
+		fRememberedPosition = null;
+	}
+
+	public void install(ITextViewer textViewer) {
+		Assert.isNotNull(textViewer);
+		fTextViewer = textViewer;
+		fTextViewer.addTextInputListener(this);
+
+		StyledText text = fTextViewer.getTextWidget();
+		if (text != null && !text.isDisposed()) {
+			text.addPaintListener(this);
+			if (fPreferenceStore != null)
+				fColor = createColor(fPreferenceStore, HYPERLINK_COLOR, text.getDisplay());
+		}
+
+		if (fPreferenceStore != null)
+			fPreferenceStore.addPropertyChangeListener(this);
+	}
+
+	public void uninstall() {
+		fTextViewer.removeTextInputListener(this);
+
+		if (fColor != null) {
+			if (fDisposeColor)
+				fColor.dispose();
+			fColor = null;
+		}
+
+		if (fCursor != null) {
+			fCursor.dispose();
+			fCursor = null;
+		}
+
+		StyledText text = fTextViewer.getTextWidget();
+		if (text != null && !text.isDisposed())
+			text.removePaintListener(this);
+
+		fTextViewer = null;
+
+		if (fPreferenceStore != null)
+			fPreferenceStore.removePropertyChangeListener(this);
+	}
+
+	public void setColor(Color color) {
+		Assert.isNotNull(fTextViewer);
+		fColor = color;
+	}
+
+	private void highlightRegion(IRegion region) {
+
+		if (region.equals(fActiveRegion))
+			return;
+
+		repairRepresentation();
+
+		StyledText text = fTextViewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+
+
+		// Underline
+		int offset = 0;
+		int length = 0;
+		if (fTextViewer instanceof ITextViewerExtension5) {
+			ITextViewerExtension5 extension = (ITextViewerExtension5) fTextViewer;
+			IRegion widgetRange = extension.modelRange2WidgetRange(region);
+			if (widgetRange == null)
+				return;
+
+			offset = widgetRange.getOffset();
+			length = widgetRange.getLength();
+
+		}
+		else {
+			offset = region.getOffset() - fTextViewer.getVisibleRegion().getOffset();
+			length = region.getLength();
+		}
+
+		// needs to clean background due to StructuredTextEditor's highlighter
+		text.redrawRange(offset, length, true);
+
+		// Invalidate region ==> apply text presentation
+		fActiveRegion = region;
+
+		if (fTextViewer instanceof ITextViewerExtension2)
+			((ITextViewerExtension2) fTextViewer).invalidateTextPresentation(region.getOffset(), region.getLength());
+		else
+			fTextViewer.invalidateTextPresentation();
+	}
+
+	private void activateCursor() {
+		StyledText text = fTextViewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+		Display display = text.getDisplay();
+		if (fCursor == null)
+			fCursor = new Cursor(display, SWT.CURSOR_HAND);
+		text.setCursor(fCursor);
+	}
+
+	private void resetCursor() {
+		StyledText text = fTextViewer.getTextWidget();
+		if (text != null && !text.isDisposed())
+			text.setCursor(null);
+
+		if (fCursor != null) {
+			fCursor.dispose();
+			fCursor = null;
+		}
+	}
+
+	private void repairRepresentation() {
+
+		if (fActiveRegion == null)
+			return;
+
+		int offset = fActiveRegion.getOffset();
+		int length = fActiveRegion.getLength();
+		fActiveRegion = null;
+
+		resetCursor();
+
+		// Invalidate ==> remove applied text presentation
+		if (fTextViewer instanceof ITextViewerExtension2)
+			((ITextViewerExtension2) fTextViewer).invalidateTextPresentation(offset, length);
+		else
+			fTextViewer.invalidateTextPresentation();
+
+		// Remove underline
+		if (fTextViewer instanceof ITextViewerExtension5) {
+			ITextViewerExtension5 extension = (ITextViewerExtension5) fTextViewer;
+			offset = extension.modelOffset2WidgetOffset(offset);
+		}
+		else {
+			offset -= fTextViewer.getVisibleRegion().getOffset();
+		}
+		try {
+			StyledText text = fTextViewer.getTextWidget();
+
+			// needs to clean background due to StructuredTextEditor's
+			// highlighter
+			text.redrawRange(offset, length, true);
+
+		}
+		catch (IllegalArgumentException x) {
+			// ignore - do not log
+		}
+	}
+
+	/*
+	 * @see PaintListener#paintControl(PaintEvent)
+	 */
+	public void paintControl(PaintEvent event) {
+		if (fActiveRegion == null)
+			return;
+
+		StyledText text = fTextViewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+
+		int offset = 0;
+		int length = 0;
+
+		if (fTextViewer instanceof ITextViewerExtension5) {
+
+			ITextViewerExtension5 extension = (ITextViewerExtension5) fTextViewer;
+			IRegion widgetRange = extension.modelRange2WidgetRange(fActiveRegion);
+			if (widgetRange == null)
+				return;
+
+			offset = widgetRange.getOffset();
+			length = widgetRange.getLength();
+
+		}
+		else {
+
+			IRegion region = fTextViewer.getVisibleRegion();
+			if (!includes(region, fActiveRegion))
+				return;
+
+			offset = fActiveRegion.getOffset() - region.getOffset();
+			length = fActiveRegion.getLength();
+		}
+
+		// support for BIDI
+		Point minLocation = getMinimumLocation(text, offset, length);
+		Point maxLocation = getMaximumLocation(text, offset, length);
+
+		int x1 = minLocation.x;
+		int x2 = maxLocation.x - 1;
+		int y = minLocation.y + text.getLineHeight() - 1;
+
+		GC gc = event.gc;
+		if (fColor != null && !fColor.isDisposed())
+			gc.setForeground(fColor);
+		else if (fColor == null && !(offset < 0 && offset >= text.getCharCount())) {
+			StyleRange style = text.getStyleRangeAtOffset(offset);
+			if (style != null)
+				gc.setForeground(style.foreground);
+		}
+		gc.drawLine(x1, y, x2, y);
+	}
+
+	private Point getMinimumLocation(StyledText text, int offset, int length) {
+		int max = text.getCharCount();
+		Rectangle bounds = text.getBounds();
+		Point minLocation = new Point(bounds.width, bounds.height);
+		for (int i = 0; i <= length; i++) {
+			int k = offset + i;
+			if (k < 0 || k > max)
+				break;
+
+			Point location = text.getLocationAtOffset(k);
+			if (location.x < minLocation.x)
+				minLocation.x = location.x;
+			if (location.y < minLocation.y)
+				minLocation.y = location.y;
+		}
+
+		return minLocation;
+	}
+
+	private Point getMaximumLocation(StyledText text, int offset, int length) {
+		Point maxLocation = new Point(0, 0);
+
+		for (int i = 0; i <= length; i++) {
+			int k = offset + i;
+			if (k < 0 || k > text.getCharCount())
+				break;
+
+			Point location = text.getLocationAtOffset(k);
+			if (location.x > maxLocation.x)
+				maxLocation.x = location.x;
+			if (location.y > maxLocation.y)
+				maxLocation.y = location.y;
+		}
+
+		return maxLocation;
+	}
+
+	private boolean includes(IRegion region, IRegion position) {
+		return position.getOffset() >= region.getOffset() && position.getOffset() + position.getLength() <= region.getOffset() + region.getLength();
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentAboutToBeChanged(DocumentEvent event) {
+		if (fActiveRegion != null) {
+			fRememberedPosition = new Position(fActiveRegion.getOffset(), fActiveRegion.getLength());
+			try {
+				event.getDocument().addPosition(fRememberedPosition);
+			}
+			catch (BadLocationException x) {
+				fRememberedPosition = null;
+			}
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentChanged(DocumentEvent event) {
+		if (fRememberedPosition != null) {
+			if (!fRememberedPosition.isDeleted()) {
+
+				event.getDocument().removePosition(fRememberedPosition);
+				fActiveRegion = new Region(fRememberedPosition.getOffset(), fRememberedPosition.getLength());
+				fRememberedPosition = null;
+
+				StyledText widget = fTextViewer.getTextWidget();
+				if (widget != null && !widget.isDisposed()) {
+					widget.getDisplay().asyncExec(new Runnable() {
+						public void run() {
+							hideHyperlinks();
+						}
+					});
+				}
+
+			}
+			else {
+				fActiveRegion = null;
+				fRememberedPosition = null;
+				hideHyperlinks();
+			}
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface.text.IDocument,
+	 *      org.eclipse.jface.text.IDocument)
+	 */
+	public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+		if (oldInput == null)
+			return;
+		hideHyperlinks();
+		oldInput.removeDocumentListener(this);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument,
+	 *      org.eclipse.jface.text.IDocument)
+	 */
+	public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+		if (newInput == null)
+			return;
+		newInput.addDocumentListener(this);
+	}
+
+	/**
+	 * Creates a color from the information stored in the given preference
+	 * store.
+	 * 
+	 * @param store
+	 *            the preference store
+	 * @param key
+	 *            the key
+	 * @param display
+	 *            the display
+	 * @return the color or <code>null</code> if there is no such
+	 *         information available
+	 */
+	private Color createColor(IPreferenceStore store, String key, Display display) {
+
+		RGB rgb = null;
+
+		if (store.contains(key)) {
+
+			if (store.isDefault(key))
+				rgb = PreferenceConverter.getDefaultColor(store, key);
+			else
+				rgb = PreferenceConverter.getColor(store, key);
+
+			if (rgb != null)
+				return new Color(display, rgb);
+		}
+
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+	 */
+	public void propertyChange(PropertyChangeEvent event) {
+		if (!HYPERLINK_COLOR.equals(event.getProperty()))
+			return;
+
+		if (fDisposeColor && fColor != null && !fColor.isDisposed())
+			fColor.dispose();
+		fColor = null;
+
+		StyledText textWidget = fTextViewer.getTextWidget();
+		if (textWidget != null && !textWidget.isDisposed())
+			fColor = createColor(fPreferenceStore, HYPERLINK_COLOR, textWidget.getDisplay());
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/hyperlink/OpenHyperlinkAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/hyperlink/OpenHyperlinkAction.java
new file mode 100644
index 0000000..35a6e55
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/hyperlink/OpenHyperlinkAction.java
@@ -0,0 +1,81 @@
+package org.eclipse.wst.sse.ui.internal.hyperlink;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextEditorAction;
+
+/**
+ * Open hyperlink action
+ */
+public class OpenHyperlinkAction extends TextEditorAction {
+	private IHyperlinkDetector[] fHyperlinkDetectors;
+	private ITextViewer fTextViewer;
+
+	public OpenHyperlinkAction(ResourceBundle bundle, String prefix, ITextEditor editor, ITextViewer viewer) {
+		super(bundle, prefix, editor);
+		fTextViewer = viewer;
+	}
+
+	public void setHyperlinkDetectors(IHyperlinkDetector[] detectors) {
+		fHyperlinkDetectors = detectors;
+	}
+
+	public void run() {
+		if (fHyperlinkDetectors == null)
+			return;
+		ISelection selection = getTextEditor().getSelectionProvider().getSelection();
+		if (selection == null || !(selection instanceof ITextSelection)) {
+			return;
+		}
+
+		ITextSelection textSelection = (ITextSelection) selection;
+		final IRegion region = new Region(textSelection.getOffset(), textSelection.getLength());
+		IHyperlink hyperlink = null;
+
+		synchronized (fHyperlinkDetectors) {
+			for (int i = 0, length = fHyperlinkDetectors.length; i < length && hyperlink == null; i++) {
+				final IHyperlinkDetector detector = fHyperlinkDetectors[i];
+				if (detector == null)
+					continue;
+
+				/* The array is final, but its contents aren't */
+				final IHyperlink[][] hyperlinks = new IHyperlink[1][];
+
+				/*
+				 * Detect from within a SafeRunnable since the list of
+				 * detectors is extensible
+				 */
+				SafeRunnable detectorRunnable = new SafeRunnable() {
+					public void run() throws Exception {
+						hyperlinks[0] = detector.detectHyperlinks(fTextViewer, region, false);
+					}
+				};
+				SafeRunner.run(detectorRunnable);
+
+				if (hyperlinks[0] == null)
+					continue;
+
+				if (hyperlinks.length > 0)
+					hyperlink = hyperlinks[0][0];
+			}
+		}
+		if (hyperlink != null) {
+			/**
+			 * Force the highlight range to change when the hyperlink is
+			 * opened by altering the highlighted range beforehand.
+			 */
+			getTextEditor().setHighlightRange(Math.max(0, region.getOffset() - 1), 0, false);
+			hyperlink.open();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/AbstractOpenOn.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/AbstractOpenOn.java
new file mode 100644
index 0000000..72fb2a6
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/AbstractOpenOn.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.swt.program.Program;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.util.URIResolver;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil;
+
+
+/**
+ * This action class retrieves the link/file selected by the cursor and
+ * attempts to open the link/file in the default editor or web browser
+ * 
+ * @deprecated Use base support for hyperlink navigation
+ */
+abstract public class AbstractOpenOn implements IOpenOn {
+	protected final String CANNOT_OPEN = SSEUIMessages.AbstractOpenOn_0; //$NON-NLS-1$
+	// document currently associated with open
+	private IDocument fDocument;
+	protected final String FILE_PROTOCOL = "file:/";//$NON-NLS-1$
+	private final String HTTP_PROTOCOL = "http://";//$NON-NLS-1$
+
+	abstract protected IRegion doGetOpenOnRegion(int offset);
+
+	abstract protected void doOpenOn(IRegion region);
+
+	/**
+	 * Returns the current document associated with open on
+	 * 
+	 * @return IDocument
+	 */
+	public IDocument getDocument() {
+		return fDocument;
+	}
+
+	/**
+	 * Determines the editor associated with the given file name
+	 * 
+	 * @param filename
+	 * @return editor id of the editor associated with the given file name
+	 */
+	private String getEditorId(String filename) {
+		IWorkbench workbench = PlatformUI.getWorkbench();
+		IEditorRegistry editorRegistry = workbench.getEditorRegistry();
+		IEditorDescriptor descriptor = editorRegistry.getDefaultEditor(filename);
+		if (descriptor != null)
+			return descriptor.getId();
+		return EditorsUI.DEFAULT_TEXT_EDITOR_ID;
+	}
+
+	/**
+	 * Returns an IFile from the given uri if possible, null if cannot find
+	 * file from uri.
+	 * 
+	 * @param fileString
+	 *            file system path
+	 * @return returns IFile if fileString exists in the workspace
+	 */
+	protected IFile getFile(String fileString) {
+		IStructuredModel model = null;
+		IFile file = null;
+		try {
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			if (model != null) {
+				// use the base location to obtain the in-workspace IFile
+				IFile modelFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(model.getBaseLocation()));
+				if (modelFile != null) {
+					// find the referenced file's location on disk
+					URIResolver resolver = model.getResolver();
+					if (resolver != null) {
+						String filesystemLocation = resolver.getLocationByURI(fileString);
+						if (filesystemLocation != null) {
+							IFile[] workspaceFiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(filesystemLocation));
+							// favor a workspace file in the same project
+							for (int i = 0; i < workspaceFiles.length && file == null; i++) {
+								if (workspaceFiles[i].getProject().equals(modelFile.getProject())) {
+									file = workspaceFiles[i];
+								}
+							}
+							// if none were in the same project, just pick one
+							if (file == null && workspaceFiles.length > 0) {
+								file = workspaceFiles[0];
+							}
+						}
+					}
+				}
+			}
+		}
+		catch (Exception e) {
+			Logger.log(Logger.WARNING, e.getMessage());
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+		if (file == null && fileString.startsWith("/")) { //$NON-NLS-1$
+			file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString));
+		}
+		return file;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.IOpenOn#getOpenOnRegion(org.eclipse.jface.text.IDocument,
+	 *      int)
+	 */
+	public IRegion getOpenOnRegion(IDocument doc, int offset) {
+		IRegion region;
+		// set the document for this action
+		setDocument(doc);
+		region = doGetOpenOnRegion(offset);
+		// reset the document back to null for this action
+		setDocument(null);
+		return region;
+	}
+
+	/**
+	 * Try to open the external file, fileString in its default editor
+	 * 
+	 * @param fileString
+	 * @return IEditorPart editor opened or null if editor could not be opened
+	 */
+	protected IEditorPart openExternalFile(String fileString) {
+		// file does not exist in workspace so try to open using system editor
+		File file = new File(fileString);
+		// try to open existing external file if it exists
+		if (file.exists()) {
+			IEditorInput input = new ExternalFileEditorInput(file);
+			String editorId = getEditorId(fileString);
+
+			try {
+				IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+				return page.openEditor(input, editorId, true);
+			}
+			catch (PartInitException pie) {
+				Logger.log(Logger.WARNING_DEBUG, pie.getMessage(), pie);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Notifies user that open on selection action could not successfully open
+	 * the selection (writes message on status bar and beeps)
+	 */
+	protected void openFileFailed() {
+		PlatformStatusLineUtil.displayErrorMessage(CANNOT_OPEN);
+		PlatformStatusLineUtil.addOneTimeClearListener();
+	}
+
+	/**
+	 * Opens the IFile, input in its default editor, if possible, and returns
+	 * the editor opened. Possible reasons for failure: input cannot be found,
+	 * input does not exist in workbench, editor cannot be opened.
+	 * 
+	 * @return IEditorPart editor opened or null if input == null or does not
+	 *         exist, external editor was opened, editor could not be opened
+	 */
+	protected IEditorPart openFileInEditor(IFile input) {
+		if (input != null && input.exists()) {
+			try {
+				IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+				return IDE.openEditor(page, input, true);
+			}
+			catch (PartInitException pie) {
+				Logger.log(Logger.WARNING_DEBUG, pie.getMessage(), pie);
+			}
+		}
+		return null;
+	}
+
+	// on
+
+	/**
+	 * Opens the appropriate editor for fileString
+	 * 
+	 * @param fileString
+	 */
+	protected void openFileInEditor(String fileString) {
+		IEditorPart editor = null;
+		if (fileString != null) {
+			// open web browser if this is a web address
+			String temp = fileString.toLowerCase();
+			if (temp.startsWith(HTTP_PROTOCOL)) {
+				Program.launch(fileString); // launches web browser/executable
+				// associated with uri
+				return;
+			}
+			// chop off the file protocol
+			if (temp.startsWith(FILE_PROTOCOL)) {
+				fileString = fileString.substring(FILE_PROTOCOL.length());
+			}
+
+			// try to locate the file in the workspace and return an IFile if
+			// found
+			IFile file = getFile(fileString);
+			if (file != null) {
+				// file exists in workspace
+				editor = openFileInEditor(file);
+			}
+			else {
+				// file does not exist in workspace
+				editor = openExternalFile(fileString);
+			}
+		}
+		// no editor was opened
+		if (editor == null) {
+			openFileFailed();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.IOpenOn#openOn(org.eclipse.jface.text.IDocument,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public void openOn(IDocument doc, IRegion region) {
+		// set the document for this action
+		setDocument(doc);
+		// if no region was given this action fails
+		if (region == null)
+			openFileFailed();
+		else
+			doOpenOn(region);
+		// reset the document back to null for this action
+		setDocument(null);
+	}
+
+	/**
+	 * Sets current document associated with open on
+	 * 
+	 * @param document
+	 */
+	public void setDocument(IDocument document) {
+		fDocument = document;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/ExternalFileEditorInput.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/ExternalFileEditorInput.java
new file mode 100644
index 0000000..51d0a83
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/ExternalFileEditorInput.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.editors.text.ILocationProvider;
+
+/**
+ * EditorInput for external files. Copied from
+ * org.eclipse.ui.internal.editors.text.JavaFileEditorInput
+ * 
+ * @deprecated Use org.eclipse.ui.ide.FileStoreEditorInput and EFS.getLocalFileSystem().fromLocalFile()
+ */
+public class ExternalFileEditorInput implements IEditorInput, ILocationProvider {
+
+	private File fFile;
+
+	public ExternalFileEditorInput(File file) {
+		super();
+		fFile = file;
+	}
+
+	/*
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object o) {
+		if (o == this)
+			return true;
+
+		if (o instanceof ExternalFileEditorInput) {
+			ExternalFileEditorInput input = (ExternalFileEditorInput) o;
+			return fFile.equals(input.fFile);
+		}
+
+		return false;
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#exists()
+	 */
+	public boolean exists() {
+		return fFile.exists();
+	}
+
+	/*
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class adapter) {
+		if (ILocationProvider.class.equals(adapter))
+			return this;
+		return Platform.getAdapterManager().getAdapter(this, adapter);
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+	 */
+	public ImageDescriptor getImageDescriptor() {
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getName()
+	 */
+	public String getName() {
+		return fFile.getName();
+	}
+
+	/*
+	 * @see org.eclipse.ui.editors.text.ILocationProvider#getPath(java.lang.Object)
+	 */
+	public IPath getPath(Object element) {
+		if (element instanceof ExternalFileEditorInput) {
+			ExternalFileEditorInput input = (ExternalFileEditorInput) element;
+			return new Path(input.fFile.getAbsolutePath());
+		}
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getPersistable()
+	 */
+	public IPersistableElement getPersistable() {
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
+	 */
+	public String getToolTipText() {
+		return fFile.getAbsolutePath();
+	}
+
+	/*
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return fFile.hashCode();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/IOpenOn.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/IOpenOn.java
new file mode 100644
index 0000000..fb67c38
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/IOpenOn.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+
+/**
+ * Interface for Open On... navigation
+ * 
+ * @author amywu
+ */
+public interface IOpenOn {
+	/**
+	 * Returns the entire region relevant to the current offset where an
+	 * openable source region is found. null if offset does not contain an
+	 * openable source.
+	 * 
+	 * @param document
+	 *            IDocument
+	 * @param offset
+	 *            int
+	 * @return IRegion entire region of openable source
+	 */
+	public IRegion getOpenOnRegion(IDocument document, int offset);
+
+	/**
+	 * Opens the file/source relevant to region if possible.
+	 * 
+	 * @param viewer
+	 *            ITextViewer
+	 * @param region
+	 *            Region to examine
+	 */
+	public void openOn(IDocument document, IRegion region);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenFileHyperlinkTracker.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenFileHyperlinkTracker.java
new file mode 100644
index 0000000..372a620
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenFileHyperlinkTracker.java
@@ -0,0 +1,660 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+
+
+/**
+ * @deprecated Use org.eclipse.jface.text.hyperlink.HyperlinkManager
+ */
+public class OpenFileHyperlinkTracker implements KeyListener, MouseListener, MouseMoveListener, FocusListener, PaintListener, IPropertyChangeListener, IDocumentListener, ITextInputListener {
+
+	/** The session is active. */
+	private boolean fActive;
+
+	/** The currently active style range. */
+	private IRegion fActiveRegion;
+	/** Preference key for browser-like links to be enabled */
+	private String fBrowserLikeLinksKeyModifierKey;
+
+	/** The link color. */
+	private Color fColor;
+	/** The hand cursor. */
+	private Cursor fCursor;
+	/** The key modifier mask. */
+	private int fKeyModifierMask;
+	/** Preference key for hyperlink underline color */
+	private String fLinkColorKey;
+	/** The preference store */
+	private IPreferenceStore fPreferenceStore;
+	/** The currently active style range as position. */
+	private Position fRememberedPosition;
+
+	/** The text viewer this hyperlink tracker is associated with */
+	private ITextViewer fTextViewer;
+
+	/**
+	 *  
+	 */
+	public OpenFileHyperlinkTracker(ITextViewer textViewer) {
+		fTextViewer = textViewer;
+	}
+
+	private void activateCursor(ITextViewer viewer) {
+		StyledText text = viewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+		Display display = text.getDisplay();
+		if (fCursor == null)
+			fCursor = new Cursor(display, SWT.CURSOR_HAND);
+		text.setCursor(fCursor);
+	}
+
+	private int computeStateMask(String modifiers) {
+		if (modifiers == null)
+			return -1;
+
+		if (modifiers.length() == 0)
+			return SWT.NONE;
+
+		int stateMask = 0;
+		StringTokenizer modifierTokenizer = new StringTokenizer(modifiers, ",;.:+-* "); //$NON-NLS-1$
+		while (modifierTokenizer.hasMoreTokens()) {
+			int modifier = EditorUtility.findLocalizedModifier(modifierTokenizer.nextToken());
+			if (modifier == 0 || (stateMask & modifier) == modifier)
+				return -1;
+			stateMask = stateMask | modifier;
+		}
+		return stateMask;
+	}
+
+	/**
+	 * Creates a color from the information stored in the given preference
+	 * store. Returns <code>null</code> if there is no such information
+	 * available.
+	 */
+	private Color createColor(IPreferenceStore store, String key, Display display) {
+
+		RGB rgb = null;
+
+		if (store.contains(key)) {
+
+			if (store.isDefault(key))
+				rgb = PreferenceConverter.getDefaultColor(store, key);
+			else
+				rgb = PreferenceConverter.getColor(store, key);
+		}
+
+		return EditorUtility.getColor(rgb);
+	}
+
+	public void deactivate() {
+		deactivate(false);
+	}
+
+	public void deactivate(boolean redrawAll) {
+		if (!fActive)
+			return;
+
+		repairRepresentation(redrawAll);
+		fActive = false;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentAboutToBeChanged(DocumentEvent event) {
+		if (fActive && fActiveRegion != null) {
+			fRememberedPosition = new Position(fActiveRegion.getOffset(), fActiveRegion.getLength());
+			try {
+				event.getDocument().addPosition(fRememberedPosition);
+			} catch (BadLocationException x) {
+				fRememberedPosition = null;
+			}
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentChanged(DocumentEvent event) {
+		if (fRememberedPosition != null) {
+			if (!fRememberedPosition.isDeleted()) {
+
+				event.getDocument().removePosition(fRememberedPosition);
+				fActiveRegion = new Region(fRememberedPosition.getOffset(), fRememberedPosition.getLength());
+				fRememberedPosition = null;
+
+				ITextViewer viewer = getTextViewer();
+				if (viewer != null) {
+					StyledText widget = viewer.getTextWidget();
+					if (widget != null && !widget.isDisposed()) {
+						widget.getDisplay().asyncExec(new Runnable() {
+							public void run() {
+								deactivate();
+							}
+						});
+					}
+				}
+
+			} else {
+				fActiveRegion = null;
+				fRememberedPosition = null;
+				deactivate();
+			}
+		}
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusGained(FocusEvent e) {
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusLost(FocusEvent event) {
+		deactivate();
+	}
+
+	private int getCurrentTextOffset() {
+		try {
+			StyledText text = getTextViewer().getTextWidget();
+			if (text == null || text.isDisposed())
+				return -1;
+
+			Display display = text.getDisplay();
+			Point absolutePosition = display.getCursorLocation();
+			Point relativePosition = text.toControl(absolutePosition);
+
+			int widgetOffset = text.getOffsetAtLocation(relativePosition);
+			if (getTextViewer() instanceof ITextViewerExtension5) {
+				ITextViewerExtension5 extension = (ITextViewerExtension5) getTextViewer();
+				return extension.widgetOffset2ModelOffset(widgetOffset);
+			} else {
+				return widgetOffset + getTextViewer().getVisibleRegion().getOffset();
+			}
+
+		} catch (IllegalArgumentException e) {
+			return -1;
+		}
+	}
+
+	private Point getMaximumLocation(StyledText text, int offset, int length) {
+		Point maxLocation = new Point(Integer.MIN_VALUE, Integer.MIN_VALUE);
+
+		for (int i = 0; i <= length; i++) {
+			Point location = text.getLocationAtOffset(offset + i);
+
+			if (location.x > maxLocation.x)
+				maxLocation.x = location.x;
+			if (location.y > maxLocation.y)
+				maxLocation.y = location.y;
+		}
+
+		return maxLocation;
+	}
+
+	private Point getMinimumLocation(StyledText text, int offset, int length) {
+		Point minLocation = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE);
+
+		for (int i = 0; i <= length; i++) {
+			Point location = text.getLocationAtOffset(offset + i);
+
+			if (location.x < minLocation.x)
+				minLocation.x = location.x;
+			if (location.y < minLocation.y)
+				minLocation.y = location.y;
+		}
+
+		return minLocation;
+	}
+
+	private IPreferenceStore getNewPreferenceStore() {
+		return fPreferenceStore;
+	}
+
+	private ITextViewer getTextViewer() {
+		return fTextViewer;
+	}
+
+	private void highlightRegion(ITextViewer viewer, IRegion region) {
+
+		if (region.equals(fActiveRegion))
+			return;
+
+		repairRepresentation();
+
+		StyledText text = viewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+
+
+		// Underline
+		int offset = 0;
+		int length = 0;
+		if (viewer instanceof ITextViewerExtension5) {
+			ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
+			IRegion widgetRange = extension.modelRange2WidgetRange(new Region(region.getOffset(), region.getLength()));
+			if (widgetRange == null)
+				return;
+
+			offset = widgetRange.getOffset();
+			length = widgetRange.getLength();
+
+		} else {
+			offset = region.getOffset() - viewer.getVisibleRegion().getOffset();
+			length = region.getLength();
+		}
+		// need clearBackground to be true for paint event to be fired
+		text.redrawRange(offset, length, true);
+
+		fActiveRegion = region;
+	}
+
+	private boolean includes(IRegion region, IRegion position) {
+		return position.getOffset() >= region.getOffset() && position.getOffset() + position.getLength() <= region.getOffset() + region.getLength();
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface.text.IDocument,
+	 *      org.eclipse.jface.text.IDocument)
+	 */
+	public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+		if (oldInput == null)
+			return;
+		deactivate();
+		oldInput.removeDocumentListener(this);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument,
+	 *      org.eclipse.jface.text.IDocument)
+	 */
+	public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+		if (newInput == null)
+			return;
+		newInput.addDocumentListener(this);
+	}
+
+	public void install(IPreferenceStore store) {
+		fPreferenceStore = store;
+		ITextViewer textViewer = getTextViewer();
+		if (textViewer == null)
+			return;
+
+		StyledText text = textViewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+
+		updateColor(textViewer);
+
+		textViewer.addTextInputListener(this);
+
+		IDocument document = textViewer.getDocument();
+		if (document != null)
+			document.addDocumentListener(this);
+
+		text.addKeyListener(this);
+		text.addMouseListener(this);
+		text.addMouseMoveListener(this);
+		text.addFocusListener(this);
+		text.addPaintListener(this);
+
+		updateKeyModifierMask();
+
+		fPreferenceStore.addPropertyChangeListener(this);
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyPressed(KeyEvent event) {
+
+		if (fActive) {
+			deactivate();
+			return;
+		}
+
+		if (event.keyCode != fKeyModifierMask) {
+			deactivate();
+			return;
+		}
+
+		fActive = true;
+
+		//			removed for #25871
+		//
+		//			ISourceViewer viewer= getSourceViewer();
+		//			if (viewer == null)
+		//				return;
+		//			
+		//			IRegion region= getCurrentTextRegion(viewer);
+		//			if (region == null)
+		//				return;
+		//			
+		//			highlightRegion(viewer, region);
+		//			activateCursor(viewer);
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyReleased(KeyEvent event) {
+
+		if (!fActive)
+			return;
+
+		deactivate();
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseDoubleClick(MouseEvent e) {
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseDown(MouseEvent event) {
+
+		if (!fActive)
+			return;
+
+		if (event.stateMask != fKeyModifierMask) {
+			deactivate();
+			return;
+		}
+
+		if (event.button != 1) {
+			deactivate();
+			return;
+		}
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseMove(MouseEvent event) {
+
+		if (event.widget instanceof Control && !((Control) event.widget).isFocusControl()) {
+			deactivate();
+			return;
+		}
+
+		if (!fActive) {
+			if (event.stateMask != fKeyModifierMask)
+				return;
+			// modifier was already pressed
+			fActive = true;
+		}
+
+		ITextViewer viewer = getTextViewer();
+		if (viewer == null) {
+			deactivate();
+			return;
+		}
+
+		StyledText text = viewer.getTextWidget();
+		if (text == null || text.isDisposed()) {
+			deactivate();
+			return;
+		}
+
+		if ((event.stateMask & SWT.BUTTON1) != 0 && text.getSelectionCount() != 0) {
+			deactivate();
+			return;
+		}
+
+		IRegion region = null;
+		int offset = getCurrentTextOffset();
+		IOpenOn openOn = OpenOnProvider.getInstance().getOpenOn(getTextViewer().getDocument(), offset);
+		if (openOn != null) {
+			region = openOn.getOpenOnRegion(getTextViewer().getDocument(), offset);
+		}
+		if (region == null || region.getLength() == 0) {
+			repairRepresentation();
+			return;
+		}
+
+		highlightRegion(viewer, region);
+		activateCursor(viewer);
+	}
+
+	/*
+	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseUp(MouseEvent e) {
+
+		if (!fActive)
+			return;
+
+		if (e.button != 1) {
+			deactivate();
+			return;
+		}
+
+		boolean wasActive = fCursor != null;
+		IRegion previousRegion = fActiveRegion;
+
+		deactivate();
+
+		if (wasActive) {
+			IOpenOn openOn = OpenOnProvider.getInstance().getOpenOn(getTextViewer().getDocument(), previousRegion.getOffset());
+			if (openOn != null) {
+				openOn.openOn(getTextViewer().getDocument(), previousRegion);
+			}
+		}
+	}
+
+	/*
+	 * @see PaintListener#paintControl(PaintEvent)
+	 */
+	public void paintControl(PaintEvent event) {
+		if (fActiveRegion == null)
+			return;
+
+		ITextViewer viewer = getTextViewer();
+		if (viewer == null)
+			return;
+
+		StyledText text = viewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+
+
+		int offset = 0;
+		int length = 0;
+
+		if (viewer instanceof ITextViewerExtension5) {
+
+			ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
+			IRegion widgetRange = extension.modelRange2WidgetRange(fActiveRegion);
+			if (widgetRange == null)
+				return;
+
+			offset = widgetRange.getOffset();
+			length = widgetRange.getLength();
+
+		} else {
+
+			IRegion region = viewer.getVisibleRegion();
+			if (!includes(region, fActiveRegion))
+				return;
+
+			offset = fActiveRegion.getOffset() - region.getOffset();
+			length = fActiveRegion.getLength();
+		}
+
+		// support for bidi
+		Point minLocation = getMinimumLocation(text, offset, length);
+		Point maxLocation = getMaximumLocation(text, offset, length);
+
+		int x1 = minLocation.x;
+		int x2 = minLocation.x + maxLocation.x - minLocation.x - 1;
+		int y = minLocation.y + text.getLineHeight() - 1;
+
+		GC gc = event.gc;
+		if (fColor != null && !fColor.isDisposed())
+			gc.setForeground(fColor);
+		gc.drawLine(x1, y, x2, y);
+	}
+
+	/*
+	 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+	 */
+	public void propertyChange(PropertyChangeEvent event) {
+		if (event.getProperty().equals(fLinkColorKey)) {
+			ITextViewer viewer = getTextViewer();
+			if (viewer != null)
+				updateColor(viewer);
+		} else if (event.getProperty().equals(fBrowserLikeLinksKeyModifierKey)) {
+			updateKeyModifierMask();
+		}
+	}
+
+	private void repairRepresentation() {
+		repairRepresentation(false);
+	}
+
+	private void repairRepresentation(boolean redrawAll) {
+
+		if (fActiveRegion == null)
+			return;
+
+		int offset = fActiveRegion.getOffset();
+		int length = fActiveRegion.getLength();
+		fActiveRegion = null;
+
+		ITextViewer viewer = getTextViewer();
+		if (viewer != null) {
+
+			resetCursor(viewer);
+
+			// Remove underline
+			if (viewer instanceof ITextViewerExtension5) {
+				ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
+				offset = extension.modelOffset2WidgetOffset(offset);
+			} else {
+				offset -= viewer.getVisibleRegion().getOffset();
+			}
+			try {
+				StyledText text = viewer.getTextWidget();
+
+				// need clearBackground to be true for paint event to be fired
+				text.redrawRange(offset, length, true);
+			} catch (IllegalArgumentException x) {
+				Logger.logException(x);
+			}
+		}
+	}
+
+	private void resetCursor(ITextViewer viewer) {
+		StyledText text = viewer.getTextWidget();
+		if (text != null && !text.isDisposed())
+			text.setCursor(null);
+
+		if (fCursor != null) {
+			fCursor.dispose();
+			fCursor = null;
+		}
+	}
+
+	public void setHyperlinkPreferenceKeys(String linkColorKey, String browserLikeLinksKeyModifierKey) {
+		fLinkColorKey = linkColorKey;
+		fBrowserLikeLinksKeyModifierKey = browserLikeLinksKeyModifierKey;
+	}
+
+	public void uninstall() {
+		if (fCursor != null) {
+			fCursor.dispose();
+			fCursor = null;
+		}
+
+		ITextViewer textViewer = getTextViewer();
+		if (textViewer == null)
+			return;
+
+		textViewer.removeTextInputListener(this);
+
+		IDocument document = textViewer.getDocument();
+		if (document != null)
+			document.removeDocumentListener(this);
+
+		IPreferenceStore preferenceStore = getNewPreferenceStore();
+		if (preferenceStore != null)
+			preferenceStore.removePropertyChangeListener(this);
+
+		StyledText text = textViewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+
+		text.removeKeyListener(this);
+		text.removeMouseListener(this);
+		text.removeMouseMoveListener(this);
+		text.removeFocusListener(this);
+		text.removePaintListener(this);
+	}
+
+	private void updateColor(ITextViewer viewer) {
+		StyledText text = viewer.getTextWidget();
+		if (text == null || text.isDisposed())
+			return;
+
+		Display display = text.getDisplay();
+		fColor = createColor(getNewPreferenceStore(), fLinkColorKey, display);
+	}
+
+	private void updateKeyModifierMask() {
+		String modifiers = getNewPreferenceStore().getString(fBrowserLikeLinksKeyModifierKey);
+		fKeyModifierMask = computeStateMask(modifiers);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnAction.java
new file mode 100644
index 0000000..fe7702c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnAction.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextEditorAction;
+import org.eclipse.wst.sse.ui.internal.IExtendedSimpleEditor;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+
+
+/**
+ * Determines the appropriate IOpenFileAction to call based on current
+ * partition.
+ * 
+ * @deprecated Use base support for hyperlink navigation
+ */
+public class OpenOnAction extends TextEditorAction {
+	public OpenOnAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+		super(bundle, prefix, editor);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		BusyIndicator.showWhile(getTextEditor().getEditorSite().getShell().getDisplay(), new Runnable() {
+			public void run() {
+				ITextEditor editor = getTextEditor();
+
+				// figure out current offset
+				int offset = -1;
+				ISourceEditingTextTools textTools = (ISourceEditingTextTools) getTextEditor().getAdapter(ISourceEditingTextTools.class);
+				if (textTools != null) {
+					offset = textTools.getCaretOffset();
+				}
+				else if (editor instanceof IExtendedSimpleEditor) {
+					offset = ((IExtendedSimpleEditor) editor).getCaretPosition();
+				}
+				else {
+					if (editor.getSelectionProvider() != null) {
+						ISelection sel = editor.getSelectionProvider().getSelection();
+						if (sel instanceof ITextSelection) {
+							offset = ((ITextSelection) sel).getOffset();
+						}
+					}
+				}
+				IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
+				IOpenOn openOn = OpenOnProvider.getInstance().getOpenOn(document, offset);
+				if (openOn != null) {
+					openOn.openOn(document, new Region(offset, 0));
+				}
+			}
+		});
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnBuilder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnBuilder.java
new file mode 100644
index 0000000..3e02958
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnBuilder.java
@@ -0,0 +1,267 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
+
+
+/**
+ * Reads extensions for open on extension point,
+ * org.eclipse.wst.sse.ui.extensions.openon
+ * 
+ * @deprecated Use base support for hyperlink navigation
+ */
+public class OpenOnBuilder extends RegistryReader {
+	public static final String ATT_CLASS = "class"; //$NON-NLS-1$
+
+	public static final String ATT_ID = "id"; //$NON-NLS-1$
+
+	private static OpenOnBuilder fInstance;
+	// extension point ID
+	public static final String PL_OPENON = "openon"; //$NON-NLS-1$
+
+	public static final String PLUGIN_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+	public static final String TAG_CONTENT_TYPE_IDENTIFIER = "contenttypeidentifier"; //$NON-NLS-1$
+
+	public static final String TAG_OPENON = "openon"; //$NON-NLS-1$
+	public static final String TAG_PARTITION_TYPE = "partitiontype"; //$NON-NLS-1$
+
+	/**
+	 * returns singleton instance of OpenOnBuilder
+	 * 
+	 * @return OpenOnBuilder
+	 */
+	public synchronized static OpenOnBuilder getInstance() {
+		if (fInstance == null) {
+			fInstance = new OpenOnBuilder();
+		}
+		return fInstance;
+	}
+
+	private String fCurrentContentType;
+	private OpenOnDefinition fCurrentOpenOnDefinition = null;
+
+	private List fOpenOnDefs = null;
+
+	protected String targetContributionTag;
+
+	/**
+	 * Returns the name of the part ID attribute that is expected in the
+	 * target extension.
+	 * 
+	 * @param element
+	 * @return String
+	 */
+	protected String getId(IConfigurationElement element) {
+		String value = element.getAttribute(ATT_ID);
+		return value;
+	}
+
+	protected String getOpenOnClass(IConfigurationElement element) {
+		String value = element.getAttribute(ATT_CLASS);
+		return value;
+	}
+
+	/**
+	 * Returns all the open on definition objects
+	 * 
+	 * @return
+	 */
+	public OpenOnDefinition[] getOpenOnDefinitions() {
+		initCache();
+		return (OpenOnDefinition[]) fOpenOnDefs.toArray(new OpenOnDefinition[fOpenOnDefs.size()]);
+	}
+
+	/**
+	 * Returns all the open on definition objects valid for
+	 * contentType/partitionType
+	 * 
+	 * @param contentType
+	 * @param partitionType
+	 * @return if either contentType or partitionType is null, null is
+	 *         returned
+	 */
+	public OpenOnDefinition[] getOpenOnDefinitions(String contentType, String partitionType) {
+		if (contentType == null || partitionType == null) {
+			// should not be able to define an openon without a content type
+			// but if it were possible then would need to search all openon
+			// definitions for
+			// definitions with empty contentType list
+			return null;
+		}
+
+		// entire list of openon definition objects
+		OpenOnDefinition[] allDefs = getOpenOnDefinitions();
+		// current list of open on definitions valid for
+		// contentType/partitionType
+		List defs = new ArrayList();
+		// default definitions that should be added to end of list of open on
+		// definitions
+		List lastDefs = new ArrayList();
+
+		for (int i = 0; i < allDefs.length; ++i) {
+			// for each one check if it contains contentType
+			List partitions = (List) allDefs[i].getContentTypes().get(contentType);
+			if (partitions != null) {
+				// this openon definition is valid for all partition types for
+				// this content type
+				if (partitions.isEmpty()) {
+					// this will be added to end of list because this is
+					// considered a default openon
+					lastDefs.add(allDefs[i]);
+				} else {
+					// examine the partition types of this openon
+					int j = 0; // current index in list of partitions
+					boolean added = false; // openon has been added to list
+					while (j < partitions.size() && !added) {
+						// this openon definition applies to partitionType so
+						// add to list of valid openons
+						if (partitionType.equals(partitions.get(j))) {
+							defs.add(allDefs[i]);
+							added = true;
+						} else {
+							// continue checking to see if this openon
+							// definition is valid for current partitionType
+							++j;
+						}
+					}
+				}
+			}
+		}
+		// append the default openon definitions
+		defs.addAll(lastDefs);
+
+		// return the list
+		return (OpenOnDefinition[]) defs.toArray(new OpenOnDefinition[defs.size()]);
+	}
+
+	private void initCache() {
+		if (fOpenOnDefs == null) {
+			fOpenOnDefs = new ArrayList(0);
+			readContributions(TAG_OPENON, PL_OPENON);
+		}
+	}
+
+	/**
+	 * Processes element which should be a configuration element specifying a
+	 * content type for the current open on tag. Assumes that there is a valid
+	 * current open on definition object.
+	 * 
+	 * @param element
+	 *            contenttypeidentifier configuration element
+	 */
+	private void processContentTypeTag(IConfigurationElement element) {
+		// add to current openOnDefinition
+		String theId = getId(element);
+
+		if (theId != null) {
+			fCurrentContentType = theId;
+			fCurrentOpenOnDefinition.addContentTypeId(fCurrentContentType);
+		} else {
+			fCurrentContentType = null;
+		}
+	}
+
+	/**
+	 * Processes element which should be a configuration element specifying an
+	 * open on object. Creates a new open on definition object and adds it to
+	 * the list of open on definition objects
+	 * 
+	 * @param element
+	 *            openon configuration element
+	 */
+	private void processOpenOnTag(IConfigurationElement element) {
+		String theId = getId(element);
+		String theClass = getOpenOnClass(element);
+
+		if (theId != null && theClass != null) {
+			// start building new OpenOnDefinition
+			fCurrentOpenOnDefinition = new OpenOnDefinition(theId, theClass, element);
+			fOpenOnDefs.add(fCurrentOpenOnDefinition);
+		} else {
+			fCurrentOpenOnDefinition = null;
+		}
+	}
+
+	/**
+	 * Processes element which should be a configuration element specifying a
+	 * partition type for the current open on/content type tag. Assumes that
+	 * there is a valid current open on/content type tag.
+	 * 
+	 * @param element
+	 *            partitiontype configuration element
+	 */
+	private void processPartitionTypeTag(IConfigurationElement element) {
+		// add to current openOnDefinition/contentType
+		String theId = getId(element);
+
+		if (theId != null) {
+			fCurrentOpenOnDefinition.addPartitionType(fCurrentContentType, theId);
+		}
+	}
+
+	/**
+	 * Reads the contributions from the registry for the provided workbench
+	 * part and the provided extension point ID.
+	 * 
+	 * @param tag
+	 * @param extensionPoint
+	 */
+	protected void readContributions(String tag, String extensionPoint) {
+		targetContributionTag = tag;
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		readRegistry(registry, PLUGIN_ID, extensionPoint);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.extension.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
+	 */
+	protected boolean readElement(IConfigurationElement element) {
+		String tag = element.getName();
+
+		if (tag.equals(targetContributionTag)) {
+			processOpenOnTag(element);
+
+			// make sure processing of current open on tag resulted in a
+			// current open on definition
+			// before continue reading the children
+			if (fCurrentOpenOnDefinition != null) {
+				readElementChildren(element);
+			}
+			return true;
+		} else if (tag.equals(TAG_CONTENT_TYPE_IDENTIFIER)) {
+			processContentTypeTag(element);
+
+			// make sure processing of current content type resulted in a
+			// valid content type
+			// before reading the children
+			if (fCurrentContentType != null) {
+				readElementChildren(element);
+			}
+			return true;
+		} else if (tag.equals(TAG_PARTITION_TYPE)) {
+			processPartitionTypeTag(element);
+			return true;
+		}
+
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnDefinition.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnDefinition.java
new file mode 100644
index 0000000..5a60d60
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnDefinition.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Open on definition object
+ * 
+ * @deprecated Use base support for hyperlink navigation
+ */
+public class OpenOnDefinition {
+	private String fClassName = null;
+
+	private IConfigurationElement fConfigurationElement = null;
+
+	// a hash map of content type Ids (String) that points to lists of
+	// parition types (List of Strings)
+	// contentTypeId -> List(paritionType, paritionType, partitionType, ...)
+	// contentTypeId2 -> List(partitionType, partitionType, ...)
+	// ...
+	private HashMap fContentTypes = null;
+	private String fId = null;
+
+	/**
+	 * @param id
+	 * @param class1
+	 * @param configurationElement
+	 */
+	public OpenOnDefinition(String id, String class1, IConfigurationElement configurationElement) {
+		super();
+		fId = id;
+		fClassName = class1;
+		fConfigurationElement = configurationElement;
+		fContentTypes = new HashMap();
+	}
+
+	public void addContentTypeId(String contentTypeId) {
+		if (!fContentTypes.containsKey(contentTypeId))
+			fContentTypes.put(contentTypeId, new ArrayList());
+	}
+
+	public void addPartitionType(String contentTypeId, String partitionType) {
+		if (!fContentTypes.containsKey(contentTypeId))
+			fContentTypes.put(contentTypeId, new ArrayList());
+
+		List partitionList = (List) fContentTypes.get(contentTypeId);
+		partitionList.add(partitionType);
+	}
+
+	/**
+	 * Creates an extension. If the extension plugin has not been loaded a
+	 * busy cursor will be activated during the duration of the load.
+	 * 
+	 * @param propertyName
+	 * @return Object
+	 */
+	private Object createExtension(String propertyName) {
+		// If plugin has been loaded create extension.
+		// Otherwise, show busy cursor then create extension.
+		final IConfigurationElement element = getConfigurationElement();
+		final String name = propertyName;
+
+		final Object[] result = new Object[1];
+		String pluginId = element.getDeclaringExtension().getNamespace();
+		Bundle bundle = Platform.getBundle(pluginId);
+		if (bundle.getState() == Bundle.ACTIVE) {
+			try {
+				return element.createExecutableExtension(name);
+			} catch (CoreException e) {
+				handleCreateExecutableException(result, e);
+			}
+		} else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = element.createExecutableExtension(name);
+					} catch (Exception e) {
+						handleCreateExecutableException(result, e);
+					}
+				}
+			});
+		}
+		return result[0];
+	}
+
+	/**
+	 * @return IOpenOn for this definition
+	 */
+	public IOpenOn createOpenOn() {
+		IOpenOn openOn = null;
+
+		if (getClassName() != null) {
+			openOn = (IOpenOn) createExtension(OpenOnBuilder.ATT_CLASS);
+		}
+
+		return openOn;
+	}
+
+	/**
+	 * @return Returns the fClass.
+	 */
+	public String getClassName() {
+		return fClassName;
+	}
+
+	/**
+	 * @return Returns the fConfigurationElement.
+	 */
+	public IConfigurationElement getConfigurationElement() {
+		return fConfigurationElement;
+	}
+
+	/**
+	 * @return Returns the fContentTypes.
+	 */
+	public HashMap getContentTypes() {
+		return fContentTypes;
+	}
+
+	/**
+	 * @return Returns the fId.
+	 */
+	public String getId() {
+		return fId;
+	}
+
+	/**
+	 * @param result
+	 * @param e
+	 */
+	private void handleCreateExecutableException(Object[] result, Throwable e) {
+		Logger.logException("Unable to create open on: " + getId(), e); //$NON-NLS-1$
+		e.printStackTrace();
+		result[0] = null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnProvider.java
new file mode 100644
index 0000000..4609ff9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/openon/OpenOnProvider.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.openon;
+
+
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
+
+
+/**
+ * Determines the appropriate IOpenOn to call based on current partition.
+ * 
+ * @deprecated Use base support for hyperlink navigation
+ */
+public class OpenOnProvider {
+	private static OpenOnProvider fInstance;
+
+	/**
+	 * returns singleton instance of OpenOnProvider
+	 * 
+	 * @return OpenOnProvider
+	 */
+	public synchronized static OpenOnProvider getInstance() {
+		if (fInstance == null) {
+			fInstance = new OpenOnProvider();
+		}
+		return fInstance;
+	}
+
+
+	/**
+	 * Returns the content type of document
+	 * 
+	 * @param document -
+	 *            assumes document is not null
+	 * @return String content type of given document
+	 */
+	protected String getContentType(IDocument document) {
+		String type = null;
+
+		IModelManager mgr = StructuredModelManager.getModelManager();
+		IStructuredModel model = null;
+		try {
+			model = mgr.getExistingModelForRead(document);
+			if (model != null) {
+				type = model.getContentTypeIdentifier();
+			}
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+		return type;
+	}
+
+	/**
+	 * Returns the appropriate IOpenOn for the current partition
+	 * 
+	 * @return
+	 */
+	public IOpenOn getOpenOn(IDocument document, int offset) {
+		IOpenOn openOn = null;
+
+		// determine the current partition
+		if (document != null) {
+			String contentTypeID = getContentType(document);
+			String partitionType = getPartitionType(document, offset);
+
+			IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID);
+
+			while (openOn == null && contentType != null) {
+				// Query OpenOnBuilder and get the list of OpenOns for the
+				// current partition
+				OpenOnDefinition[] defs = OpenOnBuilder.getInstance().getOpenOnDefinitions(contentType.getId(), partitionType);
+				contentType = contentType.getBaseType();
+
+				// If more than 1 openon is returned, need to further check
+				// which OpenOn is the appropriate one to return
+				// for now just returning the first one
+				if (defs != null && defs.length > 0) {
+					openOn = defs[0].createOpenOn();
+				}
+			}
+		}
+
+		return openOn;
+	}
+
+	/**
+	 * Returns the partition type located at offset in the document
+	 * 
+	 * @param document -
+	 *            assumes document is not null
+	 * @param offset
+	 * @return String partition type
+	 */
+	protected String getPartitionType(IDocument document, int offset) {
+		String type = null;
+		try {
+			// TODO: provide partitioning information so we're not using a default like this
+			if (document instanceof IStructuredDocument) {
+				type = TextUtilities.getContentType(document, IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, false);
+			}
+		}
+		catch (BadLocationException e1) {
+		}
+		finally {
+			if (type == null) {
+				try {
+					ITypedRegion region = document.getPartition(offset);
+					if (region != null) {
+						type = region.getType();
+					}
+				}
+				catch (BadLocationException e) {
+					type = null;
+				}
+			}
+		}
+		return type;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/EditorPreferenceNames.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/EditorPreferenceNames.java
new file mode 100644
index 0000000..5ce3447
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/EditorPreferenceNames.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences;
+
+
+/**
+ * Preference keys for SSE UI
+ */
+public class EditorPreferenceNames {
+	/**
+	 * A named preference that controls on-the-fly validation
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 */
+	public static final String EVALUATE_TEMPORARY_PROBLEMS = getEvaluateTemporaryProblemsKey();
+
+	private static String getEvaluateTemporaryProblemsKey() {
+		return "evaluateTemporaryProblems"; //$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that controls whether bracket matching highlighting
+	 * is turned on or off.
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 */
+	public final static String MATCHING_BRACKETS = getMatchingBracketsKey();
+
+	private static String getMatchingBracketsKey() {
+		return "matchingBrackets"; //$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that holds the color used to highlight matching
+	 * brackets.
+	 * <p>
+	 * Value is of type <code>String</code>. A RGB color value encoded as a
+	 * string using class <code>PreferenceConverter</code>
+	 * </p>
+	 */
+	public final static String MATCHING_BRACKETS_COLOR = getMatchingBracketsColorKey();
+
+	private static String getMatchingBracketsColorKey() {
+		return "matchingBracketsColor"; //$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that defines the key for the hover modifiers.
+	 * <p>
+	 * Value is of type <code>String</code>.
+	 * </p>
+	 */
+	public static final String EDITOR_TEXT_HOVER_MODIFIERS = getTextHoverModifiersKey();
+
+	private static String getTextHoverModifiersKey() {
+		return "hoverModifiers"; //$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that defines read only contrast scale.
+	 * <p>
+	 * Value is of type <code>Integer</code>.
+	 * </p>
+	 */
+	public static final String READ_ONLY_FOREGROUND_SCALE = getReadOnlyForegroundScaleKey();
+
+	private static String getReadOnlyForegroundScaleKey() {
+		return "readOnlyForegroundScale"; //$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that defines whether or not to show a message dialog
+	 * informing user of unknown content type in editor.
+	 */
+	public static final String SHOW_UNKNOWN_CONTENT_TYPE_MSG = "showUnknownContentTypeMsg"; //$NON-NLS-1$
+
+	/**
+	 * A name preference that holds the auto activation delay time in
+	 * milliseconds.
+	 * <p>
+	 * Value is of type <code>Integer</code>.
+	 * </p>
+	 */
+	public final static String CODEASSIST_AUTOACTIVATION_DELAY = "content_assist_autoactivation_delay"; //$NON-NLS-1$
+
+	/**
+	 * A named preference that holds the background color used in the code
+	 * assist selection dialog.
+	 * <p>
+	 * Value is of type <code>String</code>. A RGB color value encoded as a
+	 * string using class <code>PreferenceConverter</code>
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.resource.StringConverter
+	 * @see org.eclipse.jface.preference.PreferenceConverter
+	 */
+	public final static String CODEASSIST_PROPOSALS_BACKGROUND = "content_assist_proposals_background"; //$NON-NLS-1$
+
+	/**
+	 * A named preference that holds the foreground color used in the code
+	 * assist selection dialog.
+	 * <p>
+	 * Value is of type <code>String</code>. A RGB color value encoded as a
+	 * string using class <code>PreferenceConverter</code>
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.resource.StringConverter
+	 * @see org.eclipse.jface.preference.PreferenceConverter
+	 */
+	public final static String CODEASSIST_PROPOSALS_FOREGROUND = "content_assist_proposals_foreground"; //$NON-NLS-1$
+
+	/**
+	 * A named preference that holds the background color used for parameter
+	 * hints.
+	 * <p>
+	 * Value is of type <code>String</code>. A RGB color value encoded as a
+	 * string using class <code>PreferenceConverter</code>
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.resource.StringConverter
+	 * @see org.eclipse.jface.preference.PreferenceConverter
+	 */
+	public final static String CODEASSIST_PARAMETERS_BACKGROUND = "content_assist_parameters_background"; //$NON-NLS-1$
+
+	/**
+	 * A named preference that holds the foreground color used in the code
+	 * assist selection dialog.
+	 * <p>
+	 * Value is of type <code>String</code>. A RGB color value encoded as a
+	 * string using class <code>PreferenceConverter</code>
+	 * </p>
+	 * 
+	 * @see org.eclipse.jface.resource.StringConverter
+	 * @see org.eclipse.jface.preference.PreferenceConverter
+	 */
+	public final static String CODEASSIST_PARAMETERS_FOREGROUND = "content_assist_parameters_foreground"; //$NON-NLS-1$
+	
+	/**
+	 * A named preference that controls whether semantic highlighting is turned on or off
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 */
+	public final static String SEMANTIC_HIGHLIGHTING = "semanticHighlighting"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/OverlayPreferenceStore.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/OverlayPreferenceStore.java
new file mode 100644
index 0000000..16eb14c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/OverlayPreferenceStore.java
@@ -0,0 +1,486 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceStore;
+import org.eclipse.jface.text.Assert;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+
+/**
+ * An overlaying preference store. copied from JDT
+ */
+public class OverlayPreferenceStore implements IPreferenceStore {
+
+	public static class OverlayKey {
+
+		TypeDescriptor fDescriptor;
+		String fKey;
+
+		public OverlayKey(TypeDescriptor descriptor, String key) {
+			fDescriptor = descriptor;
+			fKey = key;
+		}
+	}
+
+	private class PropertyListener implements IPropertyChangeListener {
+
+		/*
+		 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+		 */
+		public void propertyChange(PropertyChangeEvent event) {
+			OverlayKey key = findOverlayKey(event.getProperty());
+			if (key != null)
+				propagateProperty(fParent, key, fStore);
+		}
+	}
+
+
+	public static final class TypeDescriptor {
+		private TypeDescriptor() {
+		}
+	}
+
+	public static final TypeDescriptor BOOLEAN = new TypeDescriptor();
+	public static final TypeDescriptor DOUBLE = new TypeDescriptor();
+	public static final TypeDescriptor FLOAT = new TypeDescriptor();
+	public static final TypeDescriptor INT = new TypeDescriptor();
+	public static final TypeDescriptor LONG = new TypeDescriptor();
+	public static final TypeDescriptor STRING = new TypeDescriptor();
+	private boolean fLoaded;
+	private OverlayKey[] fOverlayKeys;
+
+
+	IPreferenceStore fParent;
+
+	private PropertyListener fPropertyListener;
+	IPreferenceStore fStore;
+
+
+	public OverlayPreferenceStore(IPreferenceStore parent, OverlayKey[] overlayKeys) {
+		fParent = parent;
+		fOverlayKeys = overlayKeys;
+		fStore = new PreferenceStore();
+	}
+
+	/**
+	 * The keys to add to the list of overlay keys.
+	 * <p>
+	 * Note: This method must be called before {@link #load()}is called.
+	 * </p>
+	 * 
+	 * @param keys
+	 * @plannedfor 3.0
+	 */
+	public void addKeys(OverlayKey[] keys) {
+		Assert.isTrue(!fLoaded);
+		Assert.isNotNull(keys);
+
+		int overlayKeysLength = fOverlayKeys.length;
+		OverlayKey[] result = new OverlayKey[keys.length + overlayKeysLength];
+
+		for (int i = 0, length = overlayKeysLength; i < length; i++)
+			result[i] = fOverlayKeys[i];
+
+		for (int i = 0, length = keys.length; i < length; i++)
+			result[overlayKeysLength + i] = keys[i];
+
+		fOverlayKeys = result;
+
+		if (fLoaded)
+			load();
+	}
+
+	/*
+	 * @see IPreferenceStore#addPropertyChangeListener(IPropertyChangeListener)
+	 */
+	public void addPropertyChangeListener(IPropertyChangeListener listener) {
+		fStore.addPropertyChangeListener(listener);
+	}
+
+	/*
+	 * @see IPreferenceStore#contains(String)
+	 */
+	public boolean contains(String name) {
+		return fStore.contains(name);
+	}
+
+	private boolean covers(String key) {
+		return (findOverlayKey(key) != null);
+	}
+
+	OverlayKey findOverlayKey(String key) {
+		for (int i = 0; i < fOverlayKeys.length; i++) {
+			if (fOverlayKeys[i].fKey.equals(key))
+				return fOverlayKeys[i];
+		}
+		return null;
+	}
+
+	/*
+	 * @see IPreferenceStore#firePropertyChangeEvent(String, Object, Object)
+	 */
+	public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
+		fStore.firePropertyChangeEvent(name, oldValue, newValue);
+	}
+
+	/*
+	 * @see IPreferenceStore#getBoolean(String)
+	 */
+	public boolean getBoolean(String name) {
+		return fStore.getBoolean(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getDefaultBoolean(String)
+	 */
+	public boolean getDefaultBoolean(String name) {
+		return fStore.getDefaultBoolean(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getDefaultDouble(String)
+	 */
+	public double getDefaultDouble(String name) {
+		return fStore.getDefaultDouble(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getDefaultFloat(String)
+	 */
+	public float getDefaultFloat(String name) {
+		return fStore.getDefaultFloat(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getDefaultInt(String)
+	 */
+	public int getDefaultInt(String name) {
+		return fStore.getDefaultInt(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getDefaultLong(String)
+	 */
+	public long getDefaultLong(String name) {
+		return fStore.getDefaultLong(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getDefaultString(String)
+	 */
+	public String getDefaultString(String name) {
+		return fStore.getDefaultString(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getDouble(String)
+	 */
+	public double getDouble(String name) {
+		return fStore.getDouble(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getFloat(String)
+	 */
+	public float getFloat(String name) {
+		return fStore.getFloat(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getInt(String)
+	 */
+	public int getInt(String name) {
+		return fStore.getInt(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getLong(String)
+	 */
+	public long getLong(String name) {
+		return fStore.getLong(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#getString(String)
+	 */
+	public String getString(String name) {
+		return fStore.getString(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#isDefault(String)
+	 */
+	public boolean isDefault(String name) {
+		return fStore.isDefault(name);
+	}
+
+	public void load() {
+		for (int i = 0; i < fOverlayKeys.length; i++)
+			loadProperty(fParent, fOverlayKeys[i], fStore, true);
+
+		fLoaded = true;
+
+	}
+
+	public void loadDefaults() {
+		for (int i = 0; i < fOverlayKeys.length; i++)
+			setToDefault(fOverlayKeys[i].fKey);
+	}
+
+	private void loadProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target, boolean forceInitialization) {
+		TypeDescriptor d = key.fDescriptor;
+		if (BOOLEAN == d) {
+
+			if (forceInitialization)
+				target.setValue(key.fKey, true);
+			target.setValue(key.fKey, orgin.getBoolean(key.fKey));
+			target.setDefault(key.fKey, orgin.getDefaultBoolean(key.fKey));
+
+		} else if (DOUBLE == d) {
+
+			if (forceInitialization)
+				target.setValue(key.fKey, 1.0D);
+			target.setValue(key.fKey, orgin.getDouble(key.fKey));
+			target.setDefault(key.fKey, orgin.getDefaultDouble(key.fKey));
+
+		} else if (FLOAT == d) {
+
+			if (forceInitialization)
+				target.setValue(key.fKey, 1.0F);
+			target.setValue(key.fKey, orgin.getFloat(key.fKey));
+			target.setDefault(key.fKey, orgin.getDefaultFloat(key.fKey));
+
+		} else if (INT == d) {
+
+			if (forceInitialization)
+				target.setValue(key.fKey, 1);
+			target.setValue(key.fKey, orgin.getInt(key.fKey));
+			target.setDefault(key.fKey, orgin.getDefaultInt(key.fKey));
+
+		} else if (LONG == d) {
+
+			if (forceInitialization)
+				target.setValue(key.fKey, 1L);
+			target.setValue(key.fKey, orgin.getLong(key.fKey));
+			target.setDefault(key.fKey, orgin.getDefaultLong(key.fKey));
+
+		} else if (STRING == d) {
+
+			if (forceInitialization)
+				target.setValue(key.fKey, "1"); //$NON-NLS-1$
+			target.setValue(key.fKey, orgin.getString(key.fKey));
+			target.setDefault(key.fKey, orgin.getDefaultString(key.fKey));
+
+		}
+	}
+
+	/*
+	 * @see IPreferenceStore#needsSaving()
+	 */
+	public boolean needsSaving() {
+		return fStore.needsSaving();
+	}
+
+	public void propagate() {
+		for (int i = 0; i < fOverlayKeys.length; i++)
+			propagateProperty(fStore, fOverlayKeys[i], fParent);
+	}
+
+	void propagateProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target) {
+
+		if (orgin.isDefault(key.fKey)) {
+			if (!target.isDefault(key.fKey))
+				target.setToDefault(key.fKey);
+			return;
+		}
+
+		TypeDescriptor d = key.fDescriptor;
+		if (BOOLEAN == d) {
+
+			boolean originValue = orgin.getBoolean(key.fKey);
+			boolean targetValue = target.getBoolean(key.fKey);
+			if (targetValue != originValue)
+				target.setValue(key.fKey, originValue);
+
+		} else if (DOUBLE == d) {
+
+			double originValue = orgin.getDouble(key.fKey);
+			double targetValue = target.getDouble(key.fKey);
+			if (targetValue != originValue)
+				target.setValue(key.fKey, originValue);
+
+		} else if (FLOAT == d) {
+
+			float originValue = orgin.getFloat(key.fKey);
+			float targetValue = target.getFloat(key.fKey);
+			if (targetValue != originValue)
+				target.setValue(key.fKey, originValue);
+
+		} else if (INT == d) {
+
+			int originValue = orgin.getInt(key.fKey);
+			int targetValue = target.getInt(key.fKey);
+			if (targetValue != originValue)
+				target.setValue(key.fKey, originValue);
+
+		} else if (LONG == d) {
+
+			long originValue = orgin.getLong(key.fKey);
+			long targetValue = target.getLong(key.fKey);
+			if (targetValue != originValue)
+				target.setValue(key.fKey, originValue);
+
+		} else if (STRING == d) {
+
+			String originValue = orgin.getString(key.fKey);
+			String targetValue = target.getString(key.fKey);
+			if (targetValue != null && originValue != null && !targetValue.equals(originValue))
+				target.setValue(key.fKey, originValue);
+
+		}
+	}
+
+	/*
+	 * @see IPreferenceStore#putValue(String, String)
+	 */
+	public void putValue(String name, String value) {
+		if (covers(name))
+			fStore.putValue(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#removePropertyChangeListener(IPropertyChangeListener)
+	 */
+	public void removePropertyChangeListener(IPropertyChangeListener listener) {
+		fStore.removePropertyChangeListener(listener);
+	}
+
+	/*
+	 * @see IPreferenceStore#setDefault(String, boolean)
+	 */
+	public void setDefault(String name, boolean value) {
+		if (covers(name))
+			fStore.setDefault(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setDefault(String, double)
+	 */
+	public void setDefault(String name, double value) {
+		if (covers(name))
+			fStore.setDefault(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setDefault(String, float)
+	 */
+	public void setDefault(String name, float value) {
+		if (covers(name))
+			fStore.setDefault(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setDefault(String, int)
+	 */
+	public void setDefault(String name, int value) {
+		if (covers(name))
+			fStore.setDefault(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setDefault(String, long)
+	 */
+	public void setDefault(String name, long value) {
+		if (covers(name))
+			fStore.setDefault(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setDefault(String, String)
+	 */
+	public void setDefault(String name, String value) {
+		if (covers(name))
+			fStore.setDefault(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setToDefault(String)
+	 */
+	public void setToDefault(String name) {
+		fStore.setToDefault(name);
+	}
+
+	/*
+	 * @see IPreferenceStore#setValue(String, boolean)
+	 */
+	public void setValue(String name, boolean value) {
+		if (covers(name))
+			fStore.setValue(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setValue(String, double)
+	 */
+	public void setValue(String name, double value) {
+		if (covers(name))
+			fStore.setValue(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setValue(String, float)
+	 */
+	public void setValue(String name, float value) {
+		if (covers(name))
+			fStore.setValue(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setValue(String, int)
+	 */
+	public void setValue(String name, int value) {
+		if (covers(name))
+			fStore.setValue(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setValue(String, long)
+	 */
+	public void setValue(String name, long value) {
+		if (covers(name))
+			fStore.setValue(name, value);
+	}
+
+	/*
+	 * @see IPreferenceStore#setValue(String, String)
+	 */
+	public void setValue(String name, String value) {
+		if (covers(name))
+			fStore.setValue(name, value);
+	}
+
+	public void start() {
+		if (fPropertyListener == null) {
+			fPropertyListener = new PropertyListener();
+			fParent.addPropertyChangeListener(fPropertyListener);
+		}
+	}
+
+	public void stop() {
+		if (fPropertyListener != null) {
+			fParent.removePropertyChangeListener(fPropertyListener);
+			fPropertyListener = null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/TabFolderLayout.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/TabFolderLayout.java
new file mode 100644
index 0000000..b1b8903
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/TabFolderLayout.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Layout;
+
+/**
+ * Copied from JDT
+ * 
+ * @author pavery
+ */
+public class TabFolderLayout extends Layout {
+
+	protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
+		if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
+			return new Point(wHint, hHint);
+
+		Control[] children = composite.getChildren();
+		int count = children.length;
+		int maxWidth = 0, maxHeight = 0;
+		for (int i = 0; i < count; i++) {
+			Control child = children[i];
+			Point pt = child.computeSize(SWT.DEFAULT, SWT.DEFAULT, flushCache);
+			maxWidth = Math.max(maxWidth, pt.x);
+			maxHeight = Math.max(maxHeight, pt.y);
+		}
+
+		if (wHint != SWT.DEFAULT)
+			maxWidth = wHint;
+		if (hHint != SWT.DEFAULT)
+			maxHeight = hHint;
+
+		return new Point(maxWidth, maxHeight);
+
+	}
+
+	protected void layout(Composite composite, boolean flushCache) {
+		Rectangle rect = composite.getClientArea();
+
+		Control[] children = composite.getChildren();
+		for (int i = 0; i < children.length; i++) {
+			children[i].setBounds(rect);
+		}
+	}
+}
+
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractColorPage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractColorPage.java
new file mode 100644
index 0000000..14e3b06
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractColorPage.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+
+/**
+ * @deprecated
+ */
+public abstract class AbstractColorPage extends org.eclipse.jface.preference.PreferencePage implements org.eclipse.ui.IWorkbenchPreferencePage {
+	protected OverlayPreferenceStore fOverlayStore;
+	protected StyledTextColorPicker fPicker = null;
+
+	/**
+	 * Creates the coloring group used in createContents This method can be
+	 * overwritten to set the text of the group or provide an infopop
+	 */
+	protected Composite createColoringComposite(Composite parent) {
+		Composite coloringComposite = createComposite(parent, 1);
+		return coloringComposite;
+	}
+
+	/**
+	 * Creates composite control and sets the default layout data.
+	 */
+	protected Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		composite.setLayoutData(data);
+		return composite;
+	}
+
+	protected Control createContents(Composite parent) {
+		// create scrollbars for this preference page when needed
+		final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
+		Composite pageComponent = createComposite(sc1, 1);
+		sc1.setContent(pageComponent);
+		setSize(pageComponent);
+
+		Label descLabel = createDescriptionLabel(pageComponent, SSEUIMessages.AbstractColorPageDescription); //$NON-NLS-1$
+		Composite coloringComposite = createColoringComposite(pageComponent);
+		createContentsForPicker(coloringComposite);
+
+		GridData gd = (GridData) descLabel.getLayoutData();
+		gd.widthHint = (coloringComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)).x;
+		setSize(pageComponent);
+		return pageComponent;
+	}
+
+	/**
+	 * Creates the StyledTextColorPicker used in createContents This method
+	 * can be overwritten to set up StyledTextColorPicker differently
+	 */
+	protected void createContentsForPicker(Composite parent) {
+		// create the color picker
+		fPicker = new StyledTextColorPicker(parent, SWT.NULL);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		fPicker.setLayoutData(data);
+
+		fPicker.setPreferenceStore(fOverlayStore);
+		setupPicker(fPicker);
+
+		fPicker.setText(getSampleText());
+	}
+
+	/**
+	 * Create description label displayed at top of preference page. This
+	 * method/label is used instead of PreferencePage's description label
+	 * because the ScrolledComposite contained in this page will not fully
+	 * work (horizontal scrolling) with PreferencePage's description label.
+	 */
+	protected Label createDescriptionLabel(Composite parent, String description) {
+		Label label = new Label(parent, SWT.LEFT | SWT.WRAP);
+		label.setText(description);
+
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.grabExcessHorizontalSpace = true;
+		label.setLayoutData(data);
+
+		return label;
+	}
+
+	/**
+	 * Creates composite control and sets the default layout data.
+	 */
+
+	protected Group createGroup(Composite parent, int numColumns) {
+		Group group = new Group(parent, SWT.NULL);
+
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		group.setLayout(layout);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		group.setLayoutData(data);
+
+		return group;
+	}
+
+	/**
+	 * Utility method that creates a label instance and sets the default
+	 * layout data.
+	 */
+	protected Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.LEFT);
+		label.setText(text);
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalAlignment = GridData.FILL;
+		label.setLayoutData(data);
+		return label;
+	}
+
+	protected OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
+		return null;
+	}
+
+	protected Button createPushButton(Composite parent, String label) {
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText(label);
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalAlignment = GridData.FILL;
+		button.setLayoutData(data);
+		return button;
+	}
+
+	/**
+	 * Utility method that creates a text instance and sets the default layout
+	 * data.
+	 */
+	protected Text createTextField(Composite parent, String text) {
+		Text textfield = new Text(parent, SWT.LEFT);
+		textfield.setText(text);
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalAlignment = GridData.FILL;
+		textfield.setLayoutData(data);
+		return textfield;
+	}
+
+	public void dispose() {
+		super.dispose();
+		if (fPicker != null && !fPicker.isDisposed())
+			fPicker.releasePickerResources();
+		if (fOverlayStore != null) {
+			fOverlayStore.stop();
+		}
+	}
+
+	public StyledTextColorPicker getPicker() {
+		return fPicker;
+	}
+
+	public abstract String getSampleText();
+
+	/**
+	 * Initializes this preference page for the given workbench.
+	 * <p>
+	 * This method is called automatically as the preference page is being
+	 * created and initialized. Clients must not call this method.
+	 * </p>
+	 * 
+	 * @param workbench
+	 *            the workbench
+	 */
+	public void init(IWorkbench workbench) {
+		fOverlayStore = new OverlayPreferenceStore(getPreferenceStore(), createOverlayStoreKeys());
+		fOverlayStore.load();
+		fOverlayStore.start();
+	}
+
+	/**
+	 * Initializes states of the controls using default values in the
+	 * preference store.
+	 */
+	protected void performDefaults() {
+		fOverlayStore.loadDefaults();
+		fPicker.refresh();
+	}
+
+	public boolean performOk() {
+		fOverlayStore.propagate();
+		 savePreferences();
+		return true;
+	}
+	
+	protected void savePreferences() {
+		// save plugin preferences here
+	}
+
+	/**
+	 * Sets the size of composite to the default value
+	 */
+	protected void setSize(Composite composite) {
+		if (composite != null) {
+			// Note: The font is set here in anticipation that the class inheriting
+			//       this base class may add widgets to the dialog.   setSize
+			//       is assumed to be called just before we go live.
+			applyDialogFont(composite);
+			Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+			composite.setSize(minSize);
+			// set scrollbar composite's min size so page is expandable but
+			// has scrollbars when needed
+			if (composite.getParent() instanceof ScrolledComposite) {
+				ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
+				sc1.setMinSize(minSize);
+				sc1.setExpandHorizontal(true);
+				sc1.setExpandVertical(true);
+			}
+		}
+	}
+
+	protected abstract void setupPicker(StyledTextColorPicker picker);
+
+	public void setVisible(boolean visible) {
+		boolean doShrink = false;
+		// limiter, for the really huge fonts
+		if (visible) {
+			getPicker().refresh();
+			int x = Math.min(getControl().getShell().getSize().x, getControl().getDisplay().getClientArea().width * 9 / 10);
+			int y = Math.min(getControl().getShell().getSize().y, getControl().getDisplay().getClientArea().height * 9 / 10);
+			boolean shrinkWidth = (x != getControl().getShell().getSize().x);
+			boolean shrinkHeight = (y != getControl().getShell().getSize().y);
+			doShrink = shrinkWidth || shrinkHeight;
+			if (doShrink) {
+				// modify just the height
+				if (shrinkHeight && !shrinkWidth)
+					getShell().setBounds(getShell().getLocation().x, 0, getShell().getSize().x, getControl().getDisplay().getClientArea().height);
+				// modify just the width
+				else if (!shrinkHeight && shrinkWidth)
+					getShell().setBounds(0, getShell().getLocation().y, getControl().getDisplay().getClientArea().width, getShell().getSize().y);
+				// change the entire shell size to only fill the display, and
+				// move it to the origin
+				else
+					getShell().setBounds(0, 0, getControl().getDisplay().getClientArea().width, getControl().getDisplay().getClientArea().height);
+			}
+		}
+		super.setVisible(visible);
+		if (doShrink) {
+			getControl().getShell().redraw();
+			getControl().getShell().update();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractPreferencePage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractPreferencePage.java
new file mode 100644
index 0000000..0e69c18
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractPreferencePage.java
@@ -0,0 +1,296 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.sse.core.internal.SSECorePlugin;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * (pa) why is this class abstract if there are no abstract methods?
+ */
+public abstract class AbstractPreferencePage extends PreferencePage implements ModifyListener, SelectionListener, IWorkbenchPreferencePage {
+
+	protected final static int WIDTH_VALIDATION_LOWER_LIMIT = 0; //$NON-NLS-1$
+	protected final static int WIDTH_VALIDATION_UPPER_LIMIT = 999; //$NON-NLS-1$
+
+	protected Button createCheckBox(Composite group, String label) {
+		Button button = new Button(group, SWT.CHECK | SWT.LEFT);
+		button.setText(label);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.verticalAlignment = GridData.CENTER;
+		data.horizontalAlignment = GridData.FILL;
+		button.setLayoutData(data);
+
+		return button;
+	}
+	
+	protected void initCheckbox(Button box, String key) {
+		if(box != null && key != null) {
+			box.setSelection(getPreferenceStore().getBoolean(key));
+		}
+	}
+
+	protected void defaultCheckbox(Button box, String key) {
+		if(box != null && key != null) {
+			box.setSelection(getPreferenceStore().getDefaultBoolean(key));
+		}
+	}
+
+	protected Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalIndent = 0;
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+	protected Control createContents(Composite parent) {
+		return createScrolledComposite(parent);
+	}
+
+	protected Combo createDropDownBox(Composite parent) {
+		Combo comboBox = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+
+		//GridData
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.CENTER;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		comboBox.setLayoutData(data);
+
+		return comboBox;
+	}
+
+	protected Group createGroup(Composite parent, int numColumns) {
+		Group group = new Group(parent, SWT.NULL);
+
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		group.setLayout(layout);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalIndent = 0;
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		group.setLayoutData(data);
+
+		return group;
+	}
+
+	protected Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.LEFT);
+		label.setText(text);
+
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.verticalAlignment = GridData.CENTER;
+		data.horizontalAlignment = GridData.FILL;
+		label.setLayoutData(data);
+
+		return label;
+	}
+
+	protected Button createRadioButton(Composite group, String label) {
+		Button button = new Button(group, SWT.RADIO);
+		button.setText(label);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.verticalAlignment = GridData.CENTER;
+		data.horizontalAlignment = GridData.FILL;
+		button.setLayoutData(data);
+
+		return button;
+	}
+
+	protected Composite createScrolledComposite(Composite parent) {
+		// create scrollbars for this parent when needed
+		final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
+		Composite composite = createComposite(sc1, 1);
+		sc1.setContent(composite);
+
+		// not calling setSize for composite will result in a blank composite,
+		// so calling it here initially
+		// setSize actually needs to be called after all controls are created,
+		// so scrolledComposite
+		// has correct minSize
+		setSize(composite);
+		return composite;
+	}
+
+	protected Label createSeparator(Composite parent, int columnSpan) {
+		// Create a spacer line
+		Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.verticalAlignment = GridData.CENTER;
+		data.horizontalAlignment = GridData.FILL;
+		data.horizontalSpan = columnSpan;
+
+		separator.setLayoutData(data);
+		return separator;
+	}
+
+	protected Text createTextField(Composite parent) {
+		Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
+
+		//GridData
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.CENTER;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		text.setLayoutData(data);
+
+		return text;
+	}
+
+	protected void enableValues() {
+	}
+
+	protected Preferences getModelPreferences() {
+		return SSECorePlugin.getDefault().getPluginPreferences();
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+
+	protected void initializeValues() {
+	}
+
+	protected boolean loadPreferences() {
+		BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
+			public void run() {
+				initializeValues();
+				validateValues();
+				enableValues();
+			}
+		});
+		return true;
+	}
+
+	public void modifyText(ModifyEvent e) {
+		// If we are called too early, i.e. before the controls are created
+		// then return
+		// to avoid null pointer exceptions
+		if (e.widget != null && e.widget.isDisposed())
+			return;
+
+		validateValues();
+		enableValues();
+	}
+
+	protected void performDefaults() {
+		super.performDefaults();
+	}
+
+	public boolean performOk() {
+		savePreferences();
+		return true;
+	}
+
+	protected boolean savePreferences() {
+		BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
+			public void run() {
+				storeValues();
+			}
+		});
+		return true;
+	}
+
+	protected void setInvalidInputMessage(String widthText) {
+		String msg = NLS.bind(SSEUIMessages._4concat, (new Object[]{widthText}));
+		setErrorMessage(msg);
+	}
+
+	protected void setSize(Composite composite) {
+		if (composite != null) {
+			// Note: The font is set here in anticipation that the class inheriting
+			//       this base class may add widgets to the dialog.   setSize
+			//       is assumed to be called just before we go live.
+			applyDialogFont(composite);
+			Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+			composite.setSize(minSize);
+			// set scrollbar composite's min size so page is expandable but
+			// has scrollbars when needed
+			if (composite.getParent() instanceof ScrolledComposite) {
+				ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
+				sc1.setMinSize(minSize);
+				sc1.setExpandHorizontal(true);
+				sc1.setExpandVertical(true);
+			}
+		}
+	}
+
+	protected void storeValues() {
+		SSEUIPlugin.getDefault().savePluginPreferences();
+	}
+
+	protected void validateValues() {
+	}
+
+	public void widgetDefaultSelected(SelectionEvent e) {
+		widgetSelected(e);
+	}
+
+	public void widgetSelected(SelectionEvent e) {
+		// If we are called too early, i.e. before the controls are created
+		// then return
+		// to avoid null pointer exceptions
+		if (e.widget != null && e.widget.isDisposed())
+			return;
+
+		validateValues();
+		enableValues();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractPreferenceTab.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractPreferenceTab.java
new file mode 100644
index 0000000..4af18ad
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/AbstractPreferenceTab.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+
+/**
+ * Generic preference tab page that contains helpful methods
+ * 
+ * @author amywu
+ */
+abstract public class AbstractPreferenceTab implements IPreferenceTab {
+
+	Map fCheckBoxes = new HashMap();
+	private SelectionListener fCheckBoxListener = new SelectionListener() {
+		public void widgetDefaultSelected(SelectionEvent e) {
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			Button button = (Button) e.widget;
+			fOverlayStore.setValue((String) fCheckBoxes.get(button), button.getSelection());
+		}
+	};
+	private PreferencePage fMainPreferencePage;
+	private ModifyListener fNumberFieldListener = new ModifyListener() {
+		public void modifyText(ModifyEvent e) {
+			numberFieldChanged((Text) e.widget);
+		}
+	};
+	private ArrayList fNumberFields = new ArrayList();
+	OverlayPreferenceStore fOverlayStore;
+	private ModifyListener fTextFieldListener = new ModifyListener() {
+		public void modifyText(ModifyEvent e) {
+			Text text = (Text) e.widget;
+			fOverlayStore.setValue((String) fTextFields.get(text), text.getText());
+		}
+	};
+	Map fTextFields = new HashMap();
+
+	protected Button addCheckBox(Composite parent, String label, String key, int indentation) {
+		Button checkBox = new Button(parent, SWT.CHECK);
+		checkBox.setText(label);
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+		gd.horizontalIndent = indentation;
+		gd.horizontalSpan = 2;
+		checkBox.setLayoutData(gd);
+		checkBox.addSelectionListener(fCheckBoxListener);
+
+		fCheckBoxes.put(checkBox, key);
+
+		return checkBox;
+	}
+
+	/**
+	 * Returns an array of size 2: - first element is of type
+	 * <code>Label</code>- second element is of type <code>Text</code>
+	 * Use <code>getLabelControl</code> and <code>getTextControl</code> to
+	 * get the 2 controls.
+	 */
+	private Control[] addLabelledTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {
+		Label labelControl = new Label(composite, SWT.NONE);
+		labelControl.setText(label);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+		gd.horizontalIndent = indentation;
+		labelControl.setLayoutData(gd);
+
+		Text textControl = new Text(composite, SWT.BORDER | SWT.SINGLE);
+		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+		gd.widthHint = convertWidthInCharsToPixels(textControl, textLimit + 1);
+		textControl.setLayoutData(gd);
+		textControl.setTextLimit(textLimit);
+		fTextFields.put(textControl, key);
+		if (isNumber) {
+			fNumberFields.add(textControl);
+			textControl.addModifyListener(fNumberFieldListener);
+		} else {
+			textControl.addModifyListener(fTextFieldListener);
+		}
+
+		return new Control[]{labelControl, textControl};
+	}
+
+	protected Text addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {
+		return getTextControl(addLabelledTextField(composite, label, key, textLimit, indentation, isNumber));
+	}
+
+	/**
+	 * Applies the status to the status line of a dialog page.
+	 */
+	private void applyToStatusLine(IStatus status) {
+		String message = status.getMessage();
+		switch (status.getSeverity()) {
+			case IStatus.OK :
+				fMainPreferencePage.setMessage(message, IMessageProvider.NONE);
+				fMainPreferencePage.setErrorMessage(null);
+				break;
+			case IStatus.WARNING :
+				fMainPreferencePage.setMessage(message, IMessageProvider.WARNING);
+				fMainPreferencePage.setErrorMessage(null);
+				break;
+			case IStatus.INFO :
+				fMainPreferencePage.setMessage(message, IMessageProvider.INFORMATION);
+				fMainPreferencePage.setErrorMessage(null);
+				break;
+			default :
+				if (message.length() == 0) {
+					message = null;
+				}
+				fMainPreferencePage.setMessage(null);
+				fMainPreferencePage.setErrorMessage(message);
+				break;
+		}
+	}
+
+	/**
+	 * Returns the number of pixels corresponding to the width of the given
+	 * number of characters. This method was copied from
+	 * org.eclipse.jface.dialogs.DialogPage
+	 * <p>
+	 * 
+	 * @param a
+	 *            control in the page
+	 * @param chars
+	 *            the number of characters
+	 * @return the number of pixels
+	 */
+	private int convertWidthInCharsToPixels(Control testControl, int chars) {
+		// Compute and store a font metric
+		GC gc = new GC(testControl);
+		gc.setFont(JFaceResources.getDialogFont());
+		FontMetrics fontMetrics = gc.getFontMetrics();
+		gc.dispose();
+
+		// test for failure to initialize for backward compatibility
+		if (fontMetrics == null)
+			return 0;
+		return Dialog.convertWidthInCharsToPixels(fontMetrics, chars);
+	}
+
+	/**
+	 * @return Returns the fMainPreferencePage.
+	 */
+	protected PreferencePage getMainPreferencePage() {
+		return fMainPreferencePage;
+	}
+
+	/**
+	 * @return Returns the fOverlayStore.
+	 */
+	protected OverlayPreferenceStore getOverlayStore() {
+		return fOverlayStore;
+	}
+
+	private Text getTextControl(Control[] labelledTextField) {
+		return (Text) labelledTextField[1];
+	}
+
+	protected void initializeFields() {
+		Iterator e = fCheckBoxes.keySet().iterator();
+		while (e.hasNext()) {
+			Button b = (Button) e.next();
+			String key = (String) fCheckBoxes.get(b);
+			b.setSelection(fOverlayStore.getBoolean(key));
+		}
+
+		e = fTextFields.keySet().iterator();
+		while (e.hasNext()) {
+			Text t = (Text) e.next();
+			String key = (String) fTextFields.get(t);
+			t.setText(fOverlayStore.getString(key));
+		}
+	}
+
+	void numberFieldChanged(Text textControl) {
+		String number = textControl.getText();
+		IStatus status = validatePositiveNumber(number);
+		if (!status.matches(IStatus.ERROR))
+			fOverlayStore.setValue((String) fTextFields.get(textControl), number);
+		updateStatus(status);
+	}
+
+	/**
+	 * @param mainPreferencePage
+	 *            The fMainPreferencePage to set.
+	 */
+	protected void setMainPreferencePage(PreferencePage mainPreferencePage) {
+		fMainPreferencePage = mainPreferencePage;
+	}
+
+	/**
+	 * @param overlayStore
+	 *            The fOverlayStore to set.
+	 */
+	protected void setOverlayStore(OverlayPreferenceStore overlayStore) {
+		fOverlayStore = overlayStore;
+	}
+
+	/**
+	 * Update status of main preference page
+	 * 
+	 * @param status
+	 */
+	protected void updateStatus(IStatus status) {
+		if (!status.matches(IStatus.ERROR)) {
+			for (int i = 0; i < fNumberFields.size(); i++) {
+				Text text = (Text) fNumberFields.get(i);
+				IStatus s = validatePositiveNumber(text.getText());
+				status = s.getSeverity() > status.getSeverity() ? s : status;
+			}
+		}
+
+		fMainPreferencePage.setValid(!status.matches(IStatus.ERROR));
+		applyToStatusLine(status);
+	}
+
+	private IStatus validatePositiveNumber(String number) {
+		StatusInfo status = new StatusInfo();
+		if (number.length() == 0) {
+			status.setError(SSEUIMessages.StructuredTextEditorPreferencePage_37);
+		} else {
+			try {
+				int value = Integer.parseInt(number);
+				if (value < 0)
+					status.setError(number + SSEUIMessages.StructuredTextEditorPreferencePage_38);
+			} catch (NumberFormatException e) {
+				status.setError(number + SSEUIMessages.StructuredTextEditorPreferencePage_38);
+			}
+		}
+		return status;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorEditor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorEditor.java
new file mode 100644
index 0000000..fc1d168
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorEditor.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleControlAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.ColorDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A "button" of a certain color determined by the color picker.
+ */
+public class ColorEditor {
+	Button fButton;
+	Color fColor;
+	RGB fColorValue;
+
+	private Point fExtent;
+	Image fImage;
+
+	public ColorEditor(Composite parent) {
+
+		fButton = new Button(parent, SWT.PUSH);
+		fExtent = computeImageSize(parent);
+		fImage = new Image(parent.getDisplay(), fExtent.x, fExtent.y);
+
+		GC gc = new GC(fImage);
+		gc.setBackground(fButton.getBackground());
+		gc.fillRectangle(0, 0, fExtent.x, fExtent.y);
+		gc.dispose();
+
+		fButton.setImage(fImage);
+
+		// bug2541 - associate color value to button's value field
+		fButton.getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() {
+			/**
+			 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getValue(AccessibleControlEvent)
+			 */
+			public void getValue(AccessibleControlEvent e) {
+				if (e.childID == ACC.CHILDID_SELF) {
+					if (getColorValue() != null)
+						e.result = getColorValue().toString();
+					else
+						e.result = null;
+				}
+			}
+		});
+
+		fButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				ColorDialog colorDialog = new ColorDialog(fButton.getShell());
+				colorDialog.setRGB(fColorValue);
+				RGB newColor = colorDialog.open();
+				if (newColor != null) {
+					fColorValue = newColor;
+					updateColorImage();
+				}
+			}
+		});
+
+		fButton.addDisposeListener(new DisposeListener() {
+			public void widgetDisposed(DisposeEvent event) {
+				if (fImage != null) {
+					fImage.dispose();
+					fImage = null;
+				}
+				if (fColor != null) {
+					fColor.dispose();
+					fColor = null;
+				}
+			}
+		});
+	}
+
+	protected Point computeImageSize(Control window) {
+		GC gc = new GC(window);
+		Font f = JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT);
+		gc.setFont(f);
+		int height = gc.getFontMetrics().getHeight();
+		gc.dispose();
+		Point p = new Point(height * 3 - 6, height);
+		return p;
+	}
+
+	public Button getButton() {
+		return fButton;
+	}
+
+	public RGB getColorValue() {
+		return fColorValue;
+	}
+
+	public void setColorValue(RGB rgb) {
+		fColorValue = rgb;
+		updateColorImage();
+	}
+
+	protected void updateColorImage() {
+
+		Display display = fButton.getDisplay();
+
+		GC gc = new GC(fImage);
+		gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
+		gc.drawRectangle(0, 2, fExtent.x - 1, fExtent.y - 4);
+
+		if (fColor != null)
+			fColor.dispose();
+
+		fColor = new Color(display, fColorValue);
+		gc.setBackground(fColor);
+		gc.fillRectangle(1, 3, fExtent.x - 2, fExtent.y - 5);
+		gc.dispose();
+
+		fButton.setImage(fImage);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorHelper.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorHelper.java
new file mode 100644
index 0000000..684da7b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorHelper.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+
+
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+import com.ibm.icu.util.StringTokenizer;
+
+
+public class ColorHelper {
+	public final static String BACKGROUND = "background";//$NON-NLS-1$
+	public final static String BOLD = "bold";//$NON-NLS-1$
+	public final static String FOREGROUND = "foreground";//$NON-NLS-1$
+	public final static String NAME = "name";//$NON-NLS-1$
+	private final static String STYLE_SEPARATOR = "|"; //$NON-NLS-1$ 
+	private final static String NULL = "null"; //$NON-NLS-1$
+
+	/**
+	 * Return an RGB String given the int r, g, b values
+	 */
+	public static String getColorString(int r, int g, int b) {
+		return "#" + getHexString(r, 2) + getHexString(g, 2) + getHexString(b, 2);//$NON-NLS-1$
+	}
+
+	private static String getHexString(int value, int minWidth) {
+		String hexString = Integer.toHexString(value);
+		for (int i = hexString.length(); i < minWidth; i++) {
+			hexString = "0" + hexString;//$NON-NLS-1$
+		}
+		return hexString;
+	}
+
+	/**
+	 * Generates a preference string to be placed in preferences from the
+	 * given String array.
+	 * 
+	 * @param stylePrefs
+	 *            assumes not null and should be in the form of String[0] =
+	 *            Foreground RGB String, String[1] = Background RGB String,
+	 *            String[2] = Bold true/false
+	 * 
+	 * @return String in the form of Foreground RGB String | Background RGB
+	 *         String | Bold true/false
+	 */
+	public static String packStylePreferences(String[] stylePrefs) {
+		StringBuffer styleString = new StringBuffer();
+
+		for (int i = 0; i < stylePrefs.length; ++i) {
+			String s = stylePrefs[i];
+			if (i < 2) {
+				if (s != null) {
+					styleString.append(s);
+				}
+				else {
+					styleString.append(NULL);
+				}
+			}
+			else {
+				styleString.append(Boolean.valueOf(s));
+			}
+
+			// add in the separator (except on last iteration)
+			if (i < stylePrefs.length - 1) {
+				styleString.append(" " + STYLE_SEPARATOR + " "); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		return styleString.toString();
+	}
+
+	/**
+	 * @return org.eclipse.swt.graphics.RGB
+	 * @param anRGBString
+	 *            java.lang.String
+	 */
+	public static RGB toRGB(String anRGBString) {
+		RGB result = null;
+		if (anRGBString.length() > 6 && anRGBString.charAt(0) == '#') {
+			int r = 0;
+			int g = 0;
+			int b = 0;
+			try {
+				r = Integer.valueOf(anRGBString.substring(1, 3), 16).intValue();
+				g = Integer.valueOf(anRGBString.substring(3, 5), 16).intValue();
+				b = Integer.valueOf(anRGBString.substring(5, 7), 16).intValue();
+				result = new RGB(r, g, b);
+			} catch (NumberFormatException nfExc) {
+				Logger.logException("Could not load highlighting preference for color " + anRGBString, nfExc);//$NON-NLS-1$
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @return java.lang.String
+	 * @param anRGB
+	 *            org.eclipse.swt.graphics.RGB
+	 */
+	public static String toRGBString(RGB anRGB) {
+		if (anRGB == null)
+			return "#000000";//$NON-NLS-1$
+		String red = Integer.toHexString(anRGB.red);
+		while (red.length() < 2)
+			red = "0" + red;//$NON-NLS-1$
+		String green = Integer.toHexString(anRGB.green);
+		while (green.length() < 2)
+			green = "0" + green;//$NON-NLS-1$
+		String blue = Integer.toHexString(anRGB.blue);
+		while (blue.length() < 2)
+			blue = "0" + blue;//$NON-NLS-1$
+		return "#" + red + green + blue;//$NON-NLS-1$
+	}
+
+	/**
+	 * Extracts the foreground (RGB String), background (RGB String), bold
+	 * (boolean String) from the given preference string.
+	 * 
+	 * @param preference
+	 *            should be in the form of Foreground RGB String | Background
+	 *            RGB String | Bold true/false | Italic true/false | Strikethrough true/false | Underline true/false
+	 * @return String[] where String[0] = Foreground RGB String, String[1] =
+	 *         Background RGB String, String[2] = Bold true/false, 3 = Italic
+	 *         true/false, 4 = Strikethrough true/false, 5 = Underline
+	 *         true/false; indexes 2-4 may be null if we ran into problems
+	 *         extracting
+	 */
+	public static String[] unpackStylePreferences(String preference) {
+		String[] stylePrefs = new String[6];
+		if (preference != null) {
+			StringTokenizer st = new StringTokenizer(preference, STYLE_SEPARATOR);
+			if (st.hasMoreTokens()) {
+				String foreground = st.nextToken().trim();
+				stylePrefs[0] = foreground;
+			}
+			else {
+				stylePrefs[0] = NULL;
+			}
+			if (st.hasMoreTokens()) {
+				String background = st.nextToken().trim();
+				stylePrefs[1] = background;
+			}
+			else {
+				stylePrefs[1] = NULL;
+			}
+
+			if (st.hasMoreTokens()) {
+				String bold = st.nextToken().trim();
+				stylePrefs[2] = Boolean.valueOf(bold).toString();
+			}
+			else {
+				stylePrefs[2] = Boolean.FALSE.toString();
+			}
+			if (st.hasMoreTokens()) {
+				String italic = st.nextToken().trim();
+				stylePrefs[3] = Boolean.valueOf(italic).toString();
+			}
+			else {
+				stylePrefs[3] = Boolean.FALSE.toString();
+			}
+			if (st.hasMoreTokens()) {
+				String strikethrough = st.nextToken().trim();
+				stylePrefs[4] = Boolean.valueOf(strikethrough).toString();
+			}
+			else {
+				stylePrefs[4] = Boolean.FALSE.toString();
+			}
+			if (st.hasMoreTokens()) {
+				String underline = st.nextToken().trim();
+				stylePrefs[5] = Boolean.valueOf(underline).toString();
+			}
+			else {
+				stylePrefs[5] = Boolean.FALSE.toString();
+			}
+		}
+
+		return stylePrefs;
+	}
+	
+	/**
+	 * Attempts to lookup the RGB value for <code>key</code> from the color
+	 * registry. If one is not found, the <code>defaultRGB</code> is used.
+	 * @param registry The ColorRegistry to search for the RGB value
+	 * @param key The key that the RGB value is stored under in the registry
+	 * @param defaultRGB The default RGB value to return in the absence of one
+	 * from the color registry
+	 * 
+	 * @return The RGB value from the color registry for a given key, if it exists.
+	 * Otherwise, return the default RGB value.
+	 */
+	public static RGB findRGB(ColorRegistry registry, String key, RGB defaultRGB) {
+		if(registry.hasValueFor(key))
+			return registry.getRGB(key);
+		return defaultRGB;
+	}
+	
+	/**
+	 * Attempts to find the RGB string for <code>key</code> from the color registry.
+	 * If one is not found, an RGB string is generated from the parameters <code>r,g,b</code>.
+	 * 
+	 * @param registry The ColorRegistry to search for the RGB value
+	 * @param key The key that the RGB value is stored under in the registry
+	 * @param r The default red value
+	 * @param g The default green value
+	 * @param b The default blue value
+	 * 
+	 * @return The String RGB value from the color registry for a given key, if it exists.
+	 * Otherwise, return the string RGB value created from the default r,g,b parameters.
+	 * 
+	 */
+	public static String findRGBString(ColorRegistry registry, String key, int r, int g, int b) {
+		if(registry.hasValueFor(key))
+			return toRGBString(registry.getRGB(key));
+		return getColorString(r, g, b);
+	}
+	
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorNames.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorNames.java
new file mode 100644
index 0000000..2d0c993
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ColorNames.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+
+
+public interface ColorNames {
+	String BACKGROUND = "background"; //$NON-NLS-1$
+	String BOLD = "bold"; //$NON-NLS-1$
+	String COLOR = "color"; //$NON-NLS-1$
+
+	String COLORS = "colors"; //$NON-NLS-1$
+	String FOREGROUND = "foreground"; //$NON-NLS-1$
+	String ITALIC = "italic"; //$NON-NLS-1$
+
+	String NAME = "name"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/EmptyFilePreferencePage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/EmptyFilePreferencePage.java
new file mode 100644
index 0000000..6536e9a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/EmptyFilePreferencePage.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+public class EmptyFilePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+	private Composite createComposite(Composite parent, int numColumns) {
+		noDefaultAndApplyButton();
+		
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		// GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+
+		// GridData
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalIndent = 0;
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+	protected Control createContents(Composite parent) {
+		Composite composite = createScrolledComposite(parent);
+
+		String description = SSEUIMessages.EmptyFilePreferencePage_0; //$NON-NLS-1$
+		Text text = new Text(composite, SWT.READ_ONLY);
+		// some themes on GTK have different background colors for Text and Labels
+		text.setBackground(composite.getBackground());
+		text.setText(description);
+
+		setSize(composite);
+		return composite;
+	}
+
+	private Composite createScrolledComposite(Composite parent) {
+		// create scrollbars for this parent when needed
+		final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
+		Composite composite = createComposite(sc1, 1);
+		sc1.setContent(composite);
+
+		// not calling setSize for composite will result in a blank composite,
+		// so calling it here initially
+		// setSize actually needs to be called after all controls are created,
+		// so scrolledComposite
+		// has correct minSize
+		setSize(composite);
+		return composite;
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+
+	private void setSize(Composite composite) {
+		if (composite != null) {
+			// Note: The font is set here in anticipation that the class inheriting
+			//       this base class may add widgets to the dialog.   setSize
+			//       is assumed to be called just before we go live.
+			applyDialogFont(composite);
+			Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+			composite.setSize(minSize);
+			// set scrollbar composite's min size so page is expandable but
+			// has scrollbars when needed
+			if (composite.getParent() instanceof ScrolledComposite) {
+				ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
+				sc1.setMinSize(minSize);
+				sc1.setExpandHorizontal(true);
+				sc1.setExpandVertical(true);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/FilePreferencePage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/FilePreferencePage.java
new file mode 100644
index 0000000..6c86535
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/FilePreferencePage.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.sse.core.internal.SSECorePlugin;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.preferences.TabFolderLayout;
+
+public class FilePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+	private IPreferenceTab[] fTabs = null;
+
+	protected Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalIndent = 0;
+		data.verticalAlignment = GridData.FILL_VERTICAL;
+		data.horizontalAlignment = GridData.FILL_HORIZONTAL;
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+	protected Control createContents(Composite parent) {
+		Composite composite = createComposite(parent, 1);
+
+		String description = SSEUIMessages.FilePreferencePage_0; //$NON-NLS-1$
+		createLabel(composite, description);
+		createLabel(composite, ""); //$NON-NLS-1$
+
+		TabFolder folder = new TabFolder(composite, SWT.NONE);
+		folder.setLayout(new TabFolderLayout());
+		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+//		TabItem taskItem = new TabItem(folder, SWT.NONE);
+//		IPreferenceTab tasksTab = new TaskTagPreferenceTab();
+//		taskItem.setText(tasksTab.getTitle());
+//		Control taskTags = tasksTab.createContents(folder);
+//		taskItem.setControl(taskTags);
+
+		TabItem translucenceItem = new TabItem(folder, SWT.NONE);
+		IPreferenceTab translucenceTab = new TranslucencyPreferenceTab(this);
+		translucenceItem.setText(translucenceTab.getTitle());
+		Control translucenceControl = translucenceTab.createContents(folder);
+		translucenceItem.setControl(translucenceControl);
+
+		fTabs = new IPreferenceTab[]{/*tasksTab,*/ translucenceTab};
+
+		return composite;
+	}
+
+	protected Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.LEFT);
+		label.setText(text);
+
+		//GridData
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;
+		label.setLayoutData(data);
+
+		return label;
+	}
+
+	public void init(IWorkbench desktop) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#performApply()
+	 */
+	protected void performApply() {
+		super.performApply();
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performApply();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		super.performDefaults();
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performDefaults();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		boolean ok = super.performOk();
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performOk();
+		}
+		SSECorePlugin.getDefault().savePluginPreferences();
+		return ok;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/IPreferenceTab.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/IPreferenceTab.java
new file mode 100644
index 0000000..2ccb563
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/IPreferenceTab.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public interface IPreferenceTab {
+
+	Control createContents(Composite tabFolder);
+
+	String getTitle();
+
+	void performApply();
+
+	void performDefaults();
+
+	void performOk();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ScrolledPageContent.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ScrolledPageContent.java
new file mode 100644
index 0000000..e1f9c43
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/ScrolledPageContent.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.SharedScrolledComposite;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+public class ScrolledPageContent extends SharedScrolledComposite {
+
+	private FormToolkit fToolkit;
+	
+	public ScrolledPageContent(Composite parent) {
+		this(parent, SWT.V_SCROLL | SWT.H_SCROLL);
+	}
+	
+	public ScrolledPageContent(Composite parent, int style) {
+		super(parent, style);
+		
+		setExpandHorizontal(true);
+		setExpandVertical(true);
+		
+		fToolkit = SSEUIPlugin.getInstance().getDialogsFormToolkit();
+		
+		Composite body= new Composite(this, SWT.NONE);
+		body.setFont(parent.getFont());
+		setContent(body);
+	}
+	
+	public void adaptChild(Control childControl) {
+		fToolkit.adapt(childControl, true, true);
+	}
+	
+	public Composite getBody() {
+		return (Composite) getContent();
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StatusInfo.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StatusInfo.java
new file mode 100644
index 0000000..c783131
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StatusInfo.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.ui.editors.text.EditorsUI;
+
+/**
+ * A settable IStatus. Can be an error, warning, info or ok. For error, info
+ * and warning states, a message describes the problem.
+ * 
+ * This class was copied from other StatusInfo classes that are located in
+ * internal packages
+ */
+class StatusInfo implements IStatus {
+	/** The severity of this status. */
+	private int fSeverity;
+
+	/** The message of this status. */
+	private String fStatusMessage;
+
+	/**
+	 * Creates a status set to OK (no message).
+	 */
+	public StatusInfo() {
+		this(OK, null);
+	}
+
+	/**
+	 * Creates a status with the given severity and message.
+	 * 
+	 * @param severity
+	 *            the severity of this status: ERROR, WARNING, INFO and OK.
+	 * @param message
+	 *            the message of this status. Applies only for ERROR, WARNING
+	 *            and INFO.
+	 */
+	public StatusInfo(int severity, String message) {
+		fStatusMessage = message;
+		fSeverity = severity;
+	}
+
+	/**
+	 * Returns always <code>null</code>.
+	 * 
+	 * @see IStatus#getChildren()
+	 */
+	public IStatus[] getChildren() {
+		return new IStatus[0];
+	}
+
+	/**
+	 * Returns always the error severity.
+	 * 
+	 * @see IStatus#getCode()
+	 */
+	public int getCode() {
+		return fSeverity;
+	}
+
+	/**
+	 * Returns always <code>null</code>.
+	 * 
+	 * @see IStatus#getException()
+	 */
+	public Throwable getException() {
+		return null;
+	}
+
+	/*
+	 * @see IStatus#getMessage()
+	 */
+	public String getMessage() {
+		return fStatusMessage;
+	}
+
+	/*
+	 * @see IStatus#getPlugin()
+	 */
+	public String getPlugin() {
+		return EditorsUI.PLUGIN_ID;
+	}
+
+	/*
+	 * @see IStatus#getSeverity()
+	 */
+	public int getSeverity() {
+		return fSeverity;
+	}
+
+	/**
+	 * Returns whether this status indicates an error.
+	 * 
+	 * @return <code>true</code> if this status has severity
+	 *         {@link IStatus#ERROR}and <code>false</code> otherwise
+	 */
+	public boolean isError() {
+		return fSeverity == IStatus.ERROR;
+	}
+
+	/**
+	 * Returns whether this status indicates an info.
+	 * 
+	 * @return <code>true</code> if this status has severity
+	 *         {@link IStatus#INFO}and <code>false</code> otherwise
+	 */
+	public boolean isInfo() {
+		return fSeverity == IStatus.INFO;
+	}
+
+	/**
+	 * Returns always <code>false</code>.
+	 * 
+	 * @see IStatus#isMultiStatus()
+	 */
+	public boolean isMultiStatus() {
+		return false;
+	}
+
+	/*
+	 * @see org.eclipse.core.runtime.IStatus#isOK()
+	 */
+	public boolean isOK() {
+		return fSeverity == IStatus.OK;
+	}
+
+	/**
+	 * Returns whether this status indicates a warning.
+	 * 
+	 * @return <code>true</code> if this status has severity
+	 *         {@link IStatus#WARNING}and <code>false</code> otherwise
+	 */
+	public boolean isWarning() {
+		return fSeverity == IStatus.WARNING;
+	}
+
+	/*
+	 * @see IStatus#matches(int)
+	 */
+	public boolean matches(int severityMask) {
+		return (fSeverity & severityMask) != 0;
+	}
+
+	/**
+	 * Sets the status to ERROR.
+	 * 
+	 * @param errorMessage
+	 *            the error message which can be an empty string, but not
+	 *            <code>null</code>
+	 */
+	public void setError(String errorMessage) {
+		Assert.isNotNull(errorMessage);
+		fStatusMessage = errorMessage;
+		fSeverity = IStatus.ERROR;
+	}
+
+	/**
+	 * Sets the status to INFO.
+	 * 
+	 * @param infoMessage
+	 *            the info message which can be an empty string, but not
+	 *            <code>null</code>
+	 */
+	public void setInfo(String infoMessage) {
+		Assert.isNotNull(infoMessage);
+		fStatusMessage = infoMessage;
+		fSeverity = IStatus.INFO;
+	}
+
+	/**
+	 * Sets the status to OK.
+	 */
+	public void setOK() {
+		fStatusMessage = null;
+		fSeverity = IStatus.OK;
+	}
+
+	/**
+	 * Sets the status to WARNING.
+	 * 
+	 * @param warningMessage
+	 *            the warning message which can be an empty string, but not
+	 *            <code>null</code>
+	 */
+	public void setWarning(String warningMessage) {
+		Assert.isNotNull(warningMessage);
+		fStatusMessage = warningMessage;
+		fSeverity = IStatus.WARNING;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StructuredTextEditorPreferencePage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StructuredTextEditorPreferencePage.java
new file mode 100644
index 0000000..dd9ee29
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StructuredTextEditorPreferencePage.java
@@ -0,0 +1,461 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.DialogPage;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferenceLinkArea;
+import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+import org.eclipse.wst.sse.ui.internal.preferences.TabFolderLayout;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingStrategy;
+import org.eclipse.wst.sse.ui.internal.provisional.preferences.CommonEditorPreferenceNames;
+
+/**
+ * Gutted version of JavaEditorPreferencePage
+ * 
+ * @author pavery
+ */
+public class StructuredTextEditorPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+	private ColorEditor fAppearanceColorEditor;
+	private List fAppearanceColorList;
+
+	private final String[][] fAppearanceColorListModel = new String[][]{{SSEUIMessages.StructuredTextEditorPreferencePage_2, EditorPreferenceNames.MATCHING_BRACKETS_COLOR}, {SSEUIMessages.StructuredTextEditorPreferencePage_41, EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND}, {SSEUIMessages.StructuredTextEditorPreferencePage_42, EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND}, {SSEUIMessages.StructuredTextEditorPreferencePage_43, EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND}, {SSEUIMessages.StructuredTextEditorPreferencePage_44, EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND}}; //$NON-NLS-1$
+	private Map fCheckBoxes = new HashMap();
+	private SelectionListener fCheckBoxListener = new SelectionListener() {
+		public void widgetDefaultSelected(SelectionEvent e) {
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			Button button = (Button) e.widget;
+			fOverlayStore.setValue((String) fCheckBoxes.get(button), button.getSelection());
+		}
+	};
+
+	private Map fColorButtons = new HashMap();
+
+	private ArrayList fNumberFields = new ArrayList();
+	private OverlayPreferenceStore fOverlayStore;
+	/** Button controlling default setting of the selected reference provider. */
+	// TODO: private field never read locally
+	Button fSetDefaultButton;
+	private IPreferenceTab[] fTabs = null;
+	private Map fTextFields = new HashMap();
+
+	public StructuredTextEditorPreferencePage() {
+		setDescription(SSEUIMessages.StructuredTextEditorPreferencePage_6); //$NON-NLS-1$
+		setPreferenceStore(SSEUIPlugin.getDefault().getPreferenceStore());
+
+		fOverlayStore = new OverlayPreferenceStore(getPreferenceStore(), createOverlayStoreKeys());
+	}
+
+	private Button addCheckBox(Composite parent, String label, String key, int indentation) {
+		Button checkBox = new Button(parent, SWT.CHECK);
+		checkBox.setText(label);
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+		gd.horizontalIndent = indentation;
+		gd.horizontalSpan = 2;
+		checkBox.setLayoutData(gd);
+		checkBox.addSelectionListener(fCheckBoxListener);
+
+		fCheckBoxes.put(checkBox, key);
+
+		return checkBox;
+	}
+
+	/**
+	 * Applies the status to the status line of a dialog page.
+	 */
+	public void applyToStatusLine(DialogPage page, IStatus status) {
+		String message = status.getMessage();
+		switch (status.getSeverity()) {
+			case IStatus.OK :
+				page.setMessage(message, IMessageProvider.NONE);
+				page.setErrorMessage(null);
+				break;
+			case IStatus.WARNING :
+				page.setMessage(message, IMessageProvider.WARNING);
+				page.setErrorMessage(null);
+				break;
+			case IStatus.INFO :
+				page.setMessage(message, IMessageProvider.INFORMATION);
+				page.setErrorMessage(null);
+				break;
+			default :
+				if (message.length() == 0) {
+					message = null;
+				}
+				page.setMessage(null);
+				page.setErrorMessage(message);
+				break;
+		}
+	}
+
+	private Control createAppearancePage(Composite parent) {
+		Composite appearanceComposite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		appearanceComposite.setLayout(layout);
+
+		String label = SSEUIMessages.StructuredTextEditorPreferencePage_20; //$NON-NLS-1$
+		addCheckBox(appearanceComposite, label, EditorPreferenceNames.MATCHING_BRACKETS, 0);
+
+		label = SSEUIMessages.StructuredTextEditorPreferencePage_30; //$NON-NLS-1$
+		addCheckBox(appearanceComposite, label, CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS, 0);
+
+		PreferenceLinkArea contentTypeArea = new PreferenceLinkArea(appearanceComposite, SWT.NONE, "ValidationPreferencePage", SSEUIMessages.StructuredTextEditorPreferencePage_40, (IWorkbenchPreferenceContainer) getContainer(), null); //$NON-NLS-1$
+
+		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+		data.horizontalIndent = 20;
+		contentTypeArea.getControl().setLayoutData(data);
+
+		label = SSEUIMessages.StructuredTextEditorPreferencePage_39;
+		addCheckBox(appearanceComposite, label, EditorPreferenceNames.SHOW_UNKNOWN_CONTENT_TYPE_MSG, 0);
+
+		label = SSEUIMessages.StructuredTextEditorPreferencePage_3;
+		addCheckBox(appearanceComposite, label, AbstractStructuredFoldingStrategy.FOLDING_ENABLED, 0);
+		
+		label = SSEUIMessages.StructuredTextEditorPreferencePage_1;
+		addCheckBox(appearanceComposite, label, EditorPreferenceNames.SEMANTIC_HIGHLIGHTING, 0);
+
+		Label l = new Label(appearanceComposite, SWT.LEFT);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gd.horizontalSpan = 2;
+		gd.heightHint = convertHeightInCharsToPixels(1) / 2;
+		l.setLayoutData(gd);
+
+		l = new Label(appearanceComposite, SWT.LEFT);
+		l.setText(SSEUIMessages.StructuredTextEditorPreferencePage_23); //$NON-NLS-1$
+		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gd.horizontalSpan = 2;
+		l.setLayoutData(gd);
+
+		Composite editorComposite = new Composite(appearanceComposite, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		editorComposite.setLayout(layout);
+		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
+		gd.horizontalSpan = 2;
+		editorComposite.setLayoutData(gd);
+
+		fAppearanceColorList = new List(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
+		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
+		gd.heightHint = convertHeightInCharsToPixels(7);
+		fAppearanceColorList.setLayoutData(gd);
+
+		Composite stylesComposite = new Composite(editorComposite, SWT.NONE);
+		layout = new GridLayout();
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		layout.numColumns = 2;
+		stylesComposite.setLayout(layout);
+		stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		l = new Label(stylesComposite, SWT.LEFT);
+		// needs to be made final so label can be set in
+		// foregroundcolorbutton's acc listener
+		final String buttonLabel = SSEUIMessages.StructuredTextEditorPreferencePage_24; //$NON-NLS-1$ 
+		l.setText(buttonLabel);
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.BEGINNING;
+		l.setLayoutData(gd);
+
+		fAppearanceColorEditor = new ColorEditor(stylesComposite);
+		Button foregroundColorButton = fAppearanceColorEditor.getButton();
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalAlignment = GridData.BEGINNING;
+		foregroundColorButton.setLayoutData(gd);
+
+		fAppearanceColorList.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// do nothing
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				handleAppearanceColorListSelection();
+			}
+		});
+		foregroundColorButton.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// do nothing
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				int i = fAppearanceColorList.getSelectionIndex();
+				String key = fAppearanceColorListModel[i][1];
+
+				PreferenceConverter.setValue(fOverlayStore, key, fAppearanceColorEditor.getColorValue());
+			}
+		});
+
+		// bug2541 - associate color label to button's label field
+		foregroundColorButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+			public void getName(AccessibleEvent e) {
+				if (e.childID == ACC.CHILDID_SELF)
+					e.result = buttonLabel;
+			}
+		});
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(appearanceComposite, IHelpContextIds.PREFSTE_APPEARANCE_HELPID);
+		return appearanceComposite;
+	}
+
+	/*
+	 * @see PreferencePage#createContents(Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		// need to create tabs before loading/starting overlaystore in case
+		// tabs also add values
+		IPreferenceTab hoversTab = new TextHoverPreferenceTab(this, fOverlayStore);
+
+		fOverlayStore.load();
+		fOverlayStore.start();
+
+		TabFolder folder = new TabFolder(parent, SWT.NONE);
+		folder.setLayout(new TabFolderLayout());
+		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		TabItem item = new TabItem(folder, SWT.NONE);
+		item.setText(SSEUIMessages.StructuredTextEditorPreferencePage_0); //$NON-NLS-1$
+		item.setControl(createAppearancePage(folder));
+
+		item = new TabItem(folder, SWT.NONE);
+		item.setText(hoversTab.getTitle());
+		item.setControl(hoversTab.createContents(folder));
+
+		fTabs = new IPreferenceTab[]{hoversTab};
+
+		initialize();
+
+		Dialog.applyDialogFont(folder);
+		return folder;
+	}
+
+	/*
+	 * @see PreferencePage#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+		// WorkbenchHelp.setHelp(getControl(),
+		// IJavaHelpContextIds.JAVA_EDITOR_PREFERENCE_PAGE);
+	}
+
+	private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
+		ArrayList overlayKeys = new ArrayList();
+
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, EditorPreferenceNames.MATCHING_BRACKETS_COLOR));
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, EditorPreferenceNames.MATCHING_BRACKETS));
+
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS));
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, EditorPreferenceNames.SHOW_UNKNOWN_CONTENT_TYPE_MSG));
+
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractStructuredFoldingStrategy.FOLDING_ENABLED));
+		
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, EditorPreferenceNames.SEMANTIC_HIGHLIGHTING));
+
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND));
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND));
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND));
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND));
+
+		OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
+		overlayKeys.toArray(keys);
+		return keys;
+	}
+
+	/*
+	 * @see DialogPage#dispose()
+	 */
+	public void dispose() {
+		if (fOverlayStore != null) {
+			fOverlayStore.stop();
+			fOverlayStore = null;
+		}
+
+		super.dispose();
+	}
+
+	private void handleAppearanceColorListSelection() {
+		int i = fAppearanceColorList.getSelectionIndex();
+		String key = fAppearanceColorListModel[i][1];
+		RGB rgb = PreferenceConverter.getColor(fOverlayStore, key);
+		fAppearanceColorEditor.setColorValue(rgb);
+	}
+
+	/*
+	 * @see IWorkbenchPreferencePage#init()
+	 */
+	public void init(IWorkbench workbench) {
+		// nothing to do
+	}
+
+	private void initialize() {
+		initializeFields();
+
+		for (int i = 0; i < fAppearanceColorListModel.length; i++)
+			fAppearanceColorList.add(fAppearanceColorListModel[i][0]);
+		fAppearanceColorList.getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				if (fAppearanceColorList != null && !fAppearanceColorList.isDisposed()) {
+					fAppearanceColorList.select(0);
+					handleAppearanceColorListSelection();
+				}
+			}
+		});
+	}
+
+	private void initializeFields() {
+		Iterator e = fColorButtons.keySet().iterator();
+		while (e.hasNext()) {
+			ColorEditor c = (ColorEditor) e.next();
+			String key = (String) fColorButtons.get(c);
+			RGB rgb = PreferenceConverter.getColor(fOverlayStore, key);
+			c.setColorValue(rgb);
+		}
+
+		e = fCheckBoxes.keySet().iterator();
+		while (e.hasNext()) {
+			Button b = (Button) e.next();
+			String key = (String) fCheckBoxes.get(b);
+			b.setSelection(fOverlayStore.getBoolean(key));
+		}
+
+		e = fTextFields.keySet().iterator();
+		while (e.hasNext()) {
+			Text t = (Text) e.next();
+			String key = (String) fTextFields.get(t);
+			t.setText(fOverlayStore.getString(key));
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#performApply()
+	 */
+	protected void performApply() {
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performApply();
+		}
+		super.performApply();
+	}
+
+	/*
+	 * @see PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		fOverlayStore.loadDefaults();
+
+		initializeFields();
+
+		handleAppearanceColorListSelection();
+
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performDefaults();
+		}
+
+		super.performDefaults();
+
+		// there is currently no need for a viewer
+		// fPreviewViewer.invalidateTextPresentation();
+	}
+
+	/*
+	 * @see PreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		for (int i = 0; i < fTabs.length; i++) {
+			fTabs[i].performOk();
+		}
+
+		fOverlayStore.propagate();
+		SSEUIPlugin.getDefault().savePluginPreferences();
+
+		// tab width is also a model-side preference so need to set it
+		// TODO need to handle tab width for formatter somehow
+		// int tabWidth =
+		// getPreferenceStore().getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
+		// ModelPlugin.getDefault().getPluginPreferences().setValue(CommonModelPreferenceNames.TAB_WIDTH,
+		// tabWidth);
+		// ModelPlugin.getDefault().savePluginPreferences();
+
+		return true;
+	}
+
+	void updateStatus(IStatus status) {
+		if (!status.matches(IStatus.ERROR)) {
+			for (int i = 0; i < fNumberFields.size(); i++) {
+				Text text = (Text) fNumberFields.get(i);
+				IStatus s = validatePositiveNumber(text.getText());
+				status = s.getSeverity() > status.getSeverity() ? s : status;
+			}
+		}
+
+		setValid(!status.matches(IStatus.ERROR));
+		applyToStatusLine(this, status);
+	}
+
+	private IStatus validatePositiveNumber(String number) {
+		StatusInfo status = new StatusInfo();
+		if (number.length() == 0) {
+			status.setError(SSEUIMessages.StructuredTextEditorPreferencePage_37);
+		}
+		else {
+			try {
+				int value = Integer.parseInt(number);
+				if (value < 0)
+					status.setError(number + SSEUIMessages.StructuredTextEditorPreferencePage_38);
+			}
+			catch (NumberFormatException e) {
+				status.setError(number + SSEUIMessages.StructuredTextEditorPreferencePage_38);
+			}
+		}
+		return status;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StyledTextColorPicker.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StyledTextColorPicker.java
new file mode 100644
index 0000000..e69bf0d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/StyledTextColorPicker.java
@@ -0,0 +1,905 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import java.io.CharArrayReader;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.eclipse.jface.preference.ColorSelector;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlEvent;
+import org.eclipse.swt.accessibility.AccessibleControlListener;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+import org.w3c.dom.Node;
+
+import com.ibm.icu.text.Collator;
+
+/**
+ * This class is configurable by setting 3 properties: 1) an array of Strings
+ * as the styleNames; one unique entry for every style type meant to be
+ * configurable by the user 2) a Dictionary of descriptions, mapping the
+ * styleNames to unique descriptions - meant for use within the selection
+ * ComboBox TODO (pa) this should probably be working off document partitions
+ * now (2.1+) 3) a Dictionary mapping parsed ITextRegion contexts (strings) to
+ * the locally defined styleNames
+ *  
+ */
+public class StyledTextColorPicker extends Composite {
+	protected class DescriptionSorter extends org.eclipse.wst.sse.ui.internal.util.Sorter {
+		Collator collator = Collator.getInstance();
+
+		public boolean compare(Object elementOne, Object elementTwo) {
+			/**
+			 * Returns true if elementTwo is 'greater than' elementOne This is
+			 * the 'ordering' method of the sort operation. Each subclass
+			 * overides this method with the particular implementation of the
+			 * 'greater than' concept for the objects being sorted.
+			 */
+			return (collator.compare(elementOne.toString(), elementTwo.toString())) < 0;
+		}
+	}
+
+	public static final String BACKGROUND = "background"; //$NON-NLS-1$
+	public static final String BOLD = "bold"; //$NON-NLS-1$
+	public static final String COLOR = "color"; //$NON-NLS-1$
+
+	// names for preference elements ... non-NLS
+	public static final String FOREGROUND = "foreground"; //$NON-NLS-1$
+	public static final String ITALIC = "italic"; //$NON-NLS-1$
+	public static final String NAME = "name"; //$NON-NLS-1$
+
+	protected static final boolean showItalic = false;
+	protected AccessibleControlListener backgroundAccListener = new AccessibleControlAdapter() {
+		/**
+		 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getValue(AccessibleControlEvent)
+		 */
+		public void getValue(AccessibleControlEvent e) {
+			if (e.childID == ACC.CHILDID_SELF) {
+				e.result = fBackground.getColorValue().toString();
+			}
+		}
+	};
+	protected SelectionListener buttonListener = new SelectionListener() {
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+			widgetSelected(e);
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			String namedStyle = getStyleName(fStyleCombo.getItem(fStyleCombo.getSelectionIndex()));
+			if (namedStyle == null)
+				return;
+			if (e.widget == fBold) {
+				// get current (newly old) style
+				String prefString = getPreferenceStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[2];
+					String newValue = String.valueOf(fBold.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[2] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getPreferenceStore().setValue(namedStyle, newPrefString);
+						refresh();
+					}
+				}
+			} else if (showItalic && e.widget == fItalic) {
+				// get current (newly old) style
+				String prefString = getPreferenceStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[3];
+					String newValue = String.valueOf(fItalic.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[3] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getPreferenceStore().setValue(namedStyle, newPrefString);
+						refresh();
+					}
+				}
+			} else if (e.widget == fClearStyle) {
+				getPreferenceStore().setToDefault(namedStyle);
+				refresh();
+			}
+		}
+	};
+
+	protected SelectionListener comboListener = new SelectionListener() {
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+			widgetSelected(e);
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			int selectedIndex = fStyleCombo.getSelectionIndex();
+			String description = selectedIndex >= 0 ? fStyleCombo.getItem(selectedIndex) : null;
+			activate(getStyleName(description));
+		}
+	};
+	protected ColorSelector fBackground;
+	protected Label fBackgroundLabel;
+	protected Button fBold;
+	protected Button fClearStyle;
+	// Dictionary mapping the ITextRegion types above to color names, which
+	// are, in turn, attributes
+	protected Dictionary fContextStyleMap = null;
+	protected Color fDefaultBackground = getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+
+	protected Color fDefaultForeground = getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+	// Dictionary mapping the ITextRegion types above to display strings, for
+	// use in the combo box
+	protected Dictionary fDescriptions = null;
+	protected ColorSelector fForeground;
+	protected Label fForegroundLabel;
+//	private String fGeneratorKey;
+	protected String fInput = ""; //$NON-NLS-1$
+	protected Button fItalic;
+
+	private IStructuredDocumentRegion fNodes = null;
+	// defect 200764 - ACC:display values for color buttons
+	protected AccessibleControlListener foregroundAccListener = new AccessibleControlAdapter() {
+		/**
+		 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getValue(AccessibleControlEvent)
+		 */
+		public void getValue(AccessibleControlEvent e) {
+			if (e.childID == ACC.CHILDID_SELF) {
+				e.result = fForeground.getColorValue().toString();
+			}
+		}
+	};
+	// A RegionParser, which will turn the input into
+	// IStructuredDocumentRegion(s) and Regions
+	protected RegionParser fParser = null;
+
+	private IPreferenceStore fPreferenceStore;
+	protected Combo fStyleCombo = null;
+	// The list of supported ITextRegion types [Strings]
+	protected List fStyleList = null;
+
+	// controls in picker
+	protected StyledText fText = null;
+
+	/**
+	 * XMLTextColorPicker constructor comment.
+	 * 
+	 * @param parent
+	 *            org.eclipse.swt.widgets.Composite
+	 * @param style
+	 *            int
+	 */
+	public StyledTextColorPicker(Composite parent, int style) {
+		super(parent, style);
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		setLayout(layout);
+		createControls(this);
+	}
+
+	// activate controls based on the given local color type
+	protected void activate(String namedStyle) {
+		if (namedStyle == null) {
+			fForeground.setEnabled(false);
+			fBackground.setEnabled(false);
+			fClearStyle.setEnabled(false);
+			fBold.setEnabled(false);
+			if (showItalic)
+				fItalic.setEnabled(false);
+			fForegroundLabel.setEnabled(false);
+			fBackgroundLabel.setEnabled(false);
+		} 
+		else {		
+			fForeground.setEnabled(true);
+			fBackground.setEnabled(true);
+			fClearStyle.setEnabled(true);
+			fBold.setEnabled(true);
+			if (showItalic)
+				fItalic.setEnabled(true);
+			fForegroundLabel.setEnabled(true);
+			fBackgroundLabel.setEnabled(true);
+			
+		}
+		TextAttribute attribute = getAttribute(namedStyle);
+		Color color = attribute.getForeground();
+		if (color == null) {
+			color = fDefaultForeground;
+		}
+		fForeground.setColorValue(color.getRGB());
+
+		color = attribute.getBackground();
+		if (color == null) {
+			color = fDefaultBackground;
+		}
+		fBackground.setColorValue(color.getRGB());
+
+		fBold.setSelection((attribute.getStyle() & SWT.BOLD) != 0);
+		if (showItalic)
+			fItalic.setSelection((attribute.getStyle() & SWT.ITALIC) != 0);
+	}
+
+	protected void applyStyles() {
+		if (fText == null || fText.isDisposed() || fInput == null || fInput.length() == 0)
+			return;
+		//		List regions = fParser.getRegions();
+		IStructuredDocumentRegion node = fNodes;
+		while (node != null) {
+			ITextRegionList regions = node.getRegions();
+			for (int i = 0; i < regions.size(); i++) {
+				ITextRegion currentRegion = regions.get(i);
+				// lookup the local coloring type and apply it
+				String namedStyle = (String) getContextStyleMap().get(currentRegion.getType());
+				if (namedStyle == null)
+					continue;
+				TextAttribute attribute = getAttribute(namedStyle);
+				if (attribute == null)
+					continue;
+				StyleRange style = new StyleRange(node.getStartOffset(currentRegion), currentRegion.getLength(), attribute.getForeground(), attribute.getBackground(), attribute.getStyle());
+				fText.setStyleRange(style);
+			}
+			node = node.getNext();
+		}
+	}
+
+	protected void close() {
+	}
+
+	/**
+	 * Creates an new checkbox instance and sets the default layout data.
+	 * 
+	 * @param group
+	 *            the composite in which to create the checkbox
+	 * @param label
+	 *            the string to set into the checkbox
+	 * @return the new checkbox
+	 */
+	private Button createCheckBox(Composite group, String label) {
+		Button button = new Button(group, SWT.CHECK | SWT.CENTER);
+		if (label != null)
+			button.setText(label);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_END;
+		//	data.verticalAlignment = GridData.VERTICAL_ALIGN_FILL;
+		button.setLayoutData(data);
+		return button;
+	}
+
+	private Combo createCombo(Composite parent, String[] labels, int selectedItem) {
+		Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+		combo.setItems(labels);
+		if (selectedItem >= 0)
+			combo.select(selectedItem);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;
+		combo.setLayoutData(data);
+		return combo;
+	}
+
+	/**
+	 * Creates composite control and sets the default layout data.
+	 */
+	private Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		//GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		layout.horizontalSpacing = 5;
+		layout.makeColumnsEqualWidth = false;
+		composite.setLayout(layout);
+		//GridData
+		GridData data = new GridData(GridData.FILL_VERTICAL);
+		data.grabExcessVerticalSpace = false;
+		data.verticalAlignment = GridData.VERTICAL_ALIGN_CENTER;
+		composite.setLayoutData(data);
+		return composite;
+	}
+
+	protected void createControls(Composite parent) {
+		Composite styleRow = createComposite(parent, 3);
+		// row 1 - content type label, combo box, restore defaults
+		createLabel(styleRow, SSEUIMessages.Content_type__UI_); //$NON-NLS-1$ = "Content type:"
+		// Contexts combo box
+		fStyleCombo = createCombo(styleRow, new String[0], -1);
+		fClearStyle = createPushButton(styleRow, SSEUIMessages.Restore_Default_UI_); //$NON-NLS-1$ = "Restore Default"
+		Composite styleRow2;
+		if (showItalic)
+			styleRow2 = createComposite(parent, 7);
+		else
+			styleRow2 = createComposite(parent, 6);
+		// row 2 - foreground label, button, background label, button, bold,
+		// italics?
+		fForegroundLabel = createLabel(styleRow2, SSEUIMessages.Foreground_UI_); //$NON-NLS-1$ = "Foreground"
+		fForeground = new ColorSelector(styleRow2);
+		fForeground.getButton().setLayoutData(new GridData());
+		setAccessible(fForeground.getButton(), fForegroundLabel.getText());
+		fForeground.getButton().getAccessible().addAccessibleControlListener(foregroundAccListener); // defect
+		// 200764
+		// -
+		// ACC:display
+		// values
+		// for
+		// color
+		// buttons
+		((GridData) fForeground.getButton().getLayoutData()).minimumWidth = 20;
+		fBackgroundLabel = createLabel(styleRow2, SSEUIMessages.Background_UI_); //$NON-NLS-1$ = "Background"
+		fBackground = new ColorSelector(styleRow2);
+		fBackground.getButton().setLayoutData(new GridData());
+		setAccessible(fBackground.getButton(), fBackgroundLabel.getText());
+		fBackground.getButton().getAccessible().addAccessibleControlListener(backgroundAccListener); // defect
+		// 200764
+		// -
+		// ACC:display
+		// values
+		// for
+		// color
+		// buttons
+		((GridData) fBackground.getButton().getLayoutData()).minimumWidth = 20;
+		createLabel(styleRow2, ""); //$NON-NLS-1$
+		fBold = createCheckBox(styleRow2, SSEUIMessages.Bold_UI_);
+		if (showItalic)
+			fItalic = createCheckBox(styleRow2, SSEUIMessages.Italics_UI);
+		//		// Defaults checkbox
+		fForeground.setEnabled(false);
+		fBackground.setEnabled(false);
+		fClearStyle.setEnabled(false);
+		fBold.setEnabled(false);
+		if (showItalic)
+			fItalic.setEnabled(false);
+		fForegroundLabel.setEnabled(false);
+		fBackgroundLabel.setEnabled(false);
+		Composite sample = createComposite(parent, 1);
+		createLabel(sample, SSEUIMessages.Sample_text__UI_); //$NON-NLS-1$ = "&Sample text:"
+		// BUG141089 - make sure text is left-aligned
+		fText = new StyledText(sample, SWT.LEFT_TO_RIGHT | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.READ_ONLY);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		fText.setLayoutData(data);
+		fText.setEditable(false);
+		fText.setBackground(fDefaultBackground);
+		fText.setFont(JFaceResources.getTextFont());
+		fText.addKeyListener(getTextKeyListener());
+		fText.addSelectionListener(getTextSelectionListener());
+		fText.addMouseListener(getTextMouseListener());
+		fText.addTraverseListener(getTraverseListener()); // defect 220377 -
+		// Provide tab
+		// traversal for
+		// fText widget
+		setAccessible(fText, SSEUIMessages.Sample_text__UI_); //$NON-NLS-1$ = "&Sample text:"
+		fForeground.addListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) {
+					// get current (newly old) style
+					String namedStyle = getStyleName(fStyleCombo.getItem(fStyleCombo.getSelectionIndex()));
+					String prefString = getPreferenceStore().getString(namedStyle);
+					String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+					if (stylePrefs != null) {
+						String oldValue = stylePrefs[0];
+						String newValue = "null";   //$NON-NLS-1$
+						Object newValueObject = event.getNewValue();
+						if (newValueObject instanceof RGB) {
+							newValue = ColorHelper.toRGBString((RGB)newValueObject);
+						}
+	
+						if (!newValue.equals(oldValue)) {
+							stylePrefs[0] = newValue;
+							String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+							getPreferenceStore().setValue(namedStyle, newPrefString);
+							refresh();
+						}
+					}
+				}
+			}
+		});
+		fBackground.addListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) {
+					// get current (newly old) style
+					String namedStyle = getStyleName(fStyleCombo.getItem(fStyleCombo.getSelectionIndex()));
+					String prefString = getPreferenceStore().getString(namedStyle);
+					String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+					if (stylePrefs != null) {
+						String oldValue = stylePrefs[1];
+
+						String newValue = "null";   //$NON-NLS-1$
+						Object newValueObject = event.getNewValue();
+						if (newValueObject instanceof RGB) {
+							newValue = ColorHelper.toRGBString((RGB)newValueObject);
+						}
+						
+						if (!newValue.equals(oldValue)) {
+							stylePrefs[1] = newValue;
+							String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+							getPreferenceStore().setValue(namedStyle, newPrefString);
+							refresh();
+						}
+					}
+				}
+			}
+		});
+
+		fClearStyle.addSelectionListener(buttonListener);
+		fBold.addSelectionListener(buttonListener);
+		if (showItalic)
+			fItalic.addSelectionListener(buttonListener);
+		fStyleCombo.addSelectionListener(comboListener);
+	}
+
+	/**
+	 * Utility method that creates a label instance and sets the default
+	 * layout data.
+	 */
+	private Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.LEFT);
+		label.setText(text);
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		label.setLayoutData(data);
+		return label;
+	}
+
+	private Button createPushButton(Composite parent, String label) {
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText(label);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		//	data.horizontalAlignment = GridData.FILL;
+		button.setLayoutData(data);
+		return button;
+	}
+
+	protected TextAttribute getAttribute(String namedStyle) {
+		TextAttribute ta = new TextAttribute(getDefaultForeground(), getDefaultBackground(), SWT.NORMAL);
+
+		if (namedStyle != null && getPreferenceStore() != null) {
+			String prefString = getPreferenceStore().getString(namedStyle);
+			String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+			if (stylePrefs != null) {
+				RGB foreground = ColorHelper.toRGB(stylePrefs[0]);
+				RGB background = ColorHelper.toRGB(stylePrefs[1]);
+
+				int fontModifier = SWT.NORMAL;
+				boolean bold = Boolean.valueOf(stylePrefs[2]).booleanValue();
+				if (bold)
+					fontModifier = fontModifier | SWT.BOLD;
+
+				if (showItalic) {
+					boolean italic = Boolean.valueOf(stylePrefs[3]).booleanValue();
+					if (italic)
+						fontModifier = fontModifier | SWT.ITALIC;
+				}
+
+				ta = new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, fontModifier);
+			}
+		}
+		return ta;
+	}
+
+	// defect 200764 - ACC:display values for color buttons
+	/**
+	 * @return String - color Button b's current RBG value
+	 */
+//	private String getColorButtonValue(Button b) {
+//		if ((b == null) || (b.getImage() == null) || (b.getImage().getImageData() == null) || (b.getImage().getImageData().getRGBs() == null) || (b.getImage().getImageData().getRGBs()[0] == null))
+//			return null;
+//		String val = b.getImage().getImageData().getRGBs()[0].toString();
+//		return val;
+//	}
+
+	/**
+	 * @deprecated use getPreferenceStore instead left for legacy clients,
+	 *             delete by WTP M4
+	 */
+	public Node getColorsNode() {
+		//return fColorsNode;
+		return null;
+	}
+
+	/**
+	 * @return java.util.Dictionary
+	 */
+	public Dictionary getContextStyleMap() {
+		return fContextStyleMap;
+	}
+
+	/**
+	 * @return org.eclipse.swt.graphics.Color
+	 */
+	public Color getDefaultBackground() {
+		return fDefaultBackground;
+	}
+
+	/**
+	 * @return org.eclipse.swt.graphics.Color
+	 */
+	public Color getDefaultForeground() {
+		return fDefaultForeground;
+	}
+
+	/**
+	 * @return java.util.Dictionary
+	 */
+	public Dictionary getDescriptions() {
+		return fDescriptions;
+	}
+
+	public Font getFont() {
+		return fText.getFont();
+	}
+
+	protected String getNamedStyleAtOffset(int offset) {
+		// ensure the offset is clean
+		if (offset >= fInput.length())
+			return getNamedStyleAtOffset(fInput.length() - 1);
+		else if (offset < 0)
+			return getNamedStyleAtOffset(0);
+		// find the ITextRegion at this offset
+		if (fNodes == null)
+			return null;
+		IStructuredDocumentRegion aNode = fNodes;
+		while (aNode != null && !aNode.containsOffset(offset))
+			aNode = aNode.getNext();
+		if (aNode != null) {
+			// find the ITextRegion's Context at this offset
+			ITextRegion interest = aNode.getRegionAtCharacterOffset(offset);
+			if (interest == null)
+				return null;
+			if (offset > aNode.getTextEndOffset(interest))
+				return null;
+			String regionContext = interest.getType();
+			if (regionContext == null)
+				return null;
+			// find the named style (internal/selectable name) for that
+			// context
+			String namedStyle = (String) getContextStyleMap().get(regionContext);
+			if (namedStyle != null) {
+				return namedStyle;
+			}
+		}
+		return null;
+	}
+
+
+	public RegionParser getParser() {
+		return fParser;
+	}
+
+	private IPreferenceStore getPreferenceStore() {
+		return fPreferenceStore;
+	}
+
+	/**
+	 * @return String[]
+	 */
+	public List getStyleList() {
+		return fStyleList;
+	}
+
+	private String getStyleName(String description) {
+		if (description == null)
+			return null;
+		String styleName = null;
+		java.util.Enumeration keys = getDescriptions().keys();
+		while (keys.hasMoreElements()) {
+			String test = keys.nextElement().toString();
+			if (getDescriptions().get(test).equals(description)) {
+				styleName = test;
+				break;
+			}
+		}
+		return styleName;
+	}
+
+	public String getText() {
+		return fInput;
+	}
+
+	private KeyListener getTextKeyListener() {
+		return new KeyListener() {
+			public void keyPressed(KeyEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+
+			public void keyReleased(KeyEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+		};
+	}
+
+	private MouseListener getTextMouseListener() {
+		return new MouseListener() {
+			public void mouseDoubleClick(MouseEvent e) {
+			}
+
+			public void mouseDown(MouseEvent e) {
+			}
+
+			public void mouseUp(MouseEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+		};
+	}
+
+	private SelectionListener getTextSelectionListener() {
+		return new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				selectColorAtOffset(e.x);
+				if (e.widget instanceof StyledText) {
+					((StyledText) e.widget).setSelection(e.x);
+				}
+			}
+
+// Commented out when moving to RC2 to remove "unused" error/warning			
+//			public void widgetDoubleSelected(SelectionEvent e) {
+//				selectColorAtOffset(e.x);
+//				if (e.widget instanceof StyledText) {
+//					((StyledText) e.widget).setSelection(e.x);
+//				}
+//			}
+
+			public void widgetSelected(SelectionEvent e) {
+				selectColorAtOffset(e.x);
+				if (e.widget instanceof StyledText) {
+					((StyledText) e.widget).setSelection(e.x);
+				}
+			}
+		};
+	}
+
+	// defect 220377 - Provide tab traversal for fText widget
+	private TraverseListener getTraverseListener() {
+		return new TraverseListener() {
+			/**
+			 * @see org.eclipse.swt.events.TraverseListener#keyTraversed(TraverseEvent)
+			 */
+			public void keyTraversed(TraverseEvent e) {
+				if (e.widget instanceof StyledText) {
+					if ((e.detail == SWT.TRAVERSE_TAB_NEXT) || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS))
+						e.doit = true;
+				}
+			}
+		};
+	}
+
+	// refresh the GUI after a color change
+	public void refresh() {
+		fText.setRedraw(false);
+		int selectedIndex = fStyleCombo.getSelectionIndex();
+		String description = selectedIndex >= 0 ? fStyleCombo.getItem(selectedIndex) : null;
+		activate(getStyleName(description));
+		// update Font
+		fText.setFont(JFaceResources.getTextFont());
+		// reapplyStyles
+		applyStyles();
+		fText.setRedraw(true);
+	}
+
+	public void releasePickerResources() {
+//		if (fForeground != null && !fForeground.isDisposed() && fForeground.getImage() != null)
+//			fForeground.getImage().dispose();
+//		if (fBackground != null && !fBackground.isDisposed() && fBackground.getImage() != null)
+//			fBackground.getImage().dispose();
+	}
+
+	private void selectColorAtOffset(int offset) {
+		String namedStyle = getNamedStyleAtOffset(offset);
+		if (namedStyle == null) {
+			fStyleCombo.deselectAll();
+			activate(null);
+			return;
+		}
+		String description = (String) getDescriptions().get(namedStyle);
+		if (description == null)
+			return;
+		int itemCount = fStyleCombo.getItemCount();
+		for (int i = 0; i < itemCount; i++) {
+			if (fStyleCombo.getItem(i).equals(description)) {
+				fStyleCombo.select(i);
+				break;
+			}
+		}
+		activate(namedStyle);
+	}
+
+	/**
+	 * Specifically set the reporting name of a control for accessibility
+	 */
+	private void setAccessible(Control control, String name) {
+		if (control == null)
+			return;
+		final String n = name;
+		control.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+			public void getName(AccessibleEvent e) {
+				if (e.childID == ACC.CHILDID_SELF)
+					e.result = n;
+			}
+		});
+	}
+
+	/**
+	 * @deprecated use setPreferenceStore instead left for legacy clients,
+	 *             delete by WTP M4
+	 */
+	public void setColorsNode(Node newColorsNode) {
+		//fColorsNode = newColorsNode;
+	}
+
+	/**
+	 * @param newContextStyleMap
+	 *            java.util.Dictionary
+	 */
+	public void setContextStyleMap(Dictionary newContextStyleMap) {
+		fContextStyleMap = newContextStyleMap;
+	}
+
+	/**
+	 * @param newDefaultBackground
+	 *            org.eclipse.swt.graphics.Color
+	 */
+	public void setDefaultBackground(Color newDefaultBackground) {
+		fDefaultBackground = newDefaultBackground;
+	}
+
+	/**
+	 * @deprecated use setPreferenceStore instead left for legacy clients,
+	 *             delete by WTP M4
+	 */
+	public void setDefaultColorsNode(Node newDefaultColorsNode) {
+		//fDefaultColorsNode = newDefaultColorsNode;
+	}
+
+	/**
+	 * @param newDefaultForeground
+	 *            org.eclipse.swt.graphics.Color
+	 */
+	public void setDefaultForeground(Color newDefaultForeground) {
+		fDefaultForeground = newDefaultForeground;
+	}
+
+	/**
+	 * @param newDescriptions
+	 *            java.util.Dictionary
+	 */
+	public void setDescriptions(Dictionary newDescriptions) {
+		fDescriptions = newDescriptions;
+		updateStyleList();
+	}
+
+	public void setFont(Font font) {
+		fText.setFont(font);
+		fText.redraw();
+	}
+
+	/**
+	 * @deprecated generator key should no longer be needed
+	 */
+	public void setGeneratorKey(String key) {
+//		fGeneratorKey = key;
+	}
+
+	/**
+	 * @param newParser
+	 */
+	public void setParser(RegionParser newParser) {
+		fParser = newParser;
+	}
+
+	public void setPreferenceStore(IPreferenceStore store) {
+		fPreferenceStore = store;
+	}
+
+	/**
+	 * @param newStyleList
+	 *            String[]
+	 */
+	public void setStyleList(List newStyleList) {
+		fStyleList = newStyleList;
+		updateStyleList();
+	}
+
+	public void setText(String s) {
+		fInput = s;
+		getParser().reset(new CharArrayReader(fInput.toCharArray()));
+		fNodes = getParser().getDocumentRegions();
+		if (Debug.displayInfo)
+			System.out.println("Length of input: " //$NON-NLS-1$
+						//$NON-NLS-1$
+						+ s.length() + ", " //$NON-NLS-1$
+						+ getParser().getRegions().size() + " regions."); //$NON-NLS-1$
+		if (fText != null)
+			fText.setText(s);
+		applyStyles();
+	}
+
+
+
+	/**
+	 * @return org.eclipse.swt.graphics.RGB
+	 * @param anRGBString
+	 *            java.lang.String
+	 * @param defaultRGB
+	 *            org.eclipse.swt.graphics.RGB
+	 */
+	// TODO: never used
+	 RGB toRGB(String anRGBString, RGB defaultRGB) {
+		RGB result = ColorHelper.toRGB(anRGBString);
+		if (result == null)
+			return defaultRGB;
+		return result;
+	}
+
+	private void updateStyleList() {
+		if (fStyleList == null || fDescriptions == null)
+			return;
+		String[] descriptions = new String[fStyleList.size()];
+		for (int i = 0; i < fStyleList.size(); i++) {
+			if (fStyleList.get(i) != null)
+				descriptions[i] = (String) getDescriptions().get(fStyleList.get(i));
+			else
+				descriptions[i] = (String) fStyleList.get(i);
+		}
+		Object[] sortedObjects = new DescriptionSorter().sort(descriptions);
+		String[] sortedDescriptions = new String[descriptions.length];
+		for (int i = 0; i < descriptions.length; i++) {
+			sortedDescriptions[i] = sortedObjects[i].toString();
+		}
+		fStyleCombo.setItems(sortedDescriptions);
+		fStyleCombo.select(0); //defect 219855 - initially select first item
+		// in comboBox
+		//		fStyleCombo.deselectAll();
+	}
+
+
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/TextHoverPreferenceTab.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/TextHoverPreferenceTab.java
new file mode 100644
index 0000000..100904a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/TextHoverPreferenceTab.java
@@ -0,0 +1,453 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.text.Assert;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+import org.eclipse.wst.sse.ui.internal.taginfo.TextHoverManager;
+import org.eclipse.wst.sse.ui.internal.taginfo.TextHoverManager.TextHoverDescriptor;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+
+/**
+ * Preference tab for Structured text editor hover help preferences
+ * 
+ * @author amywu
+ */
+public class TextHoverPreferenceTab extends AbstractPreferenceTab {
+
+	private class InternalTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+		public InternalTableLabelProvider() {
+			super();
+		}
+
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		public String getColumnText(Object element, int columnIndex) {
+			switch (columnIndex) {
+				case 0 : // text hover label
+					return ((TextHoverManager.TextHoverDescriptor) element).getLabel();
+
+				case 1 : // text hover state mask
+					return ((TextHoverManager.TextHoverDescriptor) element).getModifierString();
+
+				default :
+					break;
+			}
+
+			return null;
+		}
+	}
+
+	private static final String DELIMITER = SSEUIMessages.TextHoverPreferenceTab_delimiter; //$NON-NLS-1$
+	private Text fDescription;
+	private Table fHoverTable;
+	private TableViewer fHoverTableViewer;
+	private TableColumn fModifierColumn;
+	// for this preference page
+	private Text fModifierEditor;
+	private TableColumn fNameColumn;
+
+	private TextHoverDescriptor[] fTextHovers; // current list of text hovers
+
+	public TextHoverPreferenceTab(PreferencePage mainPreferencePage, OverlayPreferenceStore store) {
+		Assert.isNotNull(mainPreferencePage);
+		Assert.isNotNull(store);
+		setMainPreferencePage(mainPreferencePage);
+		setOverlayStore(store);
+		getOverlayStore().addKeys(createOverlayStoreKeys());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	public Control createContents(Composite tabFolder) {
+		Composite hoverComposite = new Composite(tabFolder, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		hoverComposite.setLayout(layout);
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+		hoverComposite.setLayoutData(gd);
+
+		// commented out until these preferences are actually handled in some
+		// way
+		//		String rollOverLabel=
+		// ResourceHandler.getString("TextHoverPreferenceTab.annotationRollover");
+		// //$NON-NLS-1$
+		//		addCheckBox(hoverComposite, rollOverLabel,
+		// CommonEditorPreferenceNames.EDITOR_ANNOTATION_ROLL_OVER, 0);
+		//
+		//		// Affordance checkbox
+		//		String showAffordanceLabel =
+		// ResourceHandler.getString("TextHoverPreferenceTab.showAffordance");
+		// //$NON-NLS-1$
+		//		addCheckBox(hoverComposite, showAffordanceLabel,
+		// CommonEditorPreferenceNames.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE, 0);
+
+		Label label = new Label(hoverComposite, SWT.NONE);
+		label.setText(SSEUIMessages.TextHoverPreferenceTab_hoverPreferences); //$NON-NLS-1$
+		gd = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		gd.horizontalAlignment = GridData.BEGINNING;
+		label.setLayoutData(gd);
+
+		fHoverTableViewer = CheckboxTableViewer.newCheckList(hoverComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
+		// Hover table
+		fHoverTable = fHoverTableViewer.getTable();
+		fHoverTable.setHeaderVisible(true);
+		fHoverTable.setLinesVisible(true);
+
+		gd = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=104507
+	    GC gc = new GC(fHoverTable);
+	    gc.setFont(fHoverTable.getFont());
+	    FontMetrics fontMetrics = gc.getFontMetrics();
+	    gc.dispose();
+		int heightHint = Dialog.convertHeightInCharsToPixels(fontMetrics, 7);
+		gd.heightHint = heightHint;
+		
+		fHoverTable.setLayoutData(gd);
+
+		TableLayout tableLayout = new TableLayout();
+		tableLayout.addColumnData(new ColumnWeightData(1, 140, true));
+		tableLayout.addColumnData(new ColumnWeightData(1, 140, true));
+		fHoverTable.setLayout(tableLayout);
+
+		fHoverTable.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				handleHoverListSelection();
+			}
+		});
+
+		fNameColumn = new TableColumn(fHoverTable, SWT.NONE);
+		fNameColumn.setText(SSEUIMessages.TextHoverPreferenceTab_nameColumnTitle); //$NON-NLS-1$
+		fNameColumn.setResizable(true);
+
+		fModifierColumn = new TableColumn(fHoverTable, SWT.NONE);
+		fModifierColumn.setText(SSEUIMessages.TextHoverPreferenceTab_modifierColumnTitle); //$NON-NLS-1$
+		fModifierColumn.setResizable(true);
+
+		fHoverTableViewer.setUseHashlookup(true);
+		fHoverTableViewer.setContentProvider(new ArrayContentProvider());
+		fHoverTableViewer.setLabelProvider(new InternalTableLabelProvider());
+		((CheckboxTableViewer) fHoverTableViewer).addCheckStateListener(new ICheckStateListener() {
+			/*
+			 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
+			 */
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				String id = ((TextHoverDescriptor) event.getElement()).getId();
+				if (id == null)
+					return;
+
+				TextHoverManager.TextHoverDescriptor[] descriptors = getTextHoverManager().getTextHovers();
+				TextHoverManager.TextHoverDescriptor hoverConfig = null;
+				int i = 0, length = fTextHovers.length;
+				while (i < length) {
+					if (id.equals(descriptors[i].getId())) {
+						hoverConfig = fTextHovers[i];
+						hoverConfig.setEnabled(event.getChecked());
+						fModifierEditor.setEnabled(event.getChecked());
+						fHoverTableViewer.setSelection(new StructuredSelection(descriptors[i]));
+					}
+					i++;
+				}
+
+				handleHoverListSelection();
+				updateStatus(hoverConfig);
+			}
+		});
+
+		// Text field for modifier string
+		label = new Label(hoverComposite, SWT.LEFT);
+		label.setText(SSEUIMessages.TextHoverPreferenceTab_keyModifier); //$NON-NLS-1$
+		fModifierEditor = new Text(hoverComposite, SWT.BORDER);
+		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		fModifierEditor.setLayoutData(gd);
+
+		fModifierEditor.addKeyListener(new KeyListener() {
+			private boolean isModifierCandidate;
+
+			public void keyPressed(KeyEvent e) {
+				isModifierCandidate = e.keyCode > 0 && e.character == 0 && e.stateMask == 0;
+			}
+
+			public void keyReleased(KeyEvent e) {
+				if (isModifierCandidate && e.stateMask > 0 && e.stateMask == e.stateMask && e.character == 0) {// &&
+					// e.time
+					// -time
+					// <
+					// 1000)
+					// {
+					String text = fModifierEditor.getText();
+					Point selection = fModifierEditor.getSelection();
+					int i = selection.x - 1;
+					while (i > -1 && Character.isWhitespace(text.charAt(i))) {
+						i--;
+					}
+					boolean needsPrefixDelimiter = i > -1 && !String.valueOf(text.charAt(i)).equals(DELIMITER);
+
+					i = selection.y;
+					while (i < text.length() && Character.isWhitespace(text.charAt(i))) {
+						i++;
+					}
+					boolean needsPostfixDelimiter = i < text.length() && !String.valueOf(text.charAt(i)).equals(DELIMITER);
+
+					String insertString;
+
+					if (needsPrefixDelimiter && needsPostfixDelimiter)
+						insertString = NLS.bind(SSEUIMessages.TextHoverPreferenceTab_insertDelimiterAndModifierAndDelimiter, new String[]{Action.findModifierString(e.stateMask)});
+					else if (needsPrefixDelimiter)
+						insertString = NLS.bind(SSEUIMessages.TextHoverPreferenceTab_insertDelimiterAndModifier, new String[]{Action.findModifierString(e.stateMask)});
+					else if (needsPostfixDelimiter)
+						insertString = NLS.bind(SSEUIMessages.TextHoverPreferenceTab_insertModifierAndDelimiter, new String[]{Action.findModifierString(e.stateMask)});
+					else
+						insertString = Action.findModifierString(e.stateMask);
+
+					if (insertString != null)
+						fModifierEditor.insert(insertString);
+				}
+			}
+		});
+
+		fModifierEditor.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				handleModifierModified();
+			}
+		});
+
+		// Description
+		Label descriptionLabel = new Label(hoverComposite, SWT.LEFT);
+		descriptionLabel.setText(SSEUIMessages.TextHoverPreferenceTab_description); //$NON-NLS-1$
+		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+		gd.horizontalSpan = 2;
+		descriptionLabel.setLayoutData(gd);
+		fDescription = new Text(hoverComposite, SWT.LEFT | SWT.WRAP | SWT.MULTI | SWT.READ_ONLY | SWT.BORDER);
+		gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
+		gd.horizontalSpan = 2;
+		fDescription.setLayoutData(gd);
+
+		initialize();
+
+		Dialog.applyDialogFont(hoverComposite);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(hoverComposite, IHelpContextIds.PREFSTE_HOVERS_HELPID);
+		return hoverComposite;
+	}
+
+	private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
+		ArrayList overlayKeys = new ArrayList();
+
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, EditorPreferenceNames.EDITOR_TEXT_HOVER_MODIFIERS));
+
+		OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
+		overlayKeys.toArray(keys);
+		return keys;
+	}
+
+	private String generateTextHoverString() {
+		StringBuffer buf = new StringBuffer();
+
+		for (int i = 0; i < fTextHovers.length; i++) {
+			buf.append(fTextHovers[i].getId());
+			buf.append(TextHoverManager.HOVER_ATTRIBUTE_SEPARATOR);
+			buf.append(Boolean.toString(fTextHovers[i].isEnabled()));
+			buf.append(TextHoverManager.HOVER_ATTRIBUTE_SEPARATOR);
+			String modifier = fTextHovers[i].getModifierString();
+			if (modifier == null || modifier.length() == 0)
+				modifier = TextHoverManager.NO_MODIFIER;
+			buf.append(modifier);
+			buf.append(TextHoverManager.HOVER_SEPARATOR);
+		}
+		return buf.toString();
+	}
+
+	private TextHoverManager getTextHoverManager() {
+		return SSEUIPlugin.getDefault().getTextHoverManager();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#getTitle()
+	 */
+	public String getTitle() {
+		return SSEUIMessages.TextHoverPreferenceTab_title; //$NON-NLS-1$
+	}
+
+	void handleHoverListSelection() {
+		int i = fHoverTable.getSelectionIndex();
+
+		if (i == -1) {
+			if (fHoverTable.getSelectionCount() == 0)
+				fModifierEditor.setEnabled(false);
+			return;
+		}
+
+		boolean enabled = fTextHovers[i].isEnabled();
+		fModifierEditor.setEnabled(enabled);
+		fModifierEditor.setText(fTextHovers[i].getModifierString());
+		String description = fTextHovers[i].getDescription();
+		if (description == null)
+			description = ""; //$NON-NLS-1$
+		fDescription.setText(description);
+	}
+
+	private void handleModifierModified() {
+		int i = fHoverTable.getSelectionIndex();
+		if (i == -1)
+			return;
+
+		String modifiers = fModifierEditor.getText();
+		fTextHovers[i].setModifierString(modifiers);
+
+		// update table
+		fHoverTableViewer.refresh(fTextHovers[i]);
+
+		updateStatus(fTextHovers[i]);
+	}
+
+	private void initialize() {
+		restoreFromOverlay();
+		fHoverTableViewer.setInput(fTextHovers);
+
+		initializeFields();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.AbstractPreferenceTab#initializeFields()
+	 */
+	protected void initializeFields() {
+		super.initializeFields();
+
+		fModifierEditor.setEnabled(false);
+		// initialize checkboxes in hover table
+		for (int i = 0; i < fTextHovers.length; i++)
+			fHoverTable.getItem(i).setChecked(fTextHovers[i].isEnabled());
+		fHoverTableViewer.refresh();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#performApply()
+	 */
+	public void performApply() {
+		performOk();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#performDefaults()
+	 */
+	public void performDefaults() {
+		initialize();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#performOk()
+	 */
+	public void performOk() {
+		String textHoverString = generateTextHoverString();
+		getOverlayStore().setValue(EditorPreferenceNames.EDITOR_TEXT_HOVER_MODIFIERS, textHoverString);
+		getTextHoverManager().resetTextHovers(); // notify text hover manager
+		// it should reset to get
+		// latest preferences
+	}
+
+	/**
+	 * Populates fTextHovers with text hover description from the overlay
+	 * store (which is the preferences)
+	 */
+	private void restoreFromOverlay() {
+		String descriptorsString = getOverlayStore().getString(EditorPreferenceNames.EDITOR_TEXT_HOVER_MODIFIERS);
+		fTextHovers = getTextHoverManager().generateTextHoverDescriptors(descriptorsString);
+	}
+
+	void updateStatus(TextHoverManager.TextHoverDescriptor hoverConfig) {
+		IStatus status = new StatusInfo();
+
+		if (hoverConfig != null && hoverConfig.isEnabled() && EditorUtility.computeStateMask(hoverConfig.getModifierString()) == -1)
+			status = new StatusInfo(IStatus.ERROR, NLS.bind(SSEUIMessages.TextHoverPreferenceTab_modifierIsNotValid, new String[]{hoverConfig.getModifierString()}));
+
+		int i = 0;
+		HashMap stateMasks = new HashMap(fTextHovers.length);
+		while (status.isOK() && i < fTextHovers.length) {
+			if (fTextHovers[i].isEnabled()) {
+				String label = fTextHovers[i].getLabel();
+				Integer stateMask = new Integer(EditorUtility.computeStateMask(fTextHovers[i].getModifierString()));
+				if (stateMask.intValue() == -1)
+					status = new StatusInfo(IStatus.ERROR, NLS.bind(SSEUIMessages.TextHoverPreferenceTab_modifierIsNotValidForHover, new String[]{fTextHovers[i].getModifierString(), label}));
+				else if (stateMasks.containsKey(stateMask))
+					status = new StatusInfo(IStatus.ERROR, NLS.bind(SSEUIMessages.TextHoverPreferenceTab_duplicateModifier, new String[]{label, (String) stateMasks.get(stateMask)}));
+				else
+					stateMasks.put(stateMask, label);
+			}
+			i++;
+		}
+
+		updateStatus(status);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/TranslucencyPreferenceTab.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/TranslucencyPreferenceTab.java
new file mode 100644
index 0000000..808a99b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/preferences/ui/TranslucencyPreferenceTab.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.preferences.ui;
+
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.IntegerFieldEditor;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Assert;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+
+public class TranslucencyPreferenceTab implements IPreferenceTab {
+
+	private PreferencePage fMainPreferencePage;
+	private IntegerFieldEditor fTranslucencyScale = null;
+	private final int MAX_PERCENTAGE = 100;
+
+	private IPropertyChangeListener validityChangeListener = new IPropertyChangeListener() {
+		public void propertyChange(PropertyChangeEvent event) {
+			if (event.getProperty().equals(FieldEditor.IS_VALID))
+				updateValidState();
+		}
+	};
+
+	/**
+	 *  
+	 */
+	public TranslucencyPreferenceTab() {
+		super();
+	}
+
+	public TranslucencyPreferenceTab(PreferencePage mainPreferencePage) {
+		Assert.isNotNull(mainPreferencePage);
+		setMainPreferencePage(mainPreferencePage);
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	public Control createContents(Composite tabFolder) {
+		Composite composite = new Composite(tabFolder, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		composite.setLayout(layout);
+
+		String text = SSEUIMessages.TranslucencyPreferenceTab_1; //$NON-NLS-1$
+		fTranslucencyScale = new IntegerFieldEditor(EditorPreferenceNames.READ_ONLY_FOREGROUND_SCALE, text, composite);
+
+		fTranslucencyScale.setErrorMessage(JFaceResources.getString("StringFieldEditor.errorMessage"));//$NON-NLS-1$
+		fTranslucencyScale.setPreferenceStore(getPreferenceStore());
+		fTranslucencyScale.setPreferencePage(getMainPreferencePage());
+		fTranslucencyScale.setTextLimit(Integer.toString(MAX_PERCENTAGE).length());
+		fTranslucencyScale.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
+		fTranslucencyScale.setValidRange(0, MAX_PERCENTAGE);
+		fTranslucencyScale.load();
+		fTranslucencyScale.setPropertyChangeListener(validityChangeListener);
+
+//		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.PREFWEBX_READONLY_HELPID);
+		return composite;
+	}
+
+	/**
+	 * @return Returns the fMainPreferencePage.
+	 */
+	private PreferencePage getMainPreferencePage() {
+		return fMainPreferencePage;
+	}
+
+	/**
+	 * @return Returns the preference store used in this tab
+	 */
+	private IPreferenceStore getPreferenceStore() {
+		return SSEUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#getTitle()
+	 */
+	public String getTitle() {
+		return SSEUIMessages.TranslucencyPreferenceTab_0; //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#performApply()
+	 */
+	public void performApply() {
+		fTranslucencyScale.store();
+		SSEUIPlugin.getDefault().savePluginPreferences();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#performDefaults()
+	 */
+	public void performDefaults() {
+		fTranslucencyScale.loadDefault();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.IPreferenceTab#performOk()
+	 */
+	public void performOk() {
+		performApply();
+	}
+
+	/**
+	 * @param mainPreferencePage
+	 *            The fMainPreferencePage to set.
+	 */
+	private void setMainPreferencePage(PreferencePage mainPreferencePage) {
+		fMainPreferencePage = mainPreferencePage;
+	}
+
+	private void updateValidState() {
+		if (getMainPreferencePage() != null) {
+			getMainPreferencePage().setValid(fTranslucencyScale.isValid());
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredCommentFoldingPosition.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredCommentFoldingPosition.java
new file mode 100644
index 0000000..f346653
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredCommentFoldingPosition.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.projection;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.projection.IProjectionPosition;
+
+/**
+ * Represents a folding position for an XML comment
+ */
+public abstract class AbstractStructuredCommentFoldingPosition extends Position implements IProjectionPosition {
+
+	/**
+	 * Default constructor
+	 * 
+	 * @param offset the offset of the folding position
+	 * @param length the length of the folidng position
+	 */
+	public AbstractStructuredCommentFoldingPosition(int offset, int length) {
+		super(offset, length);
+	}
+	
+	/**
+	 * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeCaptionOffset(org.eclipse.jface.text.IDocument)
+	 */
+	public int computeCaptionOffset(IDocument document) throws BadLocationException {
+		return findFirstContent(document.get(offset, length));
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeProjectionRegions(org.eclipse.jface.text.IDocument)
+	 */
+	public IRegion[] computeProjectionRegions(IDocument document) throws BadLocationException {
+		//get the content of the comment
+		String content = document.get(offset, length);
+		int contentStart = findFirstContent(content);
+		
+		//find the start line of the comment
+		//find the end line of the comment
+		//find the first line of text in the comment
+		int startLineNum = document.getLineOfOffset(getStartOffset());
+		IRegion startLine = document.getLineInformation(startLineNum);
+		int endLineNum = document.getLineOfOffset(getEndOffset()) +1;
+		IRegion endLine = document.getLineInformation(endLineNum);
+		int captionLineNum = document.getLineOfOffset(getStartOffset() + contentStart);
+		
+		int foldOffset;			
+		int foldEndOffset;
+		
+		synchronized (this) {
+			foldOffset = startLine.getOffset();
+			if(foldOffset < offset) {
+				offset = foldOffset;
+			}
+		
+			foldEndOffset = endLine.getOffset();
+		
+			if((foldEndOffset-offset) > length) {
+				length = foldEndOffset-offset;
+			}
+		}
+		
+		//fold before the first line of text in the comment
+		IRegion preRegion = null;
+		IRegion postRegion = null;
+		if(startLineNum < captionLineNum) {
+			IRegion captionLine = document.getLineInformation(captionLineNum);
+			preRegion = new Region(foldOffset, captionLine.getOffset()-foldOffset);
+		}
+		
+		//fold after the first line of text in the comment
+		if(captionLineNum < endLineNum) {
+			int postRegionOffset = document.getLineOffset(captionLineNum+1);
+			postRegion = new Region(postRegionOffset, foldEndOffset-postRegionOffset);
+		}
+		
+		IRegion[] regions = null;
+		if(preRegion != null && postRegion != null) {
+			regions = new IRegion[] {preRegion, postRegion};
+		} else if(preRegion != null) {
+			regions = new IRegion[] {preRegion};
+		} else if(postRegion != null) {
+			regions = new IRegion[] {postRegion};
+		}
+		
+		return regions;
+	}
+	
+	/**
+	 * Finds the offset of the first identifier part within <code>content</code>.
+	 * Returns 0 if none is found.
+	 *
+	 * @param content the content to search
+	 * @param prefixEnd the end of the prefix
+	 * @return the first index of a unicode identifier part, or zero if none can
+	 *         be found
+	 */
+	private int findFirstContent(final CharSequence content) {
+		int lenght= content.length();
+		for (int i= 0; i < lenght; i++) {
+			if (Character.isUnicodeIdentifierPart(content.charAt(i)))
+				return i;
+		}
+		return 0;
+	}
+	
+	/**
+	 * @return the start offset of the folding position
+	 */
+	protected abstract int getStartOffset();
+	
+	/**
+	 * @return the end offset of the folding position
+	 */
+	protected abstract int getEndOffset();
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredFoldingPosition.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredFoldingPosition.java
new file mode 100644
index 0000000..3ddb47a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredFoldingPosition.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.projection;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.projection.IProjectionPosition;
+
+/**
+ * Represents a single folding position in an <code>IStructuredDocument</code>
+ */
+public abstract class AbstractStructuredFoldingPosition extends Position implements IProjectionPosition {
+	
+	/**
+	 * Default constructor
+	 * 
+	 * @param offset the offset of the folding position
+	 * @param length the length of the folidng position
+	 */
+	public AbstractStructuredFoldingPosition(int offset, int length) {
+		super(offset, length);
+	}
+	
+	/**
+	 * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeCaptionOffset(org.eclipse.jface.text.IDocument)
+	 */
+	public int computeCaptionOffset(IDocument document) throws BadLocationException {
+		
+		return 0;
+	}
+	
+	/**
+	 * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeProjectionRegions(org.eclipse.jface.text.IDocument)
+	 */
+	public IRegion[] computeProjectionRegions(IDocument document) throws BadLocationException {
+		
+		int startLineNum = document.getLineOfOffset(getStartOffset()) + 1;
+		IRegion startLine = document.getLineInformation(startLineNum);
+		int endLineNum = document.getLineOfOffset(getEndOffset()) + 1;
+		IRegion endLine = document.getLineInformation(endLineNum);
+		
+		int foldOffset;			
+		int foldEndOffset;
+		
+		synchronized (this) {
+			foldOffset = startLine.getOffset();
+			if(foldOffset < offset) {
+				offset = foldOffset;
+			}
+		
+			foldEndOffset = endLine.getOffset();
+		
+			if((foldEndOffset-offset) > length) {
+				length = foldEndOffset-offset;
+			}
+		}
+		
+		return new IRegion[] {new Region(foldOffset, foldEndOffset-foldOffset)};
+	}
+	
+	/**
+	 * @return the start offset of the folding position
+	 */
+	protected abstract int getStartOffset();
+	
+	/**
+	 * @return the end offset of the folding position
+	 */
+	protected abstract int getEndOffset();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredFoldingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredFoldingStrategy.java
new file mode 100644
index 0000000..271fb1d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/projection/AbstractStructuredFoldingStrategy.java
@@ -0,0 +1,520 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.projection;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.projection.IProjectionListener;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy;
+import org.eclipse.wst.sse.ui.internal.reconcile.StructuredReconcileStep;
+
+/**
+ * <p>This class has the default implementation for a structured editor folding strategy.
+ * Each content type that the structured editor supports should create an extension point
+ * specifying a child class of this class as its folding strategy, if that content type
+ * should have folding.</p>
+ * 
+ * <p>EX:<br />
+ * <code>&lt;extension point="org.eclipse.wst.sse.ui.editorConfiguration"&gt;<br />
+ *  &lt;provisionalConfiguration<br />
+ *			type="foldingstrategy"<br />
+ *			class="org.eclipse.wst.xml.ui.internal.projection.XMLFoldingStrategy"<br />
+ *			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" /&gt;<br />
+ *	&lt;/extension&gt;</code></p>
+ * 
+ * <p>Different content types can use the same folding strategy if it makes sense to do so,
+ * such as with HTML/XML/JSP.</p>
+ * 
+ * <p>This strategy is based on the Reconciler paradigm and thus runs in the background,
+ * this means that even for very large documents requiring the calculation of 1000s of
+ * folding annotations the user will not be effected except for the annotations may take
+ * some time to first appear.</p>
+ */
+public abstract class AbstractStructuredFoldingStrategy
+	extends AbstractStructuredTextReconcilingStrategy implements IProjectionListener {
+	
+	/**
+	 * The org.eclipse.wst.sse.ui.editorConfiguration provisionalConfiguration type
+	 */
+	public static final String ID = "foldingstrategy"; //$NON-NLS-1$ 
+	
+	/**
+	 * A named preference that controls whether folding is enabled in the
+	 * Structured Text editor.
+	 */
+	public final static String FOLDING_ENABLED = "foldingEnabled"; //$NON-NLS-1$ 
+	
+	/**
+	 * The annotation model associated with this folding strategy
+	 */
+	protected ProjectionAnnotationModel fProjectionAnnotationModel;
+	
+	/**
+	 * The structured text viewer this folding strategy is associated with
+	 */
+	private ProjectionViewer fViewer;
+	
+	/**
+	 * these are not used but needed to implement abstract methods
+	 */
+	private IReconcileStep fFoldingStep;
+	
+	/**
+	 * Default constructor for the folding strategy, can not take any parameters
+	 * because subclasses instances of this class are created using reflection
+	 * based on plugin settings
+	 */
+	public AbstractStructuredFoldingStrategy() {
+		super();
+	}
+	
+	/**
+	 * The folding strategy must be associated with a viewer for it to function
+	 * 
+	 * @param viewer the viewer to associate this folding strategy with
+	 */
+	public void setViewer(ProjectionViewer viewer) {
+		super.setViewer(viewer);
+		
+		if(fViewer != null) {
+			fViewer.removeProjectionListener(this);
+		}
+		fViewer = viewer;
+		fViewer.addProjectionListener(this);
+		fProjectionAnnotationModel = fViewer.getProjectionAnnotationModel();
+	}
+	
+	public void uninstall() {
+		setDocument(null);
+		
+		if(fViewer != null) {
+			fViewer.removeProjectionListener(this);
+			fViewer = null;
+		}
+		
+		fFoldingStep = null;
+		
+		projectionDisabled();
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy#setDocument(org.eclipse.jface.text.IDocument)
+	 */
+	public void setDocument(IDocument document) {
+		super.setDocument(document);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.text.source.projection.IProjectionListener#projectionDisabled()
+	 */
+	public void projectionDisabled() {
+		fProjectionAnnotationModel = null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.text.source.projection.IProjectionListener#projectionEnabled()
+	 */
+	public void projectionEnabled() {
+		if(fViewer != null) {
+			fProjectionAnnotationModel = fViewer.getProjectionAnnotationModel();
+		}
+	}
+	
+	/**
+	 * <p><b>NOTE 1:</b> This implementation of reconcile ignores the given {@link IRegion} and instead gets all of the
+	 * structured document regions effected by the range of the given {@link DirtyRegion}.</p>
+	 * 
+	 * <p><b>NOTE 2:</b> In cases where multiple {@link IRegion} maybe dirty it is more efficient to pass one
+	 * {@link DirtyRegion} contain all of the {@link IRegion}s then one {@link DirtyRegion} for each IRegion.
+	 * Case in point, when processing the entire document it is <b>recommended</b> that this function be
+	 * called only <b>once</b> with one {@link DirtyRegion} that spans the entire document.</p>
+	 * 
+	 * @param dirtyRegion the region that needs its folding annotations processed
+	 * @param subRegion ignored
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion, org.eclipse.jface.text.IRegion)
+	 */
+	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+		IStructuredModel model = null;
+		if(fProjectionAnnotationModel != null) {
+			try {
+				model = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+				if(model != null) {
+					//use the structured doc to get all of the regions effected by the given dirty region
+					IStructuredDocument structDoc = model.getStructuredDocument();
+					IStructuredDocumentRegion[] structRegions = structDoc.getStructuredDocumentRegions(dirtyRegion.getOffset(), dirtyRegion.getLength());
+					Set indexedRegions = getIndexedRegions(model, structRegions);
+
+					//these are what are passed off to the annotation model to
+					//actually create and maintain the annotations
+					List modifications = new ArrayList();
+					List deletions = new ArrayList();
+					Map additions = new HashMap();
+					boolean isInsert = dirtyRegion.getType().equals(DirtyRegion.INSERT);
+					boolean isRemove = dirtyRegion.getType().equals(DirtyRegion.REMOVE);
+
+					//find and mark all folding annotations with length 0 for deletion 
+					markInvalidAnnotationsForDeletion(dirtyRegion, deletions);
+					
+					//reconcile each effected indexed region
+					Iterator indexedRegionsIter = indexedRegions.iterator();
+					while(indexedRegionsIter.hasNext() && fProjectionAnnotationModel != null) {
+						IndexedRegion indexedRegion = (IndexedRegion)indexedRegionsIter.next();
+					
+						//only try to create an annotation if the index region is a valid type
+						if(indexedRegionValidType(indexedRegion)) {
+							FoldingAnnotation annotation = new FoldingAnnotation(indexedRegion, false);
+							
+							// if INSERT calculate new addition position or modification
+							// else if REMOVE add annotation to the deletion list
+							if(isInsert) {
+								Annotation existingAnno = getExistingAnnotation(indexedRegion);
+								//if projection has been disabled the iter could be null
+								//if annotation does not already exist for this region create a new one
+								//else modify an old one, which could include deletion
+								if(existingAnno == null) {
+									Position newPos = calcNewFoldPosition(indexedRegion);
+
+									if(newPos != null && newPos.length > 0) {
+										additions.put(annotation, newPos);
+									}
+								} else {
+									updateAnnotations(existingAnno, indexedRegion, additions, modifications, deletions);
+								}
+							} else if (isRemove) {
+								deletions.add(annotation);
+							}
+						}
+					}
+					
+					//be sure projection has not been disabled
+					if(fProjectionAnnotationModel != null) {
+						//send the calculated updates to the annotations to the annotation model
+						fProjectionAnnotationModel.modifyAnnotations((Annotation[])deletions.toArray(new Annotation[1]), additions, (Annotation[])modifications.toArray(new Annotation[0]));
+					}
+				}
+			} finally {
+				if(model != null) {
+					model.releaseFromRead();
+				}
+			}
+		}
+	}
+	
+	/**
+	 * <p>Every implementation of the folding strategy calculates the position for a given
+	 * IndexedRegion differently.  Also this calculation often relies on casting to internal classes
+	 * only available in the implementing classes plugin</p>
+	 * 
+	 * @param indexedRegion the IndexedRegion to calculate a new annotation position for
+	 * @return the calculated annotation position or NULL if none can be calculated based on the given region
+	 */
+	abstract protected Position calcNewFoldPosition(IndexedRegion indexedRegion);
+	
+	/**
+	 * This is the default behavior for updating a dirtied IndexedRegion.  This function
+	 * can be overridden if slightly different functionality is required in a specific instance
+	 * of this class.
+	 * 
+	 * @param existingAnnotationsIter the existing annotations that need to be updated
+	 * based on the given dirtied IndexRegion
+	 * @param dirtyRegion the IndexedRegion that caused the annotations need for updating
+	 * @param modifications the list of annotations to be modified
+	 * @param deletions the list of annotations to be deleted
+	 */
+	protected void updateAnnotations(Annotation existingAnnotation, IndexedRegion dirtyRegion, Map additions, List modifications, List deletions) {
+		if(existingAnnotation instanceof FoldingAnnotation) {
+			FoldingAnnotation foldingAnnotation = (FoldingAnnotation)existingAnnotation;
+			Position newPos = calcNewFoldPosition(foldingAnnotation.getRegion());
+
+			//if a new position can be calculated then update the position of the annotation,
+			//else the annotation needs to be deleted
+			if(newPos != null && newPos.length > 0 && fProjectionAnnotationModel != null) {
+				Position oldPos = fProjectionAnnotationModel.getPosition(foldingAnnotation);
+				//only update the position if we have to
+				if(!newPos.equals(oldPos)) {
+					oldPos.setOffset(newPos.offset);
+					oldPos.setLength(newPos.length);
+					modifications.add(foldingAnnotation);
+				}
+			} else {
+				deletions.add(foldingAnnotation);
+			}
+		}
+	}
+
+	/**
+	 * <p>Searches the given {@link DirtyRegion} for annotations that now have a length of 0.
+	 * This is caused when something that was being folded has been deleted.  These {@link FoldingAnnotation}s
+	 * are then added to the {@link List} of {@link FoldingAnnotation}s to be deleted</p>
+	 * 
+	 * @param dirtyRegion find the now invalid {@link FoldingAnnotation}s in this {@link DirtyRegion}
+	 * @param deletions the current list of {@link FoldingAnnotation}s marked for deletion that the
+	 * newly found invalid {@link FoldingAnnotation}s will be added to
+	 */
+	protected void markInvalidAnnotationsForDeletion(DirtyRegion dirtyRegion, List deletions) {
+		Iterator iter = getAnnotationIterator(dirtyRegion);
+		while(iter.hasNext()) {
+			Annotation anno = (Annotation)iter.next();
+			if(anno instanceof FoldingAnnotation) {
+				Position pos = fProjectionAnnotationModel.getPosition(anno);
+				if(pos.length == 0) {
+					deletions.add(anno);
+	 			}
+	 		}
+	 	}
+	}
+
+	/**
+	 * Should return true if the given IndexedRegion is one that this strategy pays attention to
+	 * when calculating new and updated annotations
+	 * 
+	 * @param indexedRegion the IndexedRegion to check the type of
+	 * @return true if the IndexedRegion is of a valid type, false otherwise
+	 */
+	abstract protected boolean indexedRegionValidType(IndexedRegion indexedRegion);
+	
+	/**
+	 *  Steps are not used in this strategy
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy#containsStep(org.eclipse.jface.text.reconciler.IReconcileStep)
+	 */
+	protected boolean containsStep(IReconcileStep step) {
+		return fFoldingStep.equals(step);
+	}
+
+	/** 
+	 * Steps are not used in this strategy
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy#createReconcileSteps()
+	 */
+	public void createReconcileSteps() {
+		fFoldingStep = new StructuredReconcileStep() { };
+	}
+	
+	/**
+	 * A FoldingAnnotation is a ProjectionAnnotation in a structured document.
+	 * Its extended functionality include storing the <code>IndexedRegion</code> it is folding
+	 * and overriding the paint method (in a hacky type way) to prevent one line folding
+	 * annotations to be drawn.
+	 */
+	protected class FoldingAnnotation extends ProjectionAnnotation {
+		private boolean fIsVisible; /* workaround for BUG85874 */
+		
+		/**
+		 * The IndexedRegion this annotation is folding
+		 */
+		private IndexedRegion fRegion;
+		
+		/**
+		 * Creates a new FoldingAnnotation that is associated with the given IndexedRegion
+		 * 
+		 * @param region the IndexedRegion this annotation is associated with 
+		 * @param isCollapsed true if this annotation should be collapsed, false otherwise
+		 */
+		public FoldingAnnotation(IndexedRegion region, boolean isCollapsed) {
+			super(isCollapsed);
+			
+			fIsVisible = false;
+			fRegion = region;
+		}
+		
+		/**
+		 * Returns the IndexedRegion this annotation is associated with
+		 * 
+		 * @return the IndexedRegion this annotation is associated with
+		 */
+		public IndexedRegion getRegion() {
+			return fRegion;
+		}
+
+		public void setRegion(IndexedRegion region) {
+			fRegion = region;
+		}
+
+		/**
+		 * Does not paint hidden annotations. Annotations are hidden when they
+		 * only span one line.
+		 * 
+		 * @see ProjectionAnnotation#paint(org.eclipse.swt.graphics.GC,
+		 *      org.eclipse.swt.widgets.Canvas,
+		 *      org.eclipse.swt.graphics.Rectangle)
+		 */
+		public void paint(GC gc, Canvas canvas, Rectangle rectangle) {
+			/* workaround for BUG85874 */
+			/*
+			 * only need to check annotations that are expanded because hidden
+			 * annotations should never have been given the chance to
+			 * collapse.
+			 */
+			if (!isCollapsed()) {
+				// working with rectangle, so line height
+				FontMetrics metrics = gc.getFontMetrics();
+				if (metrics != null) {
+					// do not draw annotations that only span one line and
+					// mark them as not visible
+					if ((rectangle.height / metrics.getHeight()) <= 1) {
+						fIsVisible = false;
+						return;
+					}
+				}
+			}
+			fIsVisible = true;
+			super.paint(gc, canvas, rectangle);
+		}
+
+		/**
+		 * @see org.eclipse.jface.text.source.projection.ProjectionAnnotation#markCollapsed()
+		 */
+		public void markCollapsed() {
+			/* workaround for BUG85874 */
+			// do not mark collapsed if annotation is not visible
+			if (fIsVisible)
+				super.markCollapsed();
+		}
+		
+		/**
+		 * Two FoldingAnnotations are equal if their IndexedRegions are equal
+		 * 
+		 * @see java.lang.Object#equals(java.lang.Object)
+		 */
+		public boolean equals(Object obj) {
+			boolean equal = false;
+			
+			if(obj instanceof FoldingAnnotation) {
+				equal = fRegion.equals(((FoldingAnnotation)obj).fRegion);
+			}
+			
+			return equal;
+		}
+		
+		/**
+		 * Returns the hash code of the IndexedRegion this annotation is associated with
+		 * 
+		 * @see java.lang.Object#hashCode()
+		 */
+		public int hashCode() {
+			return fRegion.hashCode();
+		}
+		
+		/**
+		 * Returns the toString of the aIndexedRegion this annotation is associated with
+		 * 
+		 * @see java.lang.Object#toString()
+		 */
+		public String toString() {
+			return fRegion.toString();
+		}
+	}
+	
+	/**
+	 * Given a {@link DirtyRegion} returns an {@link Iterator} of the already existing
+	 * annotations in that region.
+	 * 
+	 * @param dirtyRegion the {@link DirtyRegion} to check for existing annotations in
+	 * 
+	 * @return an {@link Iterator} over the annotations in the given {@link DirtyRegion}.
+	 * The iterator could have no annotations in it. Or <code>null</code> if projection has
+	 * been disabled.
+	 */
+	private Iterator getAnnotationIterator(DirtyRegion dirtyRegion) {
+		Iterator annoIter = null; 
+		//be sure project has not been disabled
+		if(fProjectionAnnotationModel != null) {
+			//workaround for Platform Bug 299416
+			int offset = dirtyRegion.getOffset();
+			if(offset > 0) {
+				offset--;
+			}
+			annoIter = fProjectionAnnotationModel.getAnnotationIterator(offset, dirtyRegion.getLength(), false, false);
+		}
+		return annoIter;
+	}
+
+	/**
+	 * <p>Gets the first {@link Annotation} at the start offset of the given {@link IndexedRegion}.</p>
+	 * 
+	 * @param indexedRegion get the first {@link Annotation} at this {@link IndexedRegion}
+	 * @return the first {@link Annotation} at the start offset of the given {@link IndexedRegion}
+	 */
+	private Annotation getExistingAnnotation(IndexedRegion indexedRegion) {
+		Iterator iter = fProjectionAnnotationModel.getAnnotationIterator(indexedRegion.getStartOffset(), 1, false, true);
+		Annotation anno = null;
+		if(iter.hasNext()) {
+			anno = (Annotation)iter.next();
+		}
+
+		return anno;
+	}
+
+	/**
+	 * <p>Gets all of the {@link IndexedRegion}s from the given {@link IStructuredModel} spanned by the given
+	 * {@link IStructuredDocumentRegion}s.</p>
+	 * 
+	 * @param model the {@link IStructuredModel} used to get the {@link IndexedRegion}s
+	 * @param structRegions get the {@link IndexedRegion}s spanned by these {@link IStructuredDocumentRegion}s
+	 * @return the {@link Set} of {@link IndexedRegion}s from the given {@link IStructuredModel} spanned by the
+	 * given {@link IStructuredDocumentRegion}s.
+	 */
+	private Set getIndexedRegions(IStructuredModel model, IStructuredDocumentRegion[] structRegions) {
+		Set indexedRegions = new HashSet();
+
+		//for each text region in each structured document region find the indexed region it spans/is in
+		for (int structRegionIndex = 0; structRegionIndex < structRegions.length && fProjectionAnnotationModel != null; ++structRegionIndex) {
+			IStructuredDocumentRegion structuredDocumentRegion = structRegions[structRegionIndex];
+			ITextRegionList textRegions = structuredDocumentRegion.getRegions();
+			
+			int offset = structuredDocumentRegion.getStartOffset(textRegions.get(0));
+			IndexedRegion indexedRegion = model.getIndexedRegion(offset);
+			indexedRegions.add(indexedRegion);
+			if (structuredDocumentRegion.getEndOffset() <= indexedRegion.getEndOffset())
+				continue;
+
+			int textRegionCount = textRegions.size();
+			for (int textRegionIndex = 1; textRegionIndex < textRegionCount; ++textRegionIndex) {
+				offset = structuredDocumentRegion.getStartOffset(textRegions.get(textRegionIndex));
+				indexedRegion = model.getIndexedRegion(offset);
+				indexedRegions.add(indexedRegion);
+			}
+		}
+
+		return indexedRegions;
+	 }
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/AdapterPropertySheetEntryLabelProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/AdapterPropertySheetEntryLabelProvider.java
new file mode 100644
index 0000000..18f919c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/AdapterPropertySheetEntryLabelProvider.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.properties;
+
+
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.views.properties.IPropertySheetEntry;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+
+
+public class AdapterPropertySheetEntryLabelProvider extends LabelProvider {
+	public Image getImage(Object element) {
+		if (element == null)
+			return null;
+		if (element instanceof IPropertySheetEntry) {
+			return ((IPropertySheetEntry) element).getImage();
+		}
+		if (element instanceof INodeNotifier) {
+			IPropertySheetEntry entry = (IPropertySheetEntry) ((INodeNotifier) element).getAdapterFor(IPropertySheetEntry.class);
+			if (entry != null)
+				return entry.getImage();
+		}
+		return super.getImage(element);
+	}
+
+	public String getText(Object element) {
+		if (element == null)
+			return null;
+		if (element instanceof IPropertySheetEntry) {
+			return ((IPropertySheetEntry) element).getValueAsString();
+		}
+		if (element instanceof INodeNotifier) {
+			IPropertySheetEntry entry = (IPropertySheetEntry) ((INodeNotifier) element).getAdapterFor(IPropertySheetEntry.class);
+			if (entry != null)
+				return entry.getValueAsString();
+		}
+		return super.getText(element);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/ConfigurablePropertySheetPage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/ConfigurablePropertySheetPage.java
new file mode 100644
index 0000000..881cb2f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/ConfigurablePropertySheetPage.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.properties;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.PageBookView;
+import org.eclipse.ui.views.properties.IPropertySheetEntry;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.wst.sse.ui.views.properties.IPropertySourceExtension;
+import org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration;
+
+
+/**
+ * A configurable IPropertySheetPage since the standard PropertySheetPage does
+ * not expose its viewer field.
+ */
+
+public class ConfigurablePropertySheetPage extends PropertySheetPage {
+	private class NullPropertySheetConfiguration extends PropertySheetConfiguration {
+		public IPropertySourceProvider getPropertySourceProvider(IPropertySheetPage page) {
+			return null;
+		}
+	}
+
+	private static final boolean _DEBUG = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/propertySheet")); //$NON-NLS-1$  //$NON-NLS-2$;;
+
+	private long _DEBUG_TIME = 0;
+
+	private PropertySheetConfiguration fConfiguration;
+	private Object[] fSelectedEntries = null;
+	private ISelection fInput = null;
+	private IMenuManager fMenuManager;
+
+	private RemoveAction fRemoveAction;
+
+	private IStatusLineManager fStatusLineManager;
+
+	private IToolBarManager fToolBarManager;
+
+	private final PropertySheetConfiguration NULL_CONFIGURATION = new NullPropertySheetConfiguration();
+
+	public ConfigurablePropertySheetPage() {
+		super();
+	}
+
+	public void createControl(Composite parent) {
+		setPropertySourceProvider(getConfiguration().getPropertySourceProvider(this));
+		super.createControl(parent);
+	}
+
+	public void dispose() {
+		setConfiguration(null);
+		getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(this);
+		fSelectedEntries = null;
+		fInput = null;
+		super.dispose();
+	}
+
+	public PropertySheetConfiguration getConfiguration() {
+		if (fConfiguration == null)
+			fConfiguration = NULL_CONFIGURATION;
+		return fConfiguration;
+	}
+
+	public void handleEntrySelection(ISelection selection) {
+		if (getControl() != null && !getControl().isDisposed() && selection != null) {
+			super.handleEntrySelection(selection);
+			if (selection instanceof IStructuredSelection) {
+				fSelectedEntries = ((IStructuredSelection) selection).toArray();
+			}
+			else {
+				fSelectedEntries = null;
+			}
+			fRemoveAction.setEnabled(!selection.isEmpty());
+		}
+	}
+
+	public void init(IPageSite pageSite) {
+		super.init(pageSite);
+		pageSite.getWorkbenchWindow().getSelectionService().addPostSelectionListener(this);
+	}
+
+	public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
+		super.makeContributions(menuManager, toolBarManager, statusLineManager);
+		fMenuManager = menuManager;
+		fToolBarManager = toolBarManager;
+		fStatusLineManager = statusLineManager;
+
+		fRemoveAction = new RemoveAction(this);
+		toolBarManager.add(fRemoveAction);
+		menuManager.add(fRemoveAction);
+		getConfiguration().addContributions(menuManager, toolBarManager, statusLineManager);
+
+		menuManager.update(true);
+	}
+
+	void remove() {
+		if (fSelectedEntries != null) {
+			Object[] entries = fSelectedEntries;
+			ISelection selection = fInput;
+			boolean needsRefresh = false;
+			if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) {
+				IPropertySource source = getConfiguration().getPropertySourceProvider(this).getPropertySource(((IStructuredSelection) selection).getFirstElement());
+				if (source != null && source instanceof IPropertySourceExtension) {
+					for (int i = 0; i < entries.length; i++) {
+						if (entries[i] instanceof IPropertySheetEntry) {
+							IPropertySheetEntry entry = (IPropertySheetEntry) entries[i];
+							needsRefresh = true;
+							((IPropertySourceExtension) source).removeProperty(entry.getDisplayName());
+						}
+					}
+				}
+			}
+			if (needsRefresh) {
+				refresh();
+			}
+		}
+	}
+
+	/*
+	 * Filter the selection through the current Configuration. Not every
+	 * selection received is a Structured selection nor are the Structured
+	 * selection's elements all to be displayed.
+	 * 
+	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+		if (_DEBUG) {
+			_DEBUG_TIME = System.currentTimeMillis();
+		}
+		// skip if we're the source of this selection
+		if (part != null && part instanceof PageBookView) {
+			if (((PageBookView) part).getCurrentPage() == this)
+				return;
+		}
+		if (getControl() != null && getControl().isVisible()) {
+			ISelection preferredSelection = getConfiguration().getInputSelection(part, selection);
+			/*
+			 * Do some minor caching of the selection.
+			 * 
+			 * As a PropertySheetPage, we've always notified of selection
+			 * changes, but we've also subscribed to post selection
+			 * notification so we can track caret movements in source viewers.
+			 * When selecting a block of text, we're thus notified of the new
+			 * selection twice. Remembering what our last *effective*
+			 * selection was allows us to cut out most of the
+			 * double-notification penalty.
+			 */
+			if (!preferredSelection.equals(fInput)) {
+				fInput = preferredSelection;
+				fSelectedEntries = null;
+				super.selectionChanged(part, preferredSelection);
+			}
+
+			if (_DEBUG) {
+				System.out.println("(P:service " + (System.currentTimeMillis() - _DEBUG_TIME) + "ms) " + part + " : " + ((IStructuredSelection) preferredSelection).getFirstElement()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+		}
+		else if (_DEBUG) {
+			System.out.println("[skipped] (P:" + (System.currentTimeMillis() - _DEBUG_TIME) + "ms) " + part + " : " + selection); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+	}
+
+	/**
+	 * @param configuration
+	 *            The configuration to set.
+	 */
+	public void setConfiguration(PropertySheetConfiguration configuration) {
+		if (fConfiguration != null) {
+			fConfiguration.removeContributions(fMenuManager, fToolBarManager, fStatusLineManager);
+			fConfiguration.unconfigure();
+		}
+
+		fConfiguration = configuration;
+
+		if (fConfiguration != null) {
+			setPropertySourceProvider(fConfiguration.getPropertySourceProvider(this));
+			fConfiguration.addContributions(fMenuManager, fToolBarManager, fStatusLineManager);
+		}
+	}
+
+	public void setFocus() {
+		super.setFocus();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/CustomPropertyDescriptor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/CustomPropertyDescriptor.java
new file mode 100644
index 0000000..154861b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/CustomPropertyDescriptor.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.properties;
+
+
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class CustomPropertyDescriptor extends PropertyDescriptor {
+
+	protected Class cellEditorClass = null;
+
+	/**
+	 * Returns a property descriptor with a unique name and a display name.
+	 * 
+	 * @param id
+	 *            the id for the property
+	 * @param displayName
+	 *            the name to display for the property
+	 */
+	public CustomPropertyDescriptor(Object id, String newDisplayName, Class editorClass) {
+		super(id, newDisplayName);
+		setDescription((String) id);
+		setCellEditorClass(editorClass);
+	}
+
+	/**
+	 * Returns a property descriptor with a unique name and a display name.
+	 * 
+	 * @param uniqueName
+	 *            the unique name of the property
+	 * @param displayName
+	 *            the name to display for the property
+	 */
+	public CustomPropertyDescriptor(String uniqueName, String newDisplayName) {
+		this(uniqueName, newDisplayName, TextCellEditor.class);
+	}
+
+	public CellEditor createPropertyEditor(Composite parent) {
+		return getPropertyEditor(parent);
+	}
+
+	public Class getCellEditorClass() {
+		return cellEditorClass;
+	}
+
+	/**
+	 * Returns the editor used to edit the property.
+	 * 
+	 * @return an editor for the property
+	 */
+	protected CellEditor getPropertyEditor(Composite parent) {
+		if (getCellEditorClass() == null)
+			return null;
+
+		java.lang.reflect.Constructor constructor = null;
+		try {
+			constructor = getCellEditorClass().getDeclaredConstructor(new Class[]{Composite.class});
+		} catch (NoSuchMethodException nsme) {
+			return new TextCellEditor(parent);
+		}
+		if (constructor != null) {
+			try {
+				return (CellEditor) constructor.newInstance(new Object[]{parent});
+			} catch (InstantiationException ie) {
+			} catch (java.lang.reflect.InvocationTargetException ite) {
+			} catch (IllegalAccessException iae) {
+			}
+		}
+		return new TextCellEditor(parent);
+	}
+
+	public void setCellEditorClass(Class newCellEditorClass) {
+		cellEditorClass = newCellEditorClass;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/RemoveAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/RemoveAction.java
new file mode 100644
index 0000000..a02a120
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/RemoveAction.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.properties;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
+
+public class RemoveAction extends Action {
+	private ConfigurablePropertySheetPage fPage;
+
+	public RemoveAction(ConfigurablePropertySheetPage page) {
+		super();
+		fPage = page;
+		setText(getText());
+		setToolTipText(getText());
+		setImageDescriptor(EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_ELCL_DELETE));
+		setDisabledImageDescriptor(EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_DLCL_DELETE));
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.Action#getText()
+	 */
+	public String getText() {
+		return SSEUIMessages.RemoveAction_0; //$NON-NLS-1$
+	}
+
+	/**
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		fPage.remove();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/ShowPropertiesAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/ShowPropertiesAction.java
new file mode 100644
index 0000000..38b0551
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/properties/ShowPropertiesAction.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.properties;
+
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.ShowViewAction;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
+import org.eclipse.wst.sse.ui.internal.editor.IHelpContextIds;
+
+/**
+ * Surfaces the Properties view
+ */
+public class ShowPropertiesAction extends ShowViewAction {
+	private final static String VIEW_ID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
+	private ISelectionProvider fSelectionProvider;
+	private IWorkbenchPart fPart;
+
+	public ShowPropertiesAction() {
+		super(SSEUIMessages.ShowPropertiesAction_0, EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_OBJ_PROP_PS)); //$NON-NLS-1$
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IHelpContextIds.CONTMNU_PROPERTIES_HELPID);
+	}
+
+	public ShowPropertiesAction(IWorkbenchPart part, ISelectionProvider provider) {
+		this();
+		fSelectionProvider = provider;
+		fPart = part;
+	}
+
+	protected String getViewID() {
+		return VIEW_ID;
+	}
+
+	public void run() {
+		super.run();
+
+		if (fSelectionProvider != null) {
+			IWorkbenchWindow window = SSEUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+			IWorkbenchPage page = window.getActivePage();
+			if (page != null) {
+				IViewPart findView = page.findView(getViewID());
+				if (findView instanceof ISelectionListener && fPart != null) {
+					((ISelectionListener) findView).selectionChanged(fPart, fSelectionProvider.getSelection());
+				}
+				else {
+					findView.getViewSite().getSelectionProvider().setSelection(fSelectionProvider.getSelection());
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/preferences/CommonEditorPreferenceNames.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/preferences/CommonEditorPreferenceNames.java
new file mode 100644
index 0000000..3eaa30d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/preferences/CommonEditorPreferenceNames.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.provisional.preferences;
+
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+
+/**
+ * Common editor preference keys used by the Structured Text Editor.
+ * 
+ * @plannedfor 1.0
+ */
+public class CommonEditorPreferenceNames {
+	private CommonEditorPreferenceNames() {
+		// empty private constructor so users cannot instantiate class
+	}
+
+	/**
+	 * A named preference that controls as-you-type validation
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 */
+	public static final String EVALUATE_TEMPORARY_PROBLEMS = EditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS;
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryProvider.java
new file mode 100644
index 0000000..e2bf0d4
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryProvider.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.registry;
+
+import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+
+
+public interface AdapterFactoryProvider {
+
+	public void addAdapterFactories(IStructuredModel structuredModel);
+
+	// TODO_issue: IDocumentTypeHandler doesn't seem correct in this API.
+	// reexamine and see if should be ModelHandler, or ContentTypeIdentifer
+	// instead.
+	public boolean isFor(IDocumentTypeHandler contentTypeDescription);
+
+	/**
+	 * This method should only add those factories related to embedded content
+	 * type
+	 */
+	public void reinitializeFactories(IStructuredModel structuredModel);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistry.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistry.java
new file mode 100644
index 0000000..0a04339
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistry.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.registry;
+
+import java.util.Iterator;
+
+/**
+ * This is basically a "factory for factories". It is to used to associate
+ * "edit time" AdapterFactories with a StructuredModel, based on the
+ * IStructuredModel's ContentTypeDescription. In plugin.xml files, there
+ * should be an AdapterFactoryProvider defined for every definition of
+ * ContentTypeDescription.
+ */
+public interface AdapterFactoryRegistry {
+
+	/**
+	 * Returns an Iterator over a Collection of AdapterFactoryProviders
+	 * 
+	 * @return
+	 */
+	public Iterator getAdapterFactories();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryExtension.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryExtension.java
new file mode 100644
index 0000000..bc47269
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryExtension.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.registry;
+
+import java.util.Iterator;
+import java.util.List;
+
+public interface AdapterFactoryRegistryExtension {
+	Iterator getAdapterFactories(String contentTypeID);
+
+	List getAdapterFactoriesAsList(String contentTypeID);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryImpl.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryImpl.java
new file mode 100644
index 0000000..78ebf47
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryImpl.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.registry;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+public class AdapterFactoryRegistryImpl implements AdapterFactoryRegistry, AdapterFactoryRegistryExtension {
+
+	protected final static String ATT_CLASS = "class"; //$NON-NLS-1$
+
+	private static AdapterFactoryRegistry instance = null;
+
+	static synchronized public AdapterFactoryRegistry getInstance() {
+		if (instance == null) {
+			instance = new AdapterFactoryRegistryImpl();
+		}
+		return instance;
+	}
+
+	// this map exists so there is only one provider
+	// instance not duplicate providers for different content types
+	private HashMap adapterProviders = null;
+
+	private boolean DEBUG = false;
+	/**
+	 * This HashMap contains: [contentTypeId -> element2providerMap] | V
+	 * [configurationElement -> AdapterFactoryProvider]
+	 * 
+	 */
+	private HashMap hashMap = null;
+
+	// providers with no content type associated
+	// just added through the add(...) method
+	private HashSet unassociatedProviders = null;
+
+	private AdapterFactoryRegistryImpl() {
+		super();
+		this.hashMap = new HashMap();
+		this.unassociatedProviders = new HashSet();
+		this.adapterProviders = new HashMap();
+
+		// doesn't instantiate classes, just stores configuration elements
+		AdapterFactoryRegistryReader.readRegistry(hashMap);
+	}
+
+	void add(AdapterFactoryProvider adapterFactoryProvider) {
+		this.unassociatedProviders.add(adapterFactoryProvider);
+	}
+
+	public Iterator getAdapterFactories() {
+		if (DEBUG) {
+			System.out.println("===================================================================================="); //$NON-NLS-1$
+			System.out.println("GETTING ALL ADAPTER FACTORIES"); //$NON-NLS-1$
+		}
+
+		List results = new ArrayList();
+
+		// add providers that have no content type specification
+		results.addAll(this.unassociatedProviders);
+		Iterator it = this.hashMap.keySet().iterator();
+		String contentTypeId = null;
+		while (it.hasNext()) {
+			contentTypeId = (String) it.next();
+
+			if (DEBUG)
+				System.out.println(" + for: " + contentTypeId); //$NON-NLS-1$
+
+			results.addAll(getAdapterFactoriesAsList(contentTypeId));
+		}
+
+		if (DEBUG) {
+			System.out.println("===================================================================================="); //$NON-NLS-1$
+		}
+
+		return results.iterator();
+	}
+
+	public Iterator getAdapterFactories(String contentTypeID) {
+		if (DEBUG) {
+			System.out.println("===================================================================================="); //$NON-NLS-1$
+			System.out.println("GETTING ADAPTER FACTORIES for: " + contentTypeID); //$NON-NLS-1$
+		}
+
+		List results = new ArrayList();
+
+		// add providers that have no content type specification
+		results.addAll(unassociatedProviders);
+
+		// add unknown content type providers (for backwards compatability)
+		results.addAll(getAdapterFactoriesAsList(AdapterFactoryRegistryReader.UNKNOWN_CONTENT_TYPE));
+
+		// add providers for specific content type
+		results.addAll(getAdapterFactoriesAsList(Platform.getContentTypeManager().getContentType(contentTypeID)));
+
+
+		if (DEBUG) {
+			System.out.println("===================================================================================="); //$NON-NLS-1$
+		}
+
+		return results.iterator();
+	}
+
+	public List getAdapterFactoriesAsList(IContentType contentType) {
+		IContentType type = contentType;
+		List results = new ArrayList();
+		while (type != null && !type.getId().equals(IContentTypeManager.CT_TEXT)) {
+			results.addAll(getAdapterFactoriesAsList(type.getId()));
+			type = type.getBaseType();
+		}
+		return results;
+	}
+
+	/**
+	 * Using this new API, only AdapterFactoryProviders for a certain content
+	 * type are instantiated. This will allow for the minimum number of
+	 * plugins to be loaded rather than all that implement the adapter factory
+	 * extension point.
+	 * 
+	 * @param contentTypeID
+	 * @return
+	 */
+	public List getAdapterFactoriesAsList(String contentTypeID) {
+
+		List results = new ArrayList();
+
+		// get element2Provider map for specified content type
+		Object o = hashMap.get(contentTypeID);
+		if (o != null) {
+			// instantiate if necessary from
+			// element2adapterFactoryProvider
+			// map
+			Map element2Provider = (Map) o;
+			Iterator it = element2Provider.keySet().iterator();
+			IConfigurationElement element = null;
+			String classname = null;
+			Object existing = null;
+			AdapterFactoryProvider p = null;
+			while (it.hasNext()) {
+				element = (IConfigurationElement) it.next();
+				o = element2Provider.get(element);
+				if (o != null) {
+					// this provider has already been created
+					if (DEBUG)
+						System.out.println("already created: " + element.getAttribute(ATT_CLASS)); //$NON-NLS-1$
+
+					results.add(o);
+				}
+				else {
+					// need to create the provider
+					try {
+						classname = element.getAttribute(ATT_CLASS);
+
+						if (DEBUG)
+							System.out.println("about to create: " + classname); //$NON-NLS-1$
+
+						// check if we created one already
+						existing = this.adapterProviders.get(classname);
+						if (existing == null) {
+							// this is the only place
+							// AdapterFactoryProviders
+							// are created
+							p = (AdapterFactoryProvider) element.createExecutableExtension(ATT_CLASS); // $NON-NLS-1$
+							this.adapterProviders.put(classname, p);
+						}
+						else {
+							p = (AdapterFactoryProvider) existing;
+						}
+
+						// add to element2Provider for this contentType
+						element2Provider.put(element, p);
+						// add to results to return for this method
+						results.add(p);
+
+					}
+					catch (CoreException e) {
+						// if the provider throws any exception, just log
+						// and
+						// continue
+						Logger.logException(e);
+					}
+				}
+			}
+		}
+
+		return results;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryReader.java
new file mode 100644
index 0000000..383e5e0
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/registry/AdapterFactoryRegistryReader.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.registry;
+
+import java.util.HashMap;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+/**
+ * This class just converts what's in the plugins registry into a form more
+ * easily useable by others, the ContentTypeRegistry.
+ */
+class AdapterFactoryRegistryReader {
+	protected final static String ATT_CLASS = "class"; //$NON-NLS-1$
+
+	protected final static String ATT_ID = "id"; //$NON-NLS-1$
+
+	private static boolean DEBUG = false;
+	protected final static String EXTENSION_POINT_ID = "adapterFactoryDescription"; //$NON-NLS-1$
+	//
+	protected final static String PLUGIN_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+	protected final static String TAG_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
+
+	protected final static String TAG_NAME = "adapterFactoryDescription"; //$NON-NLS-1$
+
+	public final static String UNKNOWN_CONTENT_TYPE = "unknown"; //$NON-NLS-1$
+
+	/**
+	 * adds configuration element to contentTypeId map [contentTypeId ->
+	 * element2providerMap] | V [element -> provider]
+	 * 
+	 * NOTE: this doesn't create the provider yet, that must be done on demand
+	 * and stored in the appropriate element2provider
+	 * 
+	 * @param map
+	 * @param contentTypeId
+	 * @param element
+	 */
+	private static void addElementForContentType(HashMap map, String contentTypeId, IConfigurationElement element) {
+
+		Object o = map.get(contentTypeId);
+		if (o == null) {
+			HashMap element2provider = new HashMap();
+			// don't create the executable extension yet
+			element2provider.put(element, null);
+			map.put(contentTypeId, element2provider);
+
+			if (DEBUG)
+				System.out.println("added " + element.getAttribute(ATT_CLASS) + ", but didn't create exec extension"); //$NON-NLS-1$ //$NON-NLS-2$
+		} else {
+			// add element to unknown list (not executable ext yet...)
+			HashMap element2provider = (HashMap) o;
+			element2provider.put(element, null);
+
+			if (DEBUG)
+				System.out.println("added " + element.getAttribute(ATT_CLASS) + " to unknown list, but didn't create exec extension"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/**
+	 * the map passed in: [contentTypeId -> element2providerMap] | V [element ->
+	 * provider]
+	 * 
+	 * @param element
+	 * @param map
+	 * @return
+	 */
+	protected static AdapterFactoryProvider readElement(IConfigurationElement element, HashMap map) {
+
+		AdapterFactoryProvider adapterFactoryProvider = null;
+		if (element.getName().equals(TAG_NAME)) {
+			try {
+				IConfigurationElement[] children = element.getChildren();
+				boolean specifiedContentType = false;
+				if (children != null && children.length > 0) {
+					// content types are specified
+					for (int i = 0; i < children.length; i++) {
+						if (children[i].getName().equals(TAG_CONTENT_TYPE)) {
+							// it's possible to have non-contentType childrent
+							specifiedContentType = true;
+							String contentType = children[i].getAttribute(ATT_ID);
+							addElementForContentType(map, contentType, element);
+						}
+					}
+				}
+				if (!specifiedContentType) {
+					// no content type association
+					addElementForContentType(map, UNKNOWN_CONTENT_TYPE, element);
+				}
+			} catch (Exception e) {
+				// if the provider throws any exception, just log and continue
+				Logger.logException(e);
+			}
+		}
+		return adapterFactoryProvider;
+	}
+
+	/**
+	 * We simply require an 'add' method, of what ever it is we are to read
+	 * into
+	 */
+	static void readRegistry(HashMap map) {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IExtensionPoint point = registry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
+		if (point != null) {
+			IConfigurationElement[] elements = point.getConfigurationElements();
+			for (int i = 0; i < elements.length; i++) {
+				readElement(elements[i], map);
+			}
+		}
+	}
+
+	protected IConfigurationElement configElement = null;
+
+	//    protected final static String ADAPTER_CLASS = "adapterClass";
+	// //$NON-NLS-1$
+	//    protected final static String DOC_TYPE_ID = "docTypeId"; //$NON-NLS-1$
+	//    protected final static String MIME_TYPE_LIST = "mimeTypeList";
+	// //$NON-NLS-1$
+	//
+	/**
+	 * ContentTypeRegistryReader constructor comment.
+	 */
+	AdapterFactoryRegistryReader() {
+		super();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/AbstractLineStyleProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/AbstractLineStyleProvider.java
new file mode 100644
index 0000000..2b80125
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/AbstractLineStyleProvider.java
@@ -0,0 +1,405 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+
+
+public abstract class AbstractLineStyleProvider {
+	private class PropertyChangeListener implements IPropertyChangeListener {
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+		 */
+		public void propertyChange(PropertyChangeEvent event) {
+			// have to do it this way so others can override the method
+			handlePropertyChange(event);
+		}
+	}
+
+	protected IStructuredDocument fDocument;
+	protected Highlighter fHighlighter;
+	private boolean fInitialized;
+	protected PropertyChangeListener fPreferenceListener = new PropertyChangeListener();
+
+	//private ISourceViewer fSourceViewer = null;
+	protected ReconcilerHighlighter fRecHighlighter = null;
+	
+	/** Contains all text attributes pertaining to this line style provider */
+	private HashMap fTextAttributes = null;
+
+	// we keep track of LogMessage to avoid writing hundreds of messages,
+	// but still give a hint that something is wrong with attributeProviders
+	// and/or regions.
+	// It's only written in the case of a program error, but there's no use
+	// adding
+	// salt to the wound.
+	// private boolean wroteOneLogMessage;
+	/**
+	 */
+	protected AbstractLineStyleProvider() {
+	}
+
+	/**
+	 * Looks up the colorKey in the preference store and adds the style
+	 * information to list of TextAttributes
+	 * 
+	 * @param colorKey
+	 */
+	protected void addTextAttribute(String colorKey) {
+		if (getColorPreferences() != null) {
+			String prefString = getColorPreferences().getString(colorKey);
+			String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+			if (stylePrefs != null) {
+				RGB foreground = ColorHelper.toRGB(stylePrefs[0]);
+				RGB background = ColorHelper.toRGB(stylePrefs[1]);
+				boolean bold = Boolean.valueOf(stylePrefs[2]).booleanValue();
+				boolean italic = Boolean.valueOf(stylePrefs[3]).booleanValue();
+				boolean strikethrough = Boolean.valueOf(stylePrefs[4]).booleanValue();
+				boolean underline = Boolean.valueOf(stylePrefs[5]).booleanValue();
+				int style = SWT.NORMAL;
+				if (bold) {
+					style = style | SWT.BOLD;
+				}
+				if (italic) {
+					style = style | SWT.ITALIC;
+				}
+				if (strikethrough) {
+					style = style | TextAttribute.STRIKETHROUGH;
+				}
+				if (underline) {
+					style = style | TextAttribute.UNDERLINE;
+				}
+
+				TextAttribute createTextAttribute = createTextAttribute(foreground, background, style);
+				getTextAttributes().put(colorKey, createTextAttribute);
+			}
+		}
+	}
+
+	protected void commonInit(IStructuredDocument document, Highlighter highlighter) {
+
+		fDocument = document;
+		fHighlighter = highlighter;
+	}
+
+	/**
+	 * this version does "trim" regions to match request
+	 */
+	private StyleRange createStyleRange(ITextRegionCollection flatNode, ITextRegion region, TextAttribute attr, int startOffset, int length) {
+		int start = flatNode.getStartOffset(region);
+		if (start < startOffset)
+			start = startOffset;
+		
+		// Base the text end offset off of the, possibly adjusted, start
+		int textEnd = start + region.getTextLength();
+		int maxOffset = startOffset + length;
+		
+		int end = flatNode.getEndOffset(region);
+		// Use the end of the text in the region to avoid applying background color to trailing whitespace
+		if(textEnd < end)
+			end = textEnd;
+		// instead of end-start?
+		if (end > maxOffset)
+			end = maxOffset;
+		StyleRange result = new StyleRange(start, end - start, attr.getForeground(), attr.getBackground(), attr.getStyle());
+		if((attr.getStyle() & TextAttribute.STRIKETHROUGH) != 0) {
+			result.strikeout = true;
+		}
+		if((attr.getStyle() & TextAttribute.UNDERLINE) != 0) {
+			result.underline = true;
+		}
+		return result;
+
+	}
+
+	protected TextAttribute createTextAttribute(RGB foreground, RGB background, boolean bold) {
+		return new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, bold ? SWT.BOLD : SWT.NORMAL);
+	}
+
+	protected TextAttribute createTextAttribute(RGB foreground, RGB background, int style) {
+		return new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, style);
+	}
+
+	abstract protected TextAttribute getAttributeFor(ITextRegion region);
+	
+	protected TextAttribute getAttributeFor(ITextRegionCollection collection, ITextRegion region) {
+		return getAttributeFor(region);
+	}
+
+	abstract protected IPreferenceStore getColorPreferences();
+
+	protected IStructuredDocument getDocument() {
+		return fDocument;
+	}
+	
+	public void setDocument(IStructuredDocument document) {
+		fDocument = document;
+	}
+
+	/**
+	 */
+	protected Highlighter getHighlighter() {
+		return fHighlighter;
+	}
+
+	/**
+	 * Returns the hashtable containing all the text attributes for this line
+	 * style provider. Lazily creates a hashtable if one has not already been
+	 * created.
+	 * 
+	 * @return
+	 */
+	protected HashMap getTextAttributes() {
+		if (fTextAttributes == null) {
+			fTextAttributes = new HashMap();
+			loadColors();
+		}
+		return fTextAttributes;
+	}
+
+	protected void handlePropertyChange(PropertyChangeEvent event) {
+		// force a full update of the text viewer
+		if(fRecHighlighter != null)
+			fRecHighlighter.refreshDisplay();
+	}
+
+	public void init(IStructuredDocument structuredDocument, Highlighter highlighter) {
+
+		commonInit(structuredDocument, highlighter);
+
+		if (isInitialized())
+			return;
+
+		registerPreferenceManager();
+
+		setInitialized(true);
+	}
+	
+	public void init(IStructuredDocument structuredDocument, ISourceViewer sourceViewer) {
+		init(structuredDocument, (Highlighter) null);
+	}
+	
+	public void init(IStructuredDocument structuredDocument, ReconcilerHighlighter highlighter)	{
+		fDocument = structuredDocument;
+		fRecHighlighter = highlighter;
+		
+		if(isInitialized())
+			return;
+		
+		registerPreferenceManager();
+		
+		setInitialized(true);
+	}
+
+	/**
+	 * @deprecated - left because it's public, but we aren't adapters any more
+	 */
+	public boolean isAdapterForType(java.lang.Object type) {
+		return type == LineStyleProvider.class;
+	}
+
+	/**
+	 * Returns the initialized.
+	 * 
+	 * @return boolean
+	 */
+	public boolean isInitialized() {
+		return fInitialized;
+	}
+	
+	abstract protected void loadColors();
+
+	public boolean prepareRegions(ITypedRegion typedRegion, int lineRequestStart, int lineRequestLength, Collection holdResults) {
+		final int partitionStartOffset = typedRegion.getOffset();
+		final int partitionLength = typedRegion.getLength();
+		IStructuredDocumentRegion structuredDocumentRegion = getDocument().getRegionAtCharacterOffset(partitionStartOffset);
+		boolean handled = false;
+
+		handled = prepareTextRegions(structuredDocumentRegion, partitionStartOffset, partitionLength, holdResults);
+
+		return handled;
+	}
+
+	/**
+	 * @param region
+	 * @param start
+	 * @param length
+	 * @param holdResults
+	 * @return
+	 */
+	private boolean prepareTextRegion(ITextRegionCollection blockedRegion, int partitionStartOffset, int partitionLength, Collection holdResults) {
+		boolean handled = false;
+		final int partitionEndOffset = partitionStartOffset + partitionLength - 1;
+		ITextRegion region = null;
+		ITextRegionList regions = blockedRegion.getRegions();
+		int nRegions = regions.size();
+		StyleRange styleRange = null;
+		for (int i = 0; i < nRegions; i++) {
+			region = regions.get(i);
+			TextAttribute attr = null;
+			TextAttribute previousAttr = null;
+			if (blockedRegion.getStartOffset(region) > partitionEndOffset)
+				break;
+			if (blockedRegion.getEndOffset(region) <= partitionStartOffset)
+				continue;
+
+			if (region instanceof ITextRegionCollection) {
+				handled = prepareTextRegion((ITextRegionCollection) region, partitionStartOffset, partitionLength, holdResults);
+			} else {
+
+				attr = getAttributeFor(blockedRegion, region);
+				if (attr != null) {
+					handled = true;
+					// if this region's attr is the same as previous one, then
+					// just adjust the previous style range
+					// instead of creating a new instance of one
+					// note: to use 'equals' in this case is important, since
+					// sometimes
+					// different instances of attributes are associated with a
+					// region, even the
+					// the attribute has the same values.
+					// TODO: this needs to be improved to handle readonly
+					// regions correctly
+					if ((styleRange != null) && (previousAttr != null) && (previousAttr.equals(attr))) {
+						styleRange.length += region.getLength();
+					} else {
+						styleRange = createStyleRange(blockedRegion, region, attr, partitionStartOffset, partitionLength);
+						holdResults.add(styleRange);
+						// technically speaking, we don't need to update
+						// previousAttr
+						// in the other case, because the other case is when
+						// it hasn't changed
+						previousAttr = attr;
+					}
+				} else {
+					previousAttr = null;
+				}
+			}
+		}
+		return handled;
+	}
+
+	private boolean prepareTextRegions(IStructuredDocumentRegion structuredDocumentRegion, int partitionStartOffset, int partitionLength, Collection holdResults) {
+		boolean handled = false;
+		final int partitionEndOffset = partitionStartOffset + partitionLength - 1;
+		while (structuredDocumentRegion != null && structuredDocumentRegion.getStartOffset() <= partitionEndOffset) {
+			ITextRegion region = null;
+			ITextRegionList regions = structuredDocumentRegion.getRegions();
+			int nRegions = regions.size();
+			StyleRange styleRange = null;
+			for (int i = 0; i < nRegions; i++) {
+				region = regions.get(i);
+				TextAttribute attr = null;
+				TextAttribute previousAttr = null;
+				if (structuredDocumentRegion.getStartOffset(region) > partitionEndOffset)
+					break;
+				if (structuredDocumentRegion.getEndOffset(region) <= partitionStartOffset)
+					continue;
+
+				if (region instanceof ITextRegionCollection) {
+					boolean handledCollection = (prepareTextRegion((ITextRegionCollection) region, partitionStartOffset, partitionLength, holdResults));
+					handled = (!handled) ? handledCollection : handled;
+				} else {
+
+					attr = getAttributeFor(structuredDocumentRegion, region);
+					if (attr != null) {
+						handled = true;
+						// if this region's attr is the same as previous one,
+						// then just adjust the previous style range
+						// instead of creating a new instance of one
+						// note: to use 'equals' in this case is important,
+						// since sometimes
+						// different instances of attributes are associated
+						// with a region, even the
+						// the attribute has the same values.
+						// TODO: this needs to be improved to handle readonly
+						// regions correctly
+						if ((styleRange != null) && (previousAttr != null) && (previousAttr.equals(attr))) {
+							styleRange.length += region.getLength();
+						} else {
+							styleRange = createStyleRange(structuredDocumentRegion, region, attr, partitionStartOffset, partitionLength);
+							holdResults.add(styleRange);
+							// technically speaking, we don't need to update
+							// previousAttr
+							// in the other case, because the other case is
+							// when it hasn't changed
+							previousAttr = attr;
+						}
+					} else {
+						previousAttr = null;
+					}
+				}
+
+				if (Debug.syntaxHighlighting && !handled) {
+					System.out.println("not handled in prepareRegions"); //$NON-NLS-1$
+				}
+			}
+			structuredDocumentRegion = structuredDocumentRegion.getNext();
+		}
+		return handled;
+	}
+
+	protected void registerPreferenceManager() {
+		IPreferenceStore pref = getColorPreferences();
+		if (pref != null) {
+			pref.addPropertyChangeListener(fPreferenceListener);
+		}
+	}
+
+	public void release() {
+		unRegisterPreferenceManager();
+		if (fTextAttributes != null) {
+			fTextAttributes.clear();
+			fTextAttributes = null;
+		}
+		setInitialized(false);
+	}
+
+	/**
+	 * Sets the initialized.
+	 * 
+	 * @param initialized
+	 *            The initialized to set
+	 */
+	private void setInitialized(boolean initialized) {
+		this.fInitialized = initialized;
+	}
+
+	protected void unRegisterPreferenceManager() {
+		IPreferenceStore pref = getColorPreferences();
+		if (pref != null) {
+			pref.removePropertyChangeListener(fPreferenceListener);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/CompatibleHighlighter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/CompatibleHighlighter.java
new file mode 100644
index 0000000..a54398b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/CompatibleHighlighter.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.swt.custom.LineStyleEvent;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=224209
+ * 
+ * Created to provide compatibility with refreshDisplay() and getTextViewer()
+ * methods on the superclass that might be called by LineStyleProviders.
+ */
+public final class CompatibleHighlighter extends Highlighter {
+
+	private ITextViewer textViewer;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#addProvider(java.lang.String,
+	 *      org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider)
+	 */
+	public void addProvider(String partitionType, LineStyleProvider provider) {
+		super.addProvider(partitionType, provider);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#getTextViewer()
+	 */
+	public ITextViewer getTextViewer() {
+		return super.getTextViewer();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#install(org.eclipse.jface.text.ITextViewer)
+	 */
+	public void install(ITextViewer newTextViewer) {
+		textViewer = newTextViewer;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#lineGetStyle(int,
+	 *      int)
+	 */
+	public StyleRange[] lineGetStyle(int eventLineOffset, int eventLineLength) {
+		return new StyleRange[0];
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#lineGetStyle(org.eclipse.swt.custom.LineStyleEvent)
+	 */
+	public void lineGetStyle(LineStyleEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#refreshDisplay()
+	 */
+	public void refreshDisplay() {
+		if (textViewer != null)
+			textViewer.invalidateTextPresentation();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#refreshDisplay(int,
+	 *      int)
+	 */
+	public void refreshDisplay(int start, int length) {
+		refreshDisplay();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#removeProvider(java.lang.String)
+	 */
+	public void removeProvider(String partitionType) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#setDocument(org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument)
+	 */
+	public void setDocument(IStructuredDocument structuredDocument) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#setDocumentPartitioning(java.lang.String)
+	 */
+	public void setDocumentPartitioning(String partitioning) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter#uninstall()
+	 */
+	public void uninstall() {
+		super.uninstall();
+		textViewer = null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/Highlighter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/Highlighter.java
new file mode 100644
index 0000000..b47107d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/Highlighter.java
@@ -0,0 +1,904 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.custom.LineStyleEvent;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+
+/**
+ * This class is to directly mediate between the Structured Document data
+ * structure and the text widget's text and events. It assumes there only the
+ * model is interested in text events, and all other views will work from that
+ * model. Changes to the text widgets input can cause changes in the model,
+ * which in turn cause changes to the widget's display.
+ * 
+ */
+public class Highlighter implements IHighlighter {
+
+	/**
+	 * A utility class to do various color manipulations
+	 */
+	private class YUV_RGBConverter {
+		/**
+		 * This class "holds" the YUV values corresponding to RGB color
+		 */
+		private class YUV {
+
+			class NormalizedRGB {
+				double blue;
+				double green;
+				private final double maxRGB = 256.0;
+				double red;
+
+				public NormalizedRGB(RGB rgb) {
+					// first normalize to between 0 - 1
+					red = rgb.red / maxRGB;
+					green = rgb.green / maxRGB;
+					blue = rgb.blue / maxRGB;
+
+					red = gammaNormalized(red);
+					green = gammaNormalized(green);
+					blue = gammaNormalized(blue);
+
+				}
+			}
+
+			private NormalizedRGB normalizedRGB;
+
+			private double u = -1;
+			private double v = -1;
+			private double y = -1;
+
+			private YUV() {
+				super();
+			}
+
+			public YUV(double y, double u, double v) {
+				this();
+				this.y = y;
+				this.u = u;
+				this.v = v;
+			}
+
+			public YUV(RGB rgb) {
+				this();
+				normalizedRGB = new NormalizedRGB(rgb);
+				// force calculations
+				getY();
+				getV();
+				getU();
+			}
+
+			/**
+			 * normalize to "average" gamma 2.2222 or 1/0.45
+			 */
+			double gammaNormalized(double colorComponent) {
+				if (colorComponent < 0.018) {
+					return colorComponent * 0.45;
+				}
+				else {
+					return 1.099 * Math.pow(colorComponent, 0.45) - 0.099;
+				}
+			}
+
+			/**
+			 * @return RGB based on original RGB and current YUV values;
+			 */
+			public RGB getRGB() {
+				RGB result = null;
+				double r = getY() + 1.14 * getV();
+				double g = getY() - 0.395 * getU() - 0.58 * getV();
+				double b = getY() + 2.032 * getU();
+
+				int red = (int) (inverseGammaNormalized(r) * 256);
+				int green = (int) (inverseGammaNormalized(g) * 256);
+				int blue = (int) (inverseGammaNormalized(b) * 256);
+				if (red < 0)
+					red = 0;
+				else if (red > 255)
+					red = 255;
+				if (green < 0)
+					green = 0;
+				else if (green > 255)
+					green = 255;
+				if (blue < 0)
+					blue = 0;
+				else if (blue > 255)
+					blue = 255;
+
+				result = new RGB(red, green, blue);
+				return result;
+			}
+
+			public double getU() {
+				if (u == -1) {
+					u = 0.4949 * (normalizedRGB.blue - getY());
+				}
+				return u;
+
+			}
+
+			public double getV() {
+				if (v == -1) {
+					v = 0.877 * (normalizedRGB.red - getY());
+				}
+				return v;
+			}
+
+			public double getY() {
+				if (y == -1) {
+					y = 0.299 * normalizedRGB.red + 0.587 * normalizedRGB.green + 0.114 * normalizedRGB.blue;
+				}
+				return y;
+			}
+
+			double inverseGammaNormalized(double colorComponent) {
+				if (colorComponent < 0.018) {
+					return colorComponent * .222;
+				}
+				else {
+					return Math.pow(((.9099 * colorComponent + 0.09)), 2.22);
+				}
+			}
+
+		}
+
+		public YUV_RGBConverter() {
+			super();
+		}
+
+		public double calculateYComponent(Color targetColor) {
+			return new YUV(targetColor.getRGB()).getY();
+		}
+
+		public RGB transformRGB(RGB originalRGB, double scaleFactor, double target) {
+			RGB transformedRGB = null;
+			// CCIR601 yuv = new CCIR601(originalRGB);
+			YUV yuv = new YUV(originalRGB);
+			double y = yuv.getY();
+			// zero is black, one is white
+			if (y < target) {
+				// is "dark" make lighter
+				y = y + ((target - y) * scaleFactor);
+			}
+			else {
+				// is "light" make darker
+				y = y - ((y - target) * scaleFactor);
+			}
+			// yuv.setY(y);
+			YUV newYUV = new YUV(y, yuv.getU(), yuv.getV());
+			// CCIR601 newYUV = new CCIR601(y, yuv.getCb601(),
+			// yuv.getCr601());
+			transformedRGB = newYUV.getRGB();
+			return transformedRGB;
+		}
+
+		public RGB transformRGBToGrey(RGB originalRGB, double scaleFactor, double target) {
+			RGB transformedRGB = null;
+			// we left the "full" API method signature, but this
+			// version does not take into account originalRGB, though
+			// it might someday.
+			// for now, we'll simply make the new RGB grey, either a little
+			// lighter, or a little darker than background.
+			double y = 0;
+			double mid = 0.5;
+			// zero is black, one is white
+			if (target < mid) {
+				// is "dark" make lighter
+				y = target + scaleFactor;
+			}
+			else {
+				// is "light" make darker
+				y = target - scaleFactor;
+			}
+			int c = (int) Math.round(y * 255);
+			// just to gaurd against mis-use, or scale's values greater
+			// than mid point (and possibly rounding error)
+			if (c > 255)
+				c = 255;
+			if (c < 0)
+				c = 0;
+			transformedRGB = new RGB(c, c, c);
+			return transformedRGB;
+		}
+	}
+
+	private final boolean DEBUG = false;
+	private final StyleRange[] EMPTY_STYLE_RANGE = new StyleRange[0];
+	static final String LINE_STYLE_PROVIDER_EXTENDED_ID = "linestyleprovider"; //$NON-NLS-1$
+	private static final int MAX_NUMBER_STYLES = 500;
+	private static final int LEFT_STYLES_SIZE = 200;
+	private static final int RIGHT_STYLES_SIZE = 200;
+	private static final int MIDDLE_STYLES_SIZE = 1;
+
+	private IPropertyChangeListener fForegroundScaleListener = new IPropertyChangeListener() {
+		public void propertyChange(PropertyChangeEvent event) {
+			if (EditorPreferenceNames.READ_ONLY_FOREGROUND_SCALE.equals(event.getProperty())) {
+				IPreferenceStore editorStore = SSEUIPlugin.getDefault().getPreferenceStore();
+				readOnlyForegroundScaleFactor = editorStore.getInt(EditorPreferenceNames.READ_ONLY_FOREGROUND_SCALE);
+				disposeColorTable();
+				refreshDisplay();
+			}
+		}
+	};
+	private List fHoldStyleResults;
+	private String fPartitioning = IDocumentExtension3.DEFAULT_PARTITIONING;
+
+	private int fSavedLength = -1;
+	private int fSavedOffset = -1;
+	private StyleRange[] fSavedRanges = null;
+
+	private IStructuredDocument fStructuredDocument;
+	private Map fTableOfProviders;
+
+	private Map fExtendedProviders;
+
+	protected final LineStyleProvider NOOP_PROVIDER = new LineStyleProviderForNoOp();
+
+	private double readOnlyBackgroundScaleFactor = 10;
+	private Hashtable readOnlyColorTable;
+	double readOnlyForegroundScaleFactor = 30;
+
+	private YUV_RGBConverter rgbConverter;
+	private ITextViewer textViewer;
+	private StyledText textWidget;
+
+	public Highlighter() {
+		super();
+		
+		// in the 'limitSize' method, we make this strong assumption, so, will check here, 
+		// so if tweaked in future, we'll get a quick reminder. 
+		if (LEFT_STYLES_SIZE + MIDDLE_STYLES_SIZE + RIGHT_STYLES_SIZE > MAX_NUMBER_STYLES) {
+			throw new IllegalStateException("Highligher constants are not defined correctly"); //$NON-NLS-1$
+		}
+	}
+
+	protected void addEmptyRange(int start, int length, Collection holdResults) {
+		StyleRange result = new StyleRange();
+		result.start = start;
+		result.length = length;
+		holdResults.add(result);
+	}
+
+	/**
+	 * Registers a given line style provider for a particular partition type.
+	 * If there is already a line style provider registered for this type, the
+	 * new line style provider is registered instead of the old one.
+	 * 
+	 * @param partitionType
+	 *            the partition type under which to register
+	 * @param the
+	 *            line style provider to register, or <code>null</code> to
+	 *            remove an existing one
+	 */
+	public void addProvider(String partitionType, LineStyleProvider provider) {
+		getTableOfProviders().put(partitionType, provider);
+	}
+
+	/**
+	 * Adjust the style ranges' start and length so that they refer to the
+	 * textviewer widget's range instead of the textviewer's document range.
+	 * 
+	 * @param ranges
+	 * @param adjustment
+	 */
+	protected void adjust(StyleRange[] ranges, int adjustment) {
+		ITextViewer viewer = getTextViewer();
+
+		if (adjustment != 0) {
+			// just use the adjustment value
+			// convert document regions back to widget regions
+			for (int i = 0; i < ranges.length; i++) {
+				// just adjust the range using the given adjustment
+				ranges[i].start += adjustment;
+			}
+		}
+		else if (viewer instanceof ITextViewerExtension5) {
+			// use ITextViewerExtension5
+			ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
+
+			// convert document regions back to widget regions
+			for (int i = 0; i < ranges.length; i++) {
+				// get document range, taking into account folding
+				// regions in viewer
+				IRegion region = extension.modelRange2WidgetRange(new Region(ranges[i].start, ranges[i].length));
+				if (region != null) {
+					ranges[i].start = region.getOffset();
+					ranges[i].length = region.getLength();
+				} // else what happens if region is not found?!
+			}
+		}
+	}
+
+
+	/**
+	 * @deprecated - Read Only areas have unchanged background colors
+	 */
+	void adjustBackground(StyleRange styleRange) {
+		RGB oldRGB = null;
+		Color oldColor = styleRange.background;
+		if (oldColor == null) {
+			oldColor = getTextWidget().getBackground();
+		}
+		oldRGB = oldColor.getRGB();
+		Color newColor = getCachedColorFor(oldRGB);
+		if (newColor == null) {
+			double target = getRGBConverter().calculateYComponent(oldColor);
+			// if background is "light" make it darker, and vice versa
+			if (target < 0.5)
+				target = 1.0;
+			else
+				target = 0.0;
+			RGB newRGB = getRGBConverter().transformRGB(oldRGB, readOnlyBackgroundScaleFactor / 100.0, target);
+
+			cacheColor(oldRGB, newRGB);
+			newColor = getCachedColorFor(oldRGB);
+		}
+		styleRange.background = newColor;
+	}
+
+	private void adjustForeground(StyleRange styleRange) {
+		RGB oldRGB = null;
+		// Color oldColor = styleRange.foreground;
+		Color oldColor = styleRange.background;
+		if (oldColor == null) {
+			// oldRGB = getTextWidget().getForeground().getRGB();
+			oldColor = getTextWidget().getBackground();
+			oldRGB = oldColor.getRGB();
+		}
+		else {
+			oldRGB = oldColor.getRGB();
+		}
+		Color newColor = getCachedColorFor(oldRGB);
+		if (newColor == null) {
+			// make text "closer to" background lumanence
+			double target = getRGBConverter().calculateYComponent(oldColor);
+			RGB newRGB = getRGBConverter().transformRGBToGrey(oldRGB, readOnlyForegroundScaleFactor / 100.0, target);
+
+			// save conversion, so calculations only need to be done once
+			cacheColor(oldRGB, newRGB);
+			newColor = getCachedColorFor(oldRGB);
+		}
+		styleRange.foreground = newColor;
+	}
+
+	/**
+	 * Cache read-only color.
+	 * 
+	 * @param oldRGB
+	 * @param newColor
+	 */
+	private void cacheColor(RGB oldRGB, RGB newColor) {
+		if (readOnlyColorTable == null) {
+			readOnlyColorTable = new Hashtable();
+		}
+		readOnlyColorTable.put(oldRGB, newColor);
+	}
+
+	/**
+	 * @param result
+	 * @return
+	 */
+	private StyleRange[] convertReadOnlyRegions(StyleRange[] result, int start, int length) {
+		IStructuredDocument structuredDocument = getDocument();
+
+		/**
+		 * (dmw) For client/provider simplicity (and consistent look and feel)
+		 * we'll handle readonly regions in one spot, here in the Highlighter.
+		 * Currently it is a fair assumption that each readonly region will be
+		 * on an ITextRegion boundary, so we combine consecutive styles when
+		 * found to be equivalent. Plus, for now, we'll just adjust
+		 * foreground. Eventually will use a "dimming" algrorithm to adjust
+		 * color's satuation/brightness.
+		 */
+		if (structuredDocument.containsReadOnly(start, length)) {
+			// something is read-only in the line, so go through each style,
+			// and adjust
+			for (int i = 0; i < result.length; i++) {
+				StyleRange styleRange = result[i];
+				if (structuredDocument.containsReadOnly(styleRange.start, styleRange.length)) {
+					adjustForeground(styleRange);
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Clear out the readOnlyColorTable
+	 */
+	void disposeColorTable() {
+		if (readOnlyColorTable != null) {
+			readOnlyColorTable.clear();
+		}
+		readOnlyColorTable = null;
+	}
+
+	/**
+	 * This method is just to get existing read-only colors.
+	 */
+	private Color getCachedColorFor(RGB oldRGB) {
+		Color result = null;
+
+		if (readOnlyColorTable != null) {
+			RGB readOnlyRGB = (RGB) readOnlyColorTable.get(oldRGB);
+			result = EditorUtility.getColor(readOnlyRGB);
+		}
+
+		return result;
+	}
+
+	protected IStructuredDocument getDocument() {
+		return fStructuredDocument;
+	}
+
+	/**
+	 * Adjust the given widget offset and length so that they are the
+	 * textviewer document's offset and length, taking into account what is
+	 * actually visible in the document.
+	 * 
+	 * @param offset
+	 * @param length
+	 * @return a region containing the offset and length within the
+	 *         textviewer's document or null if the offset is not within the
+	 *         document
+	 */
+	private IRegion getDocumentRangeFromWidgetRange(int offset, int length) {
+		IRegion styleRegion = null;
+		ITextViewer viewer = getTextViewer();
+		if (viewer instanceof ITextViewerExtension5) {
+			// get document range, taking into account folding regions in
+			// viewer
+			ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
+			styleRegion = extension.widgetRange2ModelRange(new Region(offset, length));
+		}
+		else {
+			// get document range, taking into account viewer visible region
+			// get visible region in viewer
+			IRegion vr = null;
+			if (viewer != null)
+				vr = viewer.getVisibleRegion();
+			else
+				vr = new Region(0, getDocument().getLength());
+
+			// if offset is not within visible region, then we don't really
+			// care
+			if (offset <= vr.getLength()) {
+				// Adjust the offset to be within visible region
+				styleRegion = new Region(offset + vr.getOffset(), length);
+			}
+		}
+		return styleRegion;
+	}
+
+
+	private Map getExtendedProviders() {
+		if (fExtendedProviders == null) {
+			fExtendedProviders = new HashMap(3);
+		}
+		return fExtendedProviders;
+	}
+
+	/**
+	 * Method getProviderFor.
+	 * 
+	 * @param typedRegion
+	 * @return LineStyleProvider
+	 */
+	private LineStyleProvider getProviderFor(ITypedRegion typedRegion) {
+		String type = typedRegion.getType();
+		LineStyleProvider result = (LineStyleProvider) fTableOfProviders.get(type);
+		if (result == null) {
+			// NOT YET FINALIZED - DO NOT CONSIDER AS API
+			synchronized (getExtendedProviders()) {
+				if (!getExtendedProviders().containsKey(type)) {
+					LineStyleProvider provider = (LineStyleProvider) ExtendedConfigurationBuilder.getInstance().getConfiguration(LINE_STYLE_PROVIDER_EXTENDED_ID, type);
+					getExtendedProviders().put(type, provider);
+					if (provider != null) {
+						provider.init(getDocument(), this);
+					}
+					result = provider;
+				}
+				else {
+					result = (LineStyleProvider) getExtendedProviders().get(type);
+				}
+			}
+		}
+		if (result == null) {
+			result = NOOP_PROVIDER;
+		}
+		return result;
+	}
+
+	private YUV_RGBConverter getRGBConverter() {
+		if (rgbConverter == null) {
+			rgbConverter = new YUV_RGBConverter();
+		}
+		return rgbConverter;
+	}
+
+	private Map getTableOfProviders() {
+		if (fTableOfProviders == null) {
+			fTableOfProviders = new HashMap();
+		}
+		return fTableOfProviders;
+	}
+
+	/**
+	 * Returns the textViewer.
+	 * 
+	 * @return ITextViewer
+	 */
+	public ITextViewer getTextViewer() {
+		return textViewer;
+	}
+
+	/**
+	 * @return
+	 */
+	protected StyledText getTextWidget() {
+		return textWidget;
+	}
+
+	/**
+	 * Installs highlighter support on the given text viewer.
+	 * 
+	 * @param textViewer
+	 *            the text viewer on which content assist will work
+	 */
+	public void install(ITextViewer newTextViewer) {
+		this.textViewer = newTextViewer;
+
+		IPreferenceStore editorStore = SSEUIPlugin.getDefault().getPreferenceStore();
+		editorStore.addPropertyChangeListener(fForegroundScaleListener);
+		readOnlyForegroundScaleFactor = editorStore.getInt(EditorPreferenceNames.READ_ONLY_FOREGROUND_SCALE);
+
+		if (textWidget != null) {
+			textWidget.removeLineStyleListener(this);
+		}
+		textWidget = newTextViewer.getTextWidget();
+		if (textWidget != null) {
+			textWidget.addLineStyleListener(this);
+		}
+
+		refreshDisplay();
+	}
+
+	public StyleRange[] lineGetStyle(int eventLineOffset, int eventLineLength) {
+		StyleRange[] eventStyles = EMPTY_STYLE_RANGE;
+		try {
+			if (getDocument() == null || eventLineLength == 0) {
+				// getDocument() == null
+				// during initialization, this is sometimes called before our
+				// structured
+				// is set, in which case we set styles to be the empty style
+				// range
+				// (event.styles can not be null)
+
+				// eventLineLength == 0
+				// we sometimes get odd requests from the very last CRLF in
+				// the
+				// document
+				// it has no length, and there is no node for it!
+				eventStyles = EMPTY_STYLE_RANGE;
+			}
+			else {
+				/*
+				 * LineStyleProviders work using absolute document offsets. To
+				 * support visible regions, adjust the requested range up to
+				 * the full document offsets.
+				 */
+				IRegion styleRegion = getDocumentRangeFromWidgetRange(eventLineOffset, eventLineLength);
+				if (styleRegion != null) {
+					int start = styleRegion.getOffset();
+					int length = styleRegion.getLength();
+
+					ITypedRegion[] partitions = TextUtilities.computePartitioning(getDocument(), fPartitioning, start, length, false);
+					eventStyles = prepareStyleRangesArray(partitions, start, length);
+
+					/*
+					 * If there is a subtext offset, the style ranges must be
+					 * adjusted to the expected offsets just check if
+					 * eventLineOffset is different than start then adjust,
+					 * otherwise u can leave it alone unless there is special
+					 * handling for itextviewerextension5?
+					 */
+					if (start != eventLineOffset) {
+						int offset = 0;
+						// figure out visible region to use for adjustment
+						// only adjust if need to
+						if (!(getTextViewer() instanceof ITextViewerExtension5)) {
+							IRegion vr = getTextViewer().getVisibleRegion();
+							if (vr != null) {
+								offset = vr.getOffset();
+							}
+						}
+						adjust(eventStyles, -offset);
+					}
+
+					eventStyles = limitSize(eventStyles);
+					
+					// for debugging only
+					if (DEBUG) {
+						if (!valid(eventStyles, eventLineOffset, eventLineLength)) {
+							Logger.log(Logger.WARNING, "Highlighter::lineGetStyle found invalid styles at offset " + eventLineOffset); //$NON-NLS-1$
+						}
+					}
+				}
+
+			}
+
+		}
+		catch (Exception e) {
+			// if ANY exception occurs during highlighting,
+			// just return "no highlighting"
+			eventStyles = EMPTY_STYLE_RANGE;
+			if (Debug.syntaxHighlighting) {
+				System.out.println("Exception during highlighting!"); //$NON-NLS-1$
+			}
+		}
+
+		return eventStyles;
+	}
+
+	/**
+	 * This method is to centralize the logic in limiting the overall number of style ranges
+	 * that make it to the styled text widget. 
+	 * 
+	 * Too many styles sent to StyledText results in apparent, but not real, 
+	 * hangs of Eclipse Display thread. See  
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=108806
+	 * 
+	 * @param eventStyles
+	 * @return
+	 */
+	 private StyleRange[] limitSize(StyleRange[] eventStyles) {
+		
+		// quick return with same object if not modification needed
+		if (eventStyles.length < MAX_NUMBER_STYLES) {
+			return eventStyles;
+		}
+		else {
+			// we could just take the easy way out and truncate, but will 
+			// be much better appearing if both the start of the line and the 
+			// end of the line are displayed with styles. Since these are both
+			// the parts of the line a user is likely to look at. The middle of the 
+			// line will still be "plain". Presumably, the user would re-format the 
+			// file to avoid long lines, so unlikely to see the middle. 
+			StyleRange[] newRanges = new StyleRange[LEFT_STYLES_SIZE + RIGHT_STYLES_SIZE + MIDDLE_STYLES_SIZE]; 
+			System.arraycopy(eventStyles, 0, newRanges, 0, LEFT_STYLES_SIZE);
+			//
+			// do end, before we do middle
+			System.arraycopy(eventStyles, eventStyles.length-RIGHT_STYLES_SIZE, newRanges, LEFT_STYLES_SIZE + MIDDLE_STYLES_SIZE, RIGHT_STYLES_SIZE);
+			//
+			// technically, we should compute the exact middle as one big style range, 
+			// with default colors and styles, so if someone does actually type or work with 
+			// documnet as is, will still be correct. 
+			//
+			StyleRange allBlank = new StyleRange();
+			StyleRange lastKnown = newRanges[LEFT_STYLES_SIZE - 1];
+			allBlank.start = lastKnown.start + lastKnown.length;
+			StyleRange nextKnown = newRanges[LEFT_STYLES_SIZE + MIDDLE_STYLES_SIZE + 1];
+			allBlank.length = nextKnown.start - allBlank.start;
+			newRanges[LEFT_STYLES_SIZE] = allBlank;
+			return newRanges;
+		}
+	}
+
+	/**
+	 * A passthrough method that extracts relevant data from the
+	 * LineStyleEvent and passes it along. This method was separated for
+	 * performance testing purposes.
+	 * 
+	 * @see org.eclipse.swt.custom.LineStyleListener#lineGetStyle(LineStyleEvent)
+	 */
+	public void lineGetStyle(LineStyleEvent event) {
+		int offset = event.lineOffset;
+		int length = event.lineText.length();
+
+		/*
+		 * For some reason, we are sometimes asked for the same style range
+		 * over and over again. This was found to happen during 'revert' of a
+		 * file with one line in it that is 40K long! So, while we don't know
+		 * root cause, caching the styled ranges in case the exact same
+		 * request is made multiple times seems like cheap insurance.
+		 */
+		if (offset == fSavedOffset && length == fSavedLength && fSavedRanges != null) {
+			event.styles = fSavedRanges;
+		}
+		else {
+			// need to assign this array here, or else the field won't get
+			// updated
+			event.styles = lineGetStyle(offset, length);
+			// now saved "cached data" for repeated requests which are exaclty
+			// same
+			fSavedOffset = offset;
+			fSavedLength = length;
+			fSavedRanges = event.styles;
+		}
+	}
+
+	/**
+	 * Note: its very important this method never return null, which is why
+	 * the final null check is in a finally clause
+	 */
+
+	protected StyleRange[] prepareStyleRangesArray(ITypedRegion[] partitions, int start, int length) {
+
+		StyleRange[] result = EMPTY_STYLE_RANGE;
+
+		if (fHoldStyleResults == null) {
+			fHoldStyleResults = new ArrayList(partitions.length);
+		}
+		else {
+			fHoldStyleResults.clear();
+		}
+
+		// TODO: make some of these instance variables to prevent creation on
+		// stack
+		LineStyleProvider currentLineStyleProvider = null;
+		boolean handled = false;
+		for (int i = 0; i < partitions.length; i++) {
+			ITypedRegion currentPartition = partitions[i];
+			currentLineStyleProvider = getProviderFor(currentPartition);
+			currentLineStyleProvider.init(getDocument(), this);
+			handled = currentLineStyleProvider.prepareRegions(currentPartition, currentPartition.getOffset(), currentPartition.getLength(), fHoldStyleResults);
+			if (Debug.syntaxHighlighting && !handled) {
+				System.out.println("Did not handle highlighting in Highlighter inner while"); //$NON-NLS-1$
+			}
+		}
+
+		int resultSize = fHoldStyleResults.size();
+		if (resultSize > 0) {
+			result = (StyleRange[]) fHoldStyleResults.toArray(new StyleRange[fHoldStyleResults.size()]);
+		}
+		else {
+			result = EMPTY_STYLE_RANGE;
+		}
+		result = convertReadOnlyRegions(result, start, length);
+		return result;
+	}
+
+	public void refreshDisplay() {
+		if (textWidget != null && !textWidget.isDisposed())
+			textWidget.redraw();
+	}
+
+	/**
+	 */
+	public void refreshDisplay(int start, int length) {
+		if (textWidget != null && !textWidget.isDisposed())
+			textWidget.redrawRange(start, length, true);
+	}
+
+	public void removeProvider(String partitionType) {
+		getTableOfProviders().remove(partitionType);
+	}
+
+	public void setDocument(IStructuredDocument structuredDocument) {
+		fStructuredDocument = structuredDocument;
+	}
+
+	public void setDocumentPartitioning(String partitioning) {
+		if (partitioning != null) {
+			fPartitioning = partitioning;
+		}
+		else {
+			fPartitioning = IDocumentExtension3.DEFAULT_PARTITIONING;
+		}
+	}
+
+	/**
+	 * Uninstalls highlighter support from the text viewer it has previously
+	 * be installed on.
+	 */
+	public void uninstall() {
+		if (textWidget != null && !textWidget.isDisposed()) {
+			textWidget.removeLineStyleListener(this);
+		}
+		textWidget = null;
+
+		Collection providers = getTableOfProviders().values();
+		Iterator iterator = providers.iterator();
+		while (iterator.hasNext()) {
+			LineStyleProvider lineStyleProvider = (LineStyleProvider) iterator.next();
+			lineStyleProvider.release();
+			// this remove probably isn't strictly needed, since
+			// typically highlighter instance as a whole will go
+			// away ... but in case that ever changes, this seems like
+			// a better style.
+			iterator.remove();
+		}
+
+		synchronized (getExtendedProviders()) {
+			providers = new ArrayList(getExtendedProviders().values());
+			getExtendedProviders().clear();
+		}
+		iterator = providers.iterator();
+		while (iterator.hasNext()) {
+			LineStyleProvider lineStyleProvider = (LineStyleProvider) iterator.next();
+			if (lineStyleProvider != null) {
+				lineStyleProvider.release();
+				iterator.remove();
+			}
+		}
+
+		IPreferenceStore editorStore = SSEUIPlugin.getDefault().getPreferenceStore();
+		editorStore.removePropertyChangeListener(fForegroundScaleListener);
+		disposeColorTable();
+
+		// clear out cached variables (d282894)
+		fSavedOffset = -1;
+		fSavedLength = -1;
+		fSavedRanges = null;
+	}
+
+	/**
+	 * Purely a debugging aide.
+	 */
+	private boolean valid(StyleRange[] eventStyles, int startOffset, int lineLength) {
+		boolean result = false;
+		if (eventStyles != null) {
+			if (eventStyles.length > 0) {
+				StyleRange first = eventStyles[0];
+				StyleRange last = eventStyles[eventStyles.length - 1];
+				if (startOffset > first.start) {
+					result = false;
+				}
+				else {
+					int lineEndOffset = startOffset + lineLength;
+					int lastOffset = last.start + last.length;
+					if (lastOffset > lineEndOffset) {
+						result = false;
+					}
+					else {
+						result = true;
+					}
+				}
+			}
+			else {
+				// a zero length array is ok
+				result = true;
+			}
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/IHighlighter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/IHighlighter.java
new file mode 100644
index 0000000..caf37d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/IHighlighter.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.swt.custom.LineStyleListener;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * @author davidw
+ * 
+ */
+public interface IHighlighter extends LineStyleListener {
+	void addProvider(String partitionType, LineStyleProvider provider);
+
+	void install(ITextViewer viewer);
+
+	void removeProvider(String partitionType);
+
+	void setDocument(IStructuredDocument structuredDocument);
+	
+	void uninstall();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/LineStyleProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/LineStyleProvider.java
new file mode 100644
index 0000000..ff81827
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/LineStyleProvider.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+import java.util.Collection;
+
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * This interface is not intended to be implemented by clients. Clients
+ * should instead subclass AbstractLineStyleProvider
+ *
+ */
+public interface LineStyleProvider {
+
+	/**
+	 * Initializes this provider for the given Highlighter and document. This
+	 * method will be called at least once before prepareRegions is called.
+	 * 
+	 * @param document
+	 * @param highlighter
+	 */
+	void init(IStructuredDocument document, Highlighter highlighter);
+
+	/**
+	 * Optionally appends StyleRanges to the styleRanges Collection, in order,
+	 * and only covering the given range within the document. StyleRanges added
+	 * to the collection should not expand outside of the range of the currentRegion
+	 * ITypedRegion.
+	 * 
+	 * @param currentRegion -
+	 *            the current document partition
+	 * @param start
+	 * @param length
+	 * @param styleRanges
+	 * @return whether this LineStyleProvider handled the request; handling
+	 *         includes not adding StyleRanges if that is still the correct
+	 *         behavior
+	 */
+	boolean prepareRegions(ITypedRegion currentRegion, int start, int length, Collection styleRanges);
+
+	/**
+	 * Instructs this provider to free up any "resources" it might be holding
+	 * on to (such as listening for preference changes). It is only called
+	 * once in the lifetime of this provider.
+	 */
+	void release();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/LineStyleProviderForNoOp.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/LineStyleProviderForNoOp.java
new file mode 100644
index 0000000..3d60929
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/LineStyleProviderForNoOp.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+
+
+import java.util.Collection;
+
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * This class can be used by default, if no attribute provider is found for a
+ * certain region type. Its probably an error in a factory somewhere if an
+ * adapter is not found, but this class allows the logic to proceed basically
+ * simply providing default colored syntax highlighting.
+ * 
+ * Not to be subclassed.
+ */
+final public class LineStyleProviderForNoOp implements LineStyleProvider {
+
+	public void init(IStructuredDocument document, Highlighter highlighter) {
+		// nothing to do
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.style.AbstractLineStyleProvider#prepareRegions(org.eclipse.jface.text.ITypedRegion,
+	 *      int, int, java.util.Collection)
+	 */
+	public boolean prepareRegions(ITypedRegion currentRegion, int start, int length, Collection holdResults) {
+		// add nothing, but say handled.
+		return true;
+	}
+
+	public void release() {
+		// nothing to do
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/ReconcilerHighlighter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/ReconcilerHighlighter.java
new file mode 100644
index 0000000..1a39d4b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/ReconcilerHighlighter.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+public class ReconcilerHighlighter {
+
+	private static final String LINE_STYLE_PROVIDER_EXTENDED_ID = Highlighter.LINE_STYLE_PROVIDER_EXTENDED_ID;
+
+	private Map fTableOfProviders = null;
+
+	private Map fExtendedProviders = null;
+
+	private ITextViewer fTextViewer = null;
+
+	private final static boolean _trace = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/structuredPresentationReconciler")).booleanValue(); //$NON-NLS-1$
+	private final static String TRACE_PREFIX = "StructuredPresentationReconciler: "; //$NON-NLS-1$
+	private long time0;
+
+	/**
+	 * instance for older LineStyleProviders loaded by extension point,
+	 * created if needed
+	 */
+	private CompatibleHighlighter fCompatibleHighlighter = null;
+
+	public void refreshDisplay() {
+		if (_trace) {
+			time0 = System.currentTimeMillis();
+		}
+		if (fTextViewer != null)
+			fTextViewer.invalidateTextPresentation();
+		if (_trace) {
+			System.out.println(TRACE_PREFIX + "ReconcilerHighlighter refreshDisplay took " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.flush();
+		}
+	}
+
+	/**
+	 * Registers a given line style provider for a particular partition type.
+	 * If there is already a line style provider registered for this type, the
+	 * new line style provider is registered instead of the old one.
+	 * 
+	 * @param partitionType
+	 *            the partition type under which to register
+	 * @param the
+	 *            line style provider to register, or <code>null</code> to
+	 *            remove an existing one
+	 */
+	public void addProvider(String partitionType, LineStyleProvider provider) {
+		getTableOfProviders().put(partitionType, provider);
+	}
+
+	public void removeProvider(String partitionType) {
+		getTableOfProviders().remove(partitionType);
+	}
+
+	public LineStyleProvider getProvider(String partitionType) {
+		LineStyleProvider result = (LineStyleProvider) getTableOfProviders().get(partitionType);
+
+		// The provider was not within the default set of providers. Use the
+		// extended configuration
+		// to look up additional providers
+		if (result == null) {
+			// NOT YET FINALIZED - DO NOT CONSIDER AS API
+			synchronized (getExtendedProviders()) {
+				if (!getExtendedProviders().containsKey(partitionType)) {
+					result = (LineStyleProvider) ExtendedConfigurationBuilder.getInstance().getConfiguration(LINE_STYLE_PROVIDER_EXTENDED_ID, partitionType);
+					getExtendedProviders().put(partitionType, result);
+
+					if (result != null && fTextViewer != null && fTextViewer.getDocument() instanceof IStructuredDocument) {
+						if (result instanceof AbstractLineStyleProvider) {
+							((AbstractLineStyleProvider) result).init((IStructuredDocument) fTextViewer.getDocument(), this);
+						}
+						else {
+							Logger.log(Logger.INFO_DEBUG, "CompatibleHighlighter installing compatibility for " + result.getClass()); //$NON-NLS-1$
+							if (fCompatibleHighlighter == null) {
+								fCompatibleHighlighter = new CompatibleHighlighter();
+								fCompatibleHighlighter.install(fTextViewer);
+							}
+							result.init((IStructuredDocument) fTextViewer.getDocument(), fCompatibleHighlighter);
+						}
+					}
+				}
+				else {
+					result = (LineStyleProvider) getExtendedProviders().get(partitionType);
+				}
+			}
+		}
+		return result;
+	}
+
+	private Map getTableOfProviders() {
+		if (fTableOfProviders == null) {
+			fTableOfProviders = new HashMap();
+		}
+		return fTableOfProviders;
+	}
+
+	private Map getExtendedProviders() {
+		if (fExtendedProviders == null) {
+			fExtendedProviders = new HashMap(3);
+		}
+		return fExtendedProviders;
+	}
+
+	public void install(ITextViewer textViewer) {
+		fTextViewer = textViewer;
+		if (fCompatibleHighlighter != null) {
+			fCompatibleHighlighter.uninstall();
+			fCompatibleHighlighter.install(fTextViewer);
+		}
+		refreshDisplay();
+	}
+
+	public void uninstall() {
+		Iterator it = getTableOfProviders().values().iterator();
+
+		while (it.hasNext()) {
+			LineStyleProvider provider = (LineStyleProvider) it.next();
+			if (provider != null)
+				provider.release();
+		}
+
+		it = getExtendedProviders().values().iterator();
+		while (it.hasNext()) {
+			LineStyleProvider provider = (LineStyleProvider) it.next();
+			if (provider != null)
+				provider.release();
+		}
+
+		getTableOfProviders().clear();
+		getExtendedProviders().clear();
+		fTableOfProviders = null;
+		if (fCompatibleHighlighter != null) {
+			fCompatibleHighlighter.uninstall();
+		}
+		fTextViewer = null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
new file mode 100644
index 0000000..1001ad5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
@@ -0,0 +1,934 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.provisional.style;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.DefaultPositionUpdater;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.DocumentPartitioningChangedEvent;
+import org.eclipse.jface.text.DocumentRewriteSessionEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IDocumentPartitioningListener;
+import org.eclipse.jface.text.IDocumentPartitioningListenerExtension;
+import org.eclipse.jface.text.IDocumentPartitioningListenerExtension2;
+import org.eclipse.jface.text.IDocumentRewriteSessionListener;
+import org.eclipse.jface.text.IPositionUpdater;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.TypedPosition;
+import org.eclipse.jface.text.presentation.IPresentationDamager;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.IPresentationReconcilerExtension;
+import org.eclipse.jface.text.presentation.IPresentationRepairer;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
+import org.eclipse.wst.sse.core.internal.provisional.events.NewDocumentEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;
+import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+
+public class StructuredPresentationReconciler implements IPresentationReconciler, IPresentationReconcilerExtension {
+
+	/** Prefix of the name of the position category for tracking damage regions. */
+	final static String TRACKED_PARTITION= "__reconciler_tracked_partition"; //$NON-NLS-1$
+	
+	private final static boolean _trace = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/structuredPresentationReconciler")).booleanValue(); //$NON-NLS-1$
+	private final static boolean _traceTime = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/structuredPresentationReconciler/time")).booleanValue(); //$NON-NLS-1$
+	private static final String TRACE_PREFIX = "StructuredPresentationReconciler: ";
+	private long time0;
+	private long time1;
+
+	/**
+	 * Internal listener class.
+	 */
+	class InternalListener implements
+			ITextInputListener, IDocumentListener, ITextListener, IStructuredDocumentListener,
+			IDocumentPartitioningListener, IDocumentPartitioningListenerExtension, IDocumentPartitioningListenerExtension2, IDocumentRewriteSessionListener {
+
+		/** Set to <code>true</code> if between a document about to be changed and a changed event. */
+		private boolean fDocumentChanging= false;
+		
+		/** Flag for the document being in a rewrite session */
+		private boolean fInRewriteSession = false;
+		
+		/** Flag for some kind of changes being applied during a document rewrite session */
+		private boolean fHasIncomingChanges = false;
+		
+		/**
+		 * The cached redraw state of the text viewer.
+		 * @since 3.0
+		 */
+		private boolean fCachedRedrawState= true;
+
+		public void newModel(NewDocumentEvent structuredDocumentEvent) {
+			if(fInRewriteSession) {
+				fHasIncomingChanges = true;
+				return;
+			}
+			if (_trace) {
+				time1 = System.currentTimeMillis();
+			}
+			int length = structuredDocumentEvent.getLength();
+			recordDamage(new Region(0, length), structuredDocumentEvent.getDocument());
+			if (_trace) {
+				System.out.println("\n" + TRACE_PREFIX + "calculated damage for NewDocumentEvent: (length=" + length + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+				System.out.flush();
+			}
+			if (_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "calculated damage for NewDocumentEvent in " + (System.currentTimeMillis()-time1) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+				System.out.flush();
+			}
+		}
+
+		public void noChange(NoChangeEvent structuredDocumentEvent) {
+			if(fInRewriteSession) {
+				fHasIncomingChanges = true;
+				return;
+			}
+			if (_trace) {
+				time1 = System.currentTimeMillis();
+			}
+			if (structuredDocumentEvent.reason == NoChangeEvent.NO_CONTENT_CHANGE ) {
+				IRegion damage = new Region(structuredDocumentEvent.fOffset, structuredDocumentEvent.fLength);
+				recordDamage(damage, structuredDocumentEvent.fDocument);
+			}
+			if (_trace && _traceTime) {
+				System.out.println("\n" + TRACE_PREFIX + "calculated damage for NoChangeEvent in " + (System.currentTimeMillis()-time1) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+				System.out.flush();
+			}
+		}
+
+		public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {
+			if(fInRewriteSession) {
+				fHasIncomingChanges = true;
+				return;
+			}
+			if (_trace) {
+				time1 = System.currentTimeMillis();
+			}
+			IRegion damage;
+			IStructuredDocumentRegionList newDocumentRegions = structuredDocumentEvent.getNewStructuredDocumentRegions();
+			if (newDocumentRegions.getLength() > 0) {
+				int startOffset = newDocumentRegions.item(0).getStartOffset();
+				int length = newDocumentRegions.item(newDocumentRegions.getLength() - 1).getEndOffset() - startOffset;
+				damage = new Region(startOffset, length);
+
+			}
+			else {
+				damage = new Region(structuredDocumentEvent.fOffset, structuredDocumentEvent.getLength());
+			}
+			recordDamage(damage, structuredDocumentEvent.fDocument);
+			if (_trace) {
+				System.out.println("\n" + TRACE_PREFIX + "calculated damage for StructuredDocumentRegionsReplacedEvent: [" + damage.getOffset() + ":" + damage.getLength() + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
+				System.out.flush();
+			}
+			if (_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "calculated damage for StructuredDocumentRegionsReplacedEvent in " + (System.currentTimeMillis()-time1) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+				System.out.flush();
+			}
+		}
+
+		public void regionChanged(RegionChangedEvent structuredDocumentEvent) {
+			if(fInRewriteSession) {
+				fHasIncomingChanges = true;
+				return;
+			}
+			if (_trace) {
+				time1 = System.currentTimeMillis();
+			}
+			IStructuredDocumentRegion documentRegion = structuredDocumentEvent.getStructuredDocumentRegion();
+			ITextRegion changedRegion = structuredDocumentEvent.getRegion();
+			int startOffset = documentRegion.getStartOffset(changedRegion);
+			int length = changedRegion.getLength();
+			IRegion damage = new Region(startOffset, length);
+
+			recordDamage(damage, structuredDocumentEvent.fDocument);
+			if (_trace) {
+				System.out.println("\n" + TRACE_PREFIX + "calculated damage for RegionChangedEvent: [" + damage.getOffset() + ":" + damage.getLength() + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
+				System.out.flush();
+			}
+			if (_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "calculated damage for RegionChangedEvent in " + (System.currentTimeMillis()-time1) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+				System.out.flush();
+			}
+		}
+
+		public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {
+			if(fInRewriteSession) {
+				fHasIncomingChanges = true;
+				return;
+			}
+			if (_trace) {
+				time1 = System.currentTimeMillis();
+			}
+			IRegion damage;
+			IStructuredDocumentRegion documentRegion = structuredDocumentEvent.getStructuredDocumentRegion();
+			ITextRegionList newRegions = structuredDocumentEvent.getNewRegions();
+			if (newRegions.size() > 0) {
+				ITextRegion firstChangedRegion = newRegions.get(0);
+				ITextRegion lastChangedRegion = newRegions.get(newRegions.size() - 1);
+				int startOffset = documentRegion.getStartOffset(firstChangedRegion);
+				int length = documentRegion.getEndOffset(lastChangedRegion) - startOffset;
+				damage = new Region(startOffset, length);
+			}
+			else {
+				damage = new Region(documentRegion.getStartOffset(), documentRegion.getLength());
+			}
+			recordDamage(damage, structuredDocumentEvent.fDocument);
+			if (_trace) {
+				System.out.println("\n" + TRACE_PREFIX + "calculated damage for RegionsReplacedEvent: [" + damage.getOffset() + ":" + damage.getLength() + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
+				System.out.flush();
+			}
+			if (_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "calculated damage for RegionsReplacedEvent in " + (System.currentTimeMillis()-time1) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+				System.out.flush();
+			}
+		}
+		
+		/*
+		 * @see ITextInputListener#inputDocumentAboutToBeChanged(IDocument, IDocument)
+		 */
+		public void inputDocumentAboutToBeChanged(IDocument oldDocument, IDocument newDocument) {
+			if (oldDocument != null) {
+				try {
+
+					fViewer.removeTextListener(this);
+					oldDocument.removeDocumentListener(this);
+					oldDocument.removeDocumentPartitioningListener(this);
+					if (oldDocument instanceof IStructuredDocument) {
+						((IStructuredDocument) oldDocument).removeDocumentChangedListener(this);
+					}
+
+					oldDocument.removePositionUpdater(fPositionUpdater);
+					oldDocument.removePositionCategory(fPositionCategory);
+
+				} catch (BadPositionCategoryException x) {
+					// should not happened for former input documents;
+				}
+			}
+		}
+
+		/*
+		 * @see ITextInputListener#inputDocumenChanged(IDocument, IDocument)
+		 */
+		public void inputDocumentChanged(IDocument oldDocument, IDocument newDocument) {
+			if (_trace || _traceTime) {
+				time1 = System.currentTimeMillis();
+			}
+
+			fDocumentChanging= false;
+			fCachedRedrawState= true;
+
+			if (newDocument != null) {
+				newDocument.addPositionCategory(fPositionCategory);
+				newDocument.addPositionUpdater(fPositionUpdater);
+
+				if (newDocument instanceof IStructuredDocument) {
+					newDocument.addDocumentPartitioningListener(this);
+					newDocument.addDocumentListener(this);
+					((IStructuredDocument)newDocument).addDocumentChangedListener(this);
+				}
+				fViewer.addTextListener(this);
+
+				if (newDocument instanceof IStructuredDocument) {
+					setDocumentToDamagers(newDocument);
+					setDocumentToRepairers(newDocument);
+					processDamage(new Region(0, newDocument.getLength()), newDocument);
+				}
+			}
+			if (_trace) {
+				System.out.println(TRACE_PREFIX + "processed damage for inputDocumentChanged in " + (System.currentTimeMillis() - time1) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		/*
+		 * @see IDocumentPartitioningListener#documentPartitioningChanged(IDocument)
+		 */
+		public void documentPartitioningChanged(IDocument document) {
+			if (_traceTime) {
+				time0 = System.currentTimeMillis();
+			}
+			if (!fDocumentChanging && fCachedRedrawState)
+				processDamage(new Region(0, document.getLength()), document);
+			else
+				fDocumentPartitioningChanged= true;
+			if (_trace) {
+				System.out.println(TRACE_PREFIX + "processed damage for documentPartitioningChanged [full document]"); //$NON-NLS-1$
+			}
+			if (_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "processed damage for documentPartitioningChanged in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		/*
+		 * @see IDocumentPartitioningListenerExtension#documentPartitioningChanged(IDocument, IRegion)
+		 * @since 2.0
+		 */
+		public void documentPartitioningChanged(IDocument document, IRegion changedRegion) {
+			if (_traceTime) {
+				time0 = System.currentTimeMillis();
+			}
+			if (!fDocumentChanging && fCachedRedrawState) {
+				processDamage(new Region(changedRegion.getOffset(), changedRegion.getLength()), document);
+			} else {
+				fDocumentPartitioningChanged= true;
+				fChangedDocumentPartitions= changedRegion;
+			}
+			if (_trace) {
+				System.out.println(TRACE_PREFIX + "processed damage for documentPartitioningChanged [" + changedRegion.getOffset() + ":" + changedRegion.getLength() + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+			if (_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "processed damage for documentPartitioningChanged in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IDocumentPartitioningListenerExtension2#documentPartitioningChanged(org.eclipse.jface.text.DocumentPartitioningChangedEvent)
+		 * @since 3.0
+		 */
+		public void documentPartitioningChanged(DocumentPartitioningChangedEvent event) {
+			IRegion changedRegion= event.getChangedRegion(getDocumentPartitioning());
+			if (changedRegion != null)
+				documentPartitioningChanged(event.getDocument(), changedRegion);
+		}
+
+		/*
+		 * @see IDocumentListener#documentAboutToBeChanged(DocumentEvent)
+		 */
+		public void documentAboutToBeChanged(DocumentEvent e) {
+
+			fDocumentChanging= true;
+			if (fCachedRedrawState) {
+				try {
+					int offset= e.getOffset() + e.getLength();
+					ITypedRegion region= getPartition(e.getDocument(), offset);
+					fRememberedPosition= new TypedPosition(region);
+					e.getDocument().addPosition(fPositionCategory, fRememberedPosition);
+				} catch (BadLocationException x) {
+					// can not happen
+				} catch (BadPositionCategoryException x) {
+					// should not happen on input elements
+				}
+			}
+		}
+
+		/*
+		 * @see IDocumentListener#documentChanged(DocumentEvent)
+		 */
+		public void documentChanged(DocumentEvent e) {
+			if (fCachedRedrawState) {
+				try {
+					e.getDocument().removePosition(fPositionCategory, fRememberedPosition);
+				} catch (BadPositionCategoryException x) {
+					// can not happen on input documents
+				}
+			}
+			fDocumentChanging= false;
+		}
+
+		/*
+		 * @see ITextListener#textChanged(TextEvent)
+		 */
+		public void textChanged(TextEvent e) {
+			if(fInRewriteSession) {
+				fHasIncomingChanges = true;
+				return;
+			}
+			fCachedRedrawState= e.getViewerRedrawState();
+	 		if (!fCachedRedrawState) {
+				if (_trace) {
+					System.out.println("\n" + TRACE_PREFIX + "returned early from textChanged(TextEvent)"); //$NON-NLS-1$	 //$NON-NLS-2$	
+				}
+				return;
+			}
+			if (_trace) {
+				System.out.println("\n" + TRACE_PREFIX + "entering textChanged(TextEvent)"); //$NON-NLS-1$ //$NON-NLS-2$
+				time0 = System.currentTimeMillis();
+			}
+
+	 		IRegion damage= null;
+	 		IDocument document= null;
+
+		 	if (e.getDocumentEvent() == null) {
+		 		document= fViewer.getDocument();
+		 		if (document != null)  {
+			 		if (e.getOffset() == 0 && e.getLength() == 0 && e.getText() == null) {
+						// redraw state change, damage the whole document
+						damage= new Region(0, document.getLength());
+			 		} else {
+						IRegion region= widgetRegion2ModelRegion(e);
+						try {
+							String text= document.get(region.getOffset(), region.getLength());
+							DocumentEvent de= new DocumentEvent(document, region.getOffset(), region.getLength(), text);
+							damage= getDamage(de, false);
+						} catch (BadLocationException x) {
+							/* ignored in platform PresentationReconciler, too */
+						}
+			 		}
+		 		}
+		 	} else  {
+		 		DocumentEvent de= e.getDocumentEvent();
+		 		document= de.getDocument();
+		 		damage= getDamage(de, true);
+		 	}
+			if(_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "calculated simple text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+				System.out.flush();
+			}
+			
+			boolean damageOverlaps = processRecordedDamages(damage, document);
+			if(_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "processed recorded structured text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+
+			if (damage != null && document != null && !damageOverlaps) {
+				processDamage(damage, document);
+				if(_trace && _traceTime) {
+					System.out.println(TRACE_PREFIX + "processed simple text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+					System.out.flush();
+				}
+			}
+
+			fDocumentPartitioningChanged= false;
+			fChangedDocumentPartitions= null;
+			if(_trace) {
+				System.out.println(TRACE_PREFIX + "finished textChanged(TextEvent) in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		/**
+		 * Translates the given text event into the corresponding range of the viewer's document.
+		 *
+		 * @param e the text event
+		 * @return the widget region corresponding the region of the given event
+		 * @since 2.1
+		 */
+		protected IRegion widgetRegion2ModelRegion(TextEvent e) {
+
+			String text= e.getText();
+			int length= text == null ? 0 : text.length();
+
+			if (fViewer instanceof ITextViewerExtension5) {
+				ITextViewerExtension5 extension= (ITextViewerExtension5) fViewer;
+				return extension.widgetRange2ModelRange(new Region(e.getOffset(), length));
+			}
+
+			IRegion visible= fViewer.getVisibleRegion();
+			IRegion region= new Region(e.getOffset() + visible.getOffset(), length);
+			return region;
+		}
+
+		public void documentRewriteSessionChanged(DocumentRewriteSessionEvent event) {
+			fInRewriteSession = (event != null && event.fChangeType == DocumentRewriteSessionEvent.SESSION_START);
+			if(!fInRewriteSession && fHasIncomingChanges && event != null) {
+				if (_trace)
+					time0 = System.currentTimeMillis();
+				processDamage(new Region(0, event.fDocument.getLength()), event.fDocument);
+				if(_trace && _traceTime)
+					System.out.println(TRACE_PREFIX + " processed damaged after ending document rewrite session at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+				fHasIncomingChanges = false;
+			}
+		}
+
+	}
+	
+	private static class RecordedDamage {
+		IRegion damage; 
+		IDocument document;
+		RecordedDamage(IRegion damage, IDocument document) {
+			this.damage = damage;
+			this.document = document;
+		}
+	}
+
+	/** The map of presentation damagers. */
+	private Map fDamagers;
+	/** The map of presentation repairers. */
+	private Map fRepairers;
+	/** The target viewer. */
+	private ITextViewer fViewer;
+	/** The internal listener. */
+	private InternalListener fInternalListener= new InternalListener();
+	/** The name of the position category to track damage regions. */
+	private String fPositionCategory;
+	/** The position updated for the damage regions' position category. */
+	private IPositionUpdater fPositionUpdater;
+	/** The positions representing the damage regions. */
+	private TypedPosition fRememberedPosition;
+	/** Flag indicating the receipt of a partitioning changed notification. */
+	private boolean fDocumentPartitioningChanged= false;
+	/** The range covering the changed partitioning. */
+	private IRegion fChangedDocumentPartitions= null;
+	
+	/**
+	 * Because structured document events fire before textChanged(), it's
+	 * possible the widget isn't fully aware of the changes to its contents.
+	 * "Record" the damage to process after textChanged() has been fired.
+	 */
+	private List fRecordedDamages = new ArrayList(2);
+	
+	/**
+	 * The partitioning used by this presentation reconciler.
+	 * @since 3.0
+	 */
+	private String fPartitioning;
+
+	private IDocument fLastDocument;
+	
+	/**
+	 * Creates a new presentation reconciler. There are no damagers or repairers
+	 * registered with this reconciler by default. The default partitioning
+	 * <code>IDocumentExtension3.DEFAULT_PARTITIONING</code> is used.
+	 */
+	public StructuredPresentationReconciler() {
+		super();
+		fPartitioning= IDocumentExtension3.DEFAULT_PARTITIONING;
+		fPositionCategory= TRACKED_PARTITION + hashCode();
+		fPositionUpdater= new DefaultPositionUpdater(fPositionCategory);
+	}
+
+	/**
+	 * Sets the document partitioning for this presentation reconciler.
+	 *
+	 * @param partitioning the document partitioning for this presentation reconciler.
+	 * @since 3.0
+	 */
+	public void setDocumentPartitioning(String partitioning) {
+		Assert.isNotNull(partitioning);
+		fPartitioning= partitioning;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.presentation.IPresentationReconcilerExtension#geDocumenttPartitioning()
+	 * @since 3.0
+	 */
+	public String getDocumentPartitioning() {
+		return fPartitioning;
+	}
+
+	/**
+	 * Registers the given presentation damager for a particular content type.
+	 * If there is already a damager registered for this type, the old damager
+	 * is removed first.
+	 *
+	 * @param damager the presentation damager to register, or <code>null</code> to remove an existing one
+	 * @param contentType the content type under which to register
+	 */
+	public void setDamager(IPresentationDamager damager, String contentType) {
+
+		Assert.isNotNull(contentType);
+
+		if (fDamagers == null)
+			fDamagers= new HashMap();
+
+		if (damager == null)
+			fDamagers.remove(contentType);
+		else
+			fDamagers.put(contentType, damager);
+	}
+
+	/**
+	 * Registers the given presentation repairer for a particular content type.
+	 * If there is already a repairer registered for this type, the old repairer
+	 * is removed first.
+	 *
+	 * @param repairer the presentation repairer to register, or <code>null</code> to remove an existing one
+	 * @param contentType the content type under which to register
+	 */
+	public void setRepairer(IPresentationRepairer repairer, String contentType) {
+
+		Assert.isNotNull(contentType);
+
+		if (fRepairers == null)
+			fRepairers= new HashMap();
+
+		if (repairer == null)
+			fRepairers.remove(contentType);
+		else
+			fRepairers.put(contentType, repairer);
+	}
+
+	/*
+	 * @see IPresentationReconciler#install(ITextViewer)
+	 */
+	public void install(ITextViewer viewer) {
+		if(_trace) {
+			time0 = System.currentTimeMillis();
+		}
+		Assert.isNotNull(viewer);
+
+		fViewer= viewer;
+		fViewer.addTextInputListener(fInternalListener);
+		
+		IDocument document= viewer.getDocument();
+		if (document != null) {
+			fInternalListener.inputDocumentChanged(null, document);
+			if(document instanceof IStructuredDocument) {
+				((IStructuredDocument) document).addDocumentChangedListener(fInternalListener);
+			}
+			if(document instanceof IDocumentExtension4) {
+				((IDocumentExtension4) document).addDocumentRewriteSessionListener(fInternalListener);
+			}
+		}
+		if(_trace) {
+			System.out.println(TRACE_PREFIX + "installed to text viewer in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/*
+	 * @see IPresentationReconciler#uninstall()
+	 */
+	public void uninstall() {
+		if(_trace) {
+			time0 = System.currentTimeMillis();
+		}
+		fViewer.removeTextInputListener(fInternalListener);
+
+		IDocument document = null;
+		if(( document = fViewer.getDocument()) instanceof IStructuredDocument) {
+			((IStructuredDocument) document).removeDocumentChangedListener(fInternalListener);
+		}
+		if(document instanceof IDocumentExtension4) {
+			((IDocumentExtension4) document).removeDocumentRewriteSessionListener(fInternalListener);
+		}
+		// Ensure we uninstall all listeners
+		fInternalListener.inputDocumentAboutToBeChanged(fViewer.getDocument(), null);
+		if(_trace) {
+			System.out.println(TRACE_PREFIX + "uninstalled from text viewer in " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/*
+	 * @see IPresentationReconciler#getDamager(String)
+	 */
+	public IPresentationDamager getDamager(String contentType) {
+
+		if (fDamagers == null)
+			return null;
+
+		return (IPresentationDamager) fDamagers.get(contentType);
+	}
+
+	/*
+	 * @see IPresentationReconciler#getRepairer(String)
+	 */
+	public IPresentationRepairer getRepairer(String contentType) {
+
+		if (fRepairers == null)
+			return null;
+
+		return (IPresentationRepairer) fRepairers.get(contentType);
+	}
+
+	/**
+	 * Informs all registered damagers about the document on which they will work.
+	 *
+	 * @param document the document on which to work
+	 */
+	protected void setDocumentToDamagers(IDocument document) {
+		if (fDamagers != null) {
+			Iterator e= fDamagers.values().iterator();
+			while (e.hasNext()) {
+				IPresentationDamager damager= (IPresentationDamager) e.next();
+				damager.setDocument(document);
+			}
+		}
+	}
+
+	/**
+	 * Informs all registered repairers about the document on which they will work.
+	 *
+	 * @param document the document on which to work
+	 */
+	protected void setDocumentToRepairers(IDocument document) {
+		if (fRepairers != null) {
+			Iterator e= fRepairers.values().iterator();
+			while (e.hasNext()) {
+				IPresentationRepairer repairer= (IPresentationRepairer) e.next();
+				repairer.setDocument(document);
+			}
+		}
+	}
+
+	/**
+	 * Constructs a "repair description" for the given damage and returns this
+	 * description as a text presentation. For this, it queries the partitioning
+	 * of the damage region and asks the appropriate presentation repairer for
+	 * each partition to construct the "repair description" for this partition.
+	 *
+	 * @param damage the damage to be repaired
+	 * @param document the document whose presentation must be repaired
+	 * @return the presentation repair description as text presentation or
+	 *         <code>null</code> if the partitioning could not be computed
+	 */
+	protected TextPresentation createPresentation(IRegion damage, IDocument document) {
+		try {
+			int validLength = Math.min(damage.getLength(), document.getLength() - damage.getOffset());
+			
+			if (fRepairers == null || fRepairers.isEmpty()) {
+				TextPresentation presentation= new TextPresentation(damage, 1);
+				presentation.setDefaultStyleRange(new StyleRange(damage.getOffset(), validLength, null, null));
+				return presentation;
+			}
+
+			TextPresentation presentation= new TextPresentation(damage, 1000);
+
+			ITypedRegion[] partitions= TextUtilities.computePartitioning(document, getDocumentPartitioning(), damage.getOffset(), validLength, false);
+			for (int i= 0; i < partitions.length; i++) {
+				ITypedRegion r= partitions[i];
+				IPresentationRepairer repairer= getRepairer(r.getType());
+				if (repairer != null)
+					repairer.createPresentation(presentation, r);
+			}
+
+			return presentation;
+
+		} catch (BadLocationException x) {
+			/* ignored in platform PresentationReconciler, too */
+		}
+
+		return null;
+	}
+
+
+	/**
+	 * Checks for the first and the last affected partition affected by a
+	 * document event and calls their damagers. Invalidates everything from the
+	 * start of the damage for the first partition until the end of the damage
+	 * for the last partition.
+	 *
+	 * @param e the event describing the document change
+	 * @param optimize <code>true</code> if partition changes should be
+	 *        considered for optimization
+	 * @return the damaged caused by the change or <code>null</code> if
+	 *         computing the partitioning failed
+	 * @since 3.0
+	 */
+	IRegion getDamage(DocumentEvent e, boolean optimize) {
+		int length= e.getText() == null ? 0 : e.getText().length();
+		
+		if (fDamagers == null || fDamagers.isEmpty()) {
+			length= Math.max(e.getLength(), length);
+			length= Math.min(e.getDocument().getLength() - e.getOffset(), length);
+			return new Region(e.getOffset(), length);
+		}
+
+		boolean isDeletion= length == 0;
+		IRegion damage= null;
+		try {
+			int offset= e.getOffset();
+			if (isDeletion)
+				offset= Math.max(0, offset - 1);
+			ITypedRegion partition= getPartition(e.getDocument(), offset);
+			IPresentationDamager damager= getDamager(partition.getType());
+			if (damager == null)
+				return null;
+
+			IRegion r= damager.getDamageRegion(partition, e, fDocumentPartitioningChanged);
+
+			if (!fDocumentPartitioningChanged && optimize && !isDeletion) {
+				damage= r;
+			} else {
+
+				int damageEnd= getDamageEndOffset(e);
+
+				int parititionDamageEnd= -1;
+				if (fChangedDocumentPartitions != null)
+					parititionDamageEnd= fChangedDocumentPartitions.getOffset() + fChangedDocumentPartitions.getLength();
+
+				int end= Math.max(damageEnd, parititionDamageEnd);
+
+				damage= end == -1 ? r : new Region(r.getOffset(), end - r.getOffset());
+			}
+
+		} catch (BadLocationException x) {
+			/* ignored in platform PresentationReconciler, too */
+		}
+
+		return damage;
+	}
+
+	/**
+	 * Returns the end offset of the damage. If a partition has been split by
+	 * the given document event also the second half of the original
+	 * partition must be considered. This is achieved by using the remembered
+	 * partition range.
+	 *
+	 * @param e the event describing the change
+	 * @return the damage end offset (excluding)
+	 * @exception BadLocationException if method accesses invalid offset
+	 */
+	int getDamageEndOffset(DocumentEvent e) throws BadLocationException {
+
+		IDocument d= e.getDocument();
+
+		int length= 0;
+		if (e.getText() != null) {
+			length= e.getText().length();
+			if (length > 0)
+				-- length;
+		}
+
+		ITypedRegion partition= getPartition(d, e.getOffset() + length);
+		int endOffset= partition.getOffset() + partition.getLength();
+		if (endOffset == e.getOffset())
+			return -1;
+
+		int end= fRememberedPosition == null ? -1 : fRememberedPosition.getOffset() + fRememberedPosition.getLength();
+		if (endOffset < end && end < d.getLength())
+			partition= getPartition(d, end);
+
+		//if there is not damager for the partition then use the endOffset of the partition
+		IPresentationDamager damager= getDamager(partition.getType());
+		if (damager != null) {
+			IRegion r= damager.getDamageRegion(partition, e, fDocumentPartitioningChanged);
+			endOffset = r.getOffset() + r.getLength();
+		}
+
+		return endOffset;
+	}
+	
+	void processRecordedDamages() {
+		processRecordedDamages(null, null);
+	}
+	
+	boolean processRecordedDamages(IRegion damage, IDocument document) {
+		RecordedDamage[] recordings = null;
+		boolean recordingOverlaps = false;
+		synchronized (fRecordedDamages) {
+			recordings = (RecordedDamage[]) fRecordedDamages.toArray(new RecordedDamage[fRecordedDamages.size()]);
+			fRecordedDamages.clear();
+		}
+		for (int i = 0; i < recordings.length; i++) {
+			if (isOverlappingRegion(damage, recordings[i].damage) && document == recordings[i].document)
+				recordingOverlaps = true;
+			processDamage(recordings[i].damage, recordings[i].document);
+		}
+		return recordingOverlaps;
+	}
+	
+	private boolean isOverlappingRegion(IRegion base, IRegion damage) {
+		if(base == null || damage == null)
+			return false;
+		
+		int baseEnd = base.getOffset() + base.getLength();
+		int damageEnd = damage.getOffset() + damage.getLength();
+		
+		return damage.getOffset() <= base.getOffset() && (damageEnd >= baseEnd);
+	}
+
+	/**
+	 * Processes the given damage.
+	 * @param damage the damage to be repaired
+	 * @param document the document whose presentation must be repaired
+	 */
+	void processDamage(IRegion damage, IDocument document) {
+		if (damage != null && damage.getLength() > 0) {
+			TextPresentation p = createPresentation(damage, document);
+			if (p != null) {
+				/**
+				 * 229749 - Read-Only highlighting support missing
+				 * 272981 - Read-only highlighting moved to semantic highlighting
+				 */
+				applyTextRegionCollection(p);
+			}
+		}
+	}
+
+	/**
+	 * Processes the given damage.
+	 * @param damage the damage to be repaired
+	 * @param document the document whose presentation must be repaired
+	 */
+	void recordDamage(IRegion damage, IDocument document) {
+		if (damage != null && damage.getLength() > 0) {
+			synchronized (fRecordedDamages) {
+				fRecordedDamages.add(new RecordedDamage(damage, document));
+			}
+		}
+	}
+
+	/**
+	 * Applies the given text presentation to the text viewer the presentation
+	 * reconciler is installed on.
+	 *
+	 * @param presentation the text presentation to be applied to the text viewer
+	 */
+	void applyTextRegionCollection(TextPresentation presentation) {
+		fViewer.changeTextPresentation(presentation, false);
+	}
+
+	/**
+	 * Returns the partition for the given offset in the given document.
+	 *
+	 * @param document the document
+	 * @param offset the offset
+	 * @return the partition
+	 * @throws BadLocationException if offset is invalid in the given document
+	 * @since 3.0
+	 */
+	ITypedRegion getPartition(IDocument document, int offset) throws BadLocationException {
+		return TextUtilities.getPartition(document, getDocumentPartitioning(), offset, false);
+	}
+
+	/**
+	 * Constructs a "repair description" for the given damage and returns this
+	 * description as a text presentation, essentially making
+	 * {@link #createPresentation(IRegion, IDocument)} publicly callable.
+	 * <p>
+	 * NOTE: Should not be used if this reconciler is installed on a viewer.
+	 * This method is considered EXPERIMENTAL and may not be available in
+	 * subsequent versions.
+	 * </p>
+	 * 
+	 * @param damage
+	 *            the damage to be repaired
+	 * @param document
+	 *            the document whose presentation must be repaired
+	 * @return the presentation repair description as text presentation
+	 */
+	public TextPresentation createRepairDescription(IRegion damage, IDocument document) {
+		if (document != fLastDocument) {
+			setDocumentToDamagers(document);
+			setDocumentToRepairers(document);
+			fLastDocument= document;
+		}
+		return createPresentation(damage, document);
+	}	
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/QuickOutlineHandler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/QuickOutlineHandler.java
new file mode 100644
index 0000000..1fa7e13
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/QuickOutlineHandler.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.quickoutline;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.text.information.IInformationPresenter;
+
+public class QuickOutlineHandler extends AbstractHandler {
+
+	IInformationPresenter fPresenter;
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		if (fPresenter != null)
+			fPresenter.showInformation();
+		return null;
+	}
+
+	public void configure(IInformationPresenter presenter) {
+		fPresenter = presenter;
+	}
+
+	public void dispose() {
+		super.dispose();
+		if (fPresenter != null) {
+			fPresenter.uninstall();
+			fPresenter = null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/QuickOutlinePopupDialog.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/QuickOutlinePopupDialog.java
new file mode 100644
index 0000000..6a2f62c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/QuickOutlinePopupDialog.java
@@ -0,0 +1,435 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.quickoutline;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.PopupDialog;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlExtension;
+import org.eclipse.jface.text.IInformationControlExtension2;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.IContentSelectionProvider;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.quickoutline.StringPatternFilter.StringMatcher;
+import org.eclipse.wst.sse.ui.quickoutline.AbstractQuickOutlineConfiguration;
+
+/**
+ * Popup dialog that contains the filtering input and the outline
+ * view of the editor's input.
+ * 
+ * <p>
+ * Based on {@link org.eclipse.jdt.internal.ui.text.AbstractInformationControl}
+ * </p>
+ * 
+ */
+public class QuickOutlinePopupDialog extends PopupDialog implements IInformationControl, IInformationControlExtension, IInformationControlExtension2, DisposeListener {
+
+	/** Section used for storing the dialog's size and position settings */
+	private static final String DIALOG_SECTION = "org.eclipse.wst.sse.ui.quick_outline"; //$NON-NLS-1$
+
+	/** Text field for entering filter patterns */
+	private Text fFilterText;
+
+	/** Tree for presenting the information outline */
+	private TreeViewer fTreeViewer;
+
+	/** The model to be outlined */
+	private IStructuredModel fModel;
+
+	private ILabelProvider fLabelProvider;
+	private ITreeContentProvider fContentProvider;
+
+	private IContentSelectionProvider fSelectionProvider;
+
+	private StringPatternFilter fFilter;
+	
+	public QuickOutlinePopupDialog(Shell parent, int shellStyle, IStructuredModel model, AbstractQuickOutlineConfiguration configuration) {
+		super(parent, shellStyle, true, true, true, true, true, null, null);
+		fContentProvider = configuration.getContentProvider();
+		fLabelProvider = configuration.getLabelProvider();
+		fSelectionProvider = configuration.getContentSelectionProvider();
+		fModel = model;
+		create();
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		createTreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		addListeners(fTreeViewer.getTree());
+
+		installFilter();
+		return fTreeViewer.getControl();
+	}
+
+	protected Control createTitleControl(Composite parent) {
+		createFilterText(parent);
+
+		return fFilterText;
+	}
+
+	protected void createTreeViewer(Composite parent, int style) {
+		Tree tree = new Tree(parent, style);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = tree.getItemHeight() * 12;
+		tree.setLayoutData(gd);
+
+		fTreeViewer = new TreeViewer(tree);
+		fTreeViewer.setContentProvider(fContentProvider);
+		fTreeViewer.setLabelProvider(fLabelProvider);
+		fTreeViewer.setAutoExpandLevel(2);
+		fTreeViewer.setUseHashlookup(true);
+		fTreeViewer.setInput(fModel);
+	}
+
+	protected void createFilterText(Composite parent) {
+		fFilterText = new Text(parent, SWT.NONE);
+		Dialog.applyDialogFont(fFilterText);
+
+		GridData data= new GridData(GridData.FILL_HORIZONTAL);
+		data.horizontalAlignment= GridData.FILL;
+		data.verticalAlignment= GridData.CENTER;
+		fFilterText.setLayoutData(data);
+		fFilterText.addKeyListener(new KeyListener() {
+			public void keyPressed(KeyEvent e) {
+				if (e.keyCode == 0x0D) // return
+					gotoSelectedElement();
+				if (e.keyCode == SWT.ARROW_DOWN)
+					fTreeViewer.getTree().setFocus();
+				if (e.keyCode == SWT.ARROW_UP)
+					fTreeViewer.getTree().setFocus();
+				if (e.character == 0x1B) // ESC
+					dispose();
+			}
+			public void keyReleased(KeyEvent e) {
+				// do nothing
+			}
+		});
+	}
+
+	protected void installFilter() {
+		fFilter = new StringPatternFilter();
+		fTreeViewer.addFilter(fFilter);
+		fFilterText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				String text = ((Text) e.widget).getText();
+				int length = text.length();
+				if (length > 0 && text.charAt(length -1 ) != '*') {
+					text = text + '*';
+				}
+				setMatcherString(text, true);
+			}
+		});
+	}
+
+	protected void setMatcherString(String pattern, boolean update) {
+		fFilter.updatePattern(pattern);
+		if (update)
+			stringMatcherUpdated();
+	}
+	/**
+	 * The string matcher has been modified. The default implementation
+	 * refreshes the view and selects the first matched element
+	 */
+	protected void stringMatcherUpdated() {
+		// refresh viewer to re-filter
+		fTreeViewer.getControl().setRedraw(false);
+		fTreeViewer.refresh();
+		fTreeViewer.expandAll();
+		selectFirstMatch();
+		fTreeViewer.getControl().setRedraw(true);
+	}
+
+	private void selectFirstMatch() {
+		TreeItem item = findItem(fTreeViewer.getTree().getItems(), fFilter.getStringMatcher());
+		if (item != null) {
+			fTreeViewer.getTree().setSelection(item);
+		}
+		else {
+			fTreeViewer.setSelection(StructuredSelection.EMPTY);
+		}
+	}
+
+	private TreeItem findItem(TreeItem[] items, StringMatcher matcher) {
+		if (matcher == null)
+			return items.length > 0 ? items[0] : null;
+		int length = items.length;
+		TreeItem result = null;
+		for (int i = 0; i < length; i++) {
+			if (matcher.match(items[i].getText()))
+				return items[i];
+			if (items[i].getItemCount() > 0) {
+				result = findItem(items[i].getItems(), matcher);
+				if (result != null)
+					return result;
+			}
+				
+		}
+		return result;
+	}
+
+	protected IDialogSettings getDialogSettings() {
+		IDialogSettings settings= SSEUIPlugin.getDefault().getDialogSettings().getSection(DIALOG_SECTION);
+		if (settings == null)
+			settings = SSEUIPlugin.getDefault().getDialogSettings().addNewSection(DIALOG_SECTION);
+
+		return settings;
+	}
+
+	private void gotoSelectedElement() {
+		Object element = getSelectedElement();
+		dispose();
+		ITextEditor editor = getActiveTextEditor();
+		if (editor != null) {
+			editor.selectAndReveal(((IndexedRegion) element).getStartOffset(), ((IndexedRegion) element).getEndOffset() - ((IndexedRegion) element).getStartOffset());
+		}
+	}
+
+	private ITextEditor getActiveTextEditor() {
+		IWorkbench wb = PlatformUI.getWorkbench();
+		ITextEditor editor = null;
+		if (wb != null) {
+			IWorkbenchWindow ww = wb.getActiveWorkbenchWindow();
+			IWorkbenchPage page = ww.getActivePage();
+			if (page != null) {
+				IEditorPart part = page.getActiveEditor();
+				if (part instanceof ITextEditor)
+					editor = (ITextEditor) part;
+				else
+					editor = part != null ? (ITextEditor) part.getAdapter(ITextEditor.class) : null;
+			}
+		}
+		return editor;
+	}
+
+	private Object getSelectedElement() {
+		if (fTreeViewer == null)
+			return null;
+
+		return ((IStructuredSelection) fTreeViewer.getSelection()).getFirstElement();
+	}
+
+	private void addListeners(final Tree tree) {
+		tree.addKeyListener(new KeyListener() {
+			public void keyPressed(KeyEvent e)  {
+				if (e.character == 0x1B) // ESC
+					dispose();
+			}
+			public void keyReleased(KeyEvent e) {
+				// do nothing
+			}
+		});
+
+		tree.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				// do nothing
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+				gotoSelectedElement();
+			}
+		});
+
+		/* Mouse hover */
+		tree.addMouseMoveListener(new MouseMoveListener()	 {
+			TreeItem fLastItem= null;
+			public void mouseMove(MouseEvent e) {
+				if (tree.equals(e.getSource())) {
+					Object o= tree.getItem(new Point(e.x, e.y));
+					if (o instanceof TreeItem) {
+						Rectangle clientArea = tree.getClientArea();
+						if (!o.equals(fLastItem)) {
+							fLastItem= (TreeItem)o;
+							tree.setSelection(new TreeItem[] { fLastItem });
+						} else if (e.y - clientArea.y < tree.getItemHeight() / 4) {
+							// Scroll up
+							Point p= tree.toDisplay(e.x, e.y);
+							Item item= fTreeViewer.scrollUp(p.x, p.y);
+							if (item instanceof TreeItem) {
+								fLastItem= (TreeItem)item;
+								tree.setSelection(new TreeItem[] { fLastItem });
+							}
+						} else if (clientArea.y + clientArea.height - e.y < tree.getItemHeight() / 4) {
+							// Scroll down
+							Point p= tree.toDisplay(e.x, e.y);
+							Item item= fTreeViewer.scrollDown(p.x, p.y);
+							if (item instanceof TreeItem) {
+								fLastItem= (TreeItem)item;
+								tree.setSelection(new TreeItem[] { fLastItem });
+							}
+						}
+					}
+				}
+			}
+		});
+
+		tree.addMouseListener(new MouseAdapter() {
+			public void mouseUp(MouseEvent e) {
+
+				if (tree.getSelectionCount() < 1)
+					return;
+
+				if (e.button != 1)
+					return;
+
+				if (tree.equals(e.getSource())) {
+					Object o= tree.getItem(new Point(e.x, e.y));
+					TreeItem selection= tree.getSelection()[0];
+					if (selection.equals(o))
+						gotoSelectedElement();
+				}
+			}
+		});
+	}
+	public void addDisposeListener(DisposeListener listener) {
+		getShell().addDisposeListener(listener);
+	}
+
+	public void addFocusListener(FocusListener listener) {
+		getShell().addFocusListener(listener);
+	}
+
+	public Point computeSizeHint() {
+		return getShell().getSize();
+	}
+
+	public void dispose() {
+		close();
+	}
+
+	public boolean isFocusControl() {
+		return getShell().getDisplay().getActiveShell() == getShell();
+	}
+
+	public void removeDisposeListener(DisposeListener listener) {
+		getShell().removeDisposeListener(listener);
+	}
+
+	public void removeFocusListener(FocusListener listener) {
+		getShell().removeFocusListener(listener);
+	}
+
+	public void setBackgroundColor(Color background) {
+		applyBackgroundColor(background, getContents());
+	}
+
+	public void setFocus() {
+		getShell().forceFocus();
+		fFilterText.setFocus();
+	}
+
+	public void setForegroundColor(Color foreground) {
+		applyForegroundColor(foreground, getContents());
+	}
+
+	public void setInformation(String information) {
+		// nothing to do
+	}
+
+	public void setLocation(Point location) {
+		/*
+		 * If the location is persisted, it gets managed by PopupDialog - fine. Otherwise, the location is
+		 * computed in Window#getInitialLocation, which will center it in the parent shell / main
+		 * monitor, which is wrong for two reasons:
+		 * - we want to center over the editor / subject control, not the parent shell
+		 * - the center is computed via the initalSize, which may be also wrong since the size may
+		 *   have been updated since via min/max sizing of AbstractInformationControlManager.
+		 * In that case, override the location with the one computed by the manager. Note that
+		 * the call to constrainShellSize in PopupDialog.open will still ensure that the shell is
+		 * entirely visible.
+		 */
+		if (!getPersistLocation() || getDialogSettings() == null)
+			getShell().setLocation(location);
+	}
+
+	public void setSize(int width, int height) {
+		getShell().setSize(width, height);
+	}
+
+	public void setSizeConstraints(int maxWidth, int maxHeight) {
+	}
+
+	public void setVisible(boolean visible) {
+		if (visible) {
+			open();
+		} else {
+			saveDialogBounds(getShell());
+			getShell().setVisible(false);
+		}
+	}
+
+	public boolean hasContents() {
+		return fTreeViewer != null && fTreeViewer.getInput() != null;
+	}
+
+	public void setInput(Object input) {
+		if (!(input instanceof ISelection)) {
+			fTreeViewer.setSelection(new StructuredSelection(input));
+		}
+		else {
+			if (fSelectionProvider != null) {
+				ISelection selection = fSelectionProvider.getSelection(fTreeViewer, (ISelection) input);
+				fTreeViewer.setSelection(selection);
+			}
+			else {
+				fTreeViewer.setSelection((ISelection) input);
+			}
+		}
+	}
+
+	public void widgetDisposed(DisposeEvent e) {
+		fTreeViewer = null;
+		fFilterText = null;
+		fModel = null;
+	}
+
+	protected void fillDialogMenu(IMenuManager dialogMenu) {
+		// Add custom actions
+		super.fillDialogMenu(dialogMenu);
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/StringPatternFilter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/StringPatternFilter.java
new file mode 100644
index 0000000..86c19f2
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/quickoutline/StringPatternFilter.java
@@ -0,0 +1,508 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.quickoutline;
+
+import java.util.Vector;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.osgi.util.TextProcessor;
+
+/**
+ * Default Viewer Filter to be used by the {@link QuickOutlinePopupDialog}
+ * <p>
+ * Based on {@link org.eclipse.jdt.internal.ui.text.AbstractInformationControl.NamePatternFilter}
+ * </p>
+ */
+public class StringPatternFilter extends ViewerFilter {
+
+	private StringMatcher fStringMatcher;
+
+	/*
+	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
+		StringMatcher matcher = fStringMatcher;
+		if (matcher == null || !(viewer instanceof TreeViewer))
+			return true;
+		TreeViewer treeViewer = (TreeViewer) viewer;
+
+		String matchName = ((ILabelProvider) treeViewer.getLabelProvider()).getText(element);
+		matchName = TextProcessor.deprocess(matchName);
+		if (matchName != null && matcher.match(matchName))
+			return true;
+
+		return hasUnfilteredChild(treeViewer, element);
+	}
+
+	private boolean hasUnfilteredChild(TreeViewer viewer, Object element) {
+		Object[] children=  ((ITreeContentProvider) viewer.getContentProvider()).getChildren(element);
+		for (int i= 0; i < children.length; i++)
+			if (select(viewer, element, children[i]))
+				return true;
+		return false;
+	}
+
+	public void updatePattern(String pattern) {
+		if (pattern.length() == 0) {
+			fStringMatcher = null;
+		}
+		else {
+			fStringMatcher = new StringMatcher(pattern, pattern.toLowerCase().equals(pattern), false);
+		}
+		
+	}
+
+	public StringMatcher getStringMatcher() {
+		return fStringMatcher;
+	}
+
+	/**
+	 * String matcher based on {@link org.eclipse.ui.internal.misc.StringMatcher}
+	 */
+	static class StringMatcher {
+		protected String fPattern;
+
+	    protected int fLength; // pattern length
+
+	    protected boolean fIgnoreWildCards;
+
+	    protected boolean fIgnoreCase;
+
+	    protected boolean fHasLeadingStar;
+
+	    protected boolean fHasTrailingStar;
+
+	    protected String fSegments[]; //the given pattern is split into * separated segments
+
+	    /* boundary value beyond which we don't need to search in the text */
+	    protected int fBound = 0;
+
+	    protected static final char fSingleWildCard = '\u0000';
+
+	    public static class Position {
+	        int start; //inclusive
+
+	        int end; //exclusive
+
+	        public Position(int start, int end) {
+	            this.start = start;
+	            this.end = end;
+	        }
+
+	        public int getStart() {
+	            return start;
+	        }
+
+	        public int getEnd() {
+	            return end;
+	        }
+	    }
+
+	    /**
+	     * StringMatcher constructor takes in a String object that is a simple 
+	     * pattern which may contain '*' for 0 and many characters and
+	     * '?' for exactly one character.  
+	     *
+	     * Literal '*' and '?' characters must be escaped in the pattern 
+	     * e.g., "\*" means literal "*", etc.
+	     *
+	     * Escaping any other character (including the escape character itself), 
+	     * just results in that character in the pattern.
+	     * e.g., "\a" means "a" and "\\" means "\"
+	     *
+	     * If invoking the StringMatcher with string literals in Java, don't forget
+	     * escape characters are represented by "\\".
+	     *
+	     * @param pattern the pattern to match text against
+	     * @param ignoreCase if true, case is ignored
+	     * @param ignoreWildCards if true, wild cards and their escape sequences are ignored
+	     * 		  (everything is taken literally).
+	     */
+	    public StringMatcher(String pattern, boolean ignoreCase,
+	            boolean ignoreWildCards) {
+	        if (pattern == null) {
+				throw new IllegalArgumentException();
+			}
+	        fIgnoreCase = ignoreCase;
+	        fIgnoreWildCards = ignoreWildCards;
+	        fPattern = pattern;
+	        fLength = pattern.length();
+
+	        if (fIgnoreWildCards) {
+	            parseNoWildCards();
+	        } else {
+	            parseWildCards();
+	        }
+	    }
+
+	    /**
+	     * Find the first occurrence of the pattern between <code>start</code)(inclusive) 
+	     * and <code>end</code>(exclusive).  
+	     * @param text the String object to search in 
+	     * @param start the starting index of the search range, inclusive
+	     * @param end the ending index of the search range, exclusive
+	     * @return an <code>StringMatcher.Position</code> object that keeps the starting 
+	     * (inclusive) and ending positions (exclusive) of the first occurrence of the 
+	     * pattern in the specified range of the text; return null if not found or subtext
+	     * is empty (start==end). A pair of zeros is returned if pattern is empty string
+	     * Note that for pattern like "*abc*" with leading and trailing stars, position of "abc"
+	     * is returned. For a pattern like"*??*" in text "abcdf", (1,3) is returned
+	     */
+	    public StringMatcher.Position find(String text, int start, int end) {
+	        if (text == null) {
+				throw new IllegalArgumentException();
+			}
+
+	        int tlen = text.length();
+	        if (start < 0) {
+				start = 0;
+			}
+	        if (end > tlen) {
+				end = tlen;
+			}
+	        if (end < 0 || start >= end) {
+				return null;
+			}
+	        if (fLength == 0) {
+				return new Position(start, start);
+			}
+	        if (fIgnoreWildCards) {
+	            int x = posIn(text, start, end);
+	            if (x < 0) {
+					return null;
+				}
+	            return new Position(x, x + fLength);
+	        }
+
+	        int segCount = fSegments.length;
+	        if (segCount == 0) {
+				return new Position(start, end);
+			}
+
+	        int curPos = start;
+	        int matchStart = -1;
+	        int i;
+	        for (i = 0; i < segCount && curPos < end; ++i) {
+	            String current = fSegments[i];
+	            int nextMatch = regExpPosIn(text, curPos, end, current);
+	            if (nextMatch < 0) {
+					return null;
+				}
+	            if (i == 0) {
+					matchStart = nextMatch;
+				}
+	            curPos = nextMatch + current.length();
+	        }
+	        if (i < segCount) {
+				return null;
+			}
+	        return new Position(matchStart, curPos);
+	    }
+
+	    /**
+	     * match the given <code>text</code> with the pattern 
+	     * @return true if matched otherwise false
+	     * @param text a String object 
+	     */
+	    public boolean match(String text) {
+	    	if(text == null) {
+				return false;
+			}
+	        return match(text, 0, text.length());
+	    }
+
+	    /**
+	     * Given the starting (inclusive) and the ending (exclusive) positions in the   
+	     * <code>text</code>, determine if the given substring matches with aPattern  
+	     * @return true if the specified portion of the text matches the pattern
+	     * @param text a String object that contains the substring to match 
+	     * @param start marks the starting position (inclusive) of the substring
+	     * @param end marks the ending index (exclusive) of the substring 
+	     */
+	    public boolean match(String text, int start, int end) {
+	        if (null == text) {
+				throw new IllegalArgumentException();
+			}
+
+	        if (start > end) {
+				return false;
+			}
+
+	        if (fIgnoreWildCards) {
+				return (end - start == fLength)
+	                    && fPattern.regionMatches(fIgnoreCase, 0, text, start,
+	                            fLength);
+			}
+	        int segCount = fSegments.length;
+	        if (segCount == 0 && (fHasLeadingStar || fHasTrailingStar)) {
+				return true;
+			}
+	        if (start == end) {
+				return fLength == 0;
+			}
+	        if (fLength == 0) {
+				return start == end;
+			}
+
+	        int tlen = text.length();
+	        if (start < 0) {
+				start = 0;
+			}
+	        if (end > tlen) {
+				end = tlen;
+			}
+
+	        int tCurPos = start;
+	        int bound = end - fBound;
+	        if (bound < 0) {
+				return false;
+			}
+	        int i = 0;
+	        String current = fSegments[i];
+	        int segLength = current.length();
+
+	        /* process first segment */
+	        if (!fHasLeadingStar) {
+	            if (!regExpRegionMatches(text, start, current, 0, segLength)) {
+	                return false;
+	            } else {
+	                ++i;
+	                tCurPos = tCurPos + segLength;
+	            }
+	        }
+	        if ((fSegments.length == 1) && (!fHasLeadingStar)
+	                && (!fHasTrailingStar)) {
+	            // only one segment to match, no wildcards specified
+	            return tCurPos == end;
+	        }
+	        /* process middle segments */
+	        while (i < segCount) {
+	            current = fSegments[i];
+	            int currentMatch;
+	            int k = current.indexOf(fSingleWildCard);
+	            if (k < 0) {
+	                currentMatch = textPosIn(text, tCurPos, end, current);
+	                if (currentMatch < 0) {
+						return false;
+					}
+	            } else {
+	                currentMatch = regExpPosIn(text, tCurPos, end, current);
+	                if (currentMatch < 0) {
+						return false;
+					}
+	            }
+	            tCurPos = currentMatch + current.length();
+	            i++;
+	        }
+
+	        /* process final segment */
+	        if (!fHasTrailingStar && tCurPos != end) {
+	            int clen = current.length();
+	            return regExpRegionMatches(text, end - clen, current, 0, clen);
+	        }
+	        return i == segCount;
+	    }
+
+	    /**
+	     * This method parses the given pattern into segments seperated by wildcard '*' characters.
+	     * Since wildcards are not being used in this case, the pattern consists of a single segment.
+	     */
+	    private void parseNoWildCards() {
+	        fSegments = new String[1];
+	        fSegments[0] = fPattern;
+	        fBound = fLength;
+	    }
+
+	    /**
+	     * Parses the given pattern into segments seperated by wildcard '*' characters.
+	     * @param p, a String object that is a simple regular expression with '*' and/or '?'
+	     */
+	    private void parseWildCards() {
+	        if (fPattern.startsWith("*")) { //$NON-NLS-1$
+				fHasLeadingStar = true;
+			}
+	        if (fPattern.endsWith("*")) {//$NON-NLS-1$
+	            /* make sure it's not an escaped wildcard */
+	            if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') {
+	                fHasTrailingStar = true;
+	            }
+	        }
+
+	        Vector temp = new Vector();
+
+	        int pos = 0;
+	        StringBuffer buf = new StringBuffer();
+	        while (pos < fLength) {
+	            char c = fPattern.charAt(pos++);
+	            switch (c) {
+	            case '\\':
+	                if (pos >= fLength) {
+	                    buf.append(c);
+	                } else {
+	                    char next = fPattern.charAt(pos++);
+	                    /* if it's an escape sequence */
+	                    if (next == '*' || next == '?' || next == '\\') {
+	                        buf.append(next);
+	                    } else {
+	                        /* not an escape sequence, just insert literally */
+	                        buf.append(c);
+	                        buf.append(next);
+	                    }
+	                }
+	                break;
+	            case '*':
+	                if (buf.length() > 0) {
+	                    /* new segment */
+	                    temp.addElement(buf.toString());
+	                    fBound += buf.length();
+	                    buf.setLength(0);
+	                }
+	                break;
+	            case '?':
+	                /* append special character representing single match wildcard */
+	                buf.append(fSingleWildCard);
+	                break;
+	            default:
+	                buf.append(c);
+	            }
+	        }
+
+	        /* add last buffer to segment list */
+	        if (buf.length() > 0) {
+	            temp.addElement(buf.toString());
+	            fBound += buf.length();
+	        }
+
+	        fSegments = new String[temp.size()];
+	        temp.copyInto(fSegments);
+	    }
+
+	    /** 
+	     * @param text a string which contains no wildcard
+	     * @param start the starting index in the text for search, inclusive
+	     * @param end the stopping point of search, exclusive
+	     * @return the starting index in the text of the pattern , or -1 if not found 
+	     */
+	    protected int posIn(String text, int start, int end) {//no wild card in pattern
+	        int max = end - fLength;
+
+	        if (!fIgnoreCase) {
+	            int i = text.indexOf(fPattern, start);
+	            if (i == -1 || i > max) {
+					return -1;
+				}
+	            return i;
+	        }
+
+	        for (int i = start; i <= max; ++i) {
+	            if (text.regionMatches(true, i, fPattern, 0, fLength)) {
+					return i;
+				}
+	        }
+
+	        return -1;
+	    }
+
+	    /** 
+	     * @param text a simple regular expression that may only contain '?'(s)
+	     * @param start the starting index in the text for search, inclusive
+	     * @param end the stopping point of search, exclusive
+	     * @param p a simple regular expression that may contains '?'
+	     * @return the starting index in the text of the pattern , or -1 if not found 
+	     */
+	    protected int regExpPosIn(String text, int start, int end, String p) {
+	        int plen = p.length();
+
+	        int max = end - plen;
+	        for (int i = start; i <= max; ++i) {
+	            if (regExpRegionMatches(text, i, p, 0, plen)) {
+					return i;
+				}
+	        }
+	        return -1;
+	    }
+
+	    /**
+	     * 
+	     * @return boolean
+	     * @param text a String to match
+	     * @param start int that indicates the starting index of match, inclusive
+	     * @param end</code> int that indicates the ending index of match, exclusive
+	     * @param p String,  String, a simple regular expression that may contain '?'
+	     * @param ignoreCase boolean indicating wether code>p</code> is case sensitive
+	     */
+	    protected boolean regExpRegionMatches(String text, int tStart, String p,
+	            int pStart, int plen) {
+	        while (plen-- > 0) {
+	            char tchar = text.charAt(tStart++);
+	            char pchar = p.charAt(pStart++);
+
+	            /* process wild cards */
+	            if (!fIgnoreWildCards) {
+	                /* skip single wild cards */
+	                if (pchar == fSingleWildCard) {
+	                    continue;
+	                }
+	            }
+	            if (pchar == tchar) {
+					continue;
+				}
+	            if (fIgnoreCase) {
+	                if (Character.toUpperCase(tchar) == Character
+	                        .toUpperCase(pchar)) {
+						continue;
+					}
+	                // comparing after converting to upper case doesn't handle all cases;
+	                // also compare after converting to lower case
+	                if (Character.toLowerCase(tchar) == Character
+	                        .toLowerCase(pchar)) {
+						continue;
+					}
+	            }
+	            return false;
+	        }
+	        return true;
+	    }
+
+	    /** 
+	     * @param text the string to match
+	     * @param start the starting index in the text for search, inclusive
+	     * @param end the stopping point of search, exclusive
+	     * @param p a pattern string that has no wildcard
+	     * @return the starting index in the text of the pattern , or -1 if not found 
+	     */
+	    protected int textPosIn(String text, int start, int end, String p) {
+
+	        int plen = p.length();
+	        int max = end - plen;
+
+	        if (!fIgnoreCase) {
+	            int i = text.indexOf(p, start);
+	            if (i == -1 || i > max) {
+					return -1;
+				}
+	            return i;
+	        }
+
+	        for (int i = start; i <= max; ++i) {
+	            if (text.regionMatches(true, i, p, 0, plen)) {
+					return i;
+				}
+	        }
+
+	        return -1;
+	    }
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/AbstractStructuredTextReconcilingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/AbstractStructuredTextReconcilingStrategy.java
new file mode 100644
index 0000000..d5cc519
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/AbstractStructuredTextReconcilingStrategy.java
@@ -0,0 +1,543 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcileResult;
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModelExtension;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.ITemporaryAnnotation;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.StructuredMarkerAnnotation;
+
+
+/**
+ * A base ReconcilingStrategy. Subclasses must implement
+ * createReconcileSteps(). This class should not know about
+ * IStructuredDocument, only IDocument.
+ * 
+ * @author pavery
+ */
+public abstract class AbstractStructuredTextReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension, IReleasable {
+
+	/** debug flag */
+	protected static final boolean DEBUG;
+	static {
+		String value = Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerjob"); //$NON-NLS-1$
+		DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+	}
+
+	// these limits are safetys for "runaway" validation cases
+	// should be used to safeguard potentially dangerous loops or potentially
+	// long annotations
+	// (since the painter seems to affect performance when painting long
+	// annotations)
+	public static final int ANNOTATION_LENGTH_LIMIT = 25;
+	public static final int ELEMENT_ERROR_LIMIT = 25;
+
+	private IDocument fDocument = null;
+	private IProgressMonitor fProgressMonitor = null;
+	private ISourceViewer fSourceViewer = null;
+
+	// list of "validator" annotations
+	// for gray/un-gray capability
+	private HashSet fMarkerAnnotations = null;
+
+	/**
+	 * Creates a new strategy. The source viewer must be set manually
+	 * after creation before a reconciler using this constructor will work.
+	 */
+	public AbstractStructuredTextReconcilingStrategy() {
+		init();
+	}
+
+	/**
+	 * Creates a new strategy.
+	 * 
+	 * @param editor
+	 */
+	public AbstractStructuredTextReconcilingStrategy(ISourceViewer sourceViewer) {
+		fSourceViewer = sourceViewer;
+		init();
+	}
+
+	/**
+	 * This is where we add results to the annotationModel, doing any special
+	 * "extra" processing.
+	 */
+	protected void addResultToAnnotationModel(IReconcileResult result) {
+		if (!(result instanceof TemporaryAnnotation))
+			return;
+		// can be null when closing the editor
+		if (getAnnotationModel() != null) {
+			TemporaryAnnotation tempAnnotation = (TemporaryAnnotation) result;
+
+			StructuredMarkerAnnotation sma = getCorrespondingMarkerAnnotation(tempAnnotation);
+			if (sma != null) {
+				// un-gray out the marker annotation
+				sma.setGrayed(false);
+			}
+
+			getAnnotationModel().addAnnotation(tempAnnotation, tempAnnotation.getPosition());
+		}
+	}
+
+	/**
+	 * @param object
+	 * @return if this strategy is responisble for adding this type of key
+	 */
+	protected boolean canHandlePartition(String partition) {
+		// String[] haystack = getPartitionTypes();
+		// for (int i = 0; i < haystack.length; i++) {
+		// if (haystack[i].equals(partition))
+		// return true;
+		// }
+		// return false;
+		return false;
+	}
+
+	// /**
+	// * @param step
+	// * @return
+	// */
+	// protected boolean containsStep(IReconcileStep step) {
+	// if (fFirstStep instanceof StructuredReconcileStep)
+	// return ((StructuredReconcileStep) fFirstStep).isSiblingStep(step);
+	// return false;
+	// }
+
+	/**
+	 * This is where you should create the steps for this strategy
+	 */
+	abstract public void createReconcileSteps();
+
+	/**
+	 * Remove ALL temporary annotations that this strategy can handle.
+	 */
+	protected TemporaryAnnotation[] getAllAnnotationsToRemove() {
+		List removals = new ArrayList();
+		IAnnotationModel annotationModel = getAnnotationModel();
+		if (annotationModel != null) {
+			Iterator i = annotationModel.getAnnotationIterator();
+			while (i.hasNext()) {
+				Object obj = i.next();
+				if (!(obj instanceof ITemporaryAnnotation))
+					continue;
+
+				ITemporaryAnnotation annotation = (ITemporaryAnnotation) obj;
+				ReconcileAnnotationKey key = (ReconcileAnnotationKey) annotation.getKey();
+				// then if this strategy knows how to add/remove this
+				// partition type
+				if (canHandlePartition(key.getPartitionType()) /*
+																 * &&
+																 * containsStep(key.getStep())
+																 */)
+					removals.add(annotation);
+			}
+		}
+		return (TemporaryAnnotation[]) removals.toArray(new TemporaryAnnotation[removals.size()]);
+	}
+
+	protected IAnnotationModel getAnnotationModel() {
+		IAnnotationModel model = null;
+		if (fSourceViewer != null) {
+			model = fSourceViewer.getAnnotationModel();
+		}
+		return model;
+	}
+
+	protected TemporaryAnnotation[] getAnnotationsToRemove(DirtyRegion dr, List stepsRun) {
+
+		List remove = new ArrayList();
+		IAnnotationModel annotationModel = getAnnotationModel();
+		// can be null when closing the editor
+		if (getAnnotationModel() != null) {
+
+			// clear validator annotations
+			getMarkerAnnotations().clear();
+
+			Iterator i = annotationModel.getAnnotationIterator();
+			while (i.hasNext()) {
+
+				Object obj = i.next();
+
+				// check if it's a validator marker annotation
+				// if it is save it for comparision later (to "gray" icons)
+				if (obj instanceof StructuredMarkerAnnotation) {
+					StructuredMarkerAnnotation sma = (StructuredMarkerAnnotation) obj;
+
+					if (sma.getAnnotationType() == TemporaryAnnotation.ANNOT_ERROR || sma.getAnnotationType() == TemporaryAnnotation.ANNOT_WARNING)
+						fMarkerAnnotations.add(sma);
+				}
+
+				if (!(obj instanceof TemporaryAnnotation))
+					continue;
+
+				TemporaryAnnotation annotation = (TemporaryAnnotation) obj;
+				ReconcileAnnotationKey key = (ReconcileAnnotationKey) annotation.getKey();
+
+				// then if this strategy knows how to add/remove this
+				// partition type
+				if (canHandlePartition(key.getPartitionType()) && stepsRun.contains(key.getStep())) {
+					if (key.getScope() == ReconcileAnnotationKey.PARTIAL && annotation.getPosition().overlapsWith(dr.getOffset(), dr.getLength())) {
+						remove.add(annotation);
+					}
+					else if (key.getScope() == ReconcileAnnotationKey.TOTAL) {
+						remove.add(annotation);
+					}
+				}
+			}
+		}
+		return (TemporaryAnnotation[]) remove.toArray(new TemporaryAnnotation[remove.size()]);
+	}
+
+
+	protected abstract boolean containsStep(IReconcileStep step);
+
+	/**
+	 * Gets partition types from all steps in this strategy.
+	 * 
+	 * @return parition types from all steps
+	 */
+	// public String[] getPartitionTypes() {
+	// if (fFirstStep instanceof StructuredReconcileStep)
+	// return ((StructuredReconcileStep) fFirstStep).getPartitionTypes();
+	// return new String[0];
+	// }
+	public void init() {
+		createReconcileSteps();
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#initialReconcile()
+	 */
+	public void initialReconcile() {
+		// do nothing
+	}
+
+	/**
+	 * @return
+	 */
+	protected boolean isCanceled() {
+		if (DEBUG && (fProgressMonitor != null && fProgressMonitor.isCanceled()))
+			System.out.println("** STRATEGY CANCELED **:" + this.getClass().getName()); //$NON-NLS-1$
+		return fProgressMonitor != null && fProgressMonitor.isCanceled();
+	}
+
+	/**
+	 * Process the results from the reconcile steps in this strategy.
+	 * 
+	 * @param results
+	 */
+	private void process(final IReconcileResult[] results) {
+		if (DEBUG)
+			System.out.println("[trace reconciler] > STARTING PROCESS METHOD with (" + results.length + ") results"); //$NON-NLS-1$ //$NON-NLS-2$
+
+		if (results == null)
+			return;
+
+		for (int i = 0; i < results.length && i < ELEMENT_ERROR_LIMIT && !isCanceled(); i++) {
+
+			if (isCanceled()) {
+				if (DEBUG)
+					System.out.println("[trace reconciler] >** PROCESS (adding) WAS CANCELLED **"); //$NON-NLS-1$
+				return;
+			}
+			addResultToAnnotationModel(results[i]);
+		}
+
+		if (DEBUG) {
+			StringBuffer traceString = new StringBuffer();
+			for (int j = 0; j < results.length; j++)
+				traceString.append("\n (+) :" + results[j] + ":\n"); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.println("[trace reconciler] > PROCESSING (" + results.length + ") results in AbstractStructuredTextReconcilingStrategy " + traceString); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+		// not used
+		// we only have validator strategy now
+
+		// // external files may be null
+		// if (isCanceled() || fFirstStep == null)
+		// return;
+		//
+		// TemporaryAnnotation[] annotationsToRemove = new
+		// TemporaryAnnotation[0];
+		// IReconcileResult[] annotationsToAdd = new IReconcileResult[0];
+		// StructuredReconcileStep structuredStep = (StructuredReconcileStep)
+		// fFirstStep;
+		//        
+		// annotationsToRemove = getAnnotationsToRemove(dirtyRegion);
+		// annotationsToAdd = structuredStep.reconcile(dirtyRegion,
+		// subRegion);
+		//        
+		// smartProcess(annotationsToRemove, annotationsToAdd);
+	}
+
+	/**
+	 * @param partition
+	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.IRegion)
+	 */
+	public void reconcile(IRegion partition) {
+		// not used, we use:
+		// reconcile(DirtyRegion dirtyRegion, IRegion subRegion)
+	}
+
+	/**
+	 * Calls release() on all the steps in this strategy. Currently done in
+	 * StructuredRegionProcessor.SourceWidgetDisposeListener#widgetDisposed(...)
+	 */
+	public void release() {
+		// release steps (each step calls release on the next)
+		// if (fFirstStep != null && fFirstStep instanceof IReleasable)
+		// ((IReleasable) fFirstStep).release();
+		// we don't to null out the steps, in case
+		// it's reconfigured later
+	}
+
+	private void removeAnnotations(TemporaryAnnotation[] annotationsToRemove) {
+
+		IAnnotationModel annotationModel = getAnnotationModel();
+		// can be null when closing the editor
+		if (annotationModel != null) {
+			for (int i = 0; i < annotationsToRemove.length; i++) {
+				if (isCanceled()) {
+					if (DEBUG)
+						System.out.println("[trace reconciler] >** REMOVAL WAS CANCELLED **"); //$NON-NLS-1$
+					return;
+				}
+				StructuredMarkerAnnotation sma = getCorrespondingMarkerAnnotation(annotationsToRemove[i]);
+				if (sma != null) {
+					// gray out the marker annotation
+					sma.setGrayed(true);
+				}
+				// remove the temp one
+				annotationModel.removeAnnotation(annotationsToRemove[i]);
+
+			}
+		}
+
+		if (DEBUG) {
+			StringBuffer traceString = new StringBuffer();
+			for (int i = 0; i < annotationsToRemove.length; i++)
+				traceString.append("\n (-) :" + annotationsToRemove[i] + ":\n"); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.println("[trace reconciler] > REMOVED (" + annotationsToRemove.length + ") annotations in AbstractStructuredTextReconcilingStrategy :" + traceString); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	private StructuredMarkerAnnotation getCorrespondingMarkerAnnotation(TemporaryAnnotation tempAnnotation) {
+
+		Iterator it = getMarkerAnnotations().iterator();
+		while (it.hasNext()) {
+			StructuredMarkerAnnotation markerAnnotation = (StructuredMarkerAnnotation) it.next();
+			String message = ""; //$NON-NLS-1$
+			try {
+				message = (String) markerAnnotation.getMarker().getAttribute(IMarker.MESSAGE);
+			}
+			catch (CoreException e) {
+				if (DEBUG)
+					Logger.logException(e);
+			}
+			// it would be nice to check line number here...
+			if (message != null && message.equals(tempAnnotation.getText()))
+				return markerAnnotation;
+		}
+		return null;
+	}
+
+	private void removeAllAnnotations() {
+		removeAnnotations(getAllAnnotationsToRemove());
+	}
+
+	/**
+	 * The user needs to manually set the viewer if the default
+	 * constructor was used. 
+	 *
+	 * @param viewer
+	 */
+	public void setViewer(SourceViewer viewer) {
+		fSourceViewer = viewer;
+	}
+
+	/**
+	 * Set the document for this strategy.
+	 * 
+	 * @param document
+	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#setDocument(org.eclipse.jface.text.IDocument)
+	 */
+	public void setDocument(IDocument document) {
+
+		// remove all old annotations since it's a new document
+		removeAllAnnotations();
+
+		if (document == null)
+			release();
+
+		// if (getFirstStep() != null)
+		// getFirstStep().setInputModel(new DocumentAdapter(document));
+
+		fDocument = document;
+	}
+
+	public IDocument getDocument() {
+		return fDocument;
+	}
+
+	/**
+	 * @param monitor
+	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void setProgressMonitor(IProgressMonitor monitor) {
+		// fProgressMonitor = monitor;
+		// if (fFirstStep != null)
+		// fFirstStep.setProgressMonitor(fProgressMonitor);
+	}
+
+	/**
+	 * Check if the annotation is already there, if it is, no need to remove
+	 * or add again. This will avoid a lot of "flickering" behavior.
+	 * 
+	 * @param annotationsToRemove
+	 * @param annotationsToAdd
+	 */
+	protected void smartProcess(TemporaryAnnotation[] annotationsToRemove, IReconcileResult[] annotationsToAdd) {
+//		Comparator comp = getTemporaryAnnotationComparator();
+//		List sortedRemovals = Arrays.asList(annotationsToRemove);
+//		Collections.sort(sortedRemovals, comp);
+//
+//		List sortedAdditions = Arrays.asList(annotationsToAdd);
+//		Collections.sort(sortedAdditions, comp);
+//
+//		List filteredRemovals = new ArrayList(sortedRemovals);
+//		List filteredAdditions = new ArrayList(sortedAdditions);
+//
+//		boolean ignore = false;
+//		int lastFoundAdded = 0;
+//		for (int i = 0; i < sortedRemovals.size(); i++) {
+//			TemporaryAnnotation removal = (TemporaryAnnotation) sortedRemovals.get(i);
+//			for (int j = lastFoundAdded; j < sortedAdditions.size(); j++) {
+//				TemporaryAnnotation addition = (TemporaryAnnotation) sortedAdditions.get(j);
+//				// quick position check here
+//				if (removal.getPosition().equals(addition.getPosition())) {
+//					lastFoundAdded = j;
+//					// remove performs TemporaryAnnotation.equals()
+//					// which checks text as well
+//					filteredAdditions.remove(addition);
+//					ignore = true;
+//					if (DEBUG)
+//						System.out.println(" ~ smart process ignoring: " + removal.getPosition().getOffset()); //$NON-NLS-1$
+//					break;
+//				}
+//			}
+//			if (ignore) {
+//				filteredRemovals.remove(removal);
+//			}
+//			ignore = false;
+//		}
+		if (getAnnotationModel() instanceof IAnnotationModelExtension) {
+//			TemporaryAnnotation[] filteredRemovalArray = (TemporaryAnnotation[]) filteredRemovals.toArray(new TemporaryAnnotation[filteredRemovals.size()]);
+//			// apply "grey"-ness
+//			for (int i = 0; i < filteredRemovalArray.length; i++) {
+//				if (isCanceled()) {
+//					if (DEBUG)
+//						System.out.println("[trace reconciler] >** replacing WAS CANCELLED **"); //$NON-NLS-1$
+//					return;
+//				}
+//				StructuredMarkerAnnotation sma = getCorrespondingMarkerAnnotation(filteredRemovalArray[i]);
+//				if (sma != null) {
+//					// gray out the marker annotation
+//					sma.setGrayed(true);
+//				}
+//			}
+//			Map annotationsToAddMap = new HashMap();
+//			for (int i = 0; i < filteredAdditions.size(); i++) {
+//				TemporaryAnnotation temporaryAnnotation = (TemporaryAnnotation) filteredAdditions.get(i);
+//				annotationsToAddMap.put(temporaryAnnotation, temporaryAnnotation.getPosition());
+//			}
+//			if (isCanceled()) {
+//				if (DEBUG)
+//					System.out.println("[trace reconciler] >** PROCESS (replacing) WAS CANCELLED **"); //$NON-NLS-1$
+//				return;
+//			}
+//			/*
+//			 * Using the extension means we can't enforce the
+//			 * ELEMENT_ERROR_LIMIT limit.
+//			 */
+//			((IAnnotationModelExtension) getAnnotationModel()).replaceAnnotations(filteredRemovalArray, annotationsToAddMap);
+
+			Map annotationsToAddMap = new HashMap();
+			for (int i = 0; i < annotationsToAdd.length; i++) {
+				TemporaryAnnotation temporaryAnnotation = (TemporaryAnnotation) annotationsToAdd[i];
+				annotationsToAddMap.put(temporaryAnnotation, temporaryAnnotation.getPosition());
+			}
+			if (isCanceled()) {
+				if (DEBUG)
+					System.out.println("[trace reconciler] >** PROCESS (replacing) WAS CANCELLED **"); //$NON-NLS-1$
+				return;
+			}
+			((IAnnotationModelExtension) getAnnotationModel()).replaceAnnotations(annotationsToRemove, annotationsToAddMap);
+		}
+		else {
+//			removeAnnotations((TemporaryAnnotation[]) filteredRemovals.toArray(new TemporaryAnnotation[filteredRemovals.size()]));
+//			process((IReconcileResult[]) filteredAdditions.toArray(new IReconcileResult[filteredAdditions.size()]));
+			removeAnnotations(annotationsToRemove);
+			process(annotationsToAdd);
+		}
+	}
+
+//	private Comparator getTemporaryAnnotationComparator() {
+//		if (fComparator == null) {
+//			fComparator = new Comparator() {
+//				public int compare(Object arg0, Object arg1) {
+//					TemporaryAnnotation ta1 = (TemporaryAnnotation) arg0;
+//					TemporaryAnnotation ta2 = (TemporaryAnnotation) arg1;
+//					int result = ta1.getPosition().getOffset() - ta2.getPosition().getOffset();
+//					if(result != 0)
+//						return result;
+//					return Collator.getInstance().compare(ta1.getText(), ta2.getText());
+//				}
+//			};
+//		}
+//		return fComparator;
+//	}
+
+	public HashSet getMarkerAnnotations() {
+		if (fMarkerAnnotations == null)
+			fMarkerAnnotations = new HashSet();
+		return fMarkerAnnotations;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DirtyRegionProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DirtyRegionProcessor.java
new file mode 100644
index 0000000..5649fd6
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DirtyRegionProcessor.java
@@ -0,0 +1,814 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.DocumentRewriteSessionEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IDocumentRewriteSessionListener;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.IReconcilerExtension;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+/**
+ * This Job holds a queue of updates from the editor (DirtyRegions) to
+ * process. When a new request comes in, the current run is canceled, the new
+ * request is added to the queue, then the job is re-scheduled.
+ * 
+ * @author pavery
+ */
+public class DirtyRegionProcessor extends Job implements IReconciler, IReconcilerExtension, IConfigurableReconciler {
+	class DocumentListener implements IDocumentListener {
+		public void documentAboutToBeChanged(DocumentEvent event) {
+			/*
+			 * if in rewrite session and already going to reprocess entire
+			 * document after rewrite session, do nothing
+			 */
+			if (isInRewriteSession() && fReprocessAfterRewrite)
+				return;
+			// save partition type (to see if it changes in documentChanged())
+			fLastPartitions = getPartitionRegions(event.getOffset(), event.getLength());
+		}
+
+		public void documentChanged(DocumentEvent event) {
+			/*
+			 * if in rewrite session and already going to reprocess entire
+			 * document after rewrite session, do nothing
+			 */
+			if (isInRewriteSession() && fReprocessAfterRewrite)
+				return;
+
+			if (partitionsChanged(event)) {
+				// pa_TODO
+				// this is a simple way to ensure old
+				// annotations are removed when partition changes
+
+				// it might be a performance hit though
+				setEntireDocumentDirty(getDocument());
+			}
+			else {
+				/*
+				 * Note that creating DirtyRegions *now* means that the wrong
+				 * text may be included
+				 */
+				DirtyRegion dr = null;
+				if (event.getLength() == 0) {
+					/*
+					 * It's an insert-- we use text length though so that the
+					 * new region gets validated...
+					 */
+					dr = createDirtyRegion(event.getOffset(), 0, DirtyRegion.INSERT);
+				}
+				else {
+					if ("".equals(event.getText())) { //$NON-NLS-1$
+						// it's a delete
+						dr = createDirtyRegion(event.getOffset(), event.getLength(), DirtyRegion.REMOVE);
+					}
+					else {
+						// it's a replace
+						dr = createDirtyRegion(event.getOffset(), event.getLength(), DirtyRegion.INSERT);
+					}
+				}
+				if (isInRewriteSession()) {
+					/*
+					 * while in rewrite session, found a dirty region, so flag
+					 * that entire document needs to be reprocesed after
+					 * rewrite session
+					 */
+					if (!fReprocessAfterRewrite && (dr != null)) {
+						fReprocessAfterRewrite = true;
+					}
+				}
+				else {
+					processDirtyRegion(dr);
+				}
+			}
+		}
+
+		/**
+		 * Checks previous partitions from the span of the event w/ the new
+		 * partitions from the span of the event. If partitions changed,
+		 * return true, else return false
+		 * 
+		 * @param event
+		 * @return
+		 */
+		private boolean partitionsChanged(DocumentEvent event) {
+			boolean changed = false;
+			int length = event.getLength();
+
+			if (event.getLength() == 0 && event.getText().length() > 0) {
+				// it's an insert, we want partitions of the new text
+				length = event.getText().length();
+			}
+
+			ITypedRegion[] newPartitions = getPartitionRegions(event.getOffset(), length);
+			if (fLastPartitions != null) {
+				if (fLastPartitions.length != newPartitions.length) {
+					changed = true;
+				}
+				else {
+					for (int i = 0; i < fLastPartitions.length; i++) {
+						if (!fLastPartitions[i].getType().equals(newPartitions[i].getType())) {
+							changed = true;
+							break;
+						}
+					}
+				}
+			}
+			return changed;
+		}
+
+
+	}
+
+	/**
+	 * Reconciles the entire document when the document in the viewer is
+	 * changed. This happens when the document is initially opened, as well as
+	 * after a save-as.
+	 * 
+	 * Also see processPostModelEvent(...) for similar behavior when document
+	 * for the model is changed.
+	 */
+	class TextInputListener implements ITextInputListener {
+		public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+			// do nothing
+		}
+
+		public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+			handleInputDocumentChanged(oldInput, newInput);
+		}
+	}
+
+	class DocumentRewriteSessionListener implements IDocumentRewriteSessionListener {
+		long time0 = 0;
+
+		public void documentRewriteSessionChanged(DocumentRewriteSessionEvent event) {
+			boolean oldValue = fInRewriteSession;
+			fInRewriteSession = event != null && event.getChangeType().equals(DocumentRewriteSessionEvent.SESSION_START);
+
+			if (event.getChangeType().equals(DocumentRewriteSessionEvent.SESSION_START)) {
+				if (DEBUG) {
+					time0 = System.currentTimeMillis();
+				}
+				// bug 235446 - source validation annotations lost after rewrite session
+				if (!getDirtyRegionQueue().isEmpty()) {
+					flushDirtyRegionQueue();
+					fReprocessAfterRewrite = true;	
+				} else {
+					fReprocessAfterRewrite = false;
+				}
+			}
+			else if (event.getChangeType().equals(DocumentRewriteSessionEvent.SESSION_STOP)) {
+				if (fInRewriteSession ^ oldValue && fDocument != null) {
+					if (DEBUG) {
+						Logger.log(Logger.INFO, "Rewrite session lasted " + (System.currentTimeMillis() - time0) + "ms");
+						time0 = System.currentTimeMillis();
+					}
+					if (fReprocessAfterRewrite) {
+						DirtyRegion entireDocument = createDirtyRegion(0, fDocument.getLength(), DirtyRegion.INSERT);
+						processDirtyRegion(entireDocument);
+					}
+					if (DEBUG) {
+						Logger.log(Logger.INFO, "Full document reprocess took " + (System.currentTimeMillis() - time0) + "ms");
+					}
+					fReprocessAfterRewrite = false;
+				}
+			}
+		}
+	}
+
+	/** debug flag */
+	protected static final boolean DEBUG;
+	private static final long UPDATE_DELAY = 500;
+
+	static {
+		String value = Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerjob"); //$NON-NLS-1$
+		DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+	}
+
+	private long fDelay;
+
+
+	/** local queue of dirty regions (created here) to be reconciled */
+	private List fDirtyRegionQueue = Collections.synchronizedList(new ArrayList());
+
+	/** document that this reconciler works on */
+	private IDocument fDocument = null;
+
+	private IDocumentListener fDocumentListener = new DocumentListener();
+	private IDocumentRewriteSessionListener fDocumentRewriteSessionListener = new DocumentRewriteSessionListener();
+
+	/**
+	 * set true after first install to prevent duplicate work done in the
+	 * install method (since install gets called multiple times)
+	 */
+	private boolean fIsInstalled = false;
+
+	/**
+	 * so we can tell if a partition changed after the last edit
+	 */
+	ITypedRegion[] fLastPartitions;
+
+	List fNonIncrementalStrategiesAlreadyProcessed = new ArrayList(1);
+
+	/**
+	 * The partitioning this reconciler uses.
+	 */
+	private String fPartitioning;
+
+	Map fReconcilingStrategies = null;
+
+	/** for initial reconcile when document is opened */
+	private TextInputListener fTextInputListener = null;
+	/** the text viewer */
+	private ITextViewer fViewer;
+	boolean fInRewriteSession = false;
+	/**
+	 * true if entire document needs to be reprocessed after rewrite session
+	 */
+	boolean fReprocessAfterRewrite = false;
+
+	/** The job should be reset because of document changes */
+	private boolean fReset = false;
+	private boolean fIsCanceled = false;
+	private boolean fHasReconciled = false;
+	private Object LOCK = new Object();
+
+	/**
+	 * Creates a new StructuredRegionProcessor
+	 */
+	public DirtyRegionProcessor() {
+		// init job stuff
+		super(SSEUIMessages.proc_dirty_regions_0); //$NON-NLS-1$
+		setPriority(Job.LONG);
+		setSystem(true);
+
+		// init reconciler stuff
+		setDelay(UPDATE_DELAY);
+		fReconcilingStrategies = new HashMap();
+	}
+
+	/**
+	 * Adds the given resource to the set of resources that need refreshing.
+	 * Synchronized in order to protect the collection during add.
+	 * 
+	 * @param resource
+	 */
+	private synchronized void addRequest(DirtyRegion newDirtyRegion) {
+		// NOTE: This method is called a lot so make sure it's fast
+		List dirtyRegionQueue = getDirtyRegionQueue();
+		synchronized (dirtyRegionQueue) {
+			for (Iterator it = dirtyRegionQueue.iterator(); it.hasNext();) {
+				// go through list of existing dirty regions and check if any
+				// dirty regions need to be discarded
+				DirtyRegion currentExisting = (DirtyRegion) it.next();
+				DirtyRegion outer = getOuterRegion(currentExisting, newDirtyRegion);
+				// if we already have a request which contains the new request,
+				// discard the new request
+				if (outer == currentExisting)
+					return;
+				// if new request contains any existing requests,
+				// remove those
+				if (outer == newDirtyRegion)
+					it.remove();
+			}
+			dirtyRegionQueue.add(newDirtyRegion);
+		}
+	}
+
+	/**
+	 * Notifies subclasses that processing of multiple dirty regions has begun
+	 */
+	protected void beginProcessing() {
+		// do nothing by default
+	}
+
+	/**
+	 * @param dirtyRegion
+	 * @return
+	 */
+	protected ITypedRegion[] computePartitioning(DirtyRegion dirtyRegion) {
+		int drOffset = dirtyRegion.getOffset();
+		int drLength = dirtyRegion.getLength();
+
+		return computePartitioning(drOffset, drLength);
+	}
+
+	protected ITypedRegion[] computePartitioning(int drOffset, int drLength) {
+		ITypedRegion[] tr = new ITypedRegion[0];
+		IDocument doc = getDocument();
+		if (doc != null){
+			int docLength = doc.getLength();
+	
+			if (drOffset > docLength) {
+				drOffset = docLength;
+				drLength = 0;
+			}
+			else if (drOffset + drLength > docLength) {
+				drLength = docLength - drOffset;
+			}
+	
+			try {
+				// dirty region may span multiple partitions
+				tr = TextUtilities.computePartitioning(doc, getDocumentPartitioning(), drOffset, drLength, true);
+			}
+			catch (BadLocationException e) {
+				String info = "dr: [" + drOffset + ":" + drLength + "] doc: [" + docLength + "] "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+				Logger.logException(info, e);
+				tr = new ITypedRegion[0];
+			}
+		}
+		return tr;
+	}
+
+	/**
+	 * Used to determine if one dirty region contains the other and if so,
+	 * which is the one that contains it.
+	 * 
+	 * @param root
+	 * @param possible
+	 * @return the outer dirty region if it contains the other dirty region,
+	 *         null otherwise
+	 */
+	protected DirtyRegion getOuterRegion(DirtyRegion root, DirtyRegion possible) {
+		DirtyRegion outer = null;
+		if (isContained(root, possible))
+			outer = root;
+		else if (isContained(possible, root))
+			outer = possible;
+		return outer;
+	}
+
+	/**
+	 * Used to determine of a "possible" dirty region can be discarded in
+	 * favor of using just the "root" dirty region.
+	 * 
+	 * @return if the root dirty region contains possible, return true,
+	 *         otherwise return false
+	 */
+	private boolean isContained(DirtyRegion root, DirtyRegion possible) {
+		int rootStart = root.getOffset();
+		int rootEnd = rootStart + root.getLength();
+		int possStart = possible.getOffset();
+		int possEnd = possStart + possible.getLength();
+		if (rootStart <= possStart && rootEnd >= possEnd)
+			return true;
+		return false;
+	}
+
+	protected DirtyRegion createDirtyRegion(int offset, int length, String type) {
+		DirtyRegion durty = null;
+		IDocument doc = getDocument();
+
+		if (doc != null) {
+			// safety for BLE
+			int docLen = doc.getLength();
+			if (offset > docLen) {
+				offset = docLen;
+				length = 0;
+			}
+			else if (offset + length >= docLen)
+				length = docLen - offset;
+			try {
+				durty = new DirtyRegion(offset, length, type, doc.get(offset, length));
+			}
+			catch (BadLocationException e) {
+				String info = "dr: [" + offset + ":" + length + "] doc: [" + docLen + "] "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+				Logger.logException(info, e);
+			}
+		}
+		return durty;
+	}
+
+	protected DirtyRegion createDirtyRegion(ITypedRegion tr, String type) {
+		return createDirtyRegion(tr.getOffset(), tr.getLength(), type);
+	}
+
+	protected void flushDirtyRegionQueue() {
+		fDirtyRegionQueue.clear();
+	}
+
+	/**
+	 * Notifies subclasses that processing of multiple dirty regions has
+	 * ended, for now
+	 */
+	protected void endProcessing() {
+		// do nothing by default
+	}
+
+	/**
+	 * Delay between processing of DirtyRegions.
+	 * 
+	 * @return
+	 */
+	long getDelay() {
+		return fDelay;
+	}
+
+	List getDirtyRegionQueue() {
+		return fDirtyRegionQueue;
+	}
+
+	/**
+	 * The IDocument on which this reconciler operates
+	 * 
+	 * @return
+	 */
+	protected IDocument getDocument() {
+		return fDocument;
+	}
+
+	public String getDocumentPartitioning() {
+		if (fPartitioning == null)
+			return IDocumentExtension3.DEFAULT_PARTITIONING;
+		return fPartitioning;
+	}
+
+	protected String[] getPartitions(int drOffset, int drLength) {
+
+		ITypedRegion[] regions = new ITypedRegion[0];
+		int docLength = getDocument().getLength();
+
+		if (drOffset > docLength) {
+			drOffset = docLength;
+			drLength = 0;
+		}
+		else if (drOffset + drLength > docLength) {
+			drLength = docLength - drOffset;
+		}
+
+		try {
+			regions = TextUtilities.computePartitioning(getDocument(), getDocumentPartitioning(), drOffset, drLength, true);
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+			regions = new ITypedRegion[0];
+		}
+		String[] partitions = new String[regions.length];
+		for (int i = 0; i < regions.length; i++)
+			partitions[i] = regions[i].getType();
+		return partitions;
+	}
+
+	ITypedRegion[] getPartitionRegions(int drOffset, int drLength) {
+		ITypedRegion[] regions = new ITypedRegion[0];
+		int docLength = getDocument().getLength();
+
+		if (drOffset > docLength) {
+			drOffset = docLength;
+			drLength = 0;
+		}
+		else if (drOffset + drLength > docLength) {
+			drLength = docLength - drOffset;
+		}
+
+		try {
+			regions = TextUtilities.computePartitioning(getDocument(), getDocumentPartitioning(), drOffset, drLength, true);
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+			regions = new ITypedRegion[0];
+		}
+		return regions;
+	}
+		
+		
+	/**
+	 * Returns the reconciling strategy registered with the reconciler for the
+	 * specified partition type.
+	 * 
+	 * @param partitionType
+	 *            the partition type for which to determine the reconciling
+	 *            strategy
+	 * 
+	 * @return the reconciling strategy registered for the given partition
+	 *         type, or <code>null</code> if there is no such strategy
+	 * 
+	 * @see org.eclipse.jface.text.reconciler.IReconciler#getReconcilingStrategy(java.lang.String)
+	 */
+	public IReconcilingStrategy getReconcilingStrategy(String partitionType) {
+		if (partitionType == null)
+			return null;
+		return (IReconcilingStrategy) fReconcilingStrategies.get(partitionType);
+	}
+
+	/**
+	 * This method also synchronized because it accesses the fRequests queue
+	 * 
+	 * @return an array of the currently requested Nodes to refresh
+	 */
+	private synchronized DirtyRegion[] getRequests() {
+		DirtyRegion[] toRefresh = (DirtyRegion[]) fDirtyRegionQueue.toArray(new DirtyRegion[fDirtyRegionQueue.size()]);
+		flushDirtyRegionQueue();
+		return toRefresh;
+	}
+
+	/**
+	 * Returns the text viewer this reconciler is installed on.
+	 * 
+	 * @return the text viewer this reconciler is installed on
+	 */
+	protected ITextViewer getTextViewer() {
+		return fViewer;
+	}
+
+	/**
+	 * 
+	 * @param oldInput
+	 * @param newInput
+	 */
+	void handleInputDocumentChanged(IDocument oldInput, IDocument newInput) {
+		// don't bother if reconciler not installed
+		if (isInstalled()) {
+			setDocument(newInput);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.reconciler.IReconciler#install(ITextViewer)
+	 */
+	public void install(ITextViewer textViewer) {
+		// we might be called multiple times with the same viewe.r,
+		// maybe after being uninstalled as well, so track separately
+		if (!isInstalled()) {
+			fViewer = textViewer;
+			fTextInputListener = new TextInputListener();
+			textViewer.addTextInputListener(fTextInputListener);
+			setInstalled(true);
+		}
+	}
+
+	/**
+	 * The viewer has been set on this Reconciler.
+	 * 
+	 * @return true if the viewer has been set on this Reconciler, false
+	 *         otherwise.
+	 */
+	public boolean isInstalled() {
+		return fIsInstalled;
+	}
+
+	boolean isInRewriteSession() {
+		return fInRewriteSession;
+	}
+
+	/**
+	 * Subclasses should implement for specific handling of dirty regions. The
+	 * method is invoked for each dirty region in the Job's queue.
+	 * 
+	 * @param dirtyRegion
+	 */
+	protected void process(DirtyRegion dirtyRegion) {
+		if (!isInstalled() || isInRewriteSession() || dirtyRegion == null || getDocument() == null) {
+			return;
+		}
+		/*
+		 * Break the dirty region into a sequence of partitions and find the
+		 * corresponding strategy to reconcile those partitions. If a strategy
+		 * implements INonIncrementalReconcilingStrategy, only call it once
+		 * regardless of the number and types of partitions.
+		 */
+		ITypedRegion[] partitions = computePartitioning(dirtyRegion);
+		for (int i = 0; i < partitions.length; i++) {
+			IReconcilingStrategy strategy = getReconcilingStrategy(partitions[i].getType());
+			if (strategy != null) {
+				strategy.reconcile(partitions[i]);
+			}
+		}
+	}
+
+	/**
+	 * Invoke dirty region processing.
+	 * 
+	 * @param node
+	 */
+	public final void processDirtyRegion(DirtyRegion dr) {
+		if (dr == null || !isInstalled())
+			return;
+
+		addRequest(dr);
+		synchronized (LOCK) {
+			fReset = true;
+		}
+
+		if (DEBUG) {
+			System.out.println("added request for: [" + dr.getText() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.println("queue size is now: " + getDirtyRegionQueue().size()); //$NON-NLS-1$
+		}
+	}
+
+	protected IStatus run(IProgressMonitor monitor) {
+		IStatus status = Status.OK_STATUS;
+		if (!PlatformUI.isWorkbenchRunning())
+			return status;
+
+		if (!fHasReconciled) {
+			initialReconcile();
+			fHasReconciled = true;
+		}
+
+		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
+		boolean processed = false;
+		try {
+			synchronized (LOCK) {
+				if (fReset) {
+					fReset = false;
+					return status;
+				}
+			}
+			if (fIsCanceled)
+				return status;
+
+			DirtyRegion[] toRefresh = getRequests();
+			if (toRefresh.length > 0) {
+				processed = true;
+				beginProcessing();
+			}
+
+			for (int i = 0; i < toRefresh.length && fDocument != null; i++) {
+				if (monitor.isCanceled())
+					throw new OperationCanceledException();
+				process(toRefresh[i]);
+			}
+		}
+		catch (Exception e) {
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=103676
+			// stop errors from popping up a dialog
+			// from the job manager
+
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=106052
+			// don't log OperationCanceledException
+			if (!(e instanceof OperationCanceledException))
+				Logger.logException("problem with reconciling", e); //$NON-NLS-1$
+		}
+		finally {
+			if (processed)
+				endProcessing();
+			if (!fIsCanceled)
+				schedule(getDelay());
+
+			monitor.done();
+		}
+		return status;
+	}
+
+	public void setDelay(long delay) {
+		fDelay = delay;
+	}
+
+	public void setDocument(IDocument doc) {
+		if (fDocument != null) {
+			// unhook old document listener
+			fDocument.removeDocumentListener(fDocumentListener);
+			if (fDocument instanceof IDocumentExtension4) {
+				((IDocumentExtension4) fDocument).removeDocumentRewriteSessionListener(fDocumentRewriteSessionListener);
+			}
+		}
+
+		fDocument = doc;
+
+		if (fDocument != null) {
+			if (fDocument instanceof IDocumentExtension4) {
+				((IDocumentExtension4) fDocument).addDocumentRewriteSessionListener(fDocumentRewriteSessionListener);
+			}
+			// hook up new document listener
+			fDocument.addDocumentListener(fDocumentListener);
+
+			setEntireDocumentDirty(doc);
+		}
+	}
+
+	/**
+	 * This method is called before the initial reconciling of the document. 
+	 */
+	protected void initialReconcile() {
+	}
+
+	/**
+	 * Sets the document partitioning for this reconciler.
+	 * 
+	 * @param partitioning
+	 *            the document partitioning for this reconciler
+	 */
+	public void setDocumentPartitioning(String partitioning) {
+		fPartitioning = partitioning;
+	}
+
+	/**
+	 * Forces reconciling of the entire document.
+	 */
+	protected void forceReconciling() {
+		if (!fHasReconciled)
+			return;
+
+		setEntireDocumentDirty(getDocument());
+	}
+
+	/**
+	 * Basically means process the entire document.
+	 * 
+	 * @param document
+	 */
+	protected void setEntireDocumentDirty(IDocument document) {
+
+		// make the entire document dirty
+		// this also happens on a "save as"
+		if (document != null && isInstalled()) {
+
+			// since we're marking the entire doc dirty
+			flushDirtyRegionQueue();
+
+			/**
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=199053
+			 * 
+			 * Process the strategies for the last known-good partitions to
+			 * ensure all problem annotations are cleared if needed.
+			 */
+			if (fLastPartitions != null && document.getLength() == 0) {
+				for (int i = 0; i < fLastPartitions.length; i++) {
+					IReconcilingStrategy strategy = getReconcilingStrategy(fLastPartitions[i].getType());
+					if (strategy != null) {
+						strategy.reconcile(fLastPartitions[i]);
+					}
+				}
+			}
+			else {
+				DirtyRegion entireDocument = createDirtyRegion(0, document.getLength(), DirtyRegion.INSERT);
+				processDirtyRegion(entireDocument);
+			}
+			schedule(getDelay());
+		}
+	}
+
+	/**
+	 * @param isInstalled
+	 *            The isInstalled to set.
+	 */
+	void setInstalled(boolean isInstalled) {
+		fIsInstalled = isInstalled;
+	}
+
+	public void setReconcilingStrategy(String partitionType, IReconcilingStrategy strategy) {
+		if (partitionType == null) {
+			throw new IllegalArgumentException();
+		}
+
+		if (strategy == null) {
+			fReconcilingStrategies.remove(partitionType);
+		}
+		else {
+			fReconcilingStrategies.put(partitionType, strategy);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.reconciler.IReconciler#uninstall()
+	 */
+	public void uninstall() {
+		if (isInstalled()) {
+			// removes widget listener
+			getTextViewer().removeTextInputListener(fTextInputListener);
+			setInstalled(false);
+			cancel();
+			fIsCanceled = true;
+		}
+		fDirtyRegionQueue.clear();
+		setDocument(null);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DocumentAdapter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DocumentAdapter.java
new file mode 100644
index 0000000..d255746
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DocumentAdapter.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.reconciler.IReconcilableModel;
+
+/**
+ * Adapts an <code>IDocument</code> to a <code>IReconcilableModel</code>.
+ * 
+ */
+public class DocumentAdapter implements IReconcilableModel {
+
+	private IDocument fDocument;
+
+	/**
+	 * Creates a text model adapter for the given document.
+	 * 
+	 * @param document
+	 */
+	public DocumentAdapter(IDocument document) {
+		fDocument = document;
+	}
+
+	/**
+	 * Returns this model's document.
+	 * 
+	 * @return the model's input document
+	 */
+	public IDocument getDocument() {
+		return fDocument;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DocumentRegionProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DocumentRegionProcessor.java
new file mode 100644
index 0000000..032bc28
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/DocumentRegionProcessor.java
@@ -0,0 +1,405 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Carver (Intalio) - bug 307323 - remove extraneous call to spell check strategy
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingStrategy;
+import org.eclipse.wst.sse.ui.internal.provisional.preferences.CommonEditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.ValidatorBuilder;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.ValidatorMetaData;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.ValidatorStrategy;
+import org.eclipse.wst.sse.ui.internal.spelling.SpellcheckStrategy;
+import org.eclipse.wst.sse.ui.reconcile.ISourceReconcilingListener;
+
+/**
+ * Adds to DirtyRegionProcessor Job: - IDocumentListener - ValidatorStrategy -
+ * Text viewer(dispose, input changed) listeners. - default, spelling, and
+ * validator strategies - DirtyRegion processing logic.
+ */
+public class DocumentRegionProcessor extends DirtyRegionProcessor {
+	private static final boolean DEBUG_VALIDATORS = Boolean.TRUE.toString().equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerValidators")); //$NON-NLS-1$
+
+	/**
+	 * A strategy to use the defined default Spelling service.
+	 */
+	private IReconcilingStrategy fSpellcheckStrategy;
+
+	/**
+	 * The strategy that runs validators contributed via
+	 * <code>org.eclipse.wst.sse.ui.extensions.sourcevalidation</code>
+	 * extension point
+	 */
+	private ValidatorStrategy fValidatorStrategy;
+
+	private ISourceReconcilingListener[] fReconcileListeners = new ISourceReconcilingListener[0];
+
+	private IReconcilingStrategy fSemanticHighlightingStrategy;
+	
+	/**
+	 * The folding strategy for this processor
+	 */
+	private AbstractStructuredFoldingStrategy fFoldingStrategy;
+	
+	private final String SSE_UI_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+
+	/**
+	 * true if as you type validation is enabled,
+	 * false otherwise
+	 */
+	private boolean fValidationEnabled;
+
+	public void addReconcilingListener(ISourceReconcilingListener listener) {
+		Set listeners = new HashSet(Arrays.asList(fReconcileListeners));
+		listeners.add(listener);
+		fReconcileListeners = (ISourceReconcilingListener[]) listeners.toArray(new ISourceReconcilingListener[listeners.size()]);
+	}
+
+	protected void beginProcessing() {
+		super.beginProcessing();
+		ValidatorStrategy validatorStrategy = getValidatorStrategy();
+		if (validatorStrategy != null) {
+			validatorStrategy.beginProcessing();
+		}
+		if ((getTextViewer() instanceof ISourceViewer)) {
+			for (int i = 0; i < fReconcileListeners.length; i++) {
+				fReconcileListeners[i].aboutToBeReconciled();
+			}
+		}
+	}
+
+	protected void endProcessing() {
+		super.endProcessing();
+		ValidatorStrategy validatorStrategy = getValidatorStrategy();
+		if (validatorStrategy != null) {
+			validatorStrategy.endProcessing();
+		}
+		/* single spell-check for everything to ensure that SpellingProblem offsets are correct */
+		IReconcilingStrategy spellingStrategy = getSpellcheckStrategy();
+		IDocument document = getDocument();
+		if (spellingStrategy != null && document != null) {
+			 spellingStrategy.reconcile(new Region(0, document.getLength()));
+		}
+		
+		IReconcilingStrategy semanticHighlightingStrategy = getSemanticHighlightingStrategy();
+		if (semanticHighlightingStrategy != null && document != null) {
+			semanticHighlightingStrategy.reconcile(new Region(0, document.getLength()));
+		}
+
+		if ((getTextViewer() instanceof ISourceViewer)) {
+			ISourceViewer sourceViewer = (ISourceViewer) getTextViewer();
+			IAnnotationModel annotationModel = sourceViewer.getAnnotationModel();
+			for (int i = 0; i < fReconcileListeners.length; i++) {
+				fReconcileListeners[i].reconciled(document, annotationModel, false, new NullProgressMonitor());
+			}
+		}
+	}
+
+	public void forceReconciling() {
+		super.forceReconciling();
+	}
+
+	protected String getContentType(IDocument doc) {
+		if (doc == null)
+			return null;
+
+		String contentTypeId = null;
+
+		IContentType ct = null;
+		try {
+			IContentDescription desc = Platform.getContentTypeManager().getDescriptionFor(new StringReader(doc.get()), null, IContentDescription.ALL);
+			if (desc != null) {
+				ct = desc.getContentType();
+				if (ct != null)
+					contentTypeId = ct.getId();
+			}
+		}
+		catch (IOException e) {
+			// just bail
+		}
+		return contentTypeId;
+	}
+
+	protected IReconcilingStrategy getSpellcheckStrategy() {
+		if (fSpellcheckStrategy == null && getDocument() != null) {
+			String contentTypeId = getContentType(getDocument());
+			if (contentTypeId == null) {
+				contentTypeId = IContentTypeManager.CT_TEXT;
+			}
+			if (getTextViewer() instanceof ISourceViewer) {
+				ISourceViewer viewer = (ISourceViewer) getTextViewer();
+				fSpellcheckStrategy = new SpellcheckStrategy(viewer, contentTypeId);
+				fSpellcheckStrategy.setDocument(getDocument());
+			}
+		}
+		return fSpellcheckStrategy;
+	}
+	
+	/**
+	 * <p>Get the folding strategy for this processor. Retrieved from the 
+	 * extended configuration builder.  The processor chosen is set by the plugin.</p>
+	 * 
+	 * <p>EX:<br />
+	 * <code>&lt;extension point="org.eclipse.wst.sse.ui.editorConfiguration"&gt;<br />
+	 *  &lt;provisionalConfiguration<br />
+	 *			type="foldingstrategy"<br />
+	 *			class="org.eclipse.wst.xml.ui.internal.projection.XMLFoldingStrategy"<br />
+	 *			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" /&gt;<br />
+	 *	&lt;/extension&gt;</code></p>
+	 * 
+	 * <p>The type must be equal to <code>AbstractFoldingStrategy.ID</code> (AKA: foldingstrategy)
+	 * and the class must extend <code>org.eclipse.wst.sse.ui.internal.projection.AbstractFoldingStrategy</code>
+	 * and the target must be a structured editor content type ID</p>
+	 * 
+	 * @return the requested folding strategy or null if none can be found
+	 */
+	protected IReconcilingStrategy getFoldingStrategy() {
+		if(fFoldingStrategy == null && getDocument() != null) {
+			String contentTypeId = getContentType(getDocument());
+			if (contentTypeId == null) {
+				contentTypeId = IContentTypeManager.CT_TEXT;
+			}
+			
+			ITextViewer viewer = getTextViewer();
+			if(viewer instanceof ProjectionViewer) {
+				ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
+				
+				IContentType type = Platform.getContentTypeManager().getContentType(contentTypeId);
+				while(fFoldingStrategy == null && type != null) {
+					fFoldingStrategy =(AbstractStructuredFoldingStrategy) builder.getConfiguration(
+							AbstractStructuredFoldingStrategy.ID, type.getId());
+				
+					type = type.getBaseType();
+				}
+				
+				if(fFoldingStrategy != null) {
+					fFoldingStrategy.setViewer((ProjectionViewer)viewer);
+					fFoldingStrategy.setDocument(getDocument());
+				}
+			}
+		}
+		
+		return fFoldingStrategy;
+	}
+	
+	/**
+	 * Enable or disable as you type validation. Typically set by a user preference
+	 * 
+	 * @param enable true to enable as you type validation, false to disable
+	 */
+	public void setValidatorStrategyEnabled(boolean enable) {
+		fValidationEnabled = enable;
+	}
+
+	/**
+	 * @return Returns the ValidatorStrategy.
+	 */
+	protected ValidatorStrategy getValidatorStrategy() {
+		ValidatorStrategy validatorStrategy = null;
+		if (fValidatorStrategy == null && fValidationEnabled) {
+			if (getTextViewer() instanceof ISourceViewer) {
+				ISourceViewer viewer = (ISourceViewer) getTextViewer();
+				String contentTypeId = null;
+
+				IDocument doc = viewer.getDocument();
+				contentTypeId = getContentType(doc);
+
+				if (contentTypeId != null) {
+					validatorStrategy = new ValidatorStrategy(viewer, contentTypeId);
+					ValidatorBuilder vBuilder = new ValidatorBuilder();
+					ValidatorMetaData[] vmds = vBuilder.getValidatorMetaData(SSE_UI_ID);
+					List enabledValidators = new ArrayList(1);
+					/* if any "must" handle this content type, just add them */
+					boolean foundSpecificContentTypeValidators = false;
+					for (int i = 0; i < vmds.length; i++) {
+						if (vmds[i].mustHandleContentType(contentTypeId)) {
+							if (DEBUG_VALIDATORS)
+								Logger.log(Logger.INFO, contentTypeId + " using specific validator " + vmds[i].getValidatorId()); //$NON-NLS-1$
+							foundSpecificContentTypeValidators = true;
+							enabledValidators.add(vmds[i]);
+						}
+					}
+					if (!foundSpecificContentTypeValidators) {
+						for (int i = 0; i < vmds.length; i++) {
+							if (vmds[i].canHandleContentType(contentTypeId)) {
+								if (DEBUG_VALIDATORS)
+									Logger.log(Logger.INFO, contentTypeId + " using inherited(?) validator " + vmds[i].getValidatorId()); //$NON-NLS-1$
+								enabledValidators.add(vmds[i]);
+							}
+						}
+					}
+					for (int i = 0; i < enabledValidators.size(); i++) {
+						validatorStrategy.addValidatorMetaData((ValidatorMetaData) enabledValidators.get(i));
+					}
+				}
+			}
+			fValidatorStrategy = validatorStrategy;
+		} else if(fValidatorStrategy != null && fValidationEnabled) {
+			validatorStrategy = fValidatorStrategy;
+		}
+		return validatorStrategy;
+	}
+	
+	public void setSemanticHighlightingStrategy(IReconcilingStrategy semanticHighlightingStrategy) {
+		fSemanticHighlightingStrategy = semanticHighlightingStrategy;
+		fSemanticHighlightingStrategy.setDocument(getDocument());
+	}
+	
+	protected IReconcilingStrategy getSemanticHighlightingStrategy() {
+		return fSemanticHighlightingStrategy;
+	}
+	
+	/**
+	 * @param dirtyRegion
+	 */
+	protected void process(DirtyRegion dirtyRegion) {
+		if (!isInstalled() || isInRewriteSession() || dirtyRegion == null || getDocument() == null)
+			return;
+
+		super.process(dirtyRegion);
+		
+		ITypedRegion[] partitions = computePartitioning(dirtyRegion);
+		
+		// call the validator strategy once for each effected partition
+		DirtyRegion dirty = null;
+		for (int i = 0; i < partitions.length; i++) {
+			dirty = createDirtyRegion(partitions[i], DirtyRegion.INSERT);
+
+			// [source]validator (extension) for this partition
+			if (getValidatorStrategy() != null) {
+				getValidatorStrategy().reconcile(partitions[i], dirty);
+			}
+		}
+		
+		/* if there is a folding strategy then reconcile it for the
+		 * entire dirty region.
+		 * NOTE: the folding strategy does not care about the sub regions.
+		 */
+		if(getFoldingStrategy() != null) {
+			getFoldingStrategy().reconcile(dirtyRegion, null);
+		}
+	}
+	
+	public void removeReconcilingListener(ISourceReconcilingListener listener) {
+		Set listeners = new HashSet(Arrays.asList(fReconcileListeners));
+		listeners.remove(listener);
+		fReconcileListeners = (ISourceReconcilingListener[]) listeners.toArray(new ISourceReconcilingListener[listeners.size()]);
+	}
+
+
+	public void setDocument(IDocument doc) {
+		super.setDocument(doc);
+		
+		IReconcilingStrategy validatorStrategy = getValidatorStrategy();
+		if (validatorStrategy != null) {
+			validatorStrategy.setDocument(doc);
+		}
+		if (fSemanticHighlightingStrategy != null) {
+			fSemanticHighlightingStrategy.setDocument(doc);
+		}
+		
+		fSpellcheckStrategy = null;
+		if(fFoldingStrategy != null) {
+			fFoldingStrategy.uninstall();
+		}
+		fFoldingStrategy = null;
+	}
+
+	protected void setEntireDocumentDirty(IDocument document) {
+		super.setEntireDocumentDirty(document);
+
+		// make the entire document dirty
+		// this also happens on a "save as"
+		if (document != null && isInstalled() && fLastPartitions != null && document.getLength() == 0) {
+			/**
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=199053
+			 * 
+			 * Process the strategies for the last known-good partitions.
+			 */
+			for (int i = 0; i < fLastPartitions.length; i++) {
+				ValidatorStrategy validatorStrategy = getValidatorStrategy();
+				if (validatorStrategy != null) {
+					validatorStrategy.reconcile(fLastPartitions[i], createDirtyRegion(fLastPartitions[i], DirtyRegion.REMOVE));
+				}
+			}
+			IReconcilingStrategy spellingStrategy = getSpellcheckStrategy();
+			if (spellingStrategy != null) {
+				spellingStrategy.reconcile(new Region(0, document.getLength()));
+			}
+			
+			//if there is a folding strategy then reconcile it
+			if(getFoldingStrategy() != null) {
+				getFoldingStrategy().reconcile(new Region(0, document.getLength()));
+			}
+		}
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.DirtyRegionProcessor#install(org.eclipse.jface.text.ITextViewer)
+	 */
+	public void install(ITextViewer textViewer) {
+		super.install(textViewer);
+
+		//determine if validation is enabled
+		this.fValidationEnabled = SSEUIPlugin.getInstance().getPreferenceStore().getBoolean(
+				CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.DirtyRegionProcessor#uninstall()
+	 */
+	public void uninstall() {
+		if (isInstalled()) {
+
+			cancel();
+
+			IReconcilingStrategy validatorStrategy = getValidatorStrategy();
+
+			if (validatorStrategy != null) {
+				if (validatorStrategy instanceof IReleasable)
+					((IReleasable) validatorStrategy).release();
+			}
+			
+			if (fSpellcheckStrategy != null) {
+				fSpellcheckStrategy.setDocument(null);
+				fSpellcheckStrategy = null;
+			}
+
+			fReconcileListeners = new ISourceReconcilingListener[0];
+		}
+		super.uninstall();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IConfigurableReconciler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IConfigurableReconciler.java
new file mode 100644
index 0000000..6f8b28f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IConfigurableReconciler.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+
+/**
+ * A reconciler that allows IReconcilingStrategies to be assigned to partition
+ * types. The reconciler will call the registered IReconcilingStrategy when
+ * dirty regions which contain partitions of a specific type need to be
+ * reconciled.
+ * 
+ * @since 1.1
+ */
+public interface IConfigurableReconciler {
+	/**
+	 * Sets the reconciling strategy for the reconciler to use for the
+	 * specified content type.
+	 * 
+	 * @param partitionType
+	 *            the partition type
+	 * @param strategy
+	 *            the reconciling strategy
+	 */
+	void setReconcilingStrategy(String partitionType, IReconcilingStrategy strategy);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IReconcileAnnotationKey.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IReconcileAnnotationKey.java
new file mode 100644
index 0000000..e3b02b2
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IReconcileAnnotationKey.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+
+/**
+ * Defines an annotation key that the
+ * <code>AbstractStructuredTextReconcilingStrategy</code> knows how to
+ * remove appropriately.
+ * 
+ * @deprecated not API, this will probably just become an abstract class
+ * 
+ * @author pavery
+ */
+public interface IReconcileAnnotationKey {
+	static final int PARTIAL = 1;
+	static final int TOTAL = 0;
+
+	String getPartitionType();
+
+	//int getScope();
+
+	IReconcileStep getStep();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IStructuredReconcileStep.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IStructuredReconcileStep.java
new file mode 100644
index 0000000..d51bc99
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IStructuredReconcileStep.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcileResult;
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+
+/**
+ * @author pavery
+ * @deprecated still working out API (or if anything here should be API)
+ * 
+ * Interface for a step in StructuredRegionProcessor framework.
+ */
+public interface IStructuredReconcileStep extends IReconcileStep {
+	/**
+	 * Partitions for which this step can add/remove annotions
+	 * 
+	 * @return an array of the partitions for which this step can add/remove
+	 *         annotions
+	 */
+	String[] getPartitionTypes();
+
+	/**
+	 * Returns the scope for which this step adds annotations.
+	 * 
+	 * @return the scope for which this step adds annotations
+	 */
+	//int getScope();
+
+	/**
+	 * Tells you if the step is equal to this step or any of the sibling
+	 * steps.
+	 * 
+	 * @return
+	 */
+	boolean isSiblingStep(IReconcileStep step);
+
+	/**
+	 * Adds awareness that the Reconciler is reconciling the entire document
+	 * this call.
+	 * 
+	 * @param dirtyRegion
+	 * @param subRegion
+	 * @param refreshAll
+	 * @return
+	 */
+	IReconcileResult[] reconcile(DirtyRegion dirtyRegion, IRegion subRegion, boolean refreshAll);
+
+	/**
+	 * Used to reset the state of the Strategy. For example: any flags that
+	 * need to be reset after a long running operation like processAll().
+	 */
+	void reset();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IStructuredReconcilingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IStructuredReconcilingStrategy.java
new file mode 100644
index 0000000..5b02f88
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IStructuredReconcilingStrategy.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+
+
+/**
+ * Interface for structured reconciling strategies.
+ * 
+ * @deprecated doesn't need to be API and might go away
+ * 
+ * @author pavery
+ */
+public interface IStructuredReconcilingStrategy extends IReconcilingStrategy {
+	/**
+	 * Adds awareness that the reconciler is processing the entire document
+	 * via refreshAll flag.
+	 * 
+	 * @param dirtyRegion
+	 * @param subRegion
+	 * @param refreshAll
+	 */
+	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion, boolean refreshAll);
+
+	/**
+	 * Used to reset the state of the Strategy. For example: any flags that
+	 * need to be reset after a long running operation like processAll().
+	 */
+	public void reset();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/ReconcileAnnotationKey.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/ReconcileAnnotationKey.java
new file mode 100644
index 0000000..e9284a3
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/ReconcileAnnotationKey.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+
+
+/**
+ * Implementation of <code>IReconcileAnnotationKey</code> note: clients
+ * should use the method StructuredReconcileStep#createKey(String
+ * partitionType, int scope)
+ * 
+ * @author pavery
+ */
+public class ReconcileAnnotationKey {
+    
+    public static final int PARTIAL = 1;
+    public static final int TOTAL = 0;
+    
+	private String fPartitionType = null;
+
+	private IReconcileStep fReconcileStep = null;
+	private int fScope;
+
+	public ReconcileAnnotationKey(IReconcileStep step, String partitionType, int scope) {
+		fReconcileStep = step;
+		fPartitionType = partitionType;
+		fScope = scope;
+	}
+
+	public String getPartitionType() {
+		return fPartitionType;
+	}
+
+	public int getScope() {
+		return fScope;
+	}
+
+	public IReconcileStep getStep() {
+		return fReconcileStep;
+	}
+
+	public String toString() {
+		return this.getClass() + "\r\nid: " + fPartitionType; //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredReconcileStep.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredReconcileStep.java
new file mode 100644
index 0000000..bd8b0b7
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredReconcileStep.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.reconciler.AbstractReconcileStep;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilableModel;
+import org.eclipse.jface.text.reconciler.IReconcileResult;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
+import org.eclipse.wst.sse.core.text.IStructuredPartitions;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+/**
+ * ReconcileStep that knows about the annotation that it adds to the
+ * AnnotationModel. It knows how to create an annotation key (for smart
+ * removal later) It knows the partition types on which it can operate. It
+ * knows the scope on which it operates (for short circuiting) It knows if the
+ * Reconciler is reconciling the entire document.
+ * 
+ * Clients must subclass this class.
+ * 
+ * @author pavery
+ */
+public abstract class StructuredReconcileStep extends AbstractReconcileStep implements IReleasable {
+
+	/** debug flag */
+	protected static final boolean DEBUG;
+	static {
+		String value = Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerjob"); //$NON-NLS-1$
+		DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+	}
+
+	protected final IReconcileResult[] EMPTY_RECONCILE_RESULT_SET = new IReconcileResult[0];
+	
+	/**
+	 * It's possible for a partial step to get called on the same area twice
+	 * (as w/ a full document reconcile) this list keeps track of area already
+	 * covered. Should be reset() after the "batch" of reconciling is
+	 * finished.
+	 */
+	private HashSet fPartitionTypes = null;
+
+	public StructuredReconcileStep() {
+		super();
+		fPartitionTypes = new HashSet();
+	}
+
+	public ReconcileAnnotationKey createKey(IStructuredDocumentRegion sdRegion, int scope) {
+
+		ITypedRegion tr = getPartition(sdRegion);
+		String partitionType = (tr != null) ? tr.getType() : IStructuredPartitions.UNKNOWN_PARTITION;
+		return createKey(partitionType, scope);
+	}
+
+	/**
+	 * @param sdRegion
+	 * @return
+	 */
+	protected ITypedRegion getPartition(IStructuredDocumentRegion sdRegion) {
+		ITypedRegion tr = null;
+		if (!sdRegion.isDeleted())
+			tr = getPartition(sdRegion.getParentDocument(), sdRegion.getStartOffset());
+		return tr;
+	}
+
+	private ITypedRegion getPartition(IDocument doc, int offset) {
+		ITypedRegion tr = null;
+		// not sure why document would ever be null, but put in this 
+		// guard for 
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=86069
+		if (doc != null) {
+			try {
+				tr = TextUtilities.getPartition(doc, IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, false);
+			} catch (BadLocationException e) {
+				if (DEBUG)
+					Logger.logException("problem getting partition at: " + offset, e); //$NON-NLS-1$
+			}
+		}
+		return tr;
+	}
+
+	/**
+	 * Clients should use this method to create annotation keys as it
+	 * registers the key for removal later.
+	 * 
+	 * @param partitionType
+	 * @param scope
+	 * @return
+	 */
+	public ReconcileAnnotationKey createKey(String partitionType, int scope) {
+		fPartitionTypes.add(partitionType);
+		return new ReconcileAnnotationKey(this, partitionType, scope);
+	}
+
+	protected IDocument getDocument() {
+		IDocument doc = null;
+		IReconcilableModel rModel = getModel();
+		if (rModel instanceof DocumentAdapter) {
+			doc = ((DocumentAdapter) rModel).getDocument();
+		}
+		return doc;
+	}
+
+	public IReconcilableModel getModel() {
+		return getInputModel();
+	}
+
+	public String getPartitionType(IDocument doc, int offset) {
+		ITypedRegion tr = getPartition(doc, offset);
+		return (tr != null) ? tr.getType() : IStructuredPartitions.UNKNOWN_PARTITION;
+	}
+
+	public String[] getPartitionTypes() {
+		// using hash set to automatically get rid of dupes
+		HashSet tempResults = new HashSet();
+		// add these partition types
+		tempResults.addAll(fPartitionTypes);
+		return (String[]) tempResults.toArray(new String[tempResults.size()]);
+	}
+
+	protected IStructuredDocument getStructuredDocument() {
+		IStructuredDocument sDoc = null;
+		IDocument doc = getDocument();
+		if (doc instanceof IStructuredDocument)
+			sDoc = (IStructuredDocument) getDocument();
+		return sDoc;
+	}
+
+	/**
+	 * Removes duplicates.
+	 * 
+	 * @param results1
+	 * @param results2
+	 * @return
+	 */
+	protected IReconcileResult[] merge(IReconcileResult[] results1, IReconcileResult[] results2) {
+		if (results1 == null)
+			return results2;
+		if (results2 == null)
+			return results1;
+
+		List results = new ArrayList();
+		results.addAll(Arrays.asList(results1));
+		for (int i = 0; i < results2.length; i++) {
+			results.add(results2[i]);
+		}
+		return (IReconcileResult[]) results.toArray(new IReconcileResult[results.size()]);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.reconciler.AbstractReconcileStep#reconcileModel(org.eclipse.jface.text.reconciler.DirtyRegion,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	protected IReconcileResult[] reconcileModel(DirtyRegion dirtyRegion, IRegion subRegion) {
+		return EMPTY_RECONCILE_RESULT_SET;
+	}
+
+	/**
+	 * Release resources used by the step here as needed. Be sure to call
+	 * super.release() when you override this method as to propagate the
+	 * release through all steps.
+	 */
+	public void release() {
+		// 
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredRegionProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredRegionProcessor.java
new file mode 100644
index 0000000..7861f66
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredRegionProcessor.java
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
+import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+
+/**
+ * An IStructuredModel aware Region Processor. Adds ModelLifecycle listener.
+ * ModelLifecycle listener notifies us that some reinitialization needs to
+ * take place.
+ * 
+ * Model aware "process()" Implements a IndexedRegion-based "contains()"
+ * method using IStructuredModel.
+ * 
+ */
+public class StructuredRegionProcessor extends DocumentRegionProcessor {
+
+	class ModelLifecycleListener implements IModelLifecycleListener {
+		IStructuredModel changing = null;
+		/**
+		 * @see org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener#processPostModelEvent(org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent)
+		 */
+		public void processPostModelEvent(ModelLifecycleEvent event) {
+
+			// if underlying StructuredDocument changed, need to reconnect it
+			// here...
+			// ex. file is modified outside the workbench
+			if (event.getType() == ModelLifecycleEvent.MODEL_DOCUMENT_CHANGED) {
+				if (changing != null && event.getModel() == changing) {
+					IStructuredDocument sDoc = event.getModel().getStructuredDocument();
+
+					if (DEBUG) {
+						System.out.println("======================================================"); //$NON-NLS-1$
+						System.out.println("StructuredRegionProcessor: DOCUMENT MODEL CHANGED TO: "); //$NON-NLS-1$
+						System.out.println(sDoc.get());
+						System.out.println("======================================================"); //$NON-NLS-1$
+					}
+					setDocument(sDoc);
+				}
+				changing = null;
+			}
+		}
+
+		/**
+		 * @see org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener#processPreModelEvent(org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent)
+		 */
+		public void processPreModelEvent(ModelLifecycleEvent event) {
+			if(fCurrentDoc != null) {
+				IStructuredModel model = null;
+				try {
+					model = getStructuredModelForRead(fCurrentDoc);
+					if (event.getType() == ModelLifecycleEvent.MODEL_DOCUMENT_CHANGED && event.getModel() == model) {
+						changing = event.getModel();
+						flushDirtyRegionQueue();
+						// note: old annotations are removed via the strategies on
+						// AbstractStructuredTextReconcilingStrategy#setDocument(...)
+					}
+				} finally {
+					if(model != null) {
+						model.releaseFromRead();
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * The life cycle listener used to listen to the current documents model even though
+	 * this class does not hold onto a reference to the model.
+	 */
+	private IModelLifecycleListener fLifeCycleListener = new ModelLifecycleListener();
+	/** Used to get the current model on demand so a model does not need to be held by permanently */
+	private IDocument fCurrentDoc = null;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.DirtyRegionProcessor#getOuterRegion(org.eclipse.jface.text.reconciler.DirtyRegion,
+	 *      org.eclipse.jface.text.reconciler.DirtyRegion)
+	 */
+	protected DirtyRegion getOuterRegion(DirtyRegion root, DirtyRegion possible) {
+		// first try simple region check if one region contains the other
+		DirtyRegion outer = super.getOuterRegion(root, possible);
+		if (outer == null && fCurrentDoc != null) {
+			IStructuredModel sModel = null;
+			try {
+				sModel = getStructuredModelForRead(fCurrentDoc);
+				if (sModel != null) {
+					// now compare nodes
+					IndexedRegion rootRegion = sModel.getIndexedRegion(root.getOffset());
+					IndexedRegion possRegion = sModel.getIndexedRegion(possible.getOffset());
+					if (rootRegion != null && possRegion != null) {
+						int rootStart = rootRegion.getStartOffset();
+						int possStart = possRegion.getStartOffset();
+						// first just check if rootregion starts before
+						// possregion
+						if (rootStart <= possStart) {
+							// check if possregion is inside rootregion
+							outer = _getOuterRegion(root, possible, sModel, rootStart, possStart);
+						}
+						else {
+							// otherwise if rootregion is inside possregion
+							outer = _getOuterRegion(possible, root, sModel, possStart, rootStart);
+						}
+					}
+				}
+				
+			} finally {
+				if(sModel != null) {
+					sModel.releaseFromRead();
+				}
+			}
+		}
+		return outer;
+	}
+
+	/**
+	 * Assumes that when this method is called, region1's node start offset >=
+	 * region2's node start offset. Determines if region1 contains region2 or
+	 * vice versa. Returns region1 if:
+	 * <ul>
+	 * <li>region1's node region == region2's node region</li>
+	 * <li>region1's node region contains region2's node region</li>
+	 * </ul>
+	 * Returns region2 if:
+	 * <ul>
+	 * <li>region1's node region and region2's node region starts at same
+	 * offset but region2's node region is longer</li>
+	 * </ul>
+	 * Returns null otherwise.
+	 * 
+	 * @param region1
+	 * @param region2
+	 * @param sModel
+	 * @param region1NodeStart
+	 * @param region2NodeStart
+	 * @return outer dirty region or null if none exists.
+	 */
+	private DirtyRegion _getOuterRegion(DirtyRegion region1, DirtyRegion region2, IStructuredModel sModel, int region1NodeStart, int region2NodeStart) {
+		DirtyRegion outer = null;
+		int region1NodeEnd = -1;
+		int region2NodeEnd = -1;
+		// then check if region1's end appears after
+		// region2's end
+		IndexedRegion region1EndNode = sModel.getIndexedRegion(region1.getOffset() + region1.getLength());
+		if (region1EndNode == null) {
+			// if no end, just assume region spans all the
+			// way to the end so it includes other region
+			outer = region1;
+		}
+		else {
+			region1NodeEnd = region1EndNode.getEndOffset();
+			IndexedRegion region2EndNode = sModel.getIndexedRegion(region2.getOffset() + region2.getLength());
+			region2NodeEnd = region2EndNode != null ? region2EndNode.getEndOffset() : getDocument().getLength();
+			if (region1NodeEnd >= region2NodeEnd) {
+				// root contains or is equal to possible
+				outer = region1;
+			}
+			else if (region1NodeStart == region2NodeStart && region2NodeEnd >= region1NodeEnd) {
+				// possible contains root because they
+				// both start at same place but possible
+				// is longer
+				outer = region2;
+			}
+		}
+		if (DEBUG) {
+			if (outer != null)
+				System.out.println("checking if [" + region1NodeStart + ":" + region1NodeEnd + "] contains [" + region2NodeStart + ":" + region2NodeEnd + "] ... " + outer.toString()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+			else
+				System.out.println("checking if [" + region1NodeStart + ":" + region1NodeEnd + "] contains [" + region2NodeStart + ":" + region2NodeEnd + "] ... NO CONTAIN"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+		}
+		return outer;
+	}
+
+	/**
+	 * We already know content type from when we created the model, so just
+	 * use that.
+	 */
+	protected String getContentType(IDocument doc) {
+		String contentTypeId = null;
+		IStructuredModel sModel = null;
+		try {
+			sModel = getStructuredModelForRead(doc);
+			if (sModel != null) {
+				contentTypeId = sModel.getContentTypeIdentifier();
+			}
+		}
+		finally {
+			if (sModel != null)
+				sModel.releaseFromRead();
+		}
+		return contentTypeId;
+	}
+
+
+	/**
+	 * Remember to release model after use!!
+	 * 
+	 * @return
+	 */
+	private IStructuredModel getStructuredModelForRead(IDocument doc) {
+		IStructuredModel sModel = null;
+		if (doc != null && doc instanceof IStructuredDocument)
+			sModel = StructuredModelManager.getModelManager().getModelForRead((IStructuredDocument) doc);
+		return sModel;
+	}
+
+	protected void process(DirtyRegion dirtyRegion) {
+		if (!isInstalled() || isInRewriteSession() || dirtyRegion == null || getDocument() == null)
+			return;
+
+		// unhook old lifecycle listener
+		if(fCurrentDoc != null) {
+			IStructuredModel sModel = null;
+			try {
+				sModel = getStructuredModelForRead(fCurrentDoc);
+				
+				// use structured model to determine area to process
+				if (sModel != null) {
+					int start = dirtyRegion.getOffset();
+					int end = start + dirtyRegion.getLength();
+					IndexedRegion irStart = sModel.getIndexedRegion(start);
+					IndexedRegion irEnd = sModel.getIndexedRegion(end);
+
+					if (irStart != null) {
+						start = Math.min(start, irStart.getStartOffset());
+					}
+					if (irEnd != null) {
+						end = Math.max(end, irEnd.getEndOffset());
+					}
+					super.process(createDirtyRegion(start, end - start, DirtyRegion.INSERT));
+				} else {
+					super.process(dirtyRegion);
+				}
+			} finally {
+				if(sModel != null) {
+					sModel.releaseFromRead();
+				}
+			}
+		} else {
+			super.process(dirtyRegion);
+		}
+	}
+
+	/**
+	 * Reinitializes listeners and sets new document onall strategies.
+	 * 
+	 * @see org.eclipse.jface.text.reconciler.AbstractReconciler#reconcilerDocumentChanged(IDocument)
+	 */
+	protected void reconcilerDocumentChanged(IDocument newDocument) {
+		setDocument(newDocument);
+	}
+
+	public void setDocument(IDocument newDocument) {
+		// unhook old lifecycle listener
+		if(fCurrentDoc != null) {
+			IStructuredModel oldModel = null;
+			try {
+				oldModel = getStructuredModelForRead(fCurrentDoc);
+				if(oldModel != null) {
+					oldModel.removeModelLifecycleListener(fLifeCycleListener);
+				}
+			} finally {
+				if(oldModel != null) {
+					oldModel.releaseFromRead();
+				}
+			}
+		}
+		
+		//set the new document
+		super.setDocument(newDocument);
+		fCurrentDoc = newDocument;
+		
+		// add new lifecycle listener
+		if (newDocument != null) {
+			IStructuredModel newModel = null;
+			try {
+				newModel = getStructuredModelForRead(newDocument);
+				if(newModel != null) {
+					newModel.addModelLifecycleListener(fLifeCycleListener);
+				}
+			} finally {
+				if(newModel != null) {
+					newModel.releaseFromRead();
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredTextReconcilingStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredTextReconcilingStrategy.java
new file mode 100644
index 0000000..f995d23
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredTextReconcilingStrategy.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+
+/**
+ * Uses IStructuredModel nodes to check "overlaps()" when getting annotations to remove.
+ */
+public abstract class StructuredTextReconcilingStrategy extends AbstractStructuredTextReconcilingStrategy {
+	
+
+	public StructuredTextReconcilingStrategy(ISourceViewer sourceViewer) {
+		super(sourceViewer);
+	}
+
+	/**
+	 * Checks if this position overlaps any of the StructuredDocument regions'
+	 * correstponding IndexedRegion.
+	 * 
+	 * @param pos
+	 * @param dr
+	 * @return true if the position overlaps any of the regions, otherwise
+	 *         false.
+	 */
+	protected boolean overlaps(Position pos, IStructuredDocumentRegion[] sdRegions) {
+		int start = -1;
+		int end = -1;
+		for (int i = 0; i < sdRegions.length; i++) {
+		    if(!sdRegions[i].isDeleted()) {
+    			IndexedRegion corresponding = getCorrespondingNode(sdRegions[i]);
+                if(corresponding != null) {
+        			if (start == -1 || start > corresponding.getStartOffset())
+        				start = corresponding.getStartOffset();
+        			if (end == -1 || end < corresponding.getEndOffset())
+        				end = corresponding.getEndOffset();
+                }
+            }
+		}
+		return pos.overlapsWith(start, end - start);
+	}
+
+	/**
+	 * Returns the corresponding node for the StructuredDocumentRegion.
+	 * 
+	 * @param sdRegion
+	 * @return the corresponding node for sdRegion
+	 */
+	protected IndexedRegion getCorrespondingNode(IStructuredDocumentRegion sdRegion) {
+		IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+        IndexedRegion indexedRegion = null;
+        try {
+            if (sModel != null) 
+                indexedRegion = sModel.getIndexedRegion(sdRegion.getStart());    
+        } finally {
+            if (sModel != null)
+                sModel.releaseFromRead();
+        }
+        return indexedRegion;
+    }
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/TemporaryAnnotation.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/TemporaryAnnotation.java
new file mode 100644
index 0000000..4f7ea9b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/TemporaryAnnotation.java
@@ -0,0 +1,258 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile;
+
+import java.util.Map;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.quickassist.IQuickFixableAnnotation;
+import org.eclipse.jface.text.reconciler.IReconcileResult;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationAccessExtension;
+import org.eclipse.jface.text.source.IAnnotationPresentation;
+import org.eclipse.jface.text.source.ImageUtilities;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.AnnotationPreferenceLookup;
+import org.eclipse.wst.sse.ui.internal.ITemporaryAnnotation;
+
+
+/**
+ * An implementation of ITemporaryAnnotation @
+ * @author pavery
+ */
+public class TemporaryAnnotation extends Annotation implements ITemporaryAnnotation, IReconcileResult, IAnnotationPresentation, IQuickFixableAnnotation {
+	// remember to change these if it changes in the extension point
+	// may need a different home for them in the future, but they're here for
+	// now
+	public final static String ANNOT_ERROR = "org.eclipse.wst.sse.ui.temp.error"; //$NON-NLS-1$
+	public final static String ANNOT_INFO = "org.eclipse.wst.sse.ui.temp.info"; //$NON-NLS-1$
+
+	// pa_TODO what should the ID be for this?
+	public final static String ANNOT_UNKNOWN = Annotation.TYPE_UNKNOWN;
+	public final static String ANNOT_WARNING = "org.eclipse.wst.sse.ui.temp.warning"; //$NON-NLS-1$
+
+    // copied from CompilationUnitDocumentProvider.ProblemAnnotation
+    //XXX: To be fully correct these constants should be non-static
+
+    private static final int INFO_LAYER;
+
+    private static final int WARNING_LAYER;
+
+    private static final int ERROR_LAYER;
+
+    static {
+        AnnotationPreferenceLookup lookup= EditorsUI.getAnnotationPreferenceLookup();
+        INFO_LAYER= computeLayer("org.eclipse.wst.sse.ui.temp.info", lookup); //$NON-NLS-1$
+        WARNING_LAYER= computeLayer("org.eclipse.wst.sse.ui.temp.warning", lookup); //$NON-NLS-1$
+        ERROR_LAYER= computeLayer("org.eclipse.wst.sse.ui.temp.error", lookup); //$NON-NLS-1$
+    }
+    
+    private static int computeLayer(String annotationType, AnnotationPreferenceLookup lookup) {
+        Annotation annotation= new Annotation(annotationType, false, null);
+        AnnotationPreference preference= lookup.getAnnotationPreference(annotation);
+        if (preference != null)
+            return preference.getPresentationLayer() + 1;
+        else
+            return IAnnotationAccessExtension.DEFAULT_LAYER + 1;
+    }
+    
+    
+	private Object fAdditionalFixInfo = null;
+
+	private Object fKey = null;
+	private Position fPosition = null;
+	private Map fAttributes = null;
+	private boolean fIsQuickFixable = false;
+	private boolean fIsQuickFixableStateSet = false;
+
+	private int fProblemID;
+
+    private int fLayer = DEFAULT_LAYER;
+    
+    private Image fImage = null;
+
+	public TemporaryAnnotation(Position p, String type, String message, ReconcileAnnotationKey key) {
+		super();
+		fPosition = p;
+		setType(type);
+		fKey = key;
+		setText(message);
+        initLayer();
+        initImage();
+	}
+
+	public TemporaryAnnotation(Position p, String type, String message, ReconcileAnnotationKey key, int problemId) {
+		super();
+		fPosition = p;
+		fKey = key;
+		setType(type);
+		setText(message);
+		fProblemID = problemId;
+        initLayer();
+        initImage();
+	}
+
+    private void initLayer() {
+        
+        String type = getType();
+        if(type.equals(ANNOT_ERROR)) {
+            fLayer = ERROR_LAYER;
+        }
+        else if(type.equals(ANNOT_WARNING)) {
+            fLayer = WARNING_LAYER;
+        }
+        else if(type.equals(ANNOT_INFO)) {
+            fLayer = INFO_LAYER;
+        }
+    }
+    
+    private void initImage() {
+        // later we can add support for quick fix images.
+        String type = getType();
+        if(type.equals(ANNOT_ERROR)) {
+            fImage = null;
+        }
+        else if(type.equals(ANNOT_WARNING)) {
+            fImage = null;
+        }
+        else if(type.equals(ANNOT_INFO)) {
+            fImage = null;
+        }
+    }
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		// this check doesn't take into consideration that annotation
+		// positions that change from a text edit before it
+		// we should be checking if the annotation is still on the same line,
+		// and the distance from the start of the line is the same
+		if (obj instanceof TemporaryAnnotation) {
+
+			TemporaryAnnotation ta = (TemporaryAnnotation) obj;
+
+            boolean samePosition = ta.getPosition().equals(this.getPosition());
+            boolean sameText = false;
+
+            if(ta.getText() != null && this.getText() != null && ta.getText().equals(this.getText()))
+                sameText = true;
+            else if(ta.getText( )== null && this.getText() == null)
+                sameText = true;
+            
+			return  sameText && samePosition;
+		}
+		return super.equals(obj);
+	}
+
+	/**
+	 * Additional info required to fix this problem.
+	 * 
+	 * @return an Object that contains additional info on how to fix this
+	 *         problem, or null if there is none
+	 */
+	public Object getAdditionalFixInfo() {
+		return fAdditionalFixInfo;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.ITemporaryAnnotation#getDescription()
+	 */
+	public String getDescription() {
+		return getText();
+	}
+
+	public Object getKey() {
+		return fKey;
+	}
+
+	public Position getPosition() {
+		return fPosition;
+	}
+
+	/**
+	 * @return Returns the problemID.
+	 */
+	public int getProblemID() {
+		return fProblemID;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.Annotation#isPersistent()
+	 */
+	public boolean isPersistent() {
+		return false;
+	}
+
+	/**
+	 * Sets additional information useful to fixing this problem.
+	 * 
+	 * @param an
+	 *            Object that contains additional info on how to fix this
+	 *            problem
+	 */
+	public void setAdditionalFixInfo(Object info) {
+		fAdditionalFixInfo = info;
+		setQuickFixable(true);
+	}
+
+    public int getLayer() {
+        return fLayer;
+    }
+    
+    /*
+     * @see Annotation#paint
+     */
+    public void paint(GC gc, Canvas canvas, Rectangle r) {
+        //initializeImages();
+        if (fImage != null)
+            ImageUtilities.drawImage(fImage, gc, canvas, r, SWT.CENTER, SWT.TOP);
+    }
+    
+	public String toString() {
+		return "" + fPosition.getOffset() + ':' + fPosition.getLength() + ": " + getText(); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	public Map getAttributes() {
+		return fAttributes;
+	}
+	
+	public void setAttributes(Map attributes) {
+		fAttributes = attributes;
+	}
+	
+	public boolean isQuickFixable() {
+		return fIsQuickFixable;
+	}
+	
+	public void setQuickFixable(boolean state) {
+		fIsQuickFixable = state;
+		fIsQuickFixableStateSet = true;
+	}
+	
+	public boolean isQuickFixableStateSet() {
+		return fIsQuickFixableStateSet;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/AnnotationInfo.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/AnnotationInfo.java
new file mode 100644
index 0000000..609420e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/AnnotationInfo.java
@@ -0,0 +1,38 @@
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+/**
+ * Holds info to create a TemporaryAnnotation.
+ *
+ * @since 1.0
+ */
+public class AnnotationInfo {
+	
+	public static final int NO_PROBLEM_ID = -1;
+	private	IMessage fMessage = null;
+	private Object fAdditionalFixInfo = null;
+	private int fProblemId = NO_PROBLEM_ID;
+	
+	public AnnotationInfo(IMessage message) {
+		fMessage = message;
+		
+	}
+	public AnnotationInfo(IMessage message, int problemId, Object additionalFixInfo) {
+		this(message);
+		fProblemId = problemId;
+		fAdditionalFixInfo = additionalFixInfo;
+	}
+	
+	public final IMessage getMessage() {
+		return fMessage;
+	}
+	
+	public final Object getAdditionalFixInfo() {
+		return fAdditionalFixInfo;
+	}
+	
+	public final int getProblemId() {
+		return fProblemId;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ISourceValidator.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ISourceValidator.java
new file mode 100644
index 0000000..1e09976
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ISourceValidator.java
@@ -0,0 +1,42 @@
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+
+/**
+ * Interface to allow for "partial document" as you type validation.
+ *
+ */
+public interface ISourceValidator {
+	
+	/**
+	 * As you type validation is getting "hooked up" to this IDocument.
+	 * This is the instance of IDocument that the validator should
+	 * operate on for each validate call.
+	 * 
+	 * @param document
+	 */
+	void connect(IDocument document);
+	
+	/**
+	 * The same IDocument passed in from the connect() method.
+	 * This indicates that as you type validation is "shutting down"
+	 * for this IDocument.
+	 * 
+	 * @param document
+	 */
+	void disconnect(IDocument document);
+	
+	/**
+	 * Like IValidator#validate(IValidationContext helper, IReporter reporter)
+	 * except passes the dirty region, so document validation can be better
+	 * optimized.
+	 * 
+	 * @param dirtyRegion
+	 * @param helper
+	 * @param reporter
+	 */
+	void validate(IRegion dirtyRegion, IValidationContext helper, IReporter reporter);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/IncrementalHelper.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/IncrementalHelper.java
new file mode 100644
index 0000000..9615163
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/IncrementalHelper.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+
+
+
+public class IncrementalHelper implements IValidationContext {
+	private IProject fProject;
+
+	private String fURI = null;
+	
+	public IncrementalHelper(IDocument sourceDocument, IProject project) {
+		super();
+		fProject = project;
+	}
+
+	public String getPortableName(IResource resource) {
+		return resource.getProjectRelativePath().toString();
+	}
+
+	public IProject getProject() {
+		return fProject;
+	}
+
+	public Object loadModel(String symbolicName) {
+		return null;
+	}
+
+	public Object loadModel(String symbolicName, Object[] parms) {
+		return null;
+	}
+
+	public void setURI(String uri) {
+		fURI = uri;
+	}
+	
+	public String[] getURIs() {
+		if(fURI != null)
+			return new String[]{fURI};
+		return new String[0];
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/IncrementalReporter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/IncrementalReporter.java
new file mode 100644
index 0000000..d1c8e2c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/IncrementalReporter.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+
+/**
+ * Right now we'll only use one reporter per validator.
+ */
+public class IncrementalReporter implements IReporter {
+	private IProgressMonitor fProgressMonitor;
+	private HashMap messages = new HashMap();
+
+	public IncrementalReporter(IProgressMonitor progressMonitor) {
+		super();
+		fProgressMonitor = progressMonitor;
+	}
+
+	public void addMessage(IValidator validator, IMessage message) {
+		AnnotationInfo info = new AnnotationInfo(message);
+		addAnnotationInfo(validator, info);
+	}
+
+	public final void addAnnotationInfo(IValidator validator, AnnotationInfo info) {
+		Object existingValue = messages.get(validator);
+		if (existingValue != null) {
+			((HashSet) existingValue).add(info);
+		}
+		else {
+			HashSet newValue = new HashSet(1);
+			newValue.add(info);
+			messages.put(validator, newValue);
+		}
+	}
+
+	public void displaySubtask(IValidator validator, IMessage message) {
+		if ((message == null) || (message.equals(""))) { //$NON-NLS-1$
+			return;
+		}
+		if (fProgressMonitor != null) {
+			fProgressMonitor.subTask(message.getText(validator.getClass().getClassLoader()));
+		}
+	}
+
+	public List getMessages() {
+		List result = new ArrayList();
+		// messages is a list of:
+		// validators => HashSet(AnnotationInfo1, AnnotationInfo2, ...)
+		// (one HashSet per validator...)
+		Object[] lists = messages.values().toArray();
+		for (int i = 0; i < lists.length; i++) {
+			Iterator it = ((HashSet)lists[i]).iterator();
+			while (it.hasNext()) {
+				AnnotationInfo info = (AnnotationInfo) it.next();
+				result.add(info.getMessage());
+			}
+		}
+		return result;
+	}
+	
+	public AnnotationInfo[] getAnnotationInfo() {
+		List result = new ArrayList();
+		Object[] infos = messages.values().toArray();
+		for (int i = 0; i < infos.length; i++) {
+			result.addAll((HashSet)infos[i]);
+		}
+		return (AnnotationInfo[])result.toArray(new AnnotationInfo[result.size()]);
+	}
+
+	public boolean isCancelled() {
+		if (fProgressMonitor == null)
+			return false;
+		return fProgressMonitor.isCanceled();
+	}
+
+	public void removeAllMessages(IValidator validator) {
+		Object o = messages.get(validator);
+		if(o != null && o instanceof HashSet) {
+			((HashSet)o).clear();
+		}
+	}
+
+	public void removeAllMessages(IValidator validator, Object object) {
+		removeAllMessages(validator);
+	}
+
+	// group names are unsupported
+	public void removeMessageSubset(IValidator validator, Object obj, String groupName) {
+		removeAllMessages(validator);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ReconcileStepForValidator.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ReconcileStepForValidator.java
new file mode 100644
index 0000000..94b41cd
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ReconcileStepForValidator.java
@@ -0,0 +1,363 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilableModel;
+import org.eclipse.jface.text.reconciler.IReconcileResult;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.reconcile.DocumentAdapter;
+import org.eclipse.wst.sse.ui.internal.reconcile.IReconcileAnnotationKey;
+import org.eclipse.wst.sse.ui.internal.reconcile.ReconcileAnnotationKey;
+import org.eclipse.wst.sse.ui.internal.reconcile.StructuredReconcileStep;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+
+/**
+ * A reconcile step for an IValidator for reconcile. Used the reconcile
+ * framework to create TemporaryAnnotations from the validator messages.
+ * 
+ * @author pavery
+ */
+public class ReconcileStepForValidator extends StructuredReconcileStep {
+
+	/** debug flag */
+	protected static final boolean DEBUG;
+	static {
+		String value = Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerjob"); //$NON-NLS-1$
+		DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+	}
+
+	private final IReconcileResult[] EMPTY_RECONCILE_RESULT_SET = new IReconcileResult[0];
+	private IncrementalHelper fHelper = null;
+	private IncrementalReporter fReporter = null;
+
+	/**
+	 * Declared scope of this validator, either ReconcileAnnotationKey.TOTAL
+	 * or ReconcileAnnotationKey.PARTIAL
+	 */
+	private int fScope = -1;
+	private IValidator fValidator = null;
+	private final String QUICKASSISTPROCESSOR = IQuickAssistProcessor.class.getName();
+
+
+	public ReconcileStepForValidator(IValidator v, int scope) {
+		super();
+
+		if (v == null)
+			throw new IllegalArgumentException("validator cannot be null"); //$NON-NLS-1$
+
+		fValidator = v;
+		fScope = scope;
+	}
+
+	/**
+	 * Converts a map of IValidatorForReconcile to List to annotations based
+	 * on those messages
+	 * 
+	 * @param messages
+	 * @return
+	 */
+	// protected IReconcileResult[] createAnnotations(List messageList) {
+	// List annotations = new ArrayList();
+	// for (int i = 0; i < messageList.size(); i++) {
+	// IMessage validationMessage = (IMessage) messageList.get(i);
+	//
+	// int offset = validationMessage.getOffset();
+	//
+	// if (offset < 0)
+	// continue;
+	//
+	// String messageText = null;
+	// try {
+	// messageText =
+	// validationMessage.getText(validationMessage.getClass().getClassLoader());
+	// }
+	// catch (Exception t) {
+	// Logger.logException("exception reporting message from validator", t);
+	// //$NON-NLS-1$
+	// continue;
+	// }
+	//			
+	// String type = getSeverity(validationMessage);
+	// // this position seems like it would be possibly be the wrong
+	// // length
+	// int length = validationMessage.getLength();
+	// if (length >= 0) {
+	// Position p = new Position(offset, length);
+	// ReconcileAnnotationKey key = createKey(getPartitionType(getDocument(),
+	// offset), getScope());
+	// annotations.add(new TemporaryAnnotation(p, type, messageText, key));
+	// }
+	// }
+	//
+	// return (IReconcileResult[]) annotations.toArray(new
+	// IReconcileResult[annotations.size()]);
+	// }
+	/**
+	 * Converts a map of IValidatorForReconcile to List to annotations based
+	 * on those messages
+	 * 
+	 * @param messages
+	 * @return
+	 */
+	protected IReconcileResult[] createAnnotations(AnnotationInfo[] infos) {
+
+
+		List annotations = new ArrayList();
+		for (int i = 0; i < infos.length; i++) {
+
+			AnnotationInfo info = infos[i];
+
+			IMessage validationMessage = info.getMessage();
+			int offset = validationMessage.getOffset();
+			if (offset < 0)
+				continue;
+
+			String messageText = null;
+			try {
+				messageText = validationMessage.getText(validationMessage.getClass().getClassLoader());
+			}
+			catch (Exception t) {
+				Logger.logException("exception reporting message from validator", t); //$NON-NLS-1$
+				continue;
+			}
+			String type = getSeverity(validationMessage);
+			// this position seems like it would be possibly be the wrong
+			// length
+			int length = validationMessage.getLength();
+			if (length >= 0) {
+
+				Position p = new Position(offset, length);
+				ReconcileAnnotationKey key = createKey(getPartitionType(getDocument(), offset), getScope());
+
+				// create an annotation w/ problem ID and fix info
+				TemporaryAnnotation annotation = new TemporaryAnnotation(p, type, messageText, key);
+				Object extraInfo = info.getAdditionalFixInfo();
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=170988
+				// add quick fix information
+				if (extraInfo == null) {
+					extraInfo = validationMessage.getAttribute(QUICKASSISTPROCESSOR);
+				}
+				annotation.setAdditionalFixInfo(extraInfo);
+				annotation.setAttributes(validationMessage.getAttributes());
+				annotations.add(annotation);
+			}
+		}
+		return (IReconcileResult[]) annotations.toArray(new IReconcileResult[annotations.size()]);
+	}
+
+	private String getSeverity(IMessage validationMessage) {
+		String type = TemporaryAnnotation.ANNOT_INFO;
+		switch (validationMessage.getSeverity()) {
+			case IMessage.HIGH_SEVERITY :
+				type = TemporaryAnnotation.ANNOT_ERROR;
+				break;
+			case IMessage.NORMAL_SEVERITY :
+				type = TemporaryAnnotation.ANNOT_WARNING;
+				break;
+			case IMessage.LOW_SEVERITY :
+				type = TemporaryAnnotation.ANNOT_WARNING;
+				break;
+			case IMessage.ERROR_AND_WARNING :
+				type = TemporaryAnnotation.ANNOT_WARNING;
+				break;
+		}
+		return type;
+	}
+
+	private IFile getFile() {
+		IStructuredModel model = null;
+		IFile file = null;
+		try {
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			if (model != null) {
+				String baseLocation = model.getBaseLocation();
+				// The baseLocation may be a path on disk or relative to the
+				// workspace root. Don't translate on-disk paths to
+				// in-workspace resources.
+				IPath basePath = new Path(baseLocation);
+				if (basePath.segmentCount() > 1 && !basePath.toFile().exists()) {
+					file = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath);
+				}
+			}
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+		return file;
+	}
+
+	private IncrementalHelper getHelper(IProject project) {
+		if (fHelper == null)
+			fHelper = new IncrementalHelper(getDocument(), project);
+		return fHelper;
+	}
+
+	private IncrementalReporter getReporter() {
+		if (fReporter == null)
+			fReporter = new IncrementalReporter(getProgressMonitor());
+		return fReporter;
+	}
+
+	/**
+	 * If this validator is partial or total
+	 * 
+	 * @return
+	 */
+	public int getScope() {
+		return fScope;
+	}
+
+	public void initialReconcile() {
+		// do nothing
+	}
+
+	protected IReconcileResult[] reconcileModel(DirtyRegion dirtyRegion, IRegion subRegion) {
+		if (DEBUG)
+			System.out.println("[trace reconciler] > reconciling model in VALIDATOR step w/ dirty region: [" + dirtyRegion.getText() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+
+		IReconcileResult[] results = EMPTY_RECONCILE_RESULT_SET;
+		if (dirtyRegion != null) {
+			try {
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=247714
+				if (fValidator instanceof ISourceValidator && getScope() == ReconcileAnnotationKey.PARTIAL) {
+					results = validate(dirtyRegion, subRegion);
+				}
+				else {
+					results = validate();
+				}
+			}
+			catch (Exception ex) {
+				Logger.logException("EXEPTION IN RECONCILE STEP FOR VALIDATOR", ex); //$NON-NLS-1$
+			}
+		}
+
+		if (DEBUG)
+			System.out.println("[trace reconciler] > VALIDATOR step done"); //$NON-NLS-1$
+
+		return results;
+	}
+
+	public String toString() {
+		StringBuffer debugString = new StringBuffer("ValidatorStep: "); //$NON-NLS-1$
+		if (fValidator != null)
+			debugString.append(fValidator.toString());
+		return debugString.toString();
+	}
+
+	protected IReconcileResult[] validate() {
+		IReconcileResult[] results = EMPTY_RECONCILE_RESULT_SET;
+
+		IFile file = getFile();
+
+		try {
+			IncrementalHelper helper = getHelper(file != null ? file.getProject() : null);
+			IncrementalReporter reporter = getReporter();
+
+			if (file != null && file.exists()) {
+				helper.setURI(file.getFullPath().toString());
+			}
+
+			fValidator.validate(helper, reporter);
+
+			// results = createAnnotations(reporter.getMessages());
+			results = createAnnotations(reporter.getAnnotationInfo());
+			reporter.removeAllMessages(fValidator);
+
+			fValidator.cleanup(reporter);
+		}
+		catch (Exception e) {
+			Logger.logException(e);
+		}
+		return results;
+	}
+
+	public void setInputModel(IReconcilableModel inputModel) {
+		if (inputModel instanceof DocumentAdapter) {
+			IDocument document = ((DocumentAdapter) inputModel).getDocument();
+			if (document != null) {
+				if (fValidator instanceof ISourceValidator) {
+					// notify that document connecting
+					((ISourceValidator) fValidator).connect(document);
+				}
+			}
+		}
+		super.setInputModel(inputModel);
+	}
+
+	public void release() {
+		if (fValidator instanceof ISourceValidator) {
+			IDocument document = getDocument();
+			if (document != null) {
+				// notify that document disconnecting
+				((ISourceValidator) fValidator).disconnect(document);
+			}
+			fValidator.cleanup(getReporter());
+		}
+		super.release();
+	}
+
+	protected IReconcileResult[] validate(DirtyRegion dirtyRegion, IRegion subRegion) {
+		IReconcileResult[] results = EMPTY_RECONCILE_RESULT_SET;
+
+		IFile file = getFile();
+
+		try {
+			IncrementalHelper helper = getHelper(file != null ? file.getProject() : null);
+			/*
+			 * Setting the URI isn't necessary for all source validators, we
+			 * can still continue without it
+			 */
+			if (file != null && file.exists()) {
+				helper.setURI(file.getFullPath().toString());
+			}
+
+			if (fValidator instanceof ISourceValidator) {
+				IncrementalReporter reporter = getReporter();
+				if (getScope() == IReconcileAnnotationKey.PARTIAL)
+					((ISourceValidator) fValidator).validate(dirtyRegion, helper, reporter);
+				else
+					((ISourceValidator) fValidator).validate(new Region(0, getDocument().getLength()), helper, reporter);
+				// call IValidator.cleanup() during release()
+				// results = createAnnotations(reporter.getMessages());
+				results = createAnnotations(reporter.getAnnotationInfo());
+				reporter.removeAllMessages(fValidator);
+			}
+		}
+		catch (Exception e) {
+			Logger.logException(e);
+		}
+		return results;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorBuilder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorBuilder.java
new file mode 100644
index 0000000..e1f6cce
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorBuilder.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
+
+
+/**
+ * Based off of TransferBuilder. Reads the extension point for
+ * <code>org.eclipse.wst.sse.ui.extensions.sourcevalidation</code>
+ */
+public class ValidatorBuilder extends RegistryReader {
+    
+	public static final String ATT_CLASS = "class"; //$NON-NLS-1$
+	public static final String ATT_ID = "id"; //$NON-NLS-1$
+	public static final String ATT_SCOPE = "scope"; //$NON-NLS-1$
+
+	public static final ValidatorMetaData[] EMTPY_VMD_ARRAY = new ValidatorMetaData[0];
+
+	// extension point ID
+	public static final String PL_SOURCE_VALIDATION = "sourcevalidation"; //$NON-NLS-1$
+
+	public static final String PLUGIN_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
+	public static final String TAG_CONTENT_TYPE_IDENTIFIER = "contentTypeIdentifier"; //$NON-NLS-1$
+	public static final String TAG_PARTITION_TYPE = "partitionType"; //$NON-NLS-1$
+
+	public static final String TAG_VALIDATOR = "validator"; //$NON-NLS-1$
+
+	public static final String TRACE_FILTER = "reconcile_validator"; //$NON-NLS-1$
+
+	public static final String TRUE = "true"; //$NON-NLS-1$
+	private String fCurrentCTID;
+	private ValidatorMetaData fCurrentVMD = null;
+	private List fVmds = new ArrayList();
+	protected String targetContributionTag;
+	protected String targetID;
+
+    private final String UNKNOWN = "???"; //$NON-NLS-1$
+    
+	/**
+	 * Returns the name of the part ID attribute that is expected in the
+	 * target extension.
+	 * 
+	 * @param element
+	 * @return String
+	 */
+	protected String getID(IConfigurationElement element) {
+		String value = element.getAttribute(ATT_ID);
+		return value != null ? value : UNKNOWN; //$NON-NLS-1$
+	}
+
+	protected String getValidatorClass(IConfigurationElement element) {
+		String value = element.getAttribute(ATT_CLASS);
+		return value != null ? value : UNKNOWN; //$NON-NLS-1$
+	}
+
+	/**
+	 * @param editorId
+	 * @return Transfer[]
+	 */
+	public ValidatorMetaData[] getValidatorMetaData(String editorId) {
+		readContributions(editorId, TAG_VALIDATOR, PL_SOURCE_VALIDATION);
+		return (ValidatorMetaData[]) fVmds.toArray(new ValidatorMetaData[fVmds.size()]);
+	}
+
+	protected String getValidatorScope(IConfigurationElement element) {
+		String value = element.getAttribute(ATT_SCOPE);
+		return value != null ? value : UNKNOWN; //$NON-NLS-1$
+	}
+
+	/**
+	 * Reads the contributions from the registry for the provided workbench
+	 * part and the provided extension point ID.
+	 * 
+	 * @param id
+	 * @param tag
+	 * @param extensionPoint
+	 */
+	protected void readContributions(String id, String tag, String extensionPoint) {
+		targetID = id;
+		targetContributionTag = tag;
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		readRegistry(registry, PLUGIN_ID, extensionPoint);
+	}
+
+	protected boolean readElement(IConfigurationElement element) {
+		String tag = element.getName();
+		//ie. targetContributionTag == validator
+		if (tag.equals(targetContributionTag)) {
+			String vId = getID(element);
+			String vClass = getValidatorClass(element);
+			String vScope = getValidatorScope(element);
+
+			if (vId == null) {
+				// This is not of interest to us - don't go deeper
+				return true;
+			}
+			// start building a VMD
+			fCurrentVMD = new ValidatorMetaData(element, vId, vClass, vScope);
+			fVmds.add(fCurrentVMD);
+
+			if (Logger.isTracing(ValidatorBuilder.TRACE_FILTER))
+				System.out.println("added reconcile validator: " + vId + ":" + vClass + ":" + vScope); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		} else if (tag.equals(TAG_CONTENT_TYPE_IDENTIFIER)) {
+			// add to current VMD
+			fCurrentCTID = getID(element);
+			fCurrentVMD.addContentTypeId(fCurrentCTID);
+		} else if (tag.equals(TAG_PARTITION_TYPE)) {
+			// add to current VMD
+			String partitionType = getID(element);
+			fCurrentVMD.addParitionType(fCurrentCTID, partitionType);
+
+			return true;
+		} else {
+			return false;
+		}
+
+		readElementChildren(element);
+		return true;
+	}
+}
+
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java
new file mode 100644
index 0000000..8a412c1
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.reconcile.ReconcileAnnotationKey;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Object that holds information relevant to the creation of a validator for
+ * the reconciling framework.
+ * 
+ * @author pavery,nitind
+ */
+public class ValidatorMetaData {
+	private String fClass = null;
+	private IConfigurationElement fConfigurationElement = null;
+	private String fId = null;
+    private String fScope;
+
+	// a hash map of explicitly declared content type Ids (String) that points to lists of
+	// partition types (List of Strings)
+	// contentTypeId -> List(paritionType, paritionType, partitionType, ...)
+	// contentTypeId2 -> List(partitionType, partitionType, ...)
+	// ...
+	private HashMap fMatrix = null;
+
+	public ValidatorMetaData(IConfigurationElement element, String vId, String vClass, String vScope) {
+		fId = vId;
+		fClass = vClass;
+		fConfigurationElement = element;
+		fScope = vScope;
+		fMatrix = new HashMap();
+	}
+
+    /**
+     * TODO: This exact method is also in ValidatorStrategy. Should be in a common place.
+     * 
+     * @param contentTypeId
+     * @return
+     */
+    private String[] calculateParentContentTypeIds(String contentTypeId) {
+
+        Set parentTypes = new HashSet();
+        
+        IContentTypeManager ctManager = Platform.getContentTypeManager();    
+        IContentType ct = ctManager.getContentType(contentTypeId);
+        String id = contentTypeId;
+
+        while(ct != null && id != null) {
+            
+            parentTypes.add(id);
+            ct = ctManager.getContentType(id);
+            if(ct != null) {
+                IContentType baseType = ct.getBaseType();
+                id = (baseType != null) ? baseType.getId() : null;
+            }
+        }
+        return (String[])parentTypes.toArray(new String[parentTypes.size()]);
+    }
+    
+	public void addContentTypeId(String contentTypeId) {
+		if (!fMatrix.containsKey(contentTypeId))
+			fMatrix.put(contentTypeId, new ArrayList());
+	}
+
+	public void addParitionType(String contentTypeId, String partitionType) {
+		if (!fMatrix.containsKey(contentTypeId))
+			fMatrix.put(contentTypeId, new ArrayList());
+
+		List partitionList = (List) fMatrix.get(contentTypeId);
+		partitionList.add(partitionType);
+	}
+
+	/**
+	 * @param contentType
+	 * @return whether this validator explicitly declared that it could handle
+	 *         this content type or any of its parent content types
+	 */
+	public boolean canHandleContentType(String contentType) {
+        // need to iterate hierarchy
+        String[] contentHierarchy = calculateParentContentTypeIds(contentType);
+        for (int i = 0; i < contentHierarchy.length; i++) {
+            if(fMatrix.containsKey(contentHierarchy[i]))
+                return true;
+        }
+        return false;
+	}
+
+	/**
+	 * @param contentType
+	 * @return whether this validator explicitly declared that it could handle
+	 *         this content type
+	 */
+	public boolean mustHandleContentType(String contentType) {
+        return fMatrix.containsKey(contentType);
+	}
+
+	/**
+	 * @param contentTypeIds
+	 * @param partitionType
+	 * @return whether this validator declared that it could handle this
+	 *         content type, or one of its parent content types, and partition
+	 *         type
+	 */
+	public boolean canHandlePartitionType(String contentTypeIds[], String paritionType) {
+        for(int i=0; i<contentTypeIds.length; i++) {
+        	List partitions = (List) fMatrix.get(contentTypeIds[i]);
+    		if (partitions != null) {
+    			for (int j = 0; j < partitions.size(); j++) {
+    				if (paritionType.equals(partitions.get(j)))
+    					return true;
+    			}
+    		}
+        }
+		return false;
+	}
+
+	/**
+	 * @param element
+	 * @param classAttribute
+	 * @return Object
+	 * @throws CoreException
+	 */
+	Object createExecutableExtension(final IConfigurationElement element, final String classAttribute) throws CoreException {
+		Object obj = null;
+		obj = element.createExecutableExtension(classAttribute);
+		return obj;
+	}
+
+	/**
+	 * Creates an extension. If the extension plugin has not been loaded a
+	 * busy cursor will be activated during the duration of the load.
+	 * 
+	 * @param element
+	 * @param classAttribute
+	 * @return Object
+	 * @throws CoreException
+	 */
+	public Object createExtension() {
+		// If plugin has been loaded create extension.
+		// Otherwise, show busy cursor then create extension.
+		final IConfigurationElement element = getConfigurationElement();
+		final Object[] result = new Object[1];
+		String pluginId = element.getDeclaringExtension().getNamespace();
+		Bundle bundle = Platform.getBundle(pluginId);
+		if (bundle.getState() == Bundle.ACTIVE) {
+			try {
+				return createExecutableExtension(element, "class"); //$NON-NLS-1$
+			} catch (CoreException e) {
+				handleCreateExecutableException(result, e);
+			}
+		} else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = createExecutableExtension(element, "class"); //$NON-NLS-1$
+					} catch (Exception e) {
+						handleCreateExecutableException(result, e);
+					}
+				}
+			});
+		}
+		return result[0];
+	}
+
+	/**
+	 * @return a validator instance based on this ValidatorMetaData instance
+	 */
+	public IValidator createValidator() {
+		Object obj = null;
+		obj = createExtension();
+		if (obj == null) {
+			return null;
+		}
+		return (obj instanceof IValidator) ? (IValidator) obj : null;
+	}
+
+	public IConfigurationElement getConfigurationElement() {
+		return fConfigurationElement;
+	}
+
+	public String getValidatorClass() {
+		return fClass;
+	}
+
+	public String getValidatorId() {
+		return fId;
+	}
+
+	/**
+	 * @param result
+	 * @param e
+	 */
+	void handleCreateExecutableException(Object[] result, Throwable e) {
+		Logger.logException(e);
+		e.printStackTrace();
+		result[0] = null;
+	}
+	/**
+	 * ReconcileAnnotationKey.TOTAL or  ReconcileAnnotationKey.PARTIAL
+	 * @return
+	 */
+    public int getValidatorScope() {
+        return fScope.equalsIgnoreCase("total") ? ReconcileAnnotationKey.TOTAL : ReconcileAnnotationKey.PARTIAL; //$NON-NLS-1$
+    }
+    
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		StringBuffer debugString = new StringBuffer("ValidatorMetaData:"); //$NON-NLS-1$
+		if (fId != null)
+			debugString.append(" [id:" + fId + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+		return debugString.toString();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorStrategy.java
new file mode 100644
index 0000000..e0f20a9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorStrategy.java
@@ -0,0 +1,368 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.reconcile.validator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcileResult;
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.reconcile.DocumentAdapter;
+import org.eclipse.wst.sse.ui.internal.reconcile.ReconcileAnnotationKey;
+import org.eclipse.wst.sse.ui.internal.reconcile.StructuredTextReconcilingStrategy;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+import org.eclipse.wst.validation.ValidationFramework;
+import org.eclipse.wst.validation.Validator;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+
+/**
+ * Special validator strategy. Runs validator steps contributed via the
+ * <code>org.eclipse.wst.sse.ui.extensions.sourcevalidation</code> extension
+ * point
+ * 
+ * @author pavery
+ */
+public class ValidatorStrategy extends StructuredTextReconcilingStrategy {
+
+	private static final boolean DEBUG_VALIDATION_CAPABLE_BUT_DISABLED = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerValidatorEnablement")).booleanValue();
+	private static final boolean DEBUG_VALIDATION_UNSUPPORTED = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerValidatorSupported")).booleanValue();
+
+	private String[] fContentTypeIds = null;
+	private List fMetaData = null;
+	/** validator id (as declared in ext point) -> ReconcileStepForValidator * */
+	private HashMap fVidToVStepMap = null;
+
+	/*
+	 * List of ValidatorMetaDatas of total scope validators that have been run
+	 * since beginProcessing() was called.
+	 */
+	private List fTotalScopeValidatorsAlreadyRun = new ArrayList();
+	
+	/*
+	 * Whether the Validation Framework has indicated that validation is
+	 * suspended for the current resource
+	 */
+	private boolean fValidatorsSuspended = false;
+
+	public ValidatorStrategy(ISourceViewer sourceViewer, String contentType) {
+		super(sourceViewer);
+		fMetaData = new ArrayList();
+		fContentTypeIds = calculateParentContentTypeIds(contentType);
+		fVidToVStepMap = new HashMap();
+	}
+
+	public void addValidatorMetaData(ValidatorMetaData vmd) {
+		fMetaData.add(vmd);
+	}
+
+	public void beginProcessing() {
+		fTotalScopeValidatorsAlreadyRun.clear();
+	}
+
+	/**
+	 * The content type passed in should be the most specific one. TODO: This
+	 * exact method is also in ValidatorMetaData. Should be in a common place.
+	 * 
+	 * @param contentType
+	 * @return
+	 */
+	private String[] calculateParentContentTypeIds(String contentTypeId) {
+
+		Set parentTypes = new HashSet();
+
+		IContentTypeManager ctManager = Platform.getContentTypeManager();
+		IContentType ct = ctManager.getContentType(contentTypeId);
+		String id = contentTypeId;
+
+		while (ct != null && id != null) {
+
+			parentTypes.add(id);
+			ct = ctManager.getContentType(id);
+			if (ct != null) {
+				IContentType baseType = ct.getBaseType();
+				id = (baseType != null) ? baseType.getId() : null;
+			}
+		}
+		return (String[]) parentTypes.toArray(new String[parentTypes.size()]);
+	}
+
+	protected boolean canHandlePartition(String partitionType) {
+		ValidatorMetaData vmd = null;
+		for (int i = 0; i < fMetaData.size(); i++) {
+			vmd = (ValidatorMetaData) fMetaData.get(i);
+			if (vmd.canHandlePartitionType(getContentTypeIds(), partitionType))
+				return true;
+		}
+		return false;
+	}
+
+	protected boolean containsStep(IReconcileStep step) {
+		return fVidToVStepMap.containsValue(step);
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.reconcile.AbstractStructuredTextReconcilingStrategy#createReconcileSteps()
+	 */
+	public void createReconcileSteps() {
+		// do nothing, steps are created
+	}
+
+	public void endProcessing() {
+		fTotalScopeValidatorsAlreadyRun.clear();
+	}
+
+	/**
+	 * All content types on which this ValidatorStrategy can run
+	 * 
+	 * @return
+	 */
+	public String[] getContentTypeIds() {
+		return fContentTypeIds;
+	}
+
+	/**
+	 * @param tr
+	 *            Partition of the region to reconcile.
+	 * @param dr
+	 *            Dirty region representation of the typed region
+	 */
+	public void reconcile(ITypedRegion tr, DirtyRegion dr) {
+		/*
+		 * Abort if no workspace file is known (new validation framework does
+		 * not support that scenario) or no validators have been specified
+		 */
+		if (isCanceled() || fMetaData.isEmpty() || fValidatorsSuspended)
+			return;
+
+		IDocument doc = getDocument();
+		// for external files, this can be null
+		if (doc == null)
+			return;
+
+		String partitionType = tr.getType();
+
+		ValidatorMetaData vmd = null;
+		List annotationsToAdd = new ArrayList();
+		List stepsRanOnThisDirtyRegion = new ArrayList(1);
+		
+		/*
+		 * Keep track of the disabled validators by source id for the V2
+		 * validators.
+		 */
+		Set disabledValsBySourceId = new HashSet(20);
+		
+		/*
+		 * Keep track of the disabled validators by class id for the v1
+		 * validators.
+		 */
+		Set disabledValsByClass = new HashSet(20);
+		IFile file = getFile();
+		if (file != null) {
+			if(!file.isAccessible())
+				return;
+
+			Collection disabledValidators = null;
+			try {
+				/*
+				 * Take extra care when calling this external code, as it
+				 * can indirectly cause bundles to start
+				 */
+				disabledValidators = ValidationFramework.getDefault().getDisabledValidatorsFor(file);
+			}
+			catch (Exception e) {
+				Logger.logException(e);
+			}
+
+			if (disabledValidators != null) {
+				for (Iterator it = disabledValidators.iterator(); it.hasNext();) {
+					Validator v = (Validator) it.next();
+					Validator.V1 v1 = null;
+					try {
+						v1 = v.asV1Validator();
+					}
+					catch (Exception e) {
+						Logger.logException(e);
+					}
+					if (v1 != null)
+						disabledValsByClass.add(v1.getId());
+					// not a V1 validator
+					else if (v.getSourceId() != null) {
+						//could be more then one sourceid per batch validator
+						String[] sourceIDs = StringUtils.unpack(v.getSourceId());
+						disabledValsBySourceId.addAll(Arrays.asList(sourceIDs));
+					}
+				}
+			}
+		}
+				
+		/*
+		 * Loop through all of the relevant validator meta data to find
+		 * supporting validators for this partition type. Don't check
+		 * this.canHandlePartition() before-hand since it just loops through
+		 * and calls vmd.canHandlePartitionType()...which we're already doing
+		 * here anyway to find the right vmd.
+		 */
+		for (int i = 0; i < fMetaData.size() && !isCanceled(); i++) {
+			vmd = (ValidatorMetaData) fMetaData.get(i);
+			if (vmd.canHandlePartitionType(getContentTypeIds(), partitionType)) {
+				/*
+				 * Check if validator is enabled according to validation
+				 * preferences before attempting to create/use it
+				 */
+				if (!disabledValsBySourceId.contains(vmd.getValidatorId()) && !disabledValsByClass.contains(vmd.getValidatorClass())) {
+					if (DEBUG_VALIDATION_UNSUPPORTED) {
+						Logger.log(Logger.INFO, "Source validator "+vmd.getValidatorId()+" handling (content types:[" + StringUtils.pack(getContentTypeIds()) + "] partition type:" + partitionType);
+					}
+					int validatorScope = vmd.getValidatorScope();
+					ReconcileStepForValidator validatorStep = null;
+					// get step for partition type
+					Object o = fVidToVStepMap.get(vmd.getValidatorId());
+					if (o != null) {
+						validatorStep = (ReconcileStepForValidator) o;
+					}
+					else {
+						// if doesn't exist, create one
+						IValidator validator = vmd.createValidator();
+
+						validatorStep = new ReconcileStepForValidator(validator, validatorScope);
+						validatorStep.setInputModel(new DocumentAdapter(doc));
+
+						fVidToVStepMap.put(vmd.getValidatorId(), validatorStep);
+					}
+
+					if (!fTotalScopeValidatorsAlreadyRun.contains(vmd)) {
+						annotationsToAdd.addAll(Arrays.asList(validatorStep.reconcile(dr, dr)));
+						stepsRanOnThisDirtyRegion.add(validatorStep);
+
+						if (validatorScope == ReconcileAnnotationKey.TOTAL) {
+							// mark this validator as "run"
+							fTotalScopeValidatorsAlreadyRun.add(vmd);
+						}
+					}
+				}
+				else if (DEBUG_VALIDATION_CAPABLE_BUT_DISABLED) {
+					String message = "Source validator able (id:" + vmd.getValidatorId() + " class:" + vmd.getValidatorClass() + " but skipped because it was reported as disabled";
+					Logger.log(Logger.INFO, message);
+				}
+			}
+			else if (DEBUG_VALIDATION_UNSUPPORTED) {
+				Logger.log(Logger.INFO, "Source validator "+vmd.getValidatorId()+" can not handle (content types:[" + StringUtils.pack(getContentTypeIds()) + "] partition type:" + partitionType);
+			}
+		}
+
+		TemporaryAnnotation[] annotationsToRemove = getAnnotationsToRemove(dr, stepsRanOnThisDirtyRegion);
+		if (annotationsToRemove.length + annotationsToAdd.size() > 0)
+			smartProcess(annotationsToRemove, (IReconcileResult[]) annotationsToAdd.toArray(new IReconcileResult[annotationsToAdd.size()]));
+	}
+
+	public void release() {
+		super.release();
+		Iterator it = fVidToVStepMap.values().iterator();
+		IReconcileStep step = null;
+		while (it.hasNext()) {
+			step = (IReconcileStep) it.next();
+			if (step instanceof IReleasable)
+				((IReleasable) step).release();
+		}
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy#setDocument(org.eclipse.jface.text.IDocument)
+	 */
+	public void setDocument(IDocument document) {
+
+		super.setDocument(document);
+
+		try {
+			fValidatorsSuspended = false;
+			if (document != null) {
+				IFile file = getFile();
+				if (file != null) {
+					// Validation is suspended for this resource, do nothing
+					fValidatorsSuspended = !file.isAccessible() || ValidationFramework.getDefault().isSuspended(file.getProject()) || ValidationFramework.getDefault().getProjectSettings(file.getProject()).getSuspend();
+				}
+			}
+		}
+		catch (Exception e) {
+			fValidatorsSuspended = true;
+			Logger.logException(e);
+		}
+		
+		// validator steps are in "fVIdToVStepMap" (as opposed to fFirstStep >
+		// next step etc...)
+		Iterator it = fVidToVStepMap.values().iterator();
+		IReconcileStep step = null;
+		while (it.hasNext()) {
+			step = (IReconcileStep) it.next();
+			step.setInputModel(new DocumentAdapter(document));
+		}
+	}
+
+	/**
+	 * Gets IFile from current document
+	 * 
+	 * @return IFile the IFile, null if no such file exists
+	 */
+	private IFile getFile() {
+		IStructuredModel model = null;
+		IFile file = null;
+		try {
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			if (model != null) {
+				String baseLocation = model.getBaseLocation();
+				// The baseLocation may be a path on disk or relative to the
+				// workspace root. Don't translate on-disk paths to
+				// in-workspace resources.
+				IPath basePath = new Path(baseLocation);
+				if (basePath.segmentCount() > 1) {
+					file = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath);
+					/*
+					 * If the IFile doesn't  exist, make sure it's not
+					 * returned
+					 */
+					if (!file.exists())
+						file = null;
+				}
+			}
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+		return file;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/rules/PresentationCollector.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/rules/PresentationCollector.java
new file mode 100644
index 0000000..436d510
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/rules/PresentationCollector.java
@@ -0,0 +1,83 @@
+/*******************************************************************************

+ * Copyright (c) 2009 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.wst.sse.ui.internal.rules;

+

+import java.util.AbstractCollection;

+import java.util.Iterator;

+

+import org.eclipse.core.runtime.Assert;

+import org.eclipse.jface.text.TextPresentation;

+import org.eclipse.swt.custom.StyleRange;

+import org.eclipse.wst.sse.ui.internal.Logger;

+

+/**

+ * Passed to LineStyleProviders as the Collection for which StyleRanges are to

+ * be added. This class provides additional sanity checks on the incoming

+ * StyleRanges so that we do not rely upon SWT to report Errors with no record

+ * of the StyleRange or contributing LineStyleProvider, as well as a slight

+ * performance increase by not allocating a redundant collection for the

+ * StyleRanges.

+ * 

+ * This class intentionally violates the contract for java.util.Collection.

+ */

+

+class PresentationCollector extends AbstractCollection {

+	private final TextPresentation fPresentation;

+	private int lastOffset;

+

+	/**

+	 * @param presentation

+	 *            - the Presentation being added to

+	 * @param applyOnAdd

+	 */

+	PresentationCollector(TextPresentation presentation) {

+		super();

+		Assert.isNotNull(presentation);

+		fPresentation = presentation;

+		lastOffset = 0;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see java.util.Collection#add(java.lang.Object)

+	 */

+	public boolean add(Object o) {

+		StyleRange range = (StyleRange) o;

+		if (lastOffset > range.start) {

+			IllegalArgumentException e = new IllegalArgumentException("Overlapping start in StyleRange " + range.start + ":" + range.length); //$NON-NLS-1$ //$NON-NLS-2$

+			Logger.logException(e);

+			throw e;

+		}

+		lastOffset = range.start + range.length;

+		fPresentation.addStyleRange(range);

+		return true;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see java.util.AbstractCollection#iterator()

+	 */

+	public Iterator iterator() {

+		return fPresentation.getNonDefaultStyleRangeIterator();

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see java.util.AbstractCollection#size()

+	 */

+	public int size() {

+		throw new UnsupportedOperationException();

+	}

+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/rules/StructuredDocumentDamagerRepairer.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/rules/StructuredDocumentDamagerRepairer.java
new file mode 100644
index 0000000..f5973d8
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/rules/StructuredDocumentDamagerRepairer.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.rules;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.provisional.style.AbstractLineStyleProvider;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+
+/**
+ * An implementation of a presentation damager and presentation repairer.
+ * It uses a LineStyleProvider to retrieve the style ranges associated with
+ * the calculated damaged region.
+ * 
+ * @see LineStyleProvider
+ */
+public class StructuredDocumentDamagerRepairer extends DefaultDamagerRepairer {
+	
+	private LineStyleProvider fProvider = null;
+	
+	public StructuredDocumentDamagerRepairer(LineStyleProvider provider) {
+		super(new RuleBasedScanner());
+		Assert.isNotNull(provider);
+		fProvider = provider;
+	}
+
+	public void createPresentation(TextPresentation presentation, ITypedRegion region) {
+		PresentationCollector collector = new PresentationCollector(presentation);
+		fProvider.prepareRegions(region, region.getOffset(), region.getLength(), collector);
+	}
+	
+	public void setProvider(LineStyleProvider provider) {
+		fProvider = provider;
+	}
+	
+	public void setDocument(IDocument document) {
+		super.setDocument(document);
+		if (fProvider instanceof AbstractLineStyleProvider)
+			((AbstractLineStyleProvider) fProvider).setDocument( (IStructuredDocument) document);
+	}
+	
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchLabelProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchLabelProvider.java
new file mode 100644
index 0000000..c20f38a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchLabelProvider.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.search;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * <p>The label provider designed for use with <code>BasicSearchMatchElement</code><p>
+ * 
+ * <p>Displays in the format of:<br/>
+ * lineNum: Message (# matches)</br>
+ * 1: <a></a> (2 matches)</p>
+ */
+public class BasicSearchLabelProvider extends LabelProvider implements IStyledLabelProvider {
+	/**
+	 * ID of match highlighting background color
+	 */
+	private static final String MATCH_BG_ID = "org.eclipse.wst.sse.ui.search.MATCH_BG";
+	
+	//register the match highlighting background color once
+	static {
+		JFaceResources.getColorRegistry().put(MATCH_BG_ID, new RGB(206, 204, 247));
+	}
+	
+	/**
+	 * Match highlighting background color styler
+	 */
+	private static final Styler HIGHLIGHT_WRITE_STYLE= StyledString.createColorRegistryStyler(null, MATCH_BG_ID);
+	
+	
+	/**
+	 * Need the page if want to determine the number of matches, but this can be <code>null</code>
+	 */
+	private AbstractTextSearchViewPage fPage;
+
+	/**
+	 * <p>Construct the provider without a <code>AbstractTextSearchViewPage</code><p>
+	 * <p><b>NOTE:</b>If this constructor is used then the provider will not be able to determine
+	 * the number of matches that are all on the same line for a given element</p>
+	 */
+	public BasicSearchLabelProvider() {
+		this(null);
+	}
+	
+	/**
+	 * <p>Construct the provider with a <code>AbstractTextSearchViewPage</code> so that the
+	 * number of matches that are all on the same line for a given element can be determined.</p>
+	 * 
+	 * @param page Will be used to determine the number of matches that are all on the same line
+	 */
+	public BasicSearchLabelProvider(AbstractTextSearchViewPage page) {
+		fPage= page;
+	}
+	
+	/**
+	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+	 */
+	public Image getImage(Object element) {
+		return EditorPluginImageHelper.getInstance().getImage(EditorPluginImages.IMG_OBJ_OCC_MATCH);
+	}
+	
+	/**
+	 * <p><b>Note:</b> Because this class implements <code>IStyledLabelProvider</code> the <code>getStyledText</code>
+	 * function should be being called and not this one, but better save then sorry</p>
+	 * 
+	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+	 * @see org.eclipse.wst.sse.ui.internal.search.BasicSearchLabelProvider#getStyledText(Object)
+	 */
+	public final String getText(Object element) {
+		return getStyledText(element).getString();
+	}
+	
+	/**
+	 * <p>Given a <code>Match</code> object containing a <code>BasicSearchMatchElement</code> element
+	 * returns a <code>StyledString</code> in the form of:</p>
+	 * 
+	 * <p>lineNum: Message (# matches)</br>
+	 * 1: <a></a> (2 matches)</p>
+	 * 
+	 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
+	 */
+	public StyledString getStyledText(Object obj) {
+		StyledString styledText = new StyledString();
+		BasicSearchMatchElement element = null;
+		if (obj instanceof Match) {
+			Match match = (Match) obj;
+
+			if(match.getElement() instanceof BasicSearchMatchElement) {
+				element = (BasicSearchMatchElement) match.getElement();
+			}
+		} else if(obj instanceof BasicSearchMatchElement) {
+			element = (BasicSearchMatchElement)obj;
+		}
+		
+		//get the match count if possible
+		int matchCount = 0;
+		Match[] matches = new Match[0];
+		if(fPage != null) {
+			matches = fPage.getInput().getMatches(obj);
+			matchCount = matches.length;
+		}
+		
+		//if everything was of the right type create our formated message,
+		//else use the toString of the given object for the message
+		if(element != null) {
+			String message = element.getLine().trim(); //$NON-NLS-1$
+			int trimedAmount = element.getLine().indexOf(message);
+			String lineNum = element.getLineNum() + 1 + ": "; //$NON-NLS-1$
+			
+			styledText.append(lineNum, StyledString.QUALIFIER_STYLER);
+			styledText.append(message);
+			
+			//get the match count if possible
+			for(int i = 0; i < matchCount; ++i) {
+				int offset = matches[i].getOffset() - element.geLineOffset() + lineNum.length() - trimedAmount;
+				styledText.setStyle(offset, matches[i].getLength(), HIGHLIGHT_WRITE_STYLE);
+			}
+			
+		} else {
+			styledText.append(obj.toString());
+		}
+		
+		//append the match count if its worth appending
+		if (matchCount > 1) {
+			String matchesMsg = " " + MessageFormat.format(
+				SSEUIMessages.TextSearchLabelProvider_matchCountFormat,
+				new Object[] { new Integer(matchCount) });
+			styledText.append(matchesMsg, StyledString.COUNTER_STYLER);
+		}
+	
+		return styledText;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchMatchElement.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchMatchElement.java
new file mode 100644
index 0000000..425c06a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchMatchElement.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.search;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * This is used as the element for a <code>Match</code> object by
+ * <code>BasicSearchQuery</code>.  It contains all the needed information
+ * for use by the query, result providers, and label providers.
+ *
+ * @see org.eclipse.search.ui.text.Match
+ * @see org.eclipse.wst.sse.ui.internal.search.BasicSearchQuery
+ */
+public class BasicSearchMatchElement {
+	/**
+	 * The file this element is a match on
+	 */
+	private IFile fFile;
+	
+	/**
+	 * The line number this element is a match on
+	 */
+	private int fLineNumber;
+	
+	/**
+	 * The offset of the line in the file
+	 */
+	private int fLineOffset;
+	
+	/**
+	 * The line this match is on
+	 */
+	private String fLine;
+	
+	/**
+	 * Constructor
+	 * 
+	 * @param file The file this element is a match on
+	 * @param lineNumber The line number this element is a match on
+	 * @param lineOffset The offset of the line in the file
+	 * @param message The message associated with this element
+	 */
+	public BasicSearchMatchElement(IFile file, int lineNumber, int lineOffset, String message) {
+		this.fFile = file;
+		this.fLineNumber = lineNumber;
+		this.fLineOffset = lineOffset;
+		this.fLine = message;
+	}
+	
+	/**
+	 * @return The file this element is a match on
+	 */
+	public IFile getFile() {
+		return this.fFile;
+	}
+	
+	/**
+	 * @return The line number this element is a match on
+	 */
+	public int getLineNum() {
+		return this.fLineNumber;
+	}
+	
+	/**
+	 * @return the offset of the line the match is on in the file
+	 */
+	public int geLineOffset() {
+		return this.fLineOffset;
+	}
+	
+	/**
+	 * @return The line this match is on
+	 */
+	public String getLine() {
+		return this.fLine;
+	}
+	
+	/**
+	 * <p>Two <code>BasicSearchMatchElement</code> are equal if they are
+	 * both on the same line. This helps with determining how many matches
+	 * are all on the same line which is automatically taken care of by
+	 * internal Eclipse search APIs so long as this equal method is structured
+	 * thusly.</p>
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		boolean equal = false;
+		
+		if(obj instanceof BasicSearchMatchElement) {
+			equal = getLineNum() == ((BasicSearchMatchElement)obj).getLineNum();
+		}
+		
+		return equal;
+	}
+	
+	/**
+	 * Like the <code>#equals</code> method this function is needed so
+	 * that the internal Eclipse search APIs can keep track of matches
+	 * that are on the same line.
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return getLineNum() + getLine().hashCode();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchQuery.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchQuery.java
new file mode 100644
index 0000000..008eb33
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/BasicSearchQuery.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.search;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+/**
+ * Defines a basic search query.  This query does not do anything, it needs to be extended
+ * and the <code>{@link #doQuery()}</code> method needs to be overridden to make the query
+ * actually be functional.
+ *
+ */
+public class BasicSearchQuery implements ISearchQuery {
+	/**
+	 * the file we're searching
+	 */
+	private IFile fFile = null;
+	
+	/**
+	 * The result of this query
+	 */
+	private AbstractTextSearchResult fResult = null;
+
+	/**
+	 * The progress monitor for the query
+	 */
+	private IProgressMonitor fProgressMonitor = null;
+
+	/**
+	 * <p>Construct a new basic query.</p>
+	 * 
+	 * <p><b>IMPORTANT: </b>It is very important that after
+	 * creating the query and <b>before</b> running the query
+	 * that you call {@link #setResult(AbstractTextSearchResult)}.
+	 * This is not a parameter because typically a search result needs
+	 * a reference to its query and thus the query needs to be constructed
+	 * before its result object can be set.</p>
+	 * 
+	 * @param file the file this query will take place on
+	 */
+	public BasicSearchQuery(IFile file) {
+		this.fFile = file;
+	}
+	
+	/**
+	 * Runs the query
+	 * 
+	 * @see org.eclipse.search.ui.ISearchQuery#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public IStatus run(IProgressMonitor monitor) {
+		fProgressMonitor = monitor;
+		return doQuery();
+	}
+	
+	/**
+	 * public to avoid synthetic method access from inner class
+	 *
+	 * @return
+	 */
+	public IFile getFile() {
+		return this.fFile;
+	}
+
+	/**
+	 * There is no default label for a basic query,
+	 * this should be overridden by implementing classes
+	 * 
+	 * @see org.eclipse.search.ui.ISearchQuery#getLabel()
+	 */
+	public String getLabel() {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * <p>This will be <code>null</code> if {@link #setResult(AbstractTextSearchResult)}
+	 * has not been called yet.</p>
+	 * 
+	 * @see org.eclipse.search.ui.ISearchQuery#getSearchResult()
+	 */
+	public ISearchResult getSearchResult() {
+		return fResult;
+	}
+
+	/**
+	 * Adds a match to the results of this query.
+	 * 
+	 * <p><b>IMPORTANT: </b>It is very important that after
+	 * creating the query and <b>before</b> running the query
+	 * that you call {@link #setResult(AbstractTextSearchResult)}.
+	 * This is not a parameter because typically a search result needs
+	 * a reference to its query and thus the query needs to be constructed
+	 * before its result object can be set.</p>
+	 * 
+	 * @param document the document the match is being added too
+	 * @param matchStart the start character of the match
+	 * @param matchEnd the end character of the match
+	 */
+	public void addMatch(IDocument document, int matchStart, int matchEnd) {
+
+		try {
+			int lineNumber = document.getLineOfOffset(matchStart);
+			int lineStart = document.getLineOffset(lineNumber);
+			int lineLength = document.getLineLength(lineNumber);
+
+			String elementMessage = document.get().substring(lineStart, lineStart + lineLength);
+			
+			//add the match to the result
+				BasicSearchMatchElement element = new BasicSearchMatchElement(fFile, lineNumber, lineStart, elementMessage);
+				fResult.addMatch(new Match(element, Match.UNIT_CHARACTER, matchStart, matchEnd - matchStart));
+			
+		} catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+	}
+
+	/**
+	 * <p><i>Note: </i> as of yet no testing has gone into whether this query
+	 * can be re-run or not or what that even entails.<p>
+	 * 
+	 * @see org.eclipse.search.ui.ISearchQuery#canRerun()
+	 */
+	public boolean canRerun() {
+		return false;
+	}
+
+	/**
+	 * <p>This query can be run in the background</p>
+	 * 
+	 * @see org.eclipse.search.ui.ISearchQuery#canRunInBackground()
+	 */
+	public boolean canRunInBackground() {
+		return true;
+	}
+	
+	/**
+	 * <p>The actual work of the query, called by {@link #run(IProgressMonitor)}</p>
+	 * <p><i>Note: </i>This method should be overridden by implementers so that their query
+	 * will actually do something</p>
+	 * 
+	 * @return the status of the query when it has finished
+	 * 
+	 * @deprecated use {@link #doQuery(IProgressMonitor)} so that the operation is cancelable
+	 */
+	protected IStatus doQuery() {
+		return doQuery(fProgressMonitor);
+	}
+	
+	/**
+	 * <p>The actual work of the query, called by {@link #run(IProgressMonitor)}</p>
+	 * <p><i>Note: </i>This method should be overridden by implementers so that their query
+	 * will actually do something</p>
+	 * 
+	 * @param monitor {@link IProgressMonitor} used to track progress and cancel the operation
+	 * 
+	 * @return the status of the query when it has finished
+	 */
+	protected IStatus doQuery(IProgressMonitor monitor) {
+		return Status.OK_STATUS;
+	}
+	
+	/**
+	 * @return the total number of matches this query found
+	 */
+	protected int getMatchCount() {
+		return fResult.getMatchCount();
+	}
+	
+	/**
+	 * <p>used in search result display labels, should be overridden by implementers</p>
+	 * 
+	 * @return
+	 */
+	protected String getSearchText() {
+		return ""; //$NON-NLS-1$
+	}
+	
+	/**
+	 * <p>This <b>needs</b> to be called after constructing
+	 * the query but before running it, see note on {@link #BasicSearchQuery(IFile)}</p>
+	 * 
+	 * @param result the result this query will use to store its results
+	 */
+	protected void setResult(AbstractTextSearchResult result) {
+		this.fResult = result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/FindOccurrencesActionDelegate.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/FindOccurrencesActionDelegate.java
new file mode 100644
index 0000000..ebc74e4
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/FindOccurrencesActionDelegate.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.search;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil;
+
+/**
+ * Performs the appropriate FindOccurrencesProcessor action call based on
+ * selection. Clients can add processors for different partitions via
+ * <code>getProcessors</code>
+ * 
+ */
+abstract public class FindOccurrencesActionDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate {
+	private IEditorPart fEditor;
+
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		fEditor = targetEditor;
+	}
+
+	public void dispose() {
+		// nulling out just in case
+		fEditor = null;
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(SSEUIMessages.FindOccurrences_label);
+		}
+	}
+
+	public void runWithEvent(IAction action, Event event) {
+		run(action);
+	}
+
+	public void run(IAction action) {
+		boolean okay = false;
+		if (fEditor instanceof ITextEditor) {
+			ITextEditor textEditor = (ITextEditor) fEditor;
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null) {
+				ITextSelection textSelection = getTextSelection(textEditor);
+				FindOccurrencesProcessor findOccurrenceProcessor = getProcessorForCurrentSelection(document, textSelection);
+				if (findOccurrenceProcessor != null) {
+					if (textEditor.getEditorInput() instanceof IFileEditorInput) {
+						IFile file = ((IFileEditorInput) textEditor.getEditorInput()).getFile();
+						okay = findOccurrenceProcessor.findOccurrences(document, textSelection, file);
+					}
+				}
+			}
+		}
+		if (okay) {
+			// clear status message
+			PlatformStatusLineUtil.clearStatusLine();
+		}
+		else {
+			String errorMessage = SSEUIMessages.FindOccurrencesActionProvider_0; //$NON-NLS-1$
+			if (fEditor instanceof StructuredTextEditor) {
+				PlatformStatusLineUtil.displayTemporaryErrorMessage(((StructuredTextEditor) fEditor).getTextViewer(), errorMessage);
+
+			}
+			else {
+				PlatformStatusLineUtil.displayErrorMessage(errorMessage);
+				PlatformStatusLineUtil.addOneTimeClearListener();
+			}
+		}
+	}
+
+	public void init(IViewPart view) {
+		// do nothing
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		// clear status message
+		PlatformStatusLineUtil.clearStatusLine();
+	}
+
+	/**
+	 * Get the appropriate find occurrences processor
+	 * 
+	 * @param document -
+	 *            assumes not null
+	 * @param textSelection
+	 * @return
+	 */
+	private FindOccurrencesProcessor getProcessorForCurrentSelection(IDocument document, ITextSelection textSelection) {
+		// check if we have an action that's enabled on the current partition
+		ITypedRegion tr = getPartition(document, textSelection);
+		String partition = tr != null ? tr.getType() : ""; //$NON-NLS-1$
+
+		Iterator it = getProcessors().iterator();
+		FindOccurrencesProcessor processor = null;
+		while (it.hasNext()) {
+			processor = (FindOccurrencesProcessor) it.next();
+			// we just choose the first action that can handle the partition
+			if (processor.enabledForParitition(partition))
+				return processor;
+		}
+		List extendedFindOccurrencesProcessors = ExtendedConfigurationBuilder.getInstance().getConfigurations(FindOccurrencesProcessor.class.getName(), partition);
+		for (int i = 0; i < extendedFindOccurrencesProcessors.size(); i++) {
+			Object o = extendedFindOccurrencesProcessors.get(i);
+			if (o instanceof FindOccurrencesProcessor) {
+				/*
+				 * We just choose the first registered processor that
+				 * explicitly says it can handle the partition
+				 */
+				processor = (FindOccurrencesProcessor) o;
+				if (processor.enabledForParitition(partition))
+					return processor;
+			}
+		}
+		return null;
+	}
+
+	private ITypedRegion getPartition(IDocument document, ITextSelection textSelection) {
+		ITypedRegion region = null;
+		if (textSelection != null) {
+			try {
+				region = document.getPartition(textSelection.getOffset());
+			}
+			catch (BadLocationException e) {
+				region = null;
+			}
+		}
+		return region;
+	}
+
+	private ITextSelection getTextSelection(ITextEditor textEditor) {
+		ITextSelection textSelection = null;
+		ISelection selection = textEditor.getSelectionProvider().getSelection();
+		if (selection instanceof ITextSelection && !selection.isEmpty()) {
+			textSelection = (ITextSelection) selection;
+		}
+		return textSelection;
+	}
+
+	abstract protected List getProcessors();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/FindOccurrencesProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/FindOccurrencesProcessor.java
new file mode 100644
index 0000000..dfe0917
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/FindOccurrencesProcessor.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.search;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+
+/**
+ * <p>
+ * Finds occurrences of a specified region type w/ region text in an
+ * IStructuredDocument. Clients must implement getPartitionTypes() and
+ * getRegionTypes() to indicate which partition types and region types it can
+ * operate on.
+ * </p>
+ * 
+ * <p>
+ * Clients should override <code>getSearchQuery()</code> in order to provide
+ * their own type of "search" (eg. searching for XML start tags, searching for
+ * Java elements, etc...)
+ * </p>
+ * 
+ */
+abstract public class FindOccurrencesProcessor {
+	public boolean findOccurrences(IDocument document, ITextSelection textSelection, IFile file) {
+		boolean findOccurrences = false;
+
+		// determine if action should be enabled or not
+		if (document instanceof IStructuredDocument) {
+			IStructuredDocument structuredDocument = (IStructuredDocument) document;
+			IStructuredDocumentRegion sdRegion = structuredDocument.getRegionAtCharacterOffset(textSelection.getOffset());
+			if (sdRegion != null) {
+				ITextRegion r = sdRegion.getRegionAtCharacterOffset(textSelection.getOffset());
+				if (r != null) {
+					String type = r.getType();
+					if (enabledForRegionType(type)) {
+						String matchText = sdRegion.getText(r);
+
+						// first of all activate the view
+						NewSearchUI.activateSearchResultView();
+
+						if (matchText != null && type != null) {
+							ISearchQuery searchQuery = getSearchQuery(file, structuredDocument, matchText, type, textSelection);
+							if (searchQuery != null) {
+								if (searchQuery.canRunInBackground())
+									NewSearchUI.runQueryInBackground(searchQuery);
+								else
+									NewSearchUI.runQueryInForeground(null, searchQuery);
+							}
+							findOccurrences = true;
+						}
+					}
+				}
+			}
+		}
+		return findOccurrences;
+	}
+
+	/**
+	 * @param regionType
+	 * @return <code>true</code> if this action can operate on this region
+	 *         type (ITextRegion), otherwise false.
+	 */
+	protected boolean enabledForRegionType(String regionType) {
+
+		String[] accept = getRegionTypes();
+		for (int i = 0; i < accept.length; i++) {
+			if (regionType.equals(accept[i]))
+				return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Clients should override this to enable find occurrences on certain
+	 * partition(s).
+	 */
+	abstract protected String[] getPartitionTypes();
+
+	/**
+	 * Clients should override this to enable find occurrences on different
+	 * region type(s).
+	 */
+	abstract protected String[] getRegionTypes();
+
+	/**
+	 * Clients should override to provide their own search for the file.
+	 */
+	protected ISearchQuery getSearchQuery(IFile file, IStructuredDocument document, String regionText, String regionType, ITextSelection textSelection) {
+		return new OccurrencesSearchQuery(file, document, regionText, regionType);
+	}
+
+	/**
+	 * @param partitionType
+	 * @return <code>true</code> if this action can operate on this type of
+	 *         partition, otherwise <code>false</code>.
+	 */
+	public boolean enabledForParitition(String partitionType) {
+		String[] accept = getPartitionTypes();
+		for (int i = 0; i < accept.length; i++) {
+			if (partitionType.equals(accept[i]))
+				return true;
+		}
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesContentProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesContentProvider.java
new file mode 100644
index 0000000..7a8f26a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesContentProvider.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.search;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author pavery
+ */
+public class OccurrencesContentProvider implements IStructuredContentProvider {
+
+	protected final Object[] EMPTY_ARRAY = new Object[0];
+	private OccurrencesSearchResult fResult = null;
+	private TableViewer fTableViewer = null;
+
+	public void clear() {
+		if (this.fTableViewer != null)
+			this.fTableViewer.refresh();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+		// do nothing
+	}
+
+	public void elementsChanged(Object[] updatedElements) {
+
+		//TODO: copied from JavaSearchTableContentProvider
+		for (int i = 0; i < updatedElements.length; i++) {
+			if (this.fResult.getMatchCount(updatedElements[i]) > 0) {
+				if (this.fTableViewer.testFindItem(updatedElements[i]) != null)
+					this.fTableViewer.refresh(updatedElements[i]);
+				else
+					this.fTableViewer.add(updatedElements[i]);
+			} else {
+				this.fTableViewer.remove(updatedElements[i]);
+			}
+		}
+	}
+
+
+	/**
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object inputElement) {
+
+		this.fResult = (OccurrencesSearchResult) inputElement;
+		return this.fResult.getElements();
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+	 *      java.lang.Object, java.lang.Object)
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+		if (viewer instanceof TableViewer)
+			this.fTableViewer = (TableViewer) viewer;
+		this.fResult = (OccurrencesSearchResult) newInput;
+	}
+
+	public void refresh() {
+
+		if (this.fTableViewer != null)
+			this.fTableViewer.refresh();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchQuery.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchQuery.java
new file mode 100644
index 0000000..d5c8e0f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchQuery.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.search;
+
+import java.text.MessageFormat;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * Basic ISearchQuery that finds matches of region type and region text.
+ * 
+ * @author pavery
+ */
+public class OccurrencesSearchQuery extends BasicSearchQuery {
+
+	/**
+	 * We need a runnable so that the search markers show up in the live
+	 * document.
+	 */
+	private class FindRegions implements IWorkspaceRunnable {
+
+		private IStructuredDocument fFindRegionsDocument = null;
+		private String fMatchName = null;
+		private String fMatchRegionType = null;
+
+		public FindRegions(IStructuredDocument document, String matchText, String matchRegionType) {
+
+			this.fFindRegionsDocument = document;
+			this.fMatchName = matchText;
+			this.fMatchRegionType = matchRegionType;
+		}
+
+		private void findOccurrences(IProgressMonitor monitor) {
+
+			if (!isCanceled(monitor)) {
+
+				int matchStart = -1;
+				int matchEnd = -1;
+				String findRegionText = ""; //$NON-NLS-1$
+
+				ITextRegion r = null;
+				ITextRegionList regions = null;
+				IStructuredDocumentRegion current = this.fFindRegionsDocument.getFirstStructuredDocumentRegion();
+
+				// this is the main loop that iterates the document
+				while (current != null && !isCanceled(monitor)) {
+					regions = current.getRegions();
+					for (int i = 0; i < regions.size() && !isCanceled(monitor); i++) {
+
+						r = regions.get(i);
+
+						// maybe this is the equals check where some valid
+						// matches are failing (like searching on end tag)
+						if (r.getType().equals(this.fMatchRegionType) && current.getText(r).equals(this.fMatchName)) {
+
+							findRegionText = current.getText(r);
+
+							// region found
+							matchStart = current.getStartOffset(r);
+							matchEnd = matchStart + findRegionText.trim().length();
+
+							addMatch(this.fFindRegionsDocument, matchStart, matchEnd);
+						}
+					}
+					current = current.getNext();
+				}
+			}
+		}
+
+		private boolean isCanceled(IProgressMonitor monitor) {
+			return monitor != null && monitor.isCanceled();
+		}
+
+		public void run(IProgressMonitor monitor) throws CoreException {
+
+			try {
+				findOccurrences(monitor);
+			} catch (Exception e) {
+				Logger.logException(e);
+			}
+		}
+	}// end inner class FindRegions
+
+
+	private IStructuredDocument fDocument = null;
+	private String fRegionText = null;
+	private String fRegionType = null;
+
+	public OccurrencesSearchQuery(IFile file, IStructuredDocument document, String regionText, String regionType) {
+		super(file);
+		super.setResult(new OccurrencesSearchResult(this));
+		this.fDocument = document;
+		this.fRegionText = regionText;
+		this.fRegionType = regionType;
+	}
+
+	/**
+	 * <p><i>Note: </i>Some investigation needs to be put into how to do this safely</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.search.BasicSearchQuery#canRunInBackground()
+	 */
+	public boolean canRunInBackground() {
+		return false;
+	}
+	
+	/**
+	 * <p>The label format is:<br/>
+	 * searchText - # occurrences in file</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.search.BasicSearchQuery#getLabel()
+	 */
+	public String getLabel() {
+		String label = SSEUIMessages.OccurrencesSearchQuery_0; //$NON-NLS-1$
+		String[] args = {getSearchText(), "" + super.getMatchCount(), getFilename()};
+		return MessageFormat.format(label, args);
+	}
+
+	/**
+	 * This query looks for all occurrences of the selected string
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.search.BasicSearchQuery#doQuery()
+	 */
+	protected IStatus doQuery(IProgressMonitor monitor) {
+		IStatus status = Status.OK_STATUS;
+		FindRegions findRegions = new FindRegions(this.fDocument, this.fRegionText, this.fRegionType);
+		try {
+			// BUG158846 - deadlock if lock up entire workspace, so only lock
+			// up the file we are searching on
+			ISchedulingRule markerRule = ResourcesPlugin.getWorkspace().getRuleFactory().markerRule(getFile());
+			ResourcesPlugin.getWorkspace().run(findRegions, markerRule, IWorkspace.AVOID_UPDATE, monitor);
+		} catch (CoreException e) {
+			status = new Status(IStatus.ERROR, SSEUIPlugin.ID, IStatus.OK, "", null); //$NON-NLS-1$
+		}
+		return status;
+	}
+
+	protected String getSearchText() {
+		return this.fRegionText;
+	}
+	
+	private String getFilename() {
+		String filename = SSEUIMessages.OccurrencesSearchQuery_2; //$NON-NLS-1$ "file"
+		if (getFile() != null)
+			filename = getFile().getName().toString();
+		return filename;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchResult.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchResult.java
new file mode 100644
index 0000000..8082773
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchResult.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.search;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.IEditorMatchAdapter;
+import org.eclipse.search.ui.text.IFileMatchAdapter;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
+
+
+/**
+ * @author pavery
+ */
+public class OccurrencesSearchResult extends AbstractTextSearchResult implements IEditorMatchAdapter, IFileMatchAdapter {
+
+	private ISearchQuery fQuery = null;
+	private final Match[] NO_MATCHES = new Match[0];
+
+	public OccurrencesSearchResult(ISearchQuery query) {
+		this.fQuery = query;
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.IEditorMatchAdapter#computeContainedMatches(org.eclipse.search.ui.text.AbstractTextSearchResult,
+	 *      org.eclipse.ui.IEditorPart)
+	 */
+	public Match[] computeContainedMatches(AbstractTextSearchResult result, IEditorPart editor) {
+
+		IEditorInput editorInput = editor.getEditorInput();
+		if (editorInput instanceof IFileEditorInput) {
+			IFileEditorInput fileEditorInput = (IFileEditorInput) editorInput;
+			return computeContainedMatches(result, fileEditorInput.getFile());
+		}
+		return this.NO_MATCHES;
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.IFileMatchAdapter#computeContainedMatches(org.eclipse.search.ui.text.AbstractTextSearchResult,
+	 *      org.eclipse.core.resources.IFile)
+	 */
+	public Match[] computeContainedMatches(AbstractTextSearchResult result, IFile file) {
+		Match[] matches = this.getMatches();
+		Match[] containedMatches = new Match[0];
+		
+		/* only contains matches if the file for one of the matches is the
+		 * same as the given file.
+		 * Note: all matches in a result are related to the same file
+		 */
+		if(matches.length > 0 &&
+			matches[0].getElement() instanceof BasicSearchMatchElement &&
+			((BasicSearchMatchElement)matches[0].getElement()).getFile().equals(file)) {
+			
+			containedMatches = matches;
+		}
+		return containedMatches;
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.AbstractTextSearchResult#getEditorMatchAdapter()
+	 */
+	public IEditorMatchAdapter getEditorMatchAdapter() {
+		return this;
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.IFileMatchAdapter#getFile(java.lang.Object)
+	 */
+	public IFile getFile(Object element) {
+		// return the file for the match
+		IFile file = null;
+		//System.out.println("get file for:"+element);
+		if (element instanceof IMarker) {
+			IResource r = ((IMarker) element).getResource();
+			if (r instanceof IFile) {
+				file = (IFile) r;
+			}
+		}
+		return file;
+	}
+
+	public IFileMatchAdapter getFileMatchAdapter() {
+		return this;
+	}
+
+	public ImageDescriptor getImageDescriptor() {
+		return EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_OBJ_OCC_MATCH);
+	}
+
+	/**
+	 * This label shows up in the search history
+	 */
+	public String getLabel() {
+		return getQuery().getLabel();
+	}
+
+	/**
+	 * @return the matches associated with this result
+	 */
+	public Match[] getMatches() {
+		return collectMatches(getElements());
+	}
+
+	public ISearchQuery getQuery() {
+		return this.fQuery;
+	}
+
+	public String getTooltip() {
+		return getLabel();
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.IEditorMatchAdapter#isShownInEditor(org.eclipse.search.ui.text.Match,
+	 *      org.eclipse.ui.IEditorPart)
+	 */
+	public boolean isShownInEditor(Match match, IEditorPart editor) {
+		return true;
+	}
+	
+	/**
+	 * <p>Taken from {@link org.eclipse.jdt.internal.ui.search.OccurrencesSearchResult#collectMatches}</p>
+	 * 
+	 * @param elements get the matches for these elements
+	 * @return the matches associated with this result
+	 */
+	private Match[] collectMatches(Object[] elements) {
+		Match[] matches= new Match[getMatchCount()];
+		int writeIndex= 0;
+		for (int i= 0; i < elements.length; i++) {
+			Match[] perElement= getMatches(elements[i]);
+			for (int j= 0; j < perElement.length; j++) {
+				matches[writeIndex++]= perElement[j];
+			}
+		}
+		return matches;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchViewPage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchViewPage.java
new file mode 100644
index 0000000..2e61980
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/search/OccurrencesSearchViewPage.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.search;
+
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+/**
+ * Base page for Occurrences in file search results.
+ * 
+ * @author pavery
+ */
+public class OccurrencesSearchViewPage extends AbstractTextSearchViewPage {
+
+	private OccurrencesContentProvider fContentProvider = null;
+
+	public OccurrencesSearchViewPage() {
+		super(AbstractTextSearchViewPage.FLAG_LAYOUT_FLAT);
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#clear()
+	 */
+	protected void clear() {
+		if (this.fContentProvider != null)
+			this.fContentProvider.clear();
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTableViewer(org.eclipse.jface.viewers.TableViewer)
+	 */
+	protected void configureTableViewer(TableViewer viewer) {
+
+		//sort results by line number, low to high
+		viewer.setComparator(new ViewerComparator() {
+			public int compare(Viewer v, Object obj1, Object obj2) {
+				BasicSearchMatchElement elem1= (BasicSearchMatchElement) obj1;
+				BasicSearchMatchElement elem2= (BasicSearchMatchElement) obj2;
+				return elem1.getLineNum() - elem2.getLineNum();
+			}
+		});
+		
+		//allow for formated labels
+		viewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new BasicSearchLabelProvider(this)));
+		this.fContentProvider = new OccurrencesContentProvider();
+		viewer.setContentProvider(this.fContentProvider);
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTreeViewer(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	protected void configureTreeViewer(TreeViewer viewer) {
+		// not supported at the moment
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(java.lang.Object[])
+	 */
+	protected void elementsChanged(Object[] objects) {
+		if (this.fContentProvider != null) {
+			this.fContentProvider.elementsChanged(objects);
+		}
+	}
+
+	public void forceRefresh() {
+		this.fContentProvider.refresh();
+	}
+
+	private IWorkbenchPage getActivePage() {
+
+		IWorkbench workbench = PlatformUI.getWorkbench();
+		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+		if (window == null)
+			return null;
+		return workbench.getActiveWorkbenchWindow().getActivePage();
+	}
+
+	/**
+	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#showMatch(org.eclipse.search.ui.text.Match,
+	 *      int, int)
+	 */
+	protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate) throws PartInitException {
+		BasicSearchMatchElement element = (BasicSearchMatchElement) match.getElement();
+		
+		IWorkbenchPage activePage = getActivePage();
+		try {
+			if (activePage != null) {
+				// open editor if needed
+				IDE.openEditor(getActivePage(), element.getFile());
+				//set the selection in the open editor
+				IEditorPart editor = activePage.getActiveEditor();
+				if (activate)
+					editor.getSite().getPage().activate(editor);
+				editor.getEditorSite().getSelectionProvider().setSelection(
+					new TextSelection(currentOffset, currentLength));
+			}
+		} catch (PartInitException e) {
+			// possible exception trying to open editor
+			Logger.logException(e);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/SelectionHistory.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/SelectionHistory.java
new file mode 100644
index 0000000..79a8857
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/SelectionHistory.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.selection;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class SelectionHistory {
+	private ITextEditor fEditor;
+	private List fHistory;
+	private List fHistoryActions;
+	private int fSelectionChangeListenerCounter;
+	private ISelectionChangedListener fSelectionListener;
+
+	public SelectionHistory(ITextEditor editor) {
+		Assert.isNotNull(editor);
+		fEditor = editor;
+		fHistory = new ArrayList(3);
+		fSelectionListener = new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if (fSelectionChangeListenerCounter == 0)
+					flush();
+			}
+		};
+		fEditor.getSelectionProvider().addSelectionChangedListener(fSelectionListener);
+	}
+
+	public void dispose() {
+		fEditor.getSelectionProvider().removeSelectionChangedListener(fSelectionListener);
+		fEditor = null;
+		if (fHistory != null && !fHistory.isEmpty()) {
+			fHistory.clear();
+		}
+		if (fHistoryActions != null && !fHistoryActions.isEmpty()) {
+			fHistoryActions.clear();
+		}
+	}
+
+	public void flush() {
+		if (fHistory.isEmpty())
+			return;
+		fHistory.clear();
+		updateHistoryAction();
+	}
+
+	public IRegion getLast() {
+		if (isEmpty())
+			return null;
+		int size = fHistory.size();
+		IRegion result = (IRegion) fHistory.remove(size - 1);
+		updateHistoryAction();
+		return result;
+	}
+
+	public void ignoreSelectionChanges() {
+		fSelectionChangeListenerCounter++;
+	}
+
+	public boolean isEmpty() {
+		return fHistory.isEmpty();
+	}
+
+	public void listenToSelectionChanges() {
+		fSelectionChangeListenerCounter--;
+	}
+
+	public void remember(IRegion region) {
+		fHistory.add(region);
+		updateHistoryAction();
+	}
+
+	public void setHistoryAction(IAction action) {
+		Assert.isNotNull(action);
+		
+		if (fHistoryActions == null)
+			fHistoryActions = new ArrayList();
+		if (!fHistoryActions.contains(action))
+			fHistoryActions.add(action);
+		
+		// update action
+		if (fHistory != null && !fHistory.isEmpty())
+			action.setEnabled(true);
+		else
+			action.setEnabled(false);
+	}
+
+	private void updateHistoryAction() {
+		if (fHistoryActions != null && !fHistoryActions.isEmpty()) {
+			boolean enabled = false;
+			if (fHistory != null && !fHistory.isEmpty())
+				enabled = true;
+
+			Iterator iter = fHistoryActions.iterator();
+			while (iter.hasNext()) {
+				((IAction)iter.next()).setEnabled(enabled);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructureSelectAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructureSelectAction.java
new file mode 100644
index 0000000..fc27d39
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructureSelectAction.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.selection;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.w3c.dom.Node;
+
+/**
+ * @deprecated use StructuredSelectActionDelegate instead
+ */
+
+public abstract class StructureSelectAction extends Action {
+	protected StructuredTextEditor fEditor = null;
+	protected SelectionHistory fHistory;
+	protected IStructuredModel fModel = null;
+	protected StructuredTextViewer fViewer = null;
+
+	public StructureSelectAction(StructuredTextEditor editor) {
+		super();
+
+		Assert.isNotNull(editor);
+		fEditor = editor;
+		fHistory = (SelectionHistory) editor.getAdapter(SelectionHistory.class);
+		fViewer = editor.getTextViewer();
+		fModel = editor.getModel();
+		Assert.isNotNull(fViewer);
+	}
+
+	abstract protected IndexedRegion getCursorIndexedRegion();
+
+	protected IndexedRegion getIndexedRegion(int offset) {
+		IndexedRegion indexedRegion = null;
+
+		int lastOffset = offset;
+		IDocument document = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+		if (model != null) {
+			try {
+				indexedRegion = model.getIndexedRegion(lastOffset);
+				while (indexedRegion == null && lastOffset >= 0) {
+					lastOffset--;
+					indexedRegion = model.getIndexedRegion(lastOffset);
+				}
+			}
+			finally {
+				model.releaseFromRead();
+			}
+		}
+
+		return indexedRegion;
+	}
+
+	abstract protected Region getNewSelectionRegion(Node node, Region region);
+
+	public void run() {
+		Region currentRegion = new Region(fViewer.getSelectedRange().x, fViewer.getSelectedRange().y);
+		if (currentRegion.getLength() == fViewer.getDocument().getLength())
+			return;
+
+		IndexedRegion cursorIndexedRegion = getCursorIndexedRegion();
+		if (cursorIndexedRegion instanceof Node) {
+			Node cursorNode = (Node) cursorIndexedRegion;
+
+			// use parent node for empty text node
+			if (cursorNode.getNodeType() == Node.TEXT_NODE && cursorNode.getNodeValue().trim().length() == 0) {
+				cursorNode = cursorNode.getParentNode();
+
+				if (cursorNode instanceof IndexedRegion)
+					cursorIndexedRegion = (IndexedRegion) cursorNode;
+			}
+
+			Region cursorNodeRegion = new Region(cursorIndexedRegion.getStartOffset(), cursorIndexedRegion.getEndOffset() - cursorIndexedRegion.getStartOffset());
+
+			Region newRegion = null;
+			if (cursorNodeRegion.getOffset() >= currentRegion.getOffset() && cursorNodeRegion.getOffset() <= currentRegion.getOffset() + currentRegion.getLength() && cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() >= currentRegion.getOffset() && cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() <= currentRegion.getOffset() + currentRegion.getLength())
+				newRegion = getNewSelectionRegion(cursorNode, currentRegion);
+			else
+				newRegion = cursorNodeRegion;
+
+			if (newRegion != null) {
+				fHistory.remember(currentRegion);
+				try {
+					fHistory.ignoreSelectionChanges();
+					fEditor.selectAndReveal(newRegion.getOffset(), newRegion.getLength());
+				}
+				finally {
+					fHistory.listenToSelectionChanges();
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructureSelectHistoryAction.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructureSelectHistoryAction.java
new file mode 100644
index 0000000..8037c52
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructureSelectHistoryAction.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.selection;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.w3c.dom.Node;
+
+public class StructureSelectHistoryAction extends StructureSelectAction implements IUpdate {
+	public StructureSelectHistoryAction(StructuredTextEditor editor) {
+		super(editor);
+		setText(SSEUIMessages.StructureSelectHistory_label); //$NON-NLS-1$
+		setToolTipText(SSEUIMessages.StructureSelectHistory_tooltip); //$NON-NLS-1$
+		setDescription(SSEUIMessages.StructureSelectHistory_description); //$NON-NLS-1$
+
+		update();
+	}
+
+	protected IndexedRegion getCursorIndexedRegion() {
+		return null;
+	}
+
+	protected Region getNewSelectionRegion(Node node, Region region) {
+		return null;
+	}
+
+	public void run() {
+		IRegion old = fHistory.getLast();
+		if (old != null) {
+			try {
+				fHistory.ignoreSelectionChanges();
+				fEditor.selectAndReveal(old.getOffset(), old.getLength());
+			} finally {
+				fHistory.listenToSelectionChanges();
+			}
+		}
+	}
+
+	public void update() {
+		setEnabled(!fHistory.isEmpty());
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructuredSelectActionDelegate.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructuredSelectActionDelegate.java
new file mode 100644
index 0000000..dbdf4ae
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructuredSelectActionDelegate.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.selection;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+
+abstract public class StructuredSelectActionDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate {
+	private IEditorPart fEditor;
+	private SelectionHistory fHistory;
+
+	public void dispose() {
+		fEditor = null;
+		fHistory = null;
+	}
+
+	public void init(IViewPart view) {
+		// do nothing
+	}
+
+	public void runWithEvent(IAction action, Event event) {
+		run(action);
+	}
+
+	public void run(IAction action) {
+		if (fEditor instanceof ITextEditor) {
+			ITextEditor textEditor = (ITextEditor) fEditor;
+
+			ISelection selection = textEditor.getSelectionProvider().getSelection();
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			// determine current text selection
+			if (selection instanceof ITextSelection && document != null) {
+				ITextSelection textSelection = (ITextSelection) selection;
+
+				if (textSelection.getLength() < document.getLength()) {
+					// get current indexed region
+					IndexedRegion cursorIndexedRegion = getCursorIndexedRegion(document, textSelection);
+
+					// determine new selection based on current indexed region
+					Region newSelectionRegion = getNewSelectionRegion(cursorIndexedRegion, textSelection);
+
+					// select new selection
+					if (newSelectionRegion != null) {
+						fHistory.remember(new Region(textSelection.getOffset(), textSelection.getLength()));
+						try {
+							fHistory.ignoreSelectionChanges();
+							textEditor.selectAndReveal(newSelectionRegion.getOffset(), newSelectionRegion.getLength());
+						}
+						finally {
+							fHistory.listenToSelectionChanges();
+						}
+					}
+				}
+			}
+		}
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		// do nothing
+	}
+
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		fEditor = targetEditor;
+		if (fEditor != null)
+			fHistory = (SelectionHistory) fEditor.getAdapter(SelectionHistory.class);
+		else
+			fHistory = null;
+	}
+	
+	abstract protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection);
+	
+	abstract protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection);
+	
+	/**
+	 * This method will probably be removed and replaced by using new selection provider
+	 * @param document
+	 * @param offset
+	 * @return
+	 */
+	protected IndexedRegion getIndexedRegion(IDocument document, int offset) {
+		IndexedRegion indexedRegion = null;
+
+		int lastOffset = offset;
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+		if (model != null) {
+			try {
+				indexedRegion = model.getIndexedRegion(lastOffset);
+				while (indexedRegion == null && lastOffset >= 0) {
+					lastOffset--;
+					indexedRegion = model.getIndexedRegion(lastOffset);
+				}
+			}
+			finally {
+				model.releaseFromRead();
+			}
+		}
+
+		return indexedRegion;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructuredSelectHistoryActionDelegate.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructuredSelectHistoryActionDelegate.java
new file mode 100644
index 0000000..47dc5c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/selection/StructuredSelectHistoryActionDelegate.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.internal.selection;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+
+/**
+ * Selection history action delegate. Keeps track of selection within editor.
+ */
+public class StructuredSelectHistoryActionDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate {
+	private IEditorPart fEditor;
+	private SelectionHistory fHistory;
+
+	public void dispose() {
+		fEditor = null;
+		fHistory = null;
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(SSEUIMessages.StructureSelectHistory_label);
+			action.setToolTipText(SSEUIMessages.StructureSelectHistory_tooltip);
+			action.setDescription(SSEUIMessages.StructureSelectHistory_description);
+		}
+	}
+
+	public void init(IViewPart view) {
+		// do nothing
+	}
+
+	public void run(IAction action) {
+		IRegion old = fHistory.getLast();
+		if (old != null) {
+			try {
+				fHistory.ignoreSelectionChanges();
+				if (fEditor instanceof ITextEditor)
+					((ITextEditor) fEditor).selectAndReveal(old.getOffset(), old.getLength());
+			}
+			finally {
+				fHistory.listenToSelectionChanges();
+			}
+		}
+	}
+
+	public void runWithEvent(IAction action, Event event) {
+		run(action);
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		// do nothing
+	}
+
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		fEditor = targetEditor;
+		if (fEditor != null)
+			fHistory = (SelectionHistory) fEditor.getAdapter(SelectionHistory.class);
+		else
+			fHistory = null;
+		if (fHistory != null) {
+			fHistory.setHistoryAction(action);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/ISpellcheckDelegate.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/ISpellcheckDelegate.java
new file mode 100644
index 0000000..ce55c8f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/ISpellcheckDelegate.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.spelling;
+
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+
+/**
+ * <p>Defines an interface for deciding if an offset in an <code>IStructuredModel</code>
+ * should be spell checked. Created so that content type specific decisions
+ * could be made as to whether a region should be spell-checked or not.
+ * This is done using the <code>IAdapterFactory</code> framework.</p>
+ */
+public interface ISpellcheckDelegate {
+
+	/**
+	 * Decide if the <code>offset</code> in <code>model</code> should be spell checked or not.
+	 * 
+	 * @param offset decide if this offset in the given <code>model</code> should be spell-checked 
+	 * @param model used to decide if the given <code>offset</code> should be spell-checked
+	 * @return <code>true</code> if the given <code>offset</code> in the given <code>model</code>
+	 * should be spell checked, <code>false</code> otherwise.
+	 */
+	public boolean shouldSpellcheck(int offset, IStructuredModel model);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/SpellcheckStrategy.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/SpellcheckStrategy.java
new file mode 100644
index 0000000..d75e8e6
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/SpellcheckStrategy.java
@@ -0,0 +1,407 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.spelling;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModelExtension;
+import org.eclipse.jface.text.source.IAnnotationModelExtension2;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector;
+import org.eclipse.ui.texteditor.spelling.SpellingAnnotation;
+import org.eclipse.ui.texteditor.spelling.SpellingContext;
+import org.eclipse.ui.texteditor.spelling.SpellingProblem;
+import org.eclipse.ui.texteditor.spelling.SpellingService;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.parser.ForeignRegion;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.reconcile.ReconcileAnnotationKey;
+import org.eclipse.wst.sse.ui.internal.reconcile.StructuredReconcileStep;
+import org.eclipse.wst.sse.ui.internal.reconcile.StructuredTextReconcilingStrategy;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+
+/**
+ * A reconciling strategy that queries the SpellingService using its default
+ * engine. Results are show as temporary annotations.
+ * 
+ * @since 1.1
+ */
+public class SpellcheckStrategy extends StructuredTextReconcilingStrategy {
+
+	class SpellCheckPreferenceListener implements IPropertyChangeListener {
+		private boolean isInterestingProperty(Object property) {
+			return SpellingService.PREFERENCE_SPELLING_ENABLED.equals(property) || SpellingService.PREFERENCE_SPELLING_ENGINE.equals(property);
+		}
+
+		public void propertyChange(PropertyChangeEvent event) {
+			if (isInterestingProperty(event.getProperty())) {
+				if (event.getOldValue() == null || event.getNewValue() == null || !event.getNewValue().equals(event.getOldValue())) {
+					reconcile();
+				}
+			}
+		}
+	}
+
+	private class SpellingProblemCollector implements ISpellingProblemCollector {
+		List annotations = new ArrayList();
+
+		public void accept(SpellingProblem problem) {
+			if (isInterestingProblem(problem)) {
+				TemporaryAnnotation annotation = new TemporaryAnnotation(new Position(problem.getOffset(), problem.getLength()), SpellingAnnotation.TYPE, problem.getMessage(), fReconcileAnnotationKey);
+
+				SpellingQuickAssistProcessor quickAssistProcessor = new SpellingQuickAssistProcessor();
+				quickAssistProcessor.setSpellingProblem(problem);
+				annotation.setAdditionalFixInfo(quickAssistProcessor);
+				annotations.add(annotation);
+				if (_DEBUG_SPELLING_PROBLEMS) {
+					Logger.log(Logger.INFO, problem.getMessage());
+				}
+			}
+		}
+
+		public void beginCollecting() {
+		}
+
+		void clear() {
+			annotations.clear();
+		}
+
+		public void endCollecting() {
+		}
+
+		Annotation[] getAnnotations() {
+			return (Annotation[]) annotations.toArray(new Annotation[annotations.size()]);
+		}
+	}
+
+	private static final boolean _DEBUG_SPELLING = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerSpelling")).booleanValue(); //$NON-NLS-1$
+	private static final boolean _DEBUG_SPELLING_PROBLEMS = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/reconcilerSpelling/showProblems")).booleanValue(); //$NON-NLS-1$
+
+	private static final String EXTENDED_BUILDER_TYPE_CONTEXTS = "spellingregions"; //$NON-NLS-1$
+	private static final String KEY_CONTENT_TYPE = "org.eclipse.wst.sse.ui.temp.spelling"; //$NON-NLS-1$
+
+	private String fContentTypeId = null;
+
+	private SpellingProblemCollector fProblemCollector = new SpellingProblemCollector();
+
+	/*
+	 * Keying our Temporary Annotations based on the partition doesn't help
+	 * this strategy to only remove its own TemporaryAnnotations since it's
+	 * possibly run on all partitions. Instead, set the key to use an
+	 * arbitrary partition type that we can check for using our own
+	 * implementation of getAnnotationsToRemove(DirtyRegion).
+	 */
+	ReconcileAnnotationKey fReconcileAnnotationKey;
+
+	private IPropertyChangeListener fSpellCheckPreferenceListener;
+
+	private SpellingContext fSpellingContext;
+
+	private String[] fSupportedTextRegionContexts;
+	private IReconcileStep fSpellingStep = new StructuredReconcileStep() {
+	};
+
+	public SpellcheckStrategy(ISourceViewer viewer, String contentTypeId) {
+		super(viewer);
+		fContentTypeId = contentTypeId;
+
+		fSpellingContext = new SpellingContext();
+		IContentType contentType = Platform.getContentTypeManager().getContentType(fContentTypeId);
+		fSpellingContext.setContentType(contentType);
+		fReconcileAnnotationKey = new ReconcileAnnotationKey(fSpellingStep, KEY_CONTENT_TYPE, ReconcileAnnotationKey.PARTIAL);
+
+		/**
+		 * Inherit spelling region rules
+		 */
+		List contexts = new ArrayList();
+		IContentType testType = contentType;
+		while (testType != null) {
+			String[] textRegionContexts = ExtendedConfigurationBuilder.getInstance().getDefinitions(EXTENDED_BUILDER_TYPE_CONTEXTS, testType.getId());
+			for (int j = 0; j < textRegionContexts.length; j++) {
+				contexts.addAll(Arrays.asList(StringUtils.unpack(textRegionContexts[j])));
+			}
+			testType = testType.getBaseType();
+		}
+		fSupportedTextRegionContexts = (String[]) contexts.toArray(new String[contexts.size()]);
+
+		fSpellCheckPreferenceListener = new SpellCheckPreferenceListener();
+	}
+
+	protected boolean containsStep(IReconcileStep step) {
+		return fSpellingStep.equals(step);
+	}
+
+	public void createReconcileSteps() {
+
+	}
+
+	private TemporaryAnnotation[] getSpellingAnnotationsToRemove(IRegion region) {
+		List toRemove = new ArrayList();
+		IAnnotationModel annotationModel = getAnnotationModel();
+		// can be null when closing the editor
+		if (annotationModel != null) {
+			Iterator i = null;
+			boolean annotationOverlaps = false;
+			if (annotationModel instanceof IAnnotationModelExtension2) {
+				i = ((IAnnotationModelExtension2) annotationModel).getAnnotationIterator(region.getOffset(), region.getLength(), true, true);
+				annotationOverlaps = true;
+			}
+			else {
+				i = annotationModel.getAnnotationIterator();
+			}
+
+			while (i.hasNext()) {
+				Object obj = i.next();
+				if (!(obj instanceof TemporaryAnnotation))
+					continue;
+
+				TemporaryAnnotation annotation = (TemporaryAnnotation) obj;
+				ReconcileAnnotationKey key = (ReconcileAnnotationKey) annotation.getKey();
+
+				// then if this strategy knows how to add/remove this
+				// partition type
+				if (key != null && key.equals(fReconcileAnnotationKey)) {
+					if (key.getScope() == ReconcileAnnotationKey.PARTIAL && (annotationOverlaps || annotation.getPosition().overlapsWith(region.getOffset(), region.getLength()))) {
+						toRemove.add(annotation);
+					}
+					else if (key.getScope() == ReconcileAnnotationKey.TOTAL) {
+						toRemove.add(annotation);
+					}
+				}
+			}
+		}
+
+		return (TemporaryAnnotation[]) toRemove.toArray(new TemporaryAnnotation[toRemove.size()]);
+	}
+
+	/**
+	 * Judge whether a spelling problem is "interesting". Accept any regions
+	 * that are explicitly allowed, and since valid prose areas are rarely in
+	 * a complicated document region, accept any document region with more
+	 * than one text region and reject any document regions containing foreign
+	 * text regions.
+	 * 
+	 * @param problem
+	 *            a SpellingProblem
+	 * @return whether the collector should accept the given SpellingProblem
+	 */
+	protected boolean isInterestingProblem(SpellingProblem problem) {
+		IDocument document = getDocument();
+		if (document instanceof IStructuredDocument) {
+			/*
+			 * If the error is in a read-only section, ignore it. The user
+			 * won't be able to correct it.
+			 */
+			if (((IStructuredDocument) document).containsReadOnly(problem.getOffset(), problem.getLength()))
+				return false;
+
+			IStructuredDocumentRegion documentRegion = ((IStructuredDocument) document).getRegionAtCharacterOffset(problem.getOffset());
+			if (documentRegion != null) {
+				ITextRegion textRegion = documentRegion.getRegionAtCharacterOffset(problem.getOffset());
+				//if the region is not null, and is a supported context and is not a collection of regions,
+				//	and it should be spell-checked, then spell check it.
+				if (textRegion != null && isSupportedContext(textRegion.getType()) && !(textRegion instanceof ITextRegionCollection) && shouldSpellcheck(problem.getOffset())) {
+					return true;
+				}
+				if (documentRegion.getFirstRegion() instanceof ForeignRegion)
+					return false;
+//				[192572] Simple regions were being spellchecked just for the sake of them being simple
+//				if (documentRegion.getRegions().size() == 1)
+//					return true;
+				return false;
+			}
+		}
+		return true;
+	}
+
+
+	private boolean isSupportedContext(String type) {
+		boolean isSupported = false;
+		if (fSupportedTextRegionContexts.length > 0) {
+			for (int i = 0; i < fSupportedTextRegionContexts.length; i++) {
+				if (type.equals(fSupportedTextRegionContexts[i])) {
+					isSupported = true;
+					break;
+				}
+			}
+		}
+		else {
+			isSupported = true;
+		}
+		return isSupported;
+	}
+
+	public void reconcile() {
+		IDocument document = getDocument();
+		if (document != null) {
+			IAnnotationModel annotationModel = getAnnotationModel();
+			if (annotationModel != null) {
+				IRegion documentRegion = new Region(0, document.getLength());
+				spellCheck(documentRegion, documentRegion, annotationModel);
+			}
+		}
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+		if (isCanceled())
+			return;
+
+		IAnnotationModel annotationModel = getAnnotationModel();
+
+		IDocument document = getDocument();
+		if (document != null) {
+			long time0 = 0;
+			if (_DEBUG_SPELLING) {
+				time0 = System.currentTimeMillis();
+			}
+			/**
+			 * Apparently the default spelling engine has noticeable overhead
+			 * when called multiple times in rapid succession. It's faster to
+			 * check the entire dirty region at once since we know that we're
+			 * not differentiating by partition.
+			 * 
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=192530
+			 */
+			if (_DEBUG_SPELLING) {
+				Logger.log(Logger.INFO, "Spell Checking [" + dirtyRegion.getOffset() + ":" + dirtyRegion.getLength() + "] : " + (System.currentTimeMillis() - time0));
+			}
+			if (annotationModel != null) {
+				spellCheck(dirtyRegion, dirtyRegion, annotationModel);
+			}
+		}
+	}
+
+	private void spellCheck(IRegion dirtyRegion, IRegion regionToBeChecked, IAnnotationModel annotationModel) {
+		if (annotationModel == null)
+			return;
+
+		TemporaryAnnotation[] annotationsToRemove;
+		Annotation[] annotationsToAdd;
+		annotationsToRemove = getSpellingAnnotationsToRemove(regionToBeChecked);
+
+		if (_DEBUG_SPELLING_PROBLEMS) {
+			Logger.log(Logger.INFO, "Spell checking [" + regionToBeChecked.getOffset() + "-" + (regionToBeChecked.getOffset() + regionToBeChecked.getLength()) + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		if (getDocument() != null) {
+			EditorsUI.getSpellingService().check(getDocument(), new IRegion[]{regionToBeChecked}, fSpellingContext, fProblemCollector, null);
+		}
+		annotationsToAdd = fProblemCollector.getAnnotations();
+		fProblemCollector.clear();
+
+
+		if (annotationModel instanceof IAnnotationModelExtension) {
+			IAnnotationModelExtension modelExtension = (IAnnotationModelExtension) annotationModel;
+			Map annotationsToAddMap = new HashMap();
+			for (int i = 0; i < annotationsToAdd.length; i++) {
+				annotationsToAddMap.put(annotationsToAdd[i], ((TemporaryAnnotation) annotationsToAdd[i]).getPosition());
+			}
+			modelExtension.replaceAnnotations(annotationsToRemove, annotationsToAddMap);
+		}
+
+		else {
+			for (int j = 0; j < annotationsToAdd.length; j++) {
+				annotationModel.addAnnotation(annotationsToAdd[j], ((TemporaryAnnotation) annotationsToAdd[j]).getPosition());
+			}
+			for (int j = 0; j < annotationsToRemove.length; j++) {
+				annotationModel.removeAnnotation(annotationsToRemove[j]);
+			}
+		}
+	}
+
+	/**
+	 * @param partition
+	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.IRegion)
+	 */
+
+	public void reconcile(IRegion partition) {
+		IDocument document = getDocument();
+		if (document != null) {
+			IAnnotationModel annotationModel = getAnnotationModel();
+			if (annotationModel != null) {
+				spellCheck(partition, partition, annotationModel);
+			}
+		}
+	}
+
+	public void setDocument(IDocument document) {
+		if (getDocument() != null) {
+			EditorsUI.getPreferenceStore().removePropertyChangeListener(fSpellCheckPreferenceListener);
+		}
+
+		super.setDocument(document);
+
+		if (getDocument() != null) {
+			EditorsUI.getPreferenceStore().addPropertyChangeListener(fSpellCheckPreferenceListener);
+		}
+	}
+	
+	/**
+	 * Decides if the given offset should be spell-checked using an <code>IAdapterFactory</code>
+	 * 
+	 * @param offset Decide if this offset should be spell-checked
+	 * @return <code>true</code> if the given <code>offset</code> should be spell-checked,
+	 * <code>false</code> otherwise.
+	 */
+	private boolean shouldSpellcheck(int offset) {
+		boolean decision = true;
+		
+		IStructuredModel model = null;
+		try {
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			
+			/* use an an adapter factory to get a spell-check decision maker,
+			 * and ask it if the  offset should be spell-checked.  It is done
+			 * this way so content type specific decisions can be made without this
+			 * plugin being aware of any content type specifics.
+			 */
+			ISpellcheckDelegate delegate = (ISpellcheckDelegate)Platform.getAdapterManager().getAdapter(model, ISpellcheckDelegate.class);
+			if(delegate != null) {
+				decision = delegate.shouldSpellcheck(offset, model);
+			}
+		}  finally {
+			if(model != null) {
+				model.releaseFromRead();
+			}
+		}
+		
+		return decision;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/SpellingQuickAssistProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/SpellingQuickAssistProcessor.java
new file mode 100644
index 0000000..f8e4ddd
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/spelling/SpellingQuickAssistProcessor.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.spelling;
+
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.ui.texteditor.spelling.SpellingProblem;
+
+/**
+ * Spelling correction processor used to show quick fixes for spelling
+ * problems.
+ * 
+ * @since 2.0
+ */
+class SpellingQuickAssistProcessor implements IQuickAssistProcessor {
+	private SpellingProblem fSpellingProblem = null;
+
+	public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
+		return false;
+	}
+
+	public boolean canFix(Annotation annotation) {
+		return !annotation.isMarkedDeleted();
+	}
+
+	public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext quickAssistContext) {
+		ICompletionProposal[] proposals = null;
+
+		if (fSpellingProblem != null) {
+			proposals = fSpellingProblem.getProposals(quickAssistContext);
+		}
+		return proposals;
+	}
+
+	public String getErrorMessage() {
+		return null;
+	}
+
+	void setSpellingProblem(SpellingProblem spellingProblem) {
+		fSpellingProblem = spellingProblem;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingManager.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingManager.java
new file mode 100644
index 0000000..a7140f5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingManager.java
@@ -0,0 +1,740 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.style;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.ISemanticHighlighting;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper;
+import org.eclipse.wst.sse.ui.internal.provisional.style.StructuredPresentationReconciler;
+import org.eclipse.wst.sse.ui.internal.reconcile.DocumentRegionProcessor;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+
+/**
+ * Semantic highlighting manager. Responsible for maintaining the semantic highlightings
+ * and the associated styles. Semantic highlighting preference changes are handled
+ * through listeners in this class. Based on org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingManager
+ * 
+ * @since 3.1
+ */
+public class SemanticHighlightingManager implements IPropertyChangeListener {
+	
+	/**
+	 * HighlightingStyle.
+	 */
+	static class HighlightingStyle {
+
+		/** Text attribute */
+		private TextAttribute fTextAttribute;
+		/** Enabled state */
+		private boolean fIsEnabled;
+
+		/**
+		 * Initialize with the given text attribute.
+		 * @param textAttribute The text attribute
+		 * @param isEnabled the enabled state
+		 */
+		public HighlightingStyle(TextAttribute textAttribute, boolean isEnabled) {
+			setTextAttribute(textAttribute);
+			setEnabled(isEnabled);
+		}
+
+		/**
+		 * @return Returns the text attribute.
+		 */
+		public TextAttribute getTextAttribute() {
+			return fTextAttribute;
+		}
+
+		/**
+		 * @param textAttribute The background to set.
+		 */
+		public void setTextAttribute(TextAttribute textAttribute) {
+			fTextAttribute = textAttribute;
+		}
+
+		/**
+		 * @return the enabled state
+		 */
+		public boolean isEnabled() {
+			return fIsEnabled;
+		}
+
+		/**
+		 * @param isEnabled the new enabled state
+		 */
+		public void setEnabled(boolean isEnabled) {
+			fIsEnabled = isEnabled;
+		}
+	}
+	
+	/**
+	 * Highlighted Positions.
+	 */
+	static class HighlightedPosition extends Position {
+
+		/** Highlighting of the position */
+		private HighlightingStyle fStyle;
+
+		private boolean fReadOnly;
+
+		/** Lock object */
+		private Object fLock;
+
+		/**
+		 * Initialize the styled positions with the given offset, length and foreground color.
+		 *
+		 * @param offset The position offset
+		 * @param length The position length
+		 * @param highlighting The position's highlighting
+		 * @param lock The lock object
+		 */
+		public HighlightedPosition(int offset, int length, HighlightingStyle highlighting, Object lock, boolean isReadOnly) {
+			super(offset, length);
+			fStyle = highlighting;
+			fLock = lock;
+			fReadOnly = isReadOnly;
+		}
+
+		public HighlightedPosition(int offset, int length, HighlightingStyle highlighting, Object lock) {
+			this(offset, length, highlighting, lock, false);
+		}
+
+		public HighlightedPosition(Position position, HighlightingStyle highlighting, Object lock) {
+			this(position.offset, position.length, highlighting, lock, false);
+		}
+
+		public HighlightedPosition(Position position, HighlightingStyle highlighting, Object lock, boolean isReadOnly) {
+			this(position.offset, position.length, highlighting, lock, isReadOnly);
+		}
+
+		/**
+		 * @return Returns a corresponding style range.
+		 */
+		public StyleRange createStyleRange() {
+			int len= 0;
+			if (fStyle.isEnabled())
+				len= getLength();
+
+			TextAttribute textAttribute = fStyle.getTextAttribute();
+			int style = textAttribute.getStyle();
+			int fontStyle = style & (SWT.ITALIC | SWT.BOLD | SWT.NORMAL);
+			StyleRange styleRange = new StyleRange(getOffset(), len, textAttribute.getForeground(), textAttribute.getBackground(), fontStyle);
+			styleRange.strikeout = (style & TextAttribute.STRIKETHROUGH) != 0;
+			styleRange.underline = (style & TextAttribute.UNDERLINE) != 0;
+
+			return styleRange;
+		}
+
+		/**
+		 * Uses reference equality for the highlighting.
+		 *
+		 * @param off The offset
+		 * @param len The length
+		 * @param highlighting The highlighting
+		 * @return <code>true</code> iff the given offset, length and highlighting are equal to the internal ones.
+		 */
+		public boolean isEqual(int off, int len, HighlightingStyle highlighting) {
+			synchronized (fLock) {
+				return !isDeleted() && getOffset() == off && getLength() == len && fStyle == highlighting;
+			}
+		}
+		
+		/**
+		 * Uses reference equality for the highlighting.
+		 *
+		 * @param pos The position
+		 * @param highlighting The highlighting
+		 * @return <code>true</code> iff the given offset, length and highlighting are equal to the internal ones.
+		 */
+		public boolean isEqual(Position pos, HighlightingStyle highlighting) {
+			synchronized (fLock) {
+				return !isDeleted() && getOffset() == pos.getOffset() && getLength() == pos.getLength() && fStyle == highlighting;
+			}
+		}
+
+		/**
+		 * Is this position contained in the given range (inclusive)? Synchronizes on position updater.
+		 *
+		 * @param off The range offset
+		 * @param len The range length
+		 * @return <code>true</code> iff this position is not delete and contained in the given range.
+		 */
+		public boolean isContained(int off, int len) {
+			synchronized (fLock) {
+				return !isDeleted() && off <= getOffset() && off + len >= getOffset() + getLength();
+			}
+		}
+
+		public void update(int off, int len) {
+			synchronized (fLock) {
+				super.setOffset(off);
+				super.setLength(len);
+			}
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.Position#setLength(int)
+		 */
+		public void setLength(int length) {
+			synchronized (fLock) {
+				super.setLength(length);
+			}
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.Position#setOffset(int)
+		 */
+		public void setOffset(int offset) {
+			synchronized (fLock) {
+				super.setOffset(offset);
+			}
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.Position#delete()
+		 */
+		public void delete() {
+			synchronized (fLock) {
+				super.delete();
+			}
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.Position#undelete()
+		 */
+		public void undelete() {
+			synchronized (fLock) {
+				super.undelete();
+			}
+		}
+
+		/**
+		 * @return Returns the highlighting.
+		 */
+		public HighlightingStyle getHighlighting() {
+			return fStyle;
+		}
+
+		public boolean isReadOnly() {
+			return fReadOnly;
+		}
+	}
+
+	/**
+	 * Highlighted ranges.
+	 */
+	public static class HighlightedRange extends Region {
+		/** The highlighting key as returned by {@link ISemanticHighlighting#getPreferenceKey()}. */
+		private String fKey;
+
+		/**
+		 * Initialize with the given offset, length and highlighting key.
+		 *
+		 * @param offset
+		 * @param length
+		 * @param key the highlighting key as returned by {@link ISemanticHighlighting#getPreferenceKey()}
+		 */
+		public HighlightedRange(int offset, int length, String key) {
+			super(offset, length);
+			fKey = key;
+		}
+
+		/**
+		 * @return the highlighting key as returned by {@link ISemanticHighlighting#getPreferenceKey()}
+		 */
+		public String getKey() {
+			return fKey;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.Region#equals(java.lang.Object)
+		 */
+		public boolean equals(Object o) {
+			return super.equals(o) && o instanceof HighlightedRange && fKey.equals(((HighlightedRange)o).getKey());
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.Region#hashCode()
+		 */
+		public int hashCode() {
+			return super.hashCode() | fKey.hashCode();
+		}
+	}
+	
+	private static final String SEMANTIC_HIGHLIGHTING_EXTENSION_POINT = "semanticHighlighting"; //$NON-NLS-1$
+	private static final String TARGET_ATTR = "target"; //$NON-NLS-1$
+	private static final String CLASS_ATTR = "class"; //$NON-NLS-1$
+	private static final String STYLE_KEY_ATTR = "styleStringKey"; //$NON-NLS-1$
+
+	private ISourceViewer fSourceViewer;
+	private IPreferenceStore fPreferenceStore;
+	private SourceViewerConfiguration fConfiguration;
+	private StructuredPresentationReconciler fPresentationReconciler;
+	private String fContentTypeId;
+	
+	private SemanticHighlightingPresenter fPresenter;
+	private SemanticHighlightingReconciler fReconciler;
+	
+	/** The semantic highlightings for the content type */
+	private ISemanticHighlighting[] fHighlightings;
+	/** The semantic highlighting styles associated with the semantic highlightings */
+	private HighlightingStyle[] fHighlightingStyles;
+	/** The semantic highlighting style string preference keys. null of the highlighting doesn't support it */
+	private String[] fHighlightingStyleStringKeys;
+	
+	private IPropertyChangeListener fHighlightingChangeListener = new IPropertyChangeListener() {
+
+		public void propertyChange(PropertyChangeEvent event) {
+				handleHighlightingPropertyChange(event);
+		}
+	};
+	
+	public void propertyChange(PropertyChangeEvent event) {
+		handlePropertyChange(event);
+	}
+	
+	public void install(ISourceViewer sourceViewer, IPreferenceStore preferenceStore, SourceViewerConfiguration configuration, String contentTypeId) {
+		fSourceViewer = sourceViewer;
+		fPreferenceStore = preferenceStore;
+		fConfiguration = configuration;
+		fContentTypeId = contentTypeId;
+		
+		fPreferenceStore.addPropertyChangeListener(this);
+		fPresentationReconciler = (StructuredPresentationReconciler) fConfiguration.getPresentationReconciler(fSourceViewer);
+		
+		if (isEnabled()) {
+			enable();
+		}
+	}
+	
+	/**
+	 * Load the semantic highlightings defined for this content type.
+	 */
+	private void loadSemanticHighlightings() {
+		List semantics = new ArrayList(0);
+		
+		ISemanticHighlighting highlighting = null;
+		String styleKey = null;
+		IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(SSEUIPlugin.ID, SEMANTIC_HIGHLIGHTING_EXTENSION_POINT);
+		
+		IContentType contentType = Platform.getContentTypeManager().getContentType(fContentTypeId);
+		
+		for (int i = 0; i < elements.length; i++) {
+			String[] targets = StringUtils.unpack(elements[i].getAttribute(TARGET_ATTR));
+			for (int j = 0; j < targets.length; j++) {
+				IContentType targetContentType = Platform.getContentTypeManager().getContentType(targets[j]);
+				/* Apply semantic highlighting to kinds of targetContentType */
+				if (contentType.isKindOf(targetContentType)) {
+					try {
+						highlighting = (ISemanticHighlighting) elements[i].createExecutableExtension(CLASS_ATTR);
+						styleKey = elements[i].getAttribute(STYLE_KEY_ATTR);
+					} catch (CoreException e) {
+						Logger.logException(e);
+					}
+					if (highlighting != null)
+						semantics.add(new SemanticContent(targetContentType, highlighting, styleKey));
+
+					break;
+				}
+			}
+		}
+		/* Sort the semantics, so that styles will be applied from general to specific */
+		Collections.sort(semantics);
+		fHighlightings = new ISemanticHighlighting[semantics.size()];
+		fHighlightingStyles = new HighlightingStyle[semantics.size()];
+		fHighlightingStyleStringKeys = new String[semantics.size()];
+
+		for (int i = 0; i < semantics.size(); i++) {
+			fHighlightings[i] = ((SemanticContent) semantics.get(i)).getHighlighting();
+			styleKey = ((SemanticContent) semantics.get(i)).getStyleKey();
+			fHighlightingStyles[i] = createHighlightingStyle(((SemanticContent) semantics.get(i)).getHighlighting(), styleKey);
+			fHighlightingStyleStringKeys[i] = styleKey;
+		}
+	}
+	
+	/**
+	 * This class is used for relating a semantic highlighting to a content type.
+	 * The content type is used in the sorting algorithm. Content types that are more specific
+	 * to the file's content type will cause styles to be applied from general to specific
+	 */
+	private class SemanticContent implements Comparable {
+		public IContentType type;
+		public ISemanticHighlighting highlighting;
+		public String styleKey;
+
+		public SemanticContent(IContentType type, ISemanticHighlighting highlighting, String styleKey) {
+			this.type = type;
+			this.highlighting = highlighting;
+			this.styleKey = styleKey;
+		}
+
+		public int compareTo(Object arg0) {
+			SemanticContent other = (SemanticContent) arg0;
+			/* Equal weighting for the same types */
+			if (this.type.equals(other.type))
+				return 0;
+			/* Subtypes have more weight than base types */
+			if (this.type.isKindOf(other.type))
+				return 1;
+			return -1;
+		}
+		
+		public ISemanticHighlighting getHighlighting() {
+			return highlighting;
+		}
+
+		public String getStyleKey() {
+			return styleKey;
+		}
+	}
+	
+	/**
+	 * Creates a highlighting style based on the preferences defined in the semantic highlighting
+	 * @param highlighting the semantic highlighting
+	 * @return a highlighting style based on the preferences of the semantic highlighting
+	 */
+	private HighlightingStyle createHighlightingStyle(ISemanticHighlighting highlighting, String styleKey) {
+		IPreferenceStore store = highlighting.getPreferenceStore();
+		HighlightingStyle highlightingStyle = null;
+		if (store != null) {
+			TextAttribute attribute = null;
+			// A style string is used instead of separate attribute keys
+			if (styleKey != null) {
+				attribute = createTextAttribute(store.getString(styleKey));
+			}
+			else {
+				int style = getBoolean(store, highlighting.getBoldPreferenceKey()) ? SWT.BOLD : SWT.NORMAL;
+				
+				if (getBoolean(store, highlighting.getItalicPreferenceKey()))
+					style |= SWT.ITALIC;
+				if (getBoolean(store, highlighting.getStrikethroughPreferenceKey()))
+					style |= TextAttribute.STRIKETHROUGH;
+				if (getBoolean(store, highlighting.getUnderlinePreferenceKey()))
+					style |= TextAttribute.UNDERLINE;
+
+				String rgbString = getString(store, highlighting.getColorPreferenceKey());
+				Color color = null;
+				
+				if (rgbString != null)
+					color = EditorUtility.getColor(ColorHelper.toRGB(rgbString));
+				attribute = new TextAttribute(color, null, style);
+			}
+
+			store.addPropertyChangeListener(fHighlightingChangeListener);
+			boolean isEnabled = getBoolean(store, highlighting.getEnabledPreferenceKey());
+			highlightingStyle = new HighlightingStyle(attribute, isEnabled);
+		}
+		return highlightingStyle;
+	}
+
+	/**
+	 * Creates a text attribute from the style string
+	 * 
+	 * @param styleValue style string in the form: <code>RGB foreground (#rrggbb) | RGB background (#rrggbb) | bold (true/false) | italic (true/false) | strikethrough (true/false) | underline (true/false)</code>
+	 * @return text attribute created from the <code>styleValue</code> or null if the <code>styleValue</code> is invalid
+	 */
+	private TextAttribute createTextAttribute(String styleValue) {
+		String[] values = ColorHelper.unpackStylePreferences(styleValue);
+		if (values.length < 6)
+			return null;
+
+		RGB foreground = ColorHelper.toRGB(values[0]);
+		RGB background = ColorHelper.toRGB(values[1]);
+		boolean bold = Boolean.valueOf(values[2]).booleanValue();
+		boolean italic = Boolean.valueOf(values[3]).booleanValue();
+		boolean strikethrough = Boolean.valueOf(values[4]).booleanValue();
+		boolean underline = Boolean.valueOf(values[5]).booleanValue();
+
+		int style = SWT.NORMAL;
+		if (bold)
+			style = style | SWT.BOLD;
+		if (italic)
+			style = style | SWT.ITALIC;
+		if (strikethrough)
+			style = style | TextAttribute.STRIKETHROUGH;
+		if (underline)
+			style = style | TextAttribute.UNDERLINE;
+
+		return createTextAttribute(foreground, background, style);
+	}
+
+	private TextAttribute createTextAttribute(RGB foreground, RGB background, int style) {
+		return new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, style);
+	}
+
+	/**
+	 * Looks up a boolean preference by <code>key</code> from the preference store
+	 * @param store the preference store to lookup the preference from
+	 * @param key the key the preference is stored under
+	 * @return the preference value from the preference store iff key is not null
+	 */
+	private boolean getBoolean(IPreferenceStore store, String key) {
+		return (key == null) ? false : store.getBoolean(key);
+	}
+	
+	/**
+	 * Looks up a String preference by <code>key</code> from the preference store
+	 * @param store the preference store to lookup the preference from
+	 * @param key the key the preference is stored under
+	 * @return the preference value from the preference store iff key is not null
+	 */
+	private String getString(IPreferenceStore store, String key) {
+		return (key == null) ? null : store.getString(key);
+	}
+
+	/**
+	 * Enable semantic highlighting.
+	 */
+	private void enable() {
+		
+		loadSemanticHighlightings();
+		
+		fPresenter = new SemanticHighlightingPresenter();
+		fPresenter.install(fSourceViewer, fPresentationReconciler);
+//		if (fEditor != null) {
+			fReconciler = new SemanticHighlightingReconciler();
+			fReconciler.install(fSourceViewer, fPresenter, fHighlightings, fHighlightingStyles);
+			IReconciler reconciler = fConfiguration.getReconciler(fSourceViewer);
+			if (reconciler instanceof DocumentRegionProcessor)
+				((DocumentRegionProcessor) reconciler).setSemanticHighlightingStrategy(fReconciler);
+//		} else {
+//			fPresenter.updatePresentation(null, createHardcodedPositions(), new HighlightedPosition[0]);
+//		}
+	}
+	
+	/**
+	 * Disable semantic highlighting
+	 */
+	private void disable() {
+		if (fReconciler != null) {
+			fReconciler.uninstall();
+			fReconciler = null;
+		}
+		
+		if (fPresenter != null) {
+			fPresenter.uninstall();
+			fPresenter = null;
+		}
+		
+		if (fHighlightings != null)
+			disposeHighlightings();
+	}
+	
+	private void disposeHighlightings() {
+		/* Remove the property change listener before clearing the lists */
+		if (fHighlightings != null) {
+			for (int i = 0; i < fHighlightings.length; i++) {
+				IPreferenceStore store = fHighlightings[i].getPreferenceStore();
+				if (store != null)
+					store.removePropertyChangeListener(fHighlightingChangeListener);
+			}
+		}
+		
+		fHighlightings = null;
+		fHighlightingStyles = null;
+		fHighlightingStyleStringKeys = null;
+	}
+	
+	/**
+	 * Handles property change events for individual semantic highlightings.
+	 * @param event
+	 */
+	private void handleHighlightingPropertyChange(PropertyChangeEvent event) {
+		String property = event.getProperty();
+		if (property == null)
+			return;
+		
+		boolean refreshRequired = false;
+		
+		for (int i = 0; i < fHighlightings.length; i++) {
+			ISemanticHighlighting highlighting = fHighlightings[i];
+
+			if (fHighlightingStyleStringKeys[i] != null) {
+				if (property.equals(fHighlightingStyleStringKeys[i])) {
+					adaptToStyleChange(fHighlightingStyles[i], event);
+					fPresenter.highlightingStyleChanged(fHighlightingStyles[i]);
+					refreshRequired = true;
+					continue;
+				}
+			}
+
+			if (property.equals(highlighting.getBoldPreferenceKey())) {
+				adaptToTextStyleChange(fHighlightingStyles[i], event, SWT.BOLD);
+				fPresenter.highlightingStyleChanged(fHighlightingStyles[i]);
+				refreshRequired = true;
+				continue;
+			}
+			
+			if (property.equals(highlighting.getColorPreferenceKey())) {
+				adaptToTextForegroundChange(fHighlightingStyles[i], event);
+				fPresenter.highlightingStyleChanged(fHighlightingStyles[i]);
+				refreshRequired = true;
+				continue;
+			}
+			
+			if (property.equals(highlighting.getEnabledPreferenceKey())) {
+				adaptToEnablementChange(fHighlightingStyles[i], event);
+				fPresenter.highlightingStyleChanged(fHighlightingStyles[i]);
+				refreshRequired = true;
+				continue;
+			}
+			
+			if (property.equals(highlighting.getItalicPreferenceKey())) {
+				adaptToTextStyleChange(fHighlightingStyles[i], event, SWT.ITALIC);
+				fPresenter.highlightingStyleChanged(fHighlightingStyles[i]);
+				refreshRequired = true;
+				continue;
+			}
+			
+			if (property.equals(highlighting.getStrikethroughPreferenceKey())) {
+				adaptToTextStyleChange(fHighlightingStyles[i], event, TextAttribute.STRIKETHROUGH);
+				fPresenter.highlightingStyleChanged(fHighlightingStyles[i]);
+				refreshRequired = true;
+				continue;
+			}
+			
+			if (property.equals(highlighting.getUnderlinePreferenceKey())) {
+				adaptToTextStyleChange(fHighlightingStyles[i], event, TextAttribute.UNDERLINE);
+				fPresenter.highlightingStyleChanged(fHighlightingStyles[i]);
+				refreshRequired = true;
+				continue;
+			}
+		}
+		
+		if (refreshRequired && fReconciler != null)
+			fReconciler.refresh();
+	}
+	
+	/**
+	 * Handles property changes for enabling and disabling semantic highlighting for
+	 * Structured Source Editors
+	 * @param event
+	 */
+	private void handlePropertyChange(PropertyChangeEvent event) {
+		String property = event.getProperty();
+		if (property == null || !property.equals(EditorPreferenceNames.SEMANTIC_HIGHLIGHTING))
+			return;
+		
+		Object newValue = event.getNewValue();
+		if (newValue instanceof Boolean) {
+			if (((Boolean) newValue).booleanValue())
+				enable();
+			else
+				disable();
+		}
+		
+		if (fReconciler != null)
+			fReconciler.refresh();
+	}
+	
+	private void adaptToEnablementChange(HighlightingStyle highlighting, PropertyChangeEvent event) {
+		Object value = event.getNewValue();
+		boolean eventValue;
+		if (value instanceof Boolean)
+			eventValue = ((Boolean) value).booleanValue();
+		else if (IPreferenceStore.TRUE.equals(value))
+			eventValue = true;
+		else
+			eventValue = false;
+		highlighting.setEnabled(eventValue);
+	}
+
+	private void adaptToTextForegroundChange(HighlightingStyle highlighting, PropertyChangeEvent event) {
+		RGB rgb = null;
+
+		Object value = event.getNewValue();
+		if (value instanceof RGB)
+			rgb= (RGB) value;
+		else if (value instanceof String)
+			rgb= ColorHelper.toRGB( (String) value);
+
+		if (rgb != null) {
+			Color color= EditorUtility.getColor(rgb);
+			TextAttribute oldAttr= highlighting.getTextAttribute();
+			highlighting.setTextAttribute(new TextAttribute(color, oldAttr.getBackground(), oldAttr.getStyle()));
+		}
+	}
+	
+	private void adaptToTextStyleChange(HighlightingStyle highlighting, PropertyChangeEvent event, int styleAttribute) {
+		boolean eventValue = false;
+		Object value = event.getNewValue();
+		if (value instanceof Boolean)
+			eventValue = ((Boolean) value).booleanValue();
+		else if (IPreferenceStore.TRUE.equals(value))
+			eventValue = true;
+
+		TextAttribute oldAttr = highlighting.getTextAttribute();
+		boolean activeValue = (oldAttr.getStyle() & styleAttribute) == styleAttribute;
+
+		if (activeValue != eventValue)
+			highlighting.setTextAttribute(new TextAttribute(oldAttr.getForeground(), oldAttr.getBackground(), eventValue ? oldAttr.getStyle() | styleAttribute : oldAttr.getStyle() & ~styleAttribute));
+	}
+
+	/**
+	 * Adapts to a style string change
+	 * 
+	 * @param highlighting the highlighting style to update
+	 * @param event the event that triggered the change
+	 */
+	private void adaptToStyleChange(HighlightingStyle highlighting, PropertyChangeEvent event) {
+		Object value = event.getNewValue();
+		if (value instanceof String) {
+			TextAttribute attr = createTextAttribute((String) value);
+			if (attr != null)
+				highlighting.setTextAttribute(attr);
+		}
+	}
+
+	/**
+	 * @return <code>true</code> iff semantic highlighting is enabled in the preferences
+	 */
+	private boolean isEnabled() {
+		return (fPreferenceStore != null) ? fPreferenceStore.getBoolean(EditorPreferenceNames.SEMANTIC_HIGHLIGHTING) : false;
+	}
+	
+	public void uninstall() {
+		disable();
+		
+		if (fPreferenceStore != null) {
+			fPreferenceStore.removePropertyChangeListener(this);
+			fPreferenceStore = null;
+		}
+		
+		fSourceViewer = null;
+		fConfiguration = null;
+		fPresentationReconciler = null;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingPresenter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingPresenter.java
new file mode 100644
index 0000000..093ec05
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingPresenter.java
@@ -0,0 +1,1067 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.style;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IPositionUpdater;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ISynchronizable;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextPresentationListener;
+import org.eclipse.jface.text.ITextViewerExtension2;
+import org.eclipse.jface.text.ITextViewerExtension4;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.provisional.style.StructuredPresentationReconciler;
+import org.eclipse.wst.sse.ui.internal.style.SemanticHighlightingManager.HighlightedPosition;
+import org.eclipse.wst.sse.ui.internal.style.SemanticHighlightingManager.HighlightingStyle;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+
+/**
+ * Semantic highlighting presenter - UI thread implementation.  Based on 
+ * org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingPresenter
+ *
+ * @since 3.1
+ */
+public class SemanticHighlightingPresenter implements ITextPresentationListener, ITextInputListener, IDocumentListener {
+
+	/**
+	 * Semantic highlighting position updater.
+	 */
+	private class HighlightingPositionUpdater implements IPositionUpdater {
+
+		/** The position category. */
+		private final String fCategory;
+
+		/**
+		 * Creates a new updater for the given <code>category</code>.
+		 *
+		 * @param category the new category.
+		 */
+		public HighlightingPositionUpdater(String category) {
+			fCategory= category;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IPositionUpdater#update(org.eclipse.jface.text.DocumentEvent)
+		 */
+		public void update(DocumentEvent event) {
+
+			int eventOffset= event.getOffset();
+			int eventOldLength= event.getLength();
+			int eventEnd= eventOffset + eventOldLength;
+
+			try {
+				Position[] positions= event.getDocument().getPositions(fCategory);
+
+				for (int i= 0; i != positions.length; i++) {
+
+					HighlightedPosition position= (HighlightedPosition) positions[i];
+
+					// Also update deleted positions because they get deleted by the background thread and removed/invalidated only in the UI runnable
+//					if (position.isDeleted())
+//						continue;
+
+					int offset= position.getOffset();
+					int length= position.getLength();
+					int end= offset + length;
+
+					if (offset > eventEnd)
+						updateWithPrecedingEvent(position, event);
+					else if (end < eventOffset) {
+						// do nothing
+						// updateWithSucceedingEvent(position, event);
+					}
+					else if (offset <= eventOffset && end >= eventEnd) {
+						 // Previous region updated to overlap the beginning of this one; just bump the start.
+						if (i > 0 && positions[i - 1].offset + positions[i - 1].length > offset)
+							updateWithPrecedingEvent(position, event);
+						else
+							updateWithIncludedEvent(position, event);
+					}
+					else if (offset <= eventOffset)
+						updateWithOverEndEvent(position, event);
+					else if (end >= eventEnd)
+						updateWithOverStartEvent(position, event);
+					else
+						updateWithIncludingEvent(position, event);
+				}
+			} catch (BadPositionCategoryException e) {
+				// ignore and return
+			}
+		}
+
+		/**
+		 * Update the given position with the given event. The event precedes the position.
+		 *
+		 * @param position The position
+		 * @param event The event
+		 */
+		private void updateWithPrecedingEvent(HighlightedPosition position, DocumentEvent event) {
+			String newText= event.getText();
+			int eventNewLength= newText != null ? newText.length() : 0;
+			int deltaLength= eventNewLength - event.getLength();
+
+			position.setOffset(position.getOffset() + deltaLength);
+		}
+
+		/**
+		 * Update the given position with the given event. The event succeeds the position.
+		 *
+		 * @param position The position
+		 * @param event The event
+		 */
+//		private void updateWithSucceedingEvent(HighlightedPosition position, DocumentEvent event) {
+//		}
+
+		/**
+		 * Update the given position with the given event. The event is included by the position.
+		 *
+		 * @param position The position
+		 * @param event The event
+		 */
+		private void updateWithIncludedEvent(HighlightedPosition position, DocumentEvent event) {
+			int eventOffset= event.getOffset();
+			String newText= event.getText();
+			if (newText == null)
+				newText= ""; //$NON-NLS-1$
+			int eventNewLength= newText.length();
+
+			int deltaLength= eventNewLength - event.getLength();
+
+			int offset= position.getOffset();
+			int length= position.getLength();
+			int end= offset + length;
+
+			int includedLength= 0;
+			while (includedLength < eventNewLength && !Character.isWhitespace(newText.charAt(includedLength)))
+				includedLength++;
+			if (includedLength == eventNewLength)
+				position.setLength(length + deltaLength);
+			else {
+				int newLeftLength= eventOffset - offset + includedLength;
+
+				int excludedLength= eventNewLength;
+				while (excludedLength > 0 && !Character.isWhitespace(newText.charAt(excludedLength - 1)))
+					excludedLength--;
+				int newRightOffset= eventOffset + excludedLength;
+				int newRightLength= end + deltaLength - newRightOffset;
+
+				if (newRightLength == 0) {
+					position.setLength(newLeftLength);
+				} else {
+					if (newLeftLength == 0) {
+						position.update(newRightOffset, newRightLength);
+					} else {
+						position.setLength(newLeftLength);
+						addPositionFromUI(position);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Update the given position with the given event. The event overlaps with the end of the position.
+		 *
+		 * @param position The position
+		 * @param event The event
+		 */
+		private void updateWithOverEndEvent(HighlightedPosition position, DocumentEvent event) {
+			String newText= event.getText();
+			if (newText == null)
+				newText= ""; //$NON-NLS-1$
+			int eventNewLength= newText.length();
+
+			int includedLength= 0;
+			while (includedLength < eventNewLength && !Character.isWhitespace(newText.charAt(includedLength)))
+				includedLength++;
+			position.setLength(event.getOffset() - position.getOffset() + includedLength);
+		}
+
+		/**
+		 * Update the given position with the given event. The event overlaps with the start of the position.
+		 *
+		 * @param position The position
+		 * @param event The event
+		 */
+		private void updateWithOverStartEvent(HighlightedPosition position, DocumentEvent event) {
+			int eventOffset= event.getOffset();
+			int eventEnd= eventOffset + event.getLength();
+
+			String newText= event.getText();
+			if (newText == null)
+				newText= ""; //$NON-NLS-1$
+			int eventNewLength= newText.length();
+
+			int excludedLength= eventNewLength;
+			while (excludedLength > 0 && !Character.isWhitespace(newText.charAt(excludedLength - 1)))
+				excludedLength--;
+			int deleted= eventEnd - position.getOffset();
+			int inserted= eventNewLength - excludedLength;
+			position.update(eventOffset + excludedLength, position.getLength() - deleted + inserted);
+		}
+
+		/**
+		 * Update the given position with the given event. The event includes the position.
+		 *
+		 * @param position The position
+		 * @param event The event
+		 */
+		private void updateWithIncludingEvent(HighlightedPosition position, DocumentEvent event) {
+			position.delete();
+			position.update(event.getOffset(), 0);
+		}
+	}
+
+	/** Position updater */
+	private IPositionUpdater fPositionUpdater= new HighlightingPositionUpdater(getPositionCategory());
+
+	/** The source viewer this semantic highlighting reconciler is installed on */
+	private ISourceViewer fSourceViewer;
+	/** The background presentation reconciler */
+	private StructuredPresentationReconciler fPresentationReconciler;
+
+	/** UI's current highlighted positions - can contain <code>null</code> elements */
+	private List fPositions= new ArrayList();
+	/** UI position lock */
+	private Object fPositionLock= new Object();
+
+	/** <code>true</code> iff the current reconcile is canceled. */
+	private boolean fIsCanceled= false;
+
+	/** Read-only color support */
+	private YUV_RGBConverter rgbConverter;
+	private Map readOnlyColorTable;
+	double readOnlyForegroundScaleFactor = 30;
+	
+	public SemanticHighlightingPresenter() {
+		// no listener for now since there's no UI to change the value
+		IPreferenceStore editorStore = SSEUIPlugin.getDefault().getPreferenceStore();
+		readOnlyForegroundScaleFactor = editorStore.getInt(EditorPreferenceNames.READ_ONLY_FOREGROUND_SCALE);
+	}
+
+	/**
+	 * Creates and returns a new highlighted position with the given offset, length and highlighting.
+	 * <p>
+	 * NOTE: Also called from background thread.
+	 * </p>
+	 *
+	 * @param offset The offset
+	 * @param length The length
+	 * @param highlighting The highlighting
+	 * @return The new highlighted position
+	 */
+	public HighlightedPosition createHighlightedPosition(int offset, int length, HighlightingStyle highlighting) {
+		// TODO: reuse deleted positions
+		return new HighlightedPosition(offset, length, highlighting, fPositionUpdater);
+	}
+	
+	/**
+	 * Creates and returns a new highlighted position from the given position and highlighting.
+	 * <p>
+	 * NOTE: Also called from background thread.
+	 * </p>
+	 *
+	 * @param position The position
+	 * @param highlighting The highlighting
+	 * @return The new highlighted position
+	 */
+	public HighlightedPosition createHighlightedPosition(Position position, HighlightingStyle highlighting) {
+		// TODO: reuse deleted positions
+		return new HighlightedPosition(position, highlighting, fPositionUpdater);
+	}
+
+	/**
+	 * Creates and returns a new highlighted position from the given position and highlighting.
+	 * <p>
+	 * NOTE: Also called from background thread.
+	 * </p>
+	 *
+	 * @param position The position
+	 * @param highlighting The highlighting
+	 * @param isReadOnly Is this a read-only position
+	 * @return The new highlighted position
+	 */
+	public HighlightedPosition createHighlightedPosition(Position position, HighlightingStyle highlighting, boolean isReadOnly) {
+		// TODO: reuse deleted positions
+		return new HighlightedPosition(position, highlighting, fPositionUpdater, isReadOnly);
+	}
+
+	/**
+	 * Adds all current positions to the given list.
+	 * <p>
+	 * NOTE: Called from background thread.
+	 * </p>
+	 *
+	 * @param list The list
+	 */
+	public void addAllPositions(List list) {
+		synchronized (fPositionLock) {
+			list.addAll(fPositions);
+		}
+	}
+
+	/**
+	 * Create a text presentation in the background.
+	 * <p>
+	 * NOTE: Called from background thread.
+	 * </p>
+	 *
+	 * @param addedPositions the added positions
+	 * @param removedPositions the removed positions
+	 * @return the text presentation or <code>null</code>, if reconciliation should be canceled
+	 */
+	public TextPresentation createPresentation(List addedPositions, List removedPositions) {
+		ISourceViewer sourceViewer= fSourceViewer;
+		StructuredPresentationReconciler presentationReconciler= fPresentationReconciler;
+		if (sourceViewer == null || presentationReconciler == null)
+			return null;
+
+		if (isCanceled())
+			return null;
+
+		IDocument document= sourceViewer.getDocument();
+		if (document == null)
+			return null;
+
+		int minStart= Integer.MAX_VALUE;
+		int maxEnd= Integer.MIN_VALUE;
+		for (int i= 0, n= removedPositions.size(); i < n; i++) {
+			Position position= (Position) removedPositions.get(i);
+			int offset= position.getOffset();
+			minStart= Math.min(minStart, offset);
+			maxEnd= Math.max(maxEnd, offset + position.getLength());
+		}
+		for (int i= 0, n= addedPositions.size(); i < n; i++) {
+			Position position= (Position) addedPositions.get(i);
+			int offset= position.getOffset();
+			minStart= Math.min(minStart, offset);
+			maxEnd= Math.max(maxEnd, offset + position.getLength());
+		}
+
+		if (minStart < maxEnd)
+			try {
+				return presentationReconciler.createRepairDescription(new Region(minStart, maxEnd - minStart), document);
+			} catch (RuntimeException e) {
+				// Assume concurrent modification from UI thread
+			}
+
+		return null;
+	}
+
+	/**
+	 * Create a runnable for updating the presentation.
+	 * <p>
+	 * NOTE: Called from background thread.
+	 * </p>
+	 * @param textPresentation the text presentation
+	 * @param addedPositions the added positions
+	 * @param removedPositions the removed positions
+	 * @return the runnable or <code>null</code>, if reconciliation should be canceled
+	 */
+	public Runnable createUpdateRunnable(final TextPresentation textPresentation, List addedPositions, List removedPositions) {
+		if (fSourceViewer == null || textPresentation == null)
+			return null;
+
+		// TODO: do clustering of positions and post multiple fast runnables
+		final HighlightedPosition[] added= new SemanticHighlightingManager.HighlightedPosition[addedPositions.size()];
+		addedPositions.toArray(added);
+		final SemanticHighlightingManager.HighlightedPosition[] removed= new SemanticHighlightingManager.HighlightedPosition[removedPositions.size()];
+		removedPositions.toArray(removed);
+
+		if (isCanceled())
+			return null;
+
+		Runnable runnable= new Runnable() {
+			public void run() {
+				updatePresentation(textPresentation, added, removed);
+			}
+		};
+		return runnable;
+	}
+
+	/**
+	 * Invalidate the presentation of the positions based on the given added positions and the existing deleted positions.
+	 * Also unregisters the deleted positions from the document and patches the positions of this presenter.
+	 * <p>
+	 * NOTE: Indirectly called from background thread by UI runnable.
+	 * </p>
+	 * @param textPresentation the text presentation or <code>null</code>, if the presentation should computed in the UI thread
+	 * @param addedPositions the added positions
+	 * @param removedPositions the removed positions
+	 */
+	public void updatePresentation(TextPresentation textPresentation, HighlightedPosition[] addedPositions, HighlightedPosition[] removedPositions) {
+		if (fSourceViewer == null)
+			return;
+
+//		checkOrdering("added positions: ", Arrays.asList(addedPositions)); //$NON-NLS-1$
+//		checkOrdering("removed positions: ", Arrays.asList(removedPositions)); //$NON-NLS-1$
+//		checkOrdering("old positions: ", fPositions); //$NON-NLS-1$
+
+		// TODO: double-check consistency with document.getPositions(...)
+		// TODO: reuse removed positions
+		if (isCanceled())
+			return;
+
+		IDocument document= fSourceViewer.getDocument();
+		if (document == null)
+			return;
+
+		String positionCategory= getPositionCategory();
+
+		List removedPositionsList= Arrays.asList(removedPositions);
+
+		try {
+			synchronized (fPositionLock) {
+				List oldPositions= fPositions;
+				int newSize= Math.max(fPositions.size() + addedPositions.length - removedPositions.length, 10);
+
+				/*
+				 * The following loop is a kind of merge sort: it merges two List<Position>, each
+				 * sorted by position.offset, into one new list. The first of the two is the
+				 * previous list of positions (oldPositions), from which any deleted positions get
+				 * removed on the fly. The second of two is the list of added positions. The result
+				 * is stored in newPositions.
+				 */
+				List newPositions= new ArrayList(newSize);
+				Position position= null;
+				Position addedPosition= null;
+				for (int i= 0, j= 0, n= oldPositions.size(), m= addedPositions.length; i < n || position != null || j < m || addedPosition != null;) {
+					// loop variant: i + j < old(i + j)
+
+					// a) find the next non-deleted Position from the old list
+					while (position == null && i < n) {
+						position= (Position) oldPositions.get(i++);
+						if (position.isDeleted() || contain(removedPositionsList, position)) {
+							document.removePosition(positionCategory, position);
+							position= null;
+						}
+					}
+
+					// b) find the next Position from the added list
+					if (addedPosition == null && j < m) {
+						addedPosition= addedPositions[j++];
+						document.addPosition(positionCategory, addedPosition);
+					}
+
+					// c) merge: add the next of position/addedPosition with the lower offset
+					if (position != null) {
+						if (addedPosition != null)
+							if (position.getOffset() <= addedPosition.getOffset()) {
+								newPositions.add(position);
+								position= null;
+							} else {
+								newPositions.add(addedPosition);
+								addedPosition= null;
+							}
+						else {
+							newPositions.add(position);
+							position= null;
+						}
+					} else if (addedPosition != null) {
+						newPositions.add(addedPosition);
+						addedPosition= null;
+					}
+				}
+				fPositions= newPositions;
+				Collections.sort(fPositions, new Comparator() {
+					
+					public int compare(Object arg0, Object arg1) {
+						Position p1 = (Position) arg0;
+						Position p2 = (Position) arg1;
+						return p1.offset - p2.offset;
+					}
+				});
+			}
+		} catch (BadPositionCategoryException e) {
+			// Should not happen
+			Logger.logException(e);
+		} catch (BadLocationException e) {
+			// Should not happen
+			Logger.logException(e);
+		}
+//		checkOrdering("new positions: ", fPositions); //$NON-NLS-1$
+
+		if (textPresentation != null)
+			fSourceViewer.changeTextPresentation(textPresentation, false);
+		else
+			fSourceViewer.invalidateTextPresentation();
+	}
+
+//	private void checkOrdering(String s, List positions) {
+//		Position previous= null;
+//		for (int i= 0, n= positions.size(); i < n; i++) {
+//			Position current= (Position) positions.get(i);
+//			if (previous != null && previous.getOffset() + previous.getLength() > current.getOffset())
+//				return;
+//		}
+//	}
+
+	/**
+	 * Returns <code>true</code> iff the positions contain the position.
+	 * @param positions the positions, must be ordered by offset but may overlap
+	 * @param position the position
+	 * @return <code>true</code> iff the positions contain the position
+	 */
+	private boolean contain(List positions, Position position) {
+		return indexOf(positions, position) != -1;
+	}
+
+	/**
+	 * Returns index of the position in the positions, <code>-1</code> if not found.
+	 * @param positions the positions, must be ordered by offset but may overlap
+	 * @param position the position
+	 * @return the index
+	 */
+	private int indexOf(List positions, Position position) {
+		int index= computeIndexAtOffset(positions, position.getOffset());
+		int size= positions.size();
+		while (index < size) {
+			if (positions.get(index) == position)
+				return index;
+			index++;
+		}
+		return -1;
+	}
+
+	/**
+	 * Insert the given position in <code>fPositions</code>, s.t. the offsets remain in linear order.
+	 *
+	 * @param position The position for insertion
+	 */
+	private void insertPosition(Position position) {
+		int i= computeIndexAfterOffset(fPositions, position.getOffset());
+		fPositions.add(i, position);
+	}
+
+	/**
+	 * Returns the index of the first position with an offset greater than the given offset.
+	 *
+	 * @param positions the positions, must be ordered by offset and must not overlap
+	 * @param offset the offset
+	 * @return the index of the last position with an offset greater than the given offset
+	 */
+	private int computeIndexAfterOffset(List positions, int offset) {
+		int i= -1;
+		int j= positions.size();
+		while (j - i > 1) {
+			int k= (i + j) >> 1;
+			Position position= (Position) positions.get(k);
+			if (position.getOffset() > offset)
+				j= k;
+			else
+				i= k;
+		}
+		return j;
+	}
+
+	/**
+	 * Returns the index of the first position with an offset equal or greater than the given offset.
+	 *
+	 * @param positions the positions, must be ordered by offset and must not overlap
+	 * @param offset the offset
+	 * @return the index of the last position with an offset equal or greater than the given offset
+	 */
+	private int computeIndexAtOffset(List positions, int offset) {
+		int i= -1;
+		int j= positions.size();
+		while (j - i > 1) {
+			int k= (i + j) >> 1;
+			Position position= (Position) positions.get(k);
+			if (position.getOffset() >= offset)
+				j= k;
+			else
+				i= k;
+		}
+		return j;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.ITextPresentationListener#applyTextPresentation(org.eclipse.jface.text.TextPresentation)
+	 */
+	public void applyTextPresentation(TextPresentation textPresentation) {
+		IRegion region= textPresentation.getExtent();
+		int minStart= Integer.MAX_VALUE;
+		int maxEnd= Integer.MIN_VALUE;
+		int i= computeIndexAtOffset(fPositions, region.getOffset()), n= computeIndexAtOffset(fPositions, region.getOffset() + region.getLength());
+		if (n - i > 2) {
+			List ranges= new ArrayList(n - i);
+			for (; i < n; i++) {
+				HighlightedPosition position= (HighlightedPosition) fPositions.get(i);
+				if (!position.isDeleted()) {
+					if (!position.isReadOnly())
+						ranges.add(position.createStyleRange());
+					else {
+						int offset= position.getOffset();
+						minStart= Math.min(minStart, offset);
+						maxEnd= Math.max(maxEnd, offset + position.getLength());
+					}
+						
+				}
+			}
+			StyleRange[] array= new StyleRange[ranges.size()];
+			array= (StyleRange[]) ranges.toArray(array);
+			textPresentation.replaceStyleRanges(array);
+		} else {
+			for (; i < n; i++) {
+				HighlightedPosition position= (HighlightedPosition) fPositions.get(i);
+				if (!position.isDeleted()) {
+					if (!position.isReadOnly())
+						textPresentation.replaceStyleRange(position.createStyleRange());
+					else {
+						int offset= position.getOffset();
+						minStart= Math.min(minStart, offset);
+						maxEnd= Math.max(maxEnd, offset + position.getLength());
+					}
+				}
+			}
+		}
+		if (minStart < maxEnd) {
+			IStructuredDocument document = (IStructuredDocument) fSourceViewer.getDocument();
+			if (document.containsReadOnly(minStart, maxEnd)) {
+				Iterator nonDefaultStyleRangeIterator = textPresentation.getNonDefaultStyleRangeIterator();
+				while (nonDefaultStyleRangeIterator.hasNext()) {
+					StyleRange styleRange = (StyleRange) nonDefaultStyleRangeIterator.next();
+					if (document.containsReadOnly(styleRange.start, styleRange.length)) {
+						adjustForeground(styleRange);
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IDocument)
+	 */
+	public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+		setCanceled(true);
+		releaseDocument(oldInput);
+		resetState();
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IDocument)
+	 */
+	public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+		manageDocument(newInput);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentAboutToBeChanged(DocumentEvent event) {
+		setCanceled(true);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentChanged(DocumentEvent event) {
+	}
+
+	/**
+	 * @return Returns <code>true</code> iff the current reconcile is canceled.
+	 * <p>
+	 * NOTE: Also called from background thread.
+	 * </p>
+	 */
+	public boolean isCanceled() {
+		IDocument document= fSourceViewer != null ? fSourceViewer.getDocument() : null;
+		if (document == null)
+			return fIsCanceled;
+
+		synchronized (getLockObject(document)) {
+			return fIsCanceled;
+		}
+	}
+
+	/**
+	 * Set whether or not the current reconcile is canceled.
+	 *
+	 * @param isCanceled <code>true</code> iff the current reconcile is canceled
+	 */
+	public void setCanceled(boolean isCanceled) {
+		IDocument document= fSourceViewer != null ? fSourceViewer.getDocument() : null;
+		if (document == null) {
+			fIsCanceled= isCanceled;
+			return;
+		}
+
+		synchronized (getLockObject(document)) {
+			fIsCanceled= isCanceled;
+		}
+	}
+
+	/**
+	 * @param document the document
+	 * @return the document's lock object
+	 */
+	private Object getLockObject(IDocument document) {
+		if (document instanceof ISynchronizable) {
+			Object lock= ((ISynchronizable)document).getLockObject();
+			if (lock != null)
+				return lock;
+		}
+		return document;
+	}
+
+	/**
+	 * Install this presenter on the given source viewer and background presentation
+	 * reconciler.
+	 *
+	 * @param sourceViewer the source viewer
+	 * @param backgroundPresentationReconciler the background presentation reconciler,
+	 * 	can be <code>null</code>, in that case {@link SemanticHighlightingPresenter#createPresentation(List, List)}
+	 * 	should not be called
+	 */
+	public void install(ISourceViewer sourceViewer, StructuredPresentationReconciler backgroundPresentationReconciler) {
+		fSourceViewer= sourceViewer;
+		fPresentationReconciler= backgroundPresentationReconciler;
+
+		if (fSourceViewer instanceof StructuredTextViewer)
+			((StructuredTextViewer) fSourceViewer).prependTextPresentationListener(this);
+		else if(fSourceViewer instanceof ITextViewerExtension4)
+			((ITextViewerExtension4)fSourceViewer).addTextPresentationListener(this);
+
+		fSourceViewer.addTextInputListener(this);
+		manageDocument(fSourceViewer.getDocument());
+	}
+
+	/**
+	 * Uninstall this presenter.
+	 */
+	public void uninstall() {
+		setCanceled(true);
+
+		if (fSourceViewer != null) {
+			if (fSourceViewer instanceof ITextViewerExtension4)
+				((ITextViewerExtension4) fSourceViewer).addTextPresentationListener(this);
+			releaseDocument(fSourceViewer.getDocument());
+			invalidateTextPresentation();
+			resetState();
+
+			fSourceViewer.removeTextInputListener(this);
+			fSourceViewer= null;
+		}
+	}
+
+	/**
+	 * Invalidate text presentation of positions with the given highlighting.
+	 *
+	 * @param highlighting The highlighting
+	 */
+	public void highlightingStyleChanged(HighlightingStyle highlighting) {
+		for (int i= 0, n= fPositions.size(); i < n; i++) {
+			HighlightedPosition position= (HighlightedPosition) fPositions.get(i);
+			if (position.getHighlighting() == highlighting && fSourceViewer instanceof ITextViewerExtension2)
+				((ITextViewerExtension2) fSourceViewer).invalidateTextPresentation(position.getOffset(), position.getLength());
+			else
+				fSourceViewer.invalidateTextPresentation();
+		}
+	}
+
+	/**
+	 * Invalidate text presentation of all positions.
+	 */
+	private void invalidateTextPresentation() {
+		if (fSourceViewer instanceof ITextViewerExtension2) {
+			for (int i = 0, n = fPositions.size(); i < n; i++) {
+				Position position = (Position) fPositions.get(i);
+				((ITextViewerExtension2) fSourceViewer).invalidateTextPresentation(position.getOffset(), position.getLength());
+			}
+		}
+		else {
+			fSourceViewer.invalidateTextPresentation();
+		}
+	}
+
+	/**
+	 * Add a position with the given range and highlighting unconditionally, only from UI thread.
+	 * The position will also be registered on the document. The text presentation is not invalidated.
+	 *
+	 * @param uiPosition the highlighted position to add from the UI
+	 */
+	private void addPositionFromUI(HighlightedPosition uiPosition) {
+		Position position= createHighlightedPosition(uiPosition, uiPosition.getHighlighting(), uiPosition.isReadOnly());
+		synchronized (fPositionLock) {
+			insertPosition(position);
+		}
+
+		IDocument document= fSourceViewer.getDocument();
+		if (document == null)
+			return;
+		String positionCategory= getPositionCategory();
+		try {
+			document.addPosition(positionCategory, position);
+		} catch (BadLocationException e) {
+			// Should not happen
+			Logger.logException(e);
+		} catch (BadPositionCategoryException e) {
+			// Should not happen
+			Logger.logException(e);
+		}
+	}
+
+	/**
+	 * Reset to initial state.
+	 */
+	private void resetState() {
+		synchronized (fPositionLock) {
+			fPositions.clear();
+		}
+	}
+
+	/**
+	 * Start managing the given document.
+	 *
+	 * @param document The document
+	 */
+	private void manageDocument(IDocument document) {
+		if (document != null) {
+			document.addPositionCategory(getPositionCategory());
+			document.addPositionUpdater(fPositionUpdater);
+			document.addDocumentListener(this);
+		}
+	}
+
+	/**
+	 * Stop managing the given document.
+	 *
+	 * @param document The document
+	 */
+	private void releaseDocument(IDocument document) {
+		if (document != null) {
+			document.removeDocumentListener(this);
+			document.removePositionUpdater(fPositionUpdater);
+			try {
+				document.removePositionCategory(getPositionCategory());
+			} catch (BadPositionCategoryException e) {
+				// Should not happen
+				Logger.logException(e);
+			}
+		}
+	}
+
+	/**
+	 * @return The semantic reconciler position's category.
+	 */
+	private String getPositionCategory() {
+		return toString();
+	}
+	
+	private void adjustForeground(StyleRange styleRange) {
+		RGB oldRGB = null;
+		// Color oldColor = styleRange.foreground;
+		Color oldColor = styleRange.background;
+		if (oldColor == null) {
+			// oldRGB = getTextWidget().getForeground().getRGB();
+			oldColor = fSourceViewer.getTextWidget().getBackground();
+			oldRGB = oldColor.getRGB();
+		}
+		else {
+			oldRGB = oldColor.getRGB();
+		}
+		Color newColor = getCachedColorFor(oldRGB);
+		if (newColor == null) {
+			// make text "closer to" background lumanence
+			double target = getRGBConverter().calculateYComponent(oldColor);
+			RGB newRGB = getRGBConverter().transformRGBToGrey(oldRGB, readOnlyForegroundScaleFactor / 100.0, target);
+
+			// save conversion, so calculations only need to be done once
+			cacheColor(oldRGB, newRGB);
+			newColor = getCachedColorFor(oldRGB);
+		}
+		styleRange.foreground = newColor;
+	}
+
+	private YUV_RGBConverter getRGBConverter() {
+		if (rgbConverter == null) {
+			rgbConverter = new YUV_RGBConverter();
+		}
+		return rgbConverter;
+	}
+
+	/**
+	 * Cache read-only color.
+	 * 
+	 * @param oldRGB
+	 * @param newColor
+	 */
+	private void cacheColor(RGB oldRGB, RGB newColor) {
+		if (readOnlyColorTable == null) {
+			readOnlyColorTable = new HashMap();
+		}
+		readOnlyColorTable.put(oldRGB, newColor);
+	}
+
+	/**
+	 * This method is just to get existing read-only colors.
+	 */
+	private Color getCachedColorFor(RGB oldRGB) {
+		Color result = null;
+	
+		if (readOnlyColorTable != null) {
+			RGB readOnlyRGB = (RGB) readOnlyColorTable.get(oldRGB);
+			result = EditorUtility.getColor(readOnlyRGB);
+		}
+	
+		return result;
+	}
+	
+	/**
+	 * A utility class to do various color manipulations
+	 */
+	private class YUV_RGBConverter {
+		/**
+		 * This class "holds" the YUV values corresponding to RGB color
+		 */
+		private class YUV {
+
+			class NormalizedRGB {
+				double blue;
+				double green;
+				private final double maxRGB = 256.0;
+				double red;
+
+				public NormalizedRGB(RGB rgb) {
+					// first normalize to between 0 - 1
+					red = rgb.red / maxRGB;
+					green = rgb.green / maxRGB;
+					blue = rgb.blue / maxRGB;
+
+					red = gammaNormalized(red);
+					green = gammaNormalized(green);
+					blue = gammaNormalized(blue);
+
+				}
+			}
+
+			private NormalizedRGB normalizedRGB;
+
+			private double u = -1;
+			private double v = -1;
+			private double y = -1;
+
+			private YUV() {
+				super();
+			}
+
+			public YUV(RGB rgb) {
+				this();
+				normalizedRGB = new NormalizedRGB(rgb);
+				// force calculations
+				getY();
+				getV();
+				getU();
+			}
+
+			/**
+			 * normalize to "average" gamma 2.2222 or 1/0.45
+			 */
+			double gammaNormalized(double colorComponent) {
+				if (colorComponent < 0.018) {
+					return colorComponent * 0.45;
+				}
+				else {
+					return 1.099 * Math.pow(colorComponent, 0.45) - 0.099;
+				}
+			}
+
+			/**
+			 * @return RGB based on original RGB and current YUV values;
+			 */
+
+			public double getU() {
+				if (u == -1) {
+					u = 0.4949 * (normalizedRGB.blue - getY());
+				}
+				return u;
+
+			}
+
+			public double getV() {
+				if (v == -1) {
+					v = 0.877 * (normalizedRGB.red - getY());
+				}
+				return v;
+			}
+
+			public double getY() {
+				if (y == -1) {
+					y = 0.299 * normalizedRGB.red + 0.587 * normalizedRGB.green + 0.114 * normalizedRGB.blue;
+				}
+				return y;
+			}
+
+		}
+
+		public YUV_RGBConverter() {
+			super();
+		}
+
+		public double calculateYComponent(Color targetColor) {
+			return new YUV(targetColor.getRGB()).getY();
+		}
+
+		public RGB transformRGBToGrey(RGB originalRGB, double scaleFactor, double target) {
+			RGB transformedRGB = null;
+			// we left the "full" API method signature, but this
+			// version does not take into account originalRGB, though
+			// it might someday.
+			// for now, we'll simply make the new RGB grey, either a little
+			// lighter, or a little darker than background.
+			double y = 0;
+			double mid = 0.5;
+			// zero is black, one is white
+			if (target < mid) {
+				// is "dark" make lighter
+				y = target + scaleFactor;
+			}
+			else {
+				// is "light" make darker
+				y = target - scaleFactor;
+			}
+			int c = (int) Math.round(y * 255);
+			// just to gaurd against mis-use, or scale's values greater
+			// than mid point (and possibly rounding error)
+			if (c > 255)
+				c = 255;
+			if (c < 0)
+				c = 0;
+			transformedRGB = new RGB(c, c, c);
+			return transformedRGB;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingReconciler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingReconciler.java
new file mode 100644
index 0000000..8318c97
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/style/SemanticHighlightingReconciler.java
@@ -0,0 +1,296 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.style;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.sse.core.internal.model.ModelManagerImpl;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.ISemanticHighlighting;
+import org.eclipse.wst.sse.ui.ISemanticHighlightingExtension;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.style.SemanticHighlightingManager.HighlightedPosition;
+import org.eclipse.wst.sse.ui.internal.style.SemanticHighlightingManager.HighlightingStyle;
+
+/**
+ * Semantic highlighting reconciler for Structured Source Editors. Based on 
+ * org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingReconciler
+ *
+ * @since 3.1
+ */
+public class SemanticHighlightingReconciler implements IReconcilingStrategy, IReconcilingStrategyExtension {
+
+	private IDocument fDocument;
+
+	private ITextViewer fViewer;
+	private SemanticHighlightingPresenter fPresenter;
+	private ISemanticHighlighting[] fSemanticHighlightings;
+	private HighlightingStyle[] fHighlightings;
+
+	private List fAddedPositions = new ArrayList();
+	private List fRemovedPositions = new ArrayList();
+	/** Number of removed positions */
+	private int fNOfRemovedPositions;
+	
+	/** Background job */
+	private Job fJob;
+	/** Background job lock */
+	private final Object fJobLock = new Object();
+	
+	/** Reconcile operation lock. */
+	private final Object fReconcileLock = new Object();
+	private boolean fIsReconciling = false;
+	/** The semantic highlighting presenter - cache for background thread, only valid during {@link #reconcile(IRegion)} */
+	private SemanticHighlightingPresenter fJobPresenter;
+	/** Semantic highlightings - cache for background thread, only valid during {@link #reconcile(IRegion)} */
+	private ISemanticHighlighting[] fJobSemanticHighlightings;
+	/** HighlightingStyle - cache for background thread, only valid during {@link #reconcile(IRegion)} */
+	private HighlightingStyle[] fJobHighlightings;
+
+	private boolean fIsInstalled;
+
+	public void install(ITextViewer sourceViewer, SemanticHighlightingPresenter presenter, ISemanticHighlighting[] semanticHighlightings, HighlightingStyle[] highlightings) {
+		fViewer = sourceViewer;
+		fPresenter = presenter;
+		fSemanticHighlightings = semanticHighlightings;
+		fHighlightings = highlightings;
+		fIsInstalled = true;
+	}
+
+	public void uninstall() {
+		fIsInstalled = false;
+		fViewer = null;
+		fPresenter = null;
+		fSemanticHighlightings = null;
+		fHighlightings = null;
+	}
+
+	public void reconcile(IRegion partition) {
+		// ensure at most one thread can be reconciling at any time
+		synchronized (fReconcileLock) {
+			if (fIsReconciling)
+				return;
+			else
+				fIsReconciling= true;
+		}
+		fJobPresenter = fPresenter;
+		fJobSemanticHighlightings = fSemanticHighlightings;
+		fJobHighlightings = fHighlightings;
+		IStructuredModel model = null;
+		try {
+			if (fJobPresenter == null || fJobSemanticHighlightings == null || fJobHighlightings == null || fDocument == null)
+				return;
+
+			fJobPresenter.setCanceled(false);
+		
+			startReconcilingPositions();
+			IStructuredDocument document = (IStructuredDocument) fDocument;
+			model = ModelManagerImpl.getInstance().getModelForRead(document);
+			IStructuredDocumentRegion[] regions = document.getStructuredDocumentRegions(partition.getOffset(), partition.getLength());
+			for (int i = 0; i < regions.length && fIsInstalled; i++) {
+				if (document.containsReadOnly(regions[i].getStartOffset(), regions[i].getLength()))
+					addPosition(new Position(regions[i].getStartOffset(), regions[i].getLength()), null, true);
+				else {
+					for (int j = 0; j < fJobSemanticHighlightings.length && fIsInstalled; j++) {
+						if (fJobHighlightings[j].isEnabled()) {
+							Position[] consumes = null;
+							if (fJobSemanticHighlightings[j] instanceof ISemanticHighlightingExtension && model != null) {
+								consumes = ((ISemanticHighlightingExtension) fJobSemanticHighlightings[j]).consumes(regions[i], model.getIndexedRegion(regions[i].getStartOffset()));
+							}
+							else {
+								consumes = fJobSemanticHighlightings[j].consumes(regions[i]);
+							}
+							if (consumes != null) {
+								for (int k = 0; k < consumes.length; k++)
+									addPosition(consumes[k], fJobHighlightings[j]);
+							}
+						}
+					}
+				}
+			}
+
+			if (fIsInstalled) {
+				List oldPositions = fRemovedPositions;
+				List newPositions = new ArrayList(fNOfRemovedPositions);
+				for (int i = 0, n = oldPositions.size(); i < n && fIsInstalled; i++) {
+					Object current = oldPositions.get(i);
+					if (current != null)
+						newPositions.add(current);
+				}
+				fRemovedPositions = newPositions;
+				
+				TextPresentation presentation = null;
+				if (!fJobPresenter.isCanceled())
+					presentation = fJobPresenter.createPresentation(fAddedPositions, fRemovedPositions);
+				if (!fJobPresenter.isCanceled())
+					updatePresentation(presentation, fAddedPositions, fRemovedPositions);
+			}
+			stopReconcilingPositions();
+		}
+		finally {
+			fJobPresenter= null;
+			fJobSemanticHighlightings= null;
+			fJobHighlightings= null;
+			if (model != null)
+				model.releaseFromRead();
+			synchronized (fReconcileLock) {
+				fIsReconciling= false;
+			}
+		}
+	}
+
+	private void addPosition(Position position, HighlightingStyle highlighting) {
+		addPosition(position, highlighting, false);
+	}
+
+	private void addPosition(Position position, HighlightingStyle highlighting, boolean isReadOnly) {
+		boolean isExisting = false;
+		// TODO: use binary search
+		for (int i = 0, n = fRemovedPositions.size(); i < n; i++) {
+			HighlightedPosition highlightedPosition = (HighlightedPosition) fRemovedPositions.get(i);
+			if (highlightedPosition == null)
+				continue;
+			if (highlightedPosition.isEqual(position, highlighting)) {
+				isExisting = true;
+				fRemovedPositions.set(i, null);
+				fNOfRemovedPositions--;
+				break;
+			}
+		}
+		if (!isExisting) {
+			fAddedPositions.add(fJobPresenter.createHighlightedPosition(position, highlighting, isReadOnly));
+		}
+	}
+
+	/**
+	 * Update the presentation.
+	 * 
+	 * @param textPresentation
+	 *            the text presentation
+	 * @param addedPositions
+	 *            the added positions
+	 * @param removedPositions
+	 *            the removed positions
+	 */
+	private void updatePresentation(TextPresentation textPresentation, List addedPositions, List removedPositions) {
+		Runnable runnable = fJobPresenter.createUpdateRunnable(textPresentation, addedPositions, removedPositions);
+		if (runnable == null)
+			return;
+
+		if (fViewer == null)
+			return;
+
+		Control viewerControl = fViewer.getTextWidget();
+		if (viewerControl == null)
+			return;
+
+		Display display = viewerControl.getDisplay();
+		if (display == null || display.isDisposed())
+			return;
+
+		display.asyncExec(runnable);
+	}
+
+	/**
+	 * Start reconciling positions.
+	 */
+	private void startReconcilingPositions() {
+		fJobPresenter.addAllPositions(fRemovedPositions);
+		fNOfRemovedPositions = fRemovedPositions.size();
+	}
+
+	/**
+	 * Stop reconciling positions.
+	 */
+	private void stopReconcilingPositions() {
+		fRemovedPositions.clear();
+		fNOfRemovedPositions = 0;
+		fAddedPositions.clear();
+	}
+
+	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+		reconcile(dirtyRegion);
+	}
+
+	public void setDocument(IDocument document) {
+		fDocument = document;
+//		refresh();
+	}
+
+	public void initialReconcile() {
+		// Do nothing
+	}
+
+	public void setProgressMonitor(IProgressMonitor monitor) {
+	}
+	
+	/**
+	 * Schedule a background job for reconciling the Semantic Highlighting model.
+	 */
+	private void scheduleJob() {
+		synchronized (fJobLock) {
+			final Job oldJob= fJob;
+			if (fJob != null) {
+				fJob.cancel();
+				fJob= null;
+			}
+
+			fJob= new Job("Semantic Highlighting Job") {
+				protected IStatus run(IProgressMonitor monitor) {
+					if (oldJob != null) {
+						try {
+							oldJob.join();
+						} catch (InterruptedException e) {
+							Logger.logException(e);
+							return Status.CANCEL_STATUS;
+						}
+					}
+					if (monitor.isCanceled())
+						return Status.CANCEL_STATUS;
+
+					reconcile(new Region(0, fDocument.getLength()));
+					synchronized (fJobLock) {
+						// allow the job to be gc'ed
+						if (fJob == this)
+							fJob= null;
+					}
+					return Status.OK_STATUS;
+				}
+			};
+			fJob.setSystem(true);
+			fJob.setPriority(Job.DECORATE);
+			fJob.schedule();
+		}
+	}
+
+	public void refresh() {
+		if (fDocument != null)
+			scheduleJob();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AbstractHoverProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AbstractHoverProcessor.java
new file mode 100644
index 0000000..6f33061
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AbstractHoverProcessor.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.taginfo;
+
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextHoverExtension;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.wst.sse.ui.internal.derived.HTMLTextPresenter;
+
+/**
+ * Abstract class for providing hover information for Source editor. Includes
+ * a hover control creator which has the "Press F2 for focus" message built
+ * in.
+ * 
+ * @since WTP 1.5
+ */
+abstract public class AbstractHoverProcessor implements ITextHover, ITextHoverExtension {
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
+	 */
+	public IInformationControlCreator getHoverControlCreator() {
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				return new DefaultInformationControl(parent, SWT.NONE, new HTMLTextPresenter(true), EditorsUI.getTooltipAffordanceString());
+			}
+		};
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AnnotationHoverProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AnnotationHoverProcessor.java
new file mode 100644
index 0000000..39082c9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AnnotationHoverProcessor.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.taginfo;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.ITemporaryAnnotation;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * Hover help that displays annotations shown in text of editor. Currently,
+ * this text hover is used in conjunction with AbstractTextHoverProcessor.
+ * 
+ * @author amywu
+ */
+public class AnnotationHoverProcessor extends AbstractHoverProcessor {
+	private final static String LIST_BEGIN = "<ul>"; //$NON-NLS-1$
+	private final static String LIST_ELEMENT = "<li>"; //$NON-NLS-1$
+	private final static String PARAGRAPH_END = "</p>"; //$NON-NLS-1$
+	private final static String PARAGRAPH_START = "<p>"; //$NON-NLS-1$
+
+	private IPreferenceStore fPreferenceStore = null;
+
+	/**
+	 * 
+	 */
+	public AnnotationHoverProcessor() {
+		super();
+	}
+
+	/**
+	 * Formats a msg to a proper html message
+	 * 
+	 * @param msg -
+	 *            assumes msg is neither null nor empty string
+	 * @return
+	 */
+	private String formatMessage(String msg) {
+		StringBuffer buf = new StringBuffer();
+		buf.append(PARAGRAPH_START);
+		buf.append(StringUtils.convertToHTMLContent(msg));
+		buf.append(PARAGRAPH_END);
+		return buf.toString();
+	}
+
+	/**
+	 * Formats multiple messages into proper html message
+	 * 
+	 * @param messages
+	 * @return
+	 */
+	private String formatMessages(List messages) {
+		StringBuffer buffer = new StringBuffer();
+		buffer.append(PARAGRAPH_START);
+		buffer.append(SSEUIMessages.Multiple_errors); //$NON-NLS-1$
+		buffer.append(LIST_BEGIN);
+
+		Iterator e = messages.iterator();
+		while (e.hasNext()) {
+			buffer.append(LIST_ELEMENT);
+			buffer.append(StringUtils.convertToHTMLContent((String) e.next()));
+		}
+		buffer.append(PARAGRAPH_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Returns the annotation preference for the given annotation. (copied
+	 * from org.eclipse.jdt.internal.ui.text.java.hover.AnnotationHover)
+	 * 
+	 * @param annotation
+	 *            the annotation
+	 * @return the annotation preference or <code>null</code> if none
+	 */
+	private AnnotationPreference getAnnotationPreference(Annotation annotation) {
+
+		if (annotation.isMarkedDeleted())
+			return null;
+		return EditorsUI.getAnnotationPreferenceLookup().getAnnotationPreference(annotation);
+	}
+
+	public String getHoverInfo(ITextViewer viewer, IRegion hoverRegion) {
+		IAnnotationModel model = ((SourceViewer) viewer).getAnnotationModel();
+		if (model != null) {
+			List messages = new ArrayList();
+			Iterator e = model.getAnnotationIterator();
+			while (e.hasNext()) {
+				Annotation a = (Annotation) e.next();
+				if (!isAnnotationValid(a))
+					continue;
+
+				Position p = model.getPosition(a);
+				// check if this is an annotation in the region we are
+				// concerned with
+				if (p.overlapsWith(hoverRegion.getOffset(), hoverRegion.getLength())) {
+					String msg = a.getText();
+					if ((msg != null) && msg.trim().length() > 0) {
+						// it is possible for temporary annotations to
+						// duplicate other annotations so make sure not to add
+						// dups
+						if (a instanceof ITemporaryAnnotation) {
+							boolean duplicated = false;
+							int j = 0;
+							while (j < messages.size() && !duplicated) {
+								duplicated = messages.get(j).equals(msg);
+								++j;
+							}
+							if (!duplicated) {
+								messages.add(msg);
+							}
+						}
+						else {
+							messages.add(msg);
+						}
+					}
+				}
+			}
+			if (messages.size() > 1) {
+				return formatMessages(messages);
+			}
+			else if (messages.size() > 0) {
+				return formatMessage(messages.get(0).toString());
+			}
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+		IAnnotationModel model = ((SourceViewer) textViewer).getAnnotationModel();
+		Region hoverRegion = null;
+
+		if (model != null) {
+			Iterator e = model.getAnnotationIterator();
+			while (e.hasNext()) {
+				Annotation a = (Annotation) e.next();
+				if (!isAnnotationValid(a))
+					continue;
+				Position p = model.getPosition(a);
+				if (p != null && p.includes(offset)) {
+					// find the smallest region containing offset
+					if ((hoverRegion == null) || (hoverRegion.getLength() > p.getLength())) {
+						hoverRegion = new Region(p.getOffset(), p.getLength());
+					}
+				}
+			}
+		}
+		return hoverRegion;
+	}
+
+	/**
+	 * Retreives the preference store If no preference store is currently
+	 * stored, retreive the appropriate preference store
+	 */
+	private IPreferenceStore getPreferenceStore() {
+		if (fPreferenceStore == null) {
+			IPreferenceStore sseEditorPrefs = SSEUIPlugin.getDefault().getPreferenceStore();
+			IPreferenceStore baseEditorPrefs = EditorsUI.getPreferenceStore();
+			fPreferenceStore = new ChainedPreferenceStore(new IPreferenceStore[]{sseEditorPrefs, baseEditorPrefs});
+		}
+		return fPreferenceStore;
+	}
+
+	boolean isAnnotationValid(Annotation a) {
+		AnnotationPreference preference = getAnnotationPreference(a);
+		if (preference == null)
+			return false;
+		String textPreferenceKey = preference.getTextPreferenceKey();
+		String highlightPreferenceKey = preference.getHighlightPreferenceKey();
+		if (textPreferenceKey == null || !(getPreferenceStore().getBoolean(textPreferenceKey)) || highlightPreferenceKey == null || getPreferenceStore().getBoolean(highlightPreferenceKey))
+			return false;
+		return true;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/BestMatchHover.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/BestMatchHover.java
new file mode 100644
index 0000000..230159f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/BestMatchHover.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.taginfo;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextHoverExtension;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+/**
+ * Provides the best hover help documentation (by using other hover help
+ * processors) Priority of hover help processors is: ProblemHoverProcessor,
+ * TagInfoProcessor, AnnotationHoverProcessor
+ */
+public class BestMatchHover implements ITextHover, ITextHoverExtension {
+	private ITextHover fBestMatchHover; // current best match text hover
+	private ITextHover[] fTagInfoHovers; // documentation/information hover
+	private List fTextHovers; // list of text hovers to consider in best
+	// match
+
+	public BestMatchHover(ITextHover infoTagHover) {
+		this(new ITextHover[]{infoTagHover});
+	}
+
+	public BestMatchHover(ITextHover[] infoTagHovers) {
+		fTagInfoHovers = infoTagHovers;
+	}
+
+	/**
+	 * Create a list of text hovers applicable to this best match hover
+	 * processor
+	 * 
+	 * @return List of ITextHover - in abstract class this is empty list
+	 */
+	private List createTextHoversList() {
+		List hoverList = new ArrayList();
+		// if currently debugging, then add the debug hover to the list of
+		// best match
+		if (Logger.isTracing(DebugInfoHoverProcessor.TRACEFILTER)) {
+			hoverList.add(new DebugInfoHoverProcessor());
+		}
+
+		hoverList.add(new ProblemAnnotationHoverProcessor());
+		
+		if (fTagInfoHovers != null) {
+			for (int i = 0; i < fTagInfoHovers.length; i++) {
+				hoverList.add(fTagInfoHovers[i]);
+			}
+		}
+		hoverList.add(new AnnotationHoverProcessor());
+		return hoverList;
+	}
+
+	public IInformationControlCreator getHoverControlCreator() {
+		IInformationControlCreator creator = null;
+
+		if (fBestMatchHover instanceof ITextHoverExtension) {
+			creator = ((ITextHoverExtension) fBestMatchHover).getHoverControlCreator();
+		}
+		return creator;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public String getHoverInfo(ITextViewer viewer, IRegion hoverRegion) {
+		String displayText = null;
+
+		// already have a best match hover picked out from getHoverRegion call
+		if (fBestMatchHover != null) {
+			displayText = fBestMatchHover.getHoverInfo(viewer, hoverRegion);
+		}
+		// either had no best match hover or best match hover returned null
+		if (displayText == null) {
+			// go through list of text hovers and return first display string
+			Iterator i = getTextHovers().iterator();
+			while ((i.hasNext()) && (displayText == null)) {
+				ITextHover hover = (ITextHover) i.next();
+				displayText = hover.getHoverInfo(viewer, hoverRegion);
+			}
+		}
+		return displayText;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public IRegion getHoverRegion(ITextViewer viewer, int offset) {
+		IRegion hoverRegion = null;
+
+		// go through list of text hovers and return first hover region
+		ITextHover hover = null;
+		Iterator i = getTextHovers().iterator();
+		while ((i.hasNext()) && (hoverRegion == null)) {
+			hover = (ITextHover) i.next();
+			hoverRegion = hover.getHoverRegion(viewer, offset);
+		}
+
+		// store the text hover processor that found region
+		if (hoverRegion != null)
+			fBestMatchHover = hover;
+		else
+			fBestMatchHover = null;
+
+		return hoverRegion;
+	}
+
+	private List getTextHovers() {
+		if (fTextHovers == null) {
+			fTextHovers = createTextHoversList();
+		}
+		return fTextHovers;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/DebugInfoHoverProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/DebugInfoHoverProcessor.java
new file mode 100644
index 0000000..ea9db05
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/DebugInfoHoverProcessor.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.taginfo;
+
+
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITypedRegion;
+
+/**
+ * Provides debug hover help
+ * 
+ * @see org.eclipse.jface.text.ITextHover
+ */
+public class DebugInfoHoverProcessor extends AbstractHoverProcessor {
+	public static final String TRACEFILTER = "debuginfohover"; //$NON-NLS-1$
+	protected IPreferenceStore fPreferenceStore = null;
+
+	public DebugInfoHoverProcessor() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public String getHoverInfo(ITextViewer viewer, IRegion hoverRegion) {
+		String displayText = null;
+		if ((hoverRegion == null) || (viewer == null) || (viewer.getDocument() == null)) {
+			displayText = null;
+		}
+		else {
+			int offset = hoverRegion.getOffset();
+
+			ITypedRegion region;
+			try {
+				region = viewer.getDocument().getPartition(offset);
+				if (region != null) {
+					displayText = region.getType();
+				}
+				else {
+					displayText = "Null Region was returned?!"; //$NON-NLS-1$
+				}
+			}
+			catch (BadLocationException e) {
+				displayText = "BadLocationException Occurred!?"; //$NON-NLS-1$
+			}
+
+		}
+		return displayText;
+	}
+
+	/**
+	 * Returns the region to hover the text over based on the offset.
+	 * 
+	 * @param textViewer
+	 * @param offset
+	 * 
+	 * @return IRegion region to hover over if offset is not over invalid
+	 *         whitespace. otherwise, returns <code>null</code>
+	 * 
+	 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(ITextViewer, int)
+	 */
+	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+		ITypedRegion region = null;
+		if ((textViewer == null) || (textViewer.getDocument() == null)) {
+			region = null;
+		}
+		else {
+
+			try {
+				region = textViewer.getDocument().getPartition(offset);
+			}
+			catch (BadLocationException e) {
+				region = null;
+			}
+		}
+		return region;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/ProblemAnnotationHoverProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/ProblemAnnotationHoverProcessor.java
new file mode 100644
index 0000000..d601231
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/ProblemAnnotationHoverProcessor.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.taginfo;
+
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
+
+/**
+ * Hover help that displays problem annotations when shown in text of editor.
+ * 
+ * @author amywu
+ */
+public class ProblemAnnotationHoverProcessor extends AnnotationHoverProcessor {
+
+	// these strings are derived from the annotationTypes extension in
+	// org.eclipse.ui.editors plugin
+	// if those strings change, then these strings need to change as well
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=198584
+	final private String ANNOTATION_ERROR = "org.eclipse.ui.workbench.texteditor.error"; //$NON-NLS-1$
+	final private String ANNOTATION_WARNING = "org.eclipse.ui.workbench.texteditor.warning"; //$NON-NLS-1$
+	private DefaultMarkerAnnotationAccess fAnnotationAccess = new DefaultMarkerAnnotationAccess();
+
+	/**
+	 *  
+	 */
+	public ProblemAnnotationHoverProcessor() {
+		super();
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.taginfo.AnnotationHoverProcessor#isAnnotationValid(org.eclipse.jface.text.source.Annotation)
+	 */
+	protected boolean isAnnotationValid(Annotation a) {
+		String type = a.getType();
+		if (fAnnotationAccess.isSubtype(type, ANNOTATION_ERROR) || fAnnotationAccess.isSubtype(type, ANNOTATION_WARNING))
+			return super.isAnnotationValid(a);
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/TextHoverManager.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/TextHoverManager.java
new file mode 100644
index 0000000..428b1a0
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/TextHoverManager.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.taginfo;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
+
+import com.ibm.icu.util.StringTokenizer;
+
+/**
+ * Manages text hovers for Structured Text editors
+ */
+public class TextHoverManager {
+	/**
+	 * Contains description of a text hover
+	 */
+	public class TextHoverDescriptor {
+		private String fDescription;
+		private boolean fEnabled;
+		private String fId;
+		private String fLabel;
+		private String fModifierString;
+
+		/**
+		 * @param id
+		 * @param label
+		 * @param desc
+		 */
+		public TextHoverDescriptor(String id, String label, String desc) {
+			fId = id;
+			fLabel = label;
+			fDescription = desc;
+		}
+
+		/**
+		 * @param id
+		 * @param label
+		 * @param desc
+		 * @param enabled
+		 * @param modifierString
+		 */
+		public TextHoverDescriptor(String id, String label, String desc, boolean enabled, String modifierString) {
+			fId = id;
+			fLabel = label;
+			fDescription = desc;
+			fEnabled = enabled;
+			fModifierString = modifierString;
+		}
+
+		/**
+		 * @return Returns the fDescription.
+		 */
+		public String getDescription() {
+			return fDescription;
+		}
+
+		/**
+		 * @return Returns the fId.
+		 */
+		public String getId() {
+			return fId;
+		}
+
+		/**
+		 * @return Returns the fLabel
+		 */
+		public String getLabel() {
+			return fLabel;
+		}
+
+		/**
+		 * @return Returns the fModifierString.
+		 */
+		public String getModifierString() {
+			return fModifierString;
+		}
+
+		/**
+		 * @return Returns the fEnabled.
+		 */
+		public boolean isEnabled() {
+			return fEnabled;
+		}
+
+		/**
+		 * @param enabled
+		 *            The fEnabled to set.
+		 */
+		public void setEnabled(boolean enabled) {
+			fEnabled = enabled;
+		}
+
+		/**
+		 * @param modifierString
+		 *            The fModifierString to set.
+		 */
+		public void setModifierString(String modifierString) {
+			fModifierString = modifierString;
+		}
+	}
+
+	public static final String ANNOTATION_HOVER = "annotationHover"; //$NON-NLS-1$
+
+	// list of different types of Source editor hovers
+	public static final String COMBINATION_HOVER = "combinationHover"; //$NON-NLS-1$
+	// hover descriptions are in .properties file with the key in the form of
+	// "[id]_desc"
+	private static final String DESCRIPTION_KEY = "_desc"; //$NON-NLS-1$
+	public static final String DOCUMENTATION_HOVER = "documentationHover"; //$NON-NLS-1$
+	public static final String HOVER_ATTRIBUTE_SEPARATOR = "|"; //$NON-NLS-1$
+	public static final String HOVER_SEPARATOR = ";"; //$NON-NLS-1$
+
+	// hover labels are in .properties file with the key in the form of
+	// "[id]_label"
+	private static final String LABEL_KEY = "_label"; //$NON-NLS-1$
+
+	public static final String NO_MODIFIER = "0"; //$NON-NLS-1$
+	public static final String PROBLEM_HOVER = "problemHover"; //$NON-NLS-1$
+	public static final String[] TEXT_HOVER_IDS = new String[]{COMBINATION_HOVER, PROBLEM_HOVER, DOCUMENTATION_HOVER, ANNOTATION_HOVER};
+	/**
+	 * Current list of Structured Text editor text hovers
+	 */
+	private TextHoverDescriptor[] fTextHovers;
+
+	public TextHoverManager() {
+		super();
+	}
+
+	/**
+	 * Create a best match hover with the give text hover as the documentation
+	 * hover
+	 * 
+	 * @param infoHover
+	 * @return ITextHover
+	 * @deprecated as of WTP 3.0 M3
+	 */
+	public ITextHover createBestMatchHover(ITextHover infoHover) {
+		return new BestMatchHover(infoHover);
+	}
+
+	/**
+	 * Generate a list of text hover descriptors from the given delimited
+	 * string
+	 * 
+	 * @param textHoverStrings
+	 * @return
+	 */
+	public TextHoverDescriptor[] generateTextHoverDescriptors(String textHoverStrings) {
+		StringTokenizer st = new StringTokenizer(textHoverStrings, HOVER_SEPARATOR);
+
+		// read from preference and load id-descriptor mapping to a hash table
+		HashMap idToModifier = new HashMap(st.countTokens());
+		while (st.hasMoreTokens()) {
+			String textHoverString = st.nextToken();
+			StringTokenizer st2 = new StringTokenizer(textHoverString, HOVER_ATTRIBUTE_SEPARATOR);
+			if (st2.countTokens() == 3) {
+				String id = st2.nextToken();
+				boolean enabled = Boolean.valueOf(st2.nextToken()).booleanValue();
+				String modifierString = st2.nextToken();
+				if (modifierString.equals(NO_MODIFIER))
+					modifierString = ""; //$NON-NLS-1$
+
+				String label = null;
+				String description = null;
+				try {
+					label = SSEUIMessages.getResourceBundle().getString(id + LABEL_KEY);
+					description = SSEUIMessages.getResourceBundle().getString(id + DESCRIPTION_KEY);
+				}
+				catch (Exception e) {
+					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+				}
+				TextHoverDescriptor descriptor = new TextHoverDescriptor(id, label, description, enabled, modifierString);
+				// should check to see if ids appear more than once
+				idToModifier.put(id, descriptor);
+			}
+		}
+
+		// go through all defined text hovers and match with their preference
+		TextHoverDescriptor[] descriptors = new TextHoverDescriptor[TEXT_HOVER_IDS.length];
+		for (int i = 0; i < TEXT_HOVER_IDS.length; i++) {
+			TextHoverDescriptor desc = (TextHoverDescriptor) idToModifier.get(TEXT_HOVER_IDS[i]);
+			if (desc != null) {
+				descriptors[i] = desc;
+			}
+			else {
+				String label = null;
+				String description = null;
+				try {
+					label = SSEUIMessages.getResourceBundle().getString(TEXT_HOVER_IDS[i] + LABEL_KEY);
+					description = SSEUIMessages.getResourceBundle().getString(TEXT_HOVER_IDS[i] + DESCRIPTION_KEY);
+				}
+				catch (Exception e) {
+					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+				}
+				descriptors[i] = new TextHoverDescriptor(TEXT_HOVER_IDS[i], label, description);
+			}
+		}
+		return descriptors;
+	}
+
+	private IPreferenceStore getPreferenceStore() {
+		return SSEUIPlugin.getDefault().getPreferenceStore();
+	}
+
+
+	/**
+	 * Returns the text hovers for Structured Text editor. If fTextHover has
+	 * not been initialied, it will be initialized.
+	 * 
+	 * @return Returns the fTextHovers.
+	 */
+	public TextHoverDescriptor[] getTextHovers() {
+		if (fTextHovers == null) {
+			String textHoverStrings = getPreferenceStore().getString(EditorPreferenceNames.EDITOR_TEXT_HOVER_MODIFIERS);
+			fTextHovers = generateTextHoverDescriptors(textHoverStrings);
+		}
+		return fTextHovers;
+	}
+
+	/**
+	 * Sets fTextHovers to null so that next time getTextHovers is called,
+	 * fTextHovers will be populated with the latest preferences.
+	 */
+	public void resetTextHovers() {
+		fTextHovers = null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/DocumentRegionEdgeMatcher.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/DocumentRegionEdgeMatcher.java
new file mode 100644
index 0000000..cb7fa43
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/DocumentRegionEdgeMatcher.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.text;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.ICharacterPairMatcher;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+
+
+/**
+ * Matches the start and ending characters of IStructuredDocumentRegions with
+ * the given allowed types. Note that Eclipse R3M8 only paints single
+ * character-wide matches and this isn't true pair matching behavior. See RFE
+ * #56836 at https://bugs.eclipse.org/bugs/show_bug.cgi?id=56836.
+ */
+public class DocumentRegionEdgeMatcher implements ICharacterPairMatcher {
+
+	public static final String ID = "characterpairmatcher"; //$NON-NLS-1$
+
+	protected int fAnchor;
+
+	protected ICharacterPairMatcher fNextMatcher;
+
+	protected List fRegionTypes;
+
+	public DocumentRegionEdgeMatcher(String[] validContexts, ICharacterPairMatcher nextMatcher) {
+		fRegionTypes = Arrays.asList(validContexts);
+		fNextMatcher = nextMatcher;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#clear()
+	 */
+	public void clear() {
+		if (fNextMatcher != null)
+			fNextMatcher.clear();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#dispose()
+	 */
+	public void dispose() {
+		if (fNextMatcher != null)
+			fNextMatcher.dispose();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#getAnchor()
+	 */
+	public int getAnchor() {
+		if (fAnchor < 0 && fNextMatcher != null)
+			return fNextMatcher.getAnchor();
+		return fAnchor;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.source.ICharacterPairMatcher#match(org.eclipse.jface.text.IDocument,
+	 *      int)
+	 */
+	public IRegion match(IDocument document, int offset) {
+		if (offset < 0 || offset >= document.getLength())
+			return null;
+
+		IRegion match = null;
+		if (!fRegionTypes.isEmpty() && document instanceof IStructuredDocument) {
+			IStructuredDocumentRegion docRegion = ((IStructuredDocument) document).getRegionAtCharacterOffset(offset);
+			if (docRegion != null) {
+				// look at the previous document region first since its end ==
+				// this one's start
+				if (docRegion.getPrevious() != null && docRegion.getPrevious().getEndOffset() == offset && fRegionTypes.contains(docRegion.getPrevious().getType())) {
+					fAnchor = ICharacterPairMatcher.RIGHT;
+					match = new Region(docRegion.getPrevious().getStartOffset(), 1);
+				}
+				// check for offset in the last text region for a match to
+				// document region start offset
+				else if (fRegionTypes.contains(docRegion.getType()) && docRegion.getStartOffset(docRegion.getLastRegion()) <= offset && offset <= docRegion.getEndOffset(docRegion.getLastRegion())) {
+					fAnchor = ICharacterPairMatcher.RIGHT;
+					match = new Region(docRegion.getStartOffset(), 1);
+				}
+				// check for offset in the first text region for a match to
+				// document region end offset
+				else if (fRegionTypes.contains(docRegion.getType())) {
+					if (docRegion.getStartOffset(docRegion.getFirstRegion()) <= offset && offset <= docRegion.getEndOffset(docRegion.getFirstRegion())) {
+						fAnchor = ICharacterPairMatcher.LEFT;
+						match = new Region(docRegion.getEndOffset() - 1, 1);
+					}
+				}
+
+				if (match == null) {
+					/* Now check the text region */
+					ITextRegion currentTextRegion = docRegion.getRegionAtCharacterOffset(offset);
+					if (currentTextRegion != null && currentTextRegion.getTextLength() > 1) {
+						int offsetAtNearEdge = offset;
+						if (offset == docRegion.getTextEndOffset(currentTextRegion)) {
+							offsetAtNearEdge = offset-1;
+						}
+						else if (offset == docRegion.getStartOffset(currentTextRegion)+1) {
+							offsetAtNearEdge = offset-1;
+						}
+
+						if (offsetAtNearEdge == docRegion.getStartOffset(currentTextRegion)) {
+							int end = docRegion.getTextEndOffset(currentTextRegion);
+							try {
+								if (document.getChar(offsetAtNearEdge) == document.getChar(end - 1)) {
+									fAnchor = ICharacterPairMatcher.LEFT;
+									match = new Region(end - 1, 1);
+								}
+							}
+							catch (BadLocationException e) {
+								// nothing, not important enough
+							}
+						}
+						else if (offsetAtNearEdge == docRegion.getTextEndOffset(currentTextRegion)-1) {
+							int start = docRegion.getStartOffset(currentTextRegion);
+							try {
+								if (document.getChar(offsetAtNearEdge) == document.getChar(start)) {
+									fAnchor = ICharacterPairMatcher.RIGHT;
+									match = new Region(start, 1);
+								}
+							}
+							catch (BadLocationException e) {
+								// nothing, not important enough
+							}
+						}
+					}
+				}
+			}
+		}
+		if (match == null && fNextMatcher != null) {
+			fAnchor = -1;
+			match = fNextMatcher.match(document, offset);
+		}
+		return match;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/SourceInfoProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/SourceInfoProvider.java
new file mode 100644
index 0000000..0b7a4f9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/SourceInfoProvider.java
@@ -0,0 +1,42 @@
+package org.eclipse.wst.sse.ui.internal.text;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.IInformationProviderExtension;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class SourceInfoProvider implements IInformationProvider, IInformationProviderExtension  {
+
+	private ITextEditor fEditor;
+
+	public SourceInfoProvider(ITextEditor editor) {
+		fEditor = editor;
+	}
+	public String getInformation(ITextViewer textViewer, IRegion subject) {
+		return getInformation2(textViewer, subject).toString();
+	}
+
+	public IRegion getSubject(ITextViewer textViewer, int offset) {
+		if (textViewer != null && fEditor != null) {
+			IRegion region= WordFinder.findWord(textViewer.getDocument(), offset);
+			if (region != null)
+				return region;
+			else
+				return new Region(offset, 0);
+		}
+		return null;
+	}
+
+	public Object getInformation2(ITextViewer textViewer, IRegion subject) {
+		if (fEditor == null)
+			return null;
+
+		Object selection = fEditor.getSelectionProvider().getSelection();
+		if (selection == null)
+			selection = new Object();
+		return selection;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/WordFinder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/WordFinder.java
new file mode 100644
index 0000000..4e708c5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/text/WordFinder.java
@@ -0,0 +1,53 @@
+package org.eclipse.wst.sse.ui.internal.text;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+
+public class WordFinder {
+
+	/* Copied from org.eclipse.jdt.internal.ui.text.JavaWordFinder */
+	public static IRegion findWord(IDocument document, int offset) {
+
+		int start= -2;
+		int end= -1;
+
+		try {
+			int pos= offset;
+			char c;
+
+			while (pos >= 0) {
+				c= document.getChar(pos);
+				if (!Character.isJavaIdentifierPart(c))
+					break;
+				--pos;
+			}
+			start= pos;
+
+			pos= offset;
+			int length= document.getLength();
+
+			while (pos < length) {
+				c= document.getChar(pos);
+				if (!Character.isJavaIdentifierPart(c))
+					break;
+				++pos;
+			}
+			end= pos;
+
+		} catch (BadLocationException x) {
+		}
+
+		if (start >= -1 && end > -1) {
+			if (start == offset && end == offset)
+				return new Region(offset, 0);
+			else if (start == offset)
+				return new Region(start, end - start);
+			else
+				return new Region(start + 1, end - start - 1);
+		}
+
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ui/OffsetStatusLineContributionItem.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ui/OffsetStatusLineContributionItem.java
new file mode 100644
index 0000000..22504dd
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ui/OffsetStatusLineContributionItem.java
@@ -0,0 +1,1235 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.ui;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.reconciler.IReconcileStep;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Sash;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
+import org.eclipse.ui.texteditor.MarkerUtilities;
+import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
+import org.eclipse.ui.texteditor.StatusLineContributionItem;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.Utilities;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.sse.ui.internal.reconcile.ReconcileAnnotationKey;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+
+import com.ibm.icu.text.NumberFormat;
+
+/**
+ * @author nsd A Status Line contribution intended to display the selected
+ *         offsets in an editor. Double-clicking shows information about
+ *         partitions, document regions, annotations, and selection.
+ */
+public class OffsetStatusLineContributionItem extends StatusLineContributionItem {
+
+	class AnnotationPropertySource implements IPropertySource {
+		Annotation fAnnotation = null;
+		IPropertyDescriptor[] fDescriptors = null;
+		String[] TEMPORARY_ANNOTATION_KEYS = new String[]{"Partition Type", "Step", "Scope", "Offset", "Length", "Description"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+
+		public AnnotationPropertySource(Annotation annotation) {
+			super();
+			fAnnotation = annotation;
+		}
+
+		public Object getEditableValue() {
+			return null;
+		}
+
+		public IPropertyDescriptor[] getPropertyDescriptors() {
+			if (fDescriptors == null) {
+				try {
+					if (fAnnotation instanceof SimpleMarkerAnnotation) {
+						Map attrs = ((SimpleMarkerAnnotation) fAnnotation).getMarker().getAttributes();
+						Object[] keys = attrs.keySet().toArray();
+
+						fDescriptors = new IPropertyDescriptor[keys.length];
+						for (int i = 0; i < keys.length; i++) {
+							TextPropertyDescriptor descriptor = new TextPropertyDescriptor(keys[i].toString(), keys[i].toString());
+							fDescriptors[i] = descriptor;
+						}
+					}
+					else if (fAnnotation instanceof TemporaryAnnotation) {
+						Object key = ((TemporaryAnnotation) fAnnotation).getKey();
+						if (key != null && key instanceof ReconcileAnnotationKey) {
+							String[] keys = TEMPORARY_ANNOTATION_KEYS;
+							fDescriptors = new IPropertyDescriptor[keys.length];
+							for (int i = 0; i < keys.length; i++) {
+								TextPropertyDescriptor descriptor = new TextPropertyDescriptor(keys[i].toString(), keys[i].toString());
+								fDescriptors[i] = descriptor;
+							}
+						}
+					}
+				}
+				catch (CoreException e) {
+					e.printStackTrace();
+				}
+			}
+			if (fDescriptors == null)
+				fDescriptors = new IPropertyDescriptor[0];
+			return fDescriptors;
+		}
+
+		public Object getPropertyValue(Object id) {
+			String value = null;
+			if (fAnnotation instanceof SimpleMarkerAnnotation) {
+				Object o;
+				try {
+					o = ((SimpleMarkerAnnotation) fAnnotation).getMarker().getAttributes().get(id);
+					if (o != null) {
+						value = o.toString();
+					}
+				}
+				catch (CoreException e) {
+				}
+			}
+			else if (fAnnotation instanceof TemporaryAnnotation) {
+				if (TEMPORARY_ANNOTATION_KEYS[0].equals(id)) {
+					Object key = ((TemporaryAnnotation) fAnnotation).getKey();
+					if (key != null && key instanceof ReconcileAnnotationKey) {
+						value = ((ReconcileAnnotationKey) key).getPartitionType();
+					}
+				}
+				else if (TEMPORARY_ANNOTATION_KEYS[1].equals(id)) {
+					Object key = ((TemporaryAnnotation) fAnnotation).getKey();
+					if (key != null && key instanceof ReconcileAnnotationKey) {
+						IReconcileStep step = ((ReconcileAnnotationKey) key).getStep();
+						if (step != null) {
+							value = step.toString();
+						}
+					}
+				}
+				else if (TEMPORARY_ANNOTATION_KEYS[2].equals(id)) {
+					Object key = ((TemporaryAnnotation) fAnnotation).getKey();
+					if (key != null && key instanceof ReconcileAnnotationKey) {
+						int scope = ((ReconcileAnnotationKey) key).getScope();
+						if (scope == ReconcileAnnotationKey.PARTIAL) {
+							value = "PARTIAL"; //$NON-NLS-1$
+						}
+						if (scope == ReconcileAnnotationKey.TOTAL) {
+							value = "TOTAL"; //$NON-NLS-1$
+						}
+					}
+				}
+				else if (TEMPORARY_ANNOTATION_KEYS[3].equals(id)) {
+					IAnnotationModel annotationModel = fTextEditor.getDocumentProvider().getAnnotationModel(fTextEditor.getEditorInput());
+					Position p = annotationModel.getPosition(fAnnotation);
+					if (p != null) {
+						value = String.valueOf(p.getOffset());
+					}
+				}
+				else if (TEMPORARY_ANNOTATION_KEYS[4].equals(id)) {
+					IAnnotationModel annotationModel = fTextEditor.getDocumentProvider().getAnnotationModel(fTextEditor.getEditorInput());
+					Position p = annotationModel.getPosition(fAnnotation);
+					if (p != null) {
+						value = String.valueOf(p.getLength());
+					}
+				}
+				else if (TEMPORARY_ANNOTATION_KEYS[5].equals(id)) {
+					value = ((TemporaryAnnotation) fAnnotation).getDescription();
+				}
+			}
+			return value;
+		}
+
+		public boolean isPropertySet(Object id) {
+			return false;
+		}
+
+		public void resetPropertyValue(Object id) {
+			try {
+				if (fAnnotation instanceof SimpleMarkerAnnotation) {
+					((SimpleMarkerAnnotation) fAnnotation).getMarker().getAttributes().remove(id);
+				}
+				else if (fAnnotation instanceof TemporaryAnnotation) {
+				}
+			}
+			catch (CoreException e) {
+				e.printStackTrace();
+			}
+		}
+
+		public void setPropertyValue(Object id, Object value) {
+			try {
+				if (fAnnotation instanceof SimpleMarkerAnnotation) {
+					((MarkerAnnotation) fAnnotation).getMarker().setAttribute(id.toString(), value);
+				}
+				else if (fAnnotation instanceof TemporaryAnnotation) {
+				}
+			}
+			catch (CoreException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	class InformationDialog extends Dialog {
+
+		IDocument fDocument = fTextEditor.getDocumentProvider().getDocument(fTextEditor.getEditorInput());
+
+		public InformationDialog(Shell parentShell) {
+			super(parentShell);
+			setShellStyle(getShellStyle() | SWT.RESIZE);
+		}
+
+		private void createAnnotationTabContents(Composite annotationsTabComposite) {
+			annotationsTabComposite.setLayout(new GridLayout());
+			annotationsTabComposite.setLayoutData(new GridData());
+
+			final Composite annotationsComposite = new Composite(annotationsTabComposite, SWT.NONE);
+			annotationsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+			final TableViewer annotationsTable = new TableViewer(annotationsComposite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+			annotationsTable.setComparator(new ViewerComparator(new Comparator() {
+				public int compare(Object o1, Object o2) {
+					Annotation annotation1 = (Annotation) o1;
+					Annotation annotation2 = (Annotation) o2;
+					String line1 = getLineNumber(annotation1);
+					String line2 = getLineNumber(annotation2);
+					return Integer.parseInt(line1) - Integer.parseInt(line2);
+				}
+			}));
+			annotationsTable.setContentProvider(new ArrayContentProvider());
+			annotationsTable.getTable().setHeaderVisible(true);
+			annotationsTable.getTable().setLinesVisible(true);
+			String[] columns = new String[]{"Line", "Owner", "Type", "Class", "Message"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+			annotationsTable.setLabelProvider(new ITableLabelProvider() {
+				public void addListener(ILabelProviderListener listener) {
+				}
+
+				public void dispose() {
+				}
+
+				public Image getColumnImage(Object element, int columnIndex) {
+					return null;
+				}
+
+				public String getColumnText(Object element, int columnIndex) {
+					Annotation annotation = (Annotation) element;
+					String text = null;
+					switch (columnIndex) {
+						case 0 :
+							text = getLineNumber(annotation);
+							break;
+						case 1 :
+							text = getOwner(annotation);
+							break;
+						case 2 :
+							text = getType(annotation); //$NON-NLS-1$
+							break;
+						case 3 :
+							text = annotation.getClass().getName();
+							break;
+						case 4 :
+							text = annotation.getText();
+							break;
+					}
+					if (text == null)
+						text = ""; //$NON-NLS-1$
+					return text;
+				}
+
+
+				private String getOwner(Annotation annotation) {
+					String owner = null;
+					if (annotation instanceof MarkerAnnotation) {
+						owner = ((MarkerAnnotation) annotation).getMarker().getAttribute("owner", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$				
+					}
+					else if (annotation instanceof TemporaryAnnotation) {
+						Object key = ((TemporaryAnnotation) annotation).getKey();
+						if (key != null) {
+							if (key instanceof ReconcileAnnotationKey) {
+								key = key.getClass().getName();
+							}
+							if (key != null)
+								owner = key.toString();
+						}
+					}
+					return owner;
+				}
+
+				private String getType(Annotation annotation) {
+					String type = null;
+					if (annotation instanceof MarkerAnnotation) {
+						type = "M:"+MarkerUtilities.getMarkerType(((MarkerAnnotation) annotation).getMarker()); //$NON-NLS-1$
+					}
+					else {
+						type = "A:"+annotation.getType(); //$NON-NLS-1$
+					}
+					if (type == null)
+						type = ""; //$NON-NLS-1$
+					return type;
+				}
+
+				public boolean isLabelProperty(Object element, String property) {
+					return true;
+				}
+
+				public void removeListener(ILabelProviderListener listener) {
+				}
+			});
+
+			TableLayout tlayout = new TableLayout();
+			CellEditor[] cellEditors = new CellEditor[columns.length];
+			int columnWidths[] = new int[]{Display.getCurrent().getBounds().width / 14, Display.getCurrent().getBounds().width / 7, Display.getCurrent().getBounds().width / 7, Display.getCurrent().getBounds().width / 14, Display.getCurrent().getBounds().width / 7};
+			for (int i = 0; i < columns.length; i++) {
+				tlayout.addColumnData(new ColumnWeightData(1));
+				TableColumn tc = new TableColumn(annotationsTable.getTable(), SWT.NONE);
+				tc.setText(columns[i]);
+				tc.setResizable(true);
+				tc.setWidth(columnWidths[i]);
+			}
+			annotationsTable.setCellEditors(cellEditors);
+			annotationsTable.setColumnProperties(columns);
+			List matchingAnnotations = new ArrayList(0);
+			if (fTextEditor != null) {
+				IAnnotationModel annotationModel = fTextEditor.getDocumentProvider().getAnnotationModel(fTextEditor.getEditorInput());
+				if (annotationModel != null) {
+					Iterator iterator = annotationModel.getAnnotationIterator();
+					while (iterator.hasNext()) {
+						Annotation element = (Annotation) iterator.next();
+						if (true) {
+							matchingAnnotations.add(element);
+						}
+					}
+				}
+			}
+			annotationsTable.setSorter(new ViewerSorter());
+			annotationsTable.setInput(matchingAnnotations);
+
+			final Sash sash = new Sash(annotationsComposite, SWT.HORIZONTAL);
+
+			final PropertySheetPage propertySheet = new PropertySheetPage();
+			propertySheet.createControl(annotationsComposite);
+			propertySheet.setPropertySourceProvider(new IPropertySourceProvider() {
+				public IPropertySource getPropertySource(Object object) {
+					if (object instanceof Annotation) {
+						IPropertySource annotationPropertySource = new AnnotationPropertySource(((Annotation) object));
+						return annotationPropertySource;
+					}
+					return null;
+				}
+			});
+
+			annotationsTable.addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					propertySheet.selectionChanged(null, event.getSelection());
+				}
+			});
+
+			final FormLayout form = new FormLayout();
+			annotationsComposite.setLayout(form);
+
+			FormData tableData = new FormData();
+			tableData.top = new FormAttachment(0, 0);
+			tableData.bottom = new FormAttachment(sash, 2);
+			tableData.left = new FormAttachment(0, 0);
+			tableData.right = new FormAttachment(100, 0);
+			annotationsTable.getControl().setLayoutData(tableData);
+
+			FormData propertiesData = new FormData();
+			propertiesData.top = new FormAttachment(sash, 2);
+			propertiesData.left = new FormAttachment(0, 0);
+			propertiesData.right = new FormAttachment(100, 0);
+			propertiesData.bottom = new FormAttachment(100, 0);
+			propertySheet.getControl().setLayoutData(propertiesData);
+
+			final FormData sashData = new FormData();
+			sashData.top = new FormAttachment(60, 0);
+			sashData.left = new FormAttachment(0, 0);
+			sashData.right = new FormAttachment(100, 0);
+			sash.setLayoutData(sashData);
+			sash.addListener(SWT.Selection, new org.eclipse.swt.widgets.Listener() {
+				public void handleEvent(Event e) {
+					sashData.top = new FormAttachment(0, e.y);
+					annotationsComposite.layout();
+				}
+			});
+			annotationsComposite.pack(true);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+		 */
+		protected Control createDialogArea(Composite parent) {
+			ISelection selection = fTextEditor.getSelectionProvider().getSelection();
+			ITextSelection textSelection = (ITextSelection) selection;
+			IStructuredSelection structuredSelection = null;
+			if (selection instanceof IStructuredSelection)
+				structuredSelection = (IStructuredSelection) selection;
+
+			parent.getShell().setText(SSEUIMessages.OffsetStatusLineContributionItem_0 + textSelection.getOffset() + "-" + (textSelection.getOffset() + textSelection.getLength())); //$NON-NLS-1$ //$NON-NLS-2$
+			Composite composite = (Composite) super.createDialogArea(parent);
+
+			Text documentTypeLabel = new Text(composite, SWT.SINGLE | SWT.READ_ONLY);
+			GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+			gd.horizontalSpan = 2;
+			documentTypeLabel.setLayoutData(gd);
+			documentTypeLabel.setText(SSEUIMessages.OffsetStatusLineContributionItem_6 + fDocument.getClass().getName()); //$NON-NLS-1$
+
+			Text documentProviderLabel = new Text(composite, SWT.SINGLE | SWT.READ_ONLY);
+			gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+			gd.horizontalSpan = 2;
+			documentProviderLabel.setLayoutData(gd);
+			documentProviderLabel.setText(SSEUIMessages.OffsetStatusLineContributionItem_7 + fTextEditor.getDocumentProvider().getClass().getName()); //$NON-NLS-1$
+
+			Text editorInputLabel = new Text(composite, SWT.SINGLE | SWT.READ_ONLY);
+			gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+			gd.horizontalSpan = 2;
+			editorInputLabel.setLayoutData(gd);
+			editorInputLabel.setText(SSEUIMessages.OffsetStatusLineContributionItem_12 + fTextEditor.getEditorInput().getClass().getName()); //$NON-NLS-1$
+
+			final Text bomLabel = new Text(composite, SWT.SINGLE | SWT.READ_ONLY);
+			gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+			gd.horizontalSpan = 2;
+			bomLabel.setLayoutData(gd);
+			bomLabel.setEnabled(false);
+			bomLabel.setText("Byte Order Mark: ");
+
+			IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
+			if (model != null) {
+				Text modelIdLabel = new Text(composite, SWT.SINGLE | SWT.READ_ONLY);
+				gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+				gd.horizontalSpan = 2;
+				modelIdLabel.setLayoutData(gd);
+				modelIdLabel.setText("ID: " + model.getId()); //$NON-NLS-1$
+
+				Text modelBaseLocationLabel = new Text(composite, SWT.SINGLE | SWT.READ_ONLY);
+				gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+				gd.horizontalSpan = 2;
+				modelBaseLocationLabel.setLayoutData(gd);
+				modelBaseLocationLabel.setText("Base Location: " + model.getBaseLocation()); //$NON-NLS-1$
+
+				Text modelContentTypeLabel = new Text(composite, SWT.SINGLE | SWT.READ_ONLY);
+				gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+				gd.horizontalSpan = 2;
+				modelContentTypeLabel.setLayoutData(gd);
+				modelContentTypeLabel.setText(SSEUIMessages.OffsetStatusLineContributionItem_4 + model.getContentTypeIdentifier()); //$NON-NLS-1$
+
+				Text modelHandlerContentTypeLabel = new Text(composite, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
+				gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+				gd.horizontalSpan = 2;
+				modelHandlerContentTypeLabel.setLayoutData(gd);
+				modelHandlerContentTypeLabel.setText(SSEUIMessages.OffsetStatusLineContributionItem_5 + model.getModelHandler().getAssociatedContentTypeId() + " (" + model.getModelHandler() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+				final Text counts = new Text(composite, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
+				gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+				gd.horizontalSpan = 2;
+				counts.setLayoutData(gd);
+				counts.setText("Counting...");
+				counts.setEnabled(false);
+				final IStructuredModel finalModel = model;
+				final Display display = Display.getCurrent();
+				Job counter = new Job("Counting regions") {
+					protected IStatus run(IProgressMonitor monitor) {
+						IStructuredDocumentRegion[] structuredDocumentRegions = finalModel.getStructuredDocument().getStructuredDocumentRegions();
+						int length = finalModel.getStructuredDocument().getLength();
+						int regionCount = 0;
+						for (int i = 0; i < structuredDocumentRegions.length; i++) {
+							regionCount += structuredDocumentRegions[i].getNumberOfRegions();
+						}
+						NumberFormat formatter = NumberFormat.getIntegerInstance();
+						final String regioncount = "Count: " + formatter.format(structuredDocumentRegions.length) + " document regions containing " + formatter.format(regionCount) + " text regions representing " + formatter.format(length) + " characters";//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+						display.asyncExec(new Runnable() {
+							public void run() {
+								if (!counts.isDisposed()) {
+									counts.setText(regioncount);
+									counts.setEnabled(true);
+								}
+								if (!bomLabel.isDisposed()) {
+									bomLabel.setText("Byte Order Mark: " + getBOMText(fTextEditor.getEditorInput())); //$NON-NLS-1$
+									bomLabel.setEnabled(true);
+								}
+							}
+						});
+						return Status.OK_STATUS;
+					}
+				};
+				counter.schedule(1000);
+
+				Label blankRow = new Label(composite, SWT.NONE);
+				gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+				gd.horizontalSpan = 2;
+				blankRow.setLayoutData(gd);
+			}
+			if (model != null) {
+				model.releaseFromRead();
+			}
+
+			TabFolder tabfolder = new TabFolder(composite, SWT.NONE);
+			tabfolder.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+			TabItem partitionTab = new TabItem(tabfolder, SWT.BORDER);
+			partitionTab.setText(SSEUIMessages.OffsetStatusLineContributionItem_2); //$NON-NLS-1$
+			SashForm partitions = new SashForm(tabfolder, SWT.NONE);
+			partitions.setOrientation(SWT.VERTICAL);
+			partitionTab.setControl(partitions);
+			createPartitionTabContents(partitions);
+			partitions.setWeights(new int[]{2, 1});
+
+			TabItem annotationsTab = new TabItem(tabfolder, SWT.BORDER);
+			annotationsTab.setText("Annotations"); //$NON-NLS-1$
+			Composite annotations = new Composite(tabfolder, SWT.NONE);
+			annotationsTab.setControl(annotations);
+			createAnnotationTabContents(annotations);
+
+			// only create the ITextRegions tab for IStructuredDocuments
+			if (fDocument instanceof IStructuredDocument) {
+				TabItem regionTab = new TabItem(tabfolder, SWT.BORDER);
+				regionTab.setText(SSEUIMessages.OffsetStatusLineContributionItem_3); //$NON-NLS-1$
+				SashForm regions = new SashForm(tabfolder, SWT.NONE);
+				regions.setOrientation(SWT.HORIZONTAL);
+				regionTab.setControl(regions);
+				createRegionTabContents(regions);
+				regions.setWeights(new int[]{3, 2});
+			}
+
+			if (structuredSelection != null) {
+				TabItem editorSelectionTab = new TabItem(tabfolder, SWT.BORDER);
+				editorSelectionTab.setText(SSEUIMessages.OffsetStatusLineContributionItem_14);
+				Composite editorSelectionComposite = new Composite(tabfolder, SWT.NONE);
+				editorSelectionTab.setControl(editorSelectionComposite);
+				fillSelectionTabContents(editorSelectionComposite, structuredSelection.toList(), "Class: " + structuredSelection.getClass().getName()); //$NON-NLS-1$
+			}
+
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
+			if (model != null) {
+				TabItem overlappingIndexedRegionsTab = new TabItem(tabfolder, SWT.BORDER);
+				overlappingIndexedRegionsTab.setText(SSEUIMessages.OffsetStatusLineContributionItem_20);
+				Composite overlappingIndexedRegionsTabComposite = new Composite(tabfolder, SWT.NONE);
+				overlappingIndexedRegionsTab.setControl(overlappingIndexedRegionsTabComposite);
+				fillSelectionTabContents(overlappingIndexedRegionsTabComposite, getIndexedRegions(textSelection), "All IndexedRegions overlapping text selection"); //$NON-NLS-1$
+				model.releaseFromRead();
+			}
+
+			IEditorSite site = fTextEditor.getEditorSite();
+			if (site != null) {
+				IWorkbenchWindow window = site.getWorkbenchWindow();
+				if (window != null) {
+					ISelectionService service = window.getSelectionService();
+					ISelection selectionFromService = service.getSelection();
+					if (service != null && !selectionFromService.equals(structuredSelection) && selectionFromService instanceof IStructuredSelection) {
+						TabItem selectionServiceTab = new TabItem(tabfolder, SWT.BORDER);
+						selectionServiceTab.setText(SSEUIMessages.OffsetStatusLineContributionItem_19);
+						Composite selectionServiceComposite = new Composite(tabfolder, SWT.NONE);
+						selectionServiceTab.setControl(selectionServiceComposite);
+						fillSelectionTabContents(selectionServiceComposite, ((IStructuredSelection) selectionFromService).toList(), "Class: " + selectionFromService.getClass().getName()); //$NON-NLS-1$
+					}
+				}
+			}
+
+			return composite;
+		}
+
+		/**
+		 * @param editorInput
+		 * @return
+		 */
+		private String getBOMText(IEditorInput editorInput) {
+			IFile file = (IFile) editorInput.getAdapter(IFile.class);
+			String detectedBOM = "none"; //$NON-NLS-1$
+			if (file != null) {
+				InputStream s = null;
+				try {
+					s = file.getContents(true);
+					if (s != null) {
+						int b1 = s.read() & 0xFF;
+						int b2 = s.read() & 0xFF;
+						if (b1 == 0xFE && b2 == 0xFF) {
+							detectedBOM = "FE FF (UTF-16BE)"; //$NON-NLS-1$
+						}
+						else if (b1 == 0xFF && b2 == 0xFE) {
+							detectedBOM = "FF FE (UTF-16LE)"; //$NON-NLS-1$
+						}
+						else {
+							int b3 = s.read() & 0xFF;
+							if (b1 == 0xEF && b2 == 0xBB && b3 == 0xBF) {
+								detectedBOM = "EF BB BF (UTF-8)"; //$NON-NLS-1$
+							}
+						}
+					}
+				}
+				catch (Exception e) {
+					detectedBOM = e.getMessage();
+				}
+				finally {
+					if (s != null)
+						try {
+							s.close();
+						}
+						catch (IOException e) {
+						}
+				}
+			}
+			else {
+				detectedBOM = "N/A"; //$NON-NLS-1$
+			}
+			return detectedBOM;
+		}
+
+		private List getIndexedRegions(ITextSelection textSelection) {
+			Set overlappingIndexedRegions = new HashSet(2);
+			int start = textSelection.getOffset();
+			int end = start + textSelection.getLength();
+			IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
+			if (model != null) {
+				for (int i = start; i <= end; i++) {
+					IndexedRegion r = model.getIndexedRegion(i);
+					if (r != null) {
+						overlappingIndexedRegions.add(r);
+					}
+				}
+				model.releaseFromRead();
+			}
+
+			return Arrays.asList(overlappingIndexedRegions.toArray());
+		}
+
+		/**
+		 * @param sash
+		 */
+		private void createPartitionTabContents(SashForm sash) {
+			Composite partioningComposite = new Composite(sash, SWT.NONE);
+			partioningComposite.setLayout(new GridLayout(2, false));
+			partioningComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+			Label label = new Label(partioningComposite, SWT.SINGLE);
+			label.setText(SSEUIMessages.OffsetStatusLineContributionItem_8); //$NON-NLS-1$
+			label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+			final Combo partitioningCombo = new Combo(partioningComposite, SWT.READ_ONLY);
+			partitioningCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+			final Label partitionerInstanceLabel = new Label(partioningComposite, SWT.SINGLE);
+			GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+			gd.horizontalSpan = 2;
+			partitionerInstanceLabel.setLayoutData(gd);
+
+			final TableViewer fPartitionTable = new TableViewer(partioningComposite, SWT.FULL_SELECTION);
+			gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+			gd.horizontalSpan = 2;
+			fPartitionTable.getControl().setLayoutData(gd);
+			fPartitionTable.setContentProvider(new ArrayContentProvider());
+			fPartitionTable.getTable().setHeaderVisible(true);
+			fPartitionTable.getTable().setLinesVisible(true);
+			String[] columns = new String[]{SSEUIMessages.OffsetStatusLineContributionItem_9, SSEUIMessages.OffsetStatusLineContributionItem_10, SSEUIMessages.OffsetStatusLineContributionItem_11}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			fPartitionTable.setLabelProvider(new ITableLabelProvider() {
+				public void addListener(ILabelProviderListener listener) {
+				}
+
+				public void dispose() {
+				}
+
+				public Image getColumnImage(Object element, int columnIndex) {
+					return null;
+				}
+
+				public String getColumnText(Object element, int columnIndex) {
+					ITypedRegion partition = (ITypedRegion) element;
+					String text = null;
+					switch (columnIndex) {
+						case 0 :
+							text = Integer.toString(partition.getOffset());
+							break;
+						case 1 :
+							text = Integer.toString(partition.getLength());
+							break;
+						case 2 :
+							text = partition.getType();
+							break;
+					}
+					if (text == null)
+						text = ""; //$NON-NLS-1$
+					return text;
+				}
+
+				public boolean isLabelProperty(Object element, String property) {
+					return false;
+				}
+
+				public void removeListener(ILabelProviderListener listener) {
+				}
+			});
+			TableLayout tlayout = new TableLayout();
+			CellEditor[] cellEditors = new CellEditor[columns.length];
+			int columnWidths[] = new int[]{Display.getCurrent().getBounds().width / 14, Display.getCurrent().getBounds().width / 14, Display.getCurrent().getBounds().width / 5};
+			for (int i = 0; i < columns.length; i++) {
+				tlayout.addColumnData(new ColumnWeightData(1));
+				TableColumn tc = new TableColumn(fPartitionTable.getTable(), SWT.NONE);
+				tc.setText(columns[i]);
+				tc.setResizable(true);
+				tc.setWidth(columnWidths[i]);
+			}
+			fPartitionTable.setCellEditors(cellEditors);
+			fPartitionTable.setColumnProperties(columns);
+			final String[] partitionings = (fDocument instanceof IDocumentExtension3) ? ((IDocumentExtension3) fDocument).getPartitionings() : new String[]{IDocumentExtension3.DEFAULT_PARTITIONING};
+			partitioningCombo.setItems(partitionings);
+			partitioningCombo.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					ISelection sel = fTextEditor.getSelectionProvider().getSelection();
+					ITextSelection textSelection = (ITextSelection) sel;
+					try {
+						String partitionerText = fDocument instanceof IDocumentExtension3 ? ((IDocumentExtension3) fDocument).getDocumentPartitioner(partitioningCombo.getItem(partitioningCombo.getSelectionIndex())).toString() : ("" + fDocument.getDocumentPartitioner()); //$NON-NLS-1$
+						partitionerInstanceLabel.setText(SSEUIMessages.OffsetStatusLineContributionItem_13 + partitionerText); //$NON-NLS-1$
+						fPartitionTable.setInput(TextUtilities.computePartitioning(fDocument, partitioningCombo.getItem(partitioningCombo.getSelectionIndex()), textSelection.getOffset(), textSelection.getLength(), true));
+					}
+					catch (BadLocationException e1) {
+						fPartitionTable.setInput(new ITypedRegion[0]);
+					}
+				}
+			});
+			try {
+				if (partitionings.length > 0) {
+					String selectedPartitioning = partitioningCombo.getItem(0);
+					if (Utilities.contains(partitionings, IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING)) {
+						selectedPartitioning = IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING;
+						for (int i = 0; i < partitionings.length; i++) {
+							if (partitionings[i].equals(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING)) {
+								partitioningCombo.select(i);
+							}
+						}
+					}
+					else {
+						partitioningCombo.select(0);
+					}
+					ISelection sel = fTextEditor.getSelectionProvider().getSelection();
+					ITextSelection textSelection = (ITextSelection) sel;
+					ITypedRegion[] partitions = TextUtilities.computePartitioning(fDocument, selectedPartitioning, textSelection.getOffset(), textSelection.getLength(), true);
+					fPartitionTable.setInput(partitions);
+					String partitionerText = fDocument instanceof IDocumentExtension3 ? ((IDocumentExtension3) fDocument).getDocumentPartitioner(partitioningCombo.getItem(partitioningCombo.getSelectionIndex())).toString() : ("" + fDocument.getDocumentPartitioner()); //$NON-NLS-1$
+					partitionerInstanceLabel.setText(SSEUIMessages.OffsetStatusLineContributionItem_13 + partitionerText); //$NON-NLS-1$
+				}
+				else {
+					ISelection sel = fTextEditor.getSelectionProvider().getSelection();
+					ITextSelection textSelection = (ITextSelection) sel;
+					fPartitionTable.setInput(fDocument.computePartitioning(textSelection.getOffset(), textSelection.getLength()));
+				}
+			}
+			catch (BadLocationException e1) {
+				fPartitionTable.setInput(new ITypedRegion[0]);
+			}
+			partitioningCombo.setFocus();
+
+
+			final StyledText text = new StyledText(sash, SWT.MULTI | SWT.READ_ONLY);
+			fPartitionTable.addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					if (event.getSelection() instanceof IStructuredSelection) {
+						IRegion partition = (IRegion) ((IStructuredSelection) event.getSelection()).getFirstElement();
+						IDocument document = fTextEditor.getDocumentProvider().getDocument(fTextEditor.getEditorInput());
+						String source;
+						try {
+							source = document.get(partition.getOffset(), partition.getLength());
+							text.setEnabled(true);
+							text.setText(source);
+						}
+						catch (BadLocationException e) {
+							e.printStackTrace();
+						}
+					}
+				}
+			});
+			text.setEnabled(false);
+		}
+
+		/**
+		 * @param composite
+		 * @return
+		 */
+		private Composite createRegionTabContents(SashForm sashForm) {
+			ISelection sel = fTextEditor.getSelectionProvider().getSelection();
+			final ITextSelection textSelection = (ITextSelection) sel;
+			final List documentRegions = new ArrayList();
+			if (fDocument instanceof IStructuredDocument) {
+				IStructuredDocument structuredDocument = (IStructuredDocument) fDocument;
+				int pos = textSelection.getOffset();
+				int end = textSelection.getOffset() + textSelection.getLength();
+				IStructuredDocumentRegion docRegion = structuredDocument.getRegionAtCharacterOffset(pos);
+				IStructuredDocumentRegion endRegion = structuredDocument.getRegionAtCharacterOffset(end);
+				if (pos < end) {
+					while (docRegion != endRegion) {
+						documentRegions.add(docRegion);
+						docRegion = docRegion.getNext();
+					}
+				}
+				documentRegions.add(docRegion);
+			}
+
+			final TreeViewer tree = new TreeViewer(sashForm, SWT.V_SCROLL | SWT.H_SCROLL);
+			final String START = SSEUIMessages.OffsetStatusLineContributionItem_15; //$NON-NLS-1$
+			final String LENGTH = SSEUIMessages.OffsetStatusLineContributionItem_16; //$NON-NLS-1$
+			final String TEXTLENGTH = SSEUIMessages.OffsetStatusLineContributionItem_17; //$NON-NLS-1$
+			final String CONTEXT = SSEUIMessages.OffsetStatusLineContributionItem_18; //$NON-NLS-1$
+			tree.setContentProvider(new ITreeContentProvider() {
+				public void dispose() {
+				}
+
+				public Object[] getChildren(Object parentElement) {
+					List children = new ArrayList(0);
+					if (parentElement instanceof ITextSelection) {
+						children.addAll(documentRegions);
+					}
+					if (parentElement instanceof ITextRegionCollection) {
+						children.add(((ITextRegionCollection) parentElement).getRegions().toArray());
+					}
+					if (parentElement instanceof ITextRegion) {
+						children.add(new KeyValuePair(CONTEXT, ((ITextRegion) parentElement).getType()));
+						children.add(new KeyValuePair(START, Integer.toString(((ITextRegion) parentElement).getStart())));
+						children.add(new KeyValuePair(TEXTLENGTH, Integer.toString(((ITextRegion) parentElement).getTextLength())));
+						children.add(new KeyValuePair(LENGTH, Integer.toString(((ITextRegion) parentElement).getLength())));
+					}
+					if (parentElement instanceof ITextRegionList) {
+						children.add(Arrays.asList(((ITextRegionList) parentElement).toArray()));
+					}
+					if (parentElement instanceof Collection) {
+						children.addAll((Collection) parentElement);
+					}
+					if (parentElement instanceof Object[]) {
+						children.addAll(Arrays.asList((Object[]) parentElement));
+					}
+					return children.toArray();
+				}
+
+				public Object[] getElements(Object inputElement) {
+					return documentRegions.toArray();
+				}
+
+				public Object getParent(Object element) {
+					if (element instanceof IStructuredDocumentRegion)
+						return ((IStructuredDocumentRegion) element).getParentDocument();
+					if (element instanceof ITextRegionContainer) {
+						return ((ITextRegionContainer) element).getParent();
+					}
+					return fDocument;
+				}
+
+				public boolean hasChildren(Object element) {
+					return !(element instanceof KeyValuePair);
+				}
+
+				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+				}
+			});
+			tree.setLabelProvider(new LabelProvider() {
+				public String getText(Object element) {
+					if (element instanceof KeyValuePair)
+						return ((KeyValuePair) element).fKey.toString().toLowerCase() + ": " + ((KeyValuePair) element).fValue; //$NON-NLS-1$
+					if (element instanceof IStructuredDocumentRegion) {
+						IStructuredDocumentRegion documentRegion = (IStructuredDocumentRegion) element;
+						int packageNameLength = documentRegion.getClass().getPackage().getName().length();
+						if (packageNameLength > 0)
+							packageNameLength++;
+						String name = documentRegion.getClass().getName().substring(packageNameLength);
+						String text = "[" + documentRegion.getStartOffset() + "-" + documentRegion.getEndOffset() + "] " + name + "@" + element.hashCode() + " " + documentRegion.getType(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+						return text;
+					}
+					if (element instanceof ITextRegion) {
+						ITextRegion textRegion = (ITextRegion) element;
+						int packageNameLength = textRegion.getClass().getPackage().getName().length();
+						if (packageNameLength > 0)
+							packageNameLength++;
+						String name = textRegion.getClass().getName().substring(packageNameLength);
+						String text = "[" + textRegion.getStart() + "-" + textRegion.getEnd() + "] " + name + "@" + element.hashCode() + " " + textRegion.getType(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+						return text;
+					}
+					return super.getText(element);
+				}
+			});
+			tree.setInput(fDocument);
+
+
+			final Text displayText = new Text(sashForm, SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY | SWT.BORDER);
+			displayText.setBackground(sashForm.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+			tree.addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					if (event.getSelection() instanceof IStructuredSelection) {
+						Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
+						if (o instanceof KeyValuePair)
+							displayText.setText(((KeyValuePair) o).fValue.toString());
+						else if (o instanceof ITextSelection) {
+							ITextSelection text = (ITextSelection) o;
+							try {
+								displayText.setText(fDocument.get(text.getOffset(), text.getLength()));
+							}
+							catch (BadLocationException e) {
+								displayText.setText(""); //$NON-NLS-1$
+							}
+						}
+						else if (o instanceof ITextRegionCollection) {
+							ITextRegionCollection region = (ITextRegionCollection) o;
+							displayText.setText(region.getFullText());
+						}
+						else
+							displayText.setText("" + o); //$NON-NLS-1$
+					}
+				}
+			});
+			return sashForm;
+		}
+
+		private void fillSelectionTabContents(Composite area, List selection, String description) {
+			area.setLayout(new GridLayout());
+			area.setLayoutData(new GridData());
+
+			Label typeName = new Label(area, SWT.WRAP);
+			typeName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+			typeName.setText(description); //$NON-NLS-1$
+
+			(new Label(area, SWT.NONE)).setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+			SashForm structuredSashForm = new SashForm(area, SWT.NONE);
+			structuredSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+			structuredSashForm.setOrientation(SWT.VERTICAL);
+
+			final TableViewer structuredSelectionTable = new TableViewer(structuredSashForm, SWT.FULL_SELECTION | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+
+			structuredSelectionTable.getTable().setHeaderVisible(true);
+			structuredSelectionTable.getTable().setLinesVisible(true);
+			structuredSelectionTable.setSorter(new ViewerSorter() {
+				public int category(Object element) {
+					if (element instanceof IndexedRegion)
+						return ((IndexedRegion) element).getStartOffset();
+					return super.category(element);
+				}
+			});
+
+			structuredSelectionTable.setLabelProvider(new ITableLabelProvider() {
+				public void addListener(ILabelProviderListener listener) {
+				}
+
+				public void dispose() {
+				}
+
+				public Image getColumnImage(Object element, int columnIndex) {
+					if (element instanceof INodeNotifier) {
+						INodeAdapter adapterFor = ((INodeNotifier) element).getAdapterFor(IJFaceNodeAdapter.class);
+						if (columnIndex == 2 && adapterFor != null && adapterFor instanceof IJFaceNodeAdapter) {
+							IJFaceNodeAdapter adapter = (IJFaceNodeAdapter) adapterFor;
+							return adapter.getLabelImage((element));
+						}
+					}
+					return null;
+				}
+
+				public String getColumnText(Object element, int columnIndex) {
+					String text = null;
+					if (element != null) {
+						switch (columnIndex) {
+							case 0 : {
+								text = String.valueOf(((List) structuredSelectionTable.getInput()).indexOf(element));
+							}
+								break;
+							case 1 : {
+								text = element.getClass().getName();
+							}
+								break;
+							case 2 : {
+								text = StringUtils.firstLineOf(element.toString());
+							}
+								break;
+							default :
+								text = ""; //$NON-NLS-1$
+						}
+					}
+					return text;
+				}
+
+				public boolean isLabelProperty(Object element, String property) {
+					return false;
+				}
+
+				public void removeListener(ILabelProviderListener listener) {
+				}
+			});
+
+			TableLayout tlayout = new TableLayout();
+			tlayout.addColumnData(new ColumnWeightData(7, true));
+			tlayout.addColumnData(new ColumnWeightData(28, true));
+			tlayout.addColumnData(new ColumnWeightData(50, true));
+			structuredSelectionTable.getTable().setLayout(tlayout);
+
+			TableColumn tc = new TableColumn(structuredSelectionTable.getTable(), SWT.NONE);
+			tc.setText("Item"); //$NON-NLS-1$
+			tc.setResizable(true);
+			tc.setWidth(40);
+
+			tc = new TableColumn(structuredSelectionTable.getTable(), SWT.NONE);
+			tc.setText("Class"); //$NON-NLS-1$
+			tc.setResizable(true);
+			tc.setWidth(40);
+
+			tc = new TableColumn(structuredSelectionTable.getTable(), SWT.NONE);
+			tc.setText("Value"); //$NON-NLS-1$
+			tc.setResizable(true);
+			tc.setWidth(40);
+
+			structuredSelectionTable.setContentProvider(new ArrayContentProvider());
+			final List input = selection;
+			structuredSelectionTable.setInput(input);
+
+			final TreeViewer infoTree = new TreeViewer(structuredSashForm, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+			infoTree.setLabelProvider(new LabelProvider() {
+				public Image getImage(Object element) {
+					if (element instanceof TreeViewer && infoTree.getInput() instanceof INodeNotifier) {
+						INodeAdapter adapterFor = ((INodeNotifier) infoTree.getInput()).getAdapterFor(IJFaceNodeAdapter.class);
+						if (adapterFor != null && adapterFor instanceof IJFaceNodeAdapter) {
+							IJFaceNodeAdapter adapter = (IJFaceNodeAdapter) adapterFor;
+							return adapter.getLabelImage((infoTree.getInput()));
+						}
+					}
+					return super.getImage(element);
+				}
+
+				public String getText(Object element) {
+					if (element instanceof Class) {
+						return "Class: " + ((Class) element).getName(); //$NON-NLS-1$
+					}
+					if (element instanceof Collection) {
+						return "Registered Adapters:"; //$NON-NLS-1$
+					}
+					if (element instanceof IRegion) {
+						return "Indexed Region offset span: [" + ((IRegion) element).getOffset() + "-" + ((IRegion) element).getLength() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					}
+					if (element instanceof TreeViewer && infoTree.getInput() instanceof INodeNotifier) {
+						IJFaceNodeAdapter adapter = (IJFaceNodeAdapter) ((INodeNotifier) infoTree.getInput()).getAdapterFor(IJFaceNodeAdapter.class);
+						if (adapter != null) {
+							return adapter.getLabelText((infoTree.getInput()));
+						}
+					}
+					return super.getText(element);
+				}
+			});
+			infoTree.setContentProvider(new ITreeContentProvider() {
+				public void dispose() {
+				}
+
+				public Object[] getChildren(Object parentElement) {
+					if (parentElement instanceof Collection)
+						return ((Collection) parentElement).toArray();
+					return new Object[0];
+				}
+
+				public Object[] getElements(Object inputElement) {
+					List elements = new ArrayList(4);
+					if (inputElement != null) {
+						if (inputElement instanceof INodeNotifier && ((INodeNotifier) inputElement).getAdapterFor(IJFaceNodeAdapter.class) != null) {
+							elements.add(infoTree);
+						}
+						elements.add(inputElement.getClass());
+						if (inputElement instanceof IndexedRegion) {
+							elements.add(new Region(((IndexedRegion) inputElement).getStartOffset(), ((IndexedRegion) inputElement).getEndOffset()));
+						}
+						if (inputElement instanceof INodeNotifier) {
+							elements.add(((INodeNotifier) inputElement).getAdapters());
+						}
+					}
+					return elements.toArray();
+				}
+
+				public Object getParent(Object element) {
+					return null;
+				}
+
+				public boolean hasChildren(Object element) {
+					return element instanceof Collection;
+				}
+
+				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+				}
+			});
+
+			structuredSelectionTable.addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					int selectionIndex = structuredSelectionTable.getTable().getSelectionIndex();
+					if (selectionIndex != -1) {
+						infoTree.setInput(structuredSelectionTable.getElementAt(selectionIndex));
+					}
+					else {
+						infoTree.setInput(event.getSelectionProvider().getSelection());
+					}
+					infoTree.expandToLevel(2);
+				}
+			});
+
+			structuredSashForm.setWeights(new int[]{3, 2});
+		}
+
+		private String getLineNumber(Annotation annotation) {
+			int line = -1;
+			if (annotation instanceof MarkerAnnotation) {
+				line = MarkerUtilities.getLineNumber(((MarkerAnnotation) annotation).getMarker());//$NON-NLS-1$
+			}
+			else {
+				IAnnotationModel annotationModel = fTextEditor.getDocumentProvider().getAnnotationModel(fTextEditor.getEditorInput());
+				Position p = annotationModel.getPosition(annotation);
+				if (p != null && !p.isDeleted()) {
+					try {
+						// don't forget the +1
+						line = fDocument.getLineOfOffset(p.getOffset()) + 1;
+					}
+					catch (BadLocationException e) {
+						return e.getMessage();
+					}
+				}
+			}
+			return Integer.toString(line);
+		}
+	}
+
+	static class KeyValuePair {
+		Object fKey;
+		String fValue;
+
+		public KeyValuePair(Object key, String value) {
+			fKey = key;
+			fValue = value;
+		}
+	}
+
+	class ShowEditorInformationAction extends Action {
+		public ShowEditorInformationAction() {
+			super();
+		}
+
+		public void run() {
+			/**
+			 * TODO: Provide a more useful control, maybe a table where the
+			 * selection shows you the partition's text in a StyledText pane
+			 * beneath it.
+			 */
+			super.run();
+			new InformationDialog(((Control) fTextEditor.getAdapter(Control.class)).getShell()).open();
+		}
+	}
+
+	IAction fShowEditorInformationAction = new ShowEditorInformationAction();
+
+	ITextEditor fTextEditor = null;
+
+	/**
+	 * @param id
+	 */
+	public OffsetStatusLineContributionItem(String id) {
+		super(id);
+		setToolTipText("Double-click for more information");
+	}
+
+	/**
+	 * @param id
+	 * @param visible
+	 * @param widthInChars
+	 */
+	public OffsetStatusLineContributionItem(String id, boolean visible, int widthInChars) {
+		super(id, visible, widthInChars);
+		setToolTipText("Double-click for more information");
+	}
+
+	public void setActiveEditor(ITextEditor textEditor) {
+		fTextEditor = textEditor;
+		setActionHandler(fShowEditorInformationAction);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ui/StructuredTextAnnotationImageProvider.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ui/StructuredTextAnnotationImageProvider.java
new file mode 100644
index 0000000..4d4923a
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ui/StructuredTextAnnotationImageProvider.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.texteditor.IAnnotationImageProvider;
+
+/**
+ * Image provider for structured text editor annotations.
+ * 
+ * @author pavery
+ */
+public class StructuredTextAnnotationImageProvider implements IAnnotationImageProvider {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getImageDescriptor(java.lang.String)
+	 */
+	public ImageDescriptor getImageDescriptor(String imageDescritporId) {
+		return null;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getImageDescriptorId(org.eclipse.jface.text.source.Annotation)
+	 */
+	public String getImageDescriptorId(Annotation annotation) {
+        return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getManagedImage(org.eclipse.jface.text.source.Annotation)
+	 */
+	public Image getManagedImage(Annotation annotation) {
+		// future return different types of managed images as JDT does
+		// eg. overlay icon images, "grayed" images, quick fixable, etc...
+		return null;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/Assert.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/Assert.java
new file mode 100644
index 0000000..d04eaed
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/Assert.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.util;
+
+
+/**
+ * <code>Assert</code> is useful for for embedding runtime sanity checks in
+ * code. The predicate methods all test a condition and throw some type of
+ * unchecked exception if the condition does not hold.
+ * <p>
+ * Assertion failure exceptions, like most runtime exceptions, are thrown when
+ * something is misbehaving. Assertion failures are invariably unspecified
+ * behavior; consequently, clients should never rely on these being thrown
+ * (and certainly should not being catching them specifically).
+ * </p>
+ */
+public final class Assert {
+
+	/**
+	 * <code>AssertionFailedException</code> is a runtime exception thrown
+	 * by some of the methods in <code>Assert</code>.
+	 * <p>
+	 * This class is not declared public to prevent some misuses; programs
+	 * that catch or otherwise depend on assertion failures are susceptible to
+	 * unexpected breakage when assertions in the code are added or removed.
+	 * </p>
+	 */
+	class AssertionFailedException extends RuntimeException {
+		/**
+		 * Comment for <code>serialVersionUID</code>
+		 */
+		private static final long serialVersionUID = 1L;
+
+		/**
+		 * Constructs a new exception.
+		 */
+		public AssertionFailedException() {
+			super();
+		}
+
+		/**
+		 * Constructs a new exception with the given message.
+		 */
+		public AssertionFailedException(String detail) {
+			super(detail);
+		}
+	}
+
+	/**
+	 * Asserts that an argument is legal. If the given boolean is not
+	 * <code>true</code>, an <code>IllegalArgumentException</code> is
+	 * thrown. The given message is included in that exception, to aid
+	 * debugging.
+	 * 
+	 * @param expression
+	 *            the outcode of the check
+	 * @param message
+	 *            the message to include in the exception
+	 * @return <code>true</code> if the check passes (does not return if the
+	 *         check fails)
+	 * @exception IllegalArgumentException
+	 *                if the legality test failed
+	 */
+	public static boolean isLegal(boolean expression, String message) {
+		if (!expression)
+			throw new IllegalArgumentException(message);
+		return expression;
+	}
+
+	/**
+	 * Asserts that the given object is not <code>null</code>. If this is
+	 * not the case, some kind of unchecked exception is thrown. The given
+	 * message is included in that exception, to aid debugging.
+	 * 
+	 * @param object
+	 *            the value to test
+	 * @param message
+	 *            the message to include in the exception
+	 * @exception IllegalArgumentException
+	 *                if the object is <code>null</code>
+	 */
+	public static void isNotNull(Object object, String message) {
+		if (object == null) {
+			throw new Assert().new AssertionFailedException(message);
+		}
+	}
+
+	/**
+	 * Asserts that the given boolean is <code>true</code>. If this is not
+	 * the case, some kind of unchecked exception is thrown. The given message
+	 * is included in that exception, to aid debugging.
+	 * 
+	 * @param expression
+	 *            the outcode of the check
+	 * @param message
+	 *            the message to include in the exception
+	 * @return <code>true</code> if the check passes (does not return if the
+	 *         check fails)
+	 */
+	public static boolean isTrue(boolean expression, String message) {
+		if (!expression) {
+			throw new Assert().new AssertionFailedException(message);
+		}
+		return expression;
+	}
+
+	/* This class is not intended to be instantiated. */
+	private Assert() {
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/EditorUtility.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/EditorUtility.java
new file mode 100644
index 0000000..8a26343
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/EditorUtility.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.util;
+
+
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ * Helpful methods to be used with the Source Editor
+ */
+public class EditorUtility {
+
+	/**
+	 * Appends to modifier string of the given SWT modifier bit to the given
+	 * modifierString.
+	 * 
+	 * @param modifierString
+	 *            the modifier string
+	 * @param modifier
+	 *            an int with SWT modifier bit
+	 * @return the concatenated modifier string
+	 */
+	private static String appendModifierString(String modifierString, int modifier) {
+		if (modifierString == null)
+			modifierString = ""; //$NON-NLS-1$
+		String newModifierString = Action.findModifierString(modifier);
+		if (modifierString.length() == 0)
+			return newModifierString;
+		return modifierString + " + " + newModifierString; //$NON-NLS-1$
+	}
+
+	/**
+	 * Computes the state mask for the given modifier string.
+	 * 
+	 * @param modifiers
+	 *            the string with the modifiers, separated by '+', '-', ';',
+	 *            ',' or '.'
+	 * @return the state mask or -1 if the input is invalid
+	 */
+	public static int computeStateMask(String modifiers) {
+		if (modifiers == null)
+			return -1;
+
+		if (modifiers.length() == 0)
+			return SWT.NONE;
+
+		int stateMask = 0;
+		StringTokenizer modifierTokenizer = new StringTokenizer(modifiers, ",;.:+-* "); //$NON-NLS-1$
+		while (modifierTokenizer.hasMoreTokens()) {
+			int modifier = EditorUtility.findLocalizedModifier(modifierTokenizer.nextToken());
+			if (modifier == 0 || (stateMask & modifier) == modifier)
+				return -1;
+			stateMask = stateMask | modifier;
+		}
+		return stateMask;
+	}
+
+	/**
+	 * Maps the localized modifier name to a code in the same manner as
+	 * #findModifier.
+	 * 
+	 * @return the SWT modifier bit, or <code>0</code> if no match was found
+	 * @see findModifier
+	 */
+	public static int findLocalizedModifier(String token) {
+		if (token == null)
+			return 0;
+
+		if (token.equalsIgnoreCase(Action.findModifierString(SWT.CTRL)))
+			return SWT.CTRL;
+		if (token.equalsIgnoreCase(Action.findModifierString(SWT.SHIFT)))
+			return SWT.SHIFT;
+		if (token.equalsIgnoreCase(Action.findModifierString(SWT.ALT)))
+			return SWT.ALT;
+		if (token.equalsIgnoreCase(Action.findModifierString(SWT.COMMAND)))
+			return SWT.COMMAND;
+
+		return 0;
+	}
+
+	/**
+	 * Temporary method to help migrate from using StructuredTextColors to
+	 * using base ColorRegistry. Instead of using symbolic names in the color
+	 * registry, we are currently mapping the rgb.toString value to
+	 * corresponding color.
+	 * 
+	 * @param rgb
+	 * @return Color
+	 */
+	public static Color getColor(RGB rgb) {
+		if (rgb == null)
+			return null;
+
+		// get the color from the platform color registry
+		Color color = JFaceResources.getColorRegistry().get(rgb.toString());
+
+		// if the platform color registry does not have this color yet, add to
+		// the registry
+		if (color == null) {
+			JFaceResources.getColorRegistry().put(rgb.toString(), rgb);
+			color = JFaceResources.getColorRegistry().get(rgb.toString());
+		}
+		return color;
+	}
+
+	/**
+	 * Returns the modifier string for the given SWT modifier modifier bits.
+	 * 
+	 * @param stateMask
+	 *            the SWT modifier bits
+	 * @return the modifier string
+	 */
+	public static String getModifierString(int stateMask) {
+		String modifierString = ""; //$NON-NLS-1$
+		if ((stateMask & SWT.CTRL) == SWT.CTRL)
+			modifierString = appendModifierString(modifierString, SWT.CTRL);
+		if ((stateMask & SWT.ALT) == SWT.ALT)
+			modifierString = appendModifierString(modifierString, SWT.ALT);
+		if ((stateMask & SWT.SHIFT) == SWT.SHIFT)
+			modifierString = appendModifierString(modifierString, SWT.SHIFT);
+		if ((stateMask & SWT.COMMAND) == SWT.COMMAND)
+			modifierString = appendModifierString(modifierString, SWT.COMMAND);
+
+		return modifierString;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/PixelConverter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/PixelConverter.java
new file mode 100644
index 0000000..a12e28c
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/PixelConverter.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.util;
+
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Control;
+
+
+/**
+ * @deprecated - use {@link org.eclipse.jface.layout.PixelConverter}
+ */
+public class PixelConverter extends org.eclipse.jface.layout.PixelConverter {
+
+	public PixelConverter(Control control) {
+		super(control);
+	}
+
+	public PixelConverter(Font font) {
+		super(font);
+	}	
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/PlatformStatusLineUtil.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/PlatformStatusLineUtil.java
new file mode 100644
index 0000000..c71017e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/PlatformStatusLineUtil.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.util;
+
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.VerifyKeyListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+
+/**
+ * Utility to display (and/or clear) messages on the status line.
+ * 
+ * @author pavery
+ */
+public class PlatformStatusLineUtil {
+
+	private static class ClearMessage implements Runnable {
+		public void run() {
+			displayMessage(null);
+		}
+	}
+
+	private static class ClearStatusLine implements Runnable {
+		private IStatusLineManager fManager;
+		private boolean fIsError;
+
+		ClearStatusLine(IStatusLineManager statusLineManager, boolean isError) {
+			fManager = statusLineManager;
+			fIsError = isError;
+		}
+
+		public void run() {
+			if (fIsError) {
+				fManager.setErrorMessage(null);
+			}
+			else {
+				fManager.setMessage(null);
+			}
+		}
+	}
+
+	/**
+	 * Used to clear message on focus loss, change of selection, key type,
+	 * etc...
+	 */
+	private static class OneTimeListener extends FocusAdapter implements VerifyKeyListener, SelectionListener, MouseListener {
+		private Runnable fRunner = null;
+		private StyledText fStyledText;
+
+		OneTimeListener(StyledText target, Runnable r) {
+			fStyledText = target;
+			fRunner = r;
+			fStyledText.addVerifyKeyListener(this);
+			fStyledText.addFocusListener(this);
+			fStyledText.addSelectionListener(this);
+			fStyledText.addMouseListener(this);
+		}
+
+		public void focusLost(FocusEvent e) {
+			unhookAndRun();
+		}
+
+		public void mouseDoubleClick(MouseEvent e) {
+			unhookAndRun();
+		}
+
+		public void mouseDown(MouseEvent e) {
+			unhookAndRun();
+		}
+
+		public void mouseUp(MouseEvent e) {
+			//
+		}
+
+		private void unhookAndRun() {
+			fStyledText.removeVerifyKeyListener(this);
+			fStyledText.removeFocusListener(this);
+			fStyledText.removeSelectionListener(this);
+			fStyledText.removeMouseListener(this);
+			fStyledText.getDisplay().asyncExec(fRunner);
+		}
+
+		public void verifyKey(VerifyEvent event) {
+			unhookAndRun();
+		}
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+			unhookAndRun();
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			unhookAndRun();
+		}
+	}
+
+	/**
+	 * Status line error message will be cleared w/ key type or selection change
+	 * 
+	 * @deprecated
+	 */
+	public static void addOneTimeClearListener() {
+		IEditorPart editor = getActiveEditor();
+		boolean added = false;
+		if (editor != null) {
+			Control control = (Control) editor.getAdapter(Control.class);
+			if (control instanceof StyledText) {
+				new OneTimeListener((StyledText) control, new ClearMessage());
+				added = true;
+			}
+		}
+		if (!added) {
+			// clear the error message immediately
+			displayMessage(null);
+		}
+	}
+
+	/**
+	 * Clears the status line immediately
+	 * @deprecated
+	 */
+	public static void clearStatusLine() {
+		displayMessage(null);
+	}
+
+	/**
+	 * Display a message on the status line (with a beep)
+	 * @deprecated
+	 * @param msg
+	 */
+	public static void displayErrorMessage(String msg) {
+		displayMessage(msg);
+		PlatformUI.getWorkbench().getDisplay().beep();
+	}
+
+	/**
+	 * Display a message on the status line (no beep)
+	 * @deprecated
+	 * @param msg
+	 */
+	public static void displayMessage(String msg) {
+		IEditorPart editor = getActiveEditor();
+		if (editor != null) {
+			editor.getEditorSite().getActionBars().getStatusLineManager().setErrorMessage(msg);
+		}
+
+	}
+
+	private static IEditorPart getActiveEditor() {
+		IEditorPart editor = null;
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (window == null) {
+			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+			if (windows.length > 0) {
+				window = windows[0];
+			}
+		}
+		if (window != null) {
+			IWorkbenchPage page = window.getActivePage();
+			if (page != null)
+				editor = page.getActiveEditor();
+		}
+		return editor;
+	}
+
+	private PlatformStatusLineUtil() {
+		// force use of singleton
+	}
+
+	/**
+	 * Display an error message on the status line
+	 * 
+	 * @param viewer
+	 * @param msg
+	 */
+	public static boolean displayTemporaryErrorMessage(ITextViewer viewer, String msg) {
+		return _displayTemporaryMessage(viewer, msg, true);
+	}
+
+	/**
+	 * Display a message on the status line
+	 * 
+	 * @param viewer
+	 * @param msg
+	 */
+	public static boolean displayTemporaryMessage(ITextViewer viewer, String msg) {
+		return _displayTemporaryMessage(viewer, msg, false);
+	}
+
+	static boolean _displayTemporaryMessage(ITextViewer viewer, String msg, boolean isError) {
+		boolean messageShown = false;
+		IEditorPart editor = getActiveEditor();
+		if (editor != null) {
+			ITextEditor textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);
+			if (textEditor != null && textEditor instanceof StructuredTextEditor) {
+				if (((StructuredTextEditor) textEditor).getTextViewer() == viewer) {
+					IStatusLineManager statusLineManager = editor.getEditorSite().getActionBars().getStatusLineManager();
+					if (isError)
+						statusLineManager.setErrorMessage(msg);
+					else
+						statusLineManager.setMessage(msg);
+					new OneTimeListener(viewer.getTextWidget(), new ClearStatusLine(statusLineManager, isError));
+					messageShown = true;
+				}
+			}
+		}
+		
+		if (!messageShown) {
+			displayErrorMessage(msg);
+			addOneTimeClearListener();
+		}
+
+		return messageShown;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/RegistryReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/RegistryReader.java
new file mode 100644
index 0000000..6fc895b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/RegistryReader.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.util;
+
+
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IPluginRegistry;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+/**
+ * Template implementation of a registry reader that creates objects
+ * representing registry contents. Typically, an extension contains one
+ * element, but this reader handles multiple elements per extension.
+ * 
+ * To start reading the extensions from the registry for an extension point,
+ * call the method <code>readRegistry</code>.
+ * 
+ * To read children of an IConfigurationElement, call the method
+ * <code>readElementChildren</code> from your implementation of the method
+ * <code>readElement</code>, as it will not be done by default.
+ */
+public abstract class RegistryReader {
+
+
+	protected static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
+
+	/**
+	 * The constructor.
+	 */
+	protected RegistryReader() {
+	}
+
+	/**
+	 * This method extracts description as a subelement of the given element.
+	 * 
+	 * @return description string if defined, or empty string if not.
+	 */
+	protected String getDescription(IConfigurationElement config) {
+		IConfigurationElement[] children = config.getChildren(TAG_DESCRIPTION);
+		if (children.length >= 1) {
+			return children[0].getValue();
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * Logs the error in the workbench log using the provided text and the
+	 * information in the configuration element.
+	 */
+	protected void logError(IConfigurationElement element, String text) {
+		IExtension extension = element.getDeclaringExtension();
+		StringBuffer buf = new StringBuffer();
+		buf.append("Plugin " + extension.getNamespace() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-2$//$NON-NLS-1$
+		buf.append("\n" + text); //$NON-NLS-1$
+		Logger.log(Logger.ERROR, buf.toString());
+	}
+
+	/**
+	 * Logs a very common registry error when a required attribute is missing.
+	 */
+	protected void logMissingAttribute(IConfigurationElement element, String attributeName) {
+		logError(element, "Required attribute '" + attributeName + "' not defined"); //$NON-NLS-2$//$NON-NLS-1$
+	}
+
+	/**
+	 * Logs a registry error when the configuration element is unknown.
+	 */
+	protected void logUnknownElement(IConfigurationElement element) {
+		logError(element, "Unknown extension tag found: " + element.getName()); //$NON-NLS-1$
+	}
+
+	/**
+	 * Apply a reproducable order to the list of extensions provided, such
+	 * that the order will not change as extensions are added or removed.
+	 */
+	protected IExtension[] orderExtensions(IExtension[] extensions) {
+		// By default, the order is based on plugin id sorted
+		// in ascending order. The order for a plugin providing
+		// more than one extension for an extension point is
+		// dependent in the order listed in the XML file.
+		Sorter sorter = new Sorter() {
+			public boolean compare(Object extension1, Object extension2) {
+				String s1 = ((IExtension) extension1).getNamespace().toUpperCase();
+				String s2 = ((IExtension) extension2).getNamespace().toUpperCase();
+				//Return true if elementTwo is 'greater than' elementOne
+				return s2.compareTo(s1) > 0;
+			}
+		};
+
+		Object[] sorted = sorter.sort(extensions);
+		IExtension[] sortedExtension = new IExtension[sorted.length];
+		System.arraycopy(sorted, 0, sortedExtension, 0, sorted.length);
+		return sortedExtension;
+	}
+
+	/**
+	 * Implement this method to read element's attributes. If children should
+	 * also be read, then implementor is responsible for calling
+	 * <code>readElementChildren</code>. Implementor is also responsible
+	 * for logging missing attributes.
+	 * 
+	 * @return true if element was recognized, false if not.
+	 */
+	protected abstract boolean readElement(IConfigurationElement element);
+
+	/**
+	 * Read the element's children. This is called by the subclass'
+	 * readElement method when it wants to read the children of the element.
+	 */
+	protected void readElementChildren(IConfigurationElement element) {
+		readElements(element.getChildren());
+	}
+
+	/**
+	 * Read each element one at a time by calling the subclass implementation
+	 * of <code>readElement</code>.
+	 * 
+	 * Logs an error if the element was not recognized.
+	 */
+	protected void readElements(IConfigurationElement[] elements) {
+		for (int i = 0; i < elements.length; i++) {
+			if (!readElement(elements[i]))
+				logUnknownElement(elements[i]);
+		}
+	}
+
+	/**
+	 * Read one extension by looping through its configuration elements.
+	 */
+	protected void readExtension(IExtension extension) {
+		readElements(extension.getConfigurationElements());
+	}
+
+	/**
+	 * @deprecated use readRegistry(IExtensionRegistry registry, String pluginId, String extensionPoint)
+	 */
+	protected void readRegistry(IPluginRegistry registry, String pluginId, String extensionPoint) {
+		IExtensionPoint point = registry.getExtensionPoint(pluginId, extensionPoint);
+		if (point != null) {
+			IExtension[] extensions = point.getExtensions();
+			extensions = orderExtensions(extensions);
+			for (int i = 0; i < extensions.length; i++)
+				readExtension(extensions[i]);
+		}
+	}
+	
+	/**
+	 * Start the registry reading process using the supplied plugin ID and
+	 * extension point.
+	 */
+	protected void readRegistry(IExtensionRegistry registry, String pluginId, String extensionPoint) {
+		IExtensionPoint point = registry.getExtensionPoint(pluginId, extensionPoint);
+		if (point != null) {
+			IExtension[] extensions = point.getExtensions();
+			extensions = orderExtensions(extensions);
+			for (int i = 0; i < extensions.length; i++)
+				readExtension(extensions[i]);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/SWTUtil.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/SWTUtil.java
new file mode 100644
index 0000000..c58494e
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/SWTUtil.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.util;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+
+
+/**
+ * <p>Utility class to simplify access to some SWT resources.</p>
+ * 
+ * @base org.eclipse.jdt.internal.ui.util.SWTUtil
+ */
+public class SWTUtil {
+
+	/**
+	 * Returns a width hint for a button control.
+	 * @param button the button
+	 * @return the width hint
+	 */
+	public static int getButtonWidthHint(Button button) {
+		button.setFont(JFaceResources.getDialogFont());
+		PixelConverter converter= new PixelConverter(button);
+		int widthHint= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
+		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
+	}
+
+	/**
+	 * Sets width and height hint for the button control.
+	 * <b>Note:</b> This is a NOP if the button's layout data is not
+	 * an instance of <code>GridData</code>.
+	 *
+	 * @param button	the button for which to set the dimension hint
+	 */
+	public static void setButtonDimensionHint(Button button) {
+		Assert.isNotNull(button);
+		Object gd= button.getLayoutData();
+		if (gd instanceof GridData) {
+			((GridData)gd).widthHint= getButtonWidthHint(button);
+			((GridData)gd).horizontalAlignment = GridData.FILL;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/Sorter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/Sorter.java
new file mode 100644
index 0000000..3a895d3
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/util/Sorter.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.util;
+
+
+
+/**
+ * The SortOperation takes a collection of objects and returns a sorted
+ * collection of these objects. Concrete instances of this class provide the
+ * criteria for the sorting of the objects based on the type of the objects.
+ */
+public abstract class Sorter {
+
+	/**
+	 * Returns true if elementTwo is 'greater than' elementOne This is the
+	 * 'ordering' method of the sort operation. Each subclass overides this
+	 * method with the particular implementation of the 'greater than' concept
+	 * for the objects being sorted.
+	 */
+	public abstract boolean compare(Object elementOne, Object elementTwo);
+
+	/**
+	 * Sort the objects in sorted collection and return that collection.
+	 */
+	private Object[] quickSort(Object[] sortedCollection, int left, int right) {
+		int originalLeft = left;
+		int originalRight = right;
+		Object mid = sortedCollection[(left + right) / 2];
+
+		do {
+			while (compare(sortedCollection[left], mid))
+				left++;
+			while (compare(mid, sortedCollection[right]))
+				right--;
+			if (left <= right) {
+				Object tmp = sortedCollection[left];
+				sortedCollection[left] = sortedCollection[right];
+				sortedCollection[right] = tmp;
+				left++;
+				right--;
+			}
+		} while (left <= right);
+
+		if (originalLeft < right)
+			sortedCollection = quickSort(sortedCollection, originalLeft, right);
+		if (left < originalRight)
+			sortedCollection = quickSort(sortedCollection, left, originalRight);
+
+		return sortedCollection;
+	}
+
+	/**
+	 * Return a new sorted collection from this unsorted collection. Sort
+	 * using quick sort.
+	 */
+	public Object[] sort(Object[] unSortedCollection) {
+		int size = unSortedCollection.length;
+		Object[] sortedCollection = new Object[size];
+
+		//copy the array so can return a new sorted collection
+		System.arraycopy(unSortedCollection, 0, sortedCollection, 0, size);
+		if (size > 1)
+			quickSort(sortedCollection, 0, size - 1);
+
+		return sortedCollection;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/CaretEvent.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/CaretEvent.java
new file mode 100644
index 0000000..e907834
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/CaretEvent.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.view.events;
+
+/**
+ * @deprecated - use base selection notification
+ * 
+ * Simply holds data to be passed to CaretEventListeners
+ */
+public class CaretEvent extends java.util.EventObject {
+
+	/**
+	 * Comment for <code>serialVersionUID</code>
+	 */
+	private static final long serialVersionUID = 1L;
+	// initialize to impossible location
+	int fPosition = -1;
+
+	/**
+	 * doesnt't make sense to have a CaretEvent without the Caret postion, so
+	 * use other constructor
+	 */
+	protected CaretEvent(Object source) {
+		super(source);
+	}
+
+	/**
+	 * This is the preferred constructor.
+	 */
+	public CaretEvent(Object source, int position) {
+		super(source);
+		setPosition(position);
+	}
+
+	public int getPosition() {
+		return fPosition;
+	}
+
+	void setPosition(int newPosition) {
+		fPosition = newPosition;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/ICaretListener.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/ICaretListener.java
new file mode 100644
index 0000000..695e72b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/ICaretListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.view.events;
+
+/**
+ * @deprecated - use base selection notification
+ */
+public interface ICaretListener extends java.util.EventListener {
+	public void caretMoved(CaretEvent event);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/INodeSelectionListener.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/INodeSelectionListener.java
new file mode 100644
index 0000000..94fd9a6
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/INodeSelectionListener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.view.events;
+
+
+/**
+ * @deprecated - use base selection notification
+ */
+
+public interface INodeSelectionListener {
+	void nodeSelectionChanged(NodeSelectionChangedEvent event);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/ITextSelectionListener.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/ITextSelectionListener.java
new file mode 100644
index 0000000..f241bfb
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/ITextSelectionListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.view.events;
+
+/**
+ * @deprecated - use base selection notification
+ */
+public interface ITextSelectionListener {
+	void textSelectionChanged(TextSelectionChangedEvent event);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/NodeSelectionChangedEvent.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/NodeSelectionChangedEvent.java
new file mode 100644
index 0000000..579d753
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/NodeSelectionChangedEvent.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.view.events;
+
+import java.util.List;
+
+/**
+ * @deprecated - use base selection notification
+ */
+public class NodeSelectionChangedEvent extends java.util.EventObject {
+	/**
+	 * Comment for <code>serialVersionUID</code>
+	 */
+	private static final long serialVersionUID = 1L;
+
+	int fCaretPosition;
+
+	List fSelectedNodes;
+
+	public NodeSelectionChangedEvent(Object source, List selectedNodes, int caretPosition) {
+		super(source);
+		fSelectedNodes = selectedNodes;
+		fCaretPosition = caretPosition;
+	}
+
+	public int getCaretPosition() {
+		return fCaretPosition;
+	}
+
+	public List getSelectedNodes() {
+		return fSelectedNodes;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/TextSelectionChangedEvent.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/TextSelectionChangedEvent.java
new file mode 100644
index 0000000..d7807e5
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/view/events/TextSelectionChangedEvent.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.view.events;
+
+/**
+ * @deprecated - use base selection notification
+ */
+public class TextSelectionChangedEvent extends java.util.EventObject {
+	/**
+	 * Comment for <code>serialVersionUID</code>
+	 */
+	private static final long serialVersionUID = 1L;
+
+	int fTextSelectionEnd;
+
+	int fTextSelectionStart;
+
+	public TextSelectionChangedEvent(Object source, int textSelectionStart, int textSelectionEnd) {
+		super(source);
+		fTextSelectionStart = textSelectionStart;
+		fTextSelectionEnd = textSelectionEnd;
+	}
+
+	public int getTextSelectionEnd() {
+		return fTextSelectionEnd;
+	}
+
+	public int getTextSelectionStart() {
+		return fTextSelectionStart;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/AbstractCompletionProposalCategoriesConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/AbstractCompletionProposalCategoriesConfiguration.java
new file mode 100644
index 0000000..b6c171f
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/AbstractCompletionProposalCategoriesConfiguration.java
@@ -0,0 +1,392 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.preferences;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposalCategory;
+
+import com.ibm.icu.util.StringTokenizer;
+
+/**
+ * <p>Implements a completion proposal categories configuration
+ * reader and writer using an {@link IPreferenceStore}</p>
+ * 
+ * <p>This class is meant to be subclasses by implementers of the
+ * <code>org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration</code>
+ * extension point as a convince rather then implementing
+ * {@link ICompletionProposalCategoriesConfigurationReader} and
+ * {@link ICompletionProposalCategoriesConfigurationWriter} from scratch.</p>
+ */
+public abstract class AbstractCompletionProposalCategoriesConfiguration
+		implements ICompletionProposalCategoriesConfigurationReader,
+		ICompletionProposalCategoriesConfigurationWriter {
+
+	/** Separator used between preferences stored in the same key */
+	private static final String PREFERENCE_CATEGORY_SEPERATOR = "\0"; //$NON-NLS-1$
+	
+	/**
+	 * <p>{@link CompletionProposalCategory} IDs sorted by the order they should
+	 * be listed on the default page if they are being displayed there</p>
+	 * 
+	 * <code>{@link List}<{@link String}></code>
+	 * <ul><li><b>values:</b> {@link CompletionProposalCategory} IDs</li></ul>
+	 */
+	private List fDefaultPageSortOrder;
+	
+	/**
+	 * <p>{@link CompletionProposalCategory} IDs sorted by the order they should
+	 * be cycled through</p>
+	 * 
+	 * <code>{@link List}<{@link String}></code>
+	 * <ul><li><b>values:</b> {@link CompletionProposalCategory} IDs</li></ul>
+	 */
+	private List fOwnPageSortOrder;
+	
+	/**
+	 * <p>{@link CompletionProposalCategory} IDs that should not be displayed on
+	 * their own page</p>
+	 * 
+	 * <code>{@link Set}<{@link String}></code>
+	 * <ul><li><b>values:</b> {@link CompletionProposalCategory} IDs</li></ul>
+	 */
+	private Set fShouldNotDisplayOnOwnPage;
+	
+	/**
+	 * <p>{@link CompletionProposalCategory} IDs that should not be displayed on
+	 * on the default page</p>
+	 * 
+	 * <code>{@link Set}<{@link String}></code>
+	 * <ul><li><b>values:</b> {@link CompletionProposalCategory} IDs</li></ul>
+	 */
+	private Set fShouldNotDisplayOnDefaultPage;
+	
+	/**
+	 * <p>Create a new configuration by loading from the associated {@link IPreferenceStore}</p>
+	 */
+	public AbstractCompletionProposalCategoriesConfiguration() {
+		this.fOwnPageSortOrder = new ArrayList();
+		this.fDefaultPageSortOrder = new ArrayList();
+		this.fShouldNotDisplayOnOwnPage = new HashSet();
+		this.fShouldNotDisplayOnDefaultPage = new HashSet();
+		
+		this.loadUserConfiguration();
+	}
+	
+	/**
+	 * @return {@link IPreferenceStore} to read and write the configuration to and from
+	 */
+	protected abstract IPreferenceStore getPreferenceStore();
+	
+	/**
+	 * @return Preference key to use in the {@link IPreferenceStore} for the category sort order
+	 * when cycling through the pages
+	 */
+	protected abstract String getPageSortOrderPrefKey();
+	
+	/**
+	 * @return Preference key to use in the {@link IPreferenceStore} for the category sort order
+	 * on the default page
+	 */
+	protected abstract String getDefaultPageSortOrderPrefKey();
+	
+	/**
+	 * @return Preference key to use in the {@link IPreferenceStore} for which
+	 * categories not to display on their own page
+	 */
+	protected abstract String getShouldNotDisplayOnOwnPagePrefKey();
+	
+	/**
+	 * @return Preference key to use in the {@link IPreferenceStore} for which
+	 * categories not to display on the default page
+	 */
+	protected abstract String getShouldNotDisplayOnDefaultPagePrefKey();
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader#getPageSortOrder(java.lang.String)
+	 */
+	public int getPageSortOrder(String categoryID) {
+		int sortOrder = this.fOwnPageSortOrder.indexOf(categoryID);
+		if(sortOrder == -1) {
+			sortOrder = DEFAULT_SORT_ORDER;
+		}
+		
+		return sortOrder;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader#getDefaultPageSortOrder(java.lang.String)
+	 */
+	public int getDefaultPageSortOrder(String categoryID) {
+		int sortOrder = this.fDefaultPageSortOrder.indexOf(categoryID);
+		if(sortOrder == -1) {
+			sortOrder = DEFAULT_SORT_ORDER;
+		}
+		
+		return sortOrder;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader#shouldDisplayOnDefaultPage(java.lang.String)
+	 */
+	public boolean shouldDisplayOnDefaultPage(String categoryID) {
+		return !fShouldNotDisplayOnDefaultPage.contains(categoryID);
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationReader#shouldDisplayOnOwnPage(java.lang.String)
+	 */
+	public boolean shouldDisplayOnOwnPage(String categoryID) {
+		return !this.fShouldNotDisplayOnOwnPage.contains(categoryID);
+	}
+
+	/**
+	 * <p> Loads defaults from the associated {@link IPreferenceStore}</p>
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#loadDefaults()
+	 */
+	public void loadDefaults() {
+		this.loadDefaultPagePreference(true);
+		this.loadPageSortOrder(true);
+		this.loadDefaultPageSortOrder(true);
+		this.loadShouldNotDisplayOnOwnPage(true);
+	}
+
+	/**
+	 * <p>Saves to the associated {@link IPreferenceStore}</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#saveConfiguration()
+	 */
+	public boolean saveConfiguration() {
+		this.saveShouldDisplayOnDefaultPageConfiguration();
+		this.saveShouldDisplayOnOwnPageConfiguration();
+		this.saveDefaultPageSortOrderConfiguration();
+		this.savePageSortOrderConfiguration();
+		
+		return true;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#setShouldDisplayOnDefaultPage(java.lang.String, boolean)
+	 */
+	public void setShouldDisplayOnDefaultPage(String categoryID,
+			boolean shouldDisplay) {
+		
+		if(shouldDisplay) {
+			this.fShouldNotDisplayOnDefaultPage.remove(categoryID);
+		} else {
+			this.fShouldNotDisplayOnDefaultPage.add(categoryID);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#setShouldDisplayOnOwnPage(java.lang.String, boolean)
+	 */
+	public void setShouldDisplayOnOwnPage(String categoryID, boolean shouldDisplay) {
+		
+		if(shouldDisplay) {
+			this.fShouldNotDisplayOnOwnPage.remove(categoryID);
+		} else {
+			this.fShouldNotDisplayOnOwnPage.add(categoryID);
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#setPageOrder(java.util.List)
+	 */
+	public void setPageOrder(List order) {
+		this.fOwnPageSortOrder = order;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#setDefaultPageOrder(java.util.List)
+	 */
+	public void setDefaultPageOrder(List order) {
+		this.fDefaultPageSortOrder = order;
+	}
+
+	/**
+	 * <p>Loads the user configuration from the associated {@link IPreferenceStore}</p>
+	 */
+	private void loadUserConfiguration() {
+		this.loadDefaultPagePreference(false);
+		this.loadPageSortOrder(false);
+		this.loadDefaultPageSortOrder(false);
+		this.loadShouldNotDisplayOnOwnPage(false);
+	}
+	
+	/**
+	 * <p>Loads the user preferences for which categories to
+	 * display on the default content assist page</p>
+	 * 
+	 * @param useDefaults if <code>true</code> then use the {@link IPreferenceStore} defaults,
+	 * otherwise use the user specified preferences
+	 */
+	private void loadDefaultPagePreference(boolean useDefaults) {
+		//clear the current display on default page configuration
+		this.fShouldNotDisplayOnDefaultPage.clear();
+		
+		//parse either the default or user configuration preference
+		String displayOnDefaultPage;
+		if(useDefaults) {
+			displayOnDefaultPage = getPreferenceStore().getDefaultString(getShouldNotDisplayOnDefaultPagePrefKey());
+		} else {
+			displayOnDefaultPage = getPreferenceStore().getString(getShouldNotDisplayOnDefaultPagePrefKey());
+		}
+		StringTokenizer defaultPageTokenizer = new StringTokenizer(displayOnDefaultPage, PREFERENCE_CATEGORY_SEPERATOR);
+		while (defaultPageTokenizer.hasMoreTokens()) {
+			fShouldNotDisplayOnDefaultPage.add(defaultPageTokenizer.nextToken());
+		}
+	}
+	
+	/**
+	 * <p>Loads the user preferences for the sort order of the content assist pages</p>
+	 * 
+	 * @param useDefaults if <code>true</code> then use the {@link IPreferenceStore} defaults,
+	 * otherwise use the user specified preferences
+	 */
+	private void loadPageSortOrder(boolean useDefaults){
+		//clear the current sort order
+		this.fOwnPageSortOrder.clear();
+		
+		//parse either the default or user configuration preference
+		String sortOrder;
+		if(useDefaults) {
+			sortOrder = getPreferenceStore().getDefaultString(getPageSortOrderPrefKey());
+		} else {
+			sortOrder = getPreferenceStore().getString(getPageSortOrderPrefKey());
+		}
+		StringTokenizer tokenizer = new StringTokenizer(sortOrder, PREFERENCE_CATEGORY_SEPERATOR);
+		while (tokenizer.hasMoreTokens()) {
+			String categoryID = tokenizer.nextToken();
+			this.fOwnPageSortOrder.add(categoryID);
+		}
+	}
+	
+	/**
+	 * <p>Loads the user preferences for the sort order of the content assist pages</p>
+	 * 
+	 * @param useDefaults if <code>true</code> then use the {@link IPreferenceStore} defaults,
+	 * otherwise use the user specified preferences
+	 */
+	private void loadDefaultPageSortOrder(boolean useDefaults){
+		//clear the current sort order
+		this.fDefaultPageSortOrder.clear();
+		
+		//parse either the default or user configuration preference
+		String sortOrder;
+		if(useDefaults) {
+			sortOrder = getPreferenceStore().getDefaultString(getDefaultPageSortOrderPrefKey());
+		} else {
+			sortOrder = getPreferenceStore().getString(getDefaultPageSortOrderPrefKey());
+		}
+		StringTokenizer tokenizer = new StringTokenizer(sortOrder, PREFERENCE_CATEGORY_SEPERATOR);
+		while (tokenizer.hasMoreTokens()) {
+			String categoryID = tokenizer.nextToken();
+			this.fDefaultPageSortOrder.add(categoryID);
+		}
+	}
+	
+	/**
+	 * <p>Loads the user preferences for which categories should not be displayed on their own
+	 * content assist page</p>
+	 * 
+	 * @param useDefaults if <code>true</code> then use the {@link IPreferenceStore} defaults,
+	 * otherwise use the user specified preferences
+	 */
+	private void loadShouldNotDisplayOnOwnPage(boolean useDefaults){
+		//clear the current sort order
+		this.fShouldNotDisplayOnOwnPage.clear();
+		
+		//parse either the default or user configuration preference
+		String preference;
+		if(useDefaults) {
+			preference = getPreferenceStore().getDefaultString(getShouldNotDisplayOnOwnPagePrefKey());
+		} else {
+			preference = getPreferenceStore().getString(getShouldNotDisplayOnOwnPagePrefKey());
+		}
+		StringTokenizer tokenizer = new StringTokenizer(preference, PREFERENCE_CATEGORY_SEPERATOR);
+		while (tokenizer.hasMoreTokens()) {
+			String categoryID = tokenizer.nextToken();
+			this.fShouldNotDisplayOnOwnPage.add(categoryID);
+		}
+	}
+	
+	/**
+	 * <p>Saves the user preferences for which categories to
+	 * display on the default content assist page</p>
+	 */
+	private void saveShouldDisplayOnDefaultPageConfiguration() {
+		//create the preference string
+		StringBuffer defaultPageBuff = new StringBuffer();
+		Iterator defaultPageIter = this.fShouldNotDisplayOnDefaultPage.iterator();
+		while(defaultPageIter.hasNext()) {
+			String categoryID = (String)defaultPageIter.next();
+			defaultPageBuff.append(categoryID + PREFERENCE_CATEGORY_SEPERATOR);
+		}
+		
+		//save the preference
+		this.getPreferenceStore().setValue(this.getShouldNotDisplayOnDefaultPagePrefKey(), defaultPageBuff.toString());
+	}
+	
+	/**
+	 * <p>Saves the user preferences for the sort order of the content assist pages</p>
+	 */
+	private void savePageSortOrderConfiguration() {
+		//create the preference string
+		StringBuffer orderBuff = new StringBuffer();
+		for(int i = 0; i < this.fOwnPageSortOrder.size(); ++i) {
+			if(this.fOwnPageSortOrder.get(i) != null) {
+				orderBuff.append(this.fOwnPageSortOrder.get(i) + PREFERENCE_CATEGORY_SEPERATOR);
+			}
+		}
+		
+		//save the preference
+		this.getPreferenceStore().setValue(this.getPageSortOrderPrefKey(), orderBuff.toString());
+	}
+	
+	/**
+	 * <p>Saves the user preferences for the sort order of the categories on the default page</p>
+	 */
+	private void saveDefaultPageSortOrderConfiguration() {
+		//create the preference string
+		StringBuffer orderBuff = new StringBuffer();
+		for(int i = 0; i < this.fDefaultPageSortOrder.size(); ++i) {
+			if(this.fDefaultPageSortOrder.get(i) != null) {
+				orderBuff.append(this.fDefaultPageSortOrder.get(i) + PREFERENCE_CATEGORY_SEPERATOR);
+			}
+		}
+		
+		//save the preference
+		this.getPreferenceStore().setValue(this.getDefaultPageSortOrderPrefKey(), orderBuff.toString());
+	}
+	
+	/**
+	 * <p>Saves the user preferences for which categories should not be displayed on their own
+	 * content assist page</p>
+	 */
+	private void saveShouldDisplayOnOwnPageConfiguration() {
+		//create the preference string
+		StringBuffer buff = new StringBuffer();
+		Iterator iter = this.fShouldNotDisplayOnOwnPage.iterator();
+		while(iter.hasNext()) {
+			String categoryID = (String)iter.next();
+			buff.append(categoryID + PREFERENCE_CATEGORY_SEPERATOR);
+		}
+		
+		//save the preference
+		this.getPreferenceStore().setValue(this.getShouldNotDisplayOnOwnPagePrefKey(), buff.toString());
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/CodeAssistCyclingConfigurationBlock.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/CodeAssistCyclingConfigurationBlock.java
new file mode 100644
index 0000000..e1cfead
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/CodeAssistCyclingConfigurationBlock.java
@@ -0,0 +1,891 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.preferences;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.CommandManager;
+import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.core.commands.contexts.ContextManager;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.bindings.BindingManager;
+import org.eclipse.jface.bindings.Scheme;
+import org.eclipse.jface.bindings.TriggerSequence;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposalCategory;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposalComputerRegistry;
+import org.eclipse.wst.sse.ui.internal.util.SWTUtil;
+
+
+/**
+ * <p>A helpful preference configuration block implementation for allowing a user to
+ * set their preferences for which content assist categories to show on the default
+ * content assist page as well as on their own separate page and page ordering for
+ * a specific content type</p>
+ * 
+ * @base org.eclipse.jdt.internal.ui.preferences.CodeAssistAdvancedConfigurationBlock
+ */
+public final class CodeAssistCyclingConfigurationBlock  {
+
+	/**
+	 * <p>Used to compare categories based on their assigned page rank</p>
+	 */
+	private final Comparator fCategoryPageComparator = new Comparator() {
+		private int getRank(Object o) {
+			return ((ModelElement) o).getOwnPageRank();
+		}
+
+		public int compare(Object o1, Object o2) {
+			int result = getRank(o1) - getRank(o2);
+			if(result == 0) {
+				result = ((ModelElement) o1).getId().compareTo(((ModelElement) o2).getId());
+			}
+			return result;
+		}
+	};
+	
+	/**
+	 * <p>Used to compare categories based on their assigned default page rank</p>
+	 */
+	private final Comparator fCategoryDefaultPageComparator = new Comparator() {
+		private int getRank(Object o) {
+			return ((ModelElement) o).getDefaultPageRank();
+		}
+
+		public int compare(Object o1, Object o2) {
+			int result = getRank(o1) - getRank(o2);
+			if(result == 0) {
+				result = ((ModelElement) o1).getId().compareTo(((ModelElement) o2).getId());
+			}
+			return result;
+		}
+	};
+
+	/** the preference model for this block */
+	private final PreferenceModel fModel;
+	
+	/**
+	 * <code>{@link Map}<{@link ImageDescriptor}, {@link Image}></code>
+	 */
+	private final Map fImages= new HashMap();
+
+	/** table viewer to configure which categories are displayed on the default page */
+	private CheckboxTableViewer fDefaultPageViewer;
+	
+	/**
+	 * table viewer to configure which categories are displayed
+	 * on their own page, as well as their ordering
+	 */
+	private CheckboxTableViewer fOwnPageViewer;
+	
+	/** categories pages sort order up button */
+	private Button fPageOrderUpButton;
+	
+	/** categories pages sort order down button */
+	private Button fPageOrderDownButton;
+	
+	/** categories default page sort order up button */
+	private Button fDefaultPageOrderUpButton;
+	
+	/** categories default page  sort order down button */
+	private Button fDefaultPageOrderDownButton;
+	
+	/** The content type ID this configuration block is for */
+	private String fContentTypeID;
+	
+	/** The writable categories configuration */
+	private ICompletionProposalCategoriesConfigurationWriter fConfigurationWriter;
+
+	/**
+	 * <p>Creates a new content assist preference block for the given content type
+	 * using the given configuration writer</p>
+	 * 
+	 * @param contentTypeID content type this content assist preference block is for
+	 * @param configurationWriter {@link ICompletionProposalCategoriesConfigurationWriter} used
+	 * to read and write the user preferences 
+	 */
+	public CodeAssistCyclingConfigurationBlock(String contentTypeID, ICompletionProposalCategoriesConfigurationWriter configurationWriter) {
+		this.fContentTypeID = contentTypeID;
+		this.fConfigurationWriter = configurationWriter;
+		
+		List categories = CompletionProposalComputerRegistry.getDefault().getProposalCategories(this.fContentTypeID);
+		this.fModel = new PreferenceModel(categories);
+	}
+	
+	/**
+	 * <p>Saves the user configuration</p>
+	 * @return <code>true</code> if store was successful, <code>false</code> otherwise
+	 */
+	public boolean storeValues() {
+		return this.fConfigurationWriter.saveConfiguration();
+	}
+	
+	/**
+	 * <p>Loads the preference defaults</p>
+	 */
+	public void performDefaults() {
+		this.fConfigurationWriter.loadDefaults();
+		this.initializeValues();
+		this.fModel.performDefaults();
+	}
+	
+	/**
+	 * <p>Disposes of this preference block</p>
+	 */
+	public void dispose() {
+		for (Iterator it= fImages.values().iterator(); it.hasNext();) {
+			Image image= (Image) it.next();
+			image.dispose();
+		}
+	}
+
+	/**
+	 * <p>Creates the contents of this configuration block using a {@link Group} if
+	 * the given <code>groupTitle</code> is not <code>null</code> else creates it
+	 * as a composite and in either case adds itself to the given parent</p>
+	 * 
+	 * @param parent {@link Composite} parent to add this configuration block to
+	 * @param groupTitle Title to use for the configuration block group, if
+	 * <code>null</code> then a {@link Composite} will be used instead of a
+	 * {@link Group}
+	 * 
+	 * @return the created configuration block that has already been added to the parent
+	 */
+	public Control createContents(Composite parent, String groupTitle) {
+		Composite container;
+		if(groupTitle != null) {
+			container = new Group(parent, SWT.NULL);
+			((Group)container).setText(groupTitle);
+		} else {
+			container = new Composite(parent, SWT.NULL);
+		}
+		int columns= 2;
+		GridLayout layout= new GridLayout(columns, false);
+		container.setLayout(layout);
+		
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalIndent = 0;
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		container.setLayoutData(data);
+
+		createDefaultPageLabel(container, columns);
+		createDefaultPageSection(container);
+
+		createFiller(container, columns);
+
+		createOwnPageLabel(container, columns);
+        createOwnPageSection(container);
+
+        createFiller(container, columns);
+
+		if (fModel.pageElements.size() > 0) {
+			fDefaultPageViewer.getTable().select(0);
+			fOwnPageViewer.getTable().select(0);
+			handleOwnPageTableSelection();
+			handleDefaultPageTableSelection();
+		}
+		
+		return container;
+	}
+	
+	/**
+	 * <p>Initialize the values of the configuration block</p>
+	 */
+	public void initializeValues() {
+		updateCheckedState();
+		fDefaultPageViewer.refresh();
+		fOwnPageViewer.refresh();
+		handleOwnPageTableSelection();
+		handleDefaultPageTableSelection();
+	}
+	
+	private void createDefaultPageSection(Composite composite) {
+		createDefaultPageViewer(composite);
+		createDefaultPageButtonList(composite);
+	}
+
+	private void createDefaultPageLabel(Composite composite, int h_span) {
+	    final ICommandService commandSvc= (ICommandService) PlatformUI.getWorkbench().getAdapter(ICommandService.class);
+		final Command command= commandSvc.getCommand(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+		ParameterizedCommand pCmd= new ParameterizedCommand(command, null);
+		String key= getKeyboardShortcut(pCmd);
+		if (key == null) {
+			key= SSEUIMessages.CodeAssistAdvancedConfigurationBlock_no_shortcut;
+		}
+
+		PixelConverter pixelConverter= new PixelConverter(composite);
+		int width= pixelConverter.convertWidthInCharsToPixels(40);
+
+		Label label= new Label(composite, SWT.NONE | SWT.WRAP);
+		label.setText(NLS.bind(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_page_description, new Object[] { key }));
+		GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false, h_span, 1);
+		gd.widthHint= width;
+		label.setLayoutData(gd);
+
+		createFiller(composite, h_span);
+
+		label= new Label(composite, SWT.NONE | SWT.WRAP);
+		label.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_default_table_description);
+		gd= new GridData(GridData.FILL, GridData.FILL, true, false, h_span, 1);
+		gd.widthHint= width;
+		label.setLayoutData(gd);
+    }
+
+	private void createDefaultPageViewer(Composite composite) {
+		fDefaultPageViewer= CheckboxTableViewer.newCheckList(composite, SWT.SINGLE | SWT.BORDER);
+		Table table= fDefaultPageViewer.getTable();
+		table.setHeaderVisible(true);
+		table.setLinesVisible(false);
+		table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false, 1, 1));
+
+		TableColumn nameColumn= new TableColumn(table, SWT.NONE);
+		nameColumn.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_default_table_category_column_title);
+		nameColumn.setResizable(false);
+
+		fDefaultPageViewer.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				boolean checked= event.getChecked();
+				ModelElement element= (ModelElement) event.getElement();
+				element.setShouldDisplayOnDefaultPage(checked);
+			}
+		});
+
+		fDefaultPageViewer.setContentProvider(new ArrayContentProvider());
+
+		DefaultPageTableLabelProvider labelProvider= new DefaultPageTableLabelProvider();
+		fDefaultPageViewer.setLabelProvider(labelProvider);
+		fDefaultPageViewer.setInput(fModel.defaultPageElements);
+		fDefaultPageViewer.setComparator(new ModelViewerComparator(fCategoryDefaultPageComparator));
+
+		final int ICON_AND_CHECKBOX_WITH= 50;
+		final int HEADER_MARGIN= 20;
+		int minNameWidth= computeWidth(table, nameColumn.getText()) + HEADER_MARGIN;
+		for (int i= 0; i < fModel.defaultPageElements.size(); i++) {
+			minNameWidth= Math.max(minNameWidth, computeWidth(table, labelProvider.getColumnText(fModel.defaultPageElements.get(i), 0)) + ICON_AND_CHECKBOX_WITH);
+		}
+
+		nameColumn.setWidth(minNameWidth);
+		
+		table.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleDefaultPageTableSelection();
+			}
+		});
+	}
+	
+	/**
+	 * <p>Create the Up and Down buttons for the default page viewer</p>
+	 * @param parent {@link Composite} to add the button list to 
+	 */
+	private void createDefaultPageButtonList(Composite parent) {
+		Composite composite= new Composite(parent, SWT.NONE);
+		composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+
+		GridLayout layout= new GridLayout();
+		layout.marginWidth= 0;
+		layout.marginHeight= 0;
+		composite.setLayout(layout);
+
+		fDefaultPageOrderUpButton= new Button(composite, SWT.PUSH | SWT.CENTER);
+		fDefaultPageOrderUpButton.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_Up);
+		fDefaultPageOrderUpButton.addSelectionListener(new SelectionAdapter() {
+        	public void widgetSelected(SelectionEvent e) {
+        		int index = fDefaultPageViewer.getTable().getSelectionIndex();
+        		if (index != -1) {
+        			fModel.moveDefaultPageCategoryUp(index);
+        			fDefaultPageViewer.refresh();
+        			handleDefaultPageTableSelection();
+        		}
+        	}
+        });
+		fDefaultPageOrderUpButton.setLayoutData(new GridData());
+        
+        SWTUtil.setButtonDimensionHint(fDefaultPageOrderUpButton);
+
+        fDefaultPageOrderDownButton= new Button(composite, SWT.PUSH | SWT.CENTER);
+        fDefaultPageOrderDownButton.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_Down);
+        fDefaultPageOrderDownButton.addSelectionListener(new SelectionAdapter() {
+        	public void widgetSelected(SelectionEvent e) {
+        		int index= fDefaultPageViewer.getTable().getSelectionIndex();
+        		if (index != -1) {
+        			fModel.moveDefaultPageCategoryDown(index);
+        			fDefaultPageViewer.refresh();
+        			handleDefaultPageTableSelection();
+        		}
+        	}
+        });
+        fDefaultPageOrderDownButton.setLayoutData(new GridData());
+        SWTUtil.setButtonDimensionHint(fDefaultPageOrderDownButton);
+	}
+
+	private void createFiller(Composite composite, int h_span) {
+	    Label filler= new Label(composite, SWT.NONE);
+		filler.setVisible(false);
+		filler.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, h_span, 1));
+    }
+
+	private void createOwnPageLabel(Composite composite, int h_span) {
+		PixelConverter pixelConverter= new PixelConverter(composite);
+		int width= pixelConverter.convertWidthInCharsToPixels(40);
+
+		Label label= new Label(composite, SWT.NONE | SWT.WRAP);
+		label.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_separate_table_description);
+		GridData gd= new GridData(GridData.FILL, GridData.FILL, false, false, h_span, 1);
+		gd.widthHint= width;
+		label.setLayoutData(gd);
+	}
+
+	private void createOwnPageSection(Composite composite) {
+		createOwnPageViewer(composite);
+		createOwnPageButtonList(composite);
+	}
+
+	private void createOwnPageViewer(Composite composite) {
+		fOwnPageViewer= CheckboxTableViewer.newCheckList(composite, SWT.SINGLE | SWT.BORDER);
+		Table table= fOwnPageViewer.getTable();
+		table.setHeaderVisible(true);
+		table.setLinesVisible(false);
+		table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false, 1, 1));
+
+		TableColumn nameColumn= new TableColumn(table, SWT.NONE);
+		nameColumn.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_separate_table_category_column_title);
+		nameColumn.setResizable(false);
+
+		fOwnPageViewer.setContentProvider(new ArrayContentProvider());
+
+		ITableLabelProvider labelProvider= new OwnPageTableLabelProvider();
+		fOwnPageViewer.setLabelProvider(labelProvider);
+		fOwnPageViewer.setInput(fModel.pageElements);
+		fOwnPageViewer.setComparator(new ModelViewerComparator(fCategoryPageComparator));
+
+		final int ICON_AND_CHECKBOX_WITH= 50;
+		final int HEADER_MARGIN= 20;
+		int minNameWidth= computeWidth(table, nameColumn.getText()) + HEADER_MARGIN;
+		for (int i= 0; i < fModel.pageElements.size(); i++) {
+			minNameWidth= Math.max(minNameWidth, computeWidth(table, labelProvider.getColumnText(fModel.pageElements.get(i), 0)) + ICON_AND_CHECKBOX_WITH);
+		}
+
+		nameColumn.setWidth(minNameWidth);
+
+		fOwnPageViewer.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				boolean checked= event.getChecked();
+				ModelElement element= (ModelElement) event.getElement();
+				element.setShouldDisplayOnOwnPage(checked);
+			}
+		});
+
+		table.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleOwnPageTableSelection();
+			}
+		});
+
+	}
+
+	/**
+	 * <p>Create the Up and Down buttons for the own page viewer</p>
+	 * @param parent {@link Composite} to add the button list to 
+	 */
+	private void createOwnPageButtonList(Composite parent) {
+		Composite composite= new Composite(parent, SWT.NONE);
+		composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+
+		GridLayout layout= new GridLayout();
+		layout.marginWidth= 0;
+		layout.marginHeight= 0;
+		composite.setLayout(layout);
+
+		fPageOrderUpButton= new Button(composite, SWT.PUSH | SWT.CENTER);
+        fPageOrderUpButton.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_PagesUp);
+        fPageOrderUpButton.addSelectionListener(new SelectionAdapter() {
+        	public void widgetSelected(SelectionEvent e) {
+        		int index = fOwnPageViewer.getTable().getSelectionIndex();
+        		if (index != -1) {
+        			fModel.movePageUp(index);
+        			fOwnPageViewer.refresh();
+        			handleOwnPageTableSelection();
+        		}
+        	}
+        });
+        fPageOrderUpButton.setLayoutData(new GridData());
+        
+        SWTUtil.setButtonDimensionHint(fPageOrderUpButton);
+
+        fPageOrderDownButton= new Button(composite, SWT.PUSH | SWT.CENTER);
+        fPageOrderDownButton.setText(SSEUIMessages.CodeAssistAdvancedConfigurationBlock_PagesDown);
+        fPageOrderDownButton.addSelectionListener(new SelectionAdapter() {
+        	public void widgetSelected(SelectionEvent e) {
+        		int index= fOwnPageViewer.getTable().getSelectionIndex();
+        		if (index != -1) {
+        			fModel.movePageDown(index);
+        			fOwnPageViewer.refresh();
+        			handleOwnPageTableSelection();
+        		}
+        	}
+        });
+        fPageOrderDownButton.setLayoutData(new GridData());
+        SWTUtil.setButtonDimensionHint(fPageOrderDownButton);
+	}
+
+	/**
+	 * <p>Update the enablement of the Up and Down buttons for the own page table viewer</p>
+	 */
+	private void handleOwnPageTableSelection() {
+		ModelElement item= (ModelElement) ((IStructuredSelection) fOwnPageViewer.getSelection()).getFirstElement();
+		if (item != null) {
+			int index= fOwnPageViewer.getTable().getSelectionIndex();
+			fPageOrderUpButton.setEnabled(index > 0);
+			fPageOrderDownButton.setEnabled(index < fModel.pageElements.size() - 1);
+		} else {
+			fPageOrderUpButton.setEnabled(false);
+			fPageOrderDownButton.setEnabled(false);
+		}
+	}
+	
+	/**
+	 * <p>Update the enablement of the Up and Down buttons for the default page table viewer</p>
+	 */
+	private void handleDefaultPageTableSelection() {
+		ModelElement item= (ModelElement) ((IStructuredSelection) fDefaultPageViewer.getSelection()).getFirstElement();
+		if (item != null) {
+			int index = fDefaultPageViewer.getTable().getSelectionIndex();
+			fDefaultPageOrderUpButton.setEnabled(index > 0);
+			fDefaultPageOrderDownButton.setEnabled(index < fModel.defaultPageElements.size() - 1);
+		} else {
+			fDefaultPageOrderUpButton.setEnabled(false);
+			fDefaultPageOrderDownButton.setEnabled(false);
+		}
+	}
+
+	private void updateCheckedState() {
+		/* does not matter which set of elements we use here
+		 * because order does not matter in this case
+		 */
+		final int size= fModel.pageElements.size();
+		List defaultChecked= new ArrayList(size);
+		List separateChecked= new ArrayList(size);
+
+		for (Iterator it= fModel.pageElements.iterator(); it.hasNext();) {
+			ModelElement element= (ModelElement) it.next();
+			if (element.shouldDisplayOnDefaultPage())
+				defaultChecked.add(element);
+			if (element.shouldDisplayOnOwnPage())
+				separateChecked.add(element);
+		}
+
+		fDefaultPageViewer.setCheckedElements(defaultChecked.toArray(new Object[defaultChecked.size()]));
+		fOwnPageViewer.setCheckedElements(separateChecked.toArray(new Object[separateChecked.size()]));
+	}
+
+	private int computeWidth(Control control, String name) {
+		if (name == null)
+			return 0;
+		GC gc= new GC(control);
+		try {
+			gc.setFont(JFaceResources.getDialogFont());
+			return gc.stringExtent(name).x + 10;
+		} finally {
+			gc.dispose();
+		}
+	}
+
+	private static BindingManager fgLocalBindingManager;
+	static {
+		fgLocalBindingManager= new BindingManager(new ContextManager(), new CommandManager());
+		final IBindingService bindingService= (IBindingService)PlatformUI.getWorkbench().getService(IBindingService.class);
+		final Scheme[] definedSchemes= bindingService.getDefinedSchemes();
+		if (definedSchemes != null) {
+			try {
+				for (int i = 0; i < definedSchemes.length; i++) {
+					final Scheme scheme= definedSchemes[i];
+					final Scheme copy= fgLocalBindingManager.getScheme(scheme.getId());
+					copy.define(scheme.getName(), scheme.getDescription(), scheme.getParentId());
+				}
+			} catch (final NotDefinedException e) {
+				Logger.logException(e);
+			}
+		}
+		fgLocalBindingManager.setLocale(bindingService.getLocale());
+		fgLocalBindingManager.setPlatform(bindingService.getPlatform());
+	}
+
+	private static String getKeyboardShortcut(ParameterizedCommand command) {
+		IBindingService bindingService= (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class);
+		fgLocalBindingManager.setBindings(bindingService.getBindings());
+		try {
+			Scheme activeScheme= bindingService.getActiveScheme();
+			if (activeScheme != null)
+				fgLocalBindingManager.setActiveScheme(activeScheme);
+		} catch (NotDefinedException e) {
+			Logger.logException(e);
+		}
+
+		TriggerSequence[] bindings= fgLocalBindingManager.getActiveBindingsDisregardingContextFor(command);
+		if (bindings.length > 0)
+			return bindings[0].format();
+		return null;
+	}
+
+	/**
+	 * <p>Gets and image based on an image descriptor, and stores the image so it
+	 * does not have to be created more then once</p>
+	 * 
+	 * @param imgDesc {@link ImageDescriptor} to get the {@link Image} for
+	 * @return {@link Image} created from the {@link ImageDescriptor}, or stored
+	 * {@link Image} associated with the given {@link ImageDescriptor} if an
+	 * {@link Image} had already been created for the given {@link ImageDescriptor}
+	 */
+	private Image getImage(ImageDescriptor imgDesc) {
+		if (imgDesc == null)
+			return null;
+
+		Image img= (Image) fImages.get(imgDesc);
+		if (img == null) {
+			img= imgDesc.createImage(false);
+			fImages.put(imgDesc, img);
+		}
+		return img;
+	}
+
+	/**
+	 * <p>Label provider for the table for configuring which categories should be displayed on the
+	 * default assist page</p>
+	 */
+	private final class DefaultPageTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+		/**
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+		 */
+		public Image getColumnImage(Object element, int columnIndex) {
+			if (columnIndex == 0)
+				return ((ModelElement) element).getImage();
+			return null;
+		}
+
+		/**
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+		 */
+		public String getColumnText(Object element, int columnIndex) {
+			switch (columnIndex) {
+	            case 0:
+	            	return ((ModelElement) element).getName();
+	            default:
+	            	Assert.isTrue(false);
+	            	return null;
+            }
+		}
+
+		/**
+		 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+		 */
+		public String getText(Object element) {
+		    return getColumnText(element, 0); // needed to make the sorter work
+		}
+	}
+
+	/**
+	 * <p>Label provider for the table for configuring which categories should be displayed on their
+	 * own content assist page</p>
+	 */
+	private final class OwnPageTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+		/**
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+		 */
+		public Image getColumnImage(Object element, int columnIndex) {
+			if (columnIndex == 0)
+				return ((ModelElement) element).getImage();
+			return null;
+		}
+
+		/**
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+		 */
+		public String getColumnText(Object element, int columnIndex) {
+			switch (columnIndex) {
+				case 0:
+					return ((ModelElement) element).getName();
+				default:
+					Assert.isTrue(false);
+				return null;
+			}
+		}
+	}
+	
+	/**
+	 * <p>PreferenceModel used to read and write the user preferences
+	 * using the {@link ICompletionProposalCategoriesConfigurationWriter}</p>
+	 */
+	private final class PreferenceModel {
+		/** private modifiable page element list */
+		private final List fPageElements;
+		
+		/** public unmodifiable page element list */
+		final List pageElements;
+		
+		/** private modifiable default page element list */
+		private final List fDefaultPageElements;
+		
+		/** public unmodifiable default page element list */
+		final List defaultPageElements;
+
+		/**
+		 * <p>Create the preference model for the given categories</p>
+		 * 
+		 * @param categories <code>{@link List}<{@link CompletionProposalCategory}></code>
+		 */
+		public PreferenceModel(List categories) {
+			//need separate lists because they will be ordered differently
+			this.fPageElements = new ArrayList();
+			this.fDefaultPageElements = new ArrayList();
+			for (Iterator it= categories.iterator(); it.hasNext();) {
+				CompletionProposalCategory category= (CompletionProposalCategory) it.next();
+				if (category.hasComputers()) {
+					ModelElement elem = new ModelElement(category);
+					fPageElements.add(elem);
+					fDefaultPageElements.add(elem);
+				}
+			}
+			//sort the lists
+			this.performDefaults();
+			
+			pageElements = Collections.unmodifiableList(fPageElements);
+			defaultPageElements = Collections.unmodifiableList(fDefaultPageElements);
+		}
+
+		/**
+		 * <p>Move the model element specified by the given index
+		 * up in the content assist page order</p>
+		 * 
+		 * @param elementIndex the index of the model element to move up
+		 */
+        public void movePageUp(int elementIndex) {
+        	Object removed = fPageElements.remove(elementIndex);
+        	fPageElements.add(elementIndex-1, removed);
+        	
+        	fConfigurationWriter.setPageOrder(getPageOrderedCategoryIDs());
+        }
+        
+        /**
+		 * <p>Move the model element specified by the given index
+		 * down in the content assist page order</p>
+		 * 
+		 * @param elementIndex the index of the model element to move up
+		 */
+        public void movePageDown(int elementIndex) {
+        	Object removed = fPageElements.remove(elementIndex);
+        	fPageElements.add(elementIndex+1, removed);
+        	
+        	fConfigurationWriter.setPageOrder(getPageOrderedCategoryIDs());
+        }
+        
+        /**
+		 * <p>Move the model element specified by the given index
+		 * up in the content assist page order</p>
+		 * 
+		 * @param elementIndex the index of the model element to move up
+		 */
+        public void moveDefaultPageCategoryUp(int elementIndex) {
+        	Object removed = fDefaultPageElements.remove(elementIndex);
+        	fDefaultPageElements.add(elementIndex-1, removed);
+        	
+        	fConfigurationWriter.setDefaultPageOrder(getDefaultPageOrderedCategoryIDs());
+        }
+        
+        /**
+		 * <p>Move the model element specified by the given index
+		 * down in the content assist page order</p>
+		 * 
+		 * @param elementIndex the index of the model element to move up
+		 */
+        public void moveDefaultPageCategoryDown(int elementIndex) {
+        	Object removed = fDefaultPageElements.remove(elementIndex);
+        	fDefaultPageElements.add(elementIndex+1, removed);
+        	
+        	fConfigurationWriter.setDefaultPageOrder(getDefaultPageOrderedCategoryIDs());
+        }
+        
+        /**
+         * @return <code>{@link List}<{@link String}></code> -
+         * List of category IDs by page order
+         */
+        private List getPageOrderedCategoryIDs() {
+        	List ordered = new ArrayList(pageElements.size());
+        	for(int i = 0; i < pageElements.size(); ++i) {
+        		ordered.add(((ModelElement)pageElements.get(i)).getId());
+        	}
+        	
+        	return ordered;
+        }
+        
+        /**
+         * @return <code>{@link List}<{@link String}></code> -
+         * List of category IDs by default page order
+         */
+        private List getDefaultPageOrderedCategoryIDs() {
+        	List ordered = new ArrayList(defaultPageElements.size());
+        	for(int i = 0; i < defaultPageElements.size(); ++i) {
+        		ordered.add(((ModelElement)defaultPageElements.get(i)).getId());
+        	}
+        	
+        	return ordered;
+        }
+        
+        /**
+         * <p>need to re-sort the lists after performing defaults</p>
+         */
+        public void performDefaults() {
+        	Collections.sort(fPageElements, fCategoryPageComparator);
+			Collections.sort(fDefaultPageElements, fCategoryDefaultPageComparator);
+        }
+	}
+	
+	/**
+	 * <p>Wraps a {@link CompletionProposalCategory} for use in the {@link PreferenceModel}</p>
+	 */
+	private final class ModelElement {
+		/** The wrapped category */
+		private final CompletionProposalCategory fCategory;
+
+		/**
+		 * <p>Create a new model element wrapping the given category</p>
+		 * 
+		 * @param category {@link CompletionProposalCategory} to be wrapped by this model element
+		 * for use in the {@link PreferenceModel}
+		 */
+		ModelElement(CompletionProposalCategory category) {
+			fCategory= category;
+		}
+		
+		/**
+		 * @return {@link Image} associated with the wrapped category
+		 */
+		Image getImage() {
+			return CodeAssistCyclingConfigurationBlock.this.getImage(fCategory.getImageDescriptor());
+		}
+		
+		/**
+		 * @return name of the wrapped category
+		 */
+		String getName() {
+			return fCategory.getDisplayName();
+		}
+		
+		String getId() {
+			return fCategory.getId();
+		}
+		
+		/**
+		 * @return <code>true</code> if the wrapped category should be displayed on the
+		 * default content assist page, <code>false</code> otherwise
+		 */
+		boolean shouldDisplayOnDefaultPage() {
+			return fConfigurationWriter.shouldDisplayOnDefaultPage(this.getId());
+		}
+		
+		/**
+		 * @param included <code>true</code> if the wrapped category should be displayed on the
+		 * default content assist page, <code>false</code> otherwise
+		 */
+		void setShouldDisplayOnDefaultPage(boolean included) {
+			fConfigurationWriter.setShouldDisplayOnDefaultPage(this.getId(), included);
+		}
+		
+		/**
+		 * @return <code>true</code> if the wrapped category should be displayed on the
+		 * its own content assist page, <code>false</code> otherwise
+		 */
+		boolean shouldDisplayOnOwnPage() {
+			return fConfigurationWriter.shouldDisplayOnOwnPage(this.getId());
+		}
+		
+		/**
+		 * @param shouldDisplay <code>true</code> if the wrapped category should be displayed on the
+		 * its own content assist page, <code>false</code> otherwise
+		 */
+		void setShouldDisplayOnOwnPage(boolean shouldDisplay) {
+			fConfigurationWriter.setShouldDisplayOnOwnPage(this.getId(), shouldDisplay);
+		}
+		
+		/**
+		 * @return the wrapped categories content assist page sort rank compared to the
+		 * other categories
+		 */
+		int getOwnPageRank() {
+			return fConfigurationWriter.getPageSortOrder(this.getId());
+		}
+		
+		/**
+		 * @return the wrapped categories content assist page sort rank compared to the
+		 * other categories
+		 */
+		int getDefaultPageRank() {
+			return fConfigurationWriter.getDefaultPageSortOrder(this.getId());
+		}
+	}
+	
+	private class ModelViewerComparator extends ViewerComparator {
+		/**
+		 * 
+		 */
+		public ModelViewerComparator(Comparator comparator) {
+			super(comparator);
+		}
+		
+		/**
+		 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+		 */
+		public int compare(Viewer viewer, Object e1, Object e2) {
+			return this.getComparator().compare(e1, e2);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/ICompletionProposalCategoriesConfigurationReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/ICompletionProposalCategoriesConfigurationReader.java
new file mode 100644
index 0000000..74c95df
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/ICompletionProposalCategoriesConfigurationReader.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.preferences;
+
+/**
+ * <p>Implementers of the <code>org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration</code>
+ * extension will need an implementation of this interface for their extension</p>
+ * 
+ * <p><b>NOTE: </b>Implementers must have a 0 argument constructor so class can be instantiated by
+ * extension.</p>
+ * 
+ * @see ICompletionProposalCategoriesConfigurationWriter
+ */
+public interface ICompletionProposalCategoriesConfigurationReader {
+	/** 
+	 * The default is to display a category on its own page
+	 * if not otherwise defined by a property.
+	 */
+	boolean DEFAULT_DISPLAY_ON_OWN_PAGE = true;
+	
+	/** The default is to display a category on the default content assist page. */
+	boolean DEFAULT_INCLUDE_ON_DEFAULTS_PAGE = true;
+	
+	/** the default sort order if none is defined by a properties extension */
+	int DEFAULT_SORT_ORDER = Integer.MAX_VALUE;
+	
+	/**
+	 * <p>Determines if the given category should be displayed on its own content
+	 * assist page</p>
+	 * 
+	 * @param categoryID determine if this category should be displayed on its own
+	 * content assist page
+	 * 
+	 * @return <code>true</code> if the given category should be displayed on its
+	 * own content assist page, <code>false</code> otherwise
+	 */
+	boolean shouldDisplayOnOwnPage(String categoryID);
+	
+	/**
+	 * <p>Determines if the given category should be displayed on the default
+	 * content assist page</p>
+	 * 
+	 * @param categoryID determine if this category should be displayed on the
+	 * default content assist page
+	 * 
+	 * @return <code>true</code> if the given category should be displayed on the
+	 * default content assist page, <code>false</code> otherwise
+	 */
+	boolean shouldDisplayOnDefaultPage(String categoryID);
+	
+	/**
+	 * <p>Determines the sort order ranking of the given category when compared
+	 * to the other categories, this is used to determine the order in which
+	 * the separate content assist pages should be displayed</p>
+	 * 
+	 * @param categoryID determine the sort order ranking of this category
+	 * 
+	 * @return the sort order ranking of the given category when compared
+	 * to the other categories
+	 */
+	int getPageSortOrder(String categoryID);
+	
+	/**
+	 * <p>Determines the sort order ranking of the given category when compared
+	 * to the other categories, this is used to determine the order in which
+	 * categories should be listed on the default page</p>
+	 * 
+	 * @param categoryID determine the sort order ranking of this category
+	 * 
+	 * @return the sort order ranking of the given category when compared
+	 * to the other categories
+	 */
+	int getDefaultPageSortOrder(String categoryID);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/ICompletionProposalCategoriesConfigurationWriter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/ICompletionProposalCategoriesConfigurationWriter.java
new file mode 100644
index 0000000..0462819
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/preferences/ICompletionProposalCategoriesConfigurationWriter.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.preferences;
+
+import java.util.List;
+
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposalCategory;
+
+/**
+ * <p>Implementers of the <code>org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration</code>
+ * extension can implement this interface if their configuration should be user edible and thus
+ * needs writing capabilities</p>
+ * 
+ * <p><b>NOTE: </b>Implementers must have a 0 argument constructor so class can be instantiated by
+ * extension.</p>
+ * 
+ * @see ICompletionProposalCategoriesConfigurationReader
+ */
+public interface ICompletionProposalCategoriesConfigurationWriter extends
+		ICompletionProposalCategoriesConfigurationReader {
+	
+	/**
+	 * <p>If a writer has a known associated properties page then that properties
+	 * page ID can be used so that error messages during the content assist process
+	 * can link to that preference page to allow the user to change the settings</p>
+	 * 
+	 * @return <code>true</code> if this writer has a known associated properties
+	 * preference page, <code>false</code> otherwise
+	 */
+	boolean hasAssociatedPropertiesPage();
+	
+	/**
+	 * @return If {@link #hasAssociatedPropertiesPage()} returns <code>true</code> then
+	 * this method must return a valid properties page ID where the user can edit the
+	 * content assist configuration, else it can return <code>null</code>
+	 */
+	String getPropertiesPageID();
+	
+	/**
+	 * <p>Sets whether or not the given category should be displayed on its own content
+	 * assist page.<p>
+	 * 
+	 * <p><b>NOTE: </b>This preference should <b>NOT</b> be saved permanently here, that action
+	 * should wait until {@link #saveConfiguration()} is called</p>
+	 * 
+	 * @param categoryID the category that should either be displayed on its own content
+	 * assist page or not
+	 * @param shouldDisplay <code>true</code> if the given category should be displayed
+	 * on its own content assist page, <code>false</code> otherwise
+	 */
+	void setShouldDisplayOnDefaultPage(String categoryID, boolean shouldDisplay);
+	
+	/**
+	 * <p>Sets whether or not the given category should be displayed on the default content
+	 * assist page.<p>
+	 * 
+	 * <p><b>NOTE: </b>This preference should <b>NOT</b> be saved permanently here, that action
+	 * should wait until {@link #saveConfiguration()} is called</p>
+	 * 
+	 * @param categoryID the category that should either be displayed on the default content
+	 * assist page or not
+	 * @param shouldDisplay <code>true</code> if the given category should be displayed
+	 * on the default content assist page, <code>false</code> otherwise
+	 */
+	void setShouldDisplayOnOwnPage(String categoryID, boolean shouldDisplay);
+	
+	/**
+	 * <p>Sets the order in which the categories should be cycled when invoking content
+	 * assist multiple times.  Event categories that are not activated to display on their
+	 * own content assist page can be listed here so that when activated to display on their
+	 * own page they have a rank.  The entire order needs to be re-set each time one category
+	 * moves because the writer has no way of knowing how to move just one category in the order</p>
+	 * 
+	 * <p><b>NOTE: </b>This preference should <b>NOT</b> be saved permanently here, that action
+	 * should wait until {@link #saveConfiguration()} is called</p>
+	 * 
+	 * @param order <code>{@link List}<{@link String}></code>
+	 * <ul><li><b>values:</b> {@link CompletionProposalCategory} IDs</li></ul>
+	 */
+	void setPageOrder(List order);
+	
+	/**
+	 * <p>Sets the order in which the categories should be listed on the default page.
+	 * Event categories that are not activated to display on the default content assist
+	 * page can be listed here so that when activated to display on the default page
+	 * they have a rank.  The entire order needs to be re-set each time one category
+	 * moves because the writer has no way of knowing how to move just one category in the order</p>
+	 * 
+	 * <p><b>NOTE: </b>This preference should <b>NOT</b> be saved permanently here, that action
+	 * should wait until {@link #saveConfiguration()} is called</p>
+	 * 
+	 * @param order <code>{@link List}<{@link String}></code>
+	 * <ul><li><b>values:</b> {@link CompletionProposalCategory} IDs</li></ul>
+	 */
+	void setDefaultPageOrder(List order);
+	
+	/**
+	 * <p>Should load the default settings from wherever they are being stored</p>
+	 */
+	void loadDefaults();
+	
+	/**
+	 * <p>Should save the configuration permanently.  Typically called after the user
+	 * changes some preferences using a preference page and then applies them, but if they do
+	 * not apply the changes then this function should not be called.  This is the reason why the
+	 * various <code>set*</code> methods should not permanently save the configuration</p>
+	 * 
+	 * @return <code>true</code> if the save was successful, <code>false</code> otherwise
+	 */
+	boolean saveConfiguration();
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/quickoutline/AbstractQuickOutlineConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/quickoutline/AbstractQuickOutlineConfiguration.java
new file mode 100644
index 0000000..33ff2d8
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/quickoutline/AbstractQuickOutlineConfiguration.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.quickoutline;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.wst.sse.ui.IContentSelectionProvider;
+
+/**
+ * Base class that provides configuration for a quick outline.
+ *
+ */
+public abstract class AbstractQuickOutlineConfiguration {
+
+	/**
+	 * Provides the label provider to be used by the quick outline
+	 * 
+	 * @return an <code>ILabelProvider</code> to be used by the quick outline
+	 */
+	public abstract ILabelProvider getLabelProvider();
+
+	/**
+	 * Provides the content provider to be used by the quick outline
+	 * 
+	 * @return a <code>ITreeContentProvider</code> to be used when providing the content of the quick outline
+	 */
+	public abstract ITreeContentProvider getContentProvider();
+
+	/**
+	 * Provides the content selection provider to be used by the quick outline. This allows
+	 * for adjusting the selection to be displayed in the outline based on the editor's selection
+	 * 
+	 * @return an <code>IContentSelectionProvider</code> used by the quick outline. By default, returns
+	 * null indicating that the selection in the editor translates to the selection in the outline.
+	 */
+	public IContentSelectionProvider getContentSelectionProvider() {
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/reconcile/ISourceReconcilingListener.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/reconcile/ISourceReconcilingListener.java
new file mode 100644
index 0000000..1109386
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/reconcile/ISourceReconcilingListener.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.sse.ui.reconcile;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.IAnnotationModel;
+
+/**
+ * A course listener for source viewer "reconciling" of a document
+ * 
+ */
+public interface ISourceReconcilingListener {
+
+	/**
+	 * Called before reconciling is started.
+	 */
+	void aboutToBeReconciled();
+
+	/**
+	 * Called after reconciling has been finished.
+	 * 
+	 * @param document
+	 *            the text document or <code>null</code> if reconciliation has
+	 *            been cancelled
+	 * @param model
+	 *            the annotation model that was changed or <code>null</code>
+	 *            if reconciliation has been cancelled
+	 * @param forced
+	 *            <code>true</code> iff this reconciliation was forced
+	 * @param progressMonitor
+	 *            the progress monitor
+	 */
+	void reconciled(IDocument document, IAnnotationModel model, boolean forced, IProgressMonitor progressMonitor);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/typing/AbstractCharacterPairInserter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/typing/AbstractCharacterPairInserter.java
new file mode 100644
index 0000000..653965b
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/typing/AbstractCharacterPairInserter.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.typing;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.link.ILinkedModeListener;
+import org.eclipse.jface.text.link.LinkedModeModel;
+import org.eclipse.jface.text.link.LinkedModeUI;
+import org.eclipse.jface.text.link.LinkedPosition;
+import org.eclipse.jface.text.link.LinkedPositionGroup;
+import org.eclipse.jface.text.link.LinkedModeUI.ExitFlags;
+import org.eclipse.jface.text.link.LinkedModeUI.IExitPolicy;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+abstract public class AbstractCharacterPairInserter {
+
+	class ExitPolicy implements IExitPolicy {
+
+		private char fExit;
+		private char fEscape;
+		private IDocument fDocument;
+
+		public ExitPolicy(char exit, char escape, IDocument document) {
+			fExit = exit;
+			fEscape = escape;
+			fDocument = document;
+		}
+
+		public ExitFlags doExit(LinkedModeModel model, VerifyEvent event, int offset, int length) {
+			if(!isMasked(offset)) {
+				if (event.character == fExit)
+					return new ExitFlags(ILinkedModeListener.UPDATE_CARET, false);
+			}
+			return null;
+		}
+
+		private boolean isMasked(int offset) {
+			try {
+				return fEscape == fDocument.getChar(offset - 1);
+			} catch (BadLocationException e) {
+			}
+			return false;
+		}
+	}
+
+	/**
+	 * Pair the character <code>c</code> in the source viewer <code>viewer</code>.
+	 * Positions are linked before and after the inserted character.
+	 * 
+	 * @param viewer the source viewer to add the linked mode to
+	 * @param c the character to pair with
+	 * @return true if the character was successfully paired; false otherwise
+	 */
+	public boolean pair(final ISourceViewer viewer, final char c) {
+		if (!shouldPair(viewer, c))
+			return false;
+
+		final char mc = getPair(c);
+		final char[] chars = new char[2];
+		chars[0] = c;
+		chars[1] = mc;
+
+		IDocument document = viewer.getDocument();
+
+		final Point selection= viewer.getSelectedRange();
+		final int offset= selection.x;
+		final int length= selection.y;
+
+		boolean paired = false;
+		try {
+			document.replace(offset, length, new String(chars));
+			LinkedModeModel model = new LinkedModeModel();
+			LinkedPositionGroup group = new LinkedPositionGroup();
+			group.addPosition(new LinkedPosition(document, offset + 1, 0, LinkedPositionGroup.NO_STOP));
+			model.addGroup(group);
+			model.forceInstall();
+
+			LinkedModeUI ui = new LinkedModeUI(model, viewer);
+			ui.setCyclingMode(LinkedModeUI.CYCLE_NEVER);
+			ui.setExitPosition(viewer, offset + 2, 0, Integer.MAX_VALUE);
+			ui.setExitPolicy(getExitPolicy(mc, getEscapeChar(c), document));
+			ui.setSimpleMode(true);
+			ui.enter();
+
+			paired = true;
+		} catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+		return paired;
+	}
+
+	/**
+	 * Hook to evaluate if the character should be paired. Clients may override
+	 * to evaluate the case.
+	 * @param viewer the source viewer where the character would be paired
+	 * @param c the character to pair
+	 * @return true if the character should have its pair character inserted; false otherwise
+	 */
+	protected boolean shouldPair(ISourceViewer viewer, char c) {
+		return true;
+	}
+
+	/**
+	 * Can the character be paired by the inserter
+	 * @param c the character of interest
+	 * @return true if the character can be paired by the inserter; false otherwise
+	 */
+	abstract public boolean hasPair(char c);
+
+	/**
+	 * Get the paired character for <code>c</code>
+	 * @param c the character to find the pair of
+	 * @return the pair character
+	 */
+	abstract protected char getPair(char c);
+
+	/**
+	 * Gets the escape character for <code>c</code> in case <code>c</code> is to be used
+	 * within the paired characters
+	 * @param c the character to find the escape character of
+	 * @return the escape character
+	 */
+	protected char getEscapeChar(char c) {
+		return 0;
+	}
+
+	public void initialize() {
+	}
+
+	public void dispose() {
+	}
+
+	protected IExitPolicy getExitPolicy(char exit, char escape, IDocument document) {
+		return new ExitPolicy(exit, escape, document);
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/contentoutline/ContentOutlineConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/contentoutline/ContentOutlineConfiguration.java
new file mode 100644
index 0000000..d8cbf59
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/contentoutline/ContentOutlineConfiguration.java
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.views.contentoutline;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.TransferDragSourceListener;
+import org.eclipse.jface.util.TransferDropTargetListener;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateAction;
+import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateActionContributionItem;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
+
+/**
+ * Basic Configuration class for Outline Pages
+ * 
+ * @since 1.0
+ */
+public abstract class ContentOutlineConfiguration {
+	/**
+	 * Add a collapse action to help with navigation.
+	 */
+	private class CollapseTreeAction extends Action {
+		private TreeViewer fTreeViewer = null;
+
+		public CollapseTreeAction(TreeViewer viewer) {
+			super(SSEUIMessages.ContentOutlineConfiguration_0, AS_PUSH_BUTTON); //$NON-NLS-1$
+			setImageDescriptor(COLLAPSE_E);
+			setDisabledImageDescriptor(COLLAPSE_D);
+			setToolTipText(getText());
+			fTreeViewer = viewer;
+		}
+
+		public void run() {
+			super.run();
+			fTreeViewer.collapseAll();
+		}
+	}
+
+	/**
+	 * Toggles whether incoming selection notification affects us
+	 */
+	private class ToggleLinkAction extends PropertyChangeUpdateAction {
+		public ToggleLinkAction(IPreferenceStore store, String preference) {
+			super(SSEUIMessages.ContentOutlineConfiguration_1, store, preference, true); //$NON-NLS-1$
+			setToolTipText(getText());
+			setDisabledImageDescriptor(SYNCED_D);
+			setImageDescriptor(SYNCED_E);
+			update();
+		}
+
+		public void update() {
+			super.update();
+			setLinkWithEditor(isChecked());
+		}
+	}
+
+	ImageDescriptor COLLAPSE_D = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_DLCL_COLLAPSEALL);
+	ImageDescriptor COLLAPSE_E = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_ELCL_COLLAPSEALL);
+
+	private boolean fIsLinkWithEditor = false;
+
+	private ILabelProvider fLabelProvider;
+	private IContributionItem[] fMenuContributions = null;
+	private IContributionItem[] fToolbarContributions = null;
+	private final String OUTLINE_LINK_PREF = "outline-link-editor"; //$NON-NLS-1$
+	ImageDescriptor SYNCED_D = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_DLCL_SYNCED);
+	ImageDescriptor SYNCED_E = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_ELCL_SYNCED);
+
+	/**
+	 * Create new instance of ContentOutlineConfiguration
+	 */
+	public ContentOutlineConfiguration() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+	}
+
+	/**
+	 * Creates the contributions for the view's local menu. Subclasses should
+	 * merge their contributions with these.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return menu contributions
+	 */
+	protected IContributionItem[] createMenuContributions(TreeViewer viewer) {
+		IContributionItem toggleLinkItem = new PropertyChangeUpdateActionContributionItem(new ToggleLinkAction(getPreferenceStore(), OUTLINE_LINK_PREF));
+		IContributionItem[] items = new IContributionItem[]{toggleLinkItem};
+		return items;
+	}
+
+	/**
+	 * Creates the toolbar contributions. Subclasses should merge their
+	 * contributions with these.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return toolbar contributions
+	 */
+	protected IContributionItem[] createToolbarContributions(TreeViewer viewer) {
+		IContributionItem collapseAllItem = new ActionContributionItem(new CollapseTreeAction(viewer));
+		IContributionItem[] items = new IContributionItem[]{collapseAllItem};
+		return items;
+	}
+
+	/**
+	 * Returns the ContentProvider to use with the given viewer.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return the IContentProvider to use with this viewer
+	 */
+	public abstract IContentProvider getContentProvider(TreeViewer viewer);
+
+	/**
+	 * Returns an array of KeyListeners to attach to the given viewer's
+	 * control or null.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return an array of KeyListeners to attach to the TreeViewer's Control,
+	 *         or null. The listeners should adhere to the KeyEvent.doit field
+	 *         to ensure proper behaviors. Ordering of the event notifications
+	 *         is dependent on the Control in the TreeViewer.
+	 */
+	public KeyListener[] getKeyListeners(TreeViewer viewer) {
+		return null;
+	}
+
+	/**
+	 * Returns the LabelProvider for the items within the given viewer.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return the ILabelProvider for items within the viewer
+	 */
+	public ILabelProvider getLabelProvider(TreeViewer viewer) {
+		if (fLabelProvider == null)
+			fLabelProvider = new LabelProvider();
+		return fLabelProvider;
+	}
+
+	/**
+	 * Returns the menu contribution items for the local menu in the outline.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return IContributionItem[] for the local menu
+	 */
+	public final IContributionItem[] getMenuContributions(TreeViewer viewer) {
+		if (fMenuContributions == null) {
+			fMenuContributions = createMenuContributions(viewer);
+		}
+		return fMenuContributions;
+	}
+
+	/**
+	 * Returns the menu listener to notify when the given viewer's context
+	 * menu is about to be shown or null.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return the IMenuListener to notify when the viewer's context menu is
+	 *         about to be shown, or null
+	 */
+	public IMenuListener getMenuListener(TreeViewer viewer) {
+		return null;
+	}
+
+	/**
+	 * Returns the PreferenceStore to use for this configuration.
+	 * 
+	 * @return the preference store in which to remember preferences (such as
+	 *         the link-with-editor toggle state)
+	 */
+	protected IPreferenceStore getPreferenceStore() {
+		return SSEUIPlugin.getInstance().getPreferenceStore();
+	}
+
+	/**
+	 * Returns the (filtered) selection from the given selection.
+	 * 
+	 * @param selection
+	 *            model selection
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return The (filtered) selection from this event. Uses include mapping
+	 *         model selection onto elements provided by the content provider.
+	 *         Should only return elements that will be shown in the Tree
+	 *         Control.
+	 */
+	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
+		return selection;
+	}
+
+	/**
+	 * @since 2.0
+	 * @param treeViewer
+	 * @return a label provider providing the status line contents
+	 */
+	public ILabelProvider getStatusLineLabelProvider(TreeViewer treeViewer) {
+		return null;
+	}
+
+	/**
+	 * Returns contribution items for the local toolbar in the outline.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 * @return IContributionItem[] for the local toolbar
+	 */
+	public final IContributionItem[] getToolbarContributions(TreeViewer viewer) {
+		if (fToolbarContributions == null) {
+			fToolbarContributions = createToolbarContributions(viewer);
+		}
+		return fToolbarContributions;
+	}
+
+	/**
+	 * Adopted since you can't easily removeDragSupport from
+	 * StructuredViewers.
+	 * 
+	 * @param treeViewer
+	 *            the TreeViewer associated with this configuration
+	 * @return an array of TransferDragSourceListeners
+	 */
+	public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
+		return new TransferDragSourceListener[0];
+	}
+
+	/**
+	 * Adopted since you can't easily removeDropSupport from
+	 * StructuredViewers.
+	 * 
+	 * @param treeViewer
+	 *            the TreeViewer associated with this configuration
+	 * @return an array of TransferDropTargetListeners
+	 */
+	public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
+		return new TransferDropTargetListener[0];
+	}
+
+	/**
+	 * Returns true if node selection changes affect selection in the
+	 * TreeViewer.
+	 * 
+	 * @param treeViewer
+	 *            the TreeViewer associated with this configuration
+	 * @return true if outline is currently linked to selection in editor,
+	 *         false otherwise
+	 */
+	public boolean isLinkedWithEditor(TreeViewer treeViewer) {
+		return fIsLinkWithEditor;
+	}
+
+	/**
+	 * Sets whether or not outline view should be linked with selection in
+	 * editor.
+	 * 
+	 * @param isLinkWithEditor
+	 *            The isLinkWithEditor to set.
+	 */
+	void setLinkWithEditor(boolean isLinkWithEditor) {
+		fIsLinkWithEditor = isLinkWithEditor;
+	}
+
+	/**
+	 * General hook for resource releasing and listener removal when
+	 * configurations change or the viewer is disposed of. This implementation
+	 * stops of any remaining PropertyChangeUpdateActionContributionItem from
+	 * preference listening.
+	 * 
+	 * @param viewer
+	 *            the TreeViewer associated with this configuration
+	 */
+	public void unconfigure(TreeViewer viewer) {
+		if (fToolbarContributions != null) {
+			for (int i = 0; i < fToolbarContributions.length; i++) {
+				if (fToolbarContributions[i] instanceof PropertyChangeUpdateActionContributionItem) {
+					((PropertyChangeUpdateActionContributionItem) fToolbarContributions[i]).disconnect();
+				}
+			}
+			fToolbarContributions = null;
+		}
+		if (fMenuContributions != null) {
+			for (int i = 0; i < fMenuContributions.length; i++) {
+				if (fMenuContributions[i] instanceof PropertyChangeUpdateActionContributionItem) {
+					((PropertyChangeUpdateActionContributionItem) fMenuContributions[i]).disconnect();
+				}
+			}
+			fMenuContributions = null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/properties/IPropertySourceExtension.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/properties/IPropertySourceExtension.java
new file mode 100644
index 0000000..d74eee9
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/properties/IPropertySourceExtension.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.views.properties;
+
+/**
+ * Declares that this IPropertySource might support outright removal of a
+ * property
+ * 
+ * @since 1.0
+ */
+public interface IPropertySourceExtension {
+
+	/**
+	 * Returns true if the property matching the given name can be removed,
+	 * false otherwise.
+	 * 
+	 * @param name
+	 *            the name of the property
+	 * @return whether the property matching this name can be removed
+	 */
+	boolean isPropertyRemovable(Object name);
+
+	/**
+	 * Removes the property with the given displayed name. If no such property
+	 * exists, nothing is done.
+	 * 
+	 * @param name
+	 *            the displayed name of the property
+	 */
+	void removeProperty(Object name);
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/properties/PropertySheetConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/properties/PropertySheetConfiguration.java
new file mode 100644
index 0000000..f89e38d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/views/properties/PropertySheetConfiguration.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.views.properties;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+
+
+/**
+ * Configuration class for Property Sheet Pages. Not finalized.
+ * 
+ * @since 1.0
+ */
+public abstract class PropertySheetConfiguration {
+	/**
+	 * Create new instance of PropertySheetConfiguration
+	 */
+	public PropertySheetConfiguration() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+	}
+
+	/**
+	 * Adds contribution menu items to the given menuManager, toolbarManager,
+	 * statusLineManager.
+	 * 
+	 * @param menuManager
+	 *            the local menu manager of the property sheet
+	 * @param toolBarManager
+	 *            the local toolbar manager of the property sheet
+	 * @param statusLineManager
+	 *            the status line manager of the property sheet
+	 */
+	public void addContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
+		// do nothing
+	}
+
+	/**
+	 * Allows for filteration of selection before being sent to the viewer.
+	 * 
+	 * @param selectingPart
+	 *            may be null
+	 * @param selection
+	 *            model selection
+	 * @return the (filtered) selection to be sent to the viewer
+	 */
+	public ISelection getInputSelection(IWorkbenchPart selectingPart, ISelection selection) {
+		ISelection preferredSelection = selection;
+		if (selection instanceof IStructuredSelection) {
+			// don't support more than one selected node
+			if (((IStructuredSelection) selection).size() > 1)
+				preferredSelection = StructuredSelection.EMPTY;
+		}
+		return preferredSelection;
+	}
+
+	/**
+	 * Returns the correct IPropertySourceProvider.
+	 * 
+	 * @param page
+	 *            the page to be configured by this configuration
+	 * @return the IPropertySourceProvider for the given page
+	 */
+	public abstract IPropertySourceProvider getPropertySourceProvider(IPropertySheetPage page);
+
+	/**
+	 * Removes contribution menu items from the given menuManager,
+	 * toolbarManager, statusLineManager.
+	 * 
+	 * @param menuManager
+	 *            the local menu manager of the property sheet
+	 * @param toolBarManager
+	 *            the local toolbar manager of the property sheet
+	 * @param statusLineManager
+	 *            the status line manager of the property sheet
+	 */
+	public void removeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
+		// do nothing
+	}
+
+	/**
+	 * General hook for resource releasing and listener removal when
+	 * configurations change.
+	 */
+	public void unconfigure() {
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/testToc.xml b/bundles/org.eclipse.wst.sse.ui/testToc.xml
new file mode 100644
index 0000000..6142b90
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/testToc.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc
+	label="Test TOC"
+	topic="html/toc.html">
+	<link toc="toc.xml" />
+</toc>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/toc.xml b/bundles/org.eclipse.wst.sse.ui/toc.xml
new file mode 100644
index 0000000..a5c0bb6
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/toc.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Sample Table of Contents">
+	<topic
+		label="Main Topic"
+		href="html/maintopic.html">
+		<topic
+			label="Sub Topic"
+			href="html/subtopic.html" />
+	</topic>
+	<topic label="Main Topic 2" />
+</toc>
diff --git a/bundles/org.eclipse.wst.xml.core/.options b/bundles/org.eclipse.wst.xml.core/.options
index 046e4f6..31db1ad 100644
--- a/bundles/org.eclipse.wst.xml.core/.options
+++ b/bundles/org.eclipse.wst.xml.core/.options
@@ -1,4 +1,5 @@
 org.eclipse.wst.xml.core/debug=true
 org.eclipse.wst.xml.core/debug/tracefilter=
 org.eclipse.wst.xml.core/debug/cmdocumentmanager=false
-org.eclipse.wst.xml.core/debug/cmdocumentcache=false
\ No newline at end of file
+org.eclipse.wst.xml.core/debug/cmdocumentcache=false
+org.eclipse.wst.xml.core/externalSchemaLocation=false
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xml.core/META-INF/MANIFEST.MF
index af632b8..84a387d 100644
--- a/bundles/org.eclipse.wst.xml.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.xml.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.xml.core; singleton:=true
-Bundle-Version: 1.1.301.qualifier
+Bundle-Version: 1.1.505.qualifier
 Bundle-Activator: org.eclipse.wst.xml.core.internal.XMLCorePlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -57,18 +57,20 @@
  org.eclipse.wst.xml.core.internal.validation.eclipse;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
  org.eclipse.wst.xml.core.internal.validation.errorcustomization;x-friends:="org.eclipse.wst.dtd.core,org.eclipse.wst.dtd.ui,org.eclipse.wst.xml.ui,org.eclipse.wst.xsd.core,org.eclipse.wst.xsd.ui",
  org.eclipse.wst.xml.core.text
+Import-Package: com.ibm.icu.util; version="3.8",
+ com.ibm.icu.text; version="3.8"
 Require-Bundle: org.apache.xerces;bundle-version="[2.9.0,3.0.0)";visibility:=reexport,
- org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.filebuffers;bundle-version="[3.5.0,4.0.0)";resolution:=optional,
  org.eclipse.wst.common.uriresolver;bundle-version="[1.1.301,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,1.2.0)",
- org.eclipse.jem.util;bundle-version="[2.0.100,3.0.0)";resolution:=optional,
- org.eclipse.wst.validation;bundle-version="[1.2.0,1.3.0)";resolution:=optional,
- org.eclipse.emf.ecore.edit;bundle-version="[2.4.0,3.0.0)";resolution:=optional,
- org.eclipse.wst.common.emf;bundle-version="[1.1.104,1.2.0)";resolution:=optional,
+ org.eclipse.wst.sse.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.200,3.0.0)";resolution:=optional,
+ org.eclipse.wst.validation;bundle-version="[1.2.100,1.3.0)";resolution:=optional,
+ org.eclipse.wst.common.emf;bundle-version="[1.1.300,1.3.0)";resolution:=optional,
  org.eclipse.emf.ecore.xmi;bundle-version="[2.4.0,3.0.0)";resolution:=optional,
- org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.200,1.2.0)";resolution:=optional,
- org.eclipse.wst.common.core;bundle-version="[1.1.101,1.2.0)",
- com.ibm.icu;bundle-version="[3.8.1,4.0.0)"
+ org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.300,1.3.0)";resolution:=optional,
+ org.eclipse.wst.common.core;bundle-version="[1.1.201,1.3.0)",
+ org.eclipse.osgi.services;bundle-version="[3.2.0,4.0.0)"
 Bundle-ActivationPolicy: lazy; exclude:="org.eclipse.wst.xml.core.internal.contenttype"
 Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.xml.core/build.properties b/bundles/org.eclipse.wst.xml.core/build.properties
index e49a2dc..8d49b33 100644
--- a/bundles/org.eclipse.wst.xml.core/build.properties
+++ b/bundles/org.eclipse.wst.xml.core/build.properties
@@ -21,10 +21,9 @@
                @dot/**,\
                temp.folder/**
 src.includes = component.xml,\
-               build.properties,\
                schema/,\
                DevTimeSupport/
-source.. = src-catalog,\
+source.. = src-catalog/,\
            src-contentmodel/,\
            src-validation/,\
            src/,\
diff --git a/bundles/org.eclipse.wst.xml.core/plugin.properties b/bundles/org.eclipse.wst.xml.core/plugin.properties
index b954490..0e9ea2b 100644
--- a/bundles/org.eclipse.wst.xml.core/plugin.properties
+++ b/bundles/org.eclipse.wst.xml.core/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2001, 2008 IBM Corporation and others.
+# Copyright (c) 2001, 2010 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -10,7 +10,7 @@
 #     Jens Lukowski/Innoopract - initial renaming/restructuring
 #     
 ###############################################################################
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 pluginName=Structured Source XML Model
 Structured_XML_Document_Factory_Extension.name=Structured XML Document Factory Extension
 XML_Content_Type_Extension_Element.name=XML (Illformed)
@@ -23,5 +23,6 @@
 XMI_Content_Type=XMI
 XML_Validator.name=XML Validator
 XML_Validation_Error_Customizer.name=XML Validator Error Customizer Extension Point
+External_Schema_Location.name=XML External Schema Location Extension Point
 _validationMarker.name=XML Problem
-_taskMarker.name=XML Task
\ No newline at end of file
+_taskMarker.name=XML Task
diff --git a/bundles/org.eclipse.wst.xml.core/plugin.xml b/bundles/org.eclipse.wst.xml.core/plugin.xml
index 8ebaa6f..cf6ec4e 100644
--- a/bundles/org.eclipse.wst.xml.core/plugin.xml
+++ b/bundles/org.eclipse.wst.xml.core/plugin.xml
@@ -4,6 +4,7 @@
 
    <!-- An extension for contributing a XML validation error customizer. -->
    <extension-point id="errorCustomizer" name="%XML_Validation_Error_Customizer.name" schema="schema/errorCustomizer.exsd"/>
+	<extension-point id="externalSchemaLocations" name="%External_Schema_Location.name" schema="schema/externalSchemaLocations.exsd"/>
 
 	<extension point="org.eclipse.wst.sse.core.modelHandler">
 		<modelHandler
@@ -112,7 +113,7 @@
 	<!--  https://bugs.eclipse.org/bugs/show_bug.cgi?id=103083 -->\
 	<!--  FYI: this xmi type *should* be defined in EMF, but, since isn't
 			we will here. In future versions is could be removed -->
-	<extension point="org.eclipse.core.runtime.contentTypes">
+	<extension point="org.eclipse.core.contenttype.contentTypes">
 		<content-type
 			file-extensions="xmi"
 			priority="low"
@@ -192,14 +193,6 @@
                      caseSensitive="false"
                      ext="xml">
                </fileext>
-               <fileext
-                     caseSensitive="false"
-                     ext="gph">
-               </fileext>
-               <fileext
-                     caseSensitive="false"
-                     ext="wdo-connections">
-               </fileext>
             </rules>
          </include>
          <exclude>
diff --git a/bundles/org.eclipse.wst.xml.core/schema/externalSchemaLocations.exsd b/bundles/org.eclipse.wst.xml.core/schema/externalSchemaLocations.exsd
new file mode 100644
index 0000000..2031c77
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/schema/externalSchemaLocations.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.xml.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.xml.core" id="externalSchemaLocations" name="External Schema Locations"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="provider"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="provider">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.xml.core.internal.contentmodel.modelquery.IExternalSchemaLocationProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/bundles/org.eclipse.wst.xml.core/schema/modelQueryExtensions.exsd b/bundles/org.eclipse.wst.xml.core/schema/modelQueryExtensions.exsd
index ecddf01..6b2f977 100644
--- a/bundles/org.eclipse.wst.xml.core/schema/modelQueryExtensions.exsd
+++ b/bundles/org.eclipse.wst.xml.core/schema/modelQueryExtensions.exsd
@@ -1,16 +1,21 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.xml.core">
+<schema targetNamespace="org.eclipse.wst.xml.core" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
-      <appInfo>
+      <appinfo>
          <meta.schema plugin="org.eclipse.wst.xml.core" id="modelQueryExtensions" name="Model Query Extension"/>
-      </appInfo>
+      </appinfo>
       <documentation>
          &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
       </documentation>
    </annotation>
 
    <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element internal="true" />
+         </appinfo>
+      </annotation>
       <complexType>
          <sequence>
             <element ref="modelQueryExtension"/>
@@ -34,30 +39,35 @@
                <documentation>
                   an optional name of the extension instance
                </documentation>
-               <appInfo>
+               <appinfo>
                   <meta.attribute translatable="true"/>
-               </appInfo>
+               </appinfo>
             </annotation>
          </attribute>
       </complexType>
    </element>
 
    <element name="modelQueryExtension">
+      <annotation>
+         <documentation>
+            Allows for the customization of returned vaues from a ModelQuery object.
+         </documentation>
+      </annotation>
       <complexType>
          <attribute name="class" type="string" use="required">
             <annotation>
                <documentation>
                   
                </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.xml.core.internal.contentmodel.modelquery.extension.ModelQueryExtension:"/>
+               </appinfo>
             </annotation>
          </attribute>
          <attribute name="contentType" type="string" use="required">
             <annotation>
                <documentation>
-                  
+                  Content Types for which to use this extension
                </documentation>
             </annotation>
          </attribute>
@@ -65,45 +75,21 @@
    </element>
 
    <annotation>
-      <appInfo>
+      <appinfo>
          <meta.section type="since"/>
-      </appInfo>
+      </appinfo>
       <documentation>
          &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
       </documentation>
    </annotation>
 
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
+
+
 
    <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
+      <appinfo>
          <meta.section type="copyright"/>
-      </appInfo>
+      </appinfo>
       <documentation>
          Copyright (c) 2000, 2005 IBM Corporation and others.&lt;br&gt;
 All rights reserved. This program and the accompanying materials are made 
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/Catalog.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/Catalog.java
index d071382..6586c01 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/Catalog.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/Catalog.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
  *     
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.catalog;
@@ -17,8 +18,11 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -30,7 +34,10 @@
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEvent;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogListener;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
 public class Catalog implements ICatalog
 {
 
@@ -75,6 +82,42 @@
 		}
 	}
 
+	private static Comparator LONGEST_REWRITE_FIRST = new Comparator() 
+	{
+		public int compare(Object entry1, Object entry2) 
+		{
+			String start1 = ((IRewriteEntry)entry1).getStartString();
+			String start2 = ((IRewriteEntry)entry2).getStartString();
+			
+			// Bigger is earlier
+			return start2.length() - start1.length();
+		}
+	};
+
+	private static Comparator LONGEST_SUFFIX_FIRST = new Comparator() 
+	{
+		public int compare(Object entry1, Object entry2) 
+		{
+			String suffix1 = ((ISuffixEntry)entry1).getSuffix();
+			String suffix2 = ((ISuffixEntry)entry2).getSuffix();
+			
+			// Bigger is earlier
+			return suffix2.length() - suffix1.length();
+		}
+	};
+
+	private static Comparator LONGEST_DELEGATE_PREFIX_FIRST = new Comparator() 
+	{
+		public int compare(Object entry1, Object entry2) 
+		{
+			String prefix1 = ((IDelegateCatalog)entry1).getStartString();
+			String prefix2 = ((IDelegateCatalog)entry2).getStartString();
+			
+			// Bigger is earlier
+			return prefix2.length() - prefix1.length();
+		}
+	};
+
 	class InternalResolver
 	{
 		protected Map publicMap = new HashMap();
@@ -83,6 +126,15 @@
 
 		protected Map uriMap = new HashMap();
 
+		// These are sorted by longest "key" first.
+		protected List rewriteSystemList = new LinkedList();
+		protected List rewriteUriList = new LinkedList();
+		protected List suffixSystemList = new LinkedList();
+		protected List suffixUriList = new LinkedList();
+		protected List delegatePublicList = new LinkedList();
+		protected List delegateSystemList = new LinkedList();
+		protected List delegateUriList = new LinkedList();
+		
 		InternalResolver()
 		{
 			for (Iterator i = catalogElements.iterator(); i.hasNext();)
@@ -93,8 +145,58 @@
 					ICatalogEntry entry = (ICatalogEntry) catalogElement;
 					Map map = getEntryMap(entry.getEntryType());
 					map.put(entry.getKey(), entry);
+				} 
+				else if (catalogElement.getType() == ICatalogElement.TYPE_REWRITE) 
+				{
+					IRewriteEntry entry = (IRewriteEntry) catalogElement;
+					if (entry.getEntryType() == IRewriteEntry.REWRITE_TYPE_SYSTEM) 
+					{
+						rewriteSystemList.add(entry);
+					} 
+					else 
+					{
+						rewriteUriList.add(entry);
+					}
+				} 
+				else if (catalogElement.getType() == ICatalogElement.TYPE_SUFFIX) 
+				{
+					ISuffixEntry entry = (ISuffixEntry) catalogElement;
+					if (entry.getEntryType() == ISuffixEntry.SUFFIX_TYPE_SYSTEM) 
+					{
+						suffixSystemList.add(entry);
+					} 
+					else 
+					{
+						suffixUriList.add(entry);
+					}
+				} 
+				else if (catalogElement.getType() == ICatalogElement.TYPE_DELEGATE) 
+				{
+					IDelegateCatalog delegate = (IDelegateCatalog) catalogElement;
+					if (delegate.getEntryType() == IDelegateCatalog.DELEGATE_TYPE_PUBLIC) 
+					{
+						delegatePublicList.add(delegate);
+					}
+					else if (delegate.getEntryType() == IDelegateCatalog.DELEGATE_TYPE_SYSTEM) 
+					{
+						delegateSystemList.add(delegate);
+					}
+					else 
+					{
+						delegateUriList.add(delegate);
+					}
 				}
 			}
+			
+			Collections.sort(rewriteSystemList, LONGEST_REWRITE_FIRST);
+			Collections.sort(rewriteUriList, LONGEST_REWRITE_FIRST);
+
+			Collections.sort(suffixSystemList, LONGEST_SUFFIX_FIRST);
+			Collections.sort(suffixUriList, LONGEST_SUFFIX_FIRST);
+		
+			Collections.sort(delegatePublicList, LONGEST_DELEGATE_PREFIX_FIRST);
+			Collections.sort(delegateSystemList, LONGEST_DELEGATE_PREFIX_FIRST);
+			Collections.sort(delegateUriList, LONGEST_DELEGATE_PREFIX_FIRST);
 		}
 
 		private Map getEntryMap(int entryType)
@@ -160,6 +262,10 @@
 			}
 			if (result == null)
 			{
+				result = resolveDelegateCatalogs(delegatePublicList, publicId, systemId);
+			}
+			if (result == null)
+			{
 				result = resolveSubordinateCatalogs(
 						ICatalogEntry.ENTRY_TYPE_PUBLIC, publicId, systemId);
 			}
@@ -172,18 +278,103 @@
 			String result = getMappedURI(systemMap, systemId);
 			if (result == null)
 			{
+				result = resolveRewrite(rewriteSystemList, systemId);
+			}
+			if (result == null)
+			{
+				result = resolveSuffix(suffixSystemList, systemId);
+			}
+			if (result == null)
+			{
+				result = resolveDelegateCatalogs(delegateSystemList, systemId, systemId); // systemId is the key for "startString"
+			}
+			if (result == null)
+			{
 				result = resolveSubordinateCatalogs(
 						ICatalogEntry.ENTRY_TYPE_SYSTEM, null, systemId);
 			}
 			return result;
 		}
 
+		private String resolveRewrite(List rewriteList, String searchString) 
+		{
+			for (Iterator it = rewriteList.iterator(); it.hasNext();) 
+			{
+				IRewriteEntry entry = (IRewriteEntry) it.next();
+				String startString = entry.getStartString();
+				if (searchString.startsWith(startString)) 
+				{
+					return entry.getRewritePrefix() + searchString.substring(startString.length());
+				}
+			}
+			return null;
+		}
+
+		private String resolveSuffix(List suffixList, String searchString) {
+			for (Iterator it = suffixList.iterator(); it.hasNext();) {
+				ISuffixEntry entry = (ISuffixEntry) it.next();
+				if (searchString.endsWith(entry.getSuffix())) {
+					return entry.getURI();
+				}
+			}
+			return null;
+		}
+
+		protected String resolveDelegateCatalogs(List delegateCatalogs, String key,
+				String systemId) throws MalformedURLException, IOException
+		{
+			String result = null;
+			for (Iterator iterator = delegateCatalogs.iterator(); iterator
+					.hasNext();) {
+				IDelegateCatalog delegate = (IDelegateCatalog) iterator.next();
+				
+				if (key.startsWith(delegate.getStartString())) {
+	
+					ICatalog catalog = delegate.getReferencedCatalog();
+					if (catalog != null)
+					{
+						switch (delegate.getEntryType())
+						{
+						case IDelegateCatalog.DELEGATE_TYPE_PUBLIC:
+							result = catalog.resolvePublic(key, systemId);
+							break;
+						case IDelegateCatalog.DELEGATE_TYPE_SYSTEM:
+							result = catalog.resolveSystem(systemId);
+							break;
+						case IDelegateCatalog.DELEGATE_TYPE_URI:
+							result = catalog.resolveURI(systemId);
+							break;
+						default:
+							break;
+						}
+						if (result != null)
+						{
+							return result;
+						}
+					}
+				}
+			}
+			return null;
+		}
+		
 		public String resolveURI(String uri) throws MalformedURLException,
 				IOException
 		{
 			String result = getMappedURI(uriMap, uri);
 			if (result == null)
 			{
+				result = resolveRewrite(rewriteUriList, uri);
+			}
+			if (result == null)
+			{
+				result = resolveSuffix(suffixUriList, uri);
+			}
+			if (result == null)
+			{
+				result = resolveDelegateCatalogs(delegateUriList, uri, uri); // uri is treated as the systemId
+			}
+			if (result == null)
+			{
 				result = resolveSubordinateCatalogs(
 						ICatalogEntry.ENTRY_TYPE_URI, null, uri);
 			}
@@ -213,21 +404,29 @@
 			InputStream inputStream = null;
 			try
 			{
-				URL url = new URL(location);
-				inputStream = url.openStream();
-				boolean oldNotificationEnabled = isNotificationEnabled();
-				setNotificationEnabled(false);
-				clear();
-				try
+				if (location != null && location.length() > 0) 
 				{
-					CatalogReader.read(Catalog.this, inputStream);
-				} finally
+					URL url = new URL(location);
+					inputStream = url.openStream();
+					boolean oldNotificationEnabled = isNotificationEnabled();
+					setNotificationEnabled(false);
+					clear();
+					try
+					{
+						CatalogReader.read(Catalog.this, inputStream);
+					} finally
+					{
+						setNotificationEnabled(oldNotificationEnabled);
+					}
+				}
+				else
 				{
-					setNotificationEnabled(oldNotificationEnabled);
+					clear();
 				}
 				notifyChanged();
 			} catch (Exception e)
 			{
+				// This is OK since the catalog may not exist before we create it
 			} finally
 			{
 				if (inputStream != null)
@@ -335,17 +534,28 @@
 		switch (type)
 		{
 		case ICatalogElement.TYPE_ENTRY:
-			return new CatalogEntry();
+			return new CatalogEntry(); // TODO: Should be kind of deprecated
 		case ICatalogElement.TYPE_NEXT_CATALOG:
 			return new NextCatalog();
 		case ICatalogEntry.ENTRY_TYPE_PUBLIC:
-			return new CatalogEntry(ICatalogEntry.ENTRY_TYPE_PUBLIC);
 		case ICatalogEntry.ENTRY_TYPE_SYSTEM:
-			return new CatalogEntry(ICatalogEntry.ENTRY_TYPE_SYSTEM);
 		case ICatalogEntry.ENTRY_TYPE_URI:
-			return new CatalogEntry(ICatalogEntry.ENTRY_TYPE_URI);
+			return new CatalogEntry(type);
+		case ICatalogElement.TYPE_REWRITE:	
+		case IRewriteEntry.REWRITE_TYPE_SYSTEM:
+		case IRewriteEntry.REWRITE_TYPE_URI:
+			return new RewriteEntry(type);
+		case ICatalogElement.TYPE_SUFFIX:	
+		case ISuffixEntry.SUFFIX_TYPE_SYSTEM:
+		case ISuffixEntry.SUFFIX_TYPE_URI:
+			return new SuffixEntry(type);
+		case ICatalogElement.TYPE_DELEGATE:	
+		case IDelegateCatalog.DELEGATE_TYPE_PUBLIC:
+		case IDelegateCatalog.DELEGATE_TYPE_SYSTEM:
+		case IDelegateCatalog.DELEGATE_TYPE_URI:
+			return new DelegateCatalog(type);
 		default:
-			return new CatalogElement(type);
+			throw new IllegalArgumentException("Unknown element type " + type);//$NON-NLS-1 // Makes no sense at all!
 		}
 	}
 
@@ -377,6 +587,27 @@
 				.toArray(new ICatalogEntry[result.size()]);
 	}
 
+	public IDelegateCatalog[] getDelegateCatalogs() 
+	{
+		List result = getCatalogElements(ICatalogElement.TYPE_DELEGATE);
+		return (IDelegateCatalog[]) result
+				.toArray(new IDelegateCatalog[result.size()]);
+	}
+	
+	public IRewriteEntry[] getRewriteEntries() 
+	{
+		List result = getCatalogElements(ICatalogElement.TYPE_REWRITE);
+		return (IRewriteEntry[]) result
+				.toArray(new IRewriteEntry[result.size()]);
+	}
+	
+	public ISuffixEntry[] getSuffixEntries() 
+	{
+		List result = getCatalogElements(ICatalogElement.TYPE_SUFFIX);
+		return (ISuffixEntry[]) result
+				.toArray(new ISuffixEntry[result.size()]);
+	}
+	
 	protected CatalogSet getCatalogSet()
 	{
 		return resourceSet;
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogElement.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogElement.java
index 1e51a04..ef86e22 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogElement.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Jesper Steen Moller - jesper@selskabet.org - bug 112284
  *     
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.catalog;
@@ -30,6 +31,8 @@
 
 	String id;
 
+	String base;
+
 	Map attributes = new HashMap();
 
 	ICatalog ownerCatalog;
@@ -45,6 +48,16 @@
 		return type;
 	}
 
+	public String getBase()
+	{
+		return base;
+	}
+
+	public void setBase(String base)
+	{
+		this.base = base;
+	}
+
 	public String getAttributeValue(String name)
 	{
 		return (String) attributes.get(name);
@@ -117,6 +130,11 @@
 		{
 		}
 
+		if (this.base != null && !this.base.equals("")) //$NON-NLS-1$
+		{
+			return makeAbsolute(base, path);		
+		}
+		
 		String result = path;
 		Catalog catalog = (Catalog) getOwnerCatalog();
 		if (catalog != null)
@@ -148,6 +166,7 @@
 	    }
 		element.setOwnerCatalog(ownerCatalog);
 		element.setId(id);
+		element.setBase(base);
 	    return element;
 	  }
 
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogReader.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogReader.java
index bdb88d3..d53a15b 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogReader.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogReader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
  *     
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.catalog;
@@ -26,6 +27,9 @@
 import org.eclipse.wst.xml.core.internal.XMLCoreMessages;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -43,6 +47,8 @@
     {
       SAXParserFactory factory = SAXParserFactory.newInstance();
       factory.setNamespaceAware(true);
+      factory.setValidating(false);
+      factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);//$NON-NLS-1$
       SAXParser parser = factory.newSAXParser();
       parser.parse(new InputSource(input), new CatalogContentHandler(xmlCatalog));
     }
@@ -72,111 +78,113 @@
 
     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
     {
-      // set base
+      // set base attribute xml:base
       String base = attributes.getValue(OASISCatalogConstants.ATTR_BASE); //$NON-NLS-1$
       if (base != null && !base.equals("")) //$NON-NLS-1$
       {
-          baseURIStack.push(base);
+          // since the xml:base attribute can be relative to the enclosing element's effective base, we're maintaining a
+          // stack of absolute URIs
+		  if (URI.createURI(base).isRelative())
+          {
+            base = URI.resolveRelativeURI(base, baseURIStack.peek().toString());
+          }
+
+          baseURIStack.push(URIHelper.ensureURIProtocolFormat(base));
       } else {
     	  baseURIStack.push(baseURIStack.peek());
       }
 
-	  // processing for backward compatability start
+	  // processing for backward compatibility start
 	  if (localName.equals(CompatabilityConstants.TAG_USER_ENTRY))
       {
-		int type = ICatalogEntry.ENTRY_TYPE_PUBLIC;
         String typeName = attributes.getValue("", CompatabilityConstants.ATT_TYPE); //$NON-NLS-1$
+        boolean isSystem = false;
         if (typeName != null)
         {
-          if (typeName.compareToIgnoreCase("SYSTEM") == 0) //$NON-NLS-1$
-          {
-            type = ICatalogEntry.ENTRY_TYPE_SYSTEM;
-          }
+        	isSystem = (typeName.compareToIgnoreCase("SYSTEM") == 0); //$NON-NLS-1$
         }
-		  ICatalogElement catalogElement = catalog.createCatalogElement(type);
-	      if (catalogElement instanceof CatalogEntry)
-	      {
-	        CatalogEntry catalogEntry = (CatalogEntry) catalogElement;
-		    String key = attributes.getValue("", CompatabilityConstants.ATT_ID);   		     //$NON-NLS-1$
-	        catalogEntry.setKey(key);
-	        String entryUri = attributes.getValue("", CompatabilityConstants.ATT_URI);    //$NON-NLS-1$
-	        
-	        // For relative URIs, try to resolve them using the corresponding base URI.
-	        if(URI.createURI(entryUri).isRelative()) {
-	        	entryUri = URI.resolveRelativeURI(entryUri, baseURIStack.peek().toString());
-	        }
+        ICatalogEntry catalogEntry = new CatalogEntry(isSystem ? ICatalogEntry.ENTRY_TYPE_SYSTEM : ICatalogEntry.ENTRY_TYPE_PUBLIC);
+        catalogEntry.setKey(attributes.getValue("", CompatabilityConstants.ATT_ID)); //$NON-NLS-1$
+        String entryUri = attributes.getValue("", CompatabilityConstants.ATT_URI); //$NON-NLS-1$
+        
+        // For relative URIs, try to resolve them using the corresponding base URI.
+        catalogEntry.setURI(resolveRelative(entryUri));
 
-	        catalogEntry.setURI(URIHelper.ensureURIProtocolFormat(entryUri));  
-	        String webURL = attributes.getValue("", CompatabilityConstants.ATT_WEB_URL); //$NON-NLS-1$
-			if (webURL != null)
-			{
-				catalogEntry.setAttributeValue(
-						ICatalogEntry.ATTR_WEB_URL, webURL);
-			}
-	      }
-		  catalog.addCatalogElement(catalogElement);
-		  return;
+        String webURL = attributes.getValue("", CompatabilityConstants.ATT_WEB_URL); //$NON-NLS-1$
+        if (webURL != null)
+        {
+        	catalogEntry.setAttributeValue(
+        			ICatalogEntry.ATTR_WEB_URL, webURL);
+        }
+		catalog.addCatalogElement(catalogEntry);
+		return;
       }
-	  //  processing for backward compatability start
-      
-	  int type = ICatalogEntry.ENTRY_TYPE_PUBLIC;
-	  String key = null;
-	 //dw String catalogId = attributes.getValue("", OASISCatalogConstants.ATTR_ID);
+	  //  processing for backward compatibility end
+	  ICatalogElement catalogElement = null;
+
       if (OASISCatalogConstants.TAG_PUBLIC.equals(localName))
       {
-        key = attributes.getValue("", OASISCatalogConstants.ATTR_PUBLIC_ID); //$NON-NLS-1$
+    	  // 6.5.3. The public Entry
+    	  catalogElement = createEntry(attributes, ICatalogEntry.ENTRY_TYPE_PUBLIC, OASISCatalogConstants.ATTR_PUBLIC_ID);
       }
       else if (OASISCatalogConstants.TAG_SYSTEM.equals(localName))
       {
-        key = attributes.getValue("", OASISCatalogConstants.ATTR_SYSTEM_ID); //$NON-NLS-1$
-        type = ICatalogEntry.ENTRY_TYPE_SYSTEM;
+    	  // 6.5.4. The system Element
+    	  catalogElement = createEntry(attributes, ICatalogEntry.ENTRY_TYPE_SYSTEM, OASISCatalogConstants.ATTR_SYSTEM_ID);
       }
       else if (OASISCatalogConstants.TAG_URI.equals(localName))
       {
-        key = attributes.getValue("", OASISCatalogConstants.ATTR_NAME); //$NON-NLS-1$
-        type = ICatalogEntry.ENTRY_TYPE_URI;
+    	  // 6.5.9. The uri Element
+    	  catalogElement = createEntry(attributes, ICatalogEntry.ENTRY_TYPE_URI, OASISCatalogConstants.ATTR_NAME);
+      }
+      else if (OASISCatalogConstants.TAG_REWRITE_SYSTEM.equals(localName))
+      {
+    	  // 6.5.5. The rewriteSystem Element
+    	  catalogElement = createRewrite(attributes, IRewriteEntry.REWRITE_TYPE_SYSTEM, OASISCatalogConstants.ATTR_SYSTEM_ID_START_STRING);
+      }
+      else if (OASISCatalogConstants.TAG_REWRITE_URI.equals(localName))
+      {
+    	  // 6.5.9. The uri Element
+    	  catalogElement = createRewrite(attributes, IRewriteEntry.REWRITE_TYPE_URI, OASISCatalogConstants.ATTR_URI_START_STRING);
+      }
+      else if (OASISCatalogConstants.TAG_DELEGATE_PUBLIC.equals(localName))
+      {
+    	  // 6.5.7. The delegatePublic Element
+    	  catalogElement = createDelegate(attributes, IDelegateCatalog.DELEGATE_TYPE_PUBLIC, OASISCatalogConstants.ATTR_PUBLIC_ID_START_STRING);
+      }
+      else if (OASISCatalogConstants.TAG_DELEGATE_SYSTEM.equals(localName))
+      {
+    	  // 6.5.8. The delegateSystem Element
+    	  catalogElement = createDelegate(attributes, IDelegateCatalog.DELEGATE_TYPE_SYSTEM, OASISCatalogConstants.ATTR_SYSTEM_ID_START_STRING);
+      }
+      else if (OASISCatalogConstants.TAG_DELEGATE_URI.equals(localName))
+      {
+    	  // 6.5.12. The delegateURI Element
+    	  catalogElement = createDelegate(attributes, IDelegateCatalog.DELEGATE_TYPE_URI, OASISCatalogConstants.ATTR_URI_START_STRING);
+      }
+      else if (OASISCatalogConstants.TAG_SYSTEM_SUFFIX.equals(localName))
+      {
+    	  // 6.5.6. The systemSuffix Element
+    	  catalogElement = createSuffix(attributes, ISuffixEntry.SUFFIX_TYPE_SYSTEM, OASISCatalogConstants.ATTR_SYSTEM_ID_SUFFFIX);
+      }
+      else if (OASISCatalogConstants.TAG_URI_SUFFIX.equals(localName))
+      {
+    	  // 6.5.11. The uriSuffix Element
+    	  catalogElement = createSuffix(attributes, ISuffixEntry.SUFFIX_TYPE_URI, OASISCatalogConstants.ATTR_URI_SUFFIX);
       }
       else if (OASISCatalogConstants.TAG_NEXT_CATALOG.equals(localName))
       {
-        String nextCatalogId = attributes.getValue("", OASISCatalogConstants.ATTR_ID); //$NON-NLS-1$
-
-        String location = attributes.getValue("", OASISCatalogConstants.ATTR_CATALOG);    //$NON-NLS-1$
-        NextCatalog delegate = new NextCatalog();
-        delegate.setCatalogLocation(location);  
-        delegate.setId(nextCatalogId);
-        catalog.addCatalogElement(delegate);
+        catalogElement = createNextCatalog(attributes);
+      }
+      
+      if (catalogElement == null)
+      {
+    	// do not set the extra information
         return;
       }
-      else{
-    	  // do not handle other entries
-    	  return;
-      }
-      if (key == null || key.equals("")) //$NON-NLS-1$
-      {
-        Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_entry_key_not_set);
-        return;
-      }
-      String entryURI = attributes.getValue("", OASISCatalogConstants.ATTR_URI); // mandatory //$NON-NLS-1$
-      if (entryURI == null || entryURI.equals("")) //$NON-NLS-1$
-      {
-        Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_entry_uri_not_set);
-        return;
-      }
- 
-      ICatalogElement catalogElement = catalog.createCatalogElement(type);
-      if (catalogElement instanceof CatalogEntry)
-      {
-        CatalogEntry catalogEntry = (CatalogEntry) catalogElement;
-        catalogEntry.setKey(key); 
 
-        //      For relative URIs, try to resolve them using the corresponding base URI.
-        if(URI.createURI(entryURI).isRelative()) {
-        	entryURI = URI.resolveRelativeURI(entryURI, baseURIStack.peek().toString());
-        } 
-
-        catalogEntry.setURI(URIHelper.ensureURIProtocolFormat(entryURI));     
-
-      }
+	  String attrId = attributes.getValue("", OASISCatalogConstants.ATTR_ID);//$NON-NLS-1$
+	  if (attrId != null && ! "".equals(attrId)) catalogElement.setId(attrId);//$NON-NLS-1$
       // process any other attributes
       for (int j = 0; j < attributes.getLength(); j++)
       {
@@ -196,6 +204,99 @@
 
     }
 
+	private ICatalogElement createNextCatalog(Attributes attributes) {
+		String location = attributes.getValue("", OASISCatalogConstants.ATTR_CATALOG);    //$NON-NLS-1$
+        NextCatalog delegate = new NextCatalog();
+        delegate.setBase((String)baseURIStack.peek());
+        delegate.setCatalogLocation(location);  
+		return delegate;
+	}
+
+    private ICatalogEntry createEntry(Attributes attributes, int entryType, String keyAttributeName) {
+    	String key = attributes.getValue("", keyAttributeName); //$NON-NLS-1$
+    	if (key == null || key.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_entry_key_not_set);
+    		return null;
+    	}
+    	String entryURI = attributes.getValue("", OASISCatalogConstants.ATTR_URI); //$NON-NLS-1$
+    	if (entryURI == null || entryURI.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_entry_uri_not_set);
+    		return null;
+    	}
+    	CatalogEntry entry = new CatalogEntry(entryType);
+    	entry.setKey(key);
+    	entry.setURI(resolveRelative(entryURI));
+    	return entry;
+    }
+
+    private IRewriteEntry createRewrite(Attributes attributes, int entryType, String prefixStringName) {
+    	String startString = attributes.getValue("", prefixStringName); //$NON-NLS-1$
+    	if (startString == null || startString.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_rewrite_startString_not_set);
+    		return null;
+    	}
+    	String prefix = attributes.getValue("", OASISCatalogConstants.ATTR_REWRITE_PREFIX); //$NON-NLS-1$
+    	if (prefix == null || prefix.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_rewrite_prefix_not_set);
+    		return null;
+    	}
+    	RewriteEntry entry = new RewriteEntry(entryType);
+    	entry.setStartString(startString);
+    	entry.setRewritePrefix(resolveRelative(prefix));
+    	return entry;
+    }
+
+    private IDelegateCatalog createDelegate(Attributes attributes, int entryType, String startStringAttrName) {
+    	String startString = attributes.getValue("", startStringAttrName); //$NON-NLS-1$
+    	if (startString == null || startString.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_delegate_prefix_not_set);
+    		return null;
+    	}
+    	String catalogUri = attributes.getValue("", OASISCatalogConstants.ATTR_CATALOG); //$NON-NLS-1$
+    	if (catalogUri == null || catalogUri.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_delegate_prefix_not_set);
+    		return null;
+    	}
+    	DelegateCatalog entry = new DelegateCatalog(entryType);
+    	entry.setStartString(startString);
+    	entry.setCatalogLocation(catalogUri);
+    	return entry;
+    }
+
+    private ISuffixEntry createSuffix(Attributes attributes, int entryType, String suffixAttrName) {
+    	String suffix = attributes.getValue("", suffixAttrName); //$NON-NLS-1$
+    	if (suffix == null || suffix.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_suffix_string_not_set);
+    		return null;
+    	}
+    	String uri = attributes.getValue("", OASISCatalogConstants.ATTR_URI); //$NON-NLS-1$
+    	if (uri == null || uri.equals("")) //$NON-NLS-1$
+    	{
+    		Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_suffix_uri_not_set);
+    		return null;
+    	}
+    	SuffixEntry entry = new SuffixEntry(entryType);
+    	entry.setSuffix(suffix);
+    	entry.setURI(resolveRelative(uri));
+    	return entry;
+    }
+
+	private String resolveRelative(String entryURI) 
+	{
+		if(URI.createURI(entryURI).isRelative()) 
+		{
+        	entryURI = URI.resolveRelativeURI(entryURI, baseURIStack.peek().toString());
+        }
+		return URIHelper.ensureURIProtocolFormat(entryURI);
+	}
+
     public void endElement(String uri, String localName, String qName) throws SAXException
     {
       if (baseURIStack.size() > 0)
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogWriter.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogWriter.java
index 5900e1f..30d5169 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogWriter.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/CatalogWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2008 IBM Corporation and others.
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -29,8 +29,12 @@
 
 import org.eclipse.wst.xml.core.internal.Logger;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -82,6 +86,137 @@
     doc.appendChild(catalogElement);
     processCatalogEntries(xmlCatalog, catalogElement);
     processNextCatalogs(xmlCatalog, catalogElement);
+    processDelegateCatalogs(xmlCatalog, catalogElement);
+    processSuffixEntries(xmlCatalog, catalogElement);
+    processRewriteEntries(xmlCatalog, catalogElement);
+  }
+
+  private void processRewriteEntries(ICatalog catalog, Element parent)
+  {
+    IRewriteEntry[] catalogEntries = catalog.getRewriteEntries();
+    
+    for (int i = 0; i < catalogEntries.length; i++)
+    {
+      IRewriteEntry entry = catalogEntries[i];
+      String startString = entry.getStartString();
+      String prefix = entry.getRewritePrefix();
+	  Element childElement = null;
+	 
+     switch (entry.getEntryType())
+      {
+        case IRewriteEntry.REWRITE_TYPE_SYSTEM :
+          childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_REWRITE_SYSTEM);
+          if (childElement != null)
+          {
+            childElement.setAttribute(OASISCatalogConstants.ATTR_SYSTEM_ID_START_STRING, startString);
+            childElement.setAttribute(OASISCatalogConstants.ATTR_REWRITE_PREFIX, prefix);
+          }
+          break;
+        case IRewriteEntry.REWRITE_TYPE_URI:
+          childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_REWRITE_URI);
+          if (childElement != null)
+          {
+	            childElement.setAttribute(OASISCatalogConstants.ATTR_URI_START_STRING, startString);
+	            childElement.setAttribute(OASISCatalogConstants.ATTR_REWRITE_PREFIX, prefix);
+          }
+          break;
+        default :
+          break;
+      }
+      if (childElement != null)
+      {
+        setAttributes(entry, childElement);
+        parent.appendChild(childElement);
+      }
+    }
+  }
+
+  private void processSuffixEntries(ICatalog catalog, Element parent)
+  {
+    ISuffixEntry[] suffixEntries = catalog.getSuffixEntries();
+    
+    for (int i = 0; i < suffixEntries.length; i++)
+    {
+      ISuffixEntry entry = suffixEntries[i];
+      String suffixString = entry.getSuffix();
+      String uri = entry.getURI();
+	  Element childElement = null;
+	 
+     switch (entry.getEntryType())
+      {
+        case ISuffixEntry.SUFFIX_TYPE_SYSTEM :
+          childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_SYSTEM_SUFFIX);
+          if (childElement != null)
+          {
+            childElement.setAttribute(OASISCatalogConstants.ATTR_SYSTEM_ID_SUFFFIX, suffixString);
+            childElement.setAttribute(OASISCatalogConstants.ATTR_URI, uri);
+          }
+          break;
+        case ISuffixEntry.SUFFIX_TYPE_URI:
+          childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_URI_SUFFIX);
+          if (childElement != null)
+          {
+	            childElement.setAttribute(OASISCatalogConstants.ATTR_URI_SUFFIX, suffixString);
+	            childElement.setAttribute(OASISCatalogConstants.ATTR_URI, uri);
+          }
+          break;
+        default :
+          break;
+      }
+      if (childElement != null)
+      {
+        setAttributes(entry, childElement);
+        parent.appendChild(childElement);
+      }
+    }
+  }
+
+  private void processDelegateCatalogs(ICatalog catalog, Element parent)
+  {
+    IDelegateCatalog[] delegateCatalogs = catalog.getDelegateCatalogs();
+
+    for (int i = 0; i < delegateCatalogs.length; i++)
+    {
+      IDelegateCatalog entry = delegateCatalogs[i];
+      String prefixString = entry.getStartString();
+      String catalogLocation = entry.getCatalogLocation();
+      Element childElement = null;
+
+      switch (entry.getEntryType())
+      {
+      case IDelegateCatalog.DELEGATE_TYPE_PUBLIC:
+        childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_DELEGATE_PUBLIC);
+        if (childElement != null)
+        {
+          childElement.setAttribute(OASISCatalogConstants.ATTR_PUBLIC_ID_START_STRING, prefixString);
+          childElement.setAttribute(OASISCatalogConstants.ATTR_CATALOG, catalogLocation);
+        }
+        break;
+      case IDelegateCatalog.DELEGATE_TYPE_SYSTEM:
+        childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_DELEGATE_SYSTEM);
+        if (childElement != null)
+        {
+          childElement.setAttribute(OASISCatalogConstants.ATTR_SYSTEM_ID_START_STRING, prefixString);
+          childElement.setAttribute(OASISCatalogConstants.ATTR_CATALOG, catalogLocation);
+        }
+        break;
+      case IDelegateCatalog.DELEGATE_TYPE_URI:
+        childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_DELEGATE_URI);
+        if (childElement != null)
+        {
+          childElement.setAttribute(OASISCatalogConstants.ATTR_URI_START_STRING, prefixString);
+          childElement.setAttribute(OASISCatalogConstants.ATTR_CATALOG, catalogLocation);
+        }
+        break;
+      default :
+        break;
+      }
+      if (childElement != null)
+      {
+        setAttributes(entry, childElement);
+        parent.appendChild(childElement);
+      }
+    }
   }
 
   private void processCatalogEntries(ICatalog catalog, Element parent)
@@ -93,10 +228,9 @@
       ICatalogEntry entry = catalogEntries[i];
       String key = entry.getKey();
       String uri = entry.getURI();
-	  String id = entry.getId();
-	  Element childElement = null;
+      Element childElement = null;
 	 
-     switch (entry.getEntryType())
+      switch (entry.getEntryType())
       {
         case ICatalogEntry.ENTRY_TYPE_PUBLIC :
           childElement = parent.getOwnerDocument().createElement(OASISCatalogConstants.TAG_PUBLIC);
@@ -125,30 +259,36 @@
         default :
           break;
       }
-	  if(childElement != null && id != null && !id.equals("")){ //$NON-NLS-1$
-		  childElement.setAttribute(OASISCatalogConstants.ATTR_ID, id);
-	  }
-      
-      String[] attributes = entry.getAttributes();   
-      for (int j = 0; j < attributes.length; j++)
-      {
-        String attrName = attributes[j];
-        if (attrName != null && !attrName.equals("")) //$NON-NLS-1$
-        {
-		  String attrValue = entry.getAttributeValue(attrName);
-          if (childElement != null && attrValue != null)
-          {
-            childElement.setAttribute(attrName, attrValue);
-          }
-        }
-      }
       if (childElement != null)
       {
+    	  setAttributes(entry, childElement);
         parent.appendChild(childElement);
       }
     }
   }
 
+  private void setAttributes(ICatalogElement entry, Element childElement)
+  {
+    String[] attributes = entry.getAttributes();   
+    for (int j = 0; j < attributes.length; j++)
+    {
+      String attrName = attributes[j];
+      if (attrName != null && !attrName.equals("")) //$NON-NLS-1$
+      {
+        String attrValue = entry.getAttributeValue(attrName);
+        if (childElement != null && attrValue != null)
+        {
+          childElement.setAttribute(attrName, attrValue);
+        }
+      }
+    }
+    String id = entry.getId();
+    if (id != null)
+    {
+      childElement.setAttribute(OASISCatalogConstants.ATTR_ID, id);
+    }
+  }
+
   private void processNextCatalogs(ICatalog catalog, Element parent)
   {
     // handle catalog entries
@@ -167,11 +307,7 @@
         {
           childElement.setAttribute(OASISCatalogConstants.ATTR_CATALOG, location);
         }
-		 String id = delegate.getId();
-		 if (id != null)
-		 {
-			 childElement.setAttribute(OASISCatalogConstants.ATTR_ID, id);
-		 }
+        setAttributes(delegate, childElement);
       }
     }
   }
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/DelegateCatalog.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/DelegateCatalog.java
new file mode 100644
index 0000000..57e729b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/DelegateCatalog.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jesper Steen Moeller
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.catalog;
+
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
+
+
+
+public class DelegateCatalog extends TypedCatalogElement implements IDelegateCatalog
+{
+  private String location;
+  private ICatalog referencedCatalog;
+  private String startString; 
+
+  public String getStartString() 
+  {
+    return startString;
+  }
+
+  public void setStartString(String startString) 
+  {
+    this.startString = startString;
+  }
+
+  public DelegateCatalog(int type)
+  {
+    super(ICatalogElement.TYPE_DELEGATE, type);
+  }
+
+  public String getCatalogLocation()
+  {
+    return location;
+  }
+
+  public ICatalog getReferencedCatalog()
+  {
+    if (referencedCatalog == null)
+    {
+      referencedCatalog = ((Catalog)ownerCatalog).getCatalogSet().lookupOrCreateCatalog(getId(), getAbsolutePath(location));
+    }
+    return referencedCatalog;
+  }
+
+  public void setCatalogLocation(String uri)
+  {
+    location = uri;
+    referencedCatalog = null;
+  }
+
+  public Object clone()
+  {
+    DelegateCatalog nextCatalog = (DelegateCatalog)super.clone();
+    nextCatalog.setCatalogLocation(location);
+    nextCatalog.setStartString(startString);
+    return nextCatalog;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/OASISCatalogConstants.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/OASISCatalogConstants.java
index a3c578a..d716a62 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/OASISCatalogConstants.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/OASISCatalogConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,76 +8,89 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
  *     
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.catalog;
 
 public interface OASISCatalogConstants
 {
-  public static final String namespaceName = "urn:oasis:names:tc:entity:xmlns:xml:catalog"; //$NON-NLS-1$
+  String namespaceName = "urn:oasis:names:tc:entity:xmlns:xml:catalog"; //$NON-NLS-1$
   /** Types of the catalog entries */
   /** The CATALOG element name. */
-  public static final String TAG_CATALOG = "catalog"; //$NON-NLS-1$
+  String TAG_CATALOG = "catalog"; //$NON-NLS-1$
   /** The GROUP catalog entry. */
-  public static final String TAG_GROUP = "group"; //$NON-NLS-1$
+  String TAG_GROUP = "group"; //$NON-NLS-1$
   /** The PUBLIC catalog entry. */
-  public static final String TAG_PUBLIC = "public"; //$NON-NLS-1$
+  String TAG_PUBLIC = "public"; //$NON-NLS-1$
   /** The SYSTEM catalog etnry. */
-  public static final String TAG_SYSTEM = "system"; //$NON-NLS-1$
+  String TAG_SYSTEM = "system"; //$NON-NLS-1$
   /** The URI catalog entry. */
-  public static final String TAG_URI = "uri"; //$NON-NLS-1$
+  String TAG_URI = "uri"; //$NON-NLS-1$
   /** The REWRITE_SYSTEM catalog entry. */
-  public static final String TAG_REWRITE_SYSTEM = "rewriteSystem"; //$NON-NLS-1$
+  String TAG_REWRITE_SYSTEM = "rewriteSystem"; //$NON-NLS-1$
   /** The REWRITE_URI catalog entry. */
-  public static final String TAG_REWRITE_URI = "rewritePublic"; //$NON-NLS-1$
+  String TAG_REWRITE_URI = "rewriteURI"; //$NON-NLS-1$
+  /** The systemSuffix catalog entry. */
+  String TAG_SYSTEM_SUFFIX = "systemSuffix"; //$NON-NLS-1$
+  /** The uriSuffix catalog entry. */
+  String TAG_URI_SUFFIX = "uriSuffix"; //$NON-NLS-1$
   /** The DELEGATE_PUBLIC catalog entry. */
-  public static final String TAG_DELEGATE_PUBLIC = "delegatePublic"; //$NON-NLS-1$
+  String TAG_DELEGATE_PUBLIC = "delegatePublic"; //$NON-NLS-1$
   /** The DELEGATE_SYSTEM catalog entry. */
-  public static final String TAG_DELEGATE_SYSTEM = "delegateSystem"; //$NON-NLS-1$
+  String TAG_DELEGATE_SYSTEM = "delegateSystem"; //$NON-NLS-1$
   /** The DELEGATE_URI catalog entry. */
-  public static final String TAG_DELEGATE_URI = "delegateUri"; //$NON-NLS-1$
+  String TAG_DELEGATE_URI = "delegateURI"; //$NON-NLS-1$
   /** The NEXT_CATALOG catalog entry. */
-  public static final String TAG_NEXT_CATALOG = "nextCatalog"; //$NON-NLS-1$
+  String TAG_NEXT_CATALOG = "nextCatalog"; //$NON-NLS-1$
   /** Attributes */
   /** Attribute id used in all catalog entries */
-  public static final String ATTR_ID = "id"; //$NON-NLS-1$
+  String ATTR_ID = "id"; //$NON-NLS-1$
   /** Attribute id base in all catalog entries */
-  public static final String ATTR_BASE = "xml:base"; //$NON-NLS-1$
-  /** Attribute id prefere in catalog entries: CATALOG, GROUP */
-  public static final String ATTR_PREFERE = "prefere"; //$NON-NLS-1$
+  String ATTR_BASE = "xml:base"; //$NON-NLS-1$
+  /** Attribute id prefer in catalog entries: CATALOG, GROUP */
+  String ATTR_PREFERE = "prefer"; //$NON-NLS-1$
   /** Attribute used in catalog entries of type: PUBLIC */
-  public static final String ATTR_PUBLIC_ID = "publicId"; //$NON-NLS-1$
+  String ATTR_PUBLIC_ID = "publicId"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: SYSTEM
    */
-  public static final String ATTR_SYSTEM_ID = "systemId"; //$NON-NLS-1$
+  String ATTR_SYSTEM_ID = "systemId"; //$NON-NLS-1$
+  /**
+   * Attribute used in catalog entries of type: SYSTEM_SUFFIX
+   */
+  String ATTR_SYSTEM_ID_SUFFFIX = "systemIdSuffix"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: URI
    */
-  public static final String ATTR_NAME = "name"; //$NON-NLS-1$
+  String ATTR_NAME = "name"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: PUBLIC, URI
    */
-  public static final String ATTR_URI = "uri"; //$NON-NLS-1$
+  String ATTR_URI = "uri"; //$NON-NLS-1$
+  /**
+   * Attribute used in catalog entries of type: URI_SUFFIX
+   */
+  String ATTR_URI_SUFFIX = "uriSuffix"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: REWRITE_SYSTEM, DELEGATE_SYSTEM
    */
-  public static final String ATTR_SYSTEM_ID_START_STRING = "systemIdStartString"; //$NON-NLS-1$
+  String ATTR_SYSTEM_ID_START_STRING = "systemIdStartString"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: REWRITE_SYSTEM, REWRITE_URI
    */
-  public static final String ATTR_REWRITE_PREFIX = "rewritePrefix"; //$NON-NLS-1$
+  String ATTR_REWRITE_PREFIX = "rewritePrefix"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: DELEGATE_PUBLIC
    */
-  public static final String ATTR_PUBLIC_ID_START_STRING = "publicIdStartString"; //$NON-NLS-1$
+  String ATTR_PUBLIC_ID_START_STRING = "publicIdStartString"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: DELEGATE_PUBLIC,
    * DELEGATE_SYSTEM, DELEGATE_URI, NEXT_CATALOG
    */
-  public static final String ATTR_CATALOG = "catalog"; //$NON-NLS-1$
+  String ATTR_CATALOG = "catalog"; //$NON-NLS-1$
   /**
    * Attribute used in catalog entries of type: REWRITE_URI, DELEGATE_URI
    */
-  public static final String ATTR_URI_START_STRING = "uriStartString"; //$NON-NLS-1$
+  String ATTR_URI_START_STRING = "uriStartString"; //$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/RewriteEntry.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/RewriteEntry.java
new file mode 100644
index 0000000..5d9590e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/RewriteEntry.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jesper Steen Moeller
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.catalog;
+
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
+
+public class RewriteEntry extends TypedCatalogElement implements IRewriteEntry, Cloneable 
+{
+	String startString;
+	String rewritePrefix;
+
+	protected RewriteEntry(int anEntryType) 
+	{
+		super(ICatalogElement.TYPE_REWRITE, anEntryType);
+	}
+
+	public String getStartString() 
+	{
+		return startString;
+	}
+
+	public void setStartString(String startString) 
+	{
+		this.startString = startString;
+	}
+
+	public String getRewritePrefix() 
+	{
+		return rewritePrefix;
+	}
+
+	public void setRewritePrefix(String rewritePrefix) 
+	{
+		this.rewritePrefix = rewritePrefix;
+	}
+
+	public Object clone() 
+	{
+		RewriteEntry entry = (RewriteEntry) super.clone();
+		entry.setRewritePrefix(rewritePrefix);
+		entry.setStartString(startString);
+		return entry;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/SuffixEntry.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/SuffixEntry.java
new file mode 100644
index 0000000..f9daaa5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/SuffixEntry.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jesper Steen Moeller
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.catalog;
+
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
+
+public class SuffixEntry extends TypedCatalogElement implements ISuffixEntry, Cloneable
+{
+  String suffix;
+  String uri;
+
+  protected SuffixEntry(int anEntryType)
+  {
+    super(ICatalogElement.TYPE_SUFFIX, anEntryType);
+  }
+
+  public void setSuffix(String value)
+  {
+    suffix = value;
+  }
+
+  public String getSuffix()
+  {
+    return suffix;
+  }
+
+  public String getURI()
+  {
+    return uri;
+  }
+  
+  public void setURI(String value)
+  {
+    uri = value;
+  }
+
+  public Object clone()
+  {
+    SuffixEntry entry = (SuffixEntry)super.clone();
+    entry.setSuffix(suffix);
+    entry.setURI(uri);
+    return entry;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/TypedCatalogElement.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/TypedCatalogElement.java
new file mode 100644
index 0000000..8592d6b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/TypedCatalogElement.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jesper Steen Moeller
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.catalog;
+
+
+public class TypedCatalogElement extends CatalogElement 
+{
+	protected int entryType;
+
+	public TypedCatalogElement(int type, int entryType) 
+	{
+		super(type);
+		this.entryType = entryType;
+	}
+
+	final public void setEntryType(int value) 
+	{
+	    entryType = value;
+	}
+
+	final public int getEntryType() 
+	{
+	    return entryType;
+	}
+	
+	public Object clone() 
+	{
+		TypedCatalogElement temp = (TypedCatalogElement)super.clone();
+		temp.setEntryType(this.getEntryType());
+		return temp;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalog.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalog.java
index 0637a3c..6796b74 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalog.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalog.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
  *     
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.catalog.provisional;
@@ -32,29 +33,29 @@
      * 
      * @return catalog id string
      */
-    public String getId();
+    String getId();
     
     /**
      * Sets catalog id string
      * 
      */
-    public void setId(String id);
+    void setId(String id);
     
     
-    public void setLocation(String location);
-    public String getLocation();
+    void setLocation(String location);
+    String getLocation();
     
     /**
-     * Return the applicable PUBLIC or SYSTEM identifier.
+     * Return the applicable or SYSTEM identifier.
      * 
      * <p>
      * This method searches the Catalog and returns the system identifier
-     * specified for the given system or public identifiers. If no appropriate
-     * PUBLIC or SYSTEM entry is found in the Catalog, null is returned.
+     * specified for the given system or identifiers. If no appropriate
+     * or SYSTEM entry is found in the Catalog, null is returned.
      * </p>
      * 
      * @param publicId
-     *            The public identifier to locate in the catalog. Public
+     *            The identifier to locate in the catalog. Public
      *            identifiers are normalized before comparison.
      * @param systemId
      *            The nominal system identifier for the entity in question (as
@@ -71,7 +72,7 @@
      *         catalog, instead null is returned to indicate that no match was
      *         found.
      */
-    public String resolvePublic(String publicId, String systemId)
+    String resolvePublic(String publicId, String systemId)
             throws MalformedURLException, IOException;
 
     /**
@@ -99,7 +100,7 @@
      * @throws IOException
      *             Error reading subordinate catalog file.
      */
-    public String resolveSystem(String systemId) throws MalformedURLException,
+    String resolveSystem(String systemId) throws MalformedURLException,
             IOException;
 
     /**
@@ -125,7 +126,7 @@
      * @throws IOException
      *             Error reading subordinate catalog file.
      */
-    public String resolveURI(String uri) throws MalformedURLException,
+    String resolveURI(String uri) throws MalformedURLException,
             IOException;
 
     /**
@@ -134,7 +135,7 @@
      * @param element -
      *            catalog element
      */
-    public void addCatalogElement(ICatalogElement element);
+    void addCatalogElement(ICatalogElement element);
 
     /**
      * Removes catalog element from the collection of the catalog elements.
@@ -142,14 +143,35 @@
      * @param element -
      *            catalog element
      */
-    public void removeCatalogElement(ICatalogElement element);
+    void removeCatalogElement(ICatalogElement element);
 
     /**
      * Returns an array of catalog elements of type ICatalogElement.TYPE_ENTRY
      * 
      * @return an array of catalog elements
      */
-    public ICatalogEntry[] getCatalogEntries();
+    ICatalogEntry[] getCatalogEntries();
+
+    /**
+     * Returns an array of catalog elements of type ICatalogElement.TYPE_REWRITE
+     * 
+     * @return an array of rewrite catalog elements
+     */
+    IRewriteEntry[] getRewriteEntries();
+
+    /**
+     * Returns an array of catalog elements of type ICatalogElement.TYPE_SUFFIX
+     * 
+     * @return an array of suffix entry elements
+     */
+    ISuffixEntry[] getSuffixEntries();
+
+    /**
+     * Returns an array of catalog elements of type ICatalogElement.TYPE_DELEGATE
+     * 
+     * @return an array of delegate catalog elements
+     */
+    IDelegateCatalog[] getDelegateCatalogs();
 
     /**
      * Returns an array of catalog elements of type
@@ -157,7 +179,7 @@
      * 
      * @return an array of catalog elements
      */
-    public INextCatalog[] getNextCatalogs();
+    INextCatalog[] getNextCatalogs();
 
     /**
      * Returns new catalog element with the specified type. If the type is one
@@ -165,17 +187,17 @@
      * 
      * @return
      */
-    public ICatalogElement createCatalogElement(int type);
+    ICatalogElement createCatalogElement(int type);
 
     /**
      * Removes all the elements from this catalog.
      * 
      */
-    public void clear();
+    void clear();
     
-    //public void load() throws IOException;
+    //void load() throws IOException;
     
-    public void save() throws IOException;
+    void save() throws IOException;
 
     /*
      * Loads catalog from the specified location. Expecting OASIS XML Catalog
@@ -188,7 +210,7 @@
      *             problem loading file
      * 
      */
-    //public void load(InputStream inputStream) throws IOException;
+    //void load(InputStream inputStream) throws IOException;
 
     /*
      * Saves catalog to the specified location in OASIS XML Catalog format
@@ -200,7 +222,7 @@
      *             problem saving file
      * 
      */
-    //public void save(OutputStream outputStream) throws IOException;
+    //void save(OutputStream outputStream) throws IOException;
 
     /**
      * This method copies all catalog entries from source catalog to this one.
@@ -211,7 +233,7 @@
      *            a boolean flag indicating wether to include entries of the
      *            same type from the nested catalogs
      */
-    public void addEntriesFromCatalog(ICatalog catalog);
+    void addEntriesFromCatalog(ICatalog catalog);
 
     /**
      * Adds a listener of the catalog events
@@ -220,7 +242,7 @@
      *            listener of the catalog events
      * @see ICatalogEvent
      */
-    public void addListener(ICatalogListener listener);
+    void addListener(ICatalogListener listener);
 
     /**
      * Removes a listener of the catalog events
@@ -229,5 +251,5 @@
      *            listener of the catalog events
      * @see ICatalogEvent
      */
-    public void removeListener(ICatalogListener listener);      
+    void removeListener(ICatalogListener listener);      
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogElement.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogElement.java
index 15055c3..e011c9b 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogElement.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
  *     
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.catalog.provisional;
@@ -24,10 +25,19 @@
 {
     /** Types of the catalog entries */
     /** The PUBLIC, URI or SYSTEM Catalog Entry. */
-    public static final int TYPE_ENTRY = 1;
+    int TYPE_ENTRY = 1;
 
     /** The NEXT_CATALOG Catalog Entry type. */
-    public static final int TYPE_NEXT_CATALOG = 10;
+    int TYPE_NEXT_CATALOG = 10;
+
+    /** Rewrite types (since XML Catalogs 1.1) */
+    int TYPE_REWRITE = 20;
+
+    /** Delegate types (sinceXML Catalogs 1.1) */
+    int TYPE_DELEGATE = 30;
+    
+    /** Suffix types (since XML Catalogs 1.1)  */
+    int TYPE_SUFFIX = 40;
 
     /**
      * Returns the value of the '<em><b>Type</b></em>' attribute.
@@ -80,4 +90,8 @@
     public void setOwnerCatalog(ICatalog catalog);
     
     public ICatalog getOwnerCatalog();
+
+	void setBase(String base);
+
+	String getBase();
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogEntry.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogEntry.java
index 271cbe2..372dbfe 100644
--- a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogEntry.java
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ICatalogEntry.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,7 +21,7 @@
  */
 public interface ICatalogEntry extends ICatalogElement
 {
-    /** The SYSTEM Catalog Entry type. */
+    /** The PUBLIC Catalog Entry type. */
     public static final int ENTRY_TYPE_PUBLIC = 2;
 
     /** The SYSTEM Catalog Entry type. */
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/IDelegateCatalog.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/IDelegateCatalog.java
new file mode 100644
index 0000000..82040b0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/IDelegateCatalog.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jesper Steen Moeller
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.catalog.provisional;
+
+/**
+ * 
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * 
+ */
+public interface IDelegateCatalog extends ICatalogElement
+{
+    /** The SYSTEM Catalog Entry type. */
+    int DELEGATE_TYPE_PUBLIC = 31;
+
+    /** The SYSTEM Catalog Entry type. */
+    int DELEGATE_TYPE_SYSTEM = 32;
+
+    /** The URI Catalog Entry type. */
+    int DELEGATE_TYPE_URI = 33;
+
+    /**
+     * 
+     * @param entryType
+     */
+    void setEntryType(int entryType);
+
+    /**
+     * 
+     * @return
+     */
+    int getEntryType();
+
+    /**
+     * 
+     * @param key
+     */
+    void setStartString(String key);
+
+    /**
+     * 
+     * @return
+     */
+    String getStartString();
+    
+    /**
+     * Set location of the referenced catalog.
+     * 
+     * @param uri -
+     *            location uri of the referenced catalog
+     */
+    void setCatalogLocation(String uri);
+
+    /**
+     * Get location uri of the referenced catalog.
+     * 
+     * @return location uri of the referenced catalog
+     */
+    String getCatalogLocation();
+    
+    ICatalog getReferencedCatalog();
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/IRewriteEntry.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/IRewriteEntry.java
new file mode 100644
index 0000000..9d95592
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/IRewriteEntry.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jesper Steen Moeller
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.catalog.provisional;
+
+/**
+ * 
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * 
+ */
+public interface IRewriteEntry extends ICatalogElement
+{
+    /** The rewriteSystem Catalog type. */
+    int REWRITE_TYPE_SYSTEM = 21;
+
+    /** The URI Catalog Entry type. */
+    int REWRITE_TYPE_URI = 22;
+
+    /**
+     * 
+     * @param entryType
+     */
+    void setEntryType(int entryType);
+
+    /**
+     * 
+     * @return
+     */
+    int getEntryType();
+
+    /**
+     * 
+     * @param key
+     */
+    void setStartString(String startString);
+
+    /**
+     * 
+     * @return
+     */
+    String getStartString();
+
+    /**
+     * 
+     * @return
+     */
+    String getRewritePrefix();
+
+    /**
+     * 
+     * @param uri
+     */
+    void setRewritePrefix(String uri);
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ISuffixEntry.java b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ISuffixEntry.java
new file mode 100644
index 0000000..0004014
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-catalog/org/eclipse/wst/xml/core/internal/catalog/provisional/ISuffixEntry.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jesper Steen Moeller
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Jesper Steen Moeller - Added XML Catalogs 1.1 support
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.catalog.provisional;
+
+/**
+ * 
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * 
+ */
+public interface ISuffixEntry extends ICatalogElement
+{
+    /** The rewriteSystem Catalog type. */
+    int SUFFIX_TYPE_SYSTEM = 41;
+
+    /** The URI Catalog Entry type. */
+    int SUFFIX_TYPE_URI = 42;
+
+    /**
+     * 
+     * @param entryType
+     */
+    void setEntryType(int entryType);
+
+    /**
+     * 
+     * @return
+     */
+    int getEntryType();
+
+    /**
+     * 
+     * @param key
+     */
+    void setSuffix(String suffixString);
+
+    /**
+     * 
+     * @return
+     */
+    String getSuffix();
+
+    /**
+     * 
+     * @return
+     */
+    String getURI();
+
+    /**
+     * 
+     * @param uri
+     */
+    void setURI(String uri);
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/CMDataType.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/CMDataType.java
index 79d9f5f..b647228 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/CMDataType.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/CMDataType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -23,6 +23,7 @@
 	static final String CDATA = "CDATA"; //$NON-NLS-1$
 	static final String ID = "ID"; //$NON-NLS-1$
 	static final String IDREF = "IDREF"; //$NON-NLS-1$
+	static final String IDREFS = "IDREFS"; //$NON-NLS-1$
 	static final String ENTITY = "ENTITY"; //$NON-NLS-1$
 	static final String ENTITIES = "ENTITIES"; //$NON-NLS-1$
 	static final String NOTATION = "NOTATION"; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/basic/CMAttributeDeclarationImpl.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/basic/CMAttributeDeclarationImpl.java
index f0df4fa..4b554b6 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/basic/CMAttributeDeclarationImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/basic/CMAttributeDeclarationImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -32,7 +32,7 @@
                 
   public CMAttributeDeclarationImpl(String nodeName, int usage)
   {
-    this(nodeName, usage, null);
+    this(nodeName, usage, new CMDataTypeImpl(CMDataType.CDATA, ""));
   }     
 
   public CMAttributeDeclarationImpl(String nodeName, int usage, CMDataType dataType)
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/internal/util/CMValidator.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/internal/util/CMValidator.java
index 3ee535f..2de5590 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/internal/util/CMValidator.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/internal/util/CMValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 297005 - Some static constants not made final.
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contentmodel.internal.util;
 
@@ -18,6 +18,7 @@
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Stack;
 import java.util.Vector;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAnyElement;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
@@ -33,7 +34,7 @@
 
 public class CMValidator
 {
-  protected static StringElementContentComparator stringContentComparitor = new StringElementContentComparator();
+  protected static final StringElementContentComparator stringContentComparitor = new StringElementContentComparator();
   protected Hashtable graphNodeTable = new Hashtable();
 
   /**
@@ -307,59 +308,69 @@
   }
 
 
-  public void validateElementList(ElementList list, GraphNode node, ElementContentComparator comparator, Result result, boolean loopFlag)
-  {
-    //println("+validateElementList " + node + " " + list);
-    if (list == null && node.isTerminal)
-    {
-      result.isValid = true;
-    }
-    else
-    {
-      for (Iterator i = node.arcList.iterator(); i.hasNext();)
-      {
-        Arc arc = (Arc)i.next();
-        boolean traverseArc = false;
-        if (arc.kind == Arc.ELEMENT)
-        {
-          if (list != null && comparator.matches(list.head, arc.cmNode))
-          {
-            loopFlag = false;
-            traverseArc = true;
-            list = list.tail; // increment our position in the list
-          }
-        }
-        else if (arc.kind == Arc.REPEAT)
-        {
-          if (!loopFlag)
-          {
-            traverseArc = true;
-          }
-          loopFlag = true;
-        }
-        else
-        {
-          traverseArc = true;
-        }
+  public void validateElementList(ElementList initialList, GraphNode initialGraphNode, ElementContentComparator comparator, Result result, boolean initialLoopFlag) {
+	  Stack arcStack = new Stack();
+	  arcStack.push(new ArcStackItem(null, false));
+	  boolean loopFlag = initialLoopFlag;
+	  ElementList elementList = initialList;
+	  GraphNode graphNode = initialGraphNode;
+	  while(!arcStack.isEmpty() && !result.isValid) {
+		  ArcStackItem stackElement = (ArcStackItem) arcStack.peek();
+		  if(stackElement.isVisited) {
+			  arcStack.pop();
+			  if(stackElement.arc != null) {
+				  result.pop(stackElement.arc);
+				  continue;
+			  }
+		  } else {
+			  stackElement.isVisited = true;
+			  result.push(stackElement.arc);
+			  graphNode = stackElement.arc.node;
+			  loopFlag = stackElement.loopFlag;
+		  } 
+		  if(elementList == null && graphNode.isTerminal) {
+			  result.isValid = true;
+		  } else {
+			  for(Iterator arcIterator = graphNode.arcList.iterator(); arcIterator.hasNext();) {
+				  Arc arc = (Arc)arcIterator.next();
+				  boolean traverseArc = false;
+				  if (arc.kind == Arc.ELEMENT) {
+					  if(elementList != null && comparator.matches(elementList.head, arc.cmNode)) {
+						  loopFlag = false;
+						  traverseArc = true;
+						  elementList = elementList.tail; // increment our position in the list
+					  }
+				  } else if(arc.kind == Arc.REPEAT) {
+					  if(!loopFlag) {
+						  traverseArc = true;
+					  }
+					  loopFlag = true;
+				  } else {
+					  traverseArc = true;
+				  }
+				  if(traverseArc) {
+					  if (result.canPush(arc)) { // test to see if we can push this arc due to facet constraints  
+						  arcStack.push(new ArcStackItem(arc, loopFlag));
+					  }
+				  }
+			  }
+		  }
+	  }
+  }
+  
+  
+  private class ArcStackItem {
+	  
+	  Arc arc;
+	  boolean loopFlag;
+	  boolean isVisited;
+	  
+	  public ArcStackItem(Arc arc, boolean loopflag) {
+		  this.arc = arc;
+		  this.loopFlag = loopflag;
+		  this.isVisited = arc == null;
+	  }
 
-        if (traverseArc)
-        {
-          // test to see if we can push this arc due to facet constraints
-          //
-          if (result.canPush(arc))
-          {          
-            // see if this arc leads to a correct solution          
-            result.push(arc);
-            validateElementList(list, arc.node, comparator, result, loopFlag);
-            if (result.isValid)
-            {
-              break;
-            }
-            result.pop(arc);
-          }
-        }
-      }
-    }
   }
 
 
@@ -416,16 +427,12 @@
       ElementList elementList = createElementList(contentType, elementContent, comparator, result);
       if (result.isValid == true)
       {  
-        // defect 226213 ... elements with a large number of children will cause the recursion based validation
-        // algorithm to stack overflow ... as a quick fix assume any element with a large number of children is valid        
-        if (elementContent.size() < 500)
-        {
           boolean isGraphValidationNeeded = !(elementList == null && contentType == CMElementDeclaration.MIXED);
                       
-          // exlicity handle 'All' groups
+          // explicitly handle 'All' groups
           //
           CMContent content = ed.getContent();
-          if (content.getNodeType() == CMNode.GROUP)
+          if (content != null && content.getNodeType() == CMNode.GROUP)
           {
             CMGroup group = (CMGroup)content;
             if (group.getOperator() == CMGroup.ALL)
@@ -443,7 +450,6 @@
             GraphNode node = lookupOrCreateGraph(ed);
             validateElementList(elementList, node, comparator, result, false);
           }
-        }
       }
     }
     else if (contentType == CMElementDeclaration.PCDATA)
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelquery/IExternalSchemaLocationProvider.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelquery/IExternalSchemaLocationProvider.java
new file mode 100644
index 0000000..4ce7583
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelquery/IExternalSchemaLocationProvider.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.contentmodel.modelquery;
+
+import java.net.URI;
+import java.util.Map;
+
+public interface IExternalSchemaLocationProvider {
+	String SCHEMA_LOCATION = "http://apache.org/xml/properties/schema/external-schemaLocation"; //$NON-NLS-1$
+	String NO_NAMESPACE_SCHEMA_LOCATION = "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation"; //$NON-NLS-1$
+
+	/**
+	 * Provided the file path URI, this will return the external schema location. The schema location is associated to a specific property,
+	 * which serves as the key in the map. The supported properties are:
+	 * 
+	 * <p><b>http://apache.org/xml/properties/schema/external-schemaLocation</b> - The value for this property follows the same rules
+	 * as the schemaLocation attribute for an XML document (i.e., multiple schemas are acceptable and must be white-space separated).</p>
+	 * 
+	 * <p><b>http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation</b> - The value for this property follows the same
+	 * rules as the noNamespaceSchemaLocation attribute for an XML document (i.e., only one schema is allowed).
+	 * 
+	 * @param filePath the path for the XML file
+	 * @return a {@link Map} associating the external-schemaLocation and/or external-noNamespaceSchemaLocation to the schema location
+	 */
+	Map getExternalSchemaLocation(URI fileURI);
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentLoader.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentLoader.java
index 6905948..a5937ae 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentLoader.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentLoader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,15 +12,27 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl;
                           
+import java.io.File;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.xml.core.internal.Logger;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.IExternalSchemaLocationProvider;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceTable;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -32,6 +44,7 @@
  */
 public class CMDocumentLoader
 {                                           
+  private final static boolean _trace = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.xml.core/externalSchemaLocation")).booleanValue(); //$NON-NLS-1$
   protected Document document;
   protected ModelQuery modelQuery;
   protected CMDocumentManager cmDocumentManager;
@@ -83,17 +96,68 @@
           walkDocument = isInferredGrammarEnabled;
           //System.out.println("is NOT namespaceAware");
         }        
-      }  
+      }
     } 
 
     if (walkDocument)
     {
-      visitNode(document);   
+    	if (!checkExternalSchema())
+    		visitNode(document);   
     } 
 
     //System.out.println("--- elapsed time (" + count + ") = " + (System.currentTimeMillis() - time));
   }
 
+  protected boolean checkExternalSchema() {
+	  boolean externalSchemaLoaded = false;
+	  if (document instanceof IDOMDocument) {
+		  final String baseLocation = ((IDOMDocument) document).getModel().getBaseLocation();
+		  if (baseLocation == null)
+			  return false;
+		  final IPath basePath = new Path(baseLocation);
+		  IFile file = null;
+		  if (basePath.segmentCount() > 1) {
+			  file = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath);
+		  }
+		  final URI uri = (file == null || !file.isAccessible()) ? new File(baseLocation).toURI() : file.getLocationURI();
+		  if (uri != null) {
+			  IExternalSchemaLocationProvider[] providers = ExternalSchemaLocationProviderRegistry.getInstance().getProviders();
+			  for (int i = 0; i < providers.length; i++) {
+				  long time = _trace ? System.currentTimeMillis(): 0;
+				  final Map locations = providers[i].getExternalSchemaLocation(uri);
+				  if (_trace) {
+					  long diff = System.currentTimeMillis() - time;
+					  if (diff > 250)
+						  Logger.log(Logger.INFO, "Schema location provider took [" + diff + "ms] for URI [" + uri + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				  }
+				  if (locations != null && !locations.isEmpty()) {
+					  // Use the externalSchemaLocation
+					  if (namespaceTable != null && namespaceTable.isNamespaceEncountered()) {
+						  final String location = locations.get(IExternalSchemaLocationProvider.SCHEMA_LOCATION).toString();
+						  if (location != null) {
+							  final String[] ids = StringUtils.asArray(location);
+							  // namespace : location pairs
+							  if (ids.length >= 2 && ids.length % 2 == 0) {
+								  if (!externalSchemaLoaded)
+									  cmDocumentManager.removeAllReferences();
+								  for (int j = 0; j < ids.length; j+=2) {
+									  handleGrammar(ids[j], ids[j + 1], "XSD"); //$NON-NLS-1$
+									  externalSchemaLoaded = true;
+								  }
+							  }
+						  }
+					  }
+					  else { // noNamespace
+						  handleGrammar(uri.toString(), locations.get(IExternalSchemaLocationProvider.NO_NAMESPACE_SCHEMA_LOCATION).toString(), "XSD"); //$NON-NLS-1$
+						  externalSchemaLoaded = true;
+						  break;
+					  }
+				  }
+			  }
+		  }
+	  }
+	  return externalSchemaLoaded;
+  }
 
   public boolean handleGrammar(String publicId, String systemId, String type)
   {           
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentManagerImpl.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentManagerImpl.java
index c4cbfc4..3e4af8c 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentManagerImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/CMDocumentManagerImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2007 IBM Corporation and others.
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,38 +19,45 @@
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Preferences;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.wst.xml.core.internal.Logger;
 import org.eclipse.wst.xml.core.internal.XMLCoreMessages;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
 import org.eclipse.wst.xml.core.internal.contentmodel.ContentModelManager;
 import org.eclipse.wst.xml.core.internal.contentmodel.internal.annotation.AnnotationUtility;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManagerListener;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentReferenceProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.GlobalCMDocumentCache.GlobalCacheQueryResponse;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
 
+import com.ibm.icu.text.MessageFormat;
 
 /**
  *
  */
 public class CMDocumentManagerImpl implements CMDocumentManager
-{                                
+{
   protected CMDocumentCache cmDocumentCache;
   protected CMDocumentReferenceProvider cmDocumentReferenceProvider;
   protected List listenerList = new Vector(); 
   protected Hashtable propertyTable = new Hashtable();
   protected Hashtable publicIdTable = new Hashtable();
+  private boolean globalCMDocumentCacheEnabled ;
 
        
   public CMDocumentManagerImpl(CMDocumentCache cmDocumentCache, CMDocumentReferenceProvider cmDocumentReferenceProvider)
-  {                                                       
+  {
     this.cmDocumentCache = cmDocumentCache;                                                                            
     this.cmDocumentReferenceProvider = cmDocumentReferenceProvider;
     setPropertyEnabled(PROPERTY_AUTO_LOAD, true);
     setPropertyEnabled(PROPERTY_USE_CACHED_RESOLVED_URI, false);
     setPropertyEnabled(PROPERTY_PERFORM_URI_RESOLUTION, true);
+    initializeGlobalCMDocumentCacheSettings();
   }         
 
        
@@ -240,7 +247,7 @@
           }
           catch (Exception e)
           {
-        	  Logger.logException(e);
+        	  Logger.logException(MessageFormat.format(XMLCoreMessages.CMDocument_load_exception, new Object[]{resolvedURI, publicId}), e);
           }
           return Status.OK_STATUS;
         }
@@ -259,7 +266,17 @@
   public synchronized CMDocument buildCMDocument(String publicId, String resolvedURI, String type)
   {                                     
     cmDocumentCache.setStatus(resolvedURI, CMDocumentCache.STATUS_LOADING);
-  
+    boolean documentCacheable = false;
+    if(globalCMDocumentCacheEnabled) {
+    	GlobalCacheQueryResponse response = GlobalCMDocumentCache.getInstance().getCMDocument(resolvedURI);
+    	CMDocument cachedCMDocument = response.getCachedCMDocument();
+    	documentCacheable = response.isDocumentCacheable();
+    	if(cachedCMDocument != null) {
+    		cmDocumentCache.putCMDocument(resolvedURI, cachedCMDocument);
+    		return cachedCMDocument;
+    	}
+    }
+
     CMDocument result = null;         
     if (resolvedURI != null && resolvedURI.length() > 0)
     {
@@ -273,6 +290,9 @@
       {    
         AnnotationUtility.loadAnnotationsForGrammar(publicId, result);
       }
+      if(globalCMDocumentCacheEnabled && documentCacheable) {
+    	  GlobalCMDocumentCache.getInstance().putCMDocument(resolvedURI, result);
+      }
       cmDocumentCache.putCMDocument(resolvedURI, result);
     }
     else
@@ -287,4 +307,12 @@
     // TODO... initiate a timed release of the entries in the CMDocumentCache
     publicIdTable = new Hashtable();
   }
+  
+  private void initializeGlobalCMDocumentCacheSettings() {
+	  Preferences preferences = XMLCorePlugin.getDefault().getPluginPreferences();
+	  if(preferences != null) {
+		  globalCMDocumentCacheEnabled = preferences.getBoolean(XMLCorePreferenceNames.CMDOCUMENT_GLOBAL_CACHE_ENABLED);
+	  }
+  }
+
 }                                            
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/ExternalSchemaLocationProviderRegistry.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/ExternalSchemaLocationProviderRegistry.java
new file mode 100644
index 0000000..594c5d8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/ExternalSchemaLocationProviderRegistry.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.xml.core.internal.Logger;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.IExternalSchemaLocationProvider;
+
+/**
+ * A registry for all external schema location providers.
+ * 
+ */
+public class ExternalSchemaLocationProviderRegistry {
+
+	private static ExternalSchemaLocationProviderRegistry fRegistry;
+	private IExternalSchemaLocationProvider[] fProviders;
+
+	private ExternalSchemaLocationProviderRegistry() {
+		fProviders = new IExternalSchemaLocationProvider[0];
+		IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.wst.xml.core", "externalSchemaLocations"); //$NON-NLS-1$ //$NON-NLS-2$
+		List providers = new ArrayList(elements.length);
+		try {
+			for (int i = 0; i < elements.length; i++) {
+				providers.add(elements[i].createExecutableExtension("class"));
+			}
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+		fProviders = new IExternalSchemaLocationProvider[elements.length];
+		providers.toArray(fProviders);
+	}
+
+	public IExternalSchemaLocationProvider[] getProviders() {
+		return fProviders;
+	}
+
+	public static synchronized ExternalSchemaLocationProviderRegistry getInstance() {
+		if (fRegistry == null)
+			fRegistry = new ExternalSchemaLocationProviderRegistry();
+		return fRegistry;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/GlobalCMDocumentCache.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/GlobalCMDocumentCache.java
new file mode 100644
index 0000000..ca981f1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/GlobalCMDocumentCache.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl;
+
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.wst.sse.core.internal.util.AbstractMemoryListener;
+import org.eclipse.wst.xml.core.internal.Logger;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+
+public class GlobalCMDocumentCache {
+	
+	private static GlobalCMDocumentCache globalDocumentCache = new GlobalCMDocumentCache();
+	private Map systemCatalogEntries = getSystemCatalogEntries();
+	private MemoryListener memoryListener;
+	private final static String CATEGORY = "CMDocumentGlobalCache"; //$NON-NLS-1$
+	
+	protected GlobalCMDocumentCache() {
+		Logger.trace(CATEGORY, "Cache initialized"); //$NON-NLS-1$
+		memoryListener = new MemoryListener();
+		memoryListener.connect();
+	}
+
+	public static GlobalCMDocumentCache getInstance() {
+		return globalDocumentCache;
+	}
+	
+	public synchronized GlobalCacheQueryResponse getCMDocument(String grammarURI) {
+		//Logger.trace(CATEGORY, "Query for: " + grammarURI); //$NON-NLS-1$
+		Object systemCatalogEntry = systemCatalogEntries.get(grammarURI);
+		if(systemCatalogEntry != null) {
+			//Logger.trace(CATEGORY, "Document " + grammarURI + " is in system catalog"); //$NON-NLS-1$ //$NON-NLS-2$
+			Object object = ((SoftReference)systemCatalogEntry).get();
+			if(object != null) {
+				//Logger.trace(CATEGORY, "Document " + grammarURI + "is in cache, returning cached version"); //$NON-NLS-1$ //$NON-NLS-2$
+				return new GlobalCacheQueryResponse((CMDocument)object, true);
+			} else {
+				//Logger.trace(CATEGORY, "Document " + grammarURI + " is not in cache"); //$NON-NLS-1$ //$NON-NLS-2$
+				return new GlobalCacheQueryResponse(null, true);
+			}
+		}
+		//Logger.trace(CATEGORY, "Document " + grammarURI + " is not in system catalog, not cached"); //$NON-NLS-1$ //$NON-NLS-2$
+		return new GlobalCacheQueryResponse(null, false);
+	}
+	
+	public synchronized void putCMDocument(String grammarURI, CMDocument cmDocument) {
+		//Logger.trace(CATEGORY, "Document: " + grammarURI + " added to global cache"); //$NON-NLS-1$ //$NON-NLS-2$
+		systemCatalogEntries.put(grammarURI, new SoftReference(cmDocument));
+	}
+	
+	private synchronized static HashMap getSystemCatalogEntries(){
+		HashMap systemCatalogURIs = new HashMap();
+		ICatalog systemCatalog = null;
+		ICatalog defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs();
+		for (int i = 0; i < nextCatalogs.length; i++) {
+			INextCatalog catalog = nextCatalogs[i];
+			ICatalog referencedCatalog = catalog.getReferencedCatalog();
+			if (referencedCatalog != null) {
+				if (XMLCorePlugin.SYSTEM_CATALOG_ID.equals(referencedCatalog.getId())) {
+					systemCatalog = referencedCatalog;
+				}
+			}
+		}
+		if(systemCatalog != null) {
+			ICatalogEntry[] catalogEntries = systemCatalog.getCatalogEntries();
+			for (int i = 0; i < catalogEntries.length; i++) {
+				systemCatalogURIs.put(catalogEntries[i].getURI(), new SoftReference(null));
+			}
+		}
+		return systemCatalogURIs;
+	}
+	
+	public class GlobalCacheQueryResponse {
+		
+		private CMDocument cachedDocument;
+		private boolean documentCacheable;
+		
+		public GlobalCacheQueryResponse(CMDocument cachedCMDocument, boolean documentCacheable) {
+			this.cachedDocument = cachedCMDocument;
+			this.documentCacheable = documentCacheable;
+		}
+		
+		public CMDocument getCachedCMDocument() {
+			return cachedDocument;
+		}
+		
+		public boolean isDocumentCacheable() {
+			return documentCacheable;
+		}
+		
+	}
+
+	private class MemoryListener extends AbstractMemoryListener {
+		protected void handleMemoryEvent(Event event) {
+			Object topic = event.getProperty(EventConstants.EVENT_TOPIC);
+			if(SEV_SERIOUS.equals(topic) || SEV_CRITICAL.equals(topic)) {
+				Logger.trace(CATEGORY, "Serious severity low memory event received, flushing global CMDocument cache."); //$NON-NLS-1$
+				systemCatalogEntries = getSystemCatalogEntries();
+			}
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/ModelQueryImpl.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/ModelQueryImpl.java
index 436d8ff..3c6485e 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/ModelQueryImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/ModelQueryImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2008 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,12 +12,12 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Vector;
 
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAnyElement;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
@@ -138,7 +138,7 @@
 
   public List getCMDocumentList(Element element, CMElementDeclaration ed, String uri)
   {                
-    List result = new Vector();
+    List result = new ArrayList();
     if (modelQueryAssociationProvider instanceof XMLAssociationProvider)
     {              
       XMLAssociationProvider xmlAssociationProvider = (XMLAssociationProvider)modelQueryAssociationProvider;
@@ -582,7 +582,7 @@
   protected List nodeListToList(NodeList nodeList)
   {
     int size = nodeList.getLength();
-    Vector v = new Vector(size);
+    List v = new ArrayList(size);
     for (int i = 0; i < size; i++)
     {
       v.add(nodeList.item(i));
@@ -644,7 +644,7 @@
 
     public List computeAvailableContent(int includeOptions)
     {                   
-      Vector v = new Vector();  
+      List v = new ArrayList();  
 
       int contentType = rootElementDeclaration.getContentType();
       includeSequenceGroups = ((includeOptions & INCLUDE_SEQUENCE_GROUPS) != 0);
@@ -679,17 +679,6 @@
             } 
           }
         }
-              
-        if (contentType == CMElementDeclaration.MIXED ||
-            contentType == CMElementDeclaration.PCDATA || 
-            contentType == CMElementDeclaration.ANY)
-        {
-          CMDataType dataType = rootElementDeclaration.getDataType();
-          if (dataType != null)
-          {
-            v.add(dataType);
-          }                                       
-        }
       }
       return v;
     }   
@@ -793,7 +782,7 @@
    */
   public String[] getPossibleDataTypeValues(Element element, CMNode cmNode)
   {
-    List list = new Vector();                            
+    List list = new ArrayList();                            
                                
     if (cmNode != null)
     {       
@@ -823,14 +812,18 @@
     {                    
       list.addAll(extensionManager.getDataTypeValues(element, cmNode));
     }          
-                        
-    int listSize = list.size();
-    String[] result = new String[listSize];
-    for (int i = 0; i < listSize; i++)
-    {
-      result[i] = (String)list.get(i);
-    }     
-    return result;
+    
+    // Remove duplicates
+    List duplicateFreeList = new ArrayList();
+    Iterator iterator = list.iterator();
+    while(iterator.hasNext()) {
+    	Object next = iterator.next();
+    	if(duplicateFreeList.indexOf(next) == -1) {
+    		duplicateFreeList.add(next);
+    	}
+    }
+    
+    return (String[]) duplicateFreeList.toArray(new String[duplicateFreeList.size()]);
   }    
 
            
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/XMLAssociationProvider.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/XMLAssociationProvider.java
index 9e20be6..a05d6a9 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/XMLAssociationProvider.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/modelqueryimpl/XMLAssociationProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,10 +12,18 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl;
 
+import java.io.File;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.wst.xml.core.internal.Logger;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
@@ -23,10 +31,12 @@
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentReferenceProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.IExternalSchemaLocationProvider;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceTable;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentType;
@@ -43,6 +53,8 @@
   protected CMDocumentCache cmDocumentCache; 
   protected CMDocumentManagerImpl documentManager;
 
+  private final static boolean _trace = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.xml.core/externalSchemaLocation")).booleanValue(); //$NON-NLS-1$
+
   public XMLAssociationProvider(CMDocumentCache cmDocumentCache)
   {
     this.cmDocumentCache = cmDocumentCache; 
@@ -216,17 +228,91 @@
       }
       else
       { 
-        // we assume that this is an inferred CMDocument for a DTD style 'namespaceless' document
-        CMDocument cmDocument = getCMDocument("", "", "DTD"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        if (cmDocument != null)
-        {
-          result = (CMElementDeclaration)cmDocument.getElements().getNamedItem(element.getNodeName()); 
-        }
+    	  result = checkExternalSchema(element);
+    	  if (result == null) {
+    		// we assume that this is an inferred CMDocument for a DTD style 'namespaceless' document
+  	        CMDocument cmDocument = getCMDocument("", "", "DTD"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		      if (cmDocument != null) {
+				  result = (CMElementDeclaration)cmDocument.getElements().getNamedItem(element.getNodeName());
+			  }
+    	  }
       }
     }             
     return result;
   } 
      
+  protected CMElementDeclaration checkExternalSchema(Element element) {
+	  final Document document = element.getOwnerDocument();
+	  if (document instanceof IDOMDocument) {
+		  final String baseLocation = ((IDOMDocument) document).getModel().getBaseLocation();
+		  if (baseLocation == null)
+			  return null;
+		  final IPath basePath = new Path(baseLocation);
+		  IFile file = null;
+		  if (basePath.segmentCount() > 1) {
+			  file = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath);
+		  }
+		  final URI uri = (file == null || !file.isAccessible()) ? new File(baseLocation).toURI() : file.getLocationURI();
+		  if (uri != null) {
+			  IExternalSchemaLocationProvider[] providers = ExternalSchemaLocationProviderRegistry.getInstance().getProviders();
+			  for (int i = 0; i < providers.length; i++) {
+				  long time = _trace ? System.currentTimeMillis(): 0;
+				  final Map locations = providers[i].getExternalSchemaLocation(uri);
+				  if (_trace) {
+					  long diff = System.currentTimeMillis() - time;
+					  if (diff > 250)
+						  Logger.log(Logger.INFO, "Schema location provider took [" + diff + "ms] for URI [" + uri + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				  }
+				  if (locations != null && !locations.isEmpty()) {
+					  Object location = locations.get(IExternalSchemaLocationProvider.NO_NAMESPACE_SCHEMA_LOCATION);
+					  if (location != null)
+						  return getCMElementDeclaration(element, NamespaceTable.getElementLineage(element), uri.toString(), location.toString());
+				  }
+			  }
+		  }
+	  }
+	  return null;
+  }
+
+  protected CMElementDeclaration getCMElementDeclaration(Element targetElement, List list, String publicId, String systemId)
+  {         
+    CMElementDeclaration currentED = null;
+    try
+    {    
+      int listSize = list.size();
+      for (int i = 0; i < listSize; i++)
+      {
+        Element element = (Element)list.get(i);                                     
+
+        final String nodeName = element.getNodeName();
+ 
+        CMElementDeclaration ed = null;
+ 
+        // see if the element is a local of the currentED
+        //             
+        if (currentED != null)
+        {  
+          ed = (CMElementDeclaration)currentED.getLocalElements().getNamedItem(nodeName);
+        } 
+                                                                   
+        if (ed == null) 
+        {               
+            CMDocument cmDocument = getCMDocument(publicId, systemId, "XSD"); //$NON-NLS-1$
+            if (cmDocument != null)
+            { 
+              ed = (CMElementDeclaration)cmDocument.getElements().getNamedItem(nodeName);   
+            }                                        
+        }                                                   
+        currentED = ed;     
+      }                                       
+    }
+    catch (Exception e)
+    { 
+      Logger.logException("exception locating element declaration for " + targetElement, e); //$NON-NLS-1$
+    } 
+  
+    return currentED;
+  }  
 
   protected CMElementDeclaration getCMElementDeclaration(Element targetElement, List list, NamespaceTable namespaceTable)
   {         
@@ -296,8 +382,8 @@
     String xsiPrefix = namespaceTable.getPrefixForURI("http://www.w3.org/2001/XMLSchema-instance"); //$NON-NLS-1$
     if (xsiPrefix != null)
     {
-      String xsiTypeValue = element.getAttribute(xsiPrefix + ":type"); //$NON-NLS-1$
-      if (xsiTypeValue != null)
+      String xsiTypeValue = element.hasAttribute(xsiPrefix + ":type") ? element.getAttribute(xsiPrefix + ":type") : null; //$NON-NLS-1$ //$NON-NLS-2$
+      if (xsiTypeValue != null && xsiTypeValue.length() > 0)
       {  
         String typePrefix = DOMNamespaceHelper.getPrefix(xsiTypeValue);
         String typeName = DOMNamespaceHelper.getUnprefixedName(xsiTypeValue);
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMDescriptionBuilder.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMDescriptionBuilder.java
index f1cc690..a82ab1c 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMDescriptionBuilder.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMDescriptionBuilder.java
@@ -12,7 +12,6 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contentmodel.util;
 
-import java.util.Stack;
 
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAnyElement;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
@@ -29,8 +28,6 @@
   protected StringBuffer sb;
   protected CMNode root;
   protected boolean isRootVisited;
-  protected Stack visitedCMGroupStack = new Stack();
-
   public String buildDescription(CMNode node)
   {
     sb = new StringBuffer();
@@ -62,11 +59,6 @@
 
   public void visitCMGroup(CMGroup group)
   {
-    // This is to prevent recursion.
-    if (visitedCMGroupStack.contains(group))
-    {
-      return;
-    }
     int op = group.getOperator();
     if (op == CMGroup.ALL)
     {
@@ -82,8 +74,6 @@
       separator = " | "; //$NON-NLS-1$
     }
     
-    // Push the current group to check later to avoid potential recursion
-    visitedCMGroupStack.push(group);
    
     CMNodeList nodeList = group.getChildNodes();
     int size = nodeList.getLength();
@@ -96,9 +86,6 @@
       }
     }
     
-    // Pop the current group
-    visitedCMGroupStack.pop();
-    
     sb.append(")"); //$NON-NLS-1$
     addOccurenceSymbol(group);
   }
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMVisitor.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMVisitor.java
index fc4f35d..89bb9d6 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMVisitor.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/CMVisitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2008 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,8 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contentmodel.util;
 
+import java.util.Stack;
+
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAnyElement;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
@@ -25,6 +27,7 @@
 public class CMVisitor
 {
   protected int indent = 0;
+  protected Stack visitedCMGroupStack = new Stack();
 
   public void visitCMNode(CMNode node)
   {
@@ -62,7 +65,21 @@
         }
         case CMNode.GROUP :
         {
-          visitCMGroup((CMGroup)node);
+          CMGroup group = (CMGroup)node;
+          
+          // This is to prevent recursion.
+          if (visitedCMGroupStack.contains(group))
+          {
+            break;
+          }
+          
+          // Push the current group to check later to avoid potential recursion
+          visitedCMGroupStack.push(group);
+          
+          visitCMGroup(group);
+
+          // Pop the current group
+          visitedCMGroupStack.pop();
           break;
         }
       }
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMContentBuilderImpl.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMContentBuilderImpl.java
index 532a484..290f6f5 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMContentBuilderImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMContentBuilderImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -66,7 +66,11 @@
 
 	protected int numOfRepeatableElements = 1;
 	protected Stack cmGroupStack = new Stack();
+	protected int depthLimit = -1;
 
+	protected int domLevel;
+	private int originalBuildPolicy;
+	
 	public interface ExternalCMDocumentSupport {
 		public CMDocument getCMDocument(Element element, String uri);
 	}
@@ -186,6 +190,7 @@
 	public void createDefaultContent(Node parent, CMElementDeclaration ed) {
 		currentParent = parent;
 		alwaysVisit = true;
+		originalBuildPolicy = buildPolicy;
 		visitCMElementDeclaration(ed);
 	}
 
@@ -209,9 +214,11 @@
 	}
 
 	protected void handlePushParent(Element parent, CMElementDeclaration ed) {
+	  domLevel++;
 	}
 
 	protected void handlePopParent(Element element, CMElementDeclaration ed) {
+      domLevel--;
 	}
 
 	// The range must be between 1 and 99.
@@ -349,6 +356,16 @@
 		linkNode(text);
 	}
 
+	public void visitCMNode(CMNode node) {
+		if (depthLimit != -1) {
+			if (domLevel > depthLimit) {
+				buildPolicy = buildPolicy &= ~BUILD_OPTIONAL_ELEMENTS;
+			} else {
+				buildPolicy = originalBuildPolicy;
+			}
+		}
+		super.visitCMNode(node);
+	}
 
 	public void visitCMGroup(CMGroup e) {
 		cmGroupStack.push(e);
@@ -411,7 +428,19 @@
 				}
 
 				if (cmNode != null) {
-					visitCMNode(cmNode);
+					// Bug 330260
+					// Problem - Add child element also adds optional grand-child elements
+					// This assumes 'e' is a model group choice, case 1. However 'e' could be a model group definition, case 2, where the
+					// first child is a model group. In the first case (choice), the first child is an
+					// element. Upon visiting the element (visitCMElementDeclaration), the minOccurs of the
+					// choice is ALSO considered. If its minOccurs is 0, then the first element is not added as a child.
+					// However, in the second case (model group definition), the first child is a choice, but the multiplicity is [1,1],
+					// meaning, it is required. So the first element is then added as child, even though
+					// the model group definition reference is optional. (minOccurs is not checked in this method, visitCMGroup)
+					// Visit the node only if it is not a GROUP (model group). If it is an element, then visit it.
+					if (!(cmNode.getNodeType() == CMNode.GROUP && min > 0)) {
+						visitCMNode(cmNode);
+					}
 				}
 			}
 			else if (e.getOperator() == CMGroup.ALL // ALL
@@ -581,6 +610,11 @@
 			e.printStackTrace();
 		}
 	}
+	
+	public void setOptionalElementDepthLimit(int depth) {
+		depthLimit = depth;
+	}
+	
 
 	// test
 	//
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMWriter.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMWriter.java
index d5a1150..736c1f3 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMWriter.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/DOMWriter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -156,7 +156,7 @@
        boolean isRootElement = element.getParentNode().getNodeType() == Node.DOCUMENT_NODE;
        if (hasChildNodes || isRootElement)
        {
-         if (currentElementHasChildElements || isRootElement)
+         if (currentElementHasChildElements)
          {
            println(">"); //$NON-NLS-1$
          }
diff --git a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/NamespaceTable.java b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/NamespaceTable.java
index 18a2541..71d115d 100644
--- a/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/NamespaceTable.java
+++ b/bundles/org.eclipse.wst.xml.core/src-contentmodel/org/eclipse/wst/xml/core/internal/contentmodel/util/NamespaceTable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2007 IBM Corporation and others.
+ * Copyright (c) 2002, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -29,7 +29,11 @@
 {                   
   public Hashtable hashtable = new Hashtable();
 
-  public NamespaceTable(Document document)
+/**
+ * @deprecated
+ * @param document - no longer used
+ */
+public NamespaceTable(Document document)
   {         
 	  this();
     //DOMExtension domExtension = DOMExtensionProviderRegistry.getInstance().getDOMExtension(document);
diff --git a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java
index 409ffa0..318f731 100644
--- a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java
+++ b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSEAdapter.java
@@ -276,7 +276,7 @@
 		//Assert.isNotNull(childMap.getChildAdapterClass());
 		Assert.isNotNull(node);
 
-		EMF2DOMAdapter adapter = primGetExistingAdapter(node);
+		EMF2DOMAdapter adapter = primGetExistingAdapter(node,childMap);
 
 		if (adapter != null) {
 			if (adapter.isMOFProxy() || adapter.getTarget() == null) {
@@ -286,7 +286,8 @@
 				}
 				adapter = null;
 			}
-		} else {
+		}
+		if (adapter == null) {
 			adapter = primCreateAdapter(node, childMap);
 		}
 		return adapter;
@@ -314,6 +315,58 @@
 		}
 	}
 	
+	protected EMF2DOMAdapter primGetExistingAdapter(Node aNode, Translator childMap) {
+		INodeNotifier sseNode = (INodeNotifier) aNode;
+		Collection adapters = sseNode.getAdapters();
+		for (Iterator iterator = adapters.iterator(); iterator.hasNext();) {
+			INodeAdapter adapter = (INodeAdapter) iterator.next();
+			// First Check if it's an EMF2DOMAdapter
+			if (adapter != null && adapter.isAdapterForType(EMF2DOMAdapter.ADAPTER_CLASS)) {
+				// Cast to EMF2DOMAdapter
+				EMF2DOMSSEAdapter e2DAdapter = (EMF2DOMSSEAdapter) adapter;
+				Object adapterTarget = e2DAdapter.getTarget();
+				//Translator adapterTranslator = e2DAdapter.fTranslator;
+				
+				//Handle the cases where either adapter's target is null 
+				if ((getTarget() == null) || (adapterTarget == null))
+					if (resourceClass != null && resourceClass.equals(e2DAdapter.getResourceClass()))
+						return e2DAdapter;
+					else
+						continue;
+				
+				
+				// Check if target is an EMF resource
+				if (getTarget() instanceof Resource) {
+					/*
+					 * Now check if it's the right one (Multiple resources
+					 * could be attached)
+					 */
+					if (adapterTarget != null && adapterTarget == getTarget()) {
+						return e2DAdapter;
+					}
+				}
+				else {
+					// Check if targets are EObjects with the same resources
+					EObject myTarget = (EObject) getTarget();
+					/*
+					 * Now check if it's the right one (Multiple resources could
+					 * be attached)
+					 */
+					if (adapterTarget != null && ((EObject)adapterTarget).eResource() == myTarget.eResource()) {
+						return e2DAdapter;
+					}
+				}
+				
+				if (adapterTarget instanceof EObject) {
+					if (((EObject) e2DAdapter.getTarget()).eResource() == null && e2DAdapter.fTranslator == childMap) {
+						return e2DAdapter;
+					}
+				}
+			}
+		}
+		return null;
+	}
+	
 	protected EMF2DOMAdapter primGetExistingAdapter(Node aNode) {
 		INodeNotifier sseNode = (INodeNotifier) aNode;
 		Collection adapters = sseNode.getAdapters();
@@ -327,7 +380,7 @@
 				
 				//Handle the cases where either adapter's target is null 
 				if ((getTarget() == null) || (adapterTarget == null))
-					if(resourceClass.equals(e2DAdapter.getResourceClass()))
+					if (resourceClass != null && resourceClass.equals(e2DAdapter.getResourceClass()))
 						return e2DAdapter;
 					else
 						continue;
diff --git a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java
index 8b23e11..40289d7 100644
--- a/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java
+++ b/bundles/org.eclipse.wst.xml.core/src-emfModelSynch/org/eclipse/wst/xml/core/internal/emf2xml/EMF2DOMSSERenderer.java
@@ -66,6 +66,8 @@
 	private IModelManager modelManager;
 	
 	private Class resourceClass;
+	
+	private boolean reverting = false;
 
 	/** The XML DOM model */
 	protected IDOMModel xmlModel;
@@ -440,7 +442,7 @@
 		if (isBatchChanges)
 			return;
 		try {
-			if (aboutToChangeNode != null && model.getStructuredDocument() != null
+			if (reverting && aboutToChangeNode != null && model.getStructuredDocument() != null
 					&& model.getStructuredDocument().getFirstStructuredDocumentRegion() != aboutToChangeNode) {
 				String id = getModelManagerId();
 				IStructuredModel tempModel = null;
@@ -452,6 +454,7 @@
 					if (tempModel != null && (tempModel.getReferenceCountForEdit() > 0)) {
 						tempModel.releaseFromEdit();
 					}
+					reverting = false;
 				}
 			}
 		} finally {
@@ -500,11 +503,15 @@
 	}
 
 	public void processPostModelEvent(ModelLifecycleEvent event) {
-		// TODO Auto-generated method stub
+		if (event.getType() == ModelLifecycleEvent.MODEL_REVERT)
+			reverting = false;
 
 	}
 
 	public void processPreModelEvent(ModelLifecycleEvent event) {
+		if (event.getType() == ModelLifecycleEvent.MODEL_REVERT)
+			reverting = true;
+			
 		if (!isSaving) {
 			if (event.getType() == ModelLifecycleEvent.MODEL_SAVED) {
 				ResourceSetWorkbenchEditSynchronizer synchronizer = (ResourceSetWorkbenchEditSynchronizer) ((ProjectResourceSet) resource.getResourceSet()).getSynchronizer();
@@ -512,6 +519,7 @@
 				synchronizer.preSave(aFile, resource);
 			}
 		}
+		
 	}
 
 
@@ -640,5 +648,9 @@
 		if (resource != null)
 			resourceClass = resource.getClass();
 	}
+	public boolean isReverting() {
+		return this.reverting;
+	}
+
 
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src-search/org/eclipse/wst/xml/core/internal/search/matching/XMLSearchPatternMatcher.java b/bundles/org.eclipse.wst.xml.core/src-search/org/eclipse/wst/xml/core/internal/search/matching/XMLSearchPatternMatcher.java
index a5ee621..b38e354 100644
--- a/bundles/org.eclipse.wst.xml.core/src-search/org/eclipse/wst/xml/core/internal/search/matching/XMLSearchPatternMatcher.java
+++ b/bundles/org.eclipse.wst.xml.core/src-search/org/eclipse/wst/xml/core/internal/search/matching/XMLSearchPatternMatcher.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -49,8 +49,8 @@
 		{
 		  Element e = (Element)node;
 		  String attributeName = (prefix != null && prefix.length() > 0) ? ("xmlns:" + prefix) : "xmlns";  //$NON-NLS-1$ //$NON-NLS-2$
-		  result = e.getAttribute(attributeName);
-		  if (result != null)
+		  result = e.hasAttribute(attributeName) ? e.getAttribute(attributeName) : null;
+		  if (result != null && result.length() > 0)
 		  {
 			 break;  
 		  }	  
@@ -66,8 +66,8 @@
 			pattern.setElementNamespace(domElement.getNamespaceURI());
             // TODO (cs) set the depth attribute on the pattern
             //
-			String actualValue = domElement.getAttribute(pattern.getAttributeName());
-			 if(actualValue != null){
+			String actualValue = domElement.hasAttribute(pattern.getAttributeName()) ? domElement.getAttribute(pattern.getAttributeName()) : null;
+			 if(actualValue != null && actualValue.length() > 0){
 					int n = actualValue.indexOf(":"); //$NON-NLS-1$
 					if(n > 0){
 						String prefix = actualValue.substring(0, n);
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/AnnotationMsg.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/AnnotationMsg.java
new file mode 100644
index 0000000..5ba65d9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/AnnotationMsg.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ ********************************************************************************/
+package org.eclipse.wst.xml.core.internal.validation;
+
+public class AnnotationMsg {
+	public static String PROBMLEM_ID = "ProblemId"; //$NON-NLS-1$
+	public static String LENGTH = "Length"; //$NON-NLS-1$
+	public static String ATTRVALUETEXT = "AttributeValueText"; //$NON-NLS-1$
+	public static String ATTRVALUENO = "AttributeValueNo"; //$NON-NLS-1$
+	public static String ATTRNO = "AttrNo"; //$NON-NLS-1$
+	private int problemId;
+	private Object attributeValueText;
+	private int length;
+	
+	public AnnotationMsg(int problemId, Object attributeValueText, int length) {
+		super();
+		this.problemId = problemId;
+		this.attributeValueText = attributeValueText;
+		this.length = length;
+	}
+	public int getProblemId() {
+		return problemId;
+	}
+
+	public Object getAttributeValueText() {
+		return attributeValueText;
+	}
+
+	public int getLength(){
+		return length;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/MarkupValidator.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/MarkupValidator.java
new file mode 100644
index 0000000..a6d19bf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/MarkupValidator.java
@@ -0,0 +1,929 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.validation;
+
+import java.util.Locale;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceProxy;
+import org.eclipse.core.resources.IResourceProxyVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.validation.AbstractValidator;
+import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.ValidationState;
+import org.eclipse.wst.validation.internal.core.Message;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
+import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+import org.eclipse.wst.xml.core.internal.Logger;
+import org.eclipse.wst.xml.core.internal.XMLCoreMessages;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Node;
+
+/**
+ * Basic XML syntax checking step.
+ */
+public class MarkupValidator extends AbstractValidator implements IValidator {
+	public static final int ELEMENT_ERROR_LIMIT = 25;
+    public static final int PARTIAL = 1;
+    public static final int TOTAL = 0;
+	private String DQUOTE = "\""; //$NON-NLS-1$
+	private String SQUOTE = "'"; //$NON-NLS-1$
+	
+
+	private IDocument fDocument;
+
+	private IContentType fRootContentType = null;
+
+    private IReporter fReporter = null;
+  
+	private static final String ANNOTATIONMSG = AnnotationMsg.class.getName();
+
+	public void getAnnotationMsg(IReporter reporter, int problemId, LocalizedMessage message, Object attributeValueText, int len){
+		AnnotationMsg annotation = new AnnotationMsg(problemId, attributeValueText,len);
+		message.setAttribute(ANNOTATIONMSG, annotation);
+		reporter.addMessage(this, message);
+	}
+	
+		
+	private void addAttributeError(String messageText, String attributeValueText, int start, int length, int problemId, IStructuredDocumentRegion sdRegion, IReporter reporter, int messageSeverity) {
+
+		if (sdRegion.isDeleted()) {
+			return;
+		}
+
+		int lineNo = getLineNumber(start);
+		LocalizedMessage message = new LocalizedMessage(messageSeverity, messageText);
+		message.setOffset(start);
+		message.setLength(length);
+		message.setLineNo(lineNo);
+		
+
+		getAnnotationMsg(reporter, problemId, message, attributeValueText,length);
+		
+	}
+
+	private void checkAttributesInEndTag(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		ITextRegionList textRegions = structuredDocumentRegion.getRegions();
+		int errorCount = 0;
+		int start = structuredDocumentRegion.getEndOffset();
+		int end = structuredDocumentRegion.getEndOffset();
+		for (int i = 0; (i < textRegions.size()) && (errorCount < ELEMENT_ERROR_LIMIT) && !structuredDocumentRegion.isDeleted(); i++) {
+			ITextRegion textRegion = textRegions.get(i);
+			if ((textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) || (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) || (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
+				if (start > structuredDocumentRegion.getStartOffset(textRegion)) {
+					start = structuredDocumentRegion.getStartOffset(textRegion);
+				}
+				end = structuredDocumentRegion.getEndOffset(textRegion);
+				errorCount++;
+			}
+		}
+		// create one error for all attributes in the end tag
+		if (errorCount > 0) {
+			// Position p = new Position(start, end - start);
+			String messageText = XMLCoreMessages.End_tag_has_attributes;
+			LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.END_TAG_WITH_ATTRIBUTES), messageText);
+			message.setOffset(start);
+			message.setLength(end - start);
+			message.setLineNo(getLineNumber(start));
+
+			getAnnotationMsg(reporter, ProblemIDsXML.AttrsInEndTag, message, null,end-start);
+			
+		}
+	}
+
+
+	private void checkClosingBracket(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		ITextRegion r = null;
+		boolean closed = false;
+		for (int i = 0; (i < regions.size()) && !structuredDocumentRegion.isDeleted(); i++) {
+			r = regions.get(i);
+			if ((r.getType() == DOMRegionContext.XML_TAG_CLOSE) || (r.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE)) {
+				closed = true;
+			}
+		}
+		if (!closed) {
+
+			String messageText = XMLCoreMessages.ReconcileStepForMarkup_6;
+
+			int start = structuredDocumentRegion.getStartOffset();
+			int length = structuredDocumentRegion.getText().trim().length();
+			int lineNo = getLineNumber(start);
+
+			LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.MISSING_CLOSING_BRACKET) , messageText);
+			message.setOffset(start);
+			message.setLength(length);
+			message.setLineNo(lineNo);
+			getAnnotationMsg(reporter, ProblemIDsXML.MissingClosingBracket, message, null,length);
+
+			
+		}
+	}
+
+	private void checkEmptyTag(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		// navigate to name
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		if (regions.size() == 2) {
+			// missing name region
+			if ((regions.get(0).getType() == DOMRegionContext.XML_TAG_OPEN) && (regions.get(1).getType() == DOMRegionContext.XML_TAG_CLOSE)) {
+				String messageText = XMLCoreMessages.ReconcileStepForMarkup_3;
+				int start = structuredDocumentRegion.getStartOffset();
+				int length = structuredDocumentRegion.getLength();
+				int lineNo = getLineNumber(start);
+
+				LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.MISSING_TAG_NAME) , messageText);
+				message.setOffset(start);
+				message.setLength(length);
+				message.setLineNo(lineNo);
+
+				getAnnotationMsg(reporter, ProblemIDsXML.EmptyTag, message, null,length);
+			}
+		}
+	}
+
+	private int getLineNumber(int start) {
+		int lineNo = -1;
+		try {
+			lineNo = getDocument().getLineOfOffset(start) + 1;
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+		return lineNo;
+	}
+
+	private void checkForAttributeValue(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		// check for attributes without a value
+		// track the attribute/equals/value sequence using a state of 0, 1 ,2
+		// representing the name, =, and value, respectively
+		int attrState = 0;
+		ITextRegionList textRegions = structuredDocumentRegion.getRegions();
+		// ReconcileAnnotationKey key = createKey(structuredDocumentRegion,
+		// getScope());
+
+		int errorCount = 0;
+		for (int i = 0; (i < textRegions.size()) && (errorCount < ELEMENT_ERROR_LIMIT); i++) {
+			ITextRegion textRegion = textRegions.get(i);
+			if ((textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) || isTagCloseTextRegion(textRegion)) {
+				// dangling name and '='
+				if ((attrState == 2) && (i >= 2)) {
+					// create annotation
+					ITextRegion nameRegion = textRegions.get(i - 2);
+					if (!(nameRegion instanceof ITextRegionContainer)) {
+						Object[] args = {structuredDocumentRegion.getText(nameRegion)};
+						String messageText = NLS.bind(XMLCoreMessages.Attribute__is_missing_a_value, args);
+
+						int start = structuredDocumentRegion.getStartOffset(nameRegion);
+						int end = structuredDocumentRegion.getEndOffset();
+						int lineNo = getLineNumber(start);
+						int textLength = structuredDocumentRegion.getText(nameRegion).trim().length();
+
+						LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.ATTRIBUTE_HAS_NO_VALUE) , messageText);
+						message.setOffset(start);
+						message.setLength(textLength);
+						message.setLineNo(lineNo);
+
+						// quick fix info
+						ITextRegion equalsRegion = textRegions.get(i - 2 + 1);
+						int insertOffset = structuredDocumentRegion.getTextEndOffset(equalsRegion) - end;
+						Object[] additionalFixInfo = {structuredDocumentRegion.getText(nameRegion), new Integer(insertOffset)};
+
+						getAnnotationMsg(reporter, ProblemIDsXML.MissingAttrValue, message, additionalFixInfo,textLength);
+						errorCount++;
+					}
+				}
+				// name but no '=' (XML only)
+				else if ((attrState == 1) && (i >= 1)) {
+					// create annotation
+					ITextRegion previousRegion = textRegions.get(i - 1);
+					if (!(previousRegion instanceof ITextRegionContainer)) {
+						Object[] args = {structuredDocumentRegion.getText(previousRegion)};
+						String messageText = NLS.bind(XMLCoreMessages.Attribute__has_no_value, args);
+						int start = structuredDocumentRegion.getStartOffset(previousRegion);
+						int textLength = structuredDocumentRegion.getText(previousRegion).trim().length();
+						int lineNo = getLineNumber(start);
+
+						LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.ATTRIBUTE_HAS_NO_VALUE), messageText);
+						message.setOffset(start);
+						message.setLength(textLength);
+						message.setLineNo(lineNo);
+
+						getAnnotationMsg(reporter, ProblemIDsXML.NoAttrValue, message, structuredDocumentRegion.getText(previousRegion),textLength);
+				
+
+						errorCount++;
+					}
+				}
+				attrState = 1;
+			}
+			else if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+				attrState = 2;
+			}
+			else if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+				attrState = 0;
+			}
+		}
+
+	}
+
+	private void checkForSpaceBeforeName(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		String sdRegionText = structuredDocumentRegion.getFullText();
+		if (sdRegionText.startsWith(" ")) { //$NON-NLS-1$
+			IStructuredDocumentRegion prev = structuredDocumentRegion.getPrevious();
+			if (prev != null) {
+				// this is possibly the case of "< tag"
+				if ((prev.getRegions().size() == 1) && isStartTag(prev)) {
+					// add the error for preceding space in tag name
+					String messageText = XMLCoreMessages.ReconcileStepForMarkup_2;
+					int start = structuredDocumentRegion.getStartOffset();
+					// find length of whitespace
+					int length = sdRegionText.trim().equals("") ? sdRegionText.length() : sdRegionText.indexOf(sdRegionText.trim()); //$NON-NLS-1$
+
+					LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.WHITESPACE_BEFORE_TAGNAME) , messageText);
+					message.setOffset(start);
+					message.setLength(length);
+					message.setLineNo(getLineNumber(start));
+					getAnnotationMsg(reporter, ProblemIDsXML.SpacesBeforeTagName, message, null,length);
+				}
+			}
+		}
+	}
+
+	private void checkNoNamespaceInPI(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		// navigate to name
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		ITextRegion r = null;
+		int errorCount = 0;
+		for (int i = 0; (i < regions.size()) && (errorCount < ELEMENT_ERROR_LIMIT) && !structuredDocumentRegion.isDeleted(); i++) {
+			r = regions.get(i);
+			if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+				String piText = structuredDocumentRegion.getText(r);
+				int index = piText.indexOf(":"); //$NON-NLS-1$
+				if (index != -1) {
+					String messageText = XMLCoreMessages.ReconcileStepForMarkup_4;
+					int start = structuredDocumentRegion.getStartOffset(r) + index;
+					int length = piText.trim().length() - index;
+
+					LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.NAMESPACE_IN_PI_TARGET) , messageText);
+					message.setOffset(start);
+					message.setLength(length);
+					message.setLineNo(getLineNumber(start));
+
+					
+					getAnnotationMsg(reporter, ProblemIDsXML.NamespaceInPI, message, null,length);
+
+					errorCount++;
+				}
+			}
+		}
+	}
+
+	private void checkQuotesForAttributeValues(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		ITextRegion r = null;
+		String attrValueText = ""; //$NON-NLS-1$
+		int errorCount = 0;
+		for (int i = 0; (i < regions.size()) && (errorCount < ELEMENT_ERROR_LIMIT); i++) {
+			r = regions.get(i);
+			if (r.getType() != DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+				continue;
+			}
+
+			attrValueText = structuredDocumentRegion.getText(r);
+			// attribute value includes quotes in the string
+			// split up attribute value on quotes
+			/*
+			 * WORKAROUND till
+			 * http://dev.icu-project.org/cgi-bin/icu-bugs/incoming?findid=5207
+			 * is fixed. (Also see BUG143628)
+			 */
+
+			java.util.StringTokenizer st = new java.util.StringTokenizer(attrValueText, "\"'", true); //$NON-NLS-1$
+			int size = st.countTokens();
+			// get the pieces of the attribute value
+			String one = "", two = ""; //$NON-NLS-1$ //$NON-NLS-2$
+			if (size > 0) {
+				one = st.nextToken();
+			}
+			if (size > 1) {
+				two = st.nextToken();
+			}
+			if (size > 2) {
+				// should be handled by parsing...
+				// as in we can't have an attribute value like: <element
+				// attr="a"b"c"/>
+				// and <element attr='a"b"c' /> is legal
+				continue;
+			}
+
+
+			if (size == 1) {
+				if (one.equals(DQUOTE) || one.equals(SQUOTE)) {
+					// missing closing quote
+					String message = XMLCoreMessages.ReconcileStepForMarkup_0;
+					addAttributeError(message, attrValueText, structuredDocumentRegion.getStartOffset(r), attrValueText.trim().length(), ProblemIDsXML.Unclassified, structuredDocumentRegion, reporter, getPluginPreference().getInt(XMLCorePreferenceNames.MISSING_CLOSING_QUOTE));
+					errorCount++;
+				}
+				else {
+					// missing both
+					String message = XMLCoreMessages.ReconcileStepForMarkup_1;
+					addAttributeError(message, attrValueText, structuredDocumentRegion.getStartOffset(r), attrValueText.trim().length(), ProblemIDsXML.AttrValueNotQuoted, structuredDocumentRegion, reporter, getPluginPreference().getInt(XMLCorePreferenceNames.MISSING_CLOSING_QUOTE));
+					errorCount++;
+				}
+			}
+			else if (size == 2) {
+				if ((one.equals(SQUOTE) && !two.equals(SQUOTE)) || (one.equals(DQUOTE) && !two.equals(DQUOTE))) {
+					// missing closing quote
+					String message = XMLCoreMessages.ReconcileStepForMarkup_0;
+					addAttributeError(message, attrValueText, structuredDocumentRegion.getStartOffset(r), attrValueText.trim().length(), ProblemIDsXML.Unclassified, structuredDocumentRegion, reporter, getPluginPreference().getInt(XMLCorePreferenceNames.MISSING_CLOSING_QUOTE));
+					errorCount++;
+				}
+			}
+		}
+		// end of region for loop
+	}
+
+	private void checkStartEndTagPairs(IStructuredDocumentRegion sdRegion, IReporter reporter) {
+
+		if (sdRegion.isDeleted()) {
+			return;
+		}
+
+		// check start/end tag pairs
+		IDOMNode xmlNode = getXMLNode(sdRegion);
+
+		if (xmlNode == null) {
+			return;
+		}
+
+		boolean selfClosed = false;
+		String tagName = null;
+
+		/**
+		 * For tags that aren't meant to be EMPTY, make sure it's empty or has an end tag
+		 */
+		if (xmlNode.isContainer()) {
+			IStructuredDocumentRegion endRegion = xmlNode.getEndStructuredDocumentRegion();
+			if (endRegion == null) {
+				IStructuredDocumentRegion startRegion = xmlNode.getStartStructuredDocumentRegion();
+				if (startRegion != null && !startRegion.isDeleted() && DOMRegionContext.XML_TAG_OPEN.equals(startRegion.getFirstRegion().getType())) {
+					// analyze the tag (check self closing)
+					ITextRegionList regions = startRegion.getRegions();
+					ITextRegion r = null;
+					int start = sdRegion.getStart();
+					int length = sdRegion.getTextLength();
+					for (int i = 0; i < regions.size(); i++) {
+						r = regions.get(i);
+						if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+							tagName = sdRegion.getText(r);
+							start = sdRegion.getStartOffset(r);
+							length = r.getTextLength();
+						}
+						else if (r.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+							selfClosed = true;
+						}
+					}
+
+
+					if (!selfClosed && (tagName != null)) {
+						Object[] args = {tagName};
+						String messageText = NLS.bind(XMLCoreMessages.Missing_end_tag_, args);
+
+						int lineNumber = getLineNumber(start);
+
+						LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.MISSING_END_TAG) , messageText);
+						message.setOffset(start);
+						message.setLength(length);
+						message.setLineNo(lineNumber);
+						Object[] additionalFixInfo = getStartEndFixInfo(xmlNode, tagName, r);
+	
+						getAnnotationMsg(reporter, ProblemIDsXML.MissingEndTag, message, additionalFixInfo,length);
+					}
+				}
+			}
+			else {
+				IStructuredDocumentRegion startRegion = xmlNode.getStartStructuredDocumentRegion();
+				if (startRegion == null || startRegion.isDeleted()) {
+					// analyze the tag (check self closing)
+					ITextRegionList regions = endRegion.getRegions();
+					ITextRegion r = null;
+					int start = sdRegion.getStart();
+					int length = sdRegion.getTextLength();
+					for (int i = 0; i < regions.size(); i++) {
+						r = regions.get(i);
+						if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+							tagName = sdRegion.getText(r);
+							start = sdRegion.getStartOffset(r);
+							length = r.getTextLength();
+						}
+					}
+
+					if (tagName != null) {
+						Object[] args = {tagName};
+						String messageText = NLS.bind(XMLCoreMessages.Missing_start_tag_, args);
+
+						int lineNumber = getLineNumber(start);
+
+						LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.MISSING_START_TAG), messageText);
+						message.setOffset(start);
+						message.setLength(length);
+						message.setLineNo(lineNumber);
+						Object[] additionalFixInfo = getStartEndFixInfo(xmlNode, tagName, r);
+												
+						getAnnotationMsg(reporter, ProblemIDsXML.MissingStartTag, message, additionalFixInfo,length);
+						
+					}
+				}
+			}
+
+		}
+		/*
+		 * Check for an end tag that has no start tag
+		 */
+		else {
+			IStructuredDocumentRegion startRegion = xmlNode.getStartStructuredDocumentRegion();
+			if (startRegion == null) {
+				IStructuredDocumentRegion endRegion = xmlNode.getEndStructuredDocumentRegion();
+				if (!endRegion.isDeleted()) {
+					// get name
+					ITextRegionList regions = endRegion.getRegions();
+					ITextRegion r = null;
+					for (int i = 0; i < regions.size(); i++) {
+						r = regions.get(i);
+						if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+							tagName = sdRegion.getText(r);
+						}
+					}
+
+					if (!selfClosed && (tagName != null)) {
+						String messageText = XMLCoreMessages.Indicate_no_grammar_specified_severities_error;
+
+						int start = sdRegion.getStart();
+						int lineNumber = getLineNumber(start);
+
+						// SEVERITY_STRUCTURE == IMessage.HIGH_SEVERITY
+						IMessage message = new LocalizedMessage(IMessage.HIGH_SEVERITY, messageText);
+						message.setOffset(start);
+						message.setLength(sdRegion.getTextLength());
+						message.setLineNo(lineNumber);
+
+						reporter.addMessage(this, message);
+					}
+				}
+			}
+		}
+	}
+
+	private Object[] getStartEndFixInfo(IDOMNode xmlNode, String tagName, ITextRegion r) {
+		// quick fix info
+		String tagClose = "/>"; //$NON-NLS-1$
+		int tagCloseOffset = xmlNode.getFirstStructuredDocumentRegion().getEndOffset();
+		if ((r != null) && (r.getType() == DOMRegionContext.XML_TAG_CLOSE)) {
+			tagClose = "/"; //$NON-NLS-1$
+			tagCloseOffset--;
+		}
+		IDOMNode firstChild = (IDOMNode) xmlNode.getFirstChild();
+		while ((firstChild != null) && (firstChild.getNodeType() == Node.TEXT_NODE)) {
+			firstChild = (IDOMNode) firstChild.getNextSibling();
+		}
+		int endOffset = xmlNode.getEndOffset(); 
+		int firstChildStartOffset = firstChild == null ? endOffset : firstChild.getStartOffset();
+		Object[] additionalFixInfo = {tagName, tagClose, new Integer(tagCloseOffset), new Integer(xmlNode.getFirstStructuredDocumentRegion().getEndOffset()), // startTagEndOffset
+					new Integer(firstChildStartOffset), // firstChildStartOffset
+					new Integer(endOffset)}; // endOffset
+		return additionalFixInfo;
+	}
+
+	private void checkStartingSpaceForPI(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		IStructuredDocumentRegion prev = structuredDocumentRegion.getPrevious();
+		if ((prev != null) && prev.getStartOffset() == 0) {
+			if (prev.getType() == DOMRegionContext.XML_CONTENT) {
+				String messageText = XMLCoreMessages.ReconcileStepForMarkup_5;
+				int start = prev.getStartOffset();
+				int length = prev.getLength();
+
+				LocalizedMessage message = new LocalizedMessage(getPluginPreference().getInt(XMLCorePreferenceNames.WHITESPACE_AT_START) , messageText);
+				message.setOffset(start);
+				message.setLength(length);
+				message.setLineNo(getLineNumber(start));
+
+			
+				getAnnotationMsg(reporter, ProblemIDsXML.SpacesBeforePI, message, null,length);
+				
+				// Position p = new Position(start, length);
+				//				
+				// ReconcileAnnotationKey key =
+				// createKey(structuredDocumentRegion, getScope());
+				// TemporaryAnnotation annotation = new TemporaryAnnotation(p,
+				// SEVERITY_SYNTAX_ERROR, message, key,
+				// ProblemIDsXML.SpacesBeforePI);
+				// results.add(annotation);
+			}
+		}
+	}
+
+	public int getScope() {
+		return PARTIAL;
+	}
+
+	private IDOMNode getXMLNode(IStructuredDocumentRegion sdRegion) {
+
+		if (sdRegion == null) {
+			return null;
+		}
+
+		IStructuredModel xModel = null;
+		IDOMNode xmlNode = null;
+		// get/release models should always be in a try/finally block
+		try {
+			xModel = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			// xModel is sometime null, when closing editor, for example
+			if (xModel != null) {
+				xmlNode = (IDOMNode) xModel.getIndexedRegion(sdRegion.getStart());
+			}
+		}
+		finally {
+			if (xModel != null) {
+				xModel.releaseFromRead();
+			}
+		}
+		return xmlNode;
+	}
+
+	/**
+	 * Determines whether the IStructuredDocumentRegion is a XML "end tag"
+	 * since they're not allowed to have attribute ITextRegions
+	 * 
+	 * @param structuredDocumentRegion
+	 */
+	private boolean isEndTag(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN;
+	}
+
+	/**
+	 * Determines if the IStructuredDocumentRegion is an XML Processing
+	 * Instruction
+	 * 
+	 * @param structuredDocumentRegion
+	 * 
+	 */
+	private boolean isPI(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_PI_OPEN;
+	}
+
+	/**
+	 * Determines whether the IStructuredDocumentRegion is a XML "start tag"
+	 * since they need to be checked for proper XML attribute region sequences
+	 * 
+	 * @param structuredDocumentRegion
+	 * 
+	 */
+	private boolean isStartTag(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN;
+	}
+
+	// Because we check the "proper" closing separately from attribute
+	// sequencing, we need to know what's
+	// an appropriate close.
+	private boolean isTagCloseTextRegion(ITextRegion textRegion) {
+		return (textRegion.getType() == DOMRegionContext.XML_TAG_CLOSE) || (textRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE);
+	}
+
+	/**
+	 * Determines if the IStructuredDocumentRegion is XML Content
+	 * 
+	 * @param structuredDocumentRegion
+	 * 
+	 */
+	private boolean isXMLContent(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_CONTENT;
+	}
+
+	private IDocument getDocument() {
+		return fDocument;
+	}
+
+	public void connect(IDocument document) {
+		fDocument = document;
+	}
+
+	public void disconnect(IDocument document) {
+		fDocument = null;
+	}
+
+	public void validate(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion == null) {
+			return;
+		}
+
+		if (isStartTag(structuredDocumentRegion)) {
+			// check for attributes without a value
+			checkForAttributeValue(structuredDocumentRegion, reporter);
+			// check if started tag is ended
+			checkStartEndTagPairs(structuredDocumentRegion, reporter);
+			// check empty tag <>
+			checkEmptyTag(structuredDocumentRegion, reporter);
+			// check that each attribute has quotes
+			checkQuotesForAttributeValues(structuredDocumentRegion, reporter);
+			// check that the closing '>' is there
+			checkClosingBracket(structuredDocumentRegion, reporter);
+		}
+		else if (isEndTag(structuredDocumentRegion)) {
+			// check if ending tag was started
+			checkStartEndTagPairs(structuredDocumentRegion, reporter);
+			// check for attributes in an end tag
+			checkAttributesInEndTag(structuredDocumentRegion, reporter);
+			// check that the closing '>' is there
+			checkClosingBracket(structuredDocumentRegion, reporter);
+		}
+		else if (isPI(structuredDocumentRegion)) {
+			// check validity of processing instruction
+			checkStartingSpaceForPI(structuredDocumentRegion, reporter);
+			checkNoNamespaceInPI(structuredDocumentRegion, reporter);
+		}
+		else if (isXMLContent(structuredDocumentRegion)) {
+			checkForSpaceBeforeName(structuredDocumentRegion, reporter);
+		}
+		else if (isXMLDoctypeDeclaration(structuredDocumentRegion)) {
+			checkDocumentTypeReferences(structuredDocumentRegion, reporter);
+		}
+	}
+
+	/**
+	 * @param structuredDocumentRegion
+	 * @param reporter
+	 */
+	private void checkDocumentTypeReferences(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+	}
+
+	/**
+	 * @param structuredDocumentRegion
+	 * @return
+	 */
+	private boolean isXMLDoctypeDeclaration(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_DECLARATION_OPEN && structuredDocumentRegion.getType().equals(DOMRegionContext.XML_DOCTYPE_DECLARATION);
+	}
+
+	public void cleanup(IReporter reporter) {
+		fDocument = null;
+	}
+
+	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
+		String[] uris = helper.getURIs();
+		IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
+		if (uris.length > 0) {
+			IFile currentFile = null;
+
+			for (int i = 0; i < uris.length && !reporter.isCancelled(); i++) {
+				// might be called with just project path?
+				IPath path = new Path(uris[i]);
+				if (path.segmentCount() > 1) {
+					currentFile = wsRoot.getFile(path);
+					if (shouldValidate(currentFile, true)) {
+						validateV1File(currentFile, reporter);
+					}
+				}
+				else if (uris.length == 1) {
+					validateV1Project(helper, reporter);
+				}
+			}
+		}
+		else
+			validateV1Project(helper, reporter);
+	}
+	
+	private boolean shouldValidate(IResourceProxy proxy) {
+		if(proxy.getType() == IResource.FILE) {
+			String name = proxy.getName();
+			if(name.toLowerCase(Locale.US).endsWith(".xml")) { //$NON-NLS-1$
+				return true;
+			}
+		}
+		return shouldValidate(proxy.requestResource(), false);
+	}
+	
+	private boolean shouldValidate(IResource file, boolean checkExtension) {
+		if (file == null || !file.exists() || file.getType() != IResource.FILE)
+			return false;
+		if (checkExtension) {
+			String extension = file.getFileExtension();
+			if (extension != null && "xml".endsWith(extension.toLowerCase(Locale.US))) //$NON-NLS-1$
+				return true;
+		}
+
+		IContentDescription contentDescription = null;
+		try {
+			contentDescription = ((IFile) file).getContentDescription();
+			if (contentDescription != null) {
+				IContentType contentType = contentDescription.getContentType();
+				return contentDescription != null && contentType.isKindOf(getXMLContentType());
+			}
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+		return false;
+	}
+
+	/**
+	 * @param helper
+	 * @param reporter
+	 */
+	private void validateV1Project(IValidationContext helper, final IReporter reporter) {
+		// if uris[] length 0 -> validate() gets called for each project
+		if (helper instanceof IWorkbenchContext) {
+			IProject project = ((IWorkbenchContext) helper).getProject();
+			IResourceProxyVisitor visitor = new IResourceProxyVisitor() {
+				public boolean visit(IResourceProxy proxy) throws CoreException {
+					if (shouldValidate(proxy)) {
+						validateV1File((IFile) proxy.requestResource(), reporter);
+					}
+					return true;
+				}
+			};
+			try {
+				// collect all jsp files for the project
+				project.accept(visitor, IResource.DEPTH_INFINITE);
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+	}
+	
+
+	/**
+	 * @param currentFile
+	 * @param reporter
+	 */
+	private void validateV1File(IFile currentFile, IReporter reporter) {
+		Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, currentFile.getFullPath().toString().substring(1));
+		reporter.displaySubtask(MarkupValidator.this, message);
+
+		IStructuredModel model = null;
+		try {
+			model = StructuredModelManager.getModelManager().getModelForRead(currentFile);
+			IStructuredDocument document = null;
+			if (model != null) {
+				document = model.getStructuredDocument();
+				connect(document);
+				IStructuredDocumentRegion validationRegion = document.getFirstStructuredDocumentRegion();
+				while (validationRegion != null) {
+					validate(validationRegion, reporter);
+					validationRegion = validationRegion.getNext();
+				}
+				disconnect(document);
+			}
+		}
+		catch (Exception e) {
+			Logger.logException(e);
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+	}
+
+	/**
+	 * @return
+	 */
+	private IContentType getXMLContentType() {
+		if (fRootContentType == null) {
+			fRootContentType = Platform.getContentTypeManager().getContentType("org.eclipse.core.runtime.xml"); //$NON-NLS-1$
+		}
+		return fRootContentType;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.validation.AbstractValidator#validate(org.eclipse.core.resources.IResource, int, org.eclipse.wst.validation.ValidationState, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
+		if (resource.getType() != IResource.FILE)
+			return null;
+		ValidationResult result = new ValidationResult();
+		fReporter = result.getReporter(monitor);
+
+		validateV1File((IFile) resource, fReporter);
+		
+		return result;
+	}
+	
+	public IReporter validate(IResource resource, int kind, ValidationState state) {
+		validate(resource,kind,state,new NullProgressMonitor());
+		return fReporter;
+	}
+	private Preferences getPluginPreference(){
+		return XMLCorePlugin.getDefault().getPluginPreferences();
+	}
+
+	public void validate(IRegion dirtyRegion, IValidationContext helper, IReporter reporter) {
+		if (getDocument() == null) {
+			return;
+		}
+		if (!(getDocument() instanceof IStructuredDocument)) {
+			return;
+		}
+
+		// remove old messages
+		reporter.removeAllMessages(this);
+
+		IStructuredDocumentRegion[] regions = ((IStructuredDocument) fDocument).getStructuredDocumentRegions(dirtyRegion.getOffset(), dirtyRegion.getLength());
+		for (int i = 0; i < regions.length; i++) {
+			validate(regions[i], reporter);
+		}
+	}
+	
+
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ProblemIDsXML.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ProblemIDsXML.java
new file mode 100644
index 0000000..cf34e74
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ProblemIDsXML.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 20010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.validation;
+
+public interface ProblemIDsXML {
+	int AttrsInEndTag = 3;
+	int AttrValueNotQuoted = 13;
+	int EmptyTag = 1;
+	int InvalidAttrValue = 11;
+	int MissingAttrValue = 4;
+	int MissingClosingBracket = 14;
+	int MissingEndTag = 2;
+	int MissingRequiredAttr = 12;
+	int MissingStartTag = 15;
+	int NamespaceInPI = 8;
+	int NoAttrValue = 5;
+	int SpacesBeforePI = 7;
+	int SpacesBeforeTagName = 6;
+	int Unclassified = 0;
+	int UnknownAttr = 10;
+	int UnknownElement = 9;
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
index 96c578c..57cae08 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
@@ -15,7 +15,6 @@
 import java.io.Reader;
 import java.net.URL;
 import java.util.List;
-import com.ibm.icu.util.StringTokenizer;
 import java.util.Vector;
 
 import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
@@ -28,6 +27,8 @@
 import org.xml.sax.XMLReader;
 import org.xml.sax.ext.LexicalHandler;
 
+import com.ibm.icu.util.StringTokenizer;
+
 /**
  * A helper class for the XML validator.
  * 
@@ -255,8 +256,11 @@
         }
         
         location = URIResolverPlugin.createResolver().resolve(baseURI, rootElementNamespace, location);    
-        location = URIResolverPlugin.createResolver().resolvePhysicalLocation(baseURI, rootElementNamespace, location);                                                    
-        location = URIHelper.addImpliedFileProtocol(location);
+        location = URIResolverPlugin.createResolver().resolvePhysicalLocation(baseURI, rootElementNamespace, location);
+        if (location != null)
+        {
+          location = URIHelper.addImpliedFileProtocol(location);
+        }
         
         schemaLocationString = location;
         
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLNestedValidatorContext.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLNestedValidatorContext.java
new file mode 100644
index 0000000..29c5e7e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLNestedValidatorContext.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.validation;
+
+
+import java.util.HashSet;
+
+import org.eclipse.wst.xml.core.internal.validation.core.NestedValidatorContext;
+
+
+/**
+ * XMLNestedValidatorContext is used to store state data needed during an XML
+ * validation session.
+ */
+public class XMLNestedValidatorContext extends NestedValidatorContext
+{
+  /**
+   * A set of inaccessible locations URIs (String).
+   */
+  private HashSet inaccessibleLocationURIs = new HashSet();
+
+  /**
+   * Determines if a location URI was marked as inaccessible.
+   * 
+   * @param locationURI
+   *          the location URI to test. Must not be null.
+   * @return true if a location URI was marked as inaccessible, false otherwise.
+   */
+  public boolean isURIMarkedInaccessible(String locationURI)
+  {
+    return locationURI != null && inaccessibleLocationURIs.contains(locationURI);
+  }
+
+  /**
+   * Marks the given location URI as inaccessible.
+   * 
+   * @param locationURI
+   *          the location URI to mark as inaccessible. Must not be null.
+   */
+  public void markURIInaccessible(String locationURI)
+  {
+    if (locationURI != null)
+    {
+      inaccessibleLocationURIs.add(locationURI);
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationConfiguration.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationConfiguration.java
index 2b01b88..dd451551 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationConfiguration.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
+ * Copyright (c) 2006, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     David Carver (STAR) - bug 297005 - Some static constants not made final.
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.validation;
 
@@ -22,10 +23,15 @@
   /**
    * @deprecated
    */
-  public static String WARN_NO_GRAMMAR = "WARN_NO_GRAMMAR"; //$NON-NLS-1$
-  public static String INDICATE_NO_GRAMMAR = "INDICATE_NO_GRAMMAR"; //$NON-NLS-1$
+  public static final String WARN_NO_GRAMMAR = "WARN_NO_GRAMMAR"; //$NON-NLS-1$
+  public static final String INDICATE_NO_GRAMMAR = "INDICATE_NO_GRAMMAR"; //$NON-NLS-1$
+  public static final String USE_XINCLUDE = "USE_XINCLUDE"; //$NON-NLS-1$
+  public static final String HONOUR_ALL_SCHEMA_LOCATIONS = "HONOUR_ALL_SCHEMA_LOCATIONS"; //$NON-NLS-1$
+
   private boolean warn_no_grammar_value = false;
   private int indicate_no_grammar_value = 1;
+  private boolean use_xinclude = false;
+  private boolean honour_all_schema_locations_value = false;
   
   /**
    * Set a feature of this configuration.
@@ -41,6 +47,10 @@
   {
 	if(WARN_NO_GRAMMAR.equals(feature))
 	  warn_no_grammar_value = value;
+    else if(USE_XINCLUDE.equals(feature))
+      use_xinclude = value;
+    else if(HONOUR_ALL_SCHEMA_LOCATIONS.equals(feature))
+      honour_all_schema_locations_value = value;
 	else
 	  throw new Exception("Feature not recognized."); //$NON-NLS-1$
 	
@@ -81,7 +91,11 @@
   {
 	if(WARN_NO_GRAMMAR.equals(feature))
 	  return warn_no_grammar_value;
-	
+	else if(USE_XINCLUDE.equals(feature))
+      return use_xinclude;
+    if(HONOUR_ALL_SCHEMA_LOCATIONS.equals(feature))
+      return honour_all_schema_locations_value;
+			
 	throw new Exception("Feature not recognized."); //$NON-NLS-1$
   }
 
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationInfo.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationInfo.java
index 888bc40..1113eb9 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationInfo.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidationInfo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -190,6 +190,9 @@
 	  return errorCustomizationManager;
   }
   
+  /**
+   * @deprecated Use {@link XMLValidationConfiguration} instead.
+   */
   public boolean isUseXInclude() {
 	  return XMLCorePlugin.getDefault().getPluginPreferences().getBoolean(XMLCorePreferenceNames.USE_XINCLUDE);
   }
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java
index 1a44faf..58ef83b 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,11 +20,14 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.net.ConnectException;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -40,17 +43,28 @@
 import org.apache.xerces.xni.XNIException;
 import org.apache.xerces.xni.parser.XMLEntityResolver;
 import org.apache.xerces.xni.parser.XMLInputSource;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.URIUtil;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
 import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
 import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.internal.ValOperation;
+import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 import org.eclipse.wst.xml.core.internal.Logger;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.IExternalSchemaLocationProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ExternalSchemaLocationProviderRegistry;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
 import org.eclipse.wst.xml.core.internal.validation.core.LazyURLInputStream;
+import org.eclipse.wst.xml.core.internal.validation.core.NestedValidatorContext;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -81,7 +95,12 @@
   protected static final String NO_GRAMMAR_FOUND = "NO_GRAMMAR_FOUND"; //$NON-NLS-1$
   
   private static final String FILE_NOT_FOUND_KEY = "FILE_NOT_FOUND"; //$NON-NLS-1$
+   
+  private MarkupValidator val = new MarkupValidator();
+  
+  private final String ANNOTATIONMSG = AnnotationMsg.class.getName();
 
+  private final static boolean _trace = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.xml.core/externalSchemaLocation")).booleanValue(); //$NON-NLS-1$
   /**
    * Constructor.
    */
@@ -96,10 +115,10 @@
     // Here we add some error keys that we need to adjust the location information for.
     // The location information will be adjusted to place the message on the line of the starting
     // element instead of on the line of the closing element.
-    adjustLocationErrorKeySet.add("MSG_CONTENT_INVALID");
-    adjustLocationErrorKeySet.add("MSG_CONTENT_INCOMPLETE");
-    adjustLocationErrorKeySet.add("cvc-complex-type.2.4.b");
-    adjustLocationErrorKeySet.add("cvc-complex-type.2.3");
+    adjustLocationErrorKeySet.add("MSG_CONTENT_INVALID"); //$NON-NLS-1$
+    adjustLocationErrorKeySet.add("MSG_CONTENT_INCOMPLETE"); //$NON-NLS-1$
+    adjustLocationErrorKeySet.add("cvc-complex-type.2.4.b"); //$NON-NLS-1$
+    adjustLocationErrorKeySet.add("cvc-complex-type.2.3"); //$NON-NLS-1$
   }
 
   /**
@@ -164,9 +183,7 @@
       reader.setFeature("http://apache.org/xml/features/continue-after-fatal-error", false); //$NON-NLS-1$
       reader.setFeature("http://xml.org/sax/features/namespace-prefixes", valinfo.isNamespaceEncountered()); //$NON-NLS-1$
       reader.setFeature("http://xml.org/sax/features/namespaces", valinfo.isNamespaceEncountered());               //$NON-NLS-1$
-      reader.setFeature("http://xml.org/sax/features/validation", valinfo.isGrammarEncountered());  //$NON-NLS-1$
-      reader.setFeature("http://apache.org/xml/features/validation/schema", valinfo.isGrammarEncountered()); //$NON-NLS-1$
-   	  reader.setFeature("http://apache.org/xml/features/xinclude", valinfo.isUseXInclude()); //$NON-NLS-1$      
+     
       reader.setContentHandler(new DefaultHandler()
       {
         public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
@@ -214,7 +231,7 @@
     StringBuffer fileString = new StringBuffer();
     try
     {
-      InputStreamReader inputReader = new InputStreamReader(inputStream, "UTF-8");
+      InputStreamReader inputReader = new InputStreamReader(inputStream, "UTF-8"); //$NON-NLS-1$
       BufferedReader reader = new BufferedReader(inputReader);
       char[] chars = new char[1024];
       int numberRead = reader.read(chars);
@@ -275,7 +292,28 @@
    */
   public XMLValidationReport validate(String uri, InputStream inputStream, XMLValidationConfiguration configuration, ValidationResult result)
   {
-    String grammarFile = "";
+	  return validate(uri, inputStream, configuration, null, null);
+  }
+  
+  /**
+   * Validate the inputStream
+   * 
+   * @param uri 
+   *    The URI of the file to validate.
+   * @param inputstream
+   *    The inputStream of the file to validate
+   * @param configuration
+   *    A configuration for this validation session.
+   * @param result
+   *    The validation result
+   * @param context
+   *    The validation context   
+   * @return 
+   *    Returns an XML validation report.
+   */
+  public XMLValidationReport validate(String uri, InputStream inputStream, XMLValidationConfiguration configuration, ValidationResult result, NestedValidatorContext context)
+  {
+    String grammarFile = ""; //$NON-NLS-1$
     Reader reader1 = null; // Used for the preparse.
     Reader reader2 = null; // Used for validation parse.
     
@@ -287,7 +325,7 @@
     } 
         
     XMLValidationInfo valinfo = new XMLValidationInfo(uri);
-    MyEntityResolver entityResolver = new MyEntityResolver(uriResolver); 
+    MyEntityResolver entityResolver = new MyEntityResolver(uriResolver, context); 
     ValidatorHelper helper = new ValidatorHelper(); 
     try
     {  
@@ -298,6 +336,24 @@
         valinfo.setGrammarEncountered(helper.isGrammarEncountered);
         
         XMLReader reader = createXMLReader(valinfo, entityResolver);
+        // Set the configuration option
+        if (configuration.getFeature(XMLValidationConfiguration.HONOUR_ALL_SCHEMA_LOCATIONS))
+        {
+            reader.setFeature("http://apache.org/xml/features/honour-all-schemaLocations", true); //$NON-NLS-1$
+        }
+        if (configuration.getFeature(XMLValidationConfiguration.USE_XINCLUDE))
+        {
+          reader.setFeature("http://apache.org/xml/features/xinclude", true); //$NON-NLS-1$      
+        }
+
+        // Support external schema locations
+        boolean isGrammarEncountered = helper.isGrammarEncountered;
+        if (!isGrammarEncountered) {
+        	isGrammarEncountered = checkExternalSchemas(reader, valinfo.getFileURI());
+        }
+        reader.setFeature("http://xml.org/sax/features/validation", isGrammarEncountered);  //$NON-NLS-1$
+        reader.setFeature("http://apache.org/xml/features/validation/schema", isGrammarEncountered); //$NON-NLS-1$
+
         XMLErrorHandler errorhandler = new XMLErrorHandler(valinfo);
         reader.setErrorHandler(errorhandler);
         
@@ -305,7 +361,7 @@
         inputSource.setCharacterStream(reader2);
         reader.parse(inputSource);   
         if(configuration.getIntFeature(XMLValidationConfiguration.INDICATE_NO_GRAMMAR) > 0 && 
-        		valinfo.isValid() && !helper.isGrammarEncountered)
+        		valinfo.isValid() && !isGrammarEncountered)
         {
           if(configuration.getIntFeature(XMLValidationConfiguration.INDICATE_NO_GRAMMAR) == 1)
             valinfo.addWarning(XMLValidationMessages._WARN_NO_GRAMMAR, 1, 0, uri, NO_GRAMMAR_FOUND, null);
@@ -350,11 +406,102 @@
         Logger.logException(e.getLocalizedMessage(), e);
       }
     }
+
+    if ( XMLCorePlugin.getDefault().getPluginPreferences().getBoolean(XMLCorePreferenceNames.MARKUP_VALIDATION)){
+	    IReporter reporter = executeMarkupValidator(uri);
+	    if (reporter != null){
+		    List msgList = reporter.getMessages();
+		    for (int i = 0;i < msgList.size();i++){
+		    	LocalizedMessage msg = (LocalizedMessage)msgList.get(i);
+		    	if (msg.getSeverity() == 2)
+		    		valinfo.addError(msg.getLocalizedMessage(), msg.getLineNumber(), msg.getOffset(),valinfo.getFileURI(),"null",getMsgArguments(msg) ); //$NON-NLS-1$
+		    	else if (msg.getSeverity() == 1)
+		    		valinfo.addWarning(msg.getLocalizedMessage(), msg.getLineNumber(), msg.getOffset(),valinfo.getFileURI(),"null", getMsgArguments(msg)); //$NON-NLS-1$
+		    }
+	    }
+    }
     
     return valinfo;
        
   }
 
+	private boolean checkExternalSchemas(XMLReader reader, String fileURI) throws Exception {
+		boolean isGrammarEncountered = false;
+		final StringBuffer schemaLocation = new StringBuffer();
+		String noNamespaceSchemaLocation = null;
+		// Check the schema provider extension point
+		IExternalSchemaLocationProvider[] providers = ExternalSchemaLocationProviderRegistry.getInstance().getProviders();
+		for (int i = 0; i < providers.length; i++) {
+			URI uri = null;
+			try {
+				uri = URIUtil.fromString(fileURI);
+			}
+			catch (URISyntaxException e) {
+				Logger.logException(e.getLocalizedMessage(), e);
+			}
+			if (uri != null) {
+				long time = _trace ? System.currentTimeMillis(): 0;
+				final Map locations = providers[i].getExternalSchemaLocation(uri);
+				if (_trace) {
+					  long diff = System.currentTimeMillis() - time;
+					  if (diff > 250)
+						  Logger.log(Logger.INFO, "Schema location provider took [" + diff + "ms] for URI [" + fileURI + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				  }
+				if (locations != null && !locations.isEmpty()) {
+					Object path = locations.get(IExternalSchemaLocationProvider.SCHEMA_LOCATION);
+					if (path instanceof String) {
+						if (schemaLocation.length() > 0) {
+							schemaLocation.append(' ');
+						}
+						schemaLocation.append(path);
+					}
+					path = locations.get(IExternalSchemaLocationProvider.NO_NAMESPACE_SCHEMA_LOCATION);
+					if (path instanceof String) {
+						noNamespaceSchemaLocation = (String)path;
+					}
+				}
+			}
+		}
+
+		if (schemaLocation.length() > 0) {
+			reader.setProperty(IExternalSchemaLocationProvider.SCHEMA_LOCATION, schemaLocation.toString());
+			isGrammarEncountered = true;
+		}
+		if (noNamespaceSchemaLocation != null) {
+			reader.setProperty(IExternalSchemaLocationProvider.NO_NAMESPACE_SCHEMA_LOCATION, noNamespaceSchemaLocation);
+			isGrammarEncountered = true;
+		}
+		return isGrammarEncountered;
+	}
+ 
+  private Object[] getMsgArguments(LocalizedMessage msg){
+	  Object obj = msg.getAttribute(ANNOTATIONMSG);
+	  return new Object[]{obj};
+  }
+ 
+
+	private IReporter executeMarkupValidator(String uri){
+		Path path = new Path(uri);
+		String fileProtocol = "file://"; //$NON-NLS-1$
+		int index = uri.indexOf(fileProtocol);
+		
+		IFile resource = null;
+		if (index == 0){
+			String transformedUri = uri.substring(fileProtocol.length());
+			Path transformedPath = new Path(transformedUri);
+			resource = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(transformedPath);
+		}
+		else {
+			resource = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+			
+		}
+		IReporter reporter = null;
+		if (resource != null){
+		    reporter = val.validate(resource, 0, new ValOperation().getState()) ;
+		}
+		return reporter;
+	}
+  
   /**
    * Add a validation message to the specified list.
    * 
@@ -419,15 +566,18 @@
   {
     private URIResolver uriResolver;
     private String resolvedDTDLocation;
+    private NestedValidatorContext context;
    
     /**
      * Constructor.
      * 
      * @param uriResolver The URI resolver to use with this entity resolver.
+     * @param context The XML validator context.
      */
-    public MyEntityResolver(URIResolver uriResolver)
+    public MyEntityResolver(URIResolver uriResolver, NestedValidatorContext context)
     {
       this.uriResolver = uriResolver;
+      this.context = context;
     }
     
     /* (non-Javadoc)
@@ -435,20 +585,12 @@
      */
     public XMLInputSource resolveEntity(XMLResourceIdentifier rid) throws XNIException, IOException
     {
-      try
-      {
-        XMLInputSource inputSource = _internalResolveEntity(uriResolver, rid);
+        XMLInputSource inputSource = _internalResolveEntity(uriResolver, rid, context);
         if (inputSource != null)
         {
           resolvedDTDLocation = inputSource.getSystemId();
         }
         return inputSource;
-      }
-      catch(IOException e)
-      {
-        //e.printStackTrace();   
-      }      
-      return null;
     }
    
     public String getLocation()
@@ -462,6 +604,11 @@
   // identical code.  In any case we should strive to ensure that the validators perform resolution consistently. 
   public static XMLInputSource _internalResolveEntity(URIResolver uriResolver, XMLResourceIdentifier rid) throws  IOException
   {
+    return _internalResolveEntity(uriResolver, rid, null);
+  }
+  
+  public static XMLInputSource _internalResolveEntity(URIResolver uriResolver, XMLResourceIdentifier rid, NestedValidatorContext context) throws  IOException
+  {
     XMLInputSource is = null;
     
     if (uriResolver != null)
@@ -481,6 +628,18 @@
       if (location != null)
       {                     
         String physical = uriResolver.resolvePhysicalLocation(rid.getBaseSystemId(), id, location);
+
+        // if physical is already a known bad uri, just go ahead and throw an exception
+        if (context instanceof XMLNestedValidatorContext)
+        {
+          XMLNestedValidatorContext xmlContext = ((XMLNestedValidatorContext)context);
+
+          if (xmlContext.isURIMarkedInaccessible(physical))
+          {
+        	 throw new FileNotFoundException(physical);
+          }
+        }
+        
         is = new XMLInputSource(rid.getPublicId(), location, location);
         
         // This block checks that the file exists. If it doesn't we need to throw
@@ -492,6 +651,16 @@
         {
           isTemp = new URL(physical).openStream();
         }
+        catch (IOException e)
+        {
+          // physical was a bad url, so cache it so we know next time
+          if (context instanceof XMLNestedValidatorContext)
+          {
+            XMLNestedValidatorContext xmlContext = ((XMLNestedValidatorContext)context);
+            xmlContext.markURIInaccessible(physical);
+          }
+          throw e;
+        }
         finally
         {
           if(isTemp != null)
@@ -540,9 +709,9 @@
     	int columnNumber = exception.getColumnNumber();
     	
     	// For the following three errors the line number will be modified to use that of the start
-    	// tag instead of the end tag.
+    	// tag instead of the end tag. Unless its a self ending tag and in that case the startElementLocations will be empty
     	String currentErrorKey = valinfo.currentErrorKey;
-    	if (currentErrorKey != null && adjustLocationErrorKeySet.contains(currentErrorKey))  
+    	if (currentErrorKey != null && adjustLocationErrorKeySet.contains(currentErrorKey) && valinfo.getStartElementLocations().size() > 0)  
     	{
     	  LocationCoordinate adjustedCoordinates = (LocationCoordinate)valinfo.getStartElementLocations().peek();
     	  lineNumber = adjustedCoordinates.getLineNumber();
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
index 9a48579..4183f42 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
+ * Copyright (c) 2006, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -34,6 +34,7 @@
 import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
 import org.eclipse.wst.validation.internal.provisional.core.IValidator;
 import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
+import org.eclipse.wst.xml.core.internal.validation.AnnotationMsg;
 
 /**
  * An abstract validator that assists validators in running and contributing
@@ -64,12 +65,25 @@
   public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor){
 	  ValidationResult result = new ValidationResult();  
 	  IReporter reporter = result.getReporter(monitor);
-	  NestedValidatorContext nestedcontext = new NestedValidatorContext();
-		setupValidation(nestedcontext);
 		IFile file = null;
 		if (resource instanceof IFile)file = (IFile)resource;
-		if (file != null)validate(file, null, result, reporter, nestedcontext);
-		teardownValidation(nestedcontext);
+		if (file != null)
+		{
+		  NestedValidatorContext nestedcontext = getNestedContext(state, false);
+	      boolean teardownRequired = false;
+	      if (nestedcontext == null)
+	      {
+	        // validationstart was not called, so manually setup and tear down
+	        nestedcontext = getNestedContext(state, true);
+	        setupValidation(nestedcontext);
+	        teardownRequired = true;
+	      }
+
+		  validate(file, null, result, reporter, nestedcontext);
+
+	      if (teardownRequired)
+	        teardownValidation(nestedcontext);
+		}
 	    return result;
   }
  
@@ -97,9 +111,9 @@
 	      { 
 	    	// The helper may not have a file stored in it but may have an InputStream if being
 	    	// called from a source other than the validation framework such as an editor.
-	        if (context.loadModel(GET_INPUTSTREAM) instanceof InputStream) //$NON-NLS-1$
+	        if (context.loadModel(GET_INPUTSTREAM) instanceof InputStream)
 	        {
-	          validate(file, (InputStream)context.loadModel(GET_INPUTSTREAM), null, reporter, nestedcontext); //do we need the fileName?  what is int ruleGroup? //$NON-NLS-1$
+	          validate(file, (InputStream)context.loadModel(GET_INPUTSTREAM), null, reporter, nestedcontext); //do we need the fileName?  what is int ruleGroup?
 	        }
 	        else
 	        {
@@ -115,14 +129,17 @@
     {
       Object []parms = {getValidatorID()};
       Collection files = (Collection) context.loadModel(GET_PROJECT_FILES, parms);
-      Iterator iter = files.iterator();
-      while (iter.hasNext() && !reporter.isCancelled()) 
-      {
-        IFile file = (IFile) iter.next();
-        if(shouldValidate(file))
-        {
-	      validate(file, null, null, reporter, nestedcontext);
-        }
+      // files can be null if they're outside of the workspace
+      if (files != null) {
+	      Iterator iter = files.iterator();
+	      while (iter.hasNext() && !reporter.isCancelled()) 
+	      {
+	        IFile file = (IFile) iter.next();
+	        if(shouldValidate(file))
+	        {
+		      validate(file, null, null, reporter, nestedcontext);
+	        }
+	      }
       }
     }
 	
@@ -400,7 +417,28 @@
       
       message.setLineNo(validationMessage.getLineNumber());
       addInfoToMessage(validationMessage, message);
-      
+      Object[] objlist = validationMessage.getMessageArguments();
+      if (objlist != null && objlist.length ==1 ){
+    	  Object obj = objlist[0];
+    	  if (obj instanceof AnnotationMsg){
+	    	 message.setAttribute(AnnotationMsg.PROBMLEM_ID, new Integer(((AnnotationMsg)obj).getProblemId()));
+	    	 message.setAttribute(AnnotationMsg.LENGTH, new Integer(((AnnotationMsg)obj).getLength()));
+	    	  Object obj1 = ((AnnotationMsg)obj).getAttributeValueText();
+	    	  if (obj1 instanceof String){
+	    		  message.setAttribute(AnnotationMsg.ATTRVALUETEXT, obj1);
+	    	  }
+	    	  else if ( obj1 instanceof Object[]){
+	    		  Object[] objArray = (Object[])obj1;
+	    		  message.setAttribute(AnnotationMsg.ATTRVALUENO, new Integer(objArray.length));
+	    		  for (int j=0; j <objArray.length;j++){
+	    			  Object obj2 = objArray[j];
+	    			  String attrName = AnnotationMsg.ATTRNO + j;
+	    			  message.setAttribute(attrName, obj2);
+	    		  }
+	    		  
+	    	  }
+    	  }
+      }
       List nestederrors = validationMessage.getNestedMessages();
       if (nestederrors != null && !nestederrors.isEmpty())
       {
@@ -421,9 +459,28 @@
    */
   protected void addInfoToMessage (ValidationMessage validationmessage, IMessage message)
   { 
-	// This method may be overidden by subclasses
+	// This method may be overridden by subclasses
   }
-	  
+
+  /**
+   * Get the nested validation context.
+   * 
+   * @param state
+   *          the validation state.
+   * @param create
+   *          when true, a new context will be created if one is not found
+   * @return the nested validation context.
+   */
+  protected NestedValidatorContext getNestedContext(ValidationState state, boolean create)
+  {
+    NestedValidatorContext context = null;
+    if (create)
+    {
+      context = new NestedValidatorContext();
+    }
+    return context;
+  }
+
   /**
    * A localized message is a specialized type of IMessage that allows setting
    * and using a localized message string for a message.
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/LazyURLInputStream.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/LazyURLInputStream.java
index 834cb0b..2498b50 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/LazyURLInputStream.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/LazyURLInputStream.java
@@ -22,7 +22,7 @@
  */
 public class LazyURLInputStream extends InputStream
 {  
-  private static int debugTotalOpenStreamCount = 0; 
+  static int debugTotalOpenStreamCount = 0; 
   protected InputStream inner;
   protected String url;
   protected boolean error;
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationInfo.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationInfo.java
index fa2e1a5..f8f5e07 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationInfo.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationInfo.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     David Carver (STAR) - bug 297005 - Some static constants not made final.
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.validation.core;
 
@@ -27,8 +28,8 @@
 public class ValidationInfo implements ValidationReport
 {
   private boolean WRAPPER_ERROR_SUPPORT_ENABLED = true;
-  public static int SEV_ERROR = 0;
-  public static int SEV_WARNING = 1;
+  public static final int  SEV_ERROR = 0;
+  public static final int SEV_WARNING = 1;
   
   private String validating_file_uri = null;
   private URL validating_file_url = null;
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationMessage.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationMessage.java
index 5e1dcf7..e2662c0 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationMessage.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/ValidationMessage.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     David Carver (STAR) - bug 297005 - Some static constants not made final.
  *******************************************************************************/
 
 package org.eclipse.wst.xml.core.internal.validation.core;
@@ -34,9 +35,9 @@
   protected Object[] messageArguments;
   protected int startOffset;
   protected int severity = IMessage.NORMAL_SEVERITY;
-  public static int SEV_HIGH = IMessage.HIGH_SEVERITY;
-  public static int SEV_NORMAL = IMessage.NORMAL_SEVERITY;
-  public static int SEV_LOW = IMessage.LOW_SEVERITY;
+  public static final int SEV_HIGH = IMessage.HIGH_SEVERITY;
+  public static final int SEV_NORMAL = IMessage.NORMAL_SEVERITY;
+  public static final int SEV_LOW = IMessage.LOW_SEVERITY;
 
   /**
    * Constructor.
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/Validator.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/Validator.java
index 79acb37..4aae874 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/Validator.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/Validator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,10 +13,15 @@
 
 import java.io.InputStream;
 
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Preferences;
 import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.ValidationState;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
 import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.core.internal.validation.XMLNestedValidatorContext;
 import org.eclipse.wst.xml.core.internal.validation.XMLValidationConfiguration;
 import org.eclipse.wst.xml.core.internal.validation.XMLValidationReport;
 import org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator;
@@ -26,6 +31,7 @@
 
 public class Validator extends AbstractNestedValidator
 {
+  private static final String XML_VALIDATOR_CONTEXT = "org.eclipse.wst.xml.core.validatorContext"; //$NON-NLS-1$
   protected int indicateNoGrammar = 0;
   
   /**
@@ -54,22 +60,17 @@
     XMLValidationConfiguration configuration = new XMLValidationConfiguration();
     try
     {
+      Preferences pluginPreferences = XMLCorePlugin.getDefault().getPluginPreferences();
       configuration.setFeature(XMLValidationConfiguration.INDICATE_NO_GRAMMAR, indicateNoGrammar);
+      configuration.setFeature(XMLValidationConfiguration.USE_XINCLUDE, pluginPreferences.getBoolean(XMLCorePreferenceNames.USE_XINCLUDE));
+      configuration.setFeature(XMLValidationConfiguration.HONOUR_ALL_SCHEMA_LOCATIONS, pluginPreferences.getBoolean(XMLCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS));
     }
     catch(Exception e)
     {
       // TODO: Unable to set the preference. Log this problem.
     }
     
-    XMLValidationReport valreport = null;
-    if (inputstream != null)
-    {
-      valreport = validator.validate(uri, inputstream, configuration, result);
-    }
-    else
-    {
-      valreport = validator.validate(uri, null, configuration, result);
-    }
+    XMLValidationReport valreport = validator.validate(uri, inputstream, configuration, result, context);
               
     return valreport;
   }
@@ -96,4 +97,55 @@
       message.setAttribute(SQUIGGLE_NAME_OR_VALUE_ATTRIBUTE, messageInfo[1]);
 	}
   }
+  
+  /**
+   * Get the nested validation context.
+   * 
+   * @param state
+   *          the validation state.
+   * @param create
+   *          when true, a new context will be created if one is not found
+   * @return the nested validation context.
+   */
+  protected NestedValidatorContext getNestedContext(ValidationState state, boolean create)
+  {
+    NestedValidatorContext context = null;
+    Object o = state.get(XML_VALIDATOR_CONTEXT);
+    if (o instanceof XMLNestedValidatorContext)
+      context = (XMLNestedValidatorContext)o;
+    else if (create)
+    {
+      context = new XMLNestedValidatorContext();
+    }
+    return context;
+  }
+  
+  public void validationStarting(IProject project, ValidationState state, IProgressMonitor monitor)
+  {
+    if (project != null)
+    {
+      NestedValidatorContext context = getNestedContext(state, false);
+      if (context == null)
+      {
+        context = getNestedContext(state, true);
+        setupValidation(context);
+        state.put(XML_VALIDATOR_CONTEXT, context);
+      }
+      super.validationStarting(project, state, monitor);
+    }
+  }
+  
+  public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor)
+  {
+    if (project != null)
+    {
+      super.validationFinishing(project, state, monitor);
+      NestedValidatorContext context = getNestedContext(state, false);
+      if (context != null)
+      {
+        teardownValidation(context);
+        state.put(XML_VALIDATOR_CONTEXT, null);
+      }
+    }
+  }
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/XMLMessageInfoHelper.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/XMLMessageInfoHelper.java
index 4582514..42e7526 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/XMLMessageInfoHelper.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/eclipse/XMLMessageInfoHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -49,7 +49,7 @@
     if(errorKey != null)
     {
       if (errorKey.equals("cvc-complex-type.2.4.a") || errorKey.equals("cvc-complex-type.2.4.d") || errorKey.equals("cvc-complex-type.2.4.b") || errorKey.equals("MSG_CONTENT_INVALID") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-        | errorKey.equals("MSG_CONTENT_INCOMPLETE") || errorKey.equals("MSG_REQUIRED_ATTRIBUTE_NOT_SPECIFIED") || errorKey.equals("cvc-complex-type.4")) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        | errorKey.equals("MSG_CONTENT_INCOMPLETE") || errorKey.equals("MSG_REQUIRED_ATTRIBUTE_NOT_SPECIFIED") || errorKey.equals("cvc-complex-type.4") || errorKey.equals("ElementPrefixUnbound")   ) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
       {
         selectionStrategy = "START_TAG"; //$NON-NLS-1$
       }
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/xmlvalidation.properties b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/xmlvalidation.properties
index 91fc0ce..161065a 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/xmlvalidation.properties
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/xmlvalidation.properties
@@ -18,14 +18,14 @@
 ! Usage:
 !   {0} replaced with the file name
 !
-_UI_PROBLEMS_VALIDATING_FILE_NOT_FOUND           = The file cannot be validated as the XML Schema "{0}" that is specified as describing the syntax of the file cannot be located.
+_UI_PROBLEMS_VALIDATING_FILE_NOT_FOUND           = The file cannot be validated as the XML definition "{0}" that is specified as describing the syntax of the file cannot be located.
 
 _UI_PROBLEMS_CONNECTION_REFUSED                  = The file cannot be validated as there was a connection problem.
 
 !
 ! Referenced File Dialog Related Message
 !
-_UI_REF_FILE_ERROR_MESSAGE                       = Referenced file contains errors ({0}).  For more information, right click on the message and select "Show Details..."
+_UI_REF_FILE_ERROR_MESSAGE                       = Referenced file contains errors ({0}).  For more information, right click on the message in the Problems View and select "Show Details..."
 
 # Warning when no grammar is located.
 _WARN_NO_GRAMMAR                                 = No grammar constraints (DTD or XML schema) detected for the document.
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCoreMessages.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCoreMessages.java
index 7d05ad0..831c0a2 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCoreMessages.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCoreMessages.java
@@ -1,11 +1,12 @@
 /**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
+ * Copyright (c) 2005, 2010 IBM Corporation and others. All rights reserved.   This
  * program and the accompanying materials are made available under the terms of
  * the Eclipse Public License v1.0 which accompanies this distribution, and is
  * available at http://www.eclipse.org/legal/epl-v10.html
  * 
  * Contributors: 
  * IBM - Initial API and implementation
+ * Jesper Steen Moeller - Added XML Catalogs 1.1 support
  **********************************************************************/
 package org.eclipse.wst.xml.core.internal;
 
@@ -26,10 +27,30 @@
 	public static String loading;
 	public static String Catalog_entry_key_not_set;
 	public static String Catalog_entry_uri_not_set;
+	public static String Catalog_rewrite_startString_not_set;
+	public static String Catalog_rewrite_prefix_not_set;
+	public static String Catalog_suffix_string_not_set;
+	public static String Catalog_suffix_uri_not_set;
+	public static String Catalog_delegate_prefix_not_set;
+	public static String Catalog_delegate_catalog_not_set;
 	public static String Catalog_next_catalog_location_uri_not_set;
 	public static String Catalog_resolution_null_catalog;
 	public static String Catalog_resolution_malformed_url;
 	public static String Catalog_resolution_io_exception;
+	public static String CMDocument_load_exception;
+	public static String End_tag_has_attributes;
+	public static String Attribute__is_missing_a_value;
+	public static String Attribute__has_no_value;
+	public static String Missing_end_tag_;
+	public static String Missing_start_tag_;
+	public static String ReconcileStepForMarkup_0;
+	public static String ReconcileStepForMarkup_1;
+	public static String ReconcileStepForMarkup_2;
+	public static String ReconcileStepForMarkup_3;
+	public static String ReconcileStepForMarkup_4;
+	public static String ReconcileStepForMarkup_5;
+	public static String ReconcileStepForMarkup_6;
+	public static String Indicate_no_grammar_specified_severities_error;
 
 	static {
 		// load message values from bundle file
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCorePluginResources.properties b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCorePluginResources.properties
index ca630a2..d9f1fb7 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCorePluginResources.properties
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/XMLCorePluginResources.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2001, 2005 IBM Corporation and others.
+# Copyright (c) 2001, 2010 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 #     Jens Lukowski/Innoopract - initial renaming/restructuring
+#     Jesper Steen Moeller - Added XML Catalogs 1.1 support
 #     
 ###############################################################################
 Invalid_character_lt_fo_ERROR_=Invalid character ('<') found
@@ -19,8 +20,28 @@
 loading=loading 
 # catalog strings
 Catalog_entry_key_not_set=Catalog entry key is not set
-Catalog_entry_uri_not_set=Catalog entry uri is not set
-Catalog_next_catalog_location_uri_not_set=Next catalog location uri is not set
+Catalog_entry_uri_not_set=Catalog entry URI is not set
+Catalog_rewrite_startString_not_set=Catalog rewrite start string is not set
+Catalog_rewrite_prefix_not_set=Catalog rewrite prefix is not set
+Catalog_suffix_string_not_set=Catalog suffix string is not set
+Catalog_suffix_uri_not_set=Catalog suffix URI is not set
+Catalog_delegate_prefix_not_set=Catalog delegate prefix is not set
+Catalog_delegate_catalog_not_set=Catalog delegate URI is not set
+Catalog_next_catalog_location_uri_not_set=Next catalog location URI is not set
 Catalog_resolution_null_catalog=Catalog resolution attempted with null catalog; ignored
 Catalog_resolution_malformed_url=Malformed URL exception trying to resolve
 Catalog_resolution_io_exception=I/O exception trying to resolve
+CMDocument_load_exception=An error occurred while loading document {0} with publicId {1}
+End_tag_has_attributes=End tag has attributes
+Attribute__is_missing_a_value=Attribute \"{0}\" is missing a value
+Attribute__has_no_value=Attribute \"{0}\"  has no value
+Missing_start_tag_=Missing start tag \"{0}\"
+Missing_end_tag_=Missing end tag \"{0}\"
+ReconcileStepForMarkup_0=Missing closing quote
+ReconcileStepForMarkup_1=Missing quotes for attribute value
+ReconcileStepForMarkup_2=A tagname cannot start with a space
+ReconcileStepForMarkup_3=Empty tags are not allowed
+ReconcileStepForMarkup_4=Namespaces are not allowed in a Processing Instruction target
+ReconcileStepForMarkup_5=Spaces are not allowed before a Processing Instruction
+ReconcileStepForMarkup_6=Tag missing closing bracket '>'
+Indicate_no_grammar_specified_severities_error=ErrorCMDocument_load_exception=An error occurred while loading document {0} with publicId {1}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/CleanupProcessorXML.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/CleanupProcessorXML.java
index e62e98b..05a4af4 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/CleanupProcessorXML.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/CleanupProcessorXML.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,16 +17,56 @@
 import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler;
 import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences;
 import org.eclipse.wst.sse.core.internal.cleanup.StructuredCleanupPreferences;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
 import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.document.DOMModelImpl;
+import org.eclipse.wst.xml.core.internal.document.TextImpl;
 import org.eclipse.wst.xml.core.internal.formatter.XMLFormatterFormatProcessor;
 import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
 import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
 import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
 
 
 public class CleanupProcessorXML extends AbstractStructuredCleanupProcessor {
 	protected IStructuredCleanupPreferences fCleanupPreferences = null;
+	
+	public void cleanupModel(IStructuredModel structuredModel) {
+		Preferences preferences = getModelPreferences();
+		if (preferences != null && preferences.getBoolean(XMLCorePreferenceNames.FIX_XML_DECLARATION)) {
+			IDOMDocument document = ((DOMModelImpl) structuredModel).getDocument();
+			if (!fixExistingXmlDecl(document)) {
+				String encoding = preferences.getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
+				Node xml = document.createProcessingInstruction("xml", "version=\"1.0\" " + "encoding=\"" + encoding +"\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+				document.insertBefore(xml, document.getFirstChild());
+			}
+		}
+		super.cleanupModel(structuredModel);
+	}
+
+	/**
+	 * Is the node an XML declaration
+	 * @param node
+	 * @return true if the node is an XML declaration; otherwise, false.
+	 */
+	private boolean isXMLDecl(IDOMNode node) {
+		return node != null && node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE && "xml".equalsIgnoreCase(((ProcessingInstruction) node).getTarget()); //$NON-NLS-1$
+	}
+
+	private boolean fixExistingXmlDecl(IDOMDocument document) {
+		IDOMNode node = (IDOMNode) document.getFirstChild();
+		while (node != null && node.getNodeType() == Node.TEXT_NODE && ((TextImpl) node).isWhitespace())
+			node = (IDOMNode) node.getNextSibling();
+		if (isXMLDecl(node)) {
+			document.insertBefore(node, document.getFirstChild());
+			return true;
+		}
+		return false;
+	}
 
 	protected IStructuredCleanupHandler getCleanupHandler(Node node) {
 		short nodeType = node.getNodeType();
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/ElementNodeCleanupHandler.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/ElementNodeCleanupHandler.java
index fcf9a21..10baa53 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/ElementNodeCleanupHandler.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/cleanup/ElementNodeCleanupHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (Intalion) - Cleanup Repeated Conditional check in isXMLType method
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.cleanup;
 
@@ -469,7 +469,7 @@
 	private boolean isXMLType(IDOMModel structuredModel) {
 		boolean result = false;
 
-		if (structuredModel != null && structuredModel != null) {
+		if (structuredModel != null) {
 			IDOMDocument document = structuredModel.getDocument();
 
 			if (document != null)
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementConfiguration.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementConfiguration.java
index 73133b2..ef49f57 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementConfiguration.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,10 +14,13 @@
 
 
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
 import org.eclipse.wst.xml.core.internal.Logger;
 import org.eclipse.wst.xml.core.internal.commentelement.CommentElementAdapter;
 import org.eclipse.wst.xml.core.internal.commentelement.CommentElementHandler;
@@ -40,28 +43,24 @@
 	private String[] fPrefix = null;
 	private boolean fXMLComment;
 
-	CommentElementConfiguration() {
-		super();
-	}
-
 	CommentElementConfiguration(IConfigurationElement element) {
 		super();
 		fElement = element;
-		fCustom = (element.getName().equalsIgnoreCase("handler-custom")) ? true : false; //$NON-NLS-1$
+		fCustom = element.getName().equalsIgnoreCase("handler-custom"); //$NON-NLS-1$
 
 		fillAttributes(element);
 
 		fXMLComment = fJSPComment = false;
 		String commentType = getProperty("commenttype"); //$NON-NLS-1$
-		if (commentType.equalsIgnoreCase("xml")) { //$NON-NLS-1$
+		if ("xml".equalsIgnoreCase(commentType)) { //$NON-NLS-1$
 			fXMLComment = true;
-		} else if (commentType.equalsIgnoreCase("jsp")) { //$NON-NLS-1$
+		} else if ("jsp".equalsIgnoreCase(commentType)) { //$NON-NLS-1$
 			fJSPComment = true;
-		} else if (commentType.equalsIgnoreCase("both")) { //$NON-NLS-1$
+		} else if ("both".equalsIgnoreCase(commentType)) { //$NON-NLS-1$
 			fXMLComment = fJSPComment = true;
 		}
 		String empty = getProperty("isempty"); //$NON-NLS-1$
-		fEmpty = (empty != null && !empty.equals("false")) ? true : false; //$NON-NLS-1$
+		fEmpty = Boolean.valueOf(empty).booleanValue(); //$NON-NLS-1$
 	}
 
 	public boolean acceptJSPComment() {
@@ -108,7 +107,9 @@
 						fHandler = (CommentElementHandler) fElement.createExecutableExtension("class"); //$NON-NLS-1$
 					} else {
 						String elementName = getProperty("elementname"); //$NON-NLS-1$
-						fHandler = new BasicCommentElementHandler(elementName, fEmpty);
+						if (elementName != null) {
+							fHandler = new BasicCommentElementHandler(elementName, fEmpty);
+						}
 					}
 					//					((AbstractCommentElementHandler)fHandler).setElementPrefix(fElement.getAttribute("prefix"));
 				} catch (Exception e) {
@@ -175,9 +176,23 @@
 				if (isCustom()) { // custom
 					IConfigurationElement[] prefixes = fElement.getChildren("startwith"); //$NON-NLS-1$	
 					if (prefixes != null) {
-						fPrefix = new String[prefixes.length];
+						List prefixValues = new ArrayList(prefixes.length);
 						for (int i = 0; i < prefixes.length; i++) {
-							fPrefix[i] = prefixes[i].getAttribute("prefix"); //$NON-NLS-1$	
+							String prefix = prefixes[i].getAttribute("prefix"); //$NON-NLS-1$
+							if (prefix != null) {
+								prefixValues.add(prefix);
+							}
+							else {
+								try {
+									Logger.log(Logger.WARNING, "misconfigured comment element in" + fElement.getContributor().getName(), new IllegalArgumentException("startwith")); //$NON-NLS-1$ //$NON-NLS-2$
+								}
+								catch (InvalidRegistryObjectException e) {
+									// stale bundle?
+								}
+							}
+						}
+						if (!prefixValues.isEmpty()) {
+							fPrefix = (String[]) prefixValues.toArray(new String[prefixValues.size()]);
 						}
 					}
 				} else { // basic
@@ -196,8 +211,7 @@
 			}
 		}
 		if (fPrefix == null) {
-			fPrefix = new String[1];
-			fPrefix[0] = ""; //$NON-NLS-1$
+			fPrefix = new String[0];
 		}
 		return fPrefix;
 	}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementRegistry.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementRegistry.java
index efd1f67..3516c9b 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementRegistry.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/commentelement/impl/CommentElementRegistry.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -47,7 +47,7 @@
 		super();
 	}
 
-	public CommentElementConfiguration[] getConfigurations() {
+	public synchronized CommentElementConfiguration[] getConfigurations() {
 		if (fConfigurations == null) {
 			IExtensionRegistry registry = Platform.getExtensionRegistry();
 			IExtensionPoint point = registry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/IntStack.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/IntStack.java
index 1d1052d..52dbae6 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/IntStack.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/IntStack.java
@@ -94,6 +94,21 @@
 	}
 
 	public int size() {
-		return list.length;
+		return size;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		StringBuffer s = new StringBuffer(getClass().getName() + ":" +size + " [");
+		for (int i = 0; i < size; i++) {
+			s.append(list[i]);
+			if(i < size - 1) {
+				s.append(", ");
+			}
+		}
+		s.append("]");
+		return s.toString();
 	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java
index 40d0fde..4bc3552 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 297006 - String Comparison
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contenttype;
 
@@ -32,13 +32,13 @@
 
 	private boolean canHandleAsUnicodeStream(String tokenType) {
 		boolean canHandleAsUnicodeStream = false;
-		if (tokenType == EncodingParserConstants.UTF83ByteBOM) {
+		if (EncodingParserConstants.UTF83ByteBOM.equals(tokenType)) {
 			canHandleAsUnicodeStream = true;
 			//fUnicode = "UTF-8"; //$NON-NLS-1$
-		} else if (tokenType == EncodingParserConstants.UTF16BE) {
+		} else if (EncodingParserConstants.UTF16BE.equals(tokenType)) {
 			canHandleAsUnicodeStream = true;
 			//fUnicode = "UTF-16BE"; //$NON-NLS-1$
-		} else if (tokenType == EncodingParserConstants.UTF16LE) {
+		} else if (EncodingParserConstants.UTF16LE.equals(tokenType)) {
 			canHandleAsUnicodeStream = true;
 			//fUnicode = "UTF-16"; //$NON-NLS-1$
 		}
@@ -95,7 +95,7 @@
 				//fReader = new InputStreamReader(fReader, fUnicode);
 				// parseInput();
 			} else {
-				if (tokenType == XMLHeadTokenizerConstants.XMLDelEncoding) {
+				if (XMLHeadTokenizerConstants.XMLDelEncoding.equals(tokenType)) {
 					fIsXML = true;
 				}
 			}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLResourceEncodingDetector.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLResourceEncodingDetector.java
index b1690f3..1f1079b 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLResourceEncodingDetector.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLResourceEncodingDetector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 297006 - String Comparison
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.contenttype;
 
@@ -26,16 +26,16 @@
 
 	private boolean canHandleAsUnicodeStream(String tokenType) {
 		boolean canHandleAsUnicodeStream = false;
-		if (tokenType == EncodingParserConstants.UTF83ByteBOM) {
+		if (EncodingParserConstants.UTF83ByteBOM.equals(tokenType)) {
 			canHandleAsUnicodeStream = true;
 			String enc = "UTF-8"; //$NON-NLS-1$
 			createEncodingMemento(enc, EncodingMemento.DETECTED_STANDARD_UNICODE_BYTES);
 			fEncodingMemento.setUTF83ByteBOMUsed(true);
 		}
-		else if (tokenType == EncodingParserConstants.UTF16BE || tokenType == EncodingParserConstants.UTF16LE) {
+		else if (EncodingParserConstants.UTF16BE.equals(tokenType) || EncodingParserConstants.UTF16LE.equals(tokenType)) {
 			canHandleAsUnicodeStream = true;
 			String enc = "UTF-16"; //$NON-NLS-1$
-			byte[] bom = (tokenType == EncodingParserConstants.UTF16BE) ? IContentDescription.BOM_UTF_16BE : IContentDescription.BOM_UTF_16LE;
+			byte[] bom = (EncodingParserConstants.UTF16BE.equals(tokenType)) ? IContentDescription.BOM_UTF_16BE : IContentDescription.BOM_UTF_16LE;
 			createEncodingMemento(enc, EncodingMemento.DETECTED_STANDARD_UNICODE_BYTES);
 			fEncodingMemento.setUnicodeStream(true);
 			fEncodingMemento.setUnicodeBOM(bom);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/AttrImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/AttrImpl.java
index cf2e968..7c0af33 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/AttrImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/AttrImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,8 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
+ *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -26,9 +28,7 @@
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
 import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
 import org.eclipse.wst.xml.core.internal.provisional.IXMLCharEntity;
@@ -46,14 +46,15 @@
  * AttrImpl class
  */
 public class AttrImpl extends NodeImpl implements IDOMAttr {
+
 	private ITextRegion equalRegion = null;
 
-	private String name = null;
+	private char[] fName = null;
 	private ITextRegion nameRegion = null;
-	private String namespaceURI = null;
 	private ElementImpl ownerElement = null;
-	private ITextRegion valueRegion = null;
-	private String valueSource = null;
+	private ITextRegion fValueRegion = null;
+	private char[] fValueSource = null;
+	private char[] fNamespaceURI = null;
 
 	/**
 	 * AttrImpl constructor
@@ -72,8 +73,10 @@
 		super(that);
 
 		if (that != null) {
-			this.name = that.name;
-			this.valueSource = that.getValueSource();
+			this.fName = that.fName;
+			String valueSource = that.getValueSource();
+			if (valueSource != null)
+				this.fValueSource = valueSource.toCharArray();
 		}
 	}
 
@@ -97,21 +100,16 @@
 		CMElementDeclaration elementDecl = element.getDeclaration();
 		if (elementDecl == null)
 			return null;
-		CMNamedNodeMap attributes = elementDecl.getAttributes();
-		CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributes);
+
 		List nodes = ModelQueryUtil.getModelQuery(getOwnerDocument()).getAvailableContent(getOwnerElement(), elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+		String name = getName();
 		for (int k = 0; k < nodes.size(); k++) {
 			CMNode cmnode = (CMNode) nodes.get(k);
-			if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
-				allAttributes.put(cmnode);
+			if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION && name.equals(cmnode.getNodeName())) {
+				return (CMAttributeDeclaration) cmnode;
 			}
 		}
-		attributes = allAttributes;
-		
-
-		if (attributes == null)
-			return null;
-		return (CMAttributeDeclaration) attributes.getNamedItem(getName());
+		return null;
 	}
 
 	/**
@@ -123,8 +121,8 @@
 		if (this.ownerElement == null)
 			return 0;
 		int offset = this.ownerElement.getStartOffset();
-		if (this.valueRegion != null) {
-			return (offset + this.valueRegion.getEnd());
+		if (this.fValueRegion != null) {
+			return (offset + this.fValueRegion.getEnd());
 		}
 		if (this.equalRegion != null) {
 			return (offset + this.equalRegion.getEnd());
@@ -140,15 +138,13 @@
 		return this.equalRegion;
 	}
 
-	/**
-	 */
 	public String getLocalName() {
-		if (this.name == null)
+		if (this.fName == null)
 			return null;
-		int index = this.name.indexOf(':');
+		int index = CharOperation.indexOf(this.fName, ':');
 		if (index < 0)
-			return this.name;
-		return this.name.substring(index + 1);
+			return new String(this.fName);
+		return new String(this.fName, index + 1, this.fName.length - index - 1);
 	}
 
 	/**
@@ -157,9 +153,9 @@
 	 * @return java.lang.String
 	 */
 	public String getName() {
-		if (this.name == null)
-			return new String();
-		return this.name;
+		if (this.fName == null)
+			return NodeImpl.EMPTY_STRING;
+		return new String(this.fName);
 	}
 
 
@@ -211,8 +207,6 @@
 		return flatNode.getTextEndOffset(this.nameRegion);
 	}
 
-	/**
-	 */
 	public String getNamespaceURI() {
 		String nsAttrName = null;
 		String prefix = getPrefix();
@@ -221,6 +215,11 @@
 				// fixed URI
 				return IXMLNamespace.XMLNS_URI;
 			}
+			else if (prefix.equals(IXMLNamespace.XML)) {
+				// fixed URI
+				return IXMLNamespace.XML_URI;
+			}
+
 			nsAttrName = IXMLNamespace.XMLNS_PREFIX + prefix;
 		}
 		else {
@@ -232,7 +231,9 @@
 			// does not inherit namespace from owner element
 			// if (this.ownerElement != null) return
 			// this.ownerElement.getNamespaceURI();
-			return this.namespaceURI;
+			if (this.fNamespaceURI == null)
+				return null;
+			return new String(this.fNamespaceURI);
 		}
 
 		for (Node node = this.ownerElement; node != null; node = node.getParentNode()) {
@@ -244,7 +245,9 @@
 				return attr.getValue();
 		}
 
-		return this.namespaceURI;
+		if (this.fNamespaceURI == null)
+			return null;
+		return new String(this.fNamespaceURI);
 	}
 
 	/**
@@ -286,15 +289,15 @@
 	/**
 	 */
 	public String getPrefix() {
-		if (this.name == null)
+		if (this.fName == null)
 			return null;
-		int index = this.name.indexOf(':');
+		int index = CharOperation.indexOf(this.fName, ':');
 		if (index <= 0)
 			return null;
 		// exclude JSP tag in name
-		if (this.name.charAt(0) == '<')
+		if (this.fName[0] == '<')
 			return null;
-		return this.name.substring(0, index);
+		return new String(this.fName, 0, index);
 	}
 
 	/**
@@ -308,7 +311,7 @@
 		// yet in the document, and any returned values, such as 
 		// an empty string or a default value are being supplied
 		// as per spec, not per what's in the users document.
-		return this.valueRegion != null;
+		return this.fValueRegion != null;
 	}
 
 	/**
@@ -326,8 +329,8 @@
 		if (this.equalRegion != null) {
 			return (offset + this.equalRegion.getStart());
 		}
-		if (this.valueRegion != null) {
-			return (offset + this.valueRegion.getStart());
+		if (this.fValueRegion != null) {
+			return (offset + this.fValueRegion.getStart());
 		}
 		return 0;
 	}
@@ -346,7 +349,7 @@
 	 */
 	private String getValue(String source) {
 		if (source == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		if (source.length() == 0)
 			return source;
 		StringBuffer buffer = null;
@@ -378,7 +381,7 @@
 	}
 
 	public ITextRegion getValueRegion() {
-		return this.valueRegion;
+		return this.fValueRegion;
 	}
 
 	/**
@@ -396,10 +399,10 @@
 		if (structuredDocumentRegion == null)
 			return 0;
 		// ensure we never pass null to getStartOffset.
-		if (this.valueRegion == null) {
+		if (this.fValueRegion == null) {
 			return 0;
 		}
-		return structuredDocumentRegion.getStartOffset(this.valueRegion);
+		return structuredDocumentRegion.getStartOffset(this.fValueRegion);
 	}
 
 	public String getValueRegionText() {
@@ -410,16 +413,16 @@
 		IStructuredDocumentRegion flatNode = this.ownerElement.getFirstStructuredDocumentRegion();
 		if (flatNode == null)
 			return null;
-		if (this.valueRegion == null)
+		if (this.fValueRegion == null)
 			return null;
-		return flatNode.getText(this.valueRegion);
+		return flatNode.getText(this.fValueRegion);
 	}
 
 	/**
 	 */
 	public String getValueSource() {
-		if (this.valueSource != null)
-			return this.valueSource;
+		if (this.fValueSource != null)
+			return new String(this.fValueSource);
 		// DW: 4/16/2003 due to change in structuredDocument ... we need a
 		// flatnode to
 		// get at region values. For now I'll assume this is always the first
@@ -432,28 +435,29 @@
 		// doesn't
 		// seem to hurt to simply return null in those cases. I saw this null
 		// case,
-		// when tryint go format an XML file.
+		// when trying go format an XML file.
 		if (this.ownerElement == null)
 			return null;
-		IStructuredDocumentRegion ownerRegion = this.ownerElement.getFirstStructuredDocumentRegion();
+		//attribute values will always be in the start region
+		IStructuredDocumentRegion ownerRegion = this.ownerElement.getStartStructuredDocumentRegion();
 		if (ownerRegion == null)
 			return null;
-		if (this.valueRegion != null)
-			return StructuredDocumentRegionUtil.getAttrValue(ownerRegion, this.valueRegion);
-		return new String();
+		if (this.fValueRegion != null)
+			return StructuredDocumentRegionUtil.getAttrValue(ownerRegion, this.fValueRegion);
+		return NodeImpl.EMPTY_STRING;
 	}
 
 	private String getValueSource(ElementImpl ownerElement) {
-		if (this.valueSource != null)
-			return this.valueSource;
+		if (this.fValueSource != null)
+			return new String(this.fValueSource);
 		// DW: 4/16/2003 due to change in structuredDocument ... we need a
 		// flatnode to
 		// get at region values. For now I'll assume this is always the first
 		// flatnode .. may need to make smarter later (e.g. to search for
 		// the flatnode that this.valueRegion belongs to.
-		if (this.valueRegion != null)
-			return StructuredDocumentRegionUtil.getAttrValue(ownerElement.getStructuredDocumentRegion(), this.valueRegion);
-		return new String();
+		if (this.fValueRegion != null)
+			return StructuredDocumentRegionUtil.getAttrValue(ownerElement.getStructuredDocumentRegion(), this.fValueRegion);
+		return NodeImpl.EMPTY_STRING;
 	}
 
 	/**
@@ -487,11 +491,11 @@
 	 * Check if Attr has JSP in value
 	 */
 	public boolean hasNestedValue() {
-		if (this.valueRegion == null)
+		if (this.fValueRegion == null)
 			return false;
-		if (!(this.valueRegion instanceof ITextRegionContainer))
+		if (!(this.fValueRegion instanceof ITextRegionContainer))
 			return false;
-		ITextRegionList regions = ((ITextRegionContainer) this.valueRegion).getRegions();
+		ITextRegionList regions = ((ITextRegionContainer) this.fValueRegion).getRegions();
 		if (regions == null)
 			return false;
 		Iterator e = regions.iterator();
@@ -510,22 +514,17 @@
 	 * Check if Attr has only name but not equal sign nor value
 	 */
 	public boolean hasNameOnly() {
-		return (this.nameRegion != null && this.equalRegion == null && this.valueRegion == null);
+		return (this.nameRegion != null && this.equalRegion == null && this.fValueRegion == null);
 	}
 
 	/**
 	 */
 	protected final boolean hasPrefix() {
-		if (this.name == null)
+		if (this.fName == null || this.fName.length == 0)
 			return false;
-		if (this.name.indexOf(':') <= 0)
-			return false;
-		// exclude JSP tag in name
-		if (this.name.charAt(0) == '<')
-			return false;
-		return true;
+		return CharOperation.indexOf(this.fName, ':') > 0 && this.fName[0] != '<';
 	}
-
+	
 	/**
 	 */
 	protected final boolean ignoreCase() {
@@ -582,14 +581,18 @@
 	 */
 	protected boolean matchName(String name) {
 		if (name == null)
-			return (this.name == null);
-		if (this.name == null)
+			return (this.fName == null);
+		if (this.fName == null)
 			return false;
-		if (this.name.length() != name.length())
+		return CharOperation.equals(this.fName, name.toCharArray(), ignoreCase());
+	}
+
+	protected boolean matchName(char[] name) {
+		if (name == null)
+			return (this.fName == null);
+		if (this.fName == null)
 			return false;
-		if (this.name.equals(name))
-			return true;
-		return this.name.equalsIgnoreCase(name) && ignoreCase();
+		return CharOperation.equals(this.fName, name, ignoreCase());
 	}
 
 
@@ -628,21 +631,21 @@
 	 */
 	void removeRegions() {
 		this.nameRegion = null;
-		this.valueRegion = null;
+		this.fValueRegion = null;
 		this.equalRegion = null;
 	}
 
 	/**
 	 */
 	void resetRegions() {
-		this.valueSource = getValueSource();
+		this.fValueSource = getValueSource().toCharArray();
 		removeRegions();
 	}
 
 	/**
 	 */
 	void resetRegions(ElementImpl ownerElement) {
-		this.valueSource = getValueSource(ownerElement);
+		this.fValueSource = getValueSource(ownerElement).toCharArray();
 		removeRegions();
 	}
 
@@ -662,11 +665,11 @@
 		if (this.ownerElement != null) {
 			value = getValue();
 			startOffset = this.ownerElement.getStartOffset();
-			this.ownerElement.notify(CHANGE, this, value, null, startOffset);
+			this.ownerElement.notify(REMOVE, this, value, null, startOffset);
 		}
-		this.name = name;
+		this.fName = CharacterStringPool.getCharString(name);
 		if (this.ownerElement != null) {
-			this.ownerElement.notify(CHANGE, this, null, value, startOffset);
+			this.ownerElement.notify(ADD, this, null, value, startOffset);
 		}
 	}
 
@@ -675,7 +678,10 @@
 	}
 
 	protected void setNamespaceURI(String namespaceURI) {
-		this.namespaceURI = namespaceURI;
+		if (namespaceURI == null)
+			this.fNamespaceURI = null;
+		else
+			this.fNamespaceURI = namespaceURI.toCharArray();
 	}
 
 	/**
@@ -702,7 +708,7 @@
 	 */
 	public void setPrefix(String prefix) throws DOMException {
 		if (this.ownerElement != null && !this.ownerElement.isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		int prefixLength = (prefix != null ? prefix.length() : 0);
 		String localName = getLocalName();
@@ -711,7 +717,7 @@
 			return;
 		}
 		if (localName == null)
-			localName = new String();
+			localName = NodeImpl.EMPTY_STRING;
 		int localLength = localName.length();
 		StringBuffer buffer = new StringBuffer(prefixLength + 1 + localLength);
 		buffer.append(prefix);
@@ -747,16 +753,16 @@
 	}
 
 	void setValueRegion(ITextRegion valueRegion) {
-		this.valueRegion = valueRegion;
+		this.fValueRegion = valueRegion;
 		if (valueRegion != null)
-			this.valueSource = null;
+			this.fValueSource = null;
 	}
 
 	public void setValueSource(String source) {
 		if (this.ownerElement != null && !this.ownerElement.isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
-		this.valueSource = source;
+		this.fValueSource = (source != null) ? source.toCharArray() : null;
 
 		notifyValueChanged();
 	}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CDATASectionImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CDATASectionImpl.java
index 563eeec..1a3ad57 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CDATASectionImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CDATASectionImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,6 +13,7 @@
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
  *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -72,13 +73,14 @@
 	 */
 	public String getData() throws DOMException {
 		// instead of super(TextImpl).getData(), call getCharacterData()
-		String data = getCharacterData();
+		char[] data = getCharacterData();
 		if (data == null) {
-			data = getData(getStructuredDocumentRegion());
-			if (data == null)
-				data = new String();
+			String sdata = getData(getStructuredDocumentRegion());
+			if (sdata != null)
+				return sdata;
+			return NodeImpl.EMPTY_STRING;
 		}
-		return data;
+		return new String(data);
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharOperation.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharOperation.java
new file mode 100644
index 0000000..2f9f8a9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharOperation.java
@@ -0,0 +1,107 @@
+/*******************************************************************************

+ * Copyright (c) 2009, 2011 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.wst.xml.core.internal.document;

+

+class CharOperation {

+

+	private CharOperation() {

+	}

+

+	static int indexOf(char[] array, char c) {

+		return indexOf(array, c, 0);

+	}

+

+	static int indexOf(char[] array, char c, int start) {

+		for (int i = start; i < array.length; i++) {

+			if (array[i] == c)

+				return i;

+		}

+		return -1;

+	}

+

+

+	/**

+	 * note: This method taken from

+	 * org.eclipse.jdt.core.compiler.CharOperation

+	 * 

+	 * Answers true if the two arrays are identical character by character,

+	 * otherwise false, respecting the value of ignoreCase. <br>

+	 * <br>

+	 * For example:

+	 * <ol>

+	 * <li>

+	 * 

+	 * <pre>

+	 *    first = null

+	 *    second = null

+	 *    result => true

+	 * </pre>

+	 * 

+	 * </li>

+	 * <li>

+	 * 

+	 * <pre>

+	 *    first = { }

+	 *    second = null

+	 *    result => false

+	 * </pre>

+	 * 

+	 * </li>

+	 * <li>

+	 * 

+	 * <pre>

+	 *    first = { 'a' }

+	 *    second = { 'a' }

+	 *    result => true

+	 * </pre>

+	 * 

+	 * </li>

+	 * <li>

+	 * 

+	 * <pre>

+	 *    first = { 'a' }

+	 *    second = { 'A' }

+	 *    result => false

+	 * </pre>

+	 * 

+	 * </li>

+	 * </ol>

+	 * 

+	 * @param first

+	 *            the first array

+	 * @param second

+	 *            the second array

+	 * @return true if the two arrays are identical character by character,

+	 *         otherwise false, acounting for <code>ignoreCase</code>

+	 */

+	public static final boolean equals(char[] first, char[] second, boolean ignoreCase) {

+		if (first == second)

+			return true;

+		if (first == null || second == null)

+			return false;

+		if (first.length != second.length)

+			return false;

+

+		for (int i = first.length; --i >= 0;) {

+			if (ignoreCase) {

+				if (Character.toUpperCase(first[i]) != Character.toUpperCase(second[i])) {

+					return false;

+				}

+			}

+			else {

+				if (first[i] != second[i]) {

+					return false;

+				}

+			}

+		}

+		return true;

+	}

+}

diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharacterDataImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharacterDataImpl.java
index 6bf9c65..d1b931e 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharacterDataImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharacterDataImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -25,7 +25,7 @@
  */
 public abstract class CharacterDataImpl extends NodeImpl implements CharacterData {
 
-	private String data = null;
+	private char[] data = null;
 
 	/**
 	 * CharacterDataImpl constructor
@@ -44,7 +44,7 @@
 		super(that);
 
 		if (that != null) {
-			this.data = that.getData();
+			this.data = that.getData().toCharArray();
 		}
 	}
 
@@ -78,33 +78,33 @@
 		if (count == 0)
 			return;
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		if (count < 0 || offset < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String data = getData();
 		if (data == null) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		int length = data.length();
 		if (offset > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		if (offset == 0) {
 			if (count > length) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			if (count == length)
-				data = new String();
+				data = NodeImpl.EMPTY_STRING;
 			else
 				data = data.substring(count);
 		} else {
 			int end = offset + count;
 			if (end > length) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			if (end == length)
 				data = data.substring(0, offset);
@@ -116,7 +116,7 @@
 
 	/**
 	 */
-	protected final String getCharacterData() {
+	protected final char[] getCharacterData() {
 		return this.data;
 	}
 
@@ -126,7 +126,10 @@
 	 * @return java.lang.String
 	 */
 	public String getData() throws DOMException {
-		return getCharacterData();
+		char[] cdata = getCharacterData();
+		if (cdata != null)
+			return new String(cdata);
+		return null;
 	}
 
 	/**
@@ -163,17 +166,17 @@
 			return;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		if (offset < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String data = getData();
 		if (data == null) {
 			if (offset > 0) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			data = arg;
 		} else if (offset == 0) {
@@ -181,7 +184,7 @@
 		} else {
 			int length = data.length();
 			if (offset > length) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			if (offset == length)
 				data += arg;
@@ -216,7 +219,7 @@
 	 */
 	public void replaceData(int offset, int count, String arg) throws DOMException {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		if (arg == null) {
@@ -228,16 +231,16 @@
 			return;
 		}
 		if (offset < 0 || count < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String data = getData();
 		if (data == null) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		} else if (offset == 0) {
 			int length = data.length();
 			if (count > length) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			if (count == length)
 				data = arg;
@@ -247,7 +250,7 @@
 			int length = data.length();
 			int end = offset + count;
 			if (end > length) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			if (end == length)
 				data = data.substring(0, offset) + arg;
@@ -260,7 +263,7 @@
 	/**
 	 */
 	void resetStructuredDocumentRegions() {
-		this.data = getData();
+		this.data = getData().toCharArray();
 		setStructuredDocumentRegion(null);
 	}
 
@@ -272,10 +275,10 @@
 	 */
 	public void setData(String data) throws DOMException {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
-		this.data = data;
+		this.data = (data != null ? data.toCharArray() : null);
 
 		notifyValueChanged();
 	}
@@ -309,24 +312,24 @@
 	 */
 	public String substringData(int offset, int count) throws DOMException {
 		if (count == 0)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		if (offset < 0 || count < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String data = getData();
 		if (data == null) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		int length = data.length();
 		if (offset == 0 && count == length)
 			return data;
 		if (offset > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		int end = offset + count;
 		if (end > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		return data.substring(offset, end);
 	}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharacterStringPool.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharacterStringPool.java
new file mode 100644
index 0000000..3bdb388
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CharacterStringPool.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.document;
+
+import java.util.LinkedHashMap;
+
+/**
+ * Organizes a pool of frequently used Strings as character arrays.
+ * 
+ */
+final class CharacterStringPool {
+
+	static private LinkedHashMap fPool = new LimitedHashMap();
+
+	static private class LimitedHashMap extends LinkedHashMap {
+		private static final long serialVersionUID = 1L;
+		private static final int MAX = 500;
+
+		public LimitedHashMap() {
+			super(MAX / 10, .75f, true);
+		}
+		protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
+			return size() > MAX;
+		}
+	}
+
+	static private class CharArray {
+		char[] fArray;
+		/**
+		 * Answers a hashcode for the array. Algorithm from org.eclipse.jdt.core.compiler.CharOperation
+		 *
+		 * @param array the array for which a hashcode is required
+		 * @return the hashcode
+		 * @throws NullPointerException if array is null
+		 */
+		public int hashCode() {
+			int length = fArray.length;
+			int hash = length == 0 ? 31 : fArray[0];
+			if (length < 8) {
+				for (int i = length; --i > 0;)
+					hash = (hash * 31) + fArray[i];
+			} else {
+				// 8 characters is enough to compute a decent hash code, don't waste time examining every character
+				for (int i = length - 1, last = i > 16 ? i - 16 : 0; i > last; i -= 2)
+					hash = (hash * 31) + fArray[i];
+			}
+			return hash & 0x7FFFFFFF;
+		}
+
+		public boolean equals(Object obj) {
+			if (this == obj)
+				return true;
+			if (!(obj instanceof CharArray))
+				return false;
+			CharArray other = (CharArray) obj;
+			if (fArray.length != other.fArray.length)
+				return false;
+			for (int i = 0; i < fArray.length; i++) {
+				if (fArray[i] != other.fArray[i])
+					return false;
+			}
+			return true;
+		}
+	}
+
+	private CharacterStringPool() {
+	}
+
+	/**
+	 * Returns the character array for <code>string</code>. If
+	 * the character array is already in the pool for character arrays,
+	 * the array is reused.
+	 * 
+	 * @param string the string to retrieve the character array for
+	 * @return a pooled instance of the character array
+	 */
+	public static char[] getCharString(String string) {
+		CharArray array = new CharArray();
+		array.fArray = string.toCharArray();
+
+		Object obj = null;
+		synchronized (fPool) {
+			obj = fPool.get(array);
+			if (obj == null) {
+				obj = array;
+				fPool.put(obj, obj);
+			}
+		}
+		return ((CharArray) obj).fArray;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CommentImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CommentImpl.java
index f834768..4a817e0 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CommentImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/CommentImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,7 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -77,13 +77,14 @@
 	 * @return java.lang.String
 	 */
 	public String getData() throws DOMException {
-		String data = getCharacterData();
+		char[] data = getCharacterData();
 		if (data == null) {
-			data = getData(getStructuredDocumentRegion());
-			if (data == null)
-				data = new String();
+			String sdata = getData(getStructuredDocumentRegion());
+			if (sdata != null)
+				return sdata;
+			return NodeImpl.EMPTY_STRING;
 		}
-		return data;
+		return new String(data);
 	}
 
 	/**
@@ -184,7 +185,7 @@
 			return;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		DocumentImpl document = (DocumentImpl) getOwnerDocument();
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMMessages.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMMessages.java
new file mode 100644
index 0000000..562f4b1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMMessages.java
@@ -0,0 +1,43 @@
+/*******************************************************************************

+ * Copyright (c) 2010 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *     

+ *******************************************************************************/

+package org.eclipse.wst.xml.core.internal.document;

+

+import org.eclipse.osgi.util.NLS;

+

+class DOMMessages extends NLS {

+	private static String BUNDLE_NAME = "org.eclipse.wst.xml.core.internal.document.DOMMessages"; //$NON-NLS-1$

+

+	static {

+		NLS.initializeMessages(BUNDLE_NAME, DOMMessages.class);

+	}

+

+	private DOMMessages() {

+	}

+

+	static String DOMSTRING_SIZE_ERR;

+	static String HIERARCHY_REQUEST_ERR;

+	static String INDEX_SIZE_ERR;

+	static String INUSE_ATTRIBUTE_ERR;

+	static String INVALID_ACCESS_ERR;

+	static String INVALID_CHARACTER_ERR;

+	static String INVALID_MODIFICATION_ERR;

+	static String INVALID_STATE_ERR;

+	static String NAMESPACE_ERR;

+	static String NO_DATA_ALLOWED_ERR;

+	static String NO_MODIFICATION_ALLOWED_ERR;

+	static String NOT_FOUND_ERR;

+	static String NOT_SUPPORTED_ERR;

+	static String SYNTAX_ERR;

+	static String TYPE_MISMATCH_ERR;

+	static String VALIDATION_ERR;

+	static String WRONG_DOCUMENT_ERR;

+}

diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMMessages.properties b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMMessages.properties
new file mode 100644
index 0000000..d0eac25
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMMessages.properties
@@ -0,0 +1,17 @@
+DOMSTRING_SIZE_ERR=DOMString Size Error

+HIERARCHY_REQUEST_ERR=Invalid Hierarchy Request

+INDEX_SIZE_ERR=Incorrect Index Error

+INUSE_ATTRIBUTE_ERR=Attribute Node In Use Error

+INVALID_ACCESS_ERR=Invalid Access Error

+INVALID_CHARACTER_ERR=Invalid Characer Error

+INVALID_MODIFICATION_ERR=Invalid Modification Error

+INVALID_STATE_ERR=Invalid State Error

+NAMESPACE_ERR=Namespace Error

+NO_DATA_ALLOWED_ERR=No Data Allowed

+NO_MODIFICATION_ALLOWED_ERR=No Modification Allowed

+NOT_FOUND_ERR=Not Found

+NOT_SUPPORTED_ERR=Not Supported

+SYNTAX_ERR=Syntax Error

+TYPE_MISMATCH_ERR=Type Mismatch Error

+VALIDATION_ERR=Validation Error

+WRONG_DOCUMENT_ERR=Wrong Document

diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMModelImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMModelImpl.java
index d2149b9..367050e 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMModelImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DOMModelImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -454,6 +454,7 @@
 		setActive(parser);
 		this.document.removeChildNodes();
 		try {
+			this.refresh = false;
 			parser.replaceStructuredDocumentRegions(getStructuredDocument().getRegionList(), null);
 		}
 		catch (Exception ex) {
@@ -463,7 +464,6 @@
 			setActive(null);
 			if (!isChanging)
 				notifier.endChanging();
-			this.refresh = false;
 		}
 	}
 
@@ -702,7 +702,7 @@
 		XMLModelUpdater updater = getActiveUpdater();
 		if (updater != null) { // being updated
 			try {
-				updater.changeRegion(flatNode, region);
+				updater.changeRegion(event, flatNode, region);
 			}
 			catch (Exception ex) {
 				Logger.logException(ex);
@@ -722,7 +722,7 @@
 		XMLModelParser parser = getModelParser();
 		setActive(parser);
 		try {
-			parser.changeRegion(flatNode, region);
+			parser.changeRegion(event, flatNode, region);
 		}
 		catch (Exception ex) {
 			Logger.logException(ex);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentImpl.java
index 3c862d2..4082ff7 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,8 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
+ *     David Carver (Intalio) - bug 273004 - add check for valid xml characters in createAttribute
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -21,13 +22,16 @@
 // for org.apache.xerces 3.2.1
 // import org.apache.xerces.utils.XMLCharacterProperties;
 // DMW modified for XML4J 4.0.1
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.xerces.dom.TreeWalkerImpl;
 import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;
 import org.eclipse.wst.xml.core.internal.commentelement.impl.CommentElementRegistry;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMEntityDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
@@ -118,6 +122,18 @@
 
 	}
 
+	private class LimitedCache extends LinkedHashMap {
+		private static final long serialVersionUID = 1L;
+		private static final int MAX_SIZE = 10;
+		public LimitedCache() {
+			super(0, 0.75f, true);
+		}
+
+		protected boolean removeEldestEntry(java.util.Map.Entry entry) {
+			return size() > MAX_SIZE;
+		}
+	}
+
 	// this is a constant just to give compile-time control over
 	// whether or not to use the cache. If, in future, its found that
 	// there are no (or few) "duplicate requests" ... then this cache
@@ -129,6 +145,7 @@
 	private DOMModelImpl model = null;
 	private TagNameCache tagNameCache;
 
+	private Map fCMCache;
 	/**
 	 * DocumentImpl constructor
 	 */
@@ -137,6 +154,7 @@
 		if (usetagnamecache) {
 			tagNameCache = new TagNameCache();
 		}
+		fCMCache = Collections.synchronizedMap(new LimitedCache());
 	}
 
 	/**
@@ -150,6 +168,7 @@
 		if (usetagnamecache) {
 			tagNameCache = new TagNameCache();
 		}
+		fCMCache = Collections.synchronizedMap(new LimitedCache());
 	}
 
 	/**
@@ -263,6 +282,7 @@
 	 *            java.lang.String
 	 */
 	public Attr createAttribute(String name) throws DOMException {
+		checkTagNameValidity(name);
 		AttrImpl attr = new AttrImpl();
 		attr.setOwnerDocument(this);
 		attr.setName(name);
@@ -272,6 +292,7 @@
 	/**
 	 */
 	public Attr createAttributeNS(String uri, String name) throws DOMException {
+		checkTagNameValidity(name);
 		AttrImpl attr = new AttrImpl();
 		attr.setOwnerDocument(this);
 		attr.setName(name);
@@ -317,7 +338,7 @@
 	public Element createCommentElement(String tagName, boolean isJSPTag) throws DOMException {
 		Element result = null;
 		if (!isJSPType() && isJSPTag) {
-			throw new DOMException(DOMException.INVALID_MODIFICATION_ERR, new String());
+			throw new DOMException(DOMException.INVALID_MODIFICATION_ERR, DOMMessages.INVALID_MODIFICATION_ERR);
 		}
 		ElementImpl element = (ElementImpl) createElement(tagName);
 		element.setJSPTag(isJSPTag);
@@ -326,7 +347,7 @@
 			result = element;
 		}
 		else {
-			throw new DOMException(DOMException.INVALID_CHARACTER_ERR, new String());
+			throw new DOMException(DOMException.INVALID_CHARACTER_ERR, DOMMessages.INVALID_CHARACTER_ERR);
 		}
 		return result;
 	}
@@ -376,7 +397,7 @@
 	 */
 	public Element createElementNS(String uri, String tagName) throws DOMException {
 		if (!isValidName(tagName)) {
-			throw new DOMException(DOMException.INVALID_CHARACTER_ERR, new String());
+			throw new DOMException(DOMException.INVALID_CHARACTER_ERR, DOMMessages.INVALID_CHARACTER_ERR);
 		}
 
 		ElementImpl element = (ElementImpl) createElement(tagName);
@@ -407,7 +428,7 @@
 	 */
 	public EntityReference createEntityReference(String name) throws DOMException {
 		if (!isXMLType()) {
-			throw new DOMException(DOMException.NOT_SUPPORTED_ERR, new String());
+			throw new DOMException(DOMException.NOT_SUPPORTED_ERR, DOMMessages.NOT_SUPPORTED_ERR);
 		}
 
 		EntityReferenceImpl ref = new EntityReferenceImpl();
@@ -487,7 +508,7 @@
 	 */
 	public TreeWalker createTreeWalker(Node root, int whatToShow, NodeFilter filter, boolean entityReferenceExpansion) {
 		if (root == null) {
-			String msg = "Program Error: root node can not be null for TreeWalker";
+			String msg = DOMMessages.NOT_SUPPORTED_ERR + " - Program Error: root node can not be null for TreeWalker";
 			throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
 		}
 		// ISSUE: we just use Xerces implementation for now, but longer term,
@@ -721,8 +742,6 @@
 		return id;
 	}
 
-	/**
-	 */
 	public Element getElementById(String id) {
 		if (id == null)
 			return null;
@@ -734,21 +753,13 @@
 			if (node.getNodeType() != ELEMENT_NODE)
 				continue;
 			ElementImpl element = (ElementImpl) node;
-			String value = element.getAttribute("id");//$NON-NLS-1$
-			if (value != null && value.equals(id))
+			if (element.hasAttribute("id") && id.equals(element.getAttribute("id"))) //$NON-NLS-1$ //$NON-NLS-2$
 				return element;
 		}
 
 		return null;
 	}
 
-	/**
-	 * getElementsByTagName method
-	 * 
-	 * @return org.w3c.dom.NodeList
-	 * @param tagName
-	 *            java.lang.String
-	 */
 	public NodeList getElementsByTagName(String tagName) {
 		if (tagName == null)
 			return new NodeListImpl();
@@ -1055,6 +1066,23 @@
 	}
 
 	/**
+	 * Provides an element's attribute declarations
+	 * @param element the element to retrieve the attribute map of
+	 * @return a <code>CMNamedNodeMap</code> of attributes if the declaration exists; null otherwise.
+	 */
+	CMNamedNodeMap getCMAttributes(Element element) {
+		CMNamedNodeMap map = (CMNamedNodeMap) fCMCache.get(element);
+		if (map == null) {
+			CMElementDeclaration decl = ModelQueryUtil.getModelQuery(this).getCMElementDeclaration(element);
+			if (decl != null) {
+				map = decl.getAttributes();
+				fCMCache.put(element, map);
+			}
+		}
+		return map;
+	}
+
+	/**
 	 * <p>
 	 * EXPERIMENTAL! Based on the <a
 	 * href='http://www.w3.org/TR/2001/WD-DOM-Level-3-Core-20010605'>Document
@@ -1104,76 +1132,76 @@
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public String getInputEncoding() {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public String getXmlEncoding() {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public boolean getXmlStandalone() {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public void setXmlStandalone(boolean xmlStandalone) throws DOMException {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public String getXmlVersion() {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public void setXmlVersion(String xmlVersion) throws DOMException {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public String getDocumentURI() {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public void setDocumentURI(String documentURI) {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public DOMConfiguration getDomConfig() {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public void normalizeDocument() {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 
 	/**
 	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
 	 */
 	public Node renameNode(Node n, String namespaceURI, String qualifiedName) throws DOMException {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implmented in this version"); //$NON-NLS-1$
+		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version"); //$NON-NLS-1$
 	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentTypeImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentTypeImpl.java
index 769543f..5ff86bf 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentTypeImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/DocumentTypeImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,7 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -93,7 +93,7 @@
 	 */
 	public String getName() {
 		if (this.name == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		return this.name;
 	}
 
@@ -156,7 +156,7 @@
 	 */
 	public void setInternalSubset(String internalSubset) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.internalSubset = internalSubset;
@@ -180,7 +180,7 @@
 	 */
 	public void setPublicId(String publicId) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.publicId = publicId;
@@ -196,7 +196,7 @@
 	 */
 	public void setSystemId(String systemId) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.systemId = systemId;
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ElementImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ElementImpl.java
index 8db82f1..74cafdd 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ElementImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ElementImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,7 +14,7 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -28,7 +28,10 @@
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.xml.core.internal.commentelement.CommentElementAdapter;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
 import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
 import org.eclipse.wst.xml.core.internal.parser.XMLSourceParser;
@@ -96,14 +99,19 @@
 		}
 	}
 
+//	private static final char[] XMLNS_PREFIX = IXMLNamespace.XMLNS_PREFIX.toCharArray();
+	private static final byte FLAG_COMMENT = 0x1;
+	private static final byte FLAG_EMPTY = 0x2;
+	private static final byte FLAG_JSP = 0x4;
+	
+	private byte fTagFlags = 0;
+	
 	NodeListImpl attrNodes = null;
 	private IStructuredDocumentRegion endStructuredDocumentRegion = null;
-	private boolean isCommentTag = false;
-	private boolean isEmptyTag = false;
-	private boolean isJSPTag = false;
-	private String namespaceURI = null;
+	
+	private char[] fTagName = null;
 
-	private String tagName = null;
+	private char[] fNamespaceURI = null;
 
 	/**
 	 * ElementImpl constructor
@@ -122,10 +130,8 @@
 		super(that);
 
 		if (that != null) {
-			this.tagName = that.tagName;
-			this.isEmptyTag = that.isEmptyTag;
-			this.isJSPTag = that.isJSPTag;
-			this.isCommentTag = that.isCommentTag;
+			this.fTagName = that.fTagName;
+			this.fTagFlags = that.fTagFlags;
 
 			// clone attributes
 			that.cloneAttributes(this);
@@ -168,7 +174,7 @@
 			return null;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		if (this.attrNodes == null)
@@ -215,7 +221,7 @@
 	 *            boolean
 	 */
 	public Node cloneNode(boolean deep) {
-		ElementImpl cloned = new ElementImpl(this);
+		ElementImpl cloned = newInstance();
 		if (deep)
 			cloneChildNodes(cloned, deep);
 		
@@ -223,6 +229,10 @@
 		return cloned;
 	}
 
+	protected ElementImpl newInstance() {
+		return new ElementImpl(this);
+	}
+
 	/**
 	 * getAttribute method
 	 * 
@@ -232,12 +242,30 @@
 	 */
 	public String getAttribute(String name) {
 		Attr attr = getAttributeNode(name);
-		if (attr == null)
-			return null;
+		// In the absence of the attribute, get the default value
+		if (attr == null) {
+			String defaultValue = getDefaultValue(name);
+			return (defaultValue != null) ? defaultValue : NodeImpl.EMPTY_STRING;
+		}
 		return attr.getValue();
 	}
 
 	/**
+	 * get the default value for attribute <code>name</code>. Returns an empty string
+	 * @param name
+	 * @return
+	 */
+	private String getDefaultValue(String name) {
+		CMNamedNodeMap map = ((DocumentImpl) getOwnerDocument()).getCMAttributes(this);
+		if (map != null) {
+			CMNode attribute = map.getNamedItem(name);
+			if (attribute instanceof CMAttributeDeclaration)
+				return ((CMAttributeDeclaration) attribute).getAttrType().getImpliedValue();
+		}
+		return NodeImpl.EMPTY_STRING;
+	}
+
+	/**
 	 * getAttributeNode method
 	 * 
 	 * @return org.w3c.dom.Attr
@@ -251,11 +279,12 @@
 			return null; // no attribute
 
 		int length = this.attrNodes.getLength();
+		char[] nameChars = name.toCharArray();
 		for (int i = 0; i < length; i++) {
 			AttrImpl attr = (AttrImpl) this.attrNodes.item(i);
 			if (attr == null)
 				continue;
-			if (attr.matchName(name))
+			if (attr.matchName(nameChars))
 				return attr; // found
 		}
 
@@ -299,8 +328,11 @@
 	 */
 	public String getAttributeNS(String uri, String name) {
 		Attr attr = getAttributeNodeNS(uri, name);
-		if (attr == null)
-			return null;
+		// In the absence of the attribute, get the default value
+		if (attr == null) {
+			String defaultValue = getDefaultValue(name);
+			return (defaultValue != null) ? defaultValue : NodeImpl.EMPTY_STRING;
+		}
 		return attr.getValue();
 	}
 
@@ -348,6 +380,7 @@
 			tagName = null; // do not care
 		}
 
+		it.nextNode(); // skip the first node since it is the root from createNodeIterator
 		for (Node node = it.nextNode(); node != null; node = it.nextNode()) {
 			if (node.getNodeType() != ELEMENT_NODE)
 				continue;
@@ -383,6 +416,7 @@
 			tagName = null; // do not care
 		}
 
+		it.nextNode(); // skip the first node since it is the root from createNodeIterator
 		for (Node node = it.nextNode(); node != null; node = it.nextNode()) {
 			if (node.getNodeType() != ELEMENT_NODE)
 				continue;
@@ -481,16 +515,14 @@
 	/**
 	 */
 	public String getLocalName() {
-		if (this.tagName == null)
+		if (this.fTagName == null)
 			return null;
-		int index = this.tagName.indexOf(':');
+		int index = CharOperation.indexOf(this.fTagName, ':');
 		if (index < 0)
-			return this.tagName;
-		return this.tagName.substring(index + 1);
+			return new String(this.fTagName);
+		return new String(this.fTagName, index + 1, this.fTagName.length - index - 1);
 	}
 
-	/**
-	 */
 	public String getNamespaceURI() {
 		String nsAttrName = null;
 		String prefix = getPrefix();
@@ -510,7 +542,9 @@
 				return attr.getValue();
 		}
 
-		return this.namespaceURI;
+		if (this.fNamespaceURI == null)
+			return null;
+		return new String(this.fNamespaceURI);
 	}
 
 	/**
@@ -534,15 +568,15 @@
 	/**
 	 */
 	public String getPrefix() {
-		if (this.tagName == null)
+		if (this.fTagName == null)
 			return null;
-		int index = this.tagName.indexOf(':');
+		int index = CharOperation.indexOf(this.fTagName, ':');
 		if (index <= 0)
 			return null;
-		// exclude JSP tag in tag name
-		if (this.tagName.charAt(0) == '<')
+		// exclude JSP tag in name
+		if (this.fTagName[0] == '<')
 			return null;
-		return this.tagName.substring(0, index);
+		return new String(this.fTagName, 0, index);
 	}
 
 	/**
@@ -583,9 +617,9 @@
 	 * @return java.lang.String
 	 */
 	public String getTagName() {
-		if (this.tagName == null)
-			return new String();
-		return this.tagName;
+		if (this.fTagName == null)
+			return NodeImpl.EMPTY_STRING;
+		return new String(fTagName);
 	}
 
 	/**
@@ -618,14 +652,9 @@
 	/**
 	 */
 	protected final boolean hasPrefix() {
-		if (this.tagName == null)
+		if (this.fTagName == null || this.fTagName.length == 0)
 			return false;
-		if (this.tagName.indexOf(':') <= 0)
-			return false;
-		// exclude JSP tag in tag name
-		if (this.tagName.charAt(0) == '<')
-			return false;
-		return true;
+		return CharOperation.indexOf(this.fTagName, ':') > 0 && this.fTagName[0] != '<';
 	}
 
 	/**
@@ -681,13 +710,13 @@
 		if (newChild == null)
 			return null;
 		if (!isContainer()) { // never be container
-			throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, new String());
+			throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, DOMMessages.HIERARCHY_REQUEST_ERR);
 		}
-		if (newChild.getNodeType() != TEXT_NODE) {
+		if (newChild.getNodeType() != TEXT_NODE && newChild.getNodeType() != CDATA_SECTION_NODE) {
 			if (isJSPContainer() || isCDATAContainer()) { // accepts only
 				// Text
 				// child
-				throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, new String());
+				throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, DOMMessages.HIERARCHY_REQUEST_ERR);
 			}
 		}
 		return super.insertBefore(newChild, refChild);
@@ -702,12 +731,12 @@
 		if (model == null)
 			return false; // error
 		IStructuredDocument structuredDocument = model.getStructuredDocument();
-		if (structuredDocument == null)
+		if (structuredDocument == null || fTagName == null)
 			return false; // eror
 		RegionParser parser = structuredDocument.getParser();
 		if (parser == null || !(parser instanceof XMLSourceParser))
 			return false;
-		return (((XMLSourceParser) parser).getBlockMarker(this.tagName) != null);
+		return (((XMLSourceParser) parser).getBlockMarker(new String(this.fTagName)) != null);
 		/*
 		 * CMElementDeclaration decl = getDeclaration(); if (decl == null)
 		 * return false; if (decl instanceof CMNodeWrapper) { decl =
@@ -759,7 +788,7 @@
 	/**
 	 */
 	public final boolean isCommentTag() {
-		return this.isCommentTag;
+		return (fTagFlags & FLAG_COMMENT) != 0;
 	}
 
 	/**
@@ -782,7 +811,7 @@
 		if (!isXMLTag()) { // non-XML tag
 			CMElementDeclaration decl = getDeclaration();
 			if (decl == null)
-				return false; // undefined tag
+				return true; // undefined tag
 			return (decl.getContentType() != CMElementDeclaration.EMPTY);
 		}
 		return true;
@@ -800,7 +829,7 @@
 			return false;
 		if (!isXMLTag())
 			return false;
-		return this.isEmptyTag;
+		return (fTagFlags & FLAG_EMPTY) != 0;
 	}
 
 	/**
@@ -837,7 +866,7 @@
 	 * @return boolean
 	 */
 	public final boolean isJSPTag() {
-		return this.isJSPTag;
+		return (fTagFlags & FLAG_JSP) != 0;
 	}
 
 	/**
@@ -899,12 +928,15 @@
 	 */
 	public boolean matchTagName(String tagName) {
 		if (tagName == null)
-			return (this.tagName == null);
-		if (this.tagName == null)
+			return (this.fTagName == null);
+		if (this.fTagName == null)
 			return false;
+		if (this.fTagName.length != tagName.length())
+			return false;
+		String stringName = new String(this.fTagName);
 		if (!ignoreCase())
-			return this.tagName.equals(tagName);
-		return this.tagName.equalsIgnoreCase(tagName);
+			return stringName.equals(tagName);
+		return stringName.equalsIgnoreCase(tagName);
 	}
 
 	/**
@@ -989,11 +1021,11 @@
 			return null; // invalid parameter
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		if (this.attrNodes == null) { // no attribute
-			throw new DOMException(DOMException.NOT_FOUND_ERR, new String());
+			throw new DOMException(DOMException.NOT_FOUND_ERR, DOMMessages.NOT_FOUND_ERR);
 		}
 
 		int length = this.attrNodes.getLength();
@@ -1011,7 +1043,7 @@
 		}
 
 		// not found
-		throw new DOMException(DOMException.NOT_FOUND_ERR, new String());
+		throw new DOMException(DOMException.NOT_FOUND_ERR, DOMMessages.NOT_FOUND_ERR);
 	}
 
 	/**
@@ -1028,7 +1060,7 @@
 			return null; // no attribute
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		int length = this.attrNodes.getLength();
@@ -1059,7 +1091,7 @@
 			return null; // no attribute
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		int length = this.attrNodes.getLength();
@@ -1105,7 +1137,7 @@
 			return;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		int length = this.attrNodes.getLength();
@@ -1182,7 +1214,7 @@
 			return;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		Attr attr = getAttributeNode(name);
@@ -1214,7 +1246,7 @@
 			return null; // nothing to do
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		AttrImpl attr = (AttrImpl) newAttr;
@@ -1222,7 +1254,7 @@
 		if (owner != null) {
 			if (owner == this)
 				return null; // nothing to do
-			throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR, new String());
+			throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR, DOMMessages.INUSE_ATTRIBUTE_ERR);
 		}
 
 		Attr oldAttr = removeAttributeNode(newAttr.getName());
@@ -1237,7 +1269,7 @@
 			return null; // nothing to do
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		AttrImpl attr = (AttrImpl) newAttr;
@@ -1245,7 +1277,7 @@
 		if (owner != null) {
 			if (owner == this)
 				return null; // nothing to do
-			throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR, new String());
+			throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR, DOMMessages.INUSE_ATTRIBUTE_ERR);
 		}
 
 		String name = newAttr.getLocalName();
@@ -1263,7 +1295,7 @@
 			return;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=139552
@@ -1294,10 +1326,13 @@
 	public void setCommentTag(boolean isCommentTag) {
 		IDOMNode parent = (IDOMNode) getParentNode();
 		if (parent != null && !parent.isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
-		this.isCommentTag = isCommentTag;
+		if (isCommentTag)
+			fTagFlags |= FLAG_COMMENT;
+		else
+			fTagFlags &= ~FLAG_COMMENT;
 	}
 
 	/**
@@ -1309,10 +1344,13 @@
 	public void setEmptyTag(boolean isEmptyTag) {
 		IDOMNode parent = (IDOMNode) getParentNode();
 		if (parent != null && !parent.isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
-		this.isEmptyTag = isEmptyTag;
+		if (isEmptyTag)
+			fTagFlags |= FLAG_EMPTY;
+		else
+			fTagFlags &= ~FLAG_EMPTY;
 	}
 
 	/**
@@ -1338,16 +1376,20 @@
 	public void setJSPTag(boolean isJSPTag) {
 		IDOMNode parent = (IDOMNode) getParentNode();
 		if (parent != null && !parent.isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, NodeImpl.EMPTY_STRING);
 		}
 
-		this.isJSPTag = isJSPTag;
+		if (isJSPTag)
+			fTagFlags |= FLAG_JSP;
+		else
+			fTagFlags &= ~FLAG_JSP;
 	}
 
-	/**
-	 */
 	protected void setNamespaceURI(String namespaceURI) {
-		this.namespaceURI = namespaceURI;
+		if (namespaceURI == null)
+			this.fNamespaceURI = null;
+		else
+			this.fNamespaceURI = namespaceURI.toCharArray();
 	}
 
 	/**
@@ -1372,7 +1414,7 @@
 	public void setPrefix(String prefix) throws DOMException {
 		IDOMNode parent = (IDOMNode) getParentNode();
 		if (parent != null && !parent.isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, NodeImpl.EMPTY_STRING);
 		}
 
 		int prefixLength = (prefix != null ? prefix.length() : 0);
@@ -1416,7 +1458,7 @@
 	 *            java.lang.String
 	 */
 	protected void setTagName(String tagName) {
-		this.tagName = tagName;
+		this.fTagName = CharacterStringPool.getCharString(tagName);
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityImpl.java
index 924546d..fae39ca 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,7 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -93,7 +93,7 @@
 	 */
 	public String getNodeName() {
 		if (this.name == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		return this.name;
 	}
 
@@ -182,7 +182,7 @@
 	 */
 	public void setNotationName(String notationName) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.notationName = notationName;
@@ -196,7 +196,7 @@
 	 */
 	public void setPublicId(String publicId) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.publicId = publicId;
@@ -210,7 +210,7 @@
 	 */
 	public void setSystemId(String systemId) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.systemId = systemId;
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityReferenceImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityReferenceImpl.java
index f8a8071..a4edb32 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityReferenceImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/EntityReferenceImpl.java
@@ -12,7 +12,7 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -70,7 +70,7 @@
 	 */
 	public String getNodeName() {
 		if (this.name == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		return this.name;
 	}
 
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ModelParserAdapter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ModelParserAdapter.java
index 0b7e13d..e61907d 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ModelParserAdapter.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ModelParserAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -52,4 +52,6 @@
 	/**
 	 */
 	public boolean isEndTag(IDOMElement element);
+
+	boolean isEndTagOmissible(Element element);
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeContainer.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeContainer.java
index f653163..b8f6d66 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeContainer.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeContainer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -245,13 +245,17 @@
 		if (newChild == null)
 			return null; // nothing to do
 		if (refChild != null && refChild.getParentNode() != this) {
-			throw new DOMException(DOMException.NOT_FOUND_ERR, new String());
+			throw new DOMException(DOMException.NOT_FOUND_ERR, DOMMessages.NOT_FOUND_ERR);
 		}
 		if (!isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		if (newChild == refChild)
 			return newChild; // nothing to do
+		//new child can not be a parent of this, would cause cycle
+		if(isParent(newChild)) {
+			throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, DOMMessages.HIERARCHY_REQUEST_ERR);
+		}
 
 		if (newChild.getNodeType() == DOCUMENT_FRAGMENT_NODE) {
 			// insert child nodes instead
@@ -368,11 +372,11 @@
 		if (oldChild == null)
 			return null;
 		if (oldChild.getParentNode() != this) {
-			throw new DOMException(DOMException.NOT_FOUND_ERR, new String());
+			throw new DOMException(DOMException.NOT_FOUND_ERR, DOMMessages.NOT_FOUND_ERR);
 		}
 
 		if (!isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		// synchronized in case another thread is getting item, or length
@@ -408,7 +412,7 @@
 	 */
 	public void removeChildNodes() {
 		if (!isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		Node nextChild = null;
@@ -431,7 +435,7 @@
 		if (!hasChildNodes())
 			return null;
 		if (!isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		Document document = null;
@@ -472,7 +476,7 @@
 	 */
 	public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
 		if (!isChildEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		if (oldChild == null)
@@ -511,4 +515,20 @@
 			roc.lockNode((NodeImpl) child);
 		}
 	}
+
+	/**
+	 * <p>Checks to see if the given <code>Node</code> is a parent of <code>this</code> node</p>
+	 * 
+	 * @param possibleParent the possible parent <code>Node</code> of <code>this</code> node
+	 * @return <code>true</code> if <code>possibleParent</code> is the parent of <code>this</code>,
+	 * <code>false</code> otherwise.
+	 */
+	private boolean isParent(Node possibleParent) {
+		Node parent = this.getParentNode();
+		while(parent != null && parent != possibleParent) {
+			parent = parent.getParentNode();
+		}
+
+		return parent == possibleParent;
+	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeImpl.java
index a219cff..938deb8 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,14 +13,18 @@
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
  *     
+ *     David Carver (STAR) - bug 295127 - implement isSameNode and compareDocumentPosition methods.
+ *                                        Unit Tests covered in wst.xsl XPath 2.0 tests.
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
 
 
 import java.io.Serializable;
-import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
 
 import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
 import org.eclipse.wst.sse.core.internal.provisional.AbstractNotifier;
@@ -47,6 +51,14 @@
 public abstract class NodeImpl extends AbstractNotifier implements Node, IDOMNode {
 	// define one empty nodelist, for repeated use
 	private final static NodeList EMPTY_NODE_LIST = new NodeListImpl();
+	// DocumentPosition
+	//private final static short      DOCUMENT_POSITION_DISCONNECTED = 0x01;
+    private final static short      DOCUMENT_POSITION_PRECEDING    = 0x02;
+	private final static short      DOCUMENT_POSITION_FOLLOWING    = 0x04;
+    //private final static short      DOCUMENT_POSITION_CONTAINS     = 0x08;
+	//private final static short      DOCUMENT_POSITION_CONTAINED_BY = 0x10;
+	private final static short      DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
+
 
 	private boolean fDataEditable = true;
 	private IStructuredDocumentRegion flatNode = null;
@@ -55,9 +67,9 @@
 	private DocumentImpl ownerDocument = null;
 	private NodeImpl parentNode = null;
 	private NodeImpl previousSibling = null;
+	// define one empty String constant for repeated use
+	static final String EMPTY_STRING = "";
 	
-	private Hashtable userDataTable=null;
-
 	/**
 	 * NodeImpl constructor
 	 */
@@ -85,7 +97,7 @@
 	 *            org.w3c.dom.Node
 	 */
 	public Node appendChild(Node newChild) throws DOMException {
-		throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, new String());
+		throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, DOMMessages.HIERARCHY_REQUEST_ERR);
 	}
 
 	/**
@@ -171,10 +183,14 @@
 	 * @return org.w3c.dom.Document
 	 */
 	public Document getContainerDocument() {
-		for (Node node = this; node != null; node = node.getParentNode()) {
+		Node parent = null;
+		for (Node node = this; node != null; node = parent) {
 			if (node.getNodeType() == Node.DOCUMENT_NODE) {
 				return (Document) node;
 			}
+			/* Break out of a bad hierarchy */
+			if ((parent = node.getParentNode()) == node)
+				break;
 		}
 		return null;
 	}
@@ -411,7 +427,7 @@
 	 */
 	public String getSource() {
 		if (this.flatNode == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		return this.flatNode.getText();
 	}
 
@@ -508,7 +524,7 @@
 	 *            org.w3c.dom.Node
 	 */
 	public Node insertBefore(Node newChild, Node refChild) throws DOMException {
-		throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, new String());
+		throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, DOMMessages.HIERARCHY_REQUEST_ERR);
 	}
 
 	public boolean isChildEditable() {
@@ -559,12 +575,59 @@
 		// TODO: make localized version
 		String result = null;
 		switch (s) {
-			case DOMException.INVALID_CHARACTER_ERR :
-				result = "INVALID_CHARACTER_ERR"; //$NON-NLS-1$
+			case DOMException.DOMSTRING_SIZE_ERR :
+				result = DOMMessages.DOMSTRING_SIZE_ERR;
 				break;
-
+			case DOMException.HIERARCHY_REQUEST_ERR :
+				result = DOMMessages.HIERARCHY_REQUEST_ERR;
+				break;
+			case DOMException.INDEX_SIZE_ERR :
+				result = DOMMessages.INDEX_SIZE_ERR;
+				break;
+			case DOMException.INUSE_ATTRIBUTE_ERR :
+				result = DOMMessages.INUSE_ATTRIBUTE_ERR;
+				break;
+			case DOMException.INVALID_ACCESS_ERR :
+				result = DOMMessages.INVALID_ACCESS_ERR;
+				break;
+			case DOMException.INVALID_CHARACTER_ERR :
+				result = DOMMessages.INVALID_CHARACTER_ERR;
+				break;
+			case DOMException.INVALID_MODIFICATION_ERR :
+				result = DOMMessages.INVALID_MODIFICATION_ERR;
+				break;
+			case DOMException.INVALID_STATE_ERR :
+				result = DOMMessages.INVALID_STATE_ERR;
+				break;
+			case DOMException.NAMESPACE_ERR :
+				result = DOMMessages.NAMESPACE_ERR;
+				break;
+			case DOMException.NO_DATA_ALLOWED_ERR :
+				result = DOMMessages.NO_DATA_ALLOWED_ERR;
+				break;
+			case DOMException.NO_MODIFICATION_ALLOWED_ERR :
+				result = DOMMessages.NO_MODIFICATION_ALLOWED_ERR;
+				break;
+			case DOMException.NOT_FOUND_ERR :
+				result = DOMMessages.NOT_FOUND_ERR;
+				break;
+			case DOMException.NOT_SUPPORTED_ERR :
+				result = DOMMessages.NOT_SUPPORTED_ERR;
+				break;
+			case DOMException.SYNTAX_ERR :
+				result = DOMMessages.SYNTAX_ERR;
+				break;
+			case 17:// DOMException.TYPE_MISMATCH_ERR :
+				result = DOMMessages.TYPE_MISMATCH_ERR;
+				break;
+			case 16:// DOMException.VALIDATION_ERR :
+				result = DOMMessages.VALIDATION_ERR;
+				break;
+			case DOMException.WRONG_DOCUMENT_ERR :
+				result = DOMMessages.WRONG_DOCUMENT_ERR;
+				break;
 			default :
-				result = new String();
+				result = NodeImpl.EMPTY_STRING;
 				break;
 		}
 		return result;
@@ -635,7 +698,7 @@
 	 *            org.w3c.dom.Node
 	 */
 	public Node removeChild(Node oldChild) throws DOMException {
-		throw new DOMException(DOMException.NOT_FOUND_ERR, new String());
+		throw new DOMException(DOMException.NOT_FOUND_ERR, DOMMessages.NOT_FOUND_ERR);
 	}
 
 	/**
@@ -667,7 +730,7 @@
 	 *            org.w3c.dom.Node
 	 */
 	public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
-		throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, new String());
+		throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, DOMMessages.HIERARCHY_REQUEST_ERR);
 	}
 
 	/**
@@ -832,11 +895,23 @@
 		return result;
 	}
 
-	/**
-	 * NOT IMPLEMENTED, is defined here in preparation of DOM Level 3
+	/* (non-Javadoc)
+	 * @see org.w3c.dom.Node#compareDocumentPosition(org.w3c.dom.Node)
 	 */
 	public short compareDocumentPosition(Node other) throws DOMException {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version."); //$NON-NLS-1$
+		if (!(other instanceof IDOMNode))
+			throw new DOMException(DOMException.NOT_SUPPORTED_ERR, DOMMessages.NOT_SUPPORTED_ERR);
+
+		int nodeStart = this.getStartOffset();
+		int otherStart = ((IDOMNode) other).getStartOffset();
+
+		if (otherStart > nodeStart) {
+			return DOCUMENT_POSITION_FOLLOWING;
+		}
+		else if (otherStart < nodeStart) {
+			return DOCUMENT_POSITION_PRECEDING;
+		}
+		return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;
 	}
 
 	/**
@@ -867,18 +942,18 @@
 		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version."); //$NON-NLS-1$
 	}
 
-	/**
-	 * NOT IMPLEMENTED, is defined here in preparation of DOM Level 3
+	/* (non-Javadoc)
+	 * @see org.w3c.dom.Node#isEqualNode(org.w3c.dom.Node)
 	 */
 	public boolean isEqualNode(Node arg) {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version."); //$NON-NLS-1$
+		return this.equals(arg);
 	}
 
-	/**
-	 * NOT IMPLEMENTED, is defined here in preparation of DOM Level 3
+	/* (non-Javadoc)
+	 * @see org.w3c.dom.Node#isSameNode(org.w3c.dom.Node)
 	 */
 	public boolean isSameNode(Node other) {
-		throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not implemented in this version."); //$NON-NLS-1$
+		return this == other;
 	}
 
 	/**
@@ -928,7 +1003,7 @@
 	public Object getUserData(String key) {
 		
 		if (key==null) return null;
-		
+		Map userDataTable = UserData.getInstance().getUserDataTable(this);
 		if (userDataTable!=null) {
 			UserDataAndHandler userDataAndHandler = (UserDataAndHandler) userDataTable.get(key);
 			if (userDataAndHandler!=null) {
@@ -955,7 +1030,7 @@
 		
 		//return immediately for null keys
 		if (key ==null) return null;
-		
+		Map userDataTable = UserData.getInstance().getUserDataTable(this);
 		//remove association for the key if data is null
 		if (data==null) {
 			if (userDataTable==null) return null;
@@ -1005,12 +1080,13 @@
 				& operation!=UserDataHandler.NODE_IMPORTED
 				& operation!=UserDataHandler.NODE_RENAMED)
 			return; 
-			
+		Map userDataTable = UserData.getInstance().getUserDataTable(this);	
 		if (userDataTable!=null) {
-			Enumeration keys=userDataTable.keys();
-			while (keys.hasMoreElements()) {
-				String key=(String) keys.nextElement(); //should always be a string
-				UserDataAndHandler dataAndHandler = (UserDataAndHandler) userDataTable.get(key);
+			Iterator entries =userDataTable.entrySet().iterator();
+			while (entries.hasNext()) {
+				Map.Entry entry = (Map.Entry) entries.next();
+				String key = entry.getKey().toString(); //should always be a string
+				UserDataAndHandler dataAndHandler = (UserDataAndHandler) entry.getValue();
 				if (dataAndHandler!=null) {
 					UserDataHandler dataHandler=dataAndHandler.getHandler();
 					if (dataHandler!=null) {
@@ -1025,12 +1101,12 @@
 	 * 
 	 * Class for user data and UserDataHandler
 	 */
-	protected class UserDataAndHandler implements Serializable {
+	protected static class UserDataAndHandler implements Serializable {
 
 		/**
 		 * Generated Serial ID
 		 */
-		private static final long serialVersionUID = 4860521237315444840L;
+		private static final long serialVersionUID = 4860521237315444841L;
 		/**
 		 * Generated serialization version
 		 */
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeListImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeListImpl.java
index 4bfed52..a620f32 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeListImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NodeListImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,19 +14,18 @@
 
 
 
-import java.util.Vector;
-
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 /**
- * NodeListImpl class
+ * An array-backed NodeList, used to keep the array size down
  */
 public class NodeListImpl implements NodeList {
 
-	Object lockObject = new byte[0];
-
-	private Vector nodes = null;
+	private Object fLockObject = new byte[0];
+	private final static int growthConstant = 2;
+	private Node[] fNodes = null;
+	private int fNodeCount = 0;
 
 	/**
 	 * NodeListImpl constructor
@@ -35,6 +34,12 @@
 		super();
 	}
 
+	protected NodeListImpl(NodeListImpl list) {
+		super();
+		fNodeCount = list.fNodeCount;
+		fNodes = list.fNodes;
+	}
+
 	/**
 	 * appendNode method
 	 * 
@@ -45,23 +50,43 @@
 	protected Node appendNode(Node node) {
 		if (node == null)
 			return null;
-		if (this.nodes == null)
-			this.nodes = new Vector();
-		this.nodes.addElement(node);
+		synchronized (fLockObject) {
+			ensureCapacity(fNodeCount + 1);
+			fNodes[fNodeCount++] = node;
+		}
 		return node;
 	}
 
 	/**
-	 * getLength method
+	 * Grow the node array to at least the given size while keeping the
+	 * contents the same
 	 * 
-	 * @return int
+	 * @param needed
+	 */
+	private void ensureCapacity(int needed) {
+		if (fNodes == null) {
+			// first time
+			fNodes = new Node[needed];
+			return;
+		}
+		int oldLength = fNodes.length;
+		if (oldLength < needed) {
+			Node[] oldNodes = fNodes;
+			Node[] newNodes = new Node[needed + growthConstant];
+			System.arraycopy(oldNodes, 0, newNodes, 0, fNodeCount);
+			fNodes = newNodes;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.w3c.dom.NodeList#getLength()
 	 */
 	public int getLength() {
-		synchronized (lockObject) {
-			if (this.nodes == null)
-				return 0;
-			return this.nodes.size();
-		}
+		return fNodeCount;
+	}
+	
+	protected final Node[] getNodes() {
+		return fNodes;
 	}
 
 	/**
@@ -69,26 +94,39 @@
 	protected Node insertNode(Node node, int index) {
 		if (node == null)
 			return null;
-		if (this.nodes == null || index >= this.nodes.size()) {
-			return appendNode(node);
+		synchronized (fLockObject) {
+			if (fNodes == null) {
+				// first time, ignore index
+				fNodes = new Node[1];
+				fNodes[fNodeCount++] = node;
+				return node;
+			}
+
+			// gracefully handle out of bounds
+			if (index < 0 || index > fNodeCount + 1)
+				return appendNode(node);
+
+			/*
+			 * Grow a new Node array, copying the old contents around the new
+			 * Node
+			 */
+			Node[] newNodes = new Node[fNodeCount + growthConstant];
+			System.arraycopy(fNodes, 0, newNodes, 0, index);
+			newNodes[index] = node;
+			System.arraycopy(fNodes, index, newNodes, index + 1, fNodeCount - index);
+			fNodes = newNodes;
+			fNodeCount++;
 		}
-		this.nodes.insertElementAt(node, index);
 		return node;
 	}
 
-	/**
-	 * item method
-	 * 
-	 * @return org.w3c.dom.Node
+	/* (non-Javadoc)
+	 * @see org.w3c.dom.NodeList#item(int)
 	 */
 	public Node item(int index) {
-		synchronized (lockObject) {
-			if (this.nodes == null)
-				return null;
-			if (index < 0 || index >= this.nodes.size())
-				return null;
-			return (Node) this.nodes.elementAt(index);
-		}
+		if (index < 0 || index >= fNodeCount)
+			return null; // invalid parameter
+		return fNodes[index];
 	}
 
 	/**
@@ -99,13 +137,21 @@
 	 *            int
 	 */
 	protected Node removeNode(int index) {
-		if (this.nodes == null)
+		if (this.fNodes == null)
 			return null; // no node
-		if (index < 0 || index >= this.nodes.size())
-			return null; // invalid parameter
 
-		Node removed = (Node) this.nodes.elementAt(index);
-		this.nodes.removeElementAt(index);
-		return removed;
+		synchronized (fLockObject) {
+			if (index < 0 || index >= fNodeCount)
+				return null; // invalid parameter
+
+			Node removed = fNodes[index];
+			Node[] newNodes = new Node[fNodeCount - 1];
+			// copy around node being removed
+			System.arraycopy(fNodes, 0, newNodes, 0, index);
+			System.arraycopy(fNodes, index + 1, newNodes, index, fNodeCount - index - 1);
+			fNodes = newNodes;
+			fNodeCount--;
+			return removed;
+		}
 	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NotationImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NotationImpl.java
index 0dbbfe0..186eea2 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NotationImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/NotationImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,7 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -75,7 +75,7 @@
 	 */
 	public String getNodeName() {
 		if (this.name == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		return this.name;
 	}
 
@@ -124,7 +124,7 @@
 	 */
 	public void setPublicId(String publicId) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		this.publicId = publicId;
 	}
@@ -137,7 +137,7 @@
 	 */
 	public void setSystemId(String systemId) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		this.systemId = systemId;
 	}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ProcessingInstructionImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ProcessingInstructionImpl.java
index 7a1420b..044eb53 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ProcessingInstructionImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ProcessingInstructionImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,7 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -84,10 +84,10 @@
 
 		IStructuredDocumentRegion flatNode = getFirstStructuredDocumentRegion();
 		if (flatNode == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		ITextRegionList regions = flatNode.getRegions();
 		if (regions == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 
 		ITextRegion targetRegion = null;
 		ITextRegion dataRegion = null;
@@ -109,7 +109,7 @@
 			}
 		}
 		if (dataRegion == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		int offset = dataRegion.getStart();
 		int end = flatNode.getLength();
 		if (closeRegion != null)
@@ -152,7 +152,7 @@
 	 */
 	public String getTarget() {
 		if (this.target == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		return this.target;
 	}
 
@@ -181,7 +181,7 @@
 	 */
 	public void setData(String data) throws DOMException {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.data = data;
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/RangeImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/RangeImpl.java
index f60336e..ad30e28 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/RangeImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/RangeImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -202,7 +202,7 @@
 			node2 = (IDOMNode) child;
 			offset2 = 0;
 		} else {
-			node2 = (IDOMNode) container1;
+			node2 = (IDOMNode) container2;
 		}
 		int nodeOffset2 = node2.getStartOffset();
 
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ReadOnlyController.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ReadOnlyController.java
index f80e718..57c2375 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ReadOnlyController.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/ReadOnlyController.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -250,7 +250,7 @@
 				lock(structuredDocument, offset, length, false, false);
 				offset = offset + span.offset + span.length;
 				length = flatNode.getEnd() - offset;
-				lock(structuredDocument, offset, length, canInsert, false);
+				lock(structuredDocument, offset, length, false, canInsert);
 			} else {
 				lock(flatNode, false, canInsert);
 			}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/SourceValidator.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/SourceValidator.java
index 66dd565..2051222 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/SourceValidator.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/SourceValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,10 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.xml.core.internal.XMLCoreMessages;
 import org.eclipse.wst.xml.core.internal.provisional.IXMLCharEntity;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
@@ -226,8 +230,8 @@
 			end = found + 2;
 		} else {
 			// normal tag
-			int found = source.indexOf('>', offset);
-			if (found < 0)
+			int found = source.lastIndexOf('>');
+			if (found < offset)
 				return -1; // invalid tag
 			end = found + 1;
 		}
@@ -243,6 +247,7 @@
 			return false; // error
 		String message = null;
 
+
 		// setup validation conditions
 		boolean acceptTag = false;
 		boolean acceptClose = false;
@@ -276,6 +281,10 @@
 					return false; // error
 				acceptTag = true;
 				acceptClose = true;
+			} else if(hasNestedRegion(text)) {
+				//there are cases (such as with EL) that the text is to complicated
+				//	to be verified by this validator
+				return true;
 			}
 		} else {
 			IDOMDocument document = null;
@@ -343,4 +352,37 @@
 
 		return true;
 	}
+	
+	/**
+	 * True if the text has nested regions, meaning container is probably too
+	 * complicated (like EL regions) to validate with this validator.
+	 *
+	 * @param text
+	 * @return
+	 */
+	private boolean hasNestedRegion(TextImpl text) {
+		boolean done = false;
+
+		IStructuredDocumentRegion currRegion = text.getFirstStructuredDocumentRegion();
+		IStructuredDocumentRegion lastRegion = text.getLastStructuredDocumentRegion();
+
+		while(currRegion != null && !done) {
+			
+			ITextRegionList regions = currRegion.getRegions();
+			for(int i = 0; i < regions.size(); ++i) {
+				ITextRegion container = regions.get(i);
+				if ((container instanceof ITextRegionContainer)) {
+					ITextRegionList regions2 = ((ITextRegionContainer) container).getRegions();
+					if (regions2 != null) {
+						return true;
+					}
+				}
+			}
+
+			done = currRegion == lastRegion;
+			currRegion = currRegion.getNext();
+		}
+
+		return false;
+	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionContainer.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionContainer.java
index 1a53784..245211d 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionContainer.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionContainer.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -238,7 +238,7 @@
 	public String getText() {
 		int size = this.flatNodes.size();
 		if (size == 0)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		StringBuffer buffer = new StringBuffer();
 		for (int i = 0; i < size; i++) {
 			IStructuredDocumentRegion flatNode = (IStructuredDocumentRegion) this.flatNodes.elementAt(i);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionProxy.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionProxy.java
index cd11447..5312260 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionProxy.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionProxy.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -216,10 +216,10 @@
 	 */
 	public String getText() {
 		if (this.flatNode == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		String text = this.flatNode.getText();
 		if (text == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		int end = this.offset + this.length;
 		return text.substring(this.offset, end);
 	}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionUtil.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionUtil.java
index 4bd9b81..84a378b 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionUtil.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/StructuredDocumentRegionUtil.java
@@ -75,6 +75,9 @@
 	 * Returns the first region.
 	 */
 	static ITextRegion getFirstRegion(IStructuredDocumentRegion flatNode) {
+		if(flatNode instanceof StructuredDocumentRegionProxy) {
+			flatNode = ((StructuredDocumentRegionProxy)flatNode).getStructuredDocumentRegion();
+		}
 		if (flatNode == null)
 			return null;
 		ITextRegionList regions = flatNode.getRegions();
@@ -87,6 +90,9 @@
 	 * Returns the type of the first region.
 	 */
 	static String getFirstRegionType(IStructuredDocumentRegion flatNode) {
+		if(flatNode instanceof StructuredDocumentRegionProxy) {
+			flatNode = ((StructuredDocumentRegionProxy)flatNode).getStructuredDocumentRegion();
+		}
 		if (flatNode == null)
 			return DOMRegionContext.UNDEFINED;
 		ITextRegionList regions = flatNode.getRegions();
@@ -114,6 +120,9 @@
 	 * Returns the last region.
 	 */
 	static ITextRegion getLastRegion(IStructuredDocumentRegion flatNode) {
+		if(flatNode instanceof StructuredDocumentRegionProxy) {
+			flatNode = ((StructuredDocumentRegionProxy)flatNode).getStructuredDocumentRegion();
+		}
 		if (flatNode == null)
 			return null;
 		ITextRegionList regions = flatNode.getRegions();
@@ -126,6 +135,9 @@
 	 * Returns the type of the first region.
 	 */
 	static String getLastRegionType(IStructuredDocumentRegion flatNode) {
+		if(flatNode instanceof StructuredDocumentRegionProxy) {
+			flatNode = ((StructuredDocumentRegionProxy)flatNode).getStructuredDocumentRegion();
+		}
 		if (flatNode == null)
 			return DOMRegionContext.UNDEFINED;
 		ITextRegionList regions = flatNode.getRegions();
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/TextImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/TextImpl.java
index d386910..cad3207 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/TextImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/TextImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,12 +12,10 @@
  *     
  *     Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
  *     https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
-
-
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
@@ -30,7 +28,6 @@
 import org.w3c.dom.Text;
 import org.w3c.dom.UserDataHandler;
 
-
 /**
  * TextImpl class
  */
@@ -90,7 +87,7 @@
 			return;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		String newSource = getSource(arg);
@@ -140,7 +137,7 @@
 			return;
 
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		TextImpl text = (TextImpl) newText;
@@ -179,15 +176,15 @@
 		if (count == 0)
 			return;
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		if (count < 0 || offset < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String source = getSource();
 		if (source == null || source.length() == 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		StringPair pair = substringSourceExcluded(source, offset, count);
 		if (pair == null)
@@ -204,7 +201,7 @@
 				source = second;
 		}
 		if (source == null)
-			source = new String(); // delete all
+			source = NodeImpl.EMPTY_STRING; // delete all
 		setTextSource(source);
 	}
 
@@ -226,7 +223,7 @@
 	 */
 	private String getData(IStructuredDocumentRegion flatNode) {
 		if (flatNode == null)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 
 		if (flatNode instanceof StructuredDocumentRegionContainer) {
 			StructuredDocumentRegionContainer container = (StructuredDocumentRegionContainer) flatNode;
@@ -430,16 +427,16 @@
 		if (arg == null || arg.length() == 0)
 			return;
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		if (offset < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String source = getSource();
 		if (source == null || source.length() == 0) {
 			if (offset > 0) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			source = getSource(arg);
 			if (source != null)
@@ -511,20 +508,20 @@
 		if (newText == null)
 			return;
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		TextImpl text = (TextImpl) newText;
 		String newSource = text.getSource();
-		if (newSource == null && newSource.length() == 0)
+		if (newSource == null || newSource.length() == 0)
 			return;
 		if (offset < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String source = getSource();
 		if (source == null || source.length() == 0) {
 			if (offset > 0) {
-				throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+				throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 			}
 			setTextSource(newSource);
 			return;
@@ -737,7 +734,7 @@
 	 */
 	public void replaceData(int offset, int count, String arg) throws DOMException {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		if (arg == null || arg.length() == 0) {
 			deleteData(offset, count);
@@ -748,12 +745,12 @@
 			return;
 		}
 		if (offset < 0 || count < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String source = getSource();
 		if (source == null || source.length() == 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		StringPair pair = substringSourceExcluded(source, offset, count);
@@ -852,7 +849,7 @@
 	 */
 	public void setData(String data) throws DOMException {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.fSource = null;
@@ -863,7 +860,7 @@
 	 */
 	public void setSource(String source) throws InvalidCharacterException {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		SourceValidator validator = new SourceValidator(this);
@@ -883,7 +880,7 @@
 	 */
 	public void setTextSource(String source) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		this.fSource = source;
@@ -895,7 +892,7 @@
 	 */
 	public void setValueSource(String source) {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 
 		SourceValidator validator = new SourceValidator(this);
@@ -911,14 +908,14 @@
 	 */
 	public Text splitText(int offset) throws DOMException {
 		if (!isDataEditable()) {
-			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, new String());
+			throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
 		}
 		if (offset < 0) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		int length = getLength();
 		if (offset > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		Document document = getOwnerDocument();
 		if (document == null)
@@ -1005,17 +1002,17 @@
 	private String substringData(String data, int offset, int count) throws DOMException {
 		// sure offset and count are non-negative
 		if (count == 0)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		if (data == null) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		int length = data.length();
 		if (offset > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		int end = offset + count;
 		if (end > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 		return data.substring(offset, end);
 	}
@@ -1033,7 +1030,7 @@
 		if (data != null && data.length() > 0) {
 			data = substringData(data, offset, count);
 			if (data == null)
-				return new String();
+				return NodeImpl.EMPTY_STRING;
 			String source = getSource(data);
 			if (source != null)
 				return source;
@@ -1049,9 +1046,9 @@
 	private String substringSource(String source, int offset, int count) throws DOMException {
 		// sure offset and count are non-negative
 		if (count == 0)
-			return new String();
+			return NodeImpl.EMPTY_STRING;
 		if (source == null) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		int length = source.length();
@@ -1079,7 +1076,7 @@
 		}
 
 		if (offset > length || end > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		return source.substring(offset, end);
@@ -1094,7 +1091,7 @@
 		if (source == null) {
 			if (offset == 0 && count == 0)
 				return new StringPair(null, null);
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		int length = source.length();
@@ -1122,7 +1119,7 @@
 		}
 
 		if (offset > length || end > length) {
-			throw new DOMException(DOMException.INDEX_SIZE_ERR, new String());
+			throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
 		}
 
 		String first = (offset > 0 ? source.substring(0, offset) : null);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/UserData.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/UserData.java
new file mode 100644
index 0000000..695ff71
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/UserData.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.core.internal.document;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.w3c.dom.Node;
+
+/**
+ * Collects user data associated to a Node.
+ * 
+ */
+final class UserData {
+
+	private static UserData fInstance;
+
+	/**
+	 * Mapping of a Node to its User Data table (represented by a Map)
+	 */
+	private Map fData;
+
+	private UserData() {
+		fData = new WeakHashMap(0);
+	}
+
+	public static synchronized UserData getInstance() {
+		if (fInstance == null)
+			fInstance = new UserData();
+		return fInstance;
+	}
+
+	/**
+	 * Get the user data table associated with <code>node</code>.
+	 * 
+	 * @param node the node
+	 * @return the user data table associated with the <code>node</code>
+	 */
+	public synchronized Map getUserDataTable(Node node) {
+		if (fData.containsKey(node))
+			return (Map) fData.get(node);
+		Map table = new HashMap();
+		fData.put(node, table);
+		return table;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelNotifierImpl.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelNotifierImpl.java
index a518f84..75f89a0 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelNotifierImpl.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelNotifierImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,10 +12,11 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
-import java.util.Vector;
 
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.eclipse.wst.sse.core.internal.util.Debug;
@@ -28,8 +29,7 @@
 
 public class XMLModelNotifierImpl implements XMLModelNotifier {
 
-	/* end: for debugging only */
-	private class NotifyEvent {
+	private static class NotifyEvent {
 		Object changedFeature;
 		boolean discarded;
 		Object newValue;
@@ -65,7 +65,7 @@
 
 	private boolean changing = false;
 	private boolean doingNewModel = false;
-	private Vector events = null;
+	private List fEvents = null;
 	private boolean flushing = false;
 
 	/**
@@ -119,13 +119,13 @@
 
 	public void cancelPending() {
 		// we don't want to change the size of this array, since
-		// the array may be being processed, in the defferred notification
+		// the array may be being processed, in the deferred notification
 		// loop, but we can signal that all
 		// should be discarded, so any remaining ones will be ignored.
-		if (this.events != null) {
-			Iterator iterator = this.events.iterator();
-			while (iterator.hasNext()) {
-				NotifyEvent event = (NotifyEvent) iterator.next();
+		if (this.fEvents != null) {
+			int size = fEvents.size();
+			for (int i = 0; i < size; i++) {
+				NotifyEvent event = (NotifyEvent) fEvents.get(i);
 				event.discarded = true;
 			}
 		}
@@ -180,7 +180,7 @@
 			notifyStructureChanged(this.changedRoot);
 			if (Debug.debugNotifyDeferred) {
 				String p = this.changedRoot.getNodeName();
-				System.out.println("Deferred STRUCUTRE_CHANGED: " + p); //$NON-NLS-1$
+				System.out.println("Deferred STRUCTURE_CHANGED: " + p); //$NON-NLS-1$
 			}
 			this.changedRoot = null;
 		}
@@ -201,7 +201,7 @@
 	/**
 	 */
 	public boolean hasChanged() {
-		return (this.events != null);
+		return (this.fEvents != null);
 	}
 
 	/**
@@ -217,15 +217,15 @@
 			return;
 		if (this.changing && !this.flushing) {
 			// defer notification
-			if (this.events == null)
-				this.events = new Vector();
+			if (this.fEvents == null)
+				this.fEvents = new ArrayList();
 			// we do not defer anything if we are doing a new Model,
 			// except for the document event, since all others are
 			// trivial and not needed at that initial point.
 			// But even for that one document event, in the new model case,
 			// it is still important to defer it.
 			if ((!doingNewModel) || (((Node) notifier).getNodeType() == Node.DOCUMENT_NODE)) {
-				this.events.addElement(new NotifyEvent(notifier, eventType, changedFeature, oldValue, newValue, pos));
+				this.fEvents.add(new NotifyEvent(notifier, eventType, changedFeature, oldValue, newValue, pos));
 			}
 			return;
 		}
@@ -244,30 +244,30 @@
 	/**
 	 */
 	private void notifyDeferred() {
-		if (this.events == null)
+		if (this.fEvents == null)
 			return;
 		if (this.flushing)
 			return;
 		this.flushing = true; // force notification
-		int count = this.events.size();
+		int count = this.fEvents.size();
+		
 		if (!doingNewModel && fOptimizeDeferred) {
-			Map values = new HashMap();
+			Map notifyEvents = new HashMap();
 			for (int i = 0; i < count; i++) {
-				NotifyEvent event = (NotifyEvent) this.events.elementAt(i);
+				NotifyEvent event = (NotifyEvent) this.fEvents.get(i);
 				if (event == null)
 					continue; // error
 				event.index = i;
 				if(event.type == INodeNotifier.REMOVE) {
-					addToMap(event.oldValue, event, values);
+					addToMap(event.oldValue, event, notifyEvents);
 				}
 				if(event.type == INodeNotifier.ADD) {
-					addToMap(event.newValue, event, values);
+					addToMap(event.newValue, event, notifyEvents);
 				}
 			}
-			Iterator it = values.keySet().iterator();
-			while(it.hasNext()) {
-				Object value = it.next();
-				NotifyEvent[] es = (NotifyEvent[])values.get(value);
+			Iterator it = notifyEvents.values().iterator();
+			while (it.hasNext()) {
+				NotifyEvent[] es = (NotifyEvent[]) it.next();
 				for (int i = 0; i < es.length - 1; i++) {
 					NotifyEvent event = es[i];
 					if(es[i].discarded) continue;
@@ -284,13 +284,13 @@
 				}
 			}
 			for (int i = 0; i < count; i++) {
-				NotifyEvent event = (NotifyEvent) this.events.elementAt(i);
+				NotifyEvent event = (NotifyEvent) this.fEvents.get(i);
 				if (event == null)
 					continue; // error
 				if(event.discarded) continue;
 				if (event.notifier != null && fOptimizeDeferredAccordingToParentAdded) {
 					if (event.type == INodeNotifier.ADD) {
-						NotifyEvent[] es = (NotifyEvent[])values.get(event.notifier);
+						NotifyEvent[] es = (NotifyEvent[])notifyEvents.get(event.notifier);
 						if(es != null) for (int p = 0; p < es.length && es[p].index < event.index; p++) {
 							NotifyEvent prev = es[p];
 							if (prev.type == INodeNotifier.REMOVE && prev.oldValue == event.notifier) {
@@ -313,7 +313,7 @@
 				if(event.discarded) continue;
 				if (event.notifier != null && fOptimizeDeferredAccordingToParentRemoved) {
 					if (event.type == INodeNotifier.REMOVE) {
-						NotifyEvent[] es = (NotifyEvent[])values.get(event.notifier);
+						NotifyEvent[] es = (NotifyEvent[])notifyEvents.get(event.notifier);
 						if(es != null) for (int n = 0; n < es.length; n++) {
 							NotifyEvent next = es[n];
 							if(next.index > event.index && next.type == INodeNotifier.REMOVE) {
@@ -333,7 +333,7 @@
 			}
 		}
 		for (int i = 0; i < count; i++) {
-			NotifyEvent event = (NotifyEvent) this.events.elementAt(i);
+			NotifyEvent event = (NotifyEvent) this.fEvents.get(i);
 			if (event == null)
 				continue; // error
 			if(event.discarded) continue;
@@ -341,7 +341,7 @@
 		}
 		if (Debug.debugNotifyDeferred) {
 			for (int l = 0; l < count; l++) {
-				NotifyEvent event = (NotifyEvent) this.events.elementAt(l);
+				NotifyEvent event = (NotifyEvent) this.fEvents.get(l);
 				Object o = null;
 				String t = null;
 				if (event.type == INodeNotifier.ADD) {
@@ -360,7 +360,7 @@
 			}
 		}
 		this.flushing = false;
-		this.events = null;
+		this.fEvents = null;
 	}
 
 	void addToMap(Object o, NotifyEvent event, Map map) {
@@ -443,13 +443,13 @@
 			setCommonRootIfNeeded(node);
 			if (Debug.debugNotifyDeferred) {
 				String p = this.changedRoot.getNodeName();
-				System.out.println("requested STRUCUTRE_CHANGED: " + p); //$NON-NLS-1$
+				System.out.println("requested STRUCTURE_CHANGED: " + p); //$NON-NLS-1$
 			}
 			return;
 		}
 		if (Debug.debugNotifyDeferred) {
 			String p = node.getNodeName();
-			System.out.println("STRUCUTRE_CHANGED: " + p); //$NON-NLS-1$
+			System.out.println("STRUCTURE_CHANGED: " + p); //$NON-NLS-1$
 		}
 		notifyStructureChanged(node);
 	}
@@ -467,7 +467,7 @@
 		if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
 			Attr attr = (Attr) node;
 			notifier = (IDOMNode) attr.getOwnerElement();
-			// TODO_dmw: experimental: changed 06/29/2004 to send "strucuture
+			// TODO_dmw: experimental: changed 06/29/2004 to send "structuure
 			// changed" even for attribute value changes
 			// there are pros and cons to considering attribute value
 			// "structure changed". Will (re)consider
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelParser.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelParser.java
index 06d25f8..9f893bb 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelParser.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,10 +14,11 @@
 
 
 
-import java.util.Enumeration;
+import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.Vector;
+import java.util.List;
 
+import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
@@ -41,6 +42,7 @@
 public class XMLModelParser {
 	private XMLModelContext context = null;
 	private DOMModelImpl model = null;
+	private TextImpl lastTextNode = null;
 
 	/**
 	 */
@@ -296,12 +298,20 @@
 	 * changeRegion method
 	 * 
 	 */
-	void changeRegion(IStructuredDocumentRegion flatNode, ITextRegion region) {
+	void changeRegion(RegionChangedEvent change, IStructuredDocumentRegion flatNode, ITextRegion region) {
 		if (flatNode == null || region == null)
 			return;
 		if (this.model.getDocument() == null)
 			return;
 		this.context = new XMLModelContext(this.model.getDocument());
+		
+		//determine if change was whitespace only change
+		boolean isWhitespaceChange = false;
+		if(change.getText() != null && change.getText().length() > 0) {
+			isWhitespaceChange = Character.isWhitespace(change.getText().charAt(0));
+		} else if(change.getDeletedText() != null && change.getDeletedText().length() > 0) {
+			isWhitespaceChange = Character.isWhitespace(change.getDeletedText().charAt(0));
+		}
 
 		// optimize typical cases
 		String regionType = region.getType();
@@ -309,15 +319,31 @@
 			changeData(flatNode, region);
 		}
 		else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+			if (isWhitespaceChange && (change.getOffset() >= flatNode.getStartOffset() + region.getTextEnd())) {
+				// change is entirely in white-space
+				return;
+			}
 			changeAttrName(flatNode, region);
 		}
 		else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+			if (isWhitespaceChange && (change.getOffset() >= flatNode.getStartOffset() + region.getTextEnd())) {
+				// change is entirely in white-space
+				return;
+			}
 			changeAttrValue(flatNode, region);
 		}
 		else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+			if (isWhitespaceChange && (change.getOffset() >= flatNode.getStartOffset() + region.getTextEnd())) {
+				// change is entirely in white-space
+				return;
+			}
 			changeAttrEqual(flatNode, region);
 		}
 		else if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTagName(regionType)) {
+			if (isWhitespaceChange && (change.getOffset() >= flatNode.getStartOffset() + region.getTextEnd())) {
+				// change is entirely in white-space
+				return;
+			}
 			changeTagName(flatNode, region);
 		}
 		else {
@@ -636,6 +662,10 @@
 	/**
 	 */
 	private void cleanupText() {
+		if (lastTextNode != null) {
+			lastTextNode.notifyValueChanged();
+			lastTextNode = null;
+		}
 		Node parent = this.context.getParentNode();
 		if (parent == null)
 			return; // error
@@ -892,7 +922,7 @@
 		if (regions == null)
 			return;
 
-		String data = null;
+		StringBuffer data = null;
 		boolean isJSPTag = false;
 		Iterator e = regions.iterator();
 		while (e.hasNext()) {
@@ -903,13 +933,16 @@
 			}
 			else if (regionType == DOMRegionContext.XML_COMMENT_TEXT || isNestedCommentText(regionType)) {
 				if (data == null) {
-					data = flatNode.getText(region);
+					data = new StringBuffer(flatNode.getText(region));
+				}
+				else {
+					data.append(flatNode.getText(region));
 				}
 			}
 		}
 
 		if (data != null) {
-			ElementImpl element = (ElementImpl) createCommentElement(data, isJSPTag);
+			ElementImpl element = (ElementImpl) createCommentElement(data.toString(), isJSPTag);
 			if (element != null) {
 				if (!isEndTag(element)) {
 					element.setStartStructuredDocumentRegion(flatNode);
@@ -1116,8 +1149,10 @@
 			if (text != null) { // existing text found
 				// do not append data
 				text.appendStructuredDocumentRegion(flatNode);
-				// notify the change
-				text.notifyValueChanged();
+				// Adjacent text nodes, where changes were queued
+				if (lastTextNode != null && lastTextNode != text)
+					lastTextNode.notifyValueChanged();
+				lastTextNode = text;
 				return;
 			}
 
@@ -1181,7 +1216,7 @@
 
 		String tagName = null;
 		AttrImpl attr = null;
-		Vector attrNodes = null;
+		List attrNodes = null;
 		boolean isCloseTag = false;
 		Iterator e = regions.iterator();
 		while (e.hasNext()) {
@@ -1199,8 +1234,8 @@
 				if (attr != null) {
 					attr.setNameRegion(region);
 					if (attrNodes == null)
-						attrNodes = new Vector();
-					attrNodes.addElement(attr);
+						attrNodes = new ArrayList();
+					attrNodes.add(attr);
 				}
 			}
 			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
@@ -1245,12 +1280,8 @@
 			return;
 		}
 		if (attrNodes != null) {
-			Enumeration ae = attrNodes.elements();
-			while (ae.hasMoreElements()) {
-				Attr a = (Attr) ae.nextElement();
-				if (a == null)
-					continue;
-				element.appendAttributeNode(a);
+			for (int i = 0; i < attrNodes.size(); i++) {
+				element.appendAttributeNode((Attr) attrNodes.get(i));
 			}
 		}
 		element.setJSPTag(true);
@@ -1279,75 +1310,36 @@
 	 *            org.w3c.dom.Node
 	 */
 	private void insertNode(Node node) {
-		if (node == null)
-			return;
-		if (this.context == null)
-			return;
-
-		Node parent = this.context.getParentNode();
-		if (parent == null)
-			return;
-		Node next = this.context.getNextNode();
-		while (parent.getNodeType() == Node.ELEMENT_NODE) {
-			ElementImpl element = (ElementImpl) parent;
-			if (canContain(element, node)) {
-				if (!element.hasStartTag() && next == element.getFirstChild()) {
-					// first child of implicit tag
-					// deletege to the parent
-					parent = element.getParentNode();
-					if (parent == null)
-						return;
-					next = element;
+		if(node != null && this.context != null) {
+			Node parent = this.context.getParentNode();
+			if(parent != null) {
+				Node next = this.context.getNextNode();
+				// Reset parents which are closed container elements; should not be parents
+				if(parent.getNodeType() == Node.ELEMENT_NODE) {
+					String type = ((ElementImpl)parent).getStartStructuredDocumentRegion().getLastRegion().getType();
+					if(((ElementImpl)parent).isContainer() && type == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+						next = parent.getNextSibling();
+						parent = parent.getParentNode();
+					}
+					else {
+						ModelParserAdapter adapter = getParserAdapter();
+						if (adapter != null) {
+							while (parent.getNodeType() == Node.ELEMENT_NODE && !adapter.canContain( (Element) parent, node) && adapter.isEndTagOmissible((Element) parent)) {
+								next = parent.getNextSibling();
+								parent = parent.getParentNode();
+							}
+						}
+					}
+				}	
+				insertNode(parent, node, next);
+				next = node.getNextSibling();
+				if (next != null) {
 					this.context.setNextNode(next);
-					continue;
-				}
-				break;
-			}
-			parent = element.getParentNode();
-			if (parent == null)
-				return;
-
-			// promote siblings
-			Node newNext = element.getNextSibling();
-			Node child = next;
-			while (child != null) {
-				Node nextChild = child.getNextSibling();
-				element.removeChild(child);
-				parent.insertBefore(child, newNext);
-				child = nextChild;
-			}
-
-			// leave the old end tag where it is
-			if (element.hasEndTag()) {
-				Element end = element.removeEndTag();
-				if (end != null) {
-					parent.insertBefore(end, newNext);
-					if (next == null)
-						next = end;
+				} else {
+					this.context.setParentNode(node.getParentNode());
 				}
 			}
-			if (!element.hasStartTag()) {
-				// implicit element
-				if (!element.hasChildNodes()) {
-					parent.removeChild(element);
-				}
-			}
-
-			// update context
-			if (next == null)
-				next = newNext;
-			if (next != null)
-				this.context.setNextNode(next);
-			else
-				this.context.setParentNode(parent);
 		}
-
-		insertNode(parent, node, next);
-		next = node.getNextSibling();
-		if (next != null)
-			this.context.setNextNode(next);
-		else
-			this.context.setParentNode(node.getParentNode());
 	}
 
 	/**
@@ -1413,6 +1405,11 @@
 		if (newElement.isEmptyTag() || !newElement.isContainer())
 			return;
 
+		// Ignore container tags that have been closed
+		String type = newElement.getStartStructuredDocumentRegion().getLastRegion().getType();
+		if(newElement.isContainer() && type == DOMRegionContext.XML_EMPTY_TAG_CLOSE)
+			return;
+
 		// demote siblings
 		Node parent = this.context.getParentNode();
 		if (parent == null)
@@ -1440,7 +1437,7 @@
 		String tagName = null;
 		boolean isEmptyTag = false;
 		AttrImpl attr = null;
-		Vector attrNodes = null;
+		List attrNodes = null;
 		Iterator e = regions.iterator();
 		while (e.hasNext()) {
 			ITextRegion region = (ITextRegion) e.next();
@@ -1458,8 +1455,8 @@
 				if (attr != null) {
 					attr.setNameRegion(region);
 					if (attrNodes == null)
-						attrNodes = new Vector();
-					attrNodes.addElement(attr);
+						attrNodes = new ArrayList();
+					attrNodes.add(attr);
 				}
 			}
 			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
@@ -1492,12 +1489,8 @@
 			return;
 		}
 		if (attrNodes != null) {
-			Enumeration ae = attrNodes.elements();
-			while (ae.hasMoreElements()) {
-				Attr a = (Attr) ae.nextElement();
-				if (a == null)
-					continue;
-				element.appendAttributeNode(a);
+			for (int i = 0; i < attrNodes.size(); i++) {
+				element.appendAttributeNode((Attr) attrNodes.get(i));
 			}
 		}
 		if (isEmptyTag)
@@ -1512,6 +1505,7 @@
 	 */
 	protected void insertStructuredDocumentRegion(IStructuredDocumentRegion flatNode) {
 		String regionType = StructuredDocumentRegionUtil.getFirstRegionType(flatNode);
+		boolean isTextNode = false;
 		if (regionType == DOMRegionContext.XML_TAG_OPEN) {
 			insertStartTag(flatNode);
 		}
@@ -1523,6 +1517,7 @@
 		}
 		else if (regionType == DOMRegionContext.XML_ENTITY_REFERENCE || regionType == DOMRegionContext.XML_CHAR_REFERENCE) {
 			insertEntityRef(flatNode);
+			isTextNode = true;
 		}
 		else if (regionType == DOMRegionContext.XML_DECLARATION_OPEN) {
 			insertDecl(flatNode);
@@ -1538,6 +1533,13 @@
 		}
 		else {
 			insertText(flatNode);
+			isTextNode = true;
+		}
+
+		// Changes to text regions are queued up, and once the value is done changing a notification is sent
+		if (!isTextNode && lastTextNode != null) {
+			lastTextNode.notifyValueChanged();
+			lastTextNode = null;
 		}
 	}
 
@@ -1576,8 +1578,10 @@
 		TextImpl text = (TextImpl) this.context.findPreviousText();
 		if (text != null) { // existing text found
 			text.appendStructuredDocumentRegion(flatNode);
-			// notify the change
-			text.notifyValueChanged();
+			// Adjacent text nodes, where changes were queued
+			if (lastTextNode != null && lastTextNode != text)
+				lastTextNode.notifyValueChanged();
+			lastTextNode = text;
 			return;
 		}
 
@@ -2330,12 +2334,9 @@
 			setupContext(oldStructuredDocumentRegions.item(0));
 			// Node startParent = this.context.getParentNode();
 
-			Enumeration e = oldStructuredDocumentRegions.elements();
-			while (e.hasMoreElements()) {
-				IStructuredDocumentRegion flatNode = (IStructuredDocumentRegion) e.nextElement();
-				if (flatNode == null)
-					continue;
-				removeStructuredDocumentRegion(flatNode);
+			for (int i = 0; i < oldCount; i++) {
+				IStructuredDocumentRegion documentRegion = oldStructuredDocumentRegions.item(i);
+				removeStructuredDocumentRegion(documentRegion);
 			}
 		}
 		else {
@@ -2348,12 +2349,9 @@
 		this.context.setLast();
 
 		if (newCount > 0) {
-			Enumeration e = newStructuredDocumentRegions.elements();
-			while (e.hasMoreElements()) {
-				IStructuredDocumentRegion flatNode = (IStructuredDocumentRegion) e.nextElement();
-				if (flatNode == null)
-					continue;
-				insertStructuredDocumentRegion(flatNode);
+			for (int i = 0; i < newCount; i++) {
+				IStructuredDocumentRegion documentRegion = newStructuredDocumentRegions.item(i);
+				insertStructuredDocumentRegion(documentRegion);
 			}
 		}
 
@@ -2374,7 +2372,7 @@
 			return;
 
 		if (offset == 0) {
-			// at the beggining of document
+			// at the beginning of document
 			Node child = root.getFirstChild();
 			if (child != null)
 				this.context.setNextNode(child);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelUpdater.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelUpdater.java
index a4efc2d..a92b233 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelUpdater.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/document/XMLModelUpdater.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.document;
 
@@ -17,6 +17,7 @@
 import java.util.Enumeration;
 import java.util.Iterator;
 
+import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
@@ -81,7 +82,7 @@
 
 		String name = attr.getName();
 		if (name == null)
-			name = new String();
+			name = NodeImpl.EMPTY_STRING;
 		ITextRegion nameRegion = attr.getNameRegion();
 		if (nameRegion == null)
 			return; // error
@@ -139,7 +140,7 @@
 
 			value = this.generator.generateAttrValue(attr, quote);
 			if (value == null) {
-				value = new String();
+				value = NodeImpl.EMPTY_STRING;
 				// remove equal too
 				ITextRegion equalRegion = attr.getEqualRegion();
 				if (equalRegion != null)
@@ -159,7 +160,7 @@
 			if (value == null) {
 				if (equalRegion == null)
 					return; // nothng to do
-				value = new String();
+				value = NodeImpl.EMPTY_STRING;
 				// remove equal
 				start += equalRegion.getStart();
 				end += equalRegion.getTextEnd();
@@ -232,8 +233,11 @@
 		return;
 	}
 
-	void changeRegion(IStructuredDocumentRegion flatNode, ITextRegion region) {
-		// future_TODO: optimize
+	void changeRegion(RegionChangedEvent change, IStructuredDocumentRegion flatNode, ITextRegion region) {
+		if (change.getOffset() >= flatNode.getStartOffset() + region.getTextEnd()) {
+			// change is entirely in white-space
+			return;
+		}
 
 		NodeImpl root = (NodeImpl) this.model.getDocument();
 		this.parentNode = root;
@@ -521,7 +525,7 @@
 
 		String source = this.generator.generateSource(text);
 		if (source == null)
-			source = new String();
+			source = NodeImpl.EMPTY_STRING;
 		int length = source.length();
 
 		TextImpl impl = (TextImpl) text;
@@ -603,7 +607,7 @@
 
 		String source = this.generator.generateSource(node);
 		if (source == null)
-			source = new String();
+			source = NodeImpl.EMPTY_STRING;
 		int length = source.length();
 
 		NodeImpl impl = (NodeImpl) node;
@@ -1484,7 +1488,7 @@
 				else {
 					String content = this.generator.generateSource(node);
 					if (content == null)
-						content = new String();
+						content = NodeImpl.EMPTY_STRING;
 					int length = content.length();
 					IStructuredDocumentRegion flatNode = null;
 					if (length > 0) {
@@ -1586,7 +1590,7 @@
 	private void replaceSource(String source, int start, int end) {
 		int inserted = 0;
 		if (source == null)
-			source = new String();
+			source = NodeImpl.EMPTY_STRING;
 		else
 			inserted = source.length();
 		int removed = end - start;
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java
index a3785cf..66b4b8d 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/DefaultXMLPartitionFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,11 +7,11 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     David Carver (STAR) - bug 297006 - String Comparison
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.formatter;
 
 import java.util.Iterator;
-import java.util.List;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.text.BadLocationException;
@@ -35,10 +35,6 @@
 import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
@@ -67,6 +63,7 @@
 	static private final String XSL_ATTRIBUTE = "attribute"; //$NON-NLS-1$
 	static private final String XSL_TEXT = "text"; //$NON-NLS-1$
 	static private final String SPACE = " "; //$NON-NLS-1$
+	static private final String EMPTY = ""; //$NON-NLS-1$
 	static private final String PROPERTY_WHITESPACE_FACET = "org.eclipse.wst.xsd.cm.properties/whitespace"; //$NON-NLS-1$
 
 	private XMLFormattingPreferences fPreferences = null;
@@ -186,7 +183,7 @@
 				XMLFormattingConstraints parentConstraints = getRegionConstraints(currentDOMNode);
 				
 				/* if the whitespace strategy is declared as default, get it from the preferences */
-				if(parentConstraints.getWhitespaceStrategy() == XMLFormattingConstraints.DEFAULT)
+				if(XMLFormattingConstraints.DEFAULT.equals(parentConstraints.getWhitespaceStrategy()))
 					parentConstraints.setWhitespaceStrategy(preferences.getElementWhitespaceStrategy());
 				
 				// TODO: initialize indentLevel
@@ -248,7 +245,7 @@
 			}
 			
 			/* A parent who has defined a specific whitespace strategy was found */
-			if(XMLFormattingConstraints.PRESERVE == result.getWhitespaceStrategy() || XMLFormattingConstraints.DEFAULT == result.getWhitespaceStrategy())
+			if(XMLFormattingConstraints.PRESERVE.equals(result.getWhitespaceStrategy()) || XMLFormattingConstraints.DEFAULT.equals(result.getWhitespaceStrategy()))
 				return result;
 		}
 		
@@ -290,17 +287,20 @@
 	 */
 	private void formatContent(TextEdit textEdit, Position formatRange, XMLFormattingConstraints parentConstraints, DOMRegion currentDOMRegion, IStructuredDocumentRegion previousRegion) {
 		IStructuredDocumentRegion currentRegion = currentDOMRegion.documentRegion;
-		String fullText = currentRegion.getFullText();
+		String fullText = currentDOMRegion.domNode.getSource();
 
 		// check if in preserve space mode, if so, don't touch anything but
 		// make sure to update available line width
 		String whitespaceMode = parentConstraints.getWhitespaceStrategy();
-		if (whitespaceMode == XMLFormattingConstraints.PRESERVE) {
+		if (XMLFormattingConstraints.PRESERVE.equals(whitespaceMode)) {
 			int availableLineWidth = parentConstraints.getAvailableLineWidth();
 			availableLineWidth = updateLineWidthWithLastLine(fullText, availableLineWidth);
 
 			// update available line width in constraints
 			parentConstraints.setAvailableLineWidth(availableLineWidth);
+			// A text node can contain multiple structured document regions - sync the documentRegion
+			// with the last region of the node since the text from all regions was formatted
+			currentDOMRegion.documentRegion = currentDOMRegion.domNode.getLastStructuredDocumentRegion();
 			return;
 		}
 
@@ -316,23 +316,26 @@
 		}
 
 		// special handling if text follows an entity or cdata region
-		if (whitespaceMode != XMLFormattingConstraints.COLLAPSE && previousRegion != null) {
+		if (!XMLFormattingConstraints.COLLAPSE.equals(whitespaceMode) && previousRegion != null) {
 			String previouRegionType = previousRegion.getType();
-			if (previouRegionType == DOMRegionContext.XML_ENTITY_REFERENCE || previouRegionType == DOMRegionContext.XML_CDATA_TEXT)
+			if (DOMRegionContext.XML_ENTITY_REFERENCE.equals(previouRegionType) || DOMRegionContext.XML_CDATA_TEXT.equals(previouRegionType))
 				whitespaceMode = XMLFormattingConstraints.COLLAPSE;
 		}
 		// also, special handling if text is before an entity or cdata region
-		if (whitespaceMode != XMLFormattingConstraints.COLLAPSE) {
+		if (!XMLFormattingConstraints.COLLAPSE.equals(whitespaceMode)) {
 			// get next document region if dont already have it
 			if (nextDocumentRegion == null)
 				nextDocumentRegion = currentRegion.getNext();
 			if (nextDocumentRegion != null) {
 				String nextRegionType = nextDocumentRegion.getType();
-				if (nextRegionType == DOMRegionContext.XML_ENTITY_REFERENCE || nextRegionType == DOMRegionContext.XML_CDATA_TEXT)
+				if (DOMRegionContext.XML_ENTITY_REFERENCE.equals(nextRegionType) || DOMRegionContext.XML_CDATA_TEXT.equals(nextRegionType))
 					whitespaceMode = XMLFormattingConstraints.COLLAPSE;
 			}
 		}
 		formatTextInContent(textEdit, parentConstraints, currentRegion, fullText, whitespaceMode);
+		// A text node can contain multiple structured document regions - sync the documentRegion
+		// with the last region of the node since the text from all regions was formatted
+		currentDOMRegion.documentRegion = currentDOMRegion.domNode.getLastStructuredDocumentRegion();
 	}
 
 	private void formatEmptyStartTagWithNoAttr(TextEdit textEdit, XMLFormattingConstraints constraints, IStructuredDocumentRegion currentDocumentRegion, IStructuredDocumentRegion previousDocumentRegion, int availableLineWidth, String indentStrategy, String whitespaceStrategy, ITextRegion currentTextRegion) {
@@ -349,7 +352,7 @@
 		}
 		availableLineWidth -= tagNameLineWidth;
 
-		if (indentStrategy == XMLFormattingConstraints.INLINE) {
+		if (XMLFormattingConstraints.INLINE.equals(indentStrategy)) {
 			// if was inlining, need to check if out of available line
 			// width
 			if (availableLineWidth < 0) {
@@ -365,7 +368,7 @@
 				// no need to indent
 				// just make sure to delete previous whitespace if
 				// needed
-				if ((previousDocumentRegion.getType() == DOMRegionContext.XML_CONTENT) && (previousDocumentRegion.getFullText().trim().length() == 0)) {
+				if ((DOMRegionContext.XML_CONTENT.equals(previousDocumentRegion.getType())) && (previousDocumentRegion.getFullText().trim().length() == 0)) {
 					availableLineWidth = collapseSpaces(textEdit, previousDocumentRegion.getStartOffset(), availableLineWidth, previousDocumentRegion.getFullText());
 				}
 			}
@@ -401,7 +404,7 @@
 		// do not format space before start tag if preserving spaces
 		if (whitespaceStrategy != XMLFormattingConstraints.PRESERVE) {
 			// format like indent strategy says
-			if (indentStrategy == XMLFormattingConstraints.INDENT || indentStrategy == XMLFormattingConstraints.NEW_LINE) {
+			if (XMLFormattingConstraints.INDENT.equals(indentStrategy) || XMLFormattingConstraints.NEW_LINE.equals(indentStrategy)) {
 				int availableLineWidth = indentIfPossible(textEdit, constraints, currentDocumentRegion, previousDocumentRegion, whitespaceStrategy, indentStrategy, false);
 				constraints.setAvailableLineWidth(availableLineWidth);
 			}
@@ -428,20 +431,20 @@
 	private DOMRegion formatRegion(TextEdit edit, Position formatRange, XMLFormattingConstraints parentConstraints, DOMRegion domRegion, IStructuredDocumentRegion previousRegion) {
 		IStructuredDocumentRegion currentRegion = domRegion.documentRegion;
 		String regionType = currentRegion.getType();
-		if (regionType == DOMRegionContext.XML_TAG_NAME) {
+		if (DOMRegionContext.XML_TAG_NAME.equals(regionType)) {
 			ITextRegion textRegion = currentRegion.getFirstRegion();
 			String textRegionType = textRegion.getType();
-			if (textRegionType == DOMRegionContext.XML_TAG_OPEN) {
+			if (DOMRegionContext.XML_TAG_OPEN.equals(textRegionType)) {
 				domRegion = formatStartTag(edit, formatRange, parentConstraints, domRegion, previousRegion);
 			}
-			else if (textRegionType == DOMRegionContext.XML_END_TAG_OPEN) {
+			else if (DOMRegionContext.XML_END_TAG_OPEN.equals(textRegionType)) {
 				formatEndTag(edit, formatRange, parentConstraints, domRegion, previousRegion);
 			}
 		}
-		else if (regionType == DOMRegionContext.XML_CONTENT) {
+		else if (DOMRegionContext.XML_CONTENT.equals(regionType) || domRegion.domNode.getNodeType() == Node.TEXT_NODE) {
 			formatContent(edit, formatRange, parentConstraints, domRegion, previousRegion);
 		}
-		else if (regionType == DOMRegionContext.XML_COMMENT_TEXT) {
+		else if (DOMRegionContext.XML_COMMENT_TEXT.equals(regionType)) {
 			formatComment(edit, formatRange, parentConstraints, domRegion, previousRegion);
 		}
 		else {
@@ -472,7 +475,7 @@
 
 			// need to make sure current document region and current
 			// dom node match up
-			if (currentRegion == currentDOMNode.getFirstStructuredDocumentRegion()) {
+			if (currentDOMNode.getFirstStructuredDocumentRegion().equals(currentRegion)) {
 				// format this document region/node, formatRegion will
 				// return the last node/region formatted
 				domRegion = formatRegion(edit, formatRange, parentConstraints, domRegion, previousRegion);
@@ -509,7 +512,7 @@
 		XMLFormattingConstraints childrenConstraints = new XMLFormattingConstraints();
 		updateFormattingConstraints(parentConstraints, thisConstraints, childrenConstraints, currentDOMRegion);
 
-		if(childrenConstraints.getWhitespaceStrategy() == XMLFormattingConstraints.DEFAULT)
+		if(XMLFormattingConstraints.DEFAULT.equals(childrenConstraints.getWhitespaceStrategy()))
 			childrenConstraints.setWhitespaceStrategy((new XMLFormattingPreferences()).getElementWhitespaceStrategy());
 			
 		String whitespaceStrategy = thisConstraints.getWhitespaceStrategy();
@@ -518,9 +521,9 @@
 
 		// format space before start tag
 		// do not format space before start tag if preserving spaces
-		if (whitespaceStrategy != XMLFormattingConstraints.PRESERVE) {
+		if (!XMLFormattingConstraints.PRESERVE.equals(whitespaceStrategy)) {
 			// format like indent strategy says
-			if (indentStrategy == XMLFormattingConstraints.INDENT || indentStrategy == XMLFormattingConstraints.NEW_LINE) {
+			if (XMLFormattingConstraints.INDENT.equals(indentStrategy) || XMLFormattingConstraints.NEW_LINE.equals(indentStrategy)) {
 				availableLineWidth = indentIfPossible(textEdit, thisConstraints, currentDocumentRegion, previousDocumentRegion, whitespaceStrategy, indentStrategy, true);
 				if (availableLineWidth > 0)
 					thisConstraints.setAvailableLineWidth(availableLineWidth);
@@ -546,7 +549,7 @@
 					DOMRegion childDOMRegion = new DOMRegion();
 					childDOMRegion.documentRegion = nextRegion;
 					childDOMRegion.domNode = childDOMNode;
-					if (nextRegion == childDOMNode.getFirstStructuredDocumentRegion()) {
+					if (nextRegion.equals(childDOMNode.getFirstStructuredDocumentRegion())) {
 						// format children. pass in child constraints
 						childDOMRegion = formatRegion(textEdit, formatRange, childrenConstraints, childDOMRegion, previousDocumentRegion);
 					}
@@ -587,9 +590,9 @@
 					ITextRegionList rs = nextRegion.getRegions();
 					if (rs.size() > 1) {
 						ITextRegion r = rs.get(0);
-						if (r != null && r.getType() == DOMRegionContext.XML_END_TAG_OPEN) {
+						if (r != null && DOMRegionContext.XML_END_TAG_OPEN.equals(r.getType())) {
 							r = rs.get(1);
-							if (r != null && r.getType() == DOMRegionContext.XML_TAG_NAME) {
+							if (r != null && DOMRegionContext.XML_TAG_NAME.equals(r.getType())) {
 								String tagName = nextRegion.getText(r);
 								if (tagName != null && tagName.equals(currentDOMNode.getNodeName()))
 									formatEndTag = true;
@@ -628,7 +631,7 @@
 		int tagNameLineWidth = currentTextRegion.getTextLength() + 2;
 		availableLineWidth -= tagNameLineWidth;
 
-		if (indentStrategy == XMLFormattingConstraints.INLINE) {
+		if (XMLFormattingConstraints.INLINE.equals(indentStrategy)) {
 			// if was inlining, need to check if out of available line
 			// width
 			if (availableLineWidth < 0) {
@@ -645,7 +648,7 @@
 				// just make sure to delete previous whitespace if
 				// needed
 				if (previousDocumentRegion != null) {
-					if (previousDocumentRegion.getType() == DOMRegionContext.XML_CONTENT) {
+					if (DOMRegionContext.XML_CONTENT.equals(previousDocumentRegion.getType())) {
 						String previousDocumentRegionText = previousDocumentRegion.getFullText();
 						if (previousDocumentRegionText.trim().length() == 0) {
 							availableLineWidth = collapseSpaces(textEdit, previousDocumentRegion.getStartOffset(), availableLineWidth, previousDocumentRegionText);
@@ -678,10 +681,10 @@
 		boolean forceInitialIndent = false;
 		int indentLevel = parentConstraints.getIndentLevel() + 1;
 		String indentMode = parentConstraints.getIndentStrategy();
-		if (indentMode == XMLFormattingConstraints.INDENT) {
+		if (XMLFormattingConstraints.INDENT.equals(indentMode)) {
 			forceInitialIndent = true;
 		}
-		if (indentMode == XMLFormattingConstraints.NEW_LINE) {
+		if (XMLFormattingConstraints.NEW_LINE.equals(indentMode)) {
 			indentLevel = parentConstraints.getIndentLevel();
 			forceInitialIndent = true;
 		}
@@ -715,12 +718,12 @@
 					}
 					else {
 						// just collapse spaces, but adjust for any indenting that may result from preserving line delimiters
-						if (whitespaceStart == 0 && whitespaceMode == XMLFormattingConstraints.IGNOREANDTRIM) {
+						if (whitespaceStart == 0 && XMLFormattingConstraints.IGNOREANDTRIM.equals(whitespaceMode)) {
 							// if ignore, trim
 							DeleteEdit deleteTrailing = new DeleteEdit(startOffset, whitespaceRun.length());
 							textEdit.addChild(deleteTrailing);
 						}
-						else if(whitespaceMode == XMLFormattingConstraints.REPLACE)
+						else if(XMLFormattingConstraints.REPLACE.equals(whitespaceMode))
 							availableLineWidth = replaceSpaces(textEdit, startOffset, availableLineWidth, whitespaceRun);
 						else
 							availableLineWidth = collapseAndIndent(textEdit, startOffset, availableLineWidth, indentLevel, whitespaceRun, currentRegion);
@@ -731,15 +734,15 @@
 				else {
 					// handle trailing whitespace
 					int whitespaceOffset = currentRegion.getStartOffset() + whitespaceStart;
-					if (whitespaceMode == XMLFormattingConstraints.REPLACE)
+					if (XMLFormattingConstraints.REPLACE.equals(whitespaceMode))
 						availableLineWidth = replaceSpaces(textEdit, whitespaceOffset, availableLineWidth, whitespaceRun);
-					else if (whitespaceMode == XMLFormattingConstraints.IGNOREANDTRIM) {
+					else if (XMLFormattingConstraints.IGNOREANDTRIM.equals(whitespaceMode)) {
 						// always trim
 						DeleteEdit deleteTrailing = new DeleteEdit(whitespaceOffset, whitespaceRun.length());
 						textEdit.addChild(deleteTrailing);
 					}
 					else if(getFormattingPreferences().getClearAllBlankLines()) {
-						if (whitespaceMode == XMLFormattingConstraints.IGNORE) {
+						if (XMLFormattingConstraints.IGNORE.equals(whitespaceMode)) {
 							// if ignore, trim
 							DeleteEdit deleteTrailing = new DeleteEdit(whitespaceOffset, whitespaceRun.length());
 							textEdit.addChild(deleteTrailing);
@@ -760,8 +763,9 @@
 				if (characterRunLength > 0) {
 					// indent if word is too long or forcing initial
 					// indent
-					availableLineWidth = availableLineWidth - characterRunLength;
-					if ((whitespaceMode == XMLFormattingConstraints.IGNORE || whitespaceMode == XMLFormattingConstraints.IGNOREANDTRIM) && (forceInitialIndent || (availableLineWidth <= 0))) {
+					// [243091] - characterRunLength should only be subtracted once or text formatting wraps prematurely
+					// availableLineWidth = availableLineWidth - characterRunLength;
+					if ((XMLFormattingConstraints.IGNORE.equals(whitespaceMode) || XMLFormattingConstraints.IGNOREANDTRIM.equals(whitespaceMode)) && (forceInitialIndent || (availableLineWidth <= 0))) {
 						// indent if not already indented
 						availableLineWidth = indentIfNotAlreadyIndented(textEdit, currentRegion, indentLevel, currentRegion.getStartOffset(), whitespaceRun);
 						// remember to subtract word length
@@ -786,23 +790,24 @@
 		String whitespaceStrategy = constraints.getWhitespaceStrategy();
 		int availableLineWidth = constraints.getAvailableLineWidth();
 		ITextRegionList textRegions = currentDocumentRegion.getRegions();
+		int currentNumberOfRegions = currentDocumentRegion.getNumberOfRegions();
 		int currentTextRegionIndex = 1;
 
 		ITextRegion currentTextRegion = textRegions.get(currentTextRegionIndex);
 		String currentType = currentTextRegion.getType();
 		// tag name should always be the first text region
-		if (currentType == DOMRegionContext.XML_TAG_NAME) {
+		if (DOMRegionContext.XML_TAG_NAME.equals(currentType) && currentTextRegionIndex < currentNumberOfRegions - 1) {
 			ITextRegion nextTextRegion = textRegions.get(currentTextRegionIndex + 1);
-			String nextType = nextTextRegion.getType();
-			if (nextType == DOMRegionContext.XML_TAG_CLOSE) {
+			// Bug 221279 - Some non well-formed documents will not contribute a next region
+			if (nextTextRegion != null && DOMRegionContext.XML_TAG_CLOSE.equals(nextTextRegion.getType())) {
 				// calculate available line width
 				int tagNameLineWidth = currentTextRegion.getTextLength() + 3;
 				availableLineWidth -= tagNameLineWidth;
 
-				if (indentStrategy == XMLFormattingConstraints.INLINE) {
+				if (XMLFormattingConstraints.INLINE.equals(indentStrategy)) {
 					// if was inlining, need to check if out of available line
 					// width - Whitespace may have been corrected in the text content
-					if (availableLineWidth < 0 && whitespaceStrategy == XMLFormattingConstraints.IGNORE) {
+					if (availableLineWidth < 0 && XMLFormattingConstraints.IGNORE.equals(whitespaceStrategy)) {
 						// need to deindent if possible
 						int lineWidth = indentIfPossible(textEdit, constraints, currentDocumentRegion, previousDocumentRegion, whitespaceStrategy, indentStrategy, false);
 						// update available line width
@@ -814,7 +819,7 @@
 						// just make sure to delete previous whitespace if
 						// needed
 						if (previousDocumentRegion != null) {
-							if (previousDocumentRegion.getType() == DOMRegionContext.XML_CONTENT) {
+							if (DOMRegionContext.XML_CONTENT.equals(previousDocumentRegion.getType())) {
 								String previousDocumentRegionText = previousDocumentRegion.getFullText();
 								if (previousDocumentRegionText.trim().length() == 0) {
 									availableLineWidth = collapseSpaces(textEdit, previousDocumentRegion.getStartOffset(), availableLineWidth, previousDocumentRegionText);
@@ -855,15 +860,15 @@
 		ITextRegion currentTextRegion = textRegions.get(currentTextRegionIndex);
 		String currentType = currentTextRegion.getType();
 		// tag name should always be the first text region
-		if (currentType == DOMRegionContext.XML_TAG_NAME) {
+		if (DOMRegionContext.XML_TAG_NAME.equals(currentType)) {
 			ITextRegion nextTextRegion = textRegions.get(currentTextRegionIndex + 1);
 			String nextType = (nextTextRegion != null) ? nextTextRegion.getType() : null;
-			if (nextType == DOMRegionContext.XML_TAG_CLOSE) {
+			if (DOMRegionContext.XML_TAG_CLOSE.equals(nextType)) {
 				// already at tag close
 				formatStartTagWithNoAttr(textEdit, constraints, currentDocumentRegion, previousDocumentRegion, availableLineWidth, indentStrategy, whitespaceStrategy, currentTextRegion);
 				return false;
 			}
-			else if (nextType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+			else if (DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(nextType)) {
 				// already at empty tag close
 				formatEmptyStartTagWithNoAttr(textEdit, constraints, currentDocumentRegion, previousDocumentRegion, availableLineWidth, indentStrategy, whitespaceStrategy, currentTextRegion);
 				return true;
@@ -881,7 +886,7 @@
 					int attributesCount = 0;
 					int i = 2;
 					while (i < textRegions.size() && attributesCount < 2) {
-						if (textRegions.get(i).getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)
+						if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(textRegions.get(i).getType()))
 							++attributesCount;
 					}
 					indentAllAttributes = (attributesCount > 1);
@@ -890,7 +895,7 @@
 				while ((currentTextRegionIndex + 1) < textRegions.size()) {
 					nextTextRegion = textRegions.get(currentTextRegionIndex + 1);
 					nextType = nextTextRegion.getType();
-					if (nextType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+					if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(nextType)) {
 						boolean indentAttribute = indentAllAttributes;
 						if (!indentAttribute)
 							indentAttribute = shouldIndentBeforeAttribute(constraints, textRegions, availableLineWidth, currentTextRegionIndex, currentTextRegion, nextTextRegion);
@@ -905,7 +910,7 @@
 							availableLineWidth -= (currentTextRegion.getTextLength() + 1);
 						}
 					}
-					else if (nextType == DOMRegionContext.XML_TAG_CLOSE) {
+					else if (DOMRegionContext.XML_TAG_CLOSE.equals(nextType)) {
 						// if need to align bracket on next line, indent
 						if (alignFinalBracket && spanMoreThan1Line) {
 							availableLineWidth = indentIfNotAlreadyIndented(textEdit, indentLevel, currentDocumentRegion, currentTextRegion);
@@ -922,7 +927,7 @@
 						constraints.setAvailableLineWidth(availableLineWidth);
 						return false;
 					}
-					else if (nextType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+					else if (DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(nextType)) {
 						int textLength = currentTextRegion.getTextLength();
 						int regionLength = currentTextRegion.getLength();
 
@@ -942,14 +947,14 @@
 						return true;
 					}
 					else {
-						if (currentType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME && nextType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+						if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(currentType) && DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS.equals(nextType)) {
 							if (currentTextRegion.getTextLength() < currentTextRegion.getLength()) {
 								deleteTrailingSpaces(textEdit, currentTextRegion, currentDocumentRegion);
 							}
 							// update available width
 							availableLineWidth -= currentTextRegion.getTextLength();
 						}
-						else if (currentType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS && nextType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+						else if (DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS.equals(currentType) && DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(nextType)) {
 							if (currentTextRegion.getTextLength() < currentTextRegion.getLength()) {
 								deleteTrailingSpaces(textEdit, currentTextRegion, currentDocumentRegion);
 							}
@@ -982,140 +987,135 @@
 		int lineWidth = parentConstraints.getAvailableLineWidth() - currentRegion.getFullText().length();
 		// Don't format if we're not exceeding the available line width, or if the whitespace
 		// strategy is to preserve whitespace - But update line width.
-		if(currentRegion == null ||	parentConstraints.getWhitespaceStrategy() == XMLFormattingConstraints.PRESERVE) {
+		if(currentRegion == null ||	XMLFormattingConstraints.PRESERVE.equals(parentConstraints.getWhitespaceStrategy()) || !fPreferences.getFormatCommentText()) {
 			parentConstraints.setAvailableLineWidth(lineWidth);
 			return;
 		}
-		
-		// If there is enough room, format the start of the comment tag if it
-		// is on its own line
-		if(lineWidth >= 0) {
-			parentConstraints.setAvailableLineWidth(lineWidth);
-			if(previousRegion.getType() == DOMRegionContext.XML_CONTENT) {
-				String delimiters = extractLineDelimiters(previousRegion.getFullText(), previousRegion);
-				// Format the comment if its on a newline
-				if(delimiters != null && delimiters.length() > 0)
-					textEdit.addChild(new ReplaceEdit(previousRegion.getStartOffset(), previousRegion.getLength(), delimiters + getIndentString(parentConstraints.getIndentLevel()+1)));
-			}
-			return;
-		}
-		
+
 		Iterator it = currentRegion.getRegions().iterator();
+		ITextRegion previous = null;
+		if (previousRegion == null)
+			previousRegion = currentRegion.getPrevious();
 		// Iterate over each text region of the comment
+		Node parent = currentDOMRegion.domNode.getParentNode();
 		while(it.hasNext()) {
 			ITextRegion text = (ITextRegion) it.next();
-			formatCommentTag(textEdit, parentConstraints, currentRegion, text);
+			String type = text.getType();
+			if (type == DOMRegionContext.XML_COMMENT_OPEN) {
+				int indentLevel = (parent != null && parent.getNodeType() == Node.DOCUMENT_NODE) ? 0 : 1;
+				int width = formatCommentStart(textEdit, parentConstraints, indentLevel, currentRegion, previousRegion, text);
+				parentConstraints.setAvailableLineWidth(width);
+			}
+			else if (type == DOMRegionContext.XML_COMMENT_TEXT) {
+				int indentLevel = (parent != null && parent.getNodeType() == Node.DOCUMENT_NODE) ? -1 : parentConstraints.getIndentLevel();
+				formatCommentContent(textEdit, parentConstraints, indentLevel, currentRegion, previous, text);
+			}
+			previous = text;
 		}
 	}
-	
-	/**
-	 * Handles formatting various portions of an XML comment. Because the XML
-	 * Comment is considered its own document region, there are cases where
-	 * the previous region must be referred to for proper indentation
-	 * consideration. Because of this, most of the special cases are
-	 * catering to the opening text region of the document region.
-	 * 
-	 * @param textEdit
-	 * @param parentConstraints
-	 * @param currentRegion
-	 * @param region
-	 */
-	private void formatCommentTag(TextEdit textEdit, XMLFormattingConstraints parentConstraints, IStructuredDocumentRegion currentRegion, ITextRegion region) {
-		int availableLineWidth = parentConstraints.getAvailableLineWidth();
-		int indentLevel = parentConstraints.getIndentLevel() + 1;
-		boolean initialIndent = false;
-		
-		// Indent the text of the comment an additional level
-		if(region.getType() == DOMRegionContext.XML_COMMENT_TEXT) {
-			indentLevel++;
-			initialIndent = true;
-		}
-		
-		int fullTextOffset = 0;
-		char[] fullTextArray = currentRegion.getFullText(region).toCharArray();
-		while (fullTextOffset < fullTextArray.length) {
-			// gather all whitespaces
-			String whitespaceRun = null;
-			
-			// If the region is a comment opening, the whitespace would actually come from the
-			// previous document region
-			if(region.getType() == DOMRegionContext.XML_COMMENT_OPEN && currentRegion.getPrevious() != null)
-				whitespaceRun = getCharacterRun(currentRegion.getPrevious().getFullText().toCharArray(), 0, true);
-			else
-				whitespaceRun = getCharacterRun(fullTextArray, fullTextOffset, true);
-			
-			if (whitespaceRun.length() > 0) {
-				// offset where whitespace starts
-				int whitespaceStart = fullTextOffset;
-				// update current offset in fullText for non comment-opening regions
-				if(region.getType() != DOMRegionContext.XML_COMMENT_OPEN)
-					fullTextOffset += whitespaceRun.length();
 
-				// gather following word
-				String characterRun = getCharacterRun(fullTextArray, fullTextOffset, false);
-				int characterRunLength = characterRun.length();
-				if (characterRunLength > 0) {
-					// indent if word is too long or forcing initial
-					// indent
-					availableLineWidth -= characterRunLength;
-					// offset where indent/collapse will happen - for comment-opening regions,
-					// this occurs in the previous document region
-					int startOffset = 0;
-					if(region.getType() == DOMRegionContext.XML_COMMENT_OPEN && currentRegion.getPrevious() != null)
-						startOffset = currentRegion.getPrevious().getStartOffset();
-					else
-						startOffset = currentRegion.getStartOffset(region) + whitespaceStart;
-					
-					if (region.getType() == DOMRegionContext.XML_COMMENT_OPEN || initialIndent || (availableLineWidth <= 0)) {
-						// indent if not already indented
-						availableLineWidth = indentIfNotAlreadyIndented(textEdit, currentRegion, indentLevel, startOffset, whitespaceRun);
-						// remember to subtract word length
-						availableLineWidth -= characterRunLength;
-						// Indented the first word of the comment
-						if(initialIndent)
-							initialIndent = false;
-					}
-					else {
-						// just collapse spaces
-						availableLineWidth = collapseSpaces(textEdit, startOffset, availableLineWidth, whitespaceRun);
-					}
+	private void formatCommentContent(TextEdit textEdit, XMLFormattingConstraints parentConstraints, int indentLevel, IStructuredDocumentRegion currentRegion, ITextRegion previous, ITextRegion region) {
+		int lineWidth = parentConstraints.getAvailableLineWidth() - currentRegion.getFullText(previous).length();
+		// If there's more text than line width available, format
+		String text = currentRegion.getFullText(region);
+		compressContent(textEdit, currentRegion, currentRegion.getStartOffset(region), indentLevel + 1, lineWidth, text);
+	}
 
-					fullTextOffset += characterRunLength;
+	private void compressContent(TextEdit textEdit, IStructuredDocumentRegion region, int startOffset, int indentLevel, int lineWidth, String text) {
+		int length = text.length();
+		int start = 0, end = 0;
+		char c = 0;
+		int resultLength = 0;
+		boolean joinLines = fPreferences.getJoinCommentLines();
+		boolean onOwnLine = false;
+
+		String indent = getIndentString(indentLevel + 1);
+
+		for (int i = 0; i < length; i++) {
+			c = text.charAt(i);
+			// Compress whitespace unless its a line delimiter and formatting does not permit joining lines
+			if (Character.isWhitespace(c)) {
+				if ((c != '\r' && c!= '\n') || joinLines) {
+					// Just came off of a word
+					if (start == end) {
+						start = end = i;
+					}
+					end++;
+					resultLength++;
 				}
 				else {
-					// handle trailing whitespace
-					int whitespaceOffset = currentRegion.getStartOffset(region) + whitespaceStart;
-					DeleteEdit deleteTrailing = new DeleteEdit(whitespaceOffset, whitespaceRun.length());
-					textEdit.addChild(deleteTrailing);
+					// correct the indent of this line
+					lineWidth = fPreferences.getMaxLineWidth();
+					resultLength = 0;
+					onOwnLine = true;
+
+					// Compress any whitespace before the line delimiter
+					if (start != end) {
+						int replaceLength = end - start;
+						textEdit.addChild(new ReplaceEdit(start + startOffset, replaceLength, EMPTY));
+						start = end = i;
+					}
 				}
 			}
 			else {
-				// gather word
-				String characterRun = getCharacterRun(fullTextArray, fullTextOffset, false);
-				int characterRunLength = characterRun.length();
-				if (characterRunLength > 0) {
-					// indent if word is too long or forcing initial
-					// indent
-					availableLineWidth = availableLineWidth - characterRunLength;
-
-					if ((region.getType() == DOMRegionContext.XML_COMMENT_CLOSE || region.getType() == DOMRegionContext.XML_COMMENT_OPEN) || initialIndent || (region.getType() == DOMRegionContext.XML_COMMENT_TEXT && availableLineWidth <= 0)) {
-						// indent if not already indented
-						availableLineWidth = indentIfNotAlreadyIndented(textEdit, currentRegion, indentLevel, currentRegion.getStartOffset(region), whitespaceRun);
-						// remember to subtract word length
-						availableLineWidth -= characterRunLength;
-						if(initialIndent)
-							initialIndent = false;
+				// Transitioned to a new word
+				if (start != end) {
+					int replaceLength = end - start;
+					if (onOwnLine) {
+						// If content is on its own line, replace leading whitespace with proper indent
+						textEdit.addChild(new ReplaceEdit(start + startOffset, replaceLength, indent));
+						resultLength -= (replaceLength - indent.length());
+						onOwnLine = false;
 					}
-					else {
-						// just collapse spaces
-						availableLineWidth -= characterRunLength;
+					else if (!(replaceLength == 1 && text.charAt(start) == ' ')) {
+						textEdit.addChild(new ReplaceEdit(start + startOffset, replaceLength, SPACE));
+						resultLength -= (replaceLength - 1);
 					}
-					fullTextOffset += characterRunLength;
+					start = end = i;
+					// Make sure the word starts on a new line
+					if (resultLength > lineWidth) {
+						lineWidth = fPreferences.getMaxLineWidth();
+						resultLength = 0;
+						textEdit.addChild(new InsertEdit(start + startOffset, getLineDelimiter(region) + indent));
+					}
 				}
+				// Word is immediately after line delimiters, indent appropriately
+				if (onOwnLine) {
+					textEdit.addChild(new InsertEdit(i + startOffset, indent));
+					onOwnLine = false;
+				}
+				resultLength++;
 			}
 		}
-		// update available line width
-		parentConstraints.setAvailableLineWidth(availableLineWidth);
+
+		// Clean up any dangling whitespace
+		int replaceLength = end - start;
+		indent = getIndentString(indentLevel);
+		if (replaceLength == 0) { // No trailing whitespace
+			textEdit.addChild(new InsertEdit(length + startOffset, (onOwnLine) ? indent : SPACE));
+		}
+		else {
+			String whitespace = text.substring(start);
+			String replacement = (onOwnLine) ? indent : SPACE;
+			if (!whitespace.equals(replacement)) {
+				textEdit.addChild(new ReplaceEdit(start + startOffset, replaceLength, replacement));
+			}
+		}
+	}
+
+	private int formatCommentStart(TextEdit textEdit, XMLFormattingConstraints parentConstraints, int indentLevel, IStructuredDocumentRegion currentRegion, IStructuredDocumentRegion previousRegion, ITextRegion region) {
+		int lineWidth = parentConstraints.getAvailableLineWidth();
+		if (previousRegion!=null&&(DOMRegionContext.XML_CONTENT.equals(previousRegion.getType()))) {
+			String previousText = previousRegion.getFullText();
+			String trailingWhitespace = getTrailingWhitespace(previousText);
+			String delimiters = extractLineDelimiters(trailingWhitespace, previousRegion);
+			if (delimiters != null && delimiters.length() > 0){// && previousText.length() == trailingWhitespace.length()) {
+				// Format the comment if it's on a new line
+				int offset = previousRegion.getEnd() - trailingWhitespace.length();
+				lineWidth = indentIfNotAlreadyIndented(textEdit, currentRegion, parentConstraints.getIndentLevel() + indentLevel, offset, trailingWhitespace);
+			}
+		}
+		return lineWidth;
 	}
 
 	/**
@@ -1149,7 +1149,7 @@
 	private String getTrailingWhitespace(String text) {
 		StringBuffer whitespaceRun = new StringBuffer();
 		int index = text.length() - 1;
-		while(index > 0) {
+		while(index >= 0) {
 			char c = text.charAt(index--);
 			if (Character.isWhitespace(c))
 				whitespaceRun.insert(0, c);
@@ -1264,19 +1264,19 @@
 		String previousRegionFullText = null;
 		String previousRegionType = null;
 
-		if ((whitespaceStrategy == XMLFormattingConstraints.IGNORE) || whitespaceStrategy == XMLFormattingConstraints.IGNOREANDTRIM) {
+		if ((XMLFormattingConstraints.IGNORE.equals(whitespaceStrategy)) || XMLFormattingConstraints.IGNOREANDTRIM.equals(whitespaceStrategy)) {
 			// if ignoring, need to check if previous region was cdata
 			previousRegionType = previousDocumentRegion.getType();
-			if (previousRegionType == DOMRegionContext.XML_CDATA_TEXT)
+			if (DOMRegionContext.XML_CDATA_TEXT.equals(previousRegionType))
 				canIndent = false;
 			else
 				canIndent = true;
 		}
-		else if (whitespaceStrategy == XMLFormattingConstraints.COLLAPSE) {
+		else if (XMLFormattingConstraints.COLLAPSE.equals(whitespaceStrategy)) {
 			// if collapsing, need to check if previous region ended in a
 			// whitespace
 			previousRegionType = previousDocumentRegion.getType();
-			if (previousRegionType == DOMRegionContext.XML_CONTENT) {
+			if (DOMRegionContext.XML_CONTENT.equals(previousRegionType)) {
 				previousRegionFullText = previousDocumentRegion.getFullText();
 				int length = previousRegionFullText.length();
 				if (length > 1)
@@ -1292,7 +1292,7 @@
 				previousRegionType = previousDocumentRegion.getType();
 
 			// get previous region's text if it was not previously retrieved
-			if (previousRegionFullText == null && previousRegionType == DOMRegionContext.XML_CONTENT)
+			if (previousRegionFullText == null && DOMRegionContext.XML_CONTENT.equals(previousRegionType))
 				previousRegionFullText = previousDocumentRegion.getFullText();
 
 			// if previous region was only whitespace, this may
@@ -1307,7 +1307,7 @@
 			}
 
 			int indentLevel = thisConstraints.getIndentLevel();
-			if (addIndent && indentStrategy == XMLFormattingConstraints.INDENT) {
+			if (addIndent && XMLFormattingConstraints.INDENT.equals(indentStrategy)) {
 				++indentLevel;
 				thisConstraints.setIndentLevel(indentLevel);
 			}
@@ -1358,7 +1358,7 @@
 				// still okay, so try next region
 				// something attrName=
 				ITextRegion textRegion = textRegions.get(currentTextRegionIndex + 2);
-				if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+				if (DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS.equals(textRegion.getType())) {
 					++currentWidth;
 					if (currentWidth > availableLineWidth)
 						indentAttribute = true;
@@ -1367,7 +1367,7 @@
 							// still okay, so try next region
 							// something attrName=attrValue
 							textRegion = textRegions.get(currentTextRegionIndex + 3);
-							if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+							if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(textRegion.getType())) {
 								currentWidth = +textRegion.getTextLength();
 								if (currentWidth > availableLineWidth)
 									indentAttribute = true;
@@ -1455,13 +1455,13 @@
 					boolean preserveFound = false;
 					while (i < textRegions.size() && !xmlSpaceFound) {
 						ITextRegion textRegion = textRegions.get(i);
-						if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+						if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(textRegion.getType())) {
 							String regionText = currentRegion.getText(textRegion);
 							if (XML_SPACE.equals(regionText)) {
 								if ((i + 1) < textRegions.size()) {
 									++i;
 									textRegion = textRegions.get(i);
-									if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS && ((i + 1) < textRegions.size())) {
+									if (DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS.equals(textRegion.getType()) && ((i + 1) < textRegions.size())) {
 										++i;
 										textRegion = textRegions.get(i);
 										regionText = currentRegion.getText(textRegion);
@@ -1552,15 +1552,16 @@
 								// look for xml:space in content model
 								CMNamedNodeMap cmAttributes = elementDeclaration.getAttributes();
 
-								CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(cmAttributes);
-								List nodes = ModelQueryUtil.getModelQuery(currentNode.getOwnerDocument()).getAvailableContent((Element) currentNode, elementDeclaration, ModelQuery.INCLUDE_ATTRIBUTES);
-								for (int k = 0; k < nodes.size(); k++) {
-									CMNode cmnode = (CMNode) nodes.get(k);
-									if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
-										allAttributes.put(cmnode);
-									}
-								}
-								cmAttributes = allAttributes;
+								// Not needed - we're looking for xml:space
+								//CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(cmAttributes);
+								//List nodes = ModelQueryUtil.getModelQuery(currentNode.getOwnerDocument()).getAvailableContent((Element) currentNode, elementDeclaration, ModelQuery.INCLUDE_ATTRIBUTES);
+								//for (int k = 0; k < nodes.size(); k++) {
+								//	CMNode cmnode = (CMNode) nodes.get(k);
+								//	if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+								//		allAttributes.put(cmnode);
+								//	}
+								//}
+								//cmAttributes = allAttributes;
 
 								// Check implied values from the DTD way.
 								CMAttributeDeclaration attributeDeclaration = (CMAttributeDeclaration) cmAttributes.getNamedItem(XML_SPACE);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/XMLFormattingPreferences.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/XMLFormattingPreferences.java
index 78711d9..61c1b46 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/XMLFormattingPreferences.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/formatter/XMLFormattingPreferences.java
@@ -27,6 +27,9 @@
 	private boolean fAlignFinalBracket = false;
 	private boolean fSpaceBeforeEmptyCloseTag = true;
 	private boolean fIndentMultipleAttributes = false;
+	private boolean fFormatCommentText = true;
+	private boolean fJoinCommentLines = false;
+
 	private String fPCDataWhitespaceStrategy = XMLFormattingConstraints.PRESERVE;
 	private String fTextIndentStrategy = XMLFormattingConstraints.INLINE;
 	private String fTextWhitespaceStrategy = XMLFormattingConstraints.COLLAPSE;
@@ -40,6 +43,9 @@
 	public XMLFormattingPreferences() {
 		Preferences preferences = XMLCorePlugin.getDefault().getPluginPreferences();
 		if (preferences != null) {
+			setFormatCommentText(preferences.getBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_TEXT));
+			setJoinCommentLines(preferences.getBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_JOIN_LINES));
+
 			setMaxLineWidth(preferences.getInt(XMLCorePreferenceNames.LINE_WIDTH));
 			setIndentMultipleAttributes(preferences.getBoolean(XMLCorePreferenceNames.SPLIT_MULTI_ATTRS));
 			setAlignFinalBracket(preferences.getBoolean(XMLCorePreferenceNames.ALIGN_END_BRACKET));
@@ -71,6 +77,10 @@
 		return fMaxLineWidth;
 	}
 
+	public boolean getFormatCommentText() {
+		return fFormatCommentText;
+	}
+
 	public boolean getAlignFinalBracket() {
 		return fAlignFinalBracket;
 	}
@@ -103,6 +113,18 @@
 		return fElementWhitespaceStrategy;
 	}
 	
+	public boolean getJoinCommentLines() {
+		return fJoinCommentLines;
+	}
+
+	public void setJoinCommentLines(boolean joinCommentLines) {
+		fJoinCommentLines = joinCommentLines;
+	}
+
+	public void setFormatCommentText(boolean formatCommentText) {
+		fFormatCommentText = formatCommentText;
+	}
+
 	public void setSpaceBeforeEmptyCloseTag(boolean spaceBeforeEmptyCloseTag) {
 		fSpaceBeforeEmptyCloseTag = spaceBeforeEmptyCloseTag;
 	}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelhandler/EmbeddedXML.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelhandler/EmbeddedXML.java
index 566b6ef..abff1a4 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelhandler/EmbeddedXML.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelhandler/EmbeddedXML.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,7 +16,7 @@
 import java.util.List;
 
 import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
-import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
+import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
 import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
 import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryAdapterFactoryForEmbeddedXML;
 
@@ -63,10 +63,7 @@
 		//TODO: initialize
 	}
 
-	/*
-	 * @see EmbeddedContentType#initializeParser(RegionParser)
-	 */
-	public void initializeParser(JSPCapableParser parser) {
+	public void initializeParser(RegionParser parser) {
 		// nothing to initialize for "pure" XML
 		// compare with XHTML
 	}
@@ -84,7 +81,7 @@
 
 	}
 
-	public void uninitializeParser(JSPCapableParser parser) {
+	public void uninitializeParser(RegionParser parser) {
 		// need to undo anything we did in initialize
 	}
 
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/ContextRegionContainer.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/ContextRegionContainer.java
index a13f814..0de3302 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/ContextRegionContainer.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/ContextRegionContainer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -149,16 +149,29 @@
 	public ITextRegion getRegionAtCharacterOffset(int offset) {
 		ITextRegion result = null;
 		if (regions != null) {
+			int thisStartOffset = getStartOffset();
+			if (offset < thisStartOffset)
+				return null;
+			int thisEndOffset = getStartOffset() + getLength();
+			if (offset > thisEndOffset)
+				return null;
 			// transform the requested offset to the "scale" that
 			// regions are stored in, which are all relative to the
 			// start point.
 			//int transformedOffset = offset - getStartOffset();
 			//
-			int length = getRegions().size();
-			for (int i = 0; i < length; i++) {
-				ITextRegion region = getRegions().get(i);
+			ITextRegionList regions = getRegions();
+			int length = regions.size();
+			int low = 0;
+			int high = length;
+			int mid = 0;
+			// Binary search for the region
+			while (low < high) {
+				mid = low + ((high - low) >> 1);
+				ITextRegion region = regions.get(mid);
 				if (org.eclipse.wst.sse.core.internal.util.Debug.debugStructuredDocument) {
 					System.out.println("region(s) in IStructuredDocumentRegion::getRegionAtCharacterOffset: " + region); //$NON-NLS-1$
+					System.out.println("       midpoint of search:" + mid); //$NON-NLS-1$
 					System.out.println("       requested offset: " + offset); //$NON-NLS-1$
 					//System.out.println(" transformedOffset: " +
 					// transformedOffset); //$NON-NLS-1$
@@ -168,11 +181,15 @@
 					System.out.println("       region class: " + region.getClass()); //$NON-NLS-1$
 
 				}
-				if ((getStartOffset(region) <= offset) && (offset < getEndOffset(region))) {
-					result = region;
-					break;
-				}
+				// Region is before this one
+				if (offset < region.getStart() + thisStartOffset)
+					high = mid;
+				else if (offset > (region.getEnd() + thisStartOffset - 1))
+					low = mid + 1;
+				else
+					return region;
 			}
+			return null;
 		}
 		return result;
 	}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/IntStack.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/IntStack.java
index b871545..5cb8d5a 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/IntStack.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/IntStack.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -92,6 +92,21 @@
 	}
 
 	public int size() {
-		return list.length;
+		return size;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		StringBuffer s = new StringBuffer(getClass().getName() + ":" +size + " [");
+		for (int i = 0; i < size; i++) {
+			s.append(list[i]);
+			if(i < size - 1) {
+				s.append(", ");
+			}
+		}
+		s.append("]");
+		return s.toString();
 	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLSourceParser.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLSourceParser.java
index 0ada81c..4a8791c 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLSourceParser.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLSourceParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -89,10 +89,12 @@
 		getTokenizer().addBlockMarker(marker);
 	}
 
-	public void addStructuredDocumentRegionHandler(StructuredDocumentRegionHandler handler) {
+	public synchronized void addStructuredDocumentRegionHandler(StructuredDocumentRegionHandler handler) {
 		if (fStructuredDocumentRegionHandlers == null)
 			fStructuredDocumentRegionHandlers = new ArrayList();
-		fStructuredDocumentRegionHandlers.add(handler);
+		synchronized (fStructuredDocumentRegionHandlers) {
+			fStructuredDocumentRegionHandlers.add(handler);
+		}
 	}
 
 	public void beginBlockScan(String newTagName) {
@@ -120,16 +122,23 @@
 		 * 
 		 * Protect the user's data above everything.
 		 */
-		try {
-			if (fCurrentNode != null && fStructuredDocumentRegionHandlers != null) {
-				for (int i = 0; i < fStructuredDocumentRegionHandlers.size(); i++) {
-					((StructuredDocumentRegionHandler) fStructuredDocumentRegionHandlers.get(i)).nodeParsed(fCurrentNode);
+		Object[] handlers = null;
+		synchronized (fStructuredDocumentRegionHandlers) {
+			if (fStructuredDocumentRegionHandlers == null)
+				return;
+
+			handlers = fStructuredDocumentRegionHandlers.toArray();
+		}
+		if (fCurrentNode != null && handlers != null) {
+			for (int i = 0; i < handlers.length; i++) {
+				try {
+					((StructuredDocumentRegionHandler) handlers[i]).nodeParsed(fCurrentNode);
+				}
+				catch (Exception e) {
+					Logger.log(Logger.ERROR, "Error occurred while firing Node Parsed event", e); //$NON-NLS-1$
 				}
 			}
 		}
-		catch (Exception e) {
-		    Logger.log(Logger.ERROR, "Error occurred while firing Node Parsed event", e); //$NON-NLS-1$
-		}
 	}
 
 	public BlockMarker getBlockMarker(String tagName) {
@@ -483,18 +492,19 @@
 		if (stringToCompare == null)
 			return false;
 
+		int ajustedOffset = fOffset + offset;
 		boolean result = false;
 		if (fCharSequenceSource != null && fCharSequenceSource instanceof IRegionComparible) {
-			result = ((IRegionComparible) fCharSequenceSource).regionMatches(offset, length, stringToCompare);
+			result = ((IRegionComparible) fCharSequenceSource).regionMatches(ajustedOffset, length, stringToCompare);
 		}
 		else {
 			// old fashioned ways
 			String test = null;
 			if (fCharSequenceSource != null) {
-				test = fCharSequenceSource.subSequence(offset, offset + length).toString();
+				test = fCharSequenceSource.subSequence(ajustedOffset, ajustedOffset + length).toString();
 			}
 			else if (fStringInput != null) {
-				test = fStringInput.substring(offset, offset + length);
+				test = fStringInput.substring(ajustedOffset, ajustedOffset + length);
 			}
 			result = stringToCompare.equals(test);
 		}
@@ -506,18 +516,19 @@
 		if (stringToCompare == null)
 			return false;
 
+		int ajustedOffset = fOffset + offset;
 		boolean result = false;
 		if (fCharSequenceSource != null && fCharSequenceSource instanceof IRegionComparible) {
-			result = ((IRegionComparible) fCharSequenceSource).regionMatchesIgnoreCase(offset, length, stringToCompare);
+			result = ((IRegionComparible) fCharSequenceSource).regionMatchesIgnoreCase(ajustedOffset, length, stringToCompare);
 		}
 		else {
 			// old fashioned ways
 			String test = null;
 			if (fCharSequenceSource != null) {
-				test = fCharSequenceSource.subSequence(offset, offset + length).toString();
+				test = fCharSequenceSource.subSequence(ajustedOffset, ajustedOffset + length).toString();
 			}
 			else if (fStringInput != null) {
-				test = fStringInput.substring(offset, offset + length);
+				test = fStringInput.substring(ajustedOffset, ajustedOffset + length);
 			}
 			result = stringToCompare.equalsIgnoreCase(test);
 		}
@@ -535,8 +546,9 @@
 	public void removeStructuredDocumentRegionHandler(StructuredDocumentRegionHandler handler) {
 		if (fStructuredDocumentRegionHandlers == null)
 			return;
-		if (fStructuredDocumentRegionHandlers.contains(handler))
+		synchronized (fStructuredDocumentRegionHandlers) {
 			fStructuredDocumentRegionHandlers.remove(handler);
+		}
 	}
 
 	/**
@@ -600,10 +612,20 @@
 	}
 
 	public void resetHandlers() {
-		if (fStructuredDocumentRegionHandlers != null) {
-			int size = fStructuredDocumentRegionHandlers.size();
-			for (int i = 0; i < size; i++)
-				((StructuredDocumentRegionHandler) fStructuredDocumentRegionHandlers.get(i)).resetNodes();
+		Object[] handlers = null;
+		synchronized (fStructuredDocumentRegionHandlers) {
+			if (fStructuredDocumentRegionHandlers == null)
+				return;
+
+			handlers = fStructuredDocumentRegionHandlers.toArray();
+		}
+		for (int i = 0; i < handlers.length; i++) {
+			try {
+				((StructuredDocumentRegionHandler) handlers[i]).resetNodes();
+			}
+			catch (Exception e) {
+				Logger.log(Logger.ERROR, "Error occurred while resetting handlers", e); //$NON-NLS-1$
+			}
 		}
 	}
 
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLTokenizer.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLTokenizer.java
index b4607a2..09a3850 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLTokenizer.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/parser/XMLTokenizer.java
@@ -1,7 +1,7 @@
-/* The following code was generated by JFlex 1.2.2 on 10/17/07 4:27 AM */
+/* The following code was generated by JFlex 1.2.2 on 6/29/10 1:04 PM */
 
 /*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -32,7 +32,7 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 10/17/07 4:27 AM from the specification file
+ * on 6/29/10 1:04 PM from the specification file
  * <tt>file:/D:/eclipse.wtp/workspace/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.jflex</tt>
  */
 public class XMLTokenizer implements BlockTokenizer, DOMRegionContext {
@@ -266,42 +266,41 @@
     "\1\0\3\70\1\0\5\70\1\72\2\0\1\207\1\72"+
     "\1\0\3\72\1\0\1\72\2\0\5\72\1\0\45\72"+
     "\1\0\1\206\1\207\1\72\1\0\3\72\1\0\1\72"+
-    "\2\0\5\72\1\0\44\72\1\75\1\0\1\210\1\211"+
-    "\1\75\1\210\3\75\1\212\1\75\2\210\5\75\1\210"+
-    "\44\75\1\76\1\0\1\213\1\214\1\76\1\213\3\76"+
-    "\1\213\1\76\1\212\1\213\5\76\1\213\44\76\2\0"+
-    "\1\100\1\215\71\0\3\102\4\0\1\102\5\0\6\102"+
-    "\1\0\13\102\1\0\7\102\1\0\3\102\1\0\5\102"+
-    "\1\104\2\0\1\216\1\104\1\0\3\104\1\0\1\104"+
-    "\2\0\5\104\1\0\45\104\1\0\1\100\1\217\1\104"+
-    "\1\0\3\104\1\0\1\104\2\0\5\104\1\0\44\104"+
-    "\1\106\1\0\1\220\1\221\1\106\1\220\3\106\1\222"+
-    "\1\106\2\220\5\106\1\220\44\106\1\107\1\0\1\223"+
-    "\1\224\1\107\1\223\3\107\1\223\1\107\1\222\1\223"+
-    "\5\107\1\223\44\107\1\110\3\0\17\110\6\0\1\110"+
-    "\13\0\1\110\7\0\1\110\3\0\1\110\3\0\1\110"+
-    "\4\0\1\167\15\0\1\171\47\0\1\225\64\0\1\110"+
-    "\3\0\2\110\3\114\4\110\1\114\5\110\6\115\1\110"+
-    "\13\115\1\110\7\115\1\110\3\115\1\110\3\115\1\114"+
-    "\1\115\6\0\3\115\4\0\1\115\5\0\6\115\1\0"+
-    "\13\115\1\0\7\115\1\0\3\115\1\0\5\115\6\0"+
-    "\3\116\4\0\1\116\5\0\6\116\1\0\13\116\1\0"+
-    "\7\116\1\0\3\116\1\0\5\116\1\120\2\0\1\226"+
+    "\2\0\5\72\1\0\44\72\1\75\2\210\1\211\1\75"+
+    "\1\210\3\75\1\212\1\75\2\210\5\75\1\210\44\75"+
+    "\1\76\2\213\1\214\1\76\1\213\3\76\1\213\1\76"+
+    "\1\212\1\213\5\76\1\213\44\76\2\0\1\100\1\215"+
+    "\71\0\3\102\4\0\1\102\5\0\6\102\1\0\13\102"+
+    "\1\0\7\102\1\0\3\102\1\0\5\102\1\104\2\0"+
+    "\1\216\1\104\1\0\3\104\1\0\1\104\2\0\5\104"+
+    "\1\0\45\104\1\0\1\100\1\217\1\104\1\0\3\104"+
+    "\1\0\1\104\2\0\5\104\1\0\44\104\1\106\2\220"+
+    "\1\221\1\106\1\220\3\106\1\222\1\106\2\220\5\106"+
+    "\1\220\44\106\1\107\2\223\1\224\1\107\1\223\3\107"+
+    "\1\223\1\107\1\222\1\223\5\107\1\223\44\107\1\110"+
+    "\3\0\17\110\6\0\1\110\13\0\1\110\7\0\1\110"+
+    "\3\0\1\110\3\0\1\110\4\0\1\167\15\0\1\171"+
+    "\47\0\1\225\64\0\1\110\3\0\2\110\3\114\4\110"+
+    "\1\114\5\110\6\115\1\110\13\115\1\110\7\115\1\110"+
+    "\3\115\1\110\3\115\1\114\1\115\6\0\3\115\4\0"+
+    "\1\115\5\0\6\115\1\0\13\115\1\0\7\115\1\0"+
+    "\3\115\1\0\5\115\6\0\3\116\4\0\1\116\5\0"+
+    "\6\116\1\0\13\116\1\0\7\116\1\0\3\116\1\0"+
+    "\5\116\1\120\2\0\1\226\1\120\1\0\3\120\1\0"+
+    "\1\120\2\0\5\120\1\0\45\120\1\0\1\225\1\226"+
     "\1\120\1\0\3\120\1\0\1\120\2\0\5\120\1\0"+
-    "\45\120\1\0\1\225\1\226\1\120\1\0\3\120\1\0"+
-    "\1\120\2\0\5\120\1\0\44\120\1\122\1\0\1\227"+
-    "\1\230\1\122\1\227\3\122\1\231\1\122\2\227\5\122"+
-    "\1\227\44\122\1\123\1\0\1\232\1\233\1\123\1\232"+
-    "\3\123\1\232\1\123\1\231\1\232\5\123\1\232\44\123"+
-    "\3\0\1\167\15\0\1\234\110\0\1\235\60\0\1\236"+
-    "\13\0\1\236\44\0\2\237\36\0\20\240\1\241\46\240"+
-    "\6\0\3\132\4\0\1\132\5\0\6\132\1\0\13\132"+
-    "\1\0\7\132\1\0\3\132\1\0\5\132\46\0\1\242"+
-    "\5\0\1\242\72\0\1\243\6\0\1\135\2\0\1\244"+
-    "\1\135\1\0\3\135\1\0\1\135\2\0\5\135\1\0"+
-    "\44\135\1\137\1\0\1\245\1\246\1\137\1\245\3\137"+
-    "\1\247\1\137\2\245\5\137\1\245\44\137\1\250\1\0"+
-    "\1\251\1\252\1\253\1\251\3\253\1\251\1\250\1\254"+
+    "\44\120\1\122\2\227\1\230\1\122\1\227\3\122\1\231"+
+    "\1\122\2\227\5\122\1\227\44\122\1\123\2\232\1\233"+
+    "\1\123\1\232\3\123\1\232\1\123\1\231\1\232\5\123"+
+    "\1\232\44\123\3\0\1\167\15\0\1\234\110\0\1\235"+
+    "\60\0\1\236\13\0\1\236\44\0\2\237\36\0\20\240"+
+    "\1\241\46\240\6\0\3\132\4\0\1\132\5\0\6\132"+
+    "\1\0\13\132\1\0\7\132\1\0\3\132\1\0\5\132"+
+    "\46\0\1\242\5\0\1\242\72\0\1\243\6\0\1\135"+
+    "\2\0\1\244\1\135\1\0\3\135\1\0\1\135\2\0"+
+    "\5\135\1\0\44\135\1\137\2\245\1\246\1\137\1\245"+
+    "\3\137\1\247\1\137\2\245\5\137\1\245\44\137\1\250"+
+    "\2\251\1\252\1\253\1\251\3\253\1\251\1\250\1\254"+
     "\1\255\3\253\1\250\1\253\1\255\6\253\1\250\32\253"+
     "\2\250\1\253\1\141\2\240\1\256\1\141\1\240\3\141"+
     "\1\240\1\141\2\240\3\141\1\257\1\141\1\240\44\141"+
@@ -313,58 +312,53 @@
     "\1\146\1\240\3\146\1\240\1\146\2\240\3\146\1\267"+
     "\1\146\1\240\44\146\1\147\2\0\1\270\1\147\1\0"+
     "\3\147\1\0\1\147\2\0\5\147\1\0\44\147\1\151"+
-    "\1\0\1\271\1\272\1\151\1\271\3\151\1\273\1\151"+
-    "\2\271\5\151\1\271\44\151\1\274\1\0\1\275\1\276"+
-    "\1\277\1\275\3\277\1\275\1\274\1\300\1\301\3\277"+
-    "\1\274\1\277\1\301\6\277\1\274\32\277\2\274\1\277"+
-    "\2\153\1\0\66\153\1\0\16\153\1\302\45\153\1\156"+
-    "\2\0\1\303\1\156\1\0\3\156\1\0\1\156\2\0"+
-    "\5\156\1\0\44\156\1\160\1\0\1\304\1\305\1\160"+
-    "\1\304\3\160\1\306\1\160\2\304\5\160\1\304\44\160"+
-    "\1\307\1\0\1\310\1\311\1\312\1\310\3\312\1\310"+
-    "\1\307\1\313\1\314\3\312\1\307\1\312\1\314\6\312"+
-    "\1\307\32\312\2\307\1\312\2\162\1\0\66\162\1\0"+
-    "\16\162\1\315\45\162\7\0\1\316\21\0\1\317\42\0"+
-    "\1\172\2\0\1\40\3\0\1\172\5\0\1\172\6\40"+
-    "\1\0\13\40\1\0\7\40\1\0\3\40\1\0\3\40"+
-    "\1\0\1\40\1\320\1\0\3\320\1\321\3\173\1\320"+
-    "\1\0\1\320\1\321\1\173\1\320\1\0\2\320\1\321"+
-    "\6\173\1\320\13\173\1\320\7\173\1\320\3\173\1\322"+
-    "\5\173\15\0\1\323\6\0\1\324\42\0\1\320\1\0"+
-    "\3\320\1\321\3\175\1\320\1\0\1\320\1\321\1\175"+
-    "\1\320\1\0\2\320\1\321\6\175\1\320\13\175\1\320"+
-    "\7\175\1\320\3\175\1\325\5\175\31\0\1\317\37\0"+
-    "\1\326\66\0\1\327\72\0\3\57\4\0\1\57\5\0"+
-    "\4\57\2\330\1\0\13\57\1\0\7\57\1\0\3\57"+
-    "\1\0\5\57\6\0\3\57\4\0\1\57\5\0\4\57"+
-    "\1\330\1\331\1\0\13\57\1\0\7\57\1\0\3\57"+
-    "\1\0\5\57\6\0\3\57\4\0\1\57\5\0\6\57"+
-    "\1\0\13\57\1\0\1\57\1\332\5\57\1\0\3\57"+
-    "\1\0\5\57\1\210\1\0\7\210\1\212\55\210\1\213"+
-    "\1\0\11\213\1\212\53\213\1\220\1\0\7\220\1\222"+
-    "\55\220\1\223\1\0\11\223\1\222\53\223\1\227\1\0"+
-    "\7\227\1\231\55\227\1\232\1\0\11\232\1\231\53\232"+
+    "\2\271\1\272\1\151\1\271\3\151\1\273\1\151\2\271"+
+    "\5\151\1\271\44\151\1\274\2\275\1\276\1\277\1\275"+
+    "\3\277\1\275\1\274\1\300\1\301\3\277\1\274\1\277"+
+    "\1\301\6\277\1\274\32\277\2\274\1\277\2\153\1\0"+
+    "\66\153\1\0\16\153\1\302\45\153\1\156\2\0\1\303"+
+    "\1\156\1\0\3\156\1\0\1\156\2\0\5\156\1\0"+
+    "\44\156\1\160\2\304\1\305\1\160\1\304\3\160\1\306"+
+    "\1\160\2\304\5\160\1\304\44\160\1\307\2\310\1\311"+
+    "\1\312\1\310\3\312\1\310\1\307\1\313\1\314\3\312"+
+    "\1\307\1\312\1\314\6\312\1\307\32\312\2\307\1\312"+
+    "\2\162\1\0\66\162\1\0\16\162\1\315\45\162\7\0"+
+    "\1\316\21\0\1\317\42\0\1\172\2\0\1\40\3\0"+
+    "\1\172\5\0\1\172\6\40\1\0\13\40\1\0\7\40"+
+    "\1\0\3\40\1\0\3\40\1\0\1\40\1\320\1\0"+
+    "\3\320\1\321\3\173\1\320\1\0\1\320\1\321\1\173"+
+    "\1\320\1\0\2\320\1\321\6\173\1\320\13\173\1\320"+
+    "\7\173\1\320\3\173\1\322\5\173\15\0\1\323\6\0"+
+    "\1\324\42\0\1\320\1\0\3\320\1\321\3\175\1\320"+
+    "\1\0\1\320\1\321\1\175\1\320\1\0\2\320\1\321"+
+    "\6\175\1\320\13\175\1\320\7\175\1\320\3\175\1\325"+
+    "\5\175\31\0\1\317\37\0\1\326\66\0\1\327\72\0"+
+    "\3\57\4\0\1\57\5\0\4\57\2\330\1\0\13\57"+
+    "\1\0\7\57\1\0\3\57\1\0\5\57\6\0\3\57"+
+    "\4\0\1\57\5\0\4\57\1\330\1\331\1\0\13\57"+
+    "\1\0\7\57\1\0\3\57\1\0\5\57\6\0\3\57"+
+    "\4\0\1\57\5\0\6\57\1\0\13\57\1\0\1\57"+
+    "\1\332\5\57\1\0\3\57\1\0\5\57\11\210\1\212"+
+    "\55\210\13\213\1\212\53\213\11\220\1\222\55\220\13\223"+
+    "\1\222\53\223\11\227\1\231\55\227\13\232\1\231\53\232"+
     "\32\0\1\333\30\0\1\333\40\0\1\334\13\0\1\334"+
     "\54\0\1\335\10\0\1\335\57\0\1\336\14\0\1\336"+
-    "\72\0\1\337\4\0\1\245\1\0\7\245\1\247\55\245"+
-    "\1\250\1\0\1\251\1\340\1\250\1\251\3\250\1\251"+
-    "\1\250\1\247\1\251\5\250\1\251\44\250\1\251\1\0"+
-    "\11\251\1\247\53\251\1\250\1\0\1\251\1\340\1\250"+
-    "\1\251\3\250\1\251\1\250\1\341\1\251\5\250\1\251"+
-    "\44\250\13\0\1\342\53\0\1\251\1\0\11\251\1\341"+
-    "\53\251\11\261\1\263\55\261\13\264\1\263\53\264\1\271"+
-    "\1\0\7\271\1\273\55\271\1\274\1\0\1\275\1\343"+
-    "\1\274\1\275\3\274\1\275\1\274\1\273\1\275\5\274"+
-    "\1\275\44\274\1\275\1\0\11\275\1\273\53\275\1\274"+
-    "\1\0\1\275\1\343\1\274\1\275\3\274\1\275\1\274"+
-    "\1\344\1\275\5\274\1\275\44\274\13\0\1\345\53\0"+
-    "\1\275\1\0\11\275\1\344\53\275\2\153\1\0\26\153"+
-    "\1\346\35\153\1\304\1\0\7\304\1\306\55\304\1\307"+
-    "\1\0\1\310\1\347\1\307\1\310\3\307\1\310\1\307"+
-    "\1\306\1\310\5\307\1\310\44\307\1\310\1\0\11\310"+
-    "\1\306\53\310\1\307\1\0\1\310\1\347\1\307\1\310"+
-    "\3\307\1\310\1\307\1\350\1\310\5\307\1\310\44\307"+
-    "\13\0\1\351\53\0\1\310\1\0\11\310\1\350\53\310"+
+    "\72\0\1\337\4\0\11\245\1\247\55\245\1\250\2\251"+
+    "\1\340\1\250\1\251\3\250\1\251\1\250\1\247\1\251"+
+    "\5\250\1\251\44\250\13\251\1\247\53\251\1\250\2\251"+
+    "\1\340\1\250\1\251\3\250\1\251\1\250\1\341\1\251"+
+    "\5\250\1\251\44\250\13\0\1\342\53\0\13\251\1\341"+
+    "\53\251\11\261\1\263\55\261\13\264\1\263\53\264\11\271"+
+    "\1\273\55\271\1\274\2\275\1\343\1\274\1\275\3\274"+
+    "\1\275\1\274\1\273\1\275\5\274\1\275\44\274\13\275"+
+    "\1\273\53\275\1\274\2\275\1\343\1\274\1\275\3\274"+
+    "\1\275\1\274\1\344\1\275\5\274\1\275\44\274\13\0"+
+    "\1\345\53\0\13\275\1\344\53\275\2\153\1\0\26\153"+
+    "\1\346\35\153\11\304\1\306\55\304\1\307\2\310\1\347"+
+    "\1\307\1\310\3\307\1\310\1\307\1\306\1\310\5\307"+
+    "\1\310\44\307\13\310\1\306\53\310\1\307\2\310\1\347"+
+    "\1\307\1\310\3\307\1\310\1\307\1\350\1\310\5\307"+
+    "\1\310\44\307\13\0\1\351\53\0\13\310\1\350\53\310"+
     "\2\162\1\0\26\162\1\352\35\162\7\0\1\353\111\0"+
     "\1\354\34\0\1\320\1\0\10\320\1\0\4\320\1\0"+
     "\41\320\1\0\6\320\1\0\3\320\1\321\4\320\1\0"+
@@ -1005,7 +999,7 @@
     int [] trans = new int[11055];
     int i = 0;  /* index in packed string  */
     int j = 0;  /* index in unpacked array */
-    while (i < 3734) {
+    while (i < 3638) {
       int count = packed.charAt(i++);
       int value = packed.charAt(i++);
       value--;
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceInitializer.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceInitializer.java
index 6c6c59b..b050f9d 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceInitializer.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceInitializer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -39,7 +39,8 @@
 		node.putBoolean(XMLCorePreferenceNames.ALIGN_END_BRACKET, false);
 		node.putBoolean(XMLCorePreferenceNames.PRESERVE_CDATACONTENT, false);
 		node.putBoolean(XMLCorePreferenceNames.SPACE_BEFORE_EMPTY_CLOSE_TAG, true);
-		
+		node.putBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_TEXT, true);
+		node.putBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_JOIN_LINES, true);
 		// cleanup preferences
 		node.putBoolean(XMLCorePreferenceNames.COMPRESS_EMPTY_ELEMENT_TAGS, true);
 		node.putBoolean(XMLCorePreferenceNames.INSERT_REQUIRED_ATTRS, true);
@@ -47,6 +48,7 @@
 		node.putBoolean(XMLCorePreferenceNames.QUOTE_ATTR_VALUES, true);
 		node.putBoolean(XMLCorePreferenceNames.FORMAT_SOURCE, true);
 		node.putBoolean(XMLCorePreferenceNames.CONVERT_EOL_CODES, false);
+		node.putBoolean(XMLCorePreferenceNames.FIX_XML_DECLARATION, true);
 
 		node.put(CommonEncodingPreferenceNames.INPUT_CODESET, ""); //$NON-NLS-1$
 		node.put(CommonEncodingPreferenceNames.OUTPUT_CODESET, "UTF-8");//$NON-NLS-1$
@@ -57,7 +59,23 @@
 		node.put(XMLCorePreferenceNames.DEFAULT_EXTENSION, "xml"); //$NON-NLS-1$
 
 		node.putBoolean(XMLCorePreferenceNames.WARN_NO_GRAMMAR, true);
+		// 1 = IMarker.SEVERITY_WARNING
 		node.putInt(XMLCorePreferenceNames.INDICATE_NO_GRAMMAR, 1);
 		node.putBoolean(XMLCorePreferenceNames.USE_XINCLUDE, false);
+		node.putBoolean(XMLCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS, true);
+		node.putBoolean(XMLCorePreferenceNames.CMDOCUMENT_GLOBAL_CACHE_ENABLED, true);
+		
+		node.putBoolean(XMLCorePreferenceNames.MARKUP_VALIDATION, false);
+		node.putInt(XMLCorePreferenceNames.ATTRIBUTE_HAS_NO_VALUE, 2);
+		node.putInt(XMLCorePreferenceNames.END_TAG_WITH_ATTRIBUTES, 2);
+		node.putInt(XMLCorePreferenceNames.MISSING_START_TAG, 2);
+		node.putInt(XMLCorePreferenceNames.MISSING_END_TAG, 2);
+		node.putInt(XMLCorePreferenceNames.MISSING_TAG_NAME, 2);
+		node.putInt(XMLCorePreferenceNames.MISSING_QUOTES, 2);
+		node.putInt(XMLCorePreferenceNames.MISSING_CLOSING_BRACKET, 2);
+		node.putInt(XMLCorePreferenceNames.MISSING_CLOSING_QUOTE, 2);
+		node.putInt(XMLCorePreferenceNames.NAMESPACE_IN_PI_TARGET, 2);
+		node.putInt(XMLCorePreferenceNames.WHITESPACE_AT_START, 2);
+		node.putInt(XMLCorePreferenceNames.WHITESPACE_BEFORE_TAGNAME, 2);
 	}
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceNames.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceNames.java
index f572af5..00f597c 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceNames.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/preferences/XMLCorePreferenceNames.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,7 @@
 
 package org.eclipse.wst.xml.core.internal.preferences;
 
+
 /**
  * Common preference keys used by XML core
  * 
@@ -135,6 +136,14 @@
 	public static final String QUOTE_ATTR_VALUES = "quoteAttrValues";//$NON-NLS-1$
 
 	/**
+	 * Indicates whether or not to insert missing XML declarations during cleanup.
+	 * <p>
+	 * Value is of type <code>Boolean</code>
+	 * </p>
+	 */
+	public static final String FIX_XML_DECLARATION = "fixXMLDeclaration"; //$NON-NLS-1$
+
+	/**
 	 * Indicates whether or not to convert all line delimiters during cleanup.
 	 * <p>
 	 * Value is of type <code>Boolean</code>.
@@ -212,4 +221,67 @@
 	 * </p>
 	 */
 	public static final String SPACE_BEFORE_EMPTY_CLOSE_TAG = "spaceBeforeEmptyCloseTag";//$NON-NLS-1$
+	
+    /**
+     * Indicates whether or not all schema locations for XSD should be honoured
+     * during XSD validation of XML.
+     * <p>
+     * Value is of type <code>boolean</code>.<br />
+     * Possible values: {TRUE, FALSE}
+     * </p>
+     * 
+     */
+    public static final String HONOUR_ALL_SCHEMA_LOCATIONS = "honourAllSchemaLocations";//$NON-NLS-1$
+
+    /**
+     * Indicates whether or not the content of comments should be formatted
+     * <p>
+     * Value is of type <code>boolean</code><br />
+     * Possible values: {TRUE, FALSE}
+     * </p>
+     */
+    public static final String FORMAT_COMMENT_TEXT = "formatCommentText"; //$NON-NLS-1$
+
+    /**
+     * Indicates whether or not the lines of comments should be joined when formatting
+     * <p>
+     * Value is of type <code>boolean</code>
+     */
+    public static final String FORMAT_COMMENT_JOIN_LINES = "formatCommentJoinLines"; //$NON-NLS-1$
+    
+    /**
+     * Indicates whether or not CMDocuments should be globally cached
+     * <p>
+     * Value is of type <code>boolean</code>
+     */
+    public static final String CMDOCUMENT_GLOBAL_CACHE_ENABLED = "cmDocumentGlobalCacheEnabled"; //$NON-NLS-1$
+    
+    /**
+	 * Indicates whether or not MarkUpValidator should run as part of XMl Validation.
+	 * <p>
+	 * Value is of type <code>boolean</code>.<br />
+	 * Possible values: {TRUE, FALSE} 
+	 * </p>
+	 */
+    public static final String MARKUP_VALIDATION = "markupValidation"; //$NON-NLS-1$
+    
+    /**
+	 * Indicates whether or not a message should be produced when validating a
+	 * file that specifies following condition.
+	 * <p>
+	 * Value is of type <code>integer</code>.<br />
+	 * Possible values: {0, 1, 2} (none, warning, error)
+	 * </p>
+	 */
+    public static final String ATTRIBUTE_HAS_NO_VALUE = "attributeHasNoValue"; //$NON-NLS-1$
+    public static final String END_TAG_WITH_ATTRIBUTES = "endTagWithAttributes"; //$NON-NLS-1$
+    public static final String WHITESPACE_BEFORE_TAGNAME = "whitespaceBeforeTagName"; //$NON-NLS-1$
+    public static final String MISSING_CLOSING_BRACKET = "missingClosingBracket"; //$NON-NLS-1$
+    public static final String MISSING_CLOSING_QUOTE = "missingClosingQuote"; //$NON-NLS-1$
+    public static final String MISSING_END_TAG = "missingEndTag"; //$NON-NLS-1$
+    public static final String MISSING_START_TAG = "missingStartTag"; //$NON-NLS-1$
+    public static final String MISSING_QUOTES = "missingQuotes"; //$NON-NLS-1$
+    public static final String NAMESPACE_IN_PI_TARGET = "namespaceInPITarget"; //$NON-NLS-1$
+    public static final String MISSING_TAG_NAME = "missingTagName"; //$NON-NLS-1$
+    public static final String WHITESPACE_AT_START = "whitespaceAtStart"; //$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/IXMLNamespace.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/IXMLNamespace.java
index 8cb2260..10847db 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/IXMLNamespace.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/IXMLNamespace.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,7 +20,10 @@
  */
 public interface IXMLNamespace {
 
-	static final String XMLNS = "xmlns";//$NON-NLS-1$
-	static final String XMLNS_PREFIX = "xmlns:";//$NON-NLS-1$
-	static final String XMLNS_URI = "http://www.w3.org/2000/xmlns/";//$NON-NLS-1$
+	String XMLNS = "xmlns";//$NON-NLS-1$
+	String XMLNS_PREFIX = "xmlns:";//$NON-NLS-1$
+	String XMLNS_URI = "http://www.w3.org/2000/xmlns/";//$NON-NLS-1$
+	String XML = "xml";//$NON-NLS-1$
+	String XML_PREFIX = "xml:";//$NON-NLS-1$
+	String XML_URI = "http://www.w3.org/XML/1998/namespace";//$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/contentmodel/CMDocType.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/contentmodel/CMDocType.java
index 7a3d95f..679cefd 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/contentmodel/CMDocType.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/contentmodel/CMDocType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -23,6 +23,10 @@
 	 */
 	public final static String HTML_DOC_TYPE = "HTML";//$NON-NLS-1$
 	/**
+	 * HTML5 files
+	 */
+	public final static String HTML5_DOC_TYPE = "HTML5";//$NON-NLS-1$
+	/**
 	 * JSP 1.1 files (currently includes 1.2 elements for backward behavioral compatibility)
 	 */
 	public final static String JSP11_DOC_TYPE = "JSP11";//$NON-NLS-1$
@@ -38,4 +42,8 @@
 	 * JSP 2.0 Tag files
 	 */
 	public final static String TAG20_DOC_TYPE = "JSP20.TAG";//$NON-NLS-1$
+	/**
+	 * JSP 2.1 JSP files
+	 */
+	public final static String JSP21_DOC_TYPE = "JSP21";//$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/CommentNodeFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/CommentNodeFormatter.java
index f30ed3a..7fba905 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/CommentNodeFormatter.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/CommentNodeFormatter.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
+ *     David Carver (STAR) - bug 296999 - Inefficient use of new String()
  *******************************************************************************/
 package org.eclipse.wst.xml.core.internal.provisional.format;
 
@@ -23,7 +23,7 @@
 	static private final String LF = "\n"; //$NON-NLS-1$
 
 	protected String adjustIndentations(String aString, String lineIndent, String singleIndent) {
-		String result = new String();
+		String result = NodeFormatter.EMPTY_STRING;
 
 		int indexOfLineDelimiter = StringUtils.indexOfLineDelimiter(aString);
 		result = aString.substring(0, indexOfLineDelimiter);
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/ElementNodeFormatter.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/ElementNodeFormatter.java
index beed8f4..6baf55b 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/ElementNodeFormatter.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/provisional/format/ElementNodeFormatter.java
@@ -404,7 +404,7 @@
 	}
 
 	protected String getUndefinedRegions(IDOMNode node, int startOffset, int length) {
-		String result = new String();
+		String result = NodeFormatter.EMPTY_STRING;
 
 		IStructuredDocumentRegion flatNode = node.getFirstStructuredDocumentRegion();
 		ITextRegionList regions = flatNode.getRegions();
diff --git a/bundles/org.eclipse.wst.xml.ui/.classpath b/bundles/org.eclipse.wst.xml.ui/.classpath
new file mode 100644
index 0000000..9d03c22
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/.classpath
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src" />
+	<classpathentry kind="src" path="src-validation" />
+	<classpathentry kind="src" path="src-multipage" />
+	<classpathentry kind="src" path="src-wizards" />
+	<classpathentry kind="src" path="src-catalog" />
+	<classpathentry kind="con"
+		path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4" />
+	<classpathentry kind="con"
+		path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/core/ValidationException" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/operations/LocalizedMessage/" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/core/IMessage" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/core/Message" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/core/IReporter" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/core/IValidationContext" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/core/IValidator" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/dnd/DefaultDragAndDropCommand" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/dialogs/SelectSingleFileDialog" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/core/IMessageAccess" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/core/IProjectValidationContext" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/core/IValidatorJob" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/viewers/SelectSingleFileView" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/dnd/DragAndDropCommand" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/dnd/DragAndDropManager" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/dnd/ObjectTransfer" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/dnd/ViewerDragAdapter" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/dnd/ViewerDropAdapter" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/ConfigurationManager" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/ProjectConfiguration" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/ValidationRegistryReader" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/ValidatorMetaData" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/ValidationFactory" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/common/ui/internal/viewers/*" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/ValidationConfiguration" />
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="output" path="bin" />
+</classpath>
diff --git a/bundles/org.eclipse.wst.xml.ui/.cvsignore b/bundles/org.eclipse.wst.xml.ui/.cvsignore
new file mode 100644
index 0000000..701c285
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/.cvsignore
@@ -0,0 +1,10 @@
+bin
+temp.folder
+build.xml
+xmleditor.jar
+org.eclipse.wst.xml.ui_1.0.0.jar
+org.eclipse.wst.xml.ui_1.0.0.zip
+xmleditorsrc.zip
+@dot
+src.zip
+javaCompiler...args
diff --git a/bundles/org.eclipse.wst.xml.ui/.options b/bundles/org.eclipse.wst.xml.ui/.options
new file mode 100644
index 0000000..5acae8f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/.options
@@ -0,0 +1 @@
+org.eclipse.wst.xml.ui/projectionperf=false
diff --git a/bundles/org.eclipse.wst.xml.ui/.project b/bundles/org.eclipse.wst.xml.ui/.project
new file mode 100644
index 0000000..50dc4a8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.xml.ui</name>
+	<comment></comment>
+	<projects></projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.core.resources.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs
copy to bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.core.resources.prefs
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.core.runtime.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs
copy to bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.core.runtime.prefs
diff --git a/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..a512da0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,79 @@
+#Sat Mar 24 02:59:49 EDT 2007

+eclipse.preferences.version=1

+org.eclipse.jdt.core.builder.cleanOutputFolder=clean

+org.eclipse.jdt.core.builder.duplicateResourceTask=warning

+org.eclipse.jdt.core.builder.invalidClasspath=ignore

+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch

+org.eclipse.jdt.core.circularClasspath=error

+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled

+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled

+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled

+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2

+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve

+org.eclipse.jdt.core.compiler.compliance=1.4

+org.eclipse.jdt.core.compiler.debug.lineNumber=generate

+org.eclipse.jdt.core.compiler.debug.localVariable=generate

+org.eclipse.jdt.core.compiler.debug.sourceFile=generate

+org.eclipse.jdt.core.compiler.doc.comment.support=enabled

+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100

+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning

+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning

+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore

+org.eclipse.jdt.core.compiler.problem.deprecation=ignore

+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled

+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled

+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning

+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning

+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning

+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore

+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore

+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error

+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error

+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning

+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning

+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore

+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error

+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore

+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled

+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled

+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private

+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore

+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error

+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore

+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore

+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled

+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public

+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore

+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled

+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private

+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore

+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error

+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error

+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning

+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore

+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning

+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error

+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled

+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error

+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled

+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore

+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore

+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning

+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore

+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning

+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore

+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error

+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore

+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore

+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled

+org.eclipse.jdt.core.compiler.problem.unusedImport=error

+org.eclipse.jdt.core.compiler.problem.unusedLabel=error

+org.eclipse.jdt.core.compiler.problem.unusedLocal=error

+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore

+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled

+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled

+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error

+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning

+org.eclipse.jdt.core.compiler.source=1.3

+org.eclipse.jdt.core.incompatibleJDKLevel=ignore

+org.eclipse.jdt.core.incompleteClasspath=error

diff --git a/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..0ece7b5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,51 @@
+#Wed Nov 22 23:23:01 EST 2006
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=false
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=true
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.format_comment=true
+cleanup.format_javadoc=true
+cleanup.format_multi_line_comment=true
+cleanup.format_single_line_comment=true
+cleanup.format_source_code=true
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=false
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=true
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=true
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_SSE Team Styles
+cleanup_settings_version=2
+eclipse.preferences.version=1
+internal.default.compliance=default
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<templates/>
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs
copy to bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
diff --git a/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..de4a8be
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,25 @@
+#Wed Jun 04 20:07:47 EDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=0
+compilers.p.build=0
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.illegal-att-value=0
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=0
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=0
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.p.unused-element-or-attribute=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..445a2e8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,62 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.wst.xml.ui; singleton:=true
+Bundle-Version: 1.1.105.qualifier
+Bundle-Activator: org.eclipse.wst.xml.ui.internal.XMLUIPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.wst.xml.ui,
+ org.eclipse.wst.xml.ui.internal;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.actions;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.autoedit;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.catalog;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.contentassist;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.contentoutline;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.correction;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.dialogs;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.dnd;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.doubleclick;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.editor;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.handlers;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.hyperlink;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.nsedit;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.perspective;x-friends:="org.eclipse.wst.xsl.ui",
+ org.eclipse.wst.xml.ui.internal.preferences;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.projection;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.properties;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.provisional;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.quickoutline,
+ org.eclipse.wst.xml.ui.internal.registry;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.search;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.selection;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.spelling,
+ org.eclipse.wst.xml.ui.internal.style;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.tabletree;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.taginfo;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.templates;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.text;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.util;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.validation;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.validation.core.errorinfo;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.internal.wizards;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui",
+ org.eclipse.wst.xml.ui.views.contentoutline,
+ org.eclipse.wst.xml.ui.views.properties
+Import-Package: com.ibm.icu.util; version="3.8",
+ com.ibm.icu.text; version="3.8"
+Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.views;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jface.text;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.ui.workbench.texteditor;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.sse.ui;bundle-version="[1.2.0,1.3.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.common.uriresolver;bundle-version="[1.1.301,1.2.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.500,1.2.0)",
+ org.eclipse.wst.common.ui;bundle-version="[1.1.400,1.2.0)",
+ org.eclipse.wst.validation;bundle-version="[1.2.100,1.3.0)",
+ org.eclipse.core.expressions;bundle-version="[3.4.100,4.0.0)"
+Bundle-ActivationPolicy: lazy; exclude:="org.eclipse.wst.xml.ui.internal.validation.core.errorinfo"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.sse.core/about.html b/bundles/org.eclipse.wst.xml.ui/about.html
similarity index 100%
copy from bundles/org.eclipse.wst.sse.core/about.html
copy to bundles/org.eclipse.wst.xml.ui/about.html
diff --git a/bundles/org.eclipse.wst.xml.ui/about.ini b/bundles/org.eclipse.wst.xml.ui/about.ini
new file mode 100644
index 0000000..68af291
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/about.ini
@@ -0,0 +1,12 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=icons/WTP_icon_x32_v2.png
+
diff --git a/bundles/org.eclipse.wst.xml.ui/about.mappings b/bundles/org.eclipse.wst.xml.ui/about.mappings
new file mode 100644
index 0000000..bddaab4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/about.mappings
@@ -0,0 +1,6 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+0=@build@
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/about.properties b/bundles/org.eclipse.wst.xml.ui/about.properties
new file mode 100644
index 0000000..8f60396
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/about.properties
@@ -0,0 +1,24 @@
+###############################################################################
+# Copyright (c) 2005, 2009 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+blurb=Eclipse XML Editors and Tools\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+(c) Copyright Eclipse contributors and others 2005, 2009.  All rights reserved.\n\
+Visit http://www.eclipse.org/webtools
diff --git a/bundles/org.eclipse.wst.xml.ui/build.properties b/bundles/org.eclipse.wst.xml.ui/build.properties
new file mode 100644
index 0000000..f7dbd12
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/build.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2001, 2006 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Jens Lukowski/Innoopract - initial renaming/restructuring
+#     
+###############################################################################
+bin.includes = plugin.xml,\
+               icons/,\
+               plugin.properties,\
+               templates/,\
+               examples/,\
+               META-INF/,\
+               .,\
+               .options,\
+               about.html,\
+               about.ini,\
+               about.properties,\
+               about.mappings
+bin.excludes = bin/**,\
+               @dot/**,\
+               temp.folder/**
+source.. = src/,\
+           src-multipage/,\
+           src-wizards/,\
+           src-catalog/,\
+           src-validation/
diff --git a/bundles/org.eclipse.wst.xml.ui/examples/EditingAndValidatingXML.zip b/bundles/org.eclipse.wst.xml.ui/examples/EditingAndValidatingXML.zip
new file mode 100644
index 0000000..6257767
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/examples/EditingAndValidatingXML.zip
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/WTP_icon_x32_v2.png b/bundles/org.eclipse.wst.xml.ui/icons/WTP_icon_x32_v2.png
new file mode 100644
index 0000000..6f09c2a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/WTP_icon_x32_v2.png
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/XMLFile.gif b/bundles/org.eclipse.wst.xml.ui/icons/XMLFile.gif
new file mode 100644
index 0000000..14eb1be
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/XMLFile.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/collapse.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/collapse.gif
new file mode 100644
index 0000000..ce74721
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/collapse.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/collapse_all.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/collapse_all.gif
new file mode 100644
index 0000000..7dc0de5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/collapse_all.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/constrainoff.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/constrainoff.gif
new file mode 100644
index 0000000..4bdceb8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/constrainoff.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/constrainon.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/constrainon.gif
new file mode 100644
index 0000000..e823d57
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/constrainon.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/expand.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/expand.gif
new file mode 100644
index 0000000..bc37b7a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/expand.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/expand_all.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/expand_all.gif
new file mode 100644
index 0000000..492c14f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/expand_all.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/new_xml.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/new_xml.gif
new file mode 100644
index 0000000..e1cfdf7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/new_xml.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/rldgrmr.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/rldgrmr.gif
new file mode 100644
index 0000000..49325dd
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/rldgrmr.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/validate.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/validate.gif
new file mode 100644
index 0000000..561d146
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/dtool16/validate.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/collapse.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/collapse.gif
new file mode 100644
index 0000000..b75bc19
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/collapse.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/collapse_all.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/collapse_all.gif
new file mode 100644
index 0000000..a2d80a9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/collapse_all.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/constrainoff.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/constrainoff.gif
new file mode 100644
index 0000000..c1ab04c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/constrainoff.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/constrainon.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/constrainon.gif
new file mode 100644
index 0000000..082f9c0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/constrainon.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/expand.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/expand.gif
new file mode 100644
index 0000000..b2f4530
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/expand.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/expand_all.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/expand_all.gif
new file mode 100644
index 0000000..0205b29
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/expand_all.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/new_xml.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/new_xml.gif
new file mode 100644
index 0000000..9dfb62d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/new_xml.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/rldgrmr.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/rldgrmr.gif
new file mode 100644
index 0000000..049cac6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/rldgrmr.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/validate.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/validate.gif
new file mode 100644
index 0000000..2b347ac
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/etool16/validate.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/XSDFile.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/XSDFile.gif
new file mode 100644
index 0000000..cc0eeb7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/XSDFile.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/add_correction.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/add_correction.gif
new file mode 100644
index 0000000..252d7eb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/add_correction.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/att_req_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/att_req_obj.gif
new file mode 100644
index 0000000..a8c66d5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/att_req_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/attribute_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/attribute_obj.gif
new file mode 100644
index 0000000..79d49d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/attribute_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/cdatasection.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/cdatasection.gif
new file mode 100644
index 0000000..6b0872c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/cdatasection.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/choice.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/choice.gif
new file mode 100644
index 0000000..d13ba2e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/choice.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/comment_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/comment_obj.gif
new file mode 100644
index 0000000..28c2ccb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/comment_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/correction_change.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/correction_change.gif
new file mode 100644
index 0000000..af83c52
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/correction_change.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/default.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/default.gif
new file mode 100644
index 0000000..9ced204
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/default.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/doctype.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/doctype.gif
new file mode 100644
index 0000000..3300f82
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/doctype.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/dtdfile.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/dtdfile.gif
new file mode 100644
index 0000000..3c0acad
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/dtdfile.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/element_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/element_obj.gif
new file mode 100644
index 0000000..3567815
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/element_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/entity.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/entity.gif
new file mode 100644
index 0000000..61fd3d4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/entity.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/entity_reference.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/entity_reference.gif
new file mode 100644
index 0000000..3af9149
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/entity_reference.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/enum.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/enum.gif
new file mode 100644
index 0000000..5c0a481
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/enum.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/error-overlay.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/error-overlay.gif
new file mode 100644
index 0000000..119dccc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/error-overlay.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/localvariable_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/localvariable_obj.gif
new file mode 100644
index 0000000..3244b26
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/localvariable_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/notation.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/notation.gif
new file mode 100644
index 0000000..57ad089
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/notation.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/occurone_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/occurone_obj.gif
new file mode 100644
index 0000000..7bb65c9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/occurone_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/proinst_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/proinst_obj.gif
new file mode 100644
index 0000000..74436d8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/proinst_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/sort.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/sort.gif
new file mode 100644
index 0000000..23c5d0b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/sort.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag-generic.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag-generic.gif
new file mode 100644
index 0000000..65f516e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag-generic.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag-macro.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag-macro.gif
new file mode 100644
index 0000000..5d1f81b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag-macro.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag_generic_deemphasized_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag_generic_deemphasized_obj.gif
new file mode 100644
index 0000000..cacb405
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag_generic_deemphasized_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag_generic_emphasized_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag_generic_emphasized_obj.gif
new file mode 100644
index 0000000..45c1db4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/tag_generic_emphasized_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/text.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/text.gif
new file mode 100644
index 0000000..efa7a38
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/text.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/txtext.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/txtext.gif
new file mode 100644
index 0000000..b226e41
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/txtext.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/warning_obj.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/warning_obj.gif
new file mode 100644
index 0000000..1e5f5eb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/obj16/warning_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/error_ovr.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/error_ovr.gif
new file mode 100644
index 0000000..119dccc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/error_ovr.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/stale_error_ovr.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/stale_error_ovr.gif
new file mode 100644
index 0000000..5b0471b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/stale_error_ovr.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/warn_ovr.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/warn_ovr.gif
new file mode 100644
index 0000000..c350704
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/ovr16/warn_ovr.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/view16/attibute.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/view16/attibute.gif
new file mode 100644
index 0000000..79d49d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/view16/attibute.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/wizban/generatexml_wiz.png b/bundles/org.eclipse.wst.xml.ui/icons/full/wizban/generatexml_wiz.png
new file mode 100644
index 0000000..b17e48a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/wizban/generatexml_wiz.png
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/full/xml_perspective.gif b/bundles/org.eclipse.wst.xml.ui/icons/full/xml_perspective.gif
new file mode 100644
index 0000000..f439b47
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/full/xml_perspective.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/newSampleProject_wiz.gif b/bundles/org.eclipse.wst.xml.ui/icons/newSampleProject_wiz.gif
new file mode 100644
index 0000000..dc96b10
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/newSampleProject_wiz.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/newSampleProject_wizbanner.png b/bundles/org.eclipse.wst.xml.ui/icons/newSampleProject_wizbanner.png
new file mode 100644
index 0000000..be71474
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/newSampleProject_wizbanner.png
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/sourceEditor.gif b/bundles/org.eclipse.wst.xml.ui/icons/sourceEditor.gif
new file mode 100644
index 0000000..75ebdb8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/sourceEditor.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/icons/xmldoc.gif b/bundles/org.eclipse.wst.xml.ui/icons/xmldoc.gif
new file mode 100644
index 0000000..14eb1be
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/icons/xmldoc.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/plugin.properties b/bundles/org.eclipse.wst.xml.ui/plugin.properties
new file mode 100644
index 0000000..afc12c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/plugin.properties
@@ -0,0 +1,141 @@
+###############################################################################
+# Copyright (c) 2001, 2010 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Jens Lukowski/Innoopract - initial renaming/restructuring
+#     David Carver / STAR Standards - added XML Catalog Import/Export Wizard
+#                                     bug 192568
+#     David Carver / STAR Standards - bug 212330 - migrate to org.eclipse.ui.menus 	
+###############################################################################
+providerName=Eclipse Web Tools Platform
+pluginName=Eclipse XML Editors and Tools
+XML.name=XML
+XML_Files.name=XML Files
+XML_Source.name=Editor
+XML_Content_Assist.name=Content Assist
+XML_Validator.name=Validation
+XML_Templates.name=Templates
+XML_Styles.name=Styles
+XML_Syntax_Coloring=Syntax Coloring
+XML_Typing=Typing
+XML_Editor.name=XML Editor
+###############################################################################
+_UI_WIZARD_NEW_XML=XML File
+_UI_WIZARD_XML_CATEGORY=XML
+genMenuLabel=&Generate
+_UI_ACTION_CREATE_XML=&XML File...
+_UI_CREATE_NEW_XML_FILE=Create a new XML file
+_UI_WIZARD_IMPORT_EXPORT_XMLCATALOG=XML Catalog
+_UI_IMPORT_XML_CATALOG_FILE=Import an existing XML Catalog.
+_UI_EXPORT_XML_CATALOG_FILE=Export an XML Catalog.
+XMLExample.name=Editing and validating XML files
+XMLExampleProjectCreationWizard.description=Create a project containing XML sample files
+XMLExampleProjectCreationWizard.projectname=XMLExamples
+XMLExampleProjectCreationWizard.pagetitle=XML sample files for editing and validating
+XMLExampleProjectCreationWizard.pagedescription=Create a project containing XML sample files.
+XMLExampleProjectCreationWizard.label=&Project Name:
+###############################################################################
+All_XML_context_type_Extension_Element.name=All XML
+XML_New_context_type_Extension_Element.name=New XML
+XML_Tag_context_type_Extension_Element.name=XML Tag
+XML_Attribute_context_type_Extension_Element.name=XML Attribute
+XML_Attribute_value_context_type_Extension_Element.name=XML Attribute value
+###############################################################################
+AddTask.label=Add &Task...
+AddTask.tooltip=Add Task...
+AddBookmark.label=Add Boo&kmark...
+AddBookmark.tooltip=Add Bookmark...
+SelectRuler.label=Select Ruler
+###############################################################################
+XML_Catalog_File_Type_Extension_Point.name=XML Catalog file type extension point
+_UI_PREF_XML_CATALOG=XML Catalog
+_UI_PREF_DTD_FILES=DTD Files
+_UI_PREF_XSD_FILES=XSD Files
+_UI_PREF_TAGLIB_DEF_FILES=Taglib Definition Files
+_UI_PREF_CATALOG_FILES=XML Catalog Files
+###############################################################################
+_UI_XML_VALIDATOR                   = XML Validator
+_UI_REF_FILE_SHOW_DETAILS           = Show Details...
+_UI_MENU_VALIDATE_XML               = Validate XML File
+##
+CleanupDocument_label=Cleanup Document...
+CleanupDocument_tooltip=Cleanup Document
+ToggleComment_label=Toggle Comment
+ToggleComment_tooltip=Toggle Comment
+AddBlockComment_label=Add Block Comment
+AddBlockComment_tooltip=Add Block Comment
+RemoveBlockComment_label=Remove Block Comment
+RemoveBlockComment_tooltip=Remove Block Comment
+FindOccurrences_label=Occurrences in File
+##
+preferenceKeywords.files=editor xml creating saving files suffix specified encoding iana
+preferenceKeywords.source=editor xml source formatting line width split multiple attributes new clear blank indent tabs spaces size content assist automatically suggestions prompt characters inserted strategy lax strict grammar constraints inferred absence dtd schema
+preferenceKeywords.contentassist=xml editor content code assist complete completion insert overwrite single proposal common prefix automatically import fill argument name guess alphabetical hide auto activation trigger category categories separate specific
+preferenceKeywords.templates=editor xml templates snippet macros
+preferenceKeywords.styles=editor xml style customize syntax highlighting type text content foreground background bold color
+preferenceKeywords.xmlcatalog=xml catalog entries
+preferenceKeywords.severities=xml grammar errors warnings ignore options severity severities suppress project specific projectspecific
+
+##
+XML_Source_target_name=XML Editors
+XML_hyperlink=Tags And Attributes
+##
+DesignMenu_name=&Design
+ReloadDependencies_name=Reload Dependencies
+ReloadDependencies_description=Reload Dependencies
+ReloadDependencies_mnemonic=R
+Constraints_name=Turn off Grammar Constraints
+Constraints_description=Turn off grammar Constraints
+Constraints_mnemonic=T
+ExpandAll_name=Expand All
+CollapseAll_name=Collapse All
+ActionDefinition.nextSibling.name=Next Sibling
+ActionDefinition.nextSibling.description=Go to Next Sibling
+ActionDefinition.previousSibling.name=Previous Sibling
+ActionDefinition.previousSibling.description=Go to Previous Sibling
+ActionDefinition.gotoMatchingTag.name=Matching Tag
+ActionDefinition.gotoMatchingTag.description=Go to Matching Tag
+MatchingTagPreference.label=Matching Tags
+
+scope.structured.text.editor.xml.name=Editing XML Source
+scope.structured.text.editor.xml.description=Editing XML Source
+scope.structured.text.editor.xml.navigation.name=XML Source Navigation
+scope.structured.text.editor.xml.navigation.description=XML Source Navigation
+scope.structured.text.editor.xml.cleanup.name=XML Source Cleanup
+scope.structured.text.editor.xml.cleanup.description=XML Source Cleanup
+scope.structured.text.editor.xml.comments.name=XML Source Comments
+scope.structured.text.editor.xml.comments.description=XML Source Comments
+scope.structured.text.editor.xml.selection.name=XML Source Selection
+scope.structured.text.editor.xml.selection.description=XML Source Selection
+scope.structured.text.editor.xml.dependencies.name=XML Source Dependencies
+scope.structured.text.editor.xml.dependencies.description=XML Source Dependencies
+scope.structured.text.editor.xml.grammar.name=XML Source Grammar
+scope.structured.text.editor.xml.grammar.description=XML Source Grammar
+scope.structured.text.editor.xml.expand.name=XML Source Expand/Collapse
+scope.structured.text.editor.xml.expand.description=XML Source Expand/Collapse
+scope.structured.text.editor.xml.occurrences.name=XML Source Occurrences
+scope.structured.text.editor.xml.occurrences.description=XML Source Occurrences
+
+Colors.tagAttributeName=Tag Attribute Name
+Colors.tagAttributeValue=Tag Attribute Value
+Colors.commentBorder=Comment Border
+Colors.commentText=Comment Text
+Colors.declBorder=Declaration Border
+Colors.doctypeName=Doctype Name
+Colors.doctypeExternalPubref=Doctype External Public Reference
+Colors.doctypeExternalId=Doctype External Id
+Colors.doctypeExtrenalSysref=Doctype External System Reference
+Colors.tagBorder=Tag Border
+Colors.tagName=Tag Name
+Colors.piBorder=Processing Instruction Border
+Colors.cdataBorder=CDATA Border
+Colors.cdataText=CDATA Text
+Colors.entityReference=Entity Reference
+# content assist
+proposalCategory.xmlTags=XML Tag Proposals
+proposalCategory.xmlTemplates=XML Template Proposals
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/plugin.xml b/bundles/org.eclipse.wst.xml.ui/plugin.xml
new file mode 100644
index 0000000..e0a183a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/plugin.xml
@@ -0,0 +1,1650 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.3"?>
+<plugin>
+
+	<extension-point id="catalogFileType" name="%XML_Catalog_File_Type_Extension_Point.name" schema="schema/catalogFileType.exsd"/>
+
+	<extension point="org.eclipse.wst.xml.ui.catalogFileType">
+		<fileType
+			extensions="dtd, ent, mod"
+			description="%_UI_PREF_DTD_FILES"
+			id="org.eclipse.wst.xml.core.ui.catalogFileType.dtd">
+		</fileType>
+		<fileType
+			extensions="xsd"
+			description="%_UI_PREF_XSD_FILES"
+			id="org.eclipse.wst.xml.core.ui.catalogFileType.xsd">
+		</fileType>
+		<fileType
+			extensions="tld"
+			description="%_UI_PREF_TAGLIB_DEF_FILES"
+			id="org.eclipse.wst.xml.core.ui.catalogFileType.tld">
+		</fileType>
+		<fileType
+			extensions="xml, cat, xmlcatalog"
+			description="%_UI_PREF_CATALOG_FILES"
+			id="org.eclipse.wst.xml.core.ui.catalogFileType.cat">
+		</fileType>
+	</extension>
+
+	<!--The org.eclipse.wst.xml.core.xmlsource content type is only for
+		handling some special cases of ill-formed xml in a reasonable
+		manner, and should not be emulated by clients. The two content
+		types are often used interchangeably by the XML component, but
+		please use org.eclipse.core.runtime.xml instead. -->
+	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
+		<sourceViewerConfiguration
+			class="org.eclipse.wst.xml.ui.StructuredTextViewerConfigurationXML"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<contentOutlineConfiguration
+			class="org.eclipse.wst.xml.ui.views.contentoutline.XMLContentOutlineConfiguration"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<quickOutlineConfiguration
+			class="org.eclipse.wst.xml.ui.internal.quickoutline.XMLQuickOutlineConfiguration"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<propertySheetConfiguration
+			class="org.eclipse.wst.xml.ui.views.properties.XMLPropertySheetConfiguration"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<documentationTextHover
+        	class="org.eclipse.wst.xml.ui.internal.taginfo.XMLTagInfoHoverProcessor"
+        	target="org.eclipse.wst.xml.XML_DEFAULT">
+  		</documentationTextHover>
+  		<doubleClickStrategy
+        	class="org.eclipse.wst.xml.ui.internal.doubleclick.XMLDoubleClickStrategy"
+        	target="org.eclipse.wst.xml.XML_DEFAULT">
+  		</doubleClickStrategy>
+		<provisionalConfiguration
+			type="sourceeditingtexttools"
+			class="org.eclipse.wst.xml.ui.internal.provisional.XMLSourceEditingTextTools"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalConfiguration
+			type="characterpairmatcher"
+			class="org.eclipse.wst.xml.ui.internal.text.XMLDocumentRegionEdgeMatcher"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalConfiguration
+			type="foldingstrategy"
+			class="org.eclipse.wst.xml.ui.internal.projection.XMLFoldingStrategy"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalConfiguration
+			type="org.eclipse.jface.text.quickassist.IQuickAssistProcessor"
+			class="org.eclipse.wst.xml.ui.internal.correction.XMLQuickAssistProcessor"
+			target="org.eclipse.wst.xml.XML_DEFAULT" />
+		<provisionalConfiguration
+			type="autoeditstrategy"
+			class="org.eclipse.wst.xml.ui.internal.autoedit.StructuredAutoEditStrategyXML"
+			target="org.eclipse.wst.xml.XML_DEFAULT" />
+		<provisionalDefinition
+			type="preferencepages"
+			value="org.eclipse.wst.xml.ui.preferences.xml.xml, org.eclipse.wst.sse.ui.preferences.xml.source, org.eclipse.wst.sse.ui.preferences.xml.templates, org.eclipse.wst.sse.ui.preferences.xml.colors, org.eclipse.wst.sse.ui.preferences.xml.contentassist"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalDefinition
+			type="spellingregions"
+			value="XML_COMMENT_TEXT, XML_CONTENT, XML_DEFAULT"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalDefinition
+			type="activecontexts"
+			value="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.navigation, org.eclipse.wst.xml.cleanup, org.eclipse.wst.xml.selection, org.eclipse.wst.xml.dependencies, org.eclipse.wst.xml.grammar, org.eclipse.wst.xml.expand, org.eclipse.wst.xml.occurrences, org.eclipse.wst.sse.comments"
+        	target="org.eclipse.core.runtime.xml" />
+	</extension>
+	
+	<extension point="org.eclipse.ui.contexts">
+		<context
+			name="%scope.structured.text.editor.xml.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.description"
+			id="org.eclipse.core.runtime.xml">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.navigation.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.navigation.description"
+			id="org.eclipse.wst.xml.navigation">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.cleanup.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.cleanup.description"
+			id="org.eclipse.wst.xml.cleanup">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.comments.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.comments.description"
+			id="org.eclipse.wst.xml.comments">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.selection.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.selection.description"
+			id="org.eclipse.wst.xml.selection">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.dependencies.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.dependencies.description"
+			id="org.eclipse.wst.xml.dependencies">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.grammar.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.grammar.description"
+			id="org.eclipse.wst.xml.grammar">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.expand.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.expand.description"
+			id="org.eclipse.wst.xml.expand">
+		</context>
+		<context
+			name="%scope.structured.text.editor.xml.occurrences.name"
+			parentId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			description="%scope.structured.text.editor.xml.occurrences.description"
+			id="org.eclipse.wst.xml.occurrences">
+		</context>
+	</extension>
+	
+	<extension
+		point="org.eclipse.core.filebuffers.annotationModelCreation">
+		<factory
+			contentTypeId="org.eclipse.core.runtime.xml"
+			class="org.eclipse.wst.sse.ui.internal.StructuredResourceMarkerAnnotationModelFactory" />
+		<factory
+			contentTypeId="org.eclipse.wst.xml.core.xmlsource"
+			class="org.eclipse.wst.sse.ui.internal.StructuredResourceMarkerAnnotationModelFactory" />
+	</extension>
+	<extension
+		point="org.eclipse.wst.sse.ui.adapterFactoryDescription">
+		<adapterFactoryDescription
+			class="org.eclipse.wst.xml.ui.internal.registry.AdapterFactoryProviderForXML">
+			<contentType id="org.eclipse.core.runtime.xml" />
+			<contentType id="org.eclipse.wst.xml.core.xmlsource" />
+		</adapterFactoryDescription>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<!-- The "top-level" XML category -->
+		<page
+			name="%XML.name"
+			class="org.eclipse.wst.xml.ui.internal.preferences.EmptyFilePreferencePage"
+			id="org.eclipse.wst.xml.ui.preferences.xml">
+		</page>
+		<!-- The "lower level" XML Files category/page -->
+		<page
+			name="%XML_Files.name"
+			category="org.eclipse.wst.xml.ui.preferences.xml"
+			class="org.eclipse.wst.xml.ui.internal.preferences.XMLFilesPreferencePage"
+			id="org.eclipse.wst.xml.ui.preferences.xml.xml">
+         	<keywordReference id="org.eclipse.wst.xml.ui.files"/>
+        </page>
+		<!-- XML PREFERENCE PAGES -->
+		<page
+			name="%XML_Source.name"
+			category="org.eclipse.wst.xml.ui.preferences.xml.xml"
+			class="org.eclipse.wst.xml.ui.internal.preferences.XMLSourcePreferencePage"
+			id="org.eclipse.wst.sse.ui.preferences.xml.source">
+         	<keywordReference id="org.eclipse.wst.xml.ui.source"/>
+		</page>
+		<page
+			name="%XML_Content_Assist.name"
+			category="org.eclipse.wst.sse.ui.preferences.xml.source"
+			class="org.eclipse.wst.xml.ui.internal.preferences.XMLContentAssistPreferencePage"
+			id="org.eclipse.wst.sse.ui.preferences.xml.contentassist">
+         	<keywordReference id="org.eclipse.wst.xml.ui.contentassist"/>
+		</page>
+		<page
+			name="%XML_Templates.name"
+			category="org.eclipse.wst.sse.ui.preferences.xml.source"
+			class="org.eclipse.wst.xml.ui.internal.preferences.XMLTemplatePreferencePage"
+			id="org.eclipse.wst.sse.ui.preferences.xml.templates">
+         	<keywordReference id="org.eclipse.wst.xml.ui.templates"/>
+		</page>
+		<page
+			name="%XML_Syntax_Coloring"
+			category="org.eclipse.wst.sse.ui.preferences.xml.source"
+			class="org.eclipse.wst.xml.ui.internal.preferences.XMLSyntaxColoringPage"
+			id="org.eclipse.wst.sse.ui.preferences.xml.colors">
+         	<keywordReference id="org.eclipse.wst.xml.ui.styles"/>
+		</page>
+		<page
+			name="%_UI_PREF_XML_CATALOG"
+			category="org.eclipse.wst.xml.ui.preferences.xml"
+			class="org.eclipse.wst.xml.ui.internal.catalog.XMLCatalogPreferencePage"
+			id="org.eclipse.wst.xml.core.ui.XMLCatalogPreferencePage">
+         	<keywordReference id="org.eclipse.wst.xml.ui.xmlcatalog"/>
+		</page>
+		<page
+			name="%XML_Typing"
+			category="org.eclipse.wst.sse.ui.preferences.xml.source"
+			class="org.eclipse.wst.xml.ui.internal.preferences.XMLTypingPreferencePage"
+			id="org.eclipse.wst.sse.ui.preferences.xml.typing">
+		</page>
+    	<page
+            name="%XML_Validator.name"
+            category="org.eclipse.wst.xml.ui.preferences.xml.xml"
+            class="org.eclipse.wst.xml.ui.internal.preferences.XMLValidatorPreferencePage"
+            id="org.eclipse.wst.sse.ui.preferences.xml.validation">
+       	    <keywordReference id="org.eclipse.wst.xml.ui.severities"/>
+    	</page>
+	</extension>
+	
+	<!-- Keywords for preference and properties pages -->
+	<extension point="org.eclipse.ui.keywords">
+		<keyword
+			label="%preferenceKeywords.files"
+			id="org.eclipse.wst.xml.ui.files"/>
+		<keyword
+			label="%preferenceKeywords.source"
+			id="org.eclipse.wst.xml.ui.source"/>
+		<keyword
+			label="%preferenceKeywords.contentassist"
+			id="org.eclipse.wst.xml.ui.contentassist"/>
+		<keyword
+			label="%preferenceKeywords.templates"
+			id="org.eclipse.wst.xml.ui.templates"/>
+		<keyword
+			label="%preferenceKeywords.styles"
+			id="org.eclipse.wst.xml.ui.styles"/>
+		<keyword
+			label="%preferenceKeywords.xmlcatalog"
+			id="org.eclipse.wst.xml.ui.xmlcatalog"/>
+		<keyword
+			label="%preferenceKeywords.severities"
+			id="org.eclipse.wst.xml.ui.severities"/>
+    </extension>
+	
+	<!-- Editor actionsets -->
+	<extension point="org.eclipse.ui.actionSetPartAssociations">
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.edit.text.actionSet.annotationNavigation">
+			<part id="org.eclipse.core.runtime.xml.source"></part>
+			<part id="org.eclipse.core.runtime.xml.source2"></part>
+		</actionSetPartAssociation>
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.NavigateActionSet">
+			<part id="org.eclipse.core.runtime.xml.source"></part>
+			<part id="org.eclipse.core.runtime.xml.source2"></part>
+		</actionSetPartAssociation>
+	</extension>
+
+	<!-- Templates -->
+	<extension point="org.eclipse.ui.editors.templates">
+		<contextType
+			name="%All_XML_context_type_Extension_Element.name"
+			class="org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeXML"
+			id="xml_all">
+		</contextType>
+		<contextType
+			name="%XML_New_context_type_Extension_Element.name"
+			class="org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeXML"
+			id="xml_new">
+		</contextType>
+		<contextType
+			name="%XML_Tag_context_type_Extension_Element.name"
+			class="org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeXML"
+			id="xml_tag">
+		</contextType>
+		<contextType
+			name="%XML_Attribute_context_type_Extension_Element.name"
+			class="org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeXML"
+			id="xml_attribute">
+		</contextType>
+		<contextType
+			name="%XML_Attribute_value_context_type_Extension_Element.name"
+			class="org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeXML"
+			id="xml_attribute_value">
+		</contextType>
+		<include
+			file="templates/xmldefault-templates.xml"
+			translations="$nl$/templates/xmldefault-templates.properties">
+		</include>
+	</extension>
+
+	<extension point="org.eclipse.ui.editors">
+		<editor
+			name="%XML_Editor.name"
+			icon="$nl$/icons/xmldoc.gif"
+			contributorClass="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorActionBarContributor"
+			class="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"
+			symbolicFontName="org.eclipse.wst.sse.ui.textfont"
+			id="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart">
+			<contentTypeBinding
+				contentTypeId="org.eclipse.core.runtime.xml" />
+			<contentTypeBinding
+				contentTypeId="org.eclipse.wst.xml.core.xmlsource" />
+
+		</editor>
+	</extension>
+
+	<!-- Editor actionsets -->
+	<extension point="org.eclipse.ui.actionSetPartAssociations">
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.edit.text.actionSet.annotationNavigation">
+			<part
+				id="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart">
+			</part>
+		</actionSetPartAssociation>
+		<actionSetPartAssociation
+			targetID="org.eclipse.ui.NavigateActionSet">
+			<part
+				id="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart">
+			</part>
+		</actionSetPartAssociation>
+	</extension>
+
+
+
+	<!-- ================================================== -->
+	<!-- Contribute a 'New Wizard' for XML files            -->
+	<!-- ================================================== -->
+	<extension point="org.eclipse.ui.newWizards">
+		<category
+			name="%_UI_WIZARD_XML_CATEGORY"
+			id="org.eclipse.wst.XMLCategory">
+		</category>
+		<wizard
+			name="%_UI_WIZARD_NEW_XML"
+			icon="/icons/full/etool16/new_xml.gif"
+			category="org.eclipse.wst.XMLCategory"
+			class="org.eclipse.wst.xml.ui.internal.wizards.NewXMLWizard"
+			id="org.eclipse.wst.xml.ui.internal.wizards.NewXMLWizard">
+			<description>%_UI_CREATE_NEW_XML_FILE</description>
+			<selection class="org.eclipse.core.resources.IResource">
+			</selection>
+		</wizard>
+	</extension>
+
+	<!-- =============================================================================== -->
+	<!-- Allow the 'New XML' wizard to be accessed via the 'Generate' menu on a XSD file -->
+	<!-- =============================================================================== -->
+<!--
+	<extension point="org.eclipse.ui.popupMenus">
+		<objectContribution
+			objectClass="org.eclipse.core.resources.IFile"
+			nameFilter="*.xsd"
+			id="org.eclipse.wst.xmlwizard.createXMLFromXSD">
+			<menu
+				label="%genMenuLabel"
+				path="additions"
+				id="generateXMLArtifacts">
+				<separator name="xml" />
+			</menu>
+			<action
+				label="%_UI_ACTION_CREATE_XML"
+				class="org.eclipse.wst.xml.ui.internal.wizards.XMLImportActionDelegate"
+				menubarPath="generateXMLArtifacts/xml"
+				enablesFor="1"
+				id="org.eclipse.wst.xmlwizard.createXMLFromXSDAction">
+			</action>
+		</objectContribution>
+	</extension>
+-->
+
+	<!-- =============================================================================== -->
+	<!-- Allow the 'New XML' wizard to be accessed via the 'Generate' menu on a DTD file -->
+	<!-- =============================================================================== -->
+<!--	
+	<extension point="org.eclipse.ui.popupMenus">
+		<objectContribution
+			objectClass="org.eclipse.core.resources.IFile"
+			nameFilter="*.dtd"
+			id="org.eclipse.wst.xmlwizard.createXMLFromDTD">
+			<menu
+				label="%genMenuLabel"
+				path="additions"
+				id="generateXMLArtifacts">
+				<separator name="xml" />
+			</menu>
+			<action
+				label="%_UI_ACTION_CREATE_XML"
+				class="org.eclipse.wst.xml.ui.internal.wizards.XMLImportActionDelegate"
+				menubarPath="generateXMLArtifacts/xml"
+				enablesFor="1"
+				id="org.eclipse.wst.xmlwizard.createXMLFromDTDAction">
+			</action>
+		</objectContribution>
+	</extension>
+-->
+
+	<!-- =============================================================================== -->
+	<!-- Contribute a New->Example... entry for Editing and Validating XML files         -->
+	<!-- =============================================================================== -->
+
+	<!-- define the XMLSamples project wizard -->
+	<extension point="org.eclipse.ui.newWizards">
+		<category
+			name="%_UI_WIZARD_XML_CATEGORY"
+			parentCategory="org.eclipse.ui.Examples"
+			id="org.eclipse.wst.xml.examples">
+		</category>
+		<wizard
+			name="%XMLExample.name"
+			class="org.eclipse.wst.xml.ui.internal.wizards.ExampleProjectCreationWizard"
+			category="org.eclipse.ui.Examples/org.eclipse.wst.xml.examples"
+			id="org.eclipse.wst.xml.ui.XMLExampleProjectCreationWizard"
+			project="true"
+			icon="$nl$/icons/newSampleProject_wiz.gif">
+			<description>
+				%XMLExampleProjectCreationWizard.description
+			</description>
+		</wizard>
+	</extension>
+
+	<!-- configure the XMLSamples project wizard -->
+	<extension
+		point="org.eclipse.wst.common.ui.exampleProjectCreationWizard"
+		id="XMLExampleProjectCreationWizardExtension">
+		<wizard
+			id="org.eclipse.wst.xml.ui.XMLExampleProjectCreationWizard"
+			banner="icons/newSampleProject_wizbanner.png">
+			<projectsetup
+				pagetitle="%XMLExampleProjectCreationWizard.pagetitle"
+				name="%XMLExampleProjectCreationWizard.projectname"
+				label="%XMLExampleProjectCreationWizard.label"
+				pagedescription="%XMLExampleProjectCreationWizard.pagedescription"
+				open="readme.html">
+				<import
+					dest=""
+					src="examples/EditingAndValidatingXML.zip" />
+			</projectsetup>
+		</wizard>
+	</extension>
+
+	<extension point="org.eclipse.core.runtime.adapters">
+		<factory
+			adaptableType="org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel"
+			class="org.eclipse.wst.xml.ui.internal.editor.DOMSelectionConvertorFactory">
+			<adapter
+            	type="org.eclipse.wst.sse.ui.internal.editor.SelectionConvertor"/>
+		</factory>
+		<factory
+			adaptableType="org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel"
+			class="org.eclipse.wst.xml.ui.internal.spelling.SpellcheckDelegateAdapterFactory">
+			<adapter
+            	type="org.eclipse.wst.sse.ui.internal.spelling.ISpellcheckDelegate"/>
+		</factory>
+	</extension>
+
+	<!-- initialize xml ui preferences -->
+	<extension point="org.eclipse.core.runtime.preferences">
+		<initializer
+			class="org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceInitializer" />
+	</extension>
+
+	<extension point="org.eclipse.wst.sse.ui.sourcevalidation">
+		<validator
+			scope="total"
+			class="org.eclipse.wst.xml.ui.internal.validation.DelegatingSourceValidatorForXML"
+			id="org.eclipse.wst.xml.ui.internal.validation.DelegatingSourceValidatorForXML">
+			<contentTypeIdentifier id="org.eclipse.core.runtime.xml">
+				<partitionType id="org.eclipse.wst.xml.XML_DEFAULT"/>
+				<partitionType id="org.eclipse.wst.xml.XML_COMMENT"/>
+				<partitionType id="org.eclipse.wst.sse.ST_DEFAULT"/>
+                <partitionType id="org.eclipse.wst.xml.XML_PI"/> 
+			</contentTypeIdentifier>
+			<contentTypeIdentifier id="org.eclipse.wst.xml.core.xmlsource">
+				<partitionType id="org.eclipse.wst.xml.XML_DEFAULT"/>
+				<partitionType id="org.eclipse.wst.xml.XML_COMMENT"/>
+				<partitionType id="org.eclipse.wst.sse.ST_DEFAULT"/>
+                <partitionType id="org.eclipse.wst.xml.XML_PI"/>
+			</contentTypeIdentifier>
+		</validator>
+	</extension>
+	
+		
+   <extension point="org.eclipse.ui.editors.annotationTypes">
+      <type name="org.eclipse.wst.xml.ui.matching.tag"/>
+   </extension>
+   <extension point="org.eclipse.ui.editors.markerAnnotationSpecification">
+      <specification
+      		includeOnPreferencePage="true"
+            colorPreferenceValue="212,212,212"
+            annotationType="org.eclipse.wst.xml.ui.matching.tag"
+            colorPreferenceKey="matchingTagIndicationColor"
+            presentationLayer="4"
+            label="%MatchingTagPreference.label"
+            icon="icons/full/obj16/tag-generic.gif"
+            textPreferenceValue="false"
+            textPreferenceKey="matchingTagIndication"
+            highlightPreferenceKey="matchingTagHighlight"
+            highlightPreferenceValue="true"
+            verticalRulerPreferenceKey="matchingTagVerticalRuler"
+            verticalRulerPreferenceValue="false"
+            overviewRulerPreferenceKey="matchingTagIndicationInOverviewRuler"
+            overviewRulerPreferenceValue="true"
+            textStylePreferenceKey="matchingTagTextStyle"
+			textStylePreferenceValue="NONE">
+      </specification>
+   </extension>
+
+	<!--======================================================================================-->
+	<!-- Document provider for ExternalFileEditorInput                                        -->
+	<!--======================================================================================-->
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider
+			inputTypes="org.eclipse.wst.xml.ui.internal.hyperlink.ExternalFileEditorInput"
+			class="org.eclipse.ui.editors.text.TextFileDocumentProvider"
+			id="org.eclipse.wst.xml.ui.internal.ExternalFileDocumentProvider">
+		</provider>
+	</extension>
+
+	<!-- To Do: migrate this to the org.eclipse.ui.menus popup: format -->
+	<extension point="org.eclipse.ui.popupMenus">
+		<viewerContribution
+			targetID="org.eclipse.core.runtime.xml.source.RulerContext"
+			id="org.eclipse.ui.texteditor.ruler.context.actions">
+			<action
+				label="%AddTask.label"
+				helpContextId="org.eclipse.ui.AddTask_action_context"
+				class="org.eclipse.ui.texteditor.TaskRulerAction"
+				tooltip="%AddTask.tooltip"
+				menubarPath="additions"
+				id="org.eclipse.ui.texteditor.TaskRulerAction">
+			</action>
+			<action
+				label="%AddBookmark.label"
+				helpContextId="org.eclipse.ui.bookmark_action_context"
+				class="org.eclipse.ui.texteditor.BookmarkRulerAction"
+				tooltip="%AddBookmark.tooltip"
+				menubarPath="additions"
+				id="org.eclipse.ui.texteditor.BookmarkRulerAction">
+			</action>
+		</viewerContribution>
+	</extension>
+
+	<!--======================================================================================-->
+	<!-- Pop-up menu and associated command/handler for nested validation messages.           -->
+	<!--======================================================================================-->
+
+	<extension point="org.eclipse.ui.menus">
+      <menuContribution locationURI="popup:org.eclipse.ui.ide.MarkersView">
+          <command commandId="org.eclipse.wst.xml.ui.referencedFileErrors">
+             <visibleWhen checkEnabled="false">
+				<reference definitionId="org.eclipse.wst.xml.ui.referencedFileErrors" />
+             </visibleWhen>
+         </command>
+      </menuContribution>
+	</extension>
+	
+	<extension point="org.eclipse.ui.commands">
+		<command
+			description="%_UI_REF_FILE_SHOW_DETAILS"
+			id="org.eclipse.wst.xml.ui.referencedFileErrors" 
+			name="%_UI_REF_FILE_SHOW_DETAILS" />
+	</extension>
+	
+    <extension point="org.eclipse.ui.handlers">
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.validation.core.errorinfo.ReferencedFileErrorsHandler"
+             commandId="org.eclipse.wst.xml.ui.referencedFileErrors">
+             <enabledWhen>
+				<reference definitionId="org.eclipse.wst.xml.ui.referencedFileErrors" />
+             </enabledWhen>
+       </handler>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.propertyTesters">
+	   <propertyTester
+	         class="org.eclipse.wst.xml.ui.internal.validation.core.errorinfo.GroupNamePropertyTester"
+	         id="org.eclipse.wst.xml.ui.markerGroupNamePropertyTester"
+	         namespace="org.eclipse.wst.xml.ui"
+	         properties="groupNamePrefix"
+	         type="org.eclipse.core.resources.IMarker">
+	   </propertyTester>
+	</extension>
+	 
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.referencedFileErrors">
+                <and>
+                   <count value="1" />
+                   <with variable="selection">
+                   		<iterate operator="or">
+                      		<adapt type="org.eclipse.core.resources.IMarker">
+                            	<test property="org.eclipse.wst.xml.ui.groupNamePrefix" value="referencedFileError" forcePluginActivation="true" />
+                      		</adapt>
+                   		</iterate>
+                	</with>
+                </and>
+		</definition>
+	</extension>	 
+
+<!--	
+	<extension point="org.eclipse.ui.editorActions">
+		<editorContribution
+			id="org.eclipse.core.runtime.xml.source.editorActions"
+			targetID="org.eclipse.core.runtime.xml.source">
+			<action
+				id="CleanupDocument"
+				label="%CleanupDocument_label"
+				definitionId="org.eclipse.wst.sse.ui.cleanup.document"
+				tooltip="%CleanupDocument_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.actions.CleanupActionXMLDelegate"
+				actionID="CleanupDocument">
+			</action>
+			<action
+				id="ToggleComment"
+				label="%ToggleComment_label"
+				definitionId="org.eclipse.wst.sse.ui.toggle.comment"
+				tooltip="%ToggleComment_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.actions.ToggleCommentActionXMLDelegate"
+				actionID="ToggleComment">
+			</action>
+			<action
+				id="AddBlockComment"
+				label="%AddBlockComment_label"
+				definitionId="org.eclipse.wst.sse.ui.add.block.comment"
+				tooltip="%AddBlockComment_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.actions.AddBlockCommentActionXMLDelegate"
+				actionID="AddBlockComment">
+			</action>
+			<action
+				id="RemoveBlockComment"
+				label="%RemoveBlockComment_label"
+				definitionId="org.eclipse.wst.sse.ui.remove.block.comment"
+				tooltip="%RemoveBlockComment_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.actions.RemoveBlockCommentActionXMLDelegate"
+				actionID="RemoveBlockComment">
+			</action>
+			<action
+				id="FindOccurrences"
+				label="%FindOccurrences_label"
+				definitionId="org.eclipse.wst.sse.ui.search.find.occurrences"
+				class="org.eclipse.wst.xml.ui.internal.search.XMLFindOccurrencesActionDelegate"
+				actionID="FindOccurrences">
+			</action>
+			<action
+				id="StructureSelectEnclosing"
+				label="%StructureSelectEnclosing_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.enclosing"
+				tooltip="%StructureSelectEnclosing_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.selection.StructuredSelectEnclosingXMLActionDelegate"
+				actionID="StructureSelectEnclosing">
+			</action>
+			<action
+				id="StructureSelectNext"
+				label="%StructureSelectNext_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.next"
+				tooltip="%StructureSelectNext_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.selection.StructuredSelectNextXMLActionDelegate"
+				actionID="StructureSelectNext">
+			</action>
+			<action
+				id="StructureSelectPrevious"
+				label="%StructureSelectPrevious_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.previous"
+				tooltip="%StructureSelectPrevious_tooltip"
+				class="org.eclipse.wst.xml.ui.internal.selection.StructuredSelectPreviousXMLActionDelegate"
+				actionID="StructureSelectPrevious">
+			</action>
+			<action
+				id="StructureSelectHistory"
+				label="%StructureSelectHistory_label"
+				definitionId="org.eclipse.wst.sse.ui.structure.select.last"
+				tooltip="%StructureSelectHistory_tooltip"
+				class="org.eclipse.wst.sse.ui.internal.selection.StructuredSelectHistoryActionDelegate"
+				actionID="StructureSelectHistory">
+			</action>
+		</editorContribution>
+        <editorContribution
+            targetID="org.eclipse.core.runtime.xml.source"
+            id="org.eclipse.core.runtime.xml.source.ruler.actions">
+         <action
+               label="%AddBookmark.label"
+               helpContextId="org.eclipse.ui.bookmark_action_context"
+               class="org.eclipse.ui.texteditor.BookmarkRulerAction"
+               actionID="RulerDoubleClick"
+               id="org.eclipse.ui.texteditor.BookmarkRulerAction"/>
+         <action
+               label="%SelectRuler.label"
+               class="org.eclipse.ui.texteditor.SelectRulerAction"
+               actionID="RulerClick"
+               id="org.eclipse.ui.texteditor.SelectRulerAction"/>
+        </editorContribution>
+	</extension>
+-->
+
+	<extension
+		point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
+		<target
+			id="org.eclipse.core.runtime.xml"
+			name="%XML_Source_target_name">
+		</target>
+	</extension>
+	<extension
+		point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+		<hyperlinkDetector
+			class="org.eclipse.wst.xml.ui.internal.hyperlink.XMLHyperlinkDetector"
+			id="org.eclipse.wst.xml.ui.internal.hyperlink.XMLHyperlinkDetector"
+			name="%XML_hyperlink"
+			targetId="org.eclipse.core.runtime.xml">
+		</hyperlinkDetector>
+   </extension>
+ <extension
+       point="org.eclipse.ui.importWizards">
+    <category
+          id="org.eclipse.wst.XMLCategory"
+          name="%_UI_WIZARD_XML_CATEGORY">
+    </category>
+    <wizard
+          category="org.eclipse.wst.XMLCategory"
+          class="org.eclipse.wst.xml.ui.internal.wizards.ImportXMLCatalogWizard"
+          icon="icons/xmldoc.gif"
+          id="org.eclipse.wst.xml.ui.internal.wizards.ImportXMLCatalogWizard"
+          name="%_UI_WIZARD_IMPORT_EXPORT_XMLCATALOG">
+       <description>
+          %_UI_IMPORT_XML_CATALOG_FILE
+       </description>
+    </wizard>
+ </extension>
+ <extension
+       point="org.eclipse.ui.exportWizards">
+    <category
+          id="org.eclipse.wst.XMLCategory"
+          name="%_UI_WIZARD_XML_CATEGORY">
+    </category>
+    <wizard
+          category="org.eclipse.wst.XMLCategory"
+          class="org.eclipse.wst.xml.ui.internal.wizards.ExportXMLCatalogWizard"
+          icon="icons/xmldoc.gif"
+          id="org.eclipse.wst.xml.ui.internal.wizards.ExportXMLCatalogWizard"
+          name="%_UI_WIZARD_IMPORT_EXPORT_XMLCATALOG">
+       <description>
+          %_UI_EXPORT_XML_CATALOG_FILE
+       </description>
+    </wizard>
+ </extension>
+
+	<extension point="org.eclipse.ui.commands">
+		<!-- Navigate commands -->
+		<command
+			name="%ActionDefinition.nextSibling.name"
+			description="%ActionDefinition.nextSibling.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.xml.ui.nextSibling">
+		</command>
+		<command
+			name="%ActionDefinition.previousSibling.name"
+			description="%ActionDefinition.previousSibling.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.xml.ui.previousSibling">
+		</command>
+		<command
+			name="%ActionDefinition.gotoMatchingTag.name"
+			description="%ActionDefinition.gotoMatchingTag.description"
+			categoryId="org.eclipse.ui.category.edit"
+			id="org.eclipse.wst.xml.ui.gotoMatchingTag">
+		</command>
+	</extension>
+
+	<extension point="org.eclipse.ui.bindings">
+      <!--  win32:  M1=CTRL,    M2=SHIFT, M3=ALT, M4=-
+            carbon: M1=COMMAND, M2=SHIFT, M3=ALT, M4=CTRL
+            gtk: ? 
+      -->
+      <!-- Navigate commands -->
+		<key
+			sequence="M1+M2+ARROW_UP"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.xml.ui.previousSibling"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+		<key
+			platform="carbon"
+			sequence="CTRL+SHIFT+ARROW_UP"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.xml.ui.previousSibling"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+		<key
+			sequence="M1+M2+ARROW_DOWN"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.xml.ui.nextSibling"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+		<key
+			platform="carbon"
+			sequence="CTRL+SHIFT+ARROW_DOWN"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.xml.ui.nextSibling"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+		<key
+			sequence="M1+M2+&gt;"
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.xml.ui.gotoMatchingTag"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+		<key
+			platform="carbon"
+			sequence="CTRL+SHIFT+."
+			contextId="org.eclipse.wst.sse.ui.structuredTextEditorScope"
+			commandId="org.eclipse.wst.xml.ui.gotoMatchingTag"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+			
+	</extension>
+	
+<!--
+   This section contains the new org.eclipse.ui.menus extions points and command handler
+   definitions.
+ -->
+ 
+	<extension point="org.eclipse.ui.menus">
+		<!-- Unable to contribute to Search menu at the moment due to bug 213385 -->
+<!--
+		<menuContribution locationURI="menu:org.eclipse.search.menu">
+-->
+	    <menuContribution locationURI="menu:goTo?after=matchingEnd">
+<!--		
+	       <command commandId="org.eclipse.wst.xml.ui.gotoMatchingTag" id="GoToMatchingTag" label="%GoToMatchingTag_label" style="push">
+			   <visibleWhen checkEnabled="false">
+				   <reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"></reference>
+			   </visibleWhen>
+	       </command>
+-->		
+	       <separator name="goToSiblingsBegin" visible="true"></separator>
+	       <command commandId="org.eclipse.wst.xml.ui.nextSibling" id="GoToNextSibling" label="%ActionDefinition.nextSibling.name" style="push">
+			   <visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.xml.ui.navigation"></reference>
+				</visibleWhen>
+	       </command>
+	       <command commandId="org.eclipse.wst.xml.ui.previousSibling" id="GoToPreviousSibling" label="%ActionDefinition.previousSibling.name" style="push">
+			   <visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.wst.xml.ui.navigation"></reference>
+				</visibleWhen>
+	       </command>
+	       <separator name="goToSiblingsEnd" visible="false"></separator>
+		</menuContribution>
+       <menuContribution
+           locationURI="menu:org.eclipse.ui.main.menu?before=window">
+        <menu
+              id="org.eclipse.wst.xml.ui.designMenuId"
+              label="%DesignMenu_name">
+           <separator
+                 name="designStart">
+           </separator>
+           <command
+                 commandId="org.eclipse.wst.xml.ui.disable.grammar.constraints"
+                 icon="icons/full/etool16/constrainon.gif"
+                 id="ToggleGrammarConstraints"
+                 mnemonic="%Constraints_mnemonic"
+                 style="push">
+                 <visibleWhen checkEnabled="false">
+                	 <and>
+                       <reference definitionId="org.eclipse.wst.xml.ui.grammar"/>
+                       <not>
+                         <reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+                       </not>
+                    </and>
+                 </visibleWhen>
+           </command>
+           <command
+                 commandId="org.eclipse.wst.xml.ui.reload.dependecies"
+                 icon="icons/full/etool16/rldgrmr.gif"
+                 id="ReloadDependencies"
+                 mnemonic="%ReloadDependencies_mnemonic"
+                 style="push">
+                 <visibleWhen checkEnabled="false">
+                	<and>
+                       <reference definitionId="org.eclipse.wst.xml.ui.dependencies"/>
+                       <not>
+                         <reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+                       </not>
+                    </and>
+                 </visibleWhen>
+           </command>
+           <separator
+                 name="expand"
+                 visible="true">
+           </separator>
+           
+           <command
+                 commandId="sed.tabletree.expandAll"
+                 icon="icons/full/etool16/expand_all.gif"
+                 id="ExpandAll"
+                 style="push">
+                 <visibleWhen checkEnabled="false">
+                    <and>
+                       <reference definitionId="org.eclipse.wst.xml.ui.expand"/>
+                       <not>
+                         <reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+                       </not>
+                    </and>
+                 </visibleWhen>
+           </command>
+           <command
+                 commandId="sed.tabletree.collapseAll"
+                 icon="icons/full/etool16/collapse_all.gif"
+                 id="CollapseAll"
+                 style="push">
+                 <visibleWhen checkEnabled="false">
+                    <and>
+                       <reference definitionId="org.eclipse.wst.xml.ui.expand"/>
+                       <not>
+                         <reference definitionId="org.eclipse.wst.sse.ui.sseActiveContext.definition"/>
+                       </not>
+                    </and>
+                 </visibleWhen>
+           </command>
+           
+           <separator
+                 name="additions"
+                 visible="true">
+           </separator>
+           <separator
+                 name="designEnd"
+                 visible="false">
+           </separator>
+        </menu>
+     </menuContribution>
+     <menuContribution locationURI="menu:edit?after=additions">
+		<command commandId="org.eclipse.ui.edit.text.contentAssist.proposals" id="XMLContentAssist" style="push">
+		   <visibleWhen checkEnabled="false">
+				<reference definitionId="org.eclipse.wst.xml.ui.xmlSourceContributions.definition"></reference>
+			</visibleWhen>
+		</command>
+	</menuContribution>		
+     <menuContribution
+           locationURI="popup:org.eclipse.ui.popup.any?after=additions">
+        <menu
+              id="generateMenuId"
+              label="%genMenuLabel">
+	        <command
+	              commandId="org.eclipse.wst.sse.ui.generate.xml"
+	              id="GenerateXML"
+	              style="push">
+	           <visibleWhen checkEnabled="false">
+	              <or>
+					<iterate ifEmpty="false">
+						<adapt
+							type="org.eclipse.core.resources.IFile">
+							<test
+								property="org.eclipse.wst.sse.core.resources.contentTypeId"
+                    			value="org.eclipse.wst.xsd.core.xsdsource">
+							</test>
+						</adapt>
+					</iterate>
+					<iterate ifEmpty="false">
+						<adapt
+							type="org.eclipse.core.resources.IFile">
+							<test
+								property="org.eclipse.wst.sse.core.resources.contentTypeId"
+                    			value="org.eclipse.wst.dtd.core.dtdsource">
+							</test>
+						</adapt>
+					</iterate>
+				 </or>	
+	           </visibleWhen>
+	        </command>
+        </menu>
+     </menuContribution>
+     
+     <menuContribution
+           locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
+        <toolbar
+              id="org.eclipse.wst.xml.ui.design.DesignToolBar">
+           <separator
+                 name="sed.tabletree.separator.1"
+                 visible="true">
+           </separator>
+           <command
+                 commandId="org.eclipse.wst.xml.ui.disable.grammar.constraints"
+                 icon="icons/full/etool16/constrainon.gif"
+                 id="ToggleGrammarConstraints"
+                 style="push"
+                 tooltip="%Constraints_name">
+	           <visibleWhen
+	                 checkEnabled="false">
+	              <reference
+	                    definitionId="org.eclipse.wst.xml.ui.grammar">
+	              </reference>
+	           </visibleWhen>
+           </command>
+           <command
+                 commandId="org.eclipse.wst.xml.ui.reload.dependecies"
+                 icon="icons/full/etool16/rldgrmr.gif"
+                 id="ReloadDependencies"
+                 style="push">
+	           <visibleWhen
+	                 checkEnabled="false">
+	              <reference
+	                    definitionId="org.eclipse.wst.xml.ui.dependencies">
+	              </reference>
+	           </visibleWhen>
+           </command>
+        </toolbar>
+     </menuContribution>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.xmlSourceContributions.definition">
+            <with variable="activeContexts">
+	           <iterate operator="or">
+	              <equals value="org.eclipse.core.runtime.xml"/>
+	           </iterate>
+            </with>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.core">
+			<with variable="activeContexts">
+				<iterate operator="or">
+					<equals value="org.eclipse.core.runtime.xml"/>
+				</iterate>
+			</with>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.occurrences">
+            <with variable="activeContexts">
+	           <iterate operator="or">
+	              <equals value="org.eclipse.wst.xml.occurrences"/>
+	           </iterate>
+            </with>
+		</definition>
+	</extension>
+
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.comments">
+			<with variable="activeContexts">
+				<iterate operator="or">
+					<equals value="org.eclipse.wst.xml.comments"/>
+				</iterate>
+			</with>
+		</definition>
+	</extension>
+
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.cleanup">
+			<with variable="activeContexts">
+				<iterate operator="or">
+					<equals value="org.eclipse.wst.xml.cleanup"/>
+				</iterate>
+			</with>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.navigation">
+			<with variable="activeContexts">
+				<iterate operator="or">
+					<equals value="org.eclipse.wst.xml.navigation"/>
+				</iterate>
+			</with>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.selection">
+			<with variable="activeContexts">
+				<iterate operator="or">
+					<equals value="org.eclipse.wst.xml.selection"/>
+				</iterate>
+			</with>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.dependencies">
+			<or>
+				<with variable="activeEditorId">
+					<equals value="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"></equals>
+				</with>
+				<with variable="activeContexts">
+					<iterate operator="or">
+						<equals value="org.eclipse.wst.xml.dependencies"/>
+					</iterate>
+				</with>
+			</or>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.grammar">
+			<or>
+				<with variable="activeEditorId">
+					<equals value="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"></equals>
+				</with>
+				<with variable="activeContexts">
+					<iterate operator="or">
+						<equals value="org.eclipse.wst.xml.grammar"/>
+					</iterate>
+				</with>
+			</or>
+		</definition>
+	</extension>
+	
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.expand">
+			<or>
+				<with variable="activeEditorId">
+					<equals value="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"></equals>
+				</with>
+				<with variable="activeContexts">
+					<iterate operator="or">
+						<equals value="org.eclipse.wst.xml.expand"/>
+					</iterate>
+				</with>
+			</or>
+		</definition>
+	</extension>
+	
+    <extension
+       point="org.eclipse.ui.handlers">
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.CleanupdocumentHandler"
+             commandId="org.eclipse.wst.sse.ui.cleanup.document">
+          <activeWhen>
+			 <reference definitionId="org.eclipse.wst.xml.ui.cleanup"/>
+          </activeWhen>
+          <enabledWhen>
+             <reference definitionId="org.eclipse.wst.xml.ui.cleanup"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.StructuredSelectEnclosingXMLHandler"
+             commandId="org.eclipse.wst.sse.ui.structure.select.enclosing">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.StructuredSelectNextXMLHandler"
+             commandId="org.eclipse.wst.sse.ui.structure.select.next">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.StructuredSelectPreviousXMLHandler"
+             commandId="org.eclipse.wst.sse.ui.structure.select.previous">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.sse.ui.internal.handlers.StructuredSelectHistoryHandler"
+             commandId="org.eclipse.wst.sse.ui.structure.select.last">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.selection"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.XMLFindOccurencesHandler"
+             commandId="org.eclipse.wst.sse.ui.search.find.occurrences">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.occurrences"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.occurrences"/>
+          </enabledWhen>
+       </handler>
+<!--
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.GoToMatchingTagHandler"
+             commandId="org.eclipse.wst.xml.ui.gotoMatchingTag">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.navigation"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.navigation"/>
+          </enabledWhen>
+       </handler>
+-->
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.NextSiblingNavigationHandler"
+             commandId="org.eclipse.wst.xml.ui.nextSibling">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.navigation"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.navigation"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.PreviousSiblingNavigationHandler"
+             commandId="org.eclipse.wst.xml.ui.previousSibling">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.navigation"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.navigation"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.ReloadDependenciesHandler"
+             commandId="org.eclipse.wst.xml.ui.reload.dependecies">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.dependencies"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.dependencies"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.ToggleEditModeHandler"
+             commandId="org.eclipse.wst.xml.ui.disable.grammar.constraints">
+          <activeWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.grammar"/>
+          </activeWhen>
+          <enabledWhen>
+              <reference definitionId="org.eclipse.wst.xml.ui.grammar"/>
+          </enabledWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.wizards.NewXMLHandler"
+             commandId="org.eclipse.wst.sse.ui.generate.xml">
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.ExpandAllHandler"
+             commandId="sed.tabletree.expandAll">
+             <activeWhen>
+                 <not>
+		            <with variable="activeContexts">
+			           <iterate operator="or">
+			              <equals value="org.eclipse.wst.sse.ui.structuredTextEditorScope"/>
+			           </iterate>
+		            </with>
+                 </not>
+             </activeWhen>
+       </handler>
+       <handler
+             class="org.eclipse.wst.xml.ui.internal.handlers.CollapseAllHandler"
+             commandId="sed.tabletree.collapseAll">
+             <activeWhen>
+                 <not>
+		            <with variable="activeContexts">
+			           <iterate operator="or">
+			              <equals value="org.eclipse.wst.sse.ui.structuredTextEditorScope"/>
+			           </iterate>
+		            </with>
+                 </not>
+             </activeWhen>
+       </handler>
+    </extension>
+    
+    <extension
+       point="org.eclipse.ui.commands">
+	    <command
+	          id="org.eclipse.wst.sse.ui.generate.xml"
+	          name="%_UI_ACTION_CREATE_XML">
+	    </command>
+	    <command
+	          description="%ReloadDependencies_description"
+	          id="org.eclipse.wst.xml.ui.reload.dependecies"
+	          name="%ReloadDependencies_name">
+	    </command>
+	    <command
+	          description="%Constraints_description"
+	          id="org.eclipse.wst.xml.ui.disable.grammar.constraints"
+	          name="%Constraints_name">
+	    </command>
+	    <command
+	          id="sed.tabletree.expandAll"
+	          name="%ExpandAll_name">
+	    </command>
+	    <command
+	          id="sed.tabletree.collapseAll"
+	          name="%CollapseAll_name">
+	    </command>
+	</extension> 
+	
+	<!-- Define theme -->
+	<extension
+		point="org.eclipse.ui.themes">
+		<theme
+			id="org.eclipse.ui.ide.systemDefault">
+			<colorOverride
+				id="tagAttributeName"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="tagAttributeValue"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="commentBorder"
+				value="COLOR_LIST_SELECTION">
+			</colorOverride>
+			<colorOverride
+				id="commentText"
+				value="COLOR_LIST_SELECTION">
+			</colorOverride>
+			<colorOverride
+				id="declBoder"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="doctypeName"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="doctypeExternalPubref"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="doctypeExternalId"
+				value="COLOR_WIDGET_NORMAL_SHADOW">
+			</colorOverride>
+			<colorOverride
+				id="doctypeExtrenalSysref"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="tagBorder"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="tagName"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="piBorder"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="cdataBorder"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="cdataText"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+			<colorOverride
+				id="entityReference"
+				value="COLOR_LIST_FOREGROUND">
+			</colorOverride>
+		</theme>
+		<colorDefinition
+			id="tagAttributeName"
+			isEditable="false"
+			label="%Colors.tagAttributeName"
+			value="127, 0, 127">
+		</colorDefinition>
+		<colorDefinition
+			id="tagAttributeValue"
+			isEditable="false"
+			label="%Colors.tagAttributeValue"
+			value="42, 0, 255">
+		</colorDefinition>
+		<colorDefinition
+			id="commentBorder"
+			isEditable="false"
+			label="%Colors.commentBorder"
+			value="63, 95, 191">
+		</colorDefinition>
+		<colorDefinition
+			id="commentText"
+			isEditable="false"
+			label="%Colors.commentText"
+			value="63, 95, 191">
+		</colorDefinition>
+		<colorDefinition
+			id="declBoder"
+			isEditable="false"
+			label="%Colors.declBorder"
+			value="0, 128, 128">
+		</colorDefinition>
+		<colorDefinition
+			id="doctypeName"
+			isEditable="false"
+			label="%Colors.doctypeName"
+			value="0, 128, 128">
+		</colorDefinition>
+		<colorDefinition
+			id="doctypeExternalPubref"
+			isEditable="false"
+			label="%Colors.doctypeExternalPubref"
+			value="0, 128, 128">
+		</colorDefinition>
+		<colorDefinition
+			id="doctypeExternalId"
+			isEditable="false"
+			label="%Colors.doctypeExternalId"
+			value="128, 128, 128">
+		</colorDefinition>
+		<colorDefinition
+			id="doctypeExtrenalSysref"
+			isEditable="false"
+			label="%Colors.doctypeExtrenalSysref"
+			value="63, 127, 95">
+		</colorDefinition>
+		<colorDefinition
+			id="tagBorder"
+			isEditable="false"
+			label="%Colors.tagBorder"
+			value="0, 128, 128">
+		</colorDefinition>
+		<colorDefinition
+			id="tagName"
+			isEditable="false"
+			label="%Colors.tagName"
+			value="63, 127, 127">
+		</colorDefinition>
+		<colorDefinition
+			id="piBorder"
+			isEditable="false"
+			label="%Colors.piBorder"
+			value="0, 128, 128">
+		</colorDefinition>
+		<colorDefinition
+			id="cdataBorder"
+			isEditable="false"
+			label="%Colors.cdataBorder"
+			value="0, 128, 128">
+		</colorDefinition>
+		<colorDefinition
+			id="cdataText"
+			isEditable="false"
+			label="%Colors.cdataText"
+			value="0, 0, 0">
+		</colorDefinition>
+		<colorDefinition
+			id="entityReference"
+			isEditable="false"
+			label="%Colors.entityReference"
+			value="42, 0, 255">
+		</colorDefinition>
+	</extension>
+
+	<!-- Enable the FormatHandler for XML Content Type -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.wst.sse.ui.internal.handlers.FormatHandler"
+			commandId="org.eclipse.wst.sse.ui.format">
+			<activeWhen>
+				<reference definitionId="org.eclipse.wst.xml.ui.xmlContentType.definition"></reference>
+			</activeWhen>
+			<enabledWhen>
+				<reference definitionId="org.eclipse.wst.xml.ui.xmlContentType.definition"></reference>
+			</enabledWhen>
+		</handler>
+	</extension>
+	
+	<!-- Set up a definition for XML Content Types -->
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.wst.xml.ui.xmlContentType.definition">
+			<or>
+            	<iterate ifEmpty="false">
+					<adapt type="org.eclipse.core.resources.IFile">
+						<!-- Force property tester to load, should not cause entire plug-in to start -->
+						<test property="org.eclipse.wst.sse.core.resources.contentTypeId" 
+							value="org.eclipse.wst.xml.core.xmlsource" forcePluginActivation="true"/>
+					</adapt>
+				</iterate>
+				<iterate ifEmpty="false">
+					<adapt type="org.eclipse.core.resources.IFile">
+						<!-- Force property tester to load, should not cause entire plug-in to start -->
+						<test property="org.eclipse.wst.sse.core.resources.contentTypeId"
+							value="org.eclipse.core.runtime.xml" forcePluginActivation="true"/>
+					</adapt>
+				</iterate>
+			</or>
+		</definition>
+	</extension>
+
+
+
+
+	<extension point="org.eclipse.ui.perspectives">
+		<perspective id="org.eclipse.wst.xml.ui.perspective"
+			class="org.eclipse.wst.xml.ui.internal.perspective.XMLPerspectiveFactory"
+			icon="$nl$/icons/full/xml_perspective.gif" 
+			name="%XML.name"/>
+	</extension>
+	
+ <extension point="org.eclipse.ui.perspectiveExtensions">
+	<perspectiveExtension targetID="org.eclipse.wst.xml.ui.perspective">
+		<!-- ProjectExplorer on the left -->
+		<!--<view id="org.eclipse.ui.navigator.ProjectExplorer" relative="org.eclipse.ui.editorss" relationship="left" ratio="0.23" />-->
+		<!-- XPath on the "bottom" left from its own UI plug-in since neither this bundle nor its owning feature require it -->
+		<!-- Content Outline on the right -->
+		<view id="org.eclipse.ui.views.ContentOutline" relative="org.eclipse.ui.editorss" relationship="right" ratio="0.7" />
+		<!-- Templates on the bottom right -->
+		<view id="org.eclipse.ui.texteditor.TemplatesView" relative="org.eclipse.ui.views.ContentOutline" relationship="bottom" ratio="0.6" />
+		<!-- everything else on the bottom -->
+		<view id="org.eclipse.ui.views.ProblemView" relative="org.eclipse.ui.editorss" relationship="bottom" ratio="0.6" />
+		<view id="org.eclipse.ui.views.PropertySheet" relative="org.eclipse.ui.views.ProblemView" relationship="stack"/>
+		<view id="org.eclipse.ui.console.ConsoleView" relative="org.eclipse.ui.views.ProblemView" relationship="stack" />
+		<view id="org.eclipse.wst.common.snippets.internal.ui.SnippetsView" relative="org.eclipse.ui.views.ProblemView" relationship="stack" />
+		<!-- view placeholders -->
+		<view id="org.eclipse.search.ui.views.SearchView" relative="org.eclipse.ui.views.ProblemView" relationship="stack" visible="false" />
+		<view id="org.eclipse.ui.views.ProgressView" relative="org.eclipse.ui.views.ProblemView" relationship="stack" visible="false" />
+
+		<actionSet id="org.eclipse.debug.ui.launchActionSet"/>
+	
+		<newWizardShortcut id="org.eclipse.wst.xml.ui.internal.wizards.NewXMLWizard"/>
+		<newWizardShortcut id="org.eclipse.wst.xsd.ui.internal.wizards.NewXSDWizard"/>
+		<newWizardShortcut id="org.eclipse.wst.dtd.ui.internal.wizard.NewDTDWizard"/>
+		<newWizardShortcut id="org.eclipse.ui.wizards.new.folder"/>
+		<newWizardShortcut id="org.eclipse.ui.wizards.new.file"/>
+		<newWizardShortcut id="org.eclipse.ui.editors.wizards.UntitledTextFileWizard"/>
+
+		<viewShortcut id="org.eclipse.ui.navigator.ProjectExplorer"/>
+		<viewShortcut id="org.eclipse.ui.views.ResourceNavigator"/>
+		<viewShortcut id="org.eclipse.ui.views.ContentOutline"/>
+		<viewShortcut id="org.eclipse.ui.views.PropertySheet"/>
+		<viewShortcut id="org.eclipse.ui.views.ProblemView"/>
+		<viewShortcut id="org.eclipse.ui.console.ConsoleView"/>
+		<viewShortcut id="org.eclipse.ui.views.TaskList"/>
+		<viewShortcut id="org.eclipse.ui.texteditor.TemplatesView"/>
+		<viewShortcut id="org.eclipse.search.ui.views.SearchView"/>
+		<viewShortcut id="org.eclipse.ui.views.ProgressView"/>
+
+		<perspectiveShortcut id="org.eclipse.debug.ui.DebugPerspective"/>
+		<perspectiveShortcut id="org.eclipse.ui.resourcePerspective"/>
+	</perspectiveExtension>
+	
+	<perspectiveExtension targetID="org.eclipse.ui.resourcePerspective">
+		<perspectiveShortcut id="org.eclipse.wst.xml.ui.perspective"/>
+	</perspectiveExtension>
+	<perspectiveExtension targetID="org.eclipse.debug.ui.DebugPerspective">
+		<perspectiveShortcut id="org.eclipse.wst.xml.ui.perspective"/>
+	</perspectiveExtension>
+ </extension>
+
+ <extension point="org.eclipse.ui.navigator.navigatorContent">
+	<commonWizard type="new" wizardId="org.eclipse.wst.xml.ui.internal.wizards.NewXMLWizard" menuGroupId="org.eclipse.wst.xml.new.menuGroup">
+		<enablement>
+			<instanceof value="org.eclipse.core.resources.IResource"/>
+			<with variable="activeWorkbenchWindow.activePerspective">
+			   <equals value="org.eclipse.wst.xml.ui.perspective"/>
+			</with>
+		</enablement>
+	</commonWizard>
+ </extension>
+
+ <extension point="org.eclipse.ui.menus" name="%XML.name" id="XML">
+	<menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
+	 <toolbar id="org.eclipse.wst.xml.ui.perspective.NewFileToolBar">
+		<command
+				commandId="org.eclipse.ui.newWizard"
+				icon="$nl$/icons/full/etool16/new_xml.gif"
+				id="org.eclipse.wst.xml.ui.newXMLFile"
+				style="push"
+				tooltip="%XML_New_context_type_Extension_Element.name">
+			 <parameter name="newWizardId" value="org.eclipse.wst.xml.ui.internal.wizards.NewXMLWizard"/>
+          <visibleWhen checkEnabled="false">
+			<with variable="activeWorkbenchWindow.activePerspective">
+				<equals value="org.eclipse.wst.xml.ui.perspective"/>
+			</with>
+           </visibleWhen>         
+        </command>
+       <separator name="additions" visible="false"/>
+      </toolbar> 
+     </menuContribution>
+  </extension>
+ <extension
+       point="org.eclipse.wst.sse.ui.characterPairing">
+    <inserter
+          class="org.eclipse.wst.xml.ui.internal.text.CharacterPairInserter"
+          id="org.eclipse.wst.xml.ui.inserter">
+       <contentTypeIdentifier
+             id="org.eclipse.core.runtime.xml" partitions="org.eclipse.wst.xml.XML_DEFAULT,org.eclipse.wst.xml.XML_DECL">
+       </contentTypeIdentifier>
+       <contentTypeIdentifier
+             id="org.eclipse.wst.xml.core.xmlsource" partitions="org.eclipse.wst.xml.XML_DEFAULT,org.eclipse.wst.xml.XML_DECL">
+       </contentTypeIdentifier>
+    </inserter>
+ </extension>
+ <extension
+       point="org.eclipse.wst.sse.ui.commentingStrategy">
+    <blockCommentingStrategy
+          prefix="&lt;!--"
+          suffix="--&gt;">
+       <contentType
+             id="org.eclipse.core.runtime.xml"
+             associatedCommentPartitionTypeID="org.eclipse.wst.xml.XML_COMMENT">
+          <allowablePartitionTypes
+                anyPartitionType="true">
+          </allowablePartitionTypes>
+       </contentType>
+    </blockCommentingStrategy>
+ </extension>
+ <extension
+       point="org.eclipse.wst.sse.ui.completionProposal">
+    <proposalCategory
+          icon="icons/full/obj16/tag-generic.gif"
+          id="org.eclipse.wst.xml.ui.proposalCategory.xmlTags"
+          name="%proposalCategory.xmlTags">
+    </proposalCategory>
+    <proposalCategory
+          icon="icons/full/obj16/tag-macro.gif"
+          id="org.eclipse.wst.xml.ui.proposalCategory.xmlTemplates"
+          name="%proposalCategory.xmlTemplates">
+    </proposalCategory>
+    <proposalComputer
+          activate="false"
+          categoryId="org.eclipse.wst.xml.ui.proposalCategory.xmlTags"
+          class="org.eclipse.wst.xml.ui.internal.contentassist.XMLTagsCompletionProposalComputer"
+          id="org.eclipse.wst.xml.ui.proposalComputer.xmlTags">
+       <contentType
+             id="org.eclipse.core.runtime.xml">
+       </contentType>
+    </proposalComputer>
+    <proposalComputer
+          activate="false"
+          categoryId="org.eclipse.wst.xml.ui.proposalCategory.xmlTemplates"
+          class="org.eclipse.wst.xml.ui.internal.contentassist.XMLTemplatesCompletionProposalComputer"
+          id="org.eclipse.wst.xml.ui.proposalComputer.xmlTemplates">
+       <contentType
+             id="org.eclipse.core.runtime.xml">
+       </contentType>
+    </proposalComputer>
+ </extension>
+ <extension
+       point="org.eclipse.wst.sse.ui.completionProposalCategoriesConfiguration">
+    <categoriesConfiguration
+          class="org.eclipse.wst.xml.ui.internal.preferences.XMLCompletionProposalCategoriesConfiguration"
+          contentTypeID="org.eclipse.core.runtime.xml">
+    </categoriesConfiguration>
+ </extension>
+
+</plugin>
diff --git a/bundles/org.eclipse.wst.xml.ui/schema/catalogFileType.exsd b/bundles/org.eclipse.wst.xml.ui/schema/catalogFileType.exsd
new file mode 100644
index 0000000..3629659
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/schema/catalogFileType.exsd
@@ -0,0 +1,120 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.xml.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.xml.ui" id="catalogFileType" name="XML Catalog file type extension point"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="fileType" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="fileType">
+      <complexType>
+         <attribute name="extensions" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="description" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is internal and should not be used by any other plugins.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2000, 2005 IBM Corporation and others.&lt;br&gt;
+All rights reserved. This program and the accompanying materials are made 
+available under the terms of the Eclipse Public License v1.0 which accompanies 
+this distribution, and is available at &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/AdvancedOptionsDialog.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/AdvancedOptionsDialog.java
new file mode 100644
index 0000000..ac1dec6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/AdvancedOptionsDialog.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import java.io.ByteArrayInputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.wst.common.ui.internal.dialogs.SelectSingleFileDialog;
+import org.eclipse.wst.xml.core.internal.catalog.CatalogSet;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+public class AdvancedOptionsDialog extends Dialog {
+	protected ICatalog workingUserCatalog;
+
+	public AdvancedOptionsDialog(Shell parentShell, ICatalog workingUserCatalog) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.workingUserCatalog = workingUserCatalog;
+	}
+
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+	}
+
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		// WorkbenchHelp.setHelp(dialogArea, new
+		// ControlContextComputer(dialogArea,
+		// XMLBuilderContextIds.XMLP_PROJECT_DIALOG));
+
+		Composite composite = new Composite(dialogArea, SWT.NONE);
+		composite.setLayout(new GridLayout());
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		Label label = new Label(composite, SWT.NONE);
+		label.setText(XMLCatalogMessages.UI_LABEL_DIALOG_DESCRIPTION);
+
+		Composite buttonComposite = new Composite(composite, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 3;
+		buttonComposite.setLayout(gridLayout);
+		buttonComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		Composite placeHolder = new Composite(buttonComposite, SWT.NONE);
+		placeHolder.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		Composite buttonGroup = new Composite(buttonComposite, SWT.NONE);
+		gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		gridLayout.makeColumnsEqualWidth = true;
+		buttonGroup.setLayout(gridLayout);
+		buttonGroup.setLayoutData(createGridData());
+
+		Button importButton = new Button(buttonGroup, SWT.PUSH | SWT.CENTER);
+		importButton.setText("  " + XMLCatalogMessages.UI_BUTTON_IMPORT + "  "); //$NON-NLS-1$ //$NON-NLS-2$
+
+		Button exportButton = new Button(buttonGroup, SWT.PUSH | SWT.CENTER);
+		exportButton.setText("  " + XMLCatalogMessages.UI_BUTTON_EXPORT + "  "); //$NON-NLS-1$ //$NON-NLS-2$
+
+		placeHolder = new Composite(buttonComposite, SWT.NONE);
+		placeHolder.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		// add importButton listener
+		SelectionListener importButtonSelectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				invokeImportDialog();
+			}
+		};
+		importButton.addSelectionListener(importButtonSelectionListener);
+
+		// add exportButton listener
+		SelectionListener exportButtonSelectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				invokeExportDialog();
+			}
+		};
+		exportButton.addSelectionListener(exportButtonSelectionListener);
+
+		return dialogArea;
+	}
+
+	protected GridData createGridData() {
+		GridData gd = new GridData(GridData.CENTER);
+		gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_CENTER;
+		gd.verticalAlignment = GridData.VERTICAL_ALIGN_CENTER;
+		return gd;
+	}
+
+
+	protected void invokeImportDialog() {
+		SelectSingleFileDialog dialog = new SelectSingleFileDialog(getShell(), null, true);
+		String[] extensions = {".xmlcatalog", ".xml"}; //$NON-NLS-1$ //$NON-NLS-2$
+		dialog.addFilterExtensions(extensions);
+		dialog.create();
+		dialog.getShell().setText(XMLCatalogMessages.UI_LABEL_IMPORT_DIALOG_TITLE);
+		dialog.setTitle(XMLCatalogMessages.UI_LABEL_IMPORT_DIALOG_HEADING);
+		dialog.setMessage(XMLCatalogMessages.UI_LABEL_IMPORT_DIALOG_MESSAGE);
+		dialog.setBlockOnOpen(true);
+		int rc = dialog.open();
+		if (rc == Window.OK) {
+			IFile file = dialog.getFile();
+			if (file != null) {
+				String fileName = file.getLocation().toFile().toURI().toString();
+				try {
+					CatalogSet tempResourceSet = new CatalogSet();
+					ICatalog newCatalog = tempResourceSet.lookupOrCreateCatalog("temp", fileName); //$NON-NLS-1$
+					workingUserCatalog.addEntriesFromCatalog(newCatalog);
+				}
+				catch (Exception e) {
+					// TODO... give error message
+				}
+			}
+			close();
+		}
+	}
+
+
+	protected void invokeExportDialog() {
+		IPath originalFilePath = null;
+		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+		if (projects.length > 0) {
+			originalFilePath = projects[0].getFullPath().append(".xmlcatalog"); //$NON-NLS-1$
+		}
+
+		SaveAsDialog dialog = new SaveAsDialog(getShell());
+		if (originalFilePath != null) {
+			IFile originalFile = ResourcesPlugin.getWorkspace().getRoot().getFile(originalFilePath);
+			dialog.setOriginalFile(originalFile);
+		}
+		dialog.create();
+
+		dialog.getShell().setText(XMLCatalogMessages.UI_LABEL_EXPORT_DIALOG_TITLE);
+		dialog.setTitle(XMLCatalogMessages.UI_LABEL_EXPORT_DIALOG_HEADING);
+		dialog.setMessage(XMLCatalogMessages.UI_LABEL_EXPORT_DIALOG_MESSAGE);
+
+		dialog.setBlockOnOpen(true);
+		int rc = dialog.open();
+		if (rc == Window.OK) {
+			IPath path = dialog.getResult();
+			if (path != null) {
+				IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+				String fileName = file.getLocation().toFile().toURI().toString();
+
+				// here we save the catalog entries to the selected file
+				try {
+					createFileIfRequired(file);
+					workingUserCatalog.setLocation(fileName);
+					workingUserCatalog.save();
+				}
+				catch (Exception ex) {
+					try {
+						String title = XMLCatalogMessages.UI_LABEL_CATALOG_SAVE_ERROR;
+						String briefMessage = XMLCatalogMessages.UI_LABEL_CATALOG_COULD_NOT_BE_SAVED;
+						String reason = file.isReadOnly() ? NLS.bind(XMLCatalogMessages.UI_LABEL_FILE_IS_READ_ONLY, fileName) : NLS.bind(XMLCatalogMessages.ERROR_SAVING_FILE, fileName);
+						String details = NLS.bind(XMLCatalogMessages.ERROR_SAVING_FILE, fileName);
+
+						ErrorDialog.openError(Display.getCurrent().getActiveShell(), title, briefMessage, createStatus(reason, details));
+					}
+					catch (Exception ex2) {
+					}
+				}
+				close();
+			}
+		}
+	}
+
+	// TODO... This was copied from WindowUtility. Is there an easier way to
+	// create a status object?
+	// If not, we should open an eclipse bug or add a similar utility to
+	// baseExtensionsUI.
+	//
+	private static IStatus createStatus(String reason, String msg) {
+		String pluginId = XMLUIPlugin.getDefault().getBundle().getSymbolicName();
+		MultiStatus multiStatus = new MultiStatus(pluginId, 0, reason, null);
+		Status status = new Status(IStatus.ERROR, pluginId, 0, msg, null);
+		multiStatus.add(status);
+		return multiStatus;
+	}
+
+
+	protected void createFileIfRequired(IFile file) {
+		try {
+			if ((file != null) && !file.exists()) {
+				ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]);
+				file.create(inputStream, true, null);
+				// createEmptyXMLCatalog(file);
+			}
+		}
+		catch (Exception e) {
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/CatalogFileTypeRegistryReader.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/CatalogFileTypeRegistryReader.java
new file mode 100644
index 0000000..85b57d3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/CatalogFileTypeRegistryReader.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+public class CatalogFileTypeRegistryReader {
+	private static CatalogFileTypeRegistryReader _instance;
+
+	static final String ATT_DESCRIPTION = "description"; //$NON-NLS-1$
+
+	static final String ATT_EXTENSIONS = "extensions"; //$NON-NLS-1$
+
+	static final String ATT_ICON = "icon"; //$NON-NLS-1$
+
+	static final String ATT_ID = "id"; //$NON-NLS-1$
+
+	static final String EXTENSION_POINT_ID = "catalogFileType"; //$NON-NLS-1$
+
+	static final String TAG_NAME = "fileType"; //$NON-NLS-1$
+
+	private static CatalogFileTypeRegistryReader getInstance() {
+		if (_instance == null) {
+			_instance = new CatalogFileTypeRegistryReader();
+		}
+		return _instance;
+	}
+
+	public static Collection getXMLCatalogFileTypes() {
+		return getInstance().hashMap.values();
+	}
+
+	private HashMap hashMap;
+
+	public CatalogFileTypeRegistryReader() {
+		this.hashMap = new HashMap();
+		readRegistry();
+	}
+
+	private void readElement(IConfigurationElement element) {
+		if (element.getName().equals(TAG_NAME)) {
+			String id = element.getAttribute(ATT_ID);
+			if (id != null) {
+				XMLCatalogFileType fileType = (XMLCatalogFileType) hashMap.get(id);
+				if (fileType == null) {
+					fileType = new XMLCatalogFileType();
+					hashMap.put(id, fileType);
+				}
+				fileType.id = id;
+				if (fileType.description == null) {
+					String description = element.getAttribute(ATT_DESCRIPTION);
+					fileType.description = description;
+				}
+
+				fileType.addExtensions(element.getAttribute(ATT_EXTENSIONS));
+			}
+		}
+	}
+
+	private void readRegistry() {
+		readRegistry(EXTENSION_POINT_ID);
+	}
+
+	private void readRegistry(String extensionPointId) {
+		IExtensionRegistry pluginRegistry = Platform.getExtensionRegistry();
+		IExtensionPoint point = pluginRegistry.getExtensionPoint(XMLUIPlugin.ID, extensionPointId);
+		if (point != null) {
+			IConfigurationElement[] elements = point.getConfigurationElements();
+			for (int i = 0; i < elements.length; i++) {
+				readElement(elements[i]);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/EditCatalogEntryDialog.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/EditCatalogEntryDialog.java
new file mode 100644
index 0000000..578e8a8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/EditCatalogEntryDialog.java
@@ -0,0 +1,1816 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.wst.common.ui.internal.dialogs.SelectSingleFileDialog;
+import org.eclipse.wst.common.uriresolver.internal.URI;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
+
+public class EditCatalogEntryDialog extends Dialog {
+	protected static Image borwseImage = ImageFactory.INSTANCE.getImage("icons/obj16/file_expand.gif"); //$NON-NLS-1$
+	protected static Image catalogEntryToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/catalogEntry.gif"); //$NON-NLS-1$
+	protected static Image nextCatalogToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/nextCatalog.gif"); //$NON-NLS-1$
+	protected static Image delegateCatalogToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/delegateCatalog.gif"); //$NON-NLS-1$
+	protected static Image rewriteToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/rewrite.gif"); //$NON-NLS-1$
+	protected static Image prefixToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/prefix.gif"); //$NON-NLS-1$
+	protected static Image suffixToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/sufix.gif"); //$NON-NLS-1$
+	
+	protected class CatalogEntryPage extends CatalogElementPage {
+
+		protected Button browseWorkspaceButton;
+		
+		protected Button browseFileSystemButton;
+
+		protected ICatalogEntry catalogEntry;
+
+		protected Button checkboxButton;
+
+		protected Label errorMessageLabel;
+
+		protected Text keyField;
+
+		protected Combo keyTypeCombo;
+
+		protected Text resourceLocationField;
+
+		protected Combo resourceTypeCombo;
+
+		protected Text webAddressField;
+		
+		protected String key;
+		
+		protected int type;
+		
+		public void refresh() {
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+
+		protected void computeErrorMessage() {
+			errorMessage = null;
+			warningMessage = null;
+
+			String fileName = resourceLocationField.getText();
+			if (fileName.trim().length() > 0) {
+				if ((fileName.indexOf("..") != -1) || (fileName.indexOf("./") != -1) || (fileName.indexOf("/.") != -1) || (fileName.indexOf(".\\") != -1) || (fileName.indexOf("\\.") != -1)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+					errorMessage = XMLCatalogMessages.UI_WARNING_URI_MUST_NOT_HAVE_DOTS;
+				}
+
+				String uri = fileName;
+				if (!URIHelper.hasProtocol(uri)) {
+					URIHelper.isAbsolute(uri);
+					uri = (URIHelper.isAbsolute(uri)) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri);
+				}
+
+				if ((errorMessage == null) && !URIHelper.isReadableURI(uri, false)) {
+					errorMessage = XMLCatalogMessages.UI_WARNING_URI_NOT_FOUND_COLON + fileName;
+				}
+			}
+			else {
+				// this an error that is not actaully
+				// reported ... OK is just disabled
+				errorMessage = ""; //$NON-NLS-1$
+			}
+
+			// Make sure the key is a fully qualified URI in the cases
+			// where the key type is "System ID" or "Schema location"
+			if ((keyField.getText().length() > 0) && (getKeyType() == ICatalogEntry.ENTRY_TYPE_SYSTEM)) {
+				URI uri = URI.createURI(keyField.getText());
+				if (uri.scheme() == null) {
+					warningMessage = XMLCatalogMessages.UI_WARNING_SHOULD_BE_FULLY_QUALIFIED_URI;
+				}
+			}
+
+			if ((errorMessage == null) && checkboxButton.getSelection() && (webAddressField.getText().trim().length() == 0)) {
+				// this an error that is not actaully
+				// reported ... OK is just disabled
+				errorMessage = ""; //$NON-NLS-1$
+			}
+
+			if ((errorMessage == null) && (keyField.getText().trim().length() == 0)) {
+				// this an error that is not actaully
+				// reported ... OK is just disabled
+				errorMessage = ""; //$NON-NLS-1$
+			}
+		}
+
+		protected Control createCatalogEntryPanel(Composite parent) {
+
+			ModifyListener modifyListener = new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					if (e.widget == resourceLocationField) {
+						if (keyField.getText().length() == 0) {
+							String uri = resourceLocationField.getText();
+							if (uri.endsWith("xsd") && !URIHelper.hasProtocol(uri)) { //$NON-NLS-1$
+								uri = URIHelper.isAbsolute(uri) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri);
+								String namespaceURI = XMLQuickScan.getTargetNamespaceURIForSchema(uri);
+								if (namespaceURI != null) {
+									keyField.setText(namespaceURI);
+								}
+							}
+						}
+					}
+					updateWidgets(e.widget);
+				}
+			};
+
+
+			Composite composite = new Composite(parent, SWT.NONE);
+			GridData gd = new GridData(GridData.FILL_BOTH);
+			composite.setLayoutData(gd);
+
+			GridLayout layout = new GridLayout();
+			composite.setLayout(layout);
+
+			Composite group = new Composite(composite, SWT.NONE);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			group.setLayoutData(gd);
+
+			layout = new GridLayout(2, false);
+			group.setLayout(layout);
+
+			Label resourceLocationLabel = new Label(group, SWT.NONE);
+			resourceLocationLabel.setText(XMLCatalogMessages.UI_LABEL_LOCATION_COLON);
+
+			resourceLocationField = new Text(group, SWT.SINGLE | SWT.BORDER);
+			gd = new GridData();
+			gd.horizontalAlignment = SWT.FILL;
+			gd.grabExcessHorizontalSpace = true;
+			resourceLocationField.setLayoutData(gd);
+
+			resourceLocationField.setText(getDisplayValue(URIUtils.convertURIToLocation(getEntry().getURI())));
+
+			// WorkbenchHelp.setHelp(resourceLocationField,
+			// XMLBuilderContextIds.XMLP_ENTRY_URI);
+			resourceLocationField.addModifyListener(modifyListener);
+
+			// WorkbenchHelp.setHelp(browseButton,
+			// XMLBuilderContextIds.XMLP_ENTRY_BROWSE);
+
+			Composite browseButtonsComposite = new Composite(group, SWT.NONE);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			gd.horizontalSpan = 2;
+			gd.horizontalAlignment = GridData.END;
+			browseButtonsComposite.setLayoutData(gd);
+			
+			layout = new GridLayout();
+			layout.numColumns = 2;
+			layout.marginWidth = 0;
+			layout.marginHeight = 0;
+			layout.marginBottom = 5;
+			browseButtonsComposite.setLayout(layout);
+			
+			browseWorkspaceButton = new Button(browseButtonsComposite, SWT.PUSH);
+			browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE);
+			browseWorkspaceButton.addSelectionListener(new SelectionListener(){
+
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+
+				public void widgetSelected(SelectionEvent e) {
+					String value = invokeWorkspaceFileSelectionDialog();
+					if(value != null) {
+						resourceLocationField.setText(value);
+					}
+				}
+			});
+			
+			browseFileSystemButton = new Button(browseButtonsComposite, SWT.PUSH);
+			browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_FILE_SYSTEM);
+			browseFileSystemButton.addSelectionListener(new SelectionListener(){
+
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+
+				public void widgetSelected(SelectionEvent e) {
+					String value = invokeFileSelectionDialog();
+					if(value != null) {
+						resourceLocationField.setText(value);
+					}
+				}
+			});
+			
+			// Key Type
+			//
+			Label keyTypeLabel = new Label(group, SWT.NONE);
+			keyTypeLabel.setText(XMLCatalogMessages.UI_KEY_TYPE_COLON);
+
+			keyTypeCombo = new Combo(group, SWT.READ_ONLY);
+			gd = new GridData();
+			gd.horizontalAlignment = SWT.FILL;
+			gd.grabExcessHorizontalSpace = true;
+			keyTypeCombo.setLayoutData(gd);
+			updateKeyTypeCombo(getEntry().getEntryType());
+			keyTypeCombo.addModifyListener(modifyListener);
+			// WorkbenchHelp.setHelp(keyTypeCombo,
+			// XMLBuilderContextIds.XMLP_ENTRY_KEY_TYPE);
+
+			// Key
+			// 
+			Label keyValueLabel = new Label(group, SWT.NONE);
+			keyValueLabel.setText(XMLCatalogMessages.UI_LABEL_KEY_COLON);
+			keyField = new Text(group, SWT.SINGLE | SWT.BORDER);
+			// WorkbenchHelp.setHelp(keyField,
+			// XMLBuilderContextIds.XMLP_ENTRY_KEY);
+			keyField.setLayoutData(gd);
+			keyField.setText(getDisplayValue(getEntry().getKey()));
+			keyField.addModifyListener(modifyListener);
+
+			Composite group2 = new Composite(composite, SWT.NONE);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			group2.setLayoutData(gd);
+
+			layout = new GridLayout();
+			group2.setLayout(layout);
+
+			// checkbox -- note parent is dialogArea
+			//
+			checkboxButton = new Button(group2, SWT.CHECK);
+			// WorkbenchHelp.setHelp(checkboxButton,
+			// XMLBuilderContextIds.XMLP_ENTRY_SPECIFY_ALTERNATIVE);
+			checkboxButton.setText(XMLCatalogMessages.UI_LABEL_SPECIFY_ALTERNATIVE_WEB_URL);
+			checkboxButton.setLayoutData(new GridData());
+			checkboxButton.setSelection(getEntry().getAttributeValue(ICatalogEntry.ATTR_WEB_URL) != null);
+			SelectionListener buttonListener = new SelectionListener() {
+				public void widgetDefaultSelected(SelectionEvent event) {
+					// no impl
+				}
+
+				public void widgetSelected(SelectionEvent event) {
+					if (event.widget == checkboxButton) {
+						updateWidgets(checkboxButton);
+					}
+				}
+			};
+			checkboxButton.addSelectionListener(buttonListener);
+
+			// Web Address field
+			//
+
+			ModifyListener webAddressFieldListener = new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					computeErrorMessage();
+					updateErrorMessageLabel(errorMessageLabel);
+					updateOKButtonState();
+				}
+			};
+
+			webAddressField = new Text(group2, SWT.SINGLE | SWT.BORDER);
+			// WorkbenchHelp.setHelp(webAddressField,
+			// XMLBuilderContextIds.XMLP_ENTRY_WEB_ADDRESS);
+			webAddressField.setLayoutData(gd);
+			webAddressField.setText(getDisplayValue(getEntry().getAttributeValue(ICatalogEntry.ATTR_WEB_URL)));
+			webAddressField.setEnabled(false);
+			webAddressField.addModifyListener(webAddressFieldListener);
+
+
+			errorMessageLabel = new Label(group2, SWT.NONE);
+			errorMessageLabel.setForeground(color);
+			errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+			updateWidgets(null);
+			
+			key = getEntry().getKey();
+			type = getEntry().getEntryType();
+
+			return composite;
+		}
+
+		public Control createControl(Composite parent) {
+
+			fControl = createCatalogEntryPanel(parent);
+
+			return fControl;
+		}
+
+
+		public ICatalogElement getData() {
+			return getEntry();
+		}
+
+		protected ICatalogEntry getEntry() {
+			if (catalogEntry == null) {
+				if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_ENTRY)) {
+					catalogEntry = (ICatalogEntry) fCatalogElement;
+				}
+				else {
+					if (catalog != null) {
+						catalogEntry = (ICatalogEntry) catalog.createCatalogElement(ICatalogElement.TYPE_ENTRY);
+					}
+				}
+			}
+			return catalogEntry;
+		}
+
+		protected int getKeyType() {
+			switch (keyTypeCombo.getSelectionIndex()) {
+				case 0 :
+					if ("schema".equals(keyTypeCombo.getData("keyType"))) { //$NON-NLS-1$ //$NON-NLS-2$
+						return ICatalogEntry.ENTRY_TYPE_URI; // xsd
+																// namespace
+																// is URI type
+																// key
+					}
+					return ICatalogEntry.ENTRY_TYPE_PUBLIC;
+				case 1 :
+					return ICatalogEntry.ENTRY_TYPE_SYSTEM;
+				case 2 :
+					return ICatalogEntry.ENTRY_TYPE_URI;
+				default :
+					return ICatalogEntry.ENTRY_TYPE_PUBLIC;
+			}
+		}
+
+		public void saveData() {
+			if (validateData()) {
+				getEntry().setURI(URIUtils.convertLocationToURI(resourceLocationField.getText()));
+				getEntry().setKey(keyField.getText());
+				getEntry().setEntryType(getKeyType());
+				getEntry().setAttributeValue(ICatalogEntry.ATTR_WEB_URL, checkboxButton.getSelection() ? webAddressField.getText() : null);
+				dataSaved = true;
+			}
+			else {
+				errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_ENTRY;
+				errorMessageLabel.setText(errorMessage);
+				updateOKButtonState();
+				dataSaved = false;
+			}
+		}
+		
+		/**
+		 * Validates that the data entered does not conflict with an existing entry in either catalog.
+		 * @return True if validated, false otherwise.
+		 */
+		protected boolean validateData() {
+		
+			String result = null;
+			if (key == null || !key.equals(keyField.getText()) || type != getKeyType())
+			{
+				try {
+					switch( getKeyType() )
+					{
+					case ICatalogEntry.ENTRY_TYPE_PUBLIC:
+						result = catalog.resolvePublic(keyField.getText(), null);		
+						break;
+					case ICatalogEntry.ENTRY_TYPE_SYSTEM:
+						result = catalog.resolveSystem(keyField.getText());
+						break;
+					case ICatalogEntry.ENTRY_TYPE_URI:
+						result = catalog.resolveURI(keyField.getText());
+						break;
+					}
+				}
+				catch (Exception e) {
+				}
+			}
+			
+			return (result == null);
+		}
+
+		protected void updateKeyTypeCombo(int type) {
+			keyTypeCombo.removeAll();
+			for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) {
+				XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next();
+				if (theFileType.extensions != null) {
+					for (Iterator j = theFileType.extensions.iterator(); j.hasNext();) {
+						String extension = (String) j.next();
+						if (resourceLocationField.getText().endsWith(extension)) {
+							if ("org.eclipse.wst.xml.core.ui.catalogFileType.xsd".equals(theFileType.id)) { //$NON-NLS-1$
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC);
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM);
+								keyTypeCombo.setData("keyType", "schema"); //$NON-NLS-1$ //$NON-NLS-2$
+							}
+							else if ("org.eclipse.wst.xml.core.ui.catalogFileType.dtd".equals(theFileType.id)) { //$NON-NLS-1$
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC);
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM);
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+							}
+							else {
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+							}
+						}
+
+					}
+
+				}
+			}
+			if (keyTypeCombo.getItemCount() == 0) {
+				keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC);
+				keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM);
+				keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+			}
+
+			switch (type) {
+				case ICatalogEntry.ENTRY_TYPE_PUBLIC :
+					keyTypeCombo.select(0);
+					break;
+				case ICatalogEntry.ENTRY_TYPE_SYSTEM :
+					keyTypeCombo.select(1);
+					break;
+				case ICatalogEntry.ENTRY_TYPE_URI : // handle XML Schema,
+													// where namespace name is
+													// mapped to URI situation
+					if ("schema".equals(keyTypeCombo.getData("keyType"))) { //$NON-NLS-1$ //$NON-NLS-2$
+						keyTypeCombo.select(0); // namespace name as URI key
+												// type
+					}
+					else {
+						keyTypeCombo.select(2); // URI key type
+					}
+					break;
+				default :
+					if (keyTypeCombo.getItemCount() > 0) {
+						keyTypeCombo.select(0);
+					}
+					break;
+			}
+
+		}
+
+		protected void updateWebAddressWidgets(int keyType) {
+			boolean isPublicKeyType = (keyType == ICatalogEntry.ENTRY_TYPE_PUBLIC);
+			checkboxButton.setEnabled(isPublicKeyType);
+			webAddressField.setEnabled(isPublicKeyType && checkboxButton.getSelection());
+		}
+
+		protected void updateWidgets(Widget widget) {
+			if (widget != keyTypeCombo) {
+				updateKeyTypeCombo(getKeyType());
+			}
+			updateWebAddressWidgets(getKeyType());
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+
+	}
+
+	protected class SuffixEntryPage extends CatalogElementPage {
+	
+		protected Button browseWorkspaceButton;
+		
+		protected Button browseFileSystemButton;
+	
+		protected ISuffixEntry catalogEntry;
+	
+		protected Label errorMessageLabel;
+	
+		protected Text suffixField;
+	
+		protected Combo keyTypeCombo;
+	
+		protected Text resourceLocationField;
+	
+		protected Combo resourceTypeCombo;
+
+		protected String key;
+		
+		protected int type;
+		
+		public void refresh() {
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+	
+		protected void computeErrorMessage() {
+			errorMessage = null;
+			warningMessage = null;
+	
+			String fileName = resourceLocationField.getText();
+			if (fileName.trim().length() > 0) {
+				if ((fileName.indexOf("..") != -1) || (fileName.indexOf("./") != -1) || (fileName.indexOf("/.") != -1) || (fileName.indexOf(".\\") != -1) || (fileName.indexOf("\\.") != -1)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+					errorMessage = XMLCatalogMessages.UI_WARNING_URI_MUST_NOT_HAVE_DOTS;
+				}
+
+				String uri = fileName;
+				if (!URIHelper.hasProtocol(uri)) {
+					URIHelper.isAbsolute(uri);
+					uri = (URIHelper.isAbsolute(uri)) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri);
+				}
+
+				if ((errorMessage == null) && !URIHelper.isReadableURI(uri, false)) {
+					errorMessage = XMLCatalogMessages.UI_WARNING_URI_NOT_FOUND_COLON + fileName;
+				}
+			}
+			else {
+				// this an error that is not actaully
+				// reported ... OK is just disabled
+				errorMessage = ""; //$NON-NLS-1$
+			}
+
+	
+			if ((errorMessage == null) && (suffixField.getText().trim().length() == 0)) {
+				// this an error that is not actaully
+				// reported ... OK is just disabled
+				errorMessage = ""; //$NON-NLS-1$
+			}
+		}
+	
+		protected Control createSuffixEntryPanel(Composite parent) {
+	
+			ModifyListener modifyListener = new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					if (e.widget == resourceLocationField) {
+						if (suffixField.getText().length() == 0) {
+							String uri = resourceLocationField.getText();
+							if (uri.endsWith("xsd") && !URIHelper.hasProtocol(uri)) { //$NON-NLS-1$
+								uri = URIHelper.isAbsolute(uri) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri);
+								String namespaceURI = XMLQuickScan.getTargetNamespaceURIForSchema(uri);
+								if (namespaceURI != null) {
+									suffixField.setText(namespaceURI);
+								}
+							}
+						}
+					}
+					updateWidgets(e.widget);
+				}
+			};
+	
+			Composite composite = new Composite(parent, SWT.NONE);
+			GridData gd = new GridData(GridData.FILL_BOTH);
+			composite.setLayoutData(gd);
+	
+			GridLayout layout = new GridLayout();
+			composite.setLayout(layout);
+	
+			Composite group = new Composite(composite, SWT.NONE);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			group.setLayoutData(gd);
+	
+			layout = new GridLayout(2, false);
+			group.setLayout(layout);
+	
+			Label resourceLocationLabel = new Label(group, SWT.NONE);
+			resourceLocationLabel.setText(XMLCatalogMessages.UI_LABEL_LOCATION_COLON);
+	
+			resourceLocationField = new Text(group, SWT.SINGLE | SWT.BORDER);
+			gd = new GridData();
+			gd.horizontalAlignment = SWT.FILL;
+			gd.grabExcessHorizontalSpace = true;
+			resourceLocationField.setLayoutData(gd);
+	
+			resourceLocationField.setText(getDisplayValue(URIUtils.convertURIToLocation(getEntry().getURI())));
+			resourceLocationField.addModifyListener(modifyListener);
+		
+			Composite browseButtonsComposite = new Composite(group, SWT.NONE);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			gd.horizontalSpan = 2;
+			gd.horizontalAlignment = GridData.END;
+			browseButtonsComposite.setLayoutData(gd);
+			
+			layout = new GridLayout();
+			layout.numColumns = 2;
+			layout.marginWidth = 0;
+			layout.marginHeight = 0;
+			layout.marginBottom = 5;
+			browseButtonsComposite.setLayout(layout);
+			
+			browseWorkspaceButton = new Button(browseButtonsComposite, SWT.PUSH);
+			browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE);
+			browseWorkspaceButton.addSelectionListener(new SelectionListener(){
+	
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+	
+				public void widgetSelected(SelectionEvent e) {
+					String value = invokeWorkspaceFileSelectionDialog();
+					if(value != null) {
+						resourceLocationField.setText(value);
+					}
+				}
+			});
+			
+			browseFileSystemButton = new Button(browseButtonsComposite, SWT.PUSH);
+			browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_FILE_SYSTEM);
+			browseFileSystemButton.addSelectionListener(new SelectionListener(){
+	
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+	
+				public void widgetSelected(SelectionEvent e) {
+					String value = invokeFileSelectionDialog();
+					if(value != null) {
+						resourceLocationField.setText(value);
+					}
+				}
+			});
+			
+			// Key Type
+			//
+			Label keyTypeLabel = new Label(group, SWT.NONE);
+			keyTypeLabel.setText(XMLCatalogMessages.UI_KEY_TYPE_COLON);
+	
+			keyTypeCombo = new Combo(group, SWT.READ_ONLY);
+			gd = new GridData();
+			gd.horizontalAlignment = SWT.FILL;
+			gd.grabExcessHorizontalSpace = true;
+			keyTypeCombo.setLayoutData(gd);
+			updateKeyTypeCombo(getEntry().getEntryType());
+			keyTypeCombo.addModifyListener(modifyListener);
+	
+			// Suffix
+			// 
+			Label suffixValueLabel = new Label(group, SWT.NONE);
+			suffixValueLabel.setText(XMLCatalogMessages.UI_LABEL_SUFFIX_COLON);
+			suffixField = new Text(group, SWT.SINGLE | SWT.BORDER);
+
+			suffixField.setLayoutData(gd);
+			suffixField.setText(getDisplayValue(getEntry().getSuffix()));
+			suffixField.addModifyListener(modifyListener);
+		
+			errorMessageLabel = new Label(composite, SWT.NONE);
+			errorMessageLabel.setForeground(color);
+			errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	
+			updateWidgets(null);
+			
+			key = getEntry().getSuffix();
+			type = getEntry().getEntryType();
+	
+			return composite;
+		}
+	
+		public Control createControl(Composite parent) {
+	
+			fControl = createSuffixEntryPanel(parent);
+	
+			return fControl;
+		}
+	
+	
+		public ICatalogElement getData() {
+			return getEntry();
+		}
+	
+		protected ISuffixEntry getEntry() {
+			if (catalogEntry == null) {
+				if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_SUFFIX)) {
+					catalogEntry = (ISuffixEntry) fCatalogElement;
+				}
+				else {
+					if (catalog != null) {
+						catalogEntry = (ISuffixEntry) catalog.createCatalogElement(ICatalogElement.TYPE_SUFFIX);
+					}
+				}
+			}
+			return catalogEntry;
+		}
+	
+		protected int getKeyType() {
+			switch (keyTypeCombo.getSelectionIndex()) {
+				case 0 :
+					return ISuffixEntry.SUFFIX_TYPE_URI; // xsd namespace is URI type key
+				case 1 :
+					return ISuffixEntry.SUFFIX_TYPE_SYSTEM;
+				default :
+					return ISuffixEntry.SUFFIX_TYPE_URI;
+			}
+		}
+	
+		public void saveData() {
+			if (validateData()) {
+				getEntry().setURI(URIUtils.convertLocationToURI(resourceLocationField.getText()));
+				getEntry().setSuffix(suffixField.getText());
+				getEntry().setEntryType(getKeyType());
+				dataSaved = true;
+			}
+			else {
+				errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_SUFFIX;
+				errorMessageLabel.setText(errorMessage);
+				updateOKButtonState();
+				dataSaved = false;
+			}
+		}
+		
+		protected boolean validateData() {
+			ISuffixEntry entry = getEntry();
+			String uri = URIUtils.convertLocationToURI(resourceLocationField.getText());
+			if(entry.getEntryType() != getKeyType() || !entry.getSuffix().equals(suffixField.getText()) || !entry.getURI().equals(uri)) {
+				ISuffixEntry[] entries = catalog.getSuffixEntries();
+				for (int i = 0; i < entries.length; i++) {
+					if (entries[i].getSuffix().equals(suffixField.getText()) && entries[i].getEntryType() == getKeyType()) return false;
+				}
+			}
+			return true;
+		}
+	
+		protected void updateKeyTypeCombo(int type) {
+			keyTypeCombo.removeAll();
+			for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) {
+				XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next();
+				if (theFileType.extensions != null) {
+					for (Iterator j = theFileType.extensions.iterator(); j.hasNext();) {
+						String extension = (String) j.next();
+						if (resourceLocationField.getText().endsWith(extension)) {
+							if ("org.eclipse.wst.xml.core.ui.catalogFileType.xsd".equals(theFileType.id)) { //$NON-NLS-1$
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC);
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM);
+							}
+							else if ("org.eclipse.wst.xml.core.ui.catalogFileType.dtd".equals(theFileType.id)) { //$NON-NLS-1$
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM);
+							}
+							else {
+								keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+							}
+						}
+	
+					}
+	
+				}
+			}
+			if (keyTypeCombo.getItemCount() == 0) {
+				keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+				keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM);
+			}
+	
+			switch (type) {
+				case ISuffixEntry.SUFFIX_TYPE_URI: // handle XML Schema,
+					keyTypeCombo.select(0); // namespace name as URI key
+					break;
+
+				case ISuffixEntry.SUFFIX_TYPE_SYSTEM :
+					keyTypeCombo.select(1);
+					break;
+
+				default :
+					if (keyTypeCombo.getItemCount() > 0) {
+						keyTypeCombo.select(0);
+					}
+					break;
+			}
+	
+		}
+		
+		protected void updateWidgets(Widget widget) {
+			if (widget != keyTypeCombo) {
+				updateKeyTypeCombo(getKeyType());
+			}
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+	
+	}
+
+	protected abstract class CatalogElementPage {
+
+		Control fControl;
+
+		public CatalogElementPage() {
+			super();
+
+		}
+		
+		public abstract void refresh();
+
+		public abstract Control createControl(Composite parent);
+
+		public Control getControl() {
+			return fControl;
+		}
+
+		public abstract ICatalogElement getData();
+
+		public abstract void saveData();
+	}
+
+	protected class FilterableSelectSingleFileDialog extends SelectSingleFileDialog implements SelectionListener {
+		protected Combo filterControl;
+
+		public FilterableSelectSingleFileDialog(Shell parentShell) {
+			super(parentShell, null, true);
+			setFilters(null);
+		}
+
+		public void createAndOpen() {
+			this.create();
+			setBlockOnOpen(true);
+			getShell().setText(XMLCatalogMessages.UI_LABEL_FILE_SELECTION);
+			this.setTitle(XMLCatalogMessages.UI_LABEL_SELECT_FILE);
+			this.setMessage(XMLCatalogMessages.UI_LABEL_CHOOSE_FILE_TO_ADD_TO_CATALOG);
+			open();
+		}
+
+		public void createFilterControl(Composite composite) {
+			Label label = new Label(composite, SWT.NONE);
+			label.setText(XMLCatalogMessages.UI_LABEL_SELECT_FILE_FILTER_CONTROL);
+
+			filterControl = new Combo(composite, SWT.READ_ONLY);
+			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+			filterControl.setLayoutData(gd);
+
+			filterControl.setText(XMLCatalogMessages.UI_TEXT_SELECT_FILE_FILTER_CONTROL);
+			filterControl.add(XMLCatalogMessages.UI_TEXT_SELECT_FILE_FILTER_CONTROL);
+
+			for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) {
+				XMLCatalogFileType fileType = (XMLCatalogFileType) i.next();
+				if (fileType.description != null) {
+					filterControl.add(fileType.description);
+				}
+			}
+
+			filterControl.select(0);
+			filterControl.addSelectionListener(this);
+		}
+
+		protected void setFilters(XMLCatalogFileType fileType) {
+			if (fileType == null) {
+				// compute all the supported file extensions
+				List list = new ArrayList();
+				for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) {
+					XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next();
+					if (theFileType.extensions != null) {
+						list.addAll(theFileType.extensions);
+					}
+				}
+				// Any files are now supported with Resource URI
+				selectSingleFileView.setFilterExtensions(createStringArray(list));
+			}
+			else {
+				if (fileType.extensions != null) {
+					selectSingleFileView.setFilterExtensions(createStringArray(fileType.extensions));
+				}
+			}
+		}
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+			// do nothing
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			String text = filterControl.getText();
+			XMLCatalogFileType fileType = getMatchingFileType(text);
+			setFilters(fileType);
+		}
+	}
+
+	protected abstract class AbstractDelegatePage extends CatalogElementPage {
+	
+		
+		protected Button browseWorkspaceButton;
+		
+		protected Button browseFileSystemButton;
+		
+		protected Text catalogLocationField;
+
+		protected Label errorMessageLabel;
+
+		protected void computeErrorMessage() {
+			errorMessage = null;
+			String fileName = catalogLocationField.getText();
+			if (fileName.trim().length() > 0) {
+				if ((fileName.indexOf("..") != -1) || (fileName.indexOf("./") != -1) || (fileName.indexOf("/.") != -1) || (fileName.indexOf(".\\") != -1) || (fileName.indexOf("\\.") != -1)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+					errorMessage = XMLCatalogMessages.UI_WARNING_URI_MUST_NOT_HAVE_DOTS;
+				}
+
+				String uri = fileName;
+				if (!URIHelper.hasProtocol(uri)) {
+					uri = URIHelper.isAbsolute(uri) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri);
+				}
+
+				if ((errorMessage == null) && !URIHelper.isReadableURI(uri, false)) {
+					errorMessage = XMLCatalogMessages.UI_WARNING_URI_NOT_FOUND_COLON + fileName;
+				}
+			}
+			else {
+				// this an error that is not actually
+				// reported ... OK is just disabled
+				errorMessage = ""; //$NON-NLS-1$
+			}
+		}
+
+		public abstract Control createControl(Composite parent);
+
+		protected Control createNextCatalogPanel(Composite parent, String catalogUriLabel) {
+			ModifyListener modifyListener = new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					updateWidgets(e.widget);
+				}
+			};
+
+			Composite composite = new Composite(parent, SWT.NONE);
+			GridData gd = new GridData(GridData.FILL_BOTH);
+			composite.setLayoutData(gd);
+
+			GridLayout layout = new GridLayout();
+			composite.setLayout(layout);
+
+			Composite group = new Composite(composite, SWT.NONE);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			group.setLayoutData(gd);
+
+			layout = new GridLayout();
+			group.setLayout(layout);
+
+			createSpecificFields(group);
+			
+			Label resourceLocationLabel = new Label(group, SWT.NONE);
+			resourceLocationLabel.setText(catalogUriLabel);
+
+			catalogLocationField = new Text(group, SWT.SINGLE | SWT.BORDER);
+			catalogLocationField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			catalogLocationField.setText(URIUtils.convertURIToLocation(getDisplayValue(getCatalogLocation())));
+			// WorkbenchHelp.setHelp(resourceLocationField,
+			// XMLBuilderContextIds.XMLP_ENTRY_URI);
+			catalogLocationField.addModifyListener(modifyListener);
+			
+			Composite browseButtonsComposite = new Composite(group, SWT.FLAT);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			gd.horizontalSpan = 2;
+			gd.horizontalAlignment = GridData.END;
+			browseButtonsComposite.setLayoutData(gd);
+			
+			layout = new GridLayout();
+			layout.numColumns = 2;
+			layout.marginWidth = 0;
+			layout.marginHeight = 0;
+			layout.marginBottom = 5;
+			browseButtonsComposite.setLayout(layout);
+			
+			browseWorkspaceButton = new Button(browseButtonsComposite, SWT.PUSH);
+			browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE);
+			browseWorkspaceButton.addSelectionListener(new SelectionListener(){
+
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+
+				public void widgetSelected(SelectionEvent e) {
+					String value = invokeWorkspaceFileSelectionDialog();
+					if(value != null) {
+						catalogLocationField.setText(value);
+					}
+				}
+			});
+			
+			browseFileSystemButton = new Button(browseButtonsComposite, SWT.PUSH);
+			browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_FILE_SYSTEM);
+			browseFileSystemButton.addSelectionListener(new SelectionListener(){
+
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+
+				public void widgetSelected(SelectionEvent e) {
+					String value = invokeFileSelectionDialog();
+					if(value != null) {
+						catalogLocationField.setText(value);
+					}
+				}
+			});
+
+			errorMessageLabel = new Label(group, SWT.NONE);
+			errorMessageLabel.setForeground(color);
+			errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			updateWidgets(null);
+			return composite;
+		}
+
+		protected void createSpecificFields(Composite group) {
+		}
+
+		protected abstract String getCatalogLocation();
+
+		protected void updateWidgets(Widget widget) {
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+	}
+
+	protected class NextCatalogPage extends AbstractDelegatePage {
+		protected INextCatalog nextCatalog;
+
+		public ICatalogElement getData() {
+			return getNextCatalog();
+		}
+		
+		public void refresh() {
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+
+		protected INextCatalog getNextCatalog() {
+			if (nextCatalog == null) {
+				if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_NEXT_CATALOG)) {
+					nextCatalog = (INextCatalog) fCatalogElement;
+				}
+				else {
+					if (catalog != null) {
+						nextCatalog = (INextCatalog) catalog.createCatalogElement(ICatalogElement.TYPE_NEXT_CATALOG);
+					}
+				}
+			}
+			return nextCatalog;
+		}
+
+		public void saveData() {
+			getNextCatalog().setCatalogLocation(URIUtils.convertLocationToURI(catalogLocationField.getText()));
+			dataSaved = true;
+		}
+
+		protected String getCatalogLocation() {
+			return getNextCatalog().getCatalogLocation();
+		}
+		
+		public Control createControl(Composite parent) {
+			fControl = createNextCatalogPanel(parent, XMLCatalogMessages.UI_LABEL_CATALOG_URI_COLON);
+			return fControl;
+		}
+	}
+
+	protected class DelegateCatalogPage extends AbstractDelegatePage {
+		protected IDelegateCatalog delegateCatalog;
+		private Text prefixField;
+		private Combo keyTypeCombo;
+		
+		public void refresh() {
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+
+		protected void computeErrorMessage() {
+			errorMessage = null;
+			String prefix = prefixField.getText();
+			if(prefix.length() > 0) {
+				// good
+			} else {
+				errorMessage = "";
+			}
+		}
+		
+		public ICatalogElement getData() {
+			return getDelegateCatalog();
+		}
+
+		protected void createSpecificFields(Composite group) {
+			
+			Composite prefixComposite = new Composite(group, SWT.NONE);
+			
+			GridLayout layout = new GridLayout();
+			layout.numColumns = 2;
+			layout.marginWidth = 0;
+			layout.marginHeight = 0;
+			layout.marginBottom = 5;
+			prefixComposite.setLayout(layout);
+			
+			// Key Type
+			//
+			Label keyTypeLabel = new Label(prefixComposite, SWT.NONE);
+			keyTypeLabel.setText(XMLCatalogMessages.UI_MATCH_KEY_TYPE_COLON);
+	
+			keyTypeCombo = new Combo(prefixComposite, SWT.READ_ONLY);
+			GridData gd = new GridData();
+			gd.horizontalAlignment = SWT.FILL;
+			gd.grabExcessHorizontalSpace = true;
+			keyTypeCombo.setLayoutData(gd);
+			keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC);
+			keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM);
+			keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+			switch (getDelegateCatalog().getEntryType()) {
+			case IDelegateCatalog.DELEGATE_TYPE_PUBLIC:
+				keyTypeCombo.select(0);
+				break;
+			case IDelegateCatalog.DELEGATE_TYPE_SYSTEM:
+				keyTypeCombo.select(1);
+				break;
+			default:
+			case IDelegateCatalog.DELEGATE_TYPE_URI:
+				keyTypeCombo.select(2);
+				break;
+			}
+
+			Label prefixLabel = new Label(prefixComposite, SWT.NONE);
+			prefixLabel.setText(XMLCatalogMessages.UI_LABEL_START_STRING_COLON);
+
+			prefixField = new Text(prefixComposite, SWT.SINGLE | SWT.BORDER);
+			prefixField.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+			prefixField.setText(getDisplayValue(getDelegateCatalog().getStartString()));
+			ModifyListener modifyListener = new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					updateWidgets(e.widget);
+				}
+			};
+			prefixField.addModifyListener(modifyListener);
+			prefixComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+		}
+
+		protected IDelegateCatalog getDelegateCatalog() {
+			if (delegateCatalog == null) {
+				if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_DELEGATE)) {
+					delegateCatalog = (IDelegateCatalog) fCatalogElement;
+				}
+				else {	
+					if (catalog != null) {
+						delegateCatalog = (IDelegateCatalog) catalog.createCatalogElement(IDelegateCatalog.DELEGATE_TYPE_URI);
+					}
+				}
+			}
+			return delegateCatalog;
+		}
+
+		public void saveData() {
+			if (validateData())
+			{
+				getDelegateCatalog().setCatalogLocation(URIUtils.convertLocationToURI(catalogLocationField.getText()));
+				getDelegateCatalog().setStartString(prefixField.getText());
+				getDelegateCatalog().setEntryType(getDelegateType());
+				dataSaved = true;
+			}
+			else {
+				errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_DELEGATE;
+				errorMessageLabel.setText(errorMessage);
+				updateOKButtonState();
+				dataSaved = false;
+			}
+		}
+
+		private int getDelegateType() {
+			switch (keyTypeCombo.getSelectionIndex()) {
+			case 0:
+				return IDelegateCatalog.DELEGATE_TYPE_PUBLIC;
+
+			case 1:
+				return IDelegateCatalog.DELEGATE_TYPE_SYSTEM;
+			
+			case 2:				
+			default:
+				return IDelegateCatalog.DELEGATE_TYPE_URI;
+			}
+		}
+	
+		protected boolean validateData() {
+			IDelegateCatalog entry = getDelegateCatalog();
+			String prefix = prefixField.getText();
+			if(entry.getEntryType() != getDelegateType() || !prefix.equals(entry.getStartString())) {
+				IDelegateCatalog[] entries = catalog.getDelegateCatalogs();
+				for (int i = 0; i < entries.length; i++) {
+					if (entries[i].getStartString().equals(prefixField) && entries[i].getEntryType() == getDelegateType()) return false;
+				}
+			}
+			return true;
+		}
+
+		protected String getCatalogLocation() {
+			return getDelegateCatalog().getCatalogLocation();
+		}
+
+		public Control createControl(Composite parent) {
+			fControl = createNextCatalogPanel(parent, XMLCatalogMessages.UI_LABEL_DELEGATE_CATALOG_URI_COLON);
+			return fControl;
+		}
+	}
+
+	protected class RadioItemSelectionChangeListener implements SelectionListener {
+		public void widgetDefaultSelected(SelectionEvent e) {
+		}
+		
+		public void widgetSelected(SelectionEvent e) {
+			Object selection = e.getSource();
+			if (selection instanceof Button) {
+				Button button = (Button) selection;
+				if (button.getSelection()) {
+					if (!showPage((CatalogElementPage) button.getData())) {
+						// Page flipping wasn't successful
+						// handleError();
+					}
+				}
+			}
+		}
+
+	}
+
+	protected class RewriteEntryPage extends CatalogElementPage {
+		protected IRewriteEntry rewriteEntry;
+		private Text startStringField;
+		private Text prefixField;
+		private Combo keyTypeCombo;
+		
+		public void refresh() {
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+	
+		public ICatalogElement getData() {
+			return getRewriteEntry();
+		}
+	
+		protected Label errorMessageLabel;
+
+		protected void computeErrorMessage() {
+			errorMessage = null;
+			
+			String start = startStringField.getText();
+			String prefix = prefixField.getText();
+			if (start.trim().length() > 0 && prefix.trim().length() > 0) {
+				// good
+			}
+			else {
+				// this an error that is not actually
+				// reported ... OK is just disabled
+				errorMessage = ""; //$NON-NLS-1$
+			}
+		}
+
+		protected IRewriteEntry getRewriteEntry() {
+			if (rewriteEntry == null) {
+				if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_REWRITE)) {
+					rewriteEntry = (IRewriteEntry) fCatalogElement;
+				}
+				else {
+					if (catalog != null) {
+						rewriteEntry = (IRewriteEntry) catalog.createCatalogElement(IRewriteEntry.REWRITE_TYPE_SYSTEM);
+					}
+				}
+			}
+			return rewriteEntry;
+		}
+
+		protected void updateWidgets(Widget widget) {
+			computeErrorMessage();
+			updateErrorMessageLabel(errorMessageLabel);
+			updateOKButtonState();
+		}
+		public void saveData() {
+			if (validateData()) {
+				getRewriteEntry().setRewritePrefix(prefixField.getText());
+				getRewriteEntry().setStartString(startStringField.getText());
+				getRewriteEntry().setEntryType(getEntryType());
+				dataSaved = true;
+			}
+			else {
+				errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_REWRITE;
+				errorMessageLabel.setText(errorMessage);
+				updateOKButtonState();
+				dataSaved = false;
+			}
+		}
+
+		private int getEntryType() {
+			switch (keyTypeCombo.getSelectionIndex()) {
+			case 0:
+				return IRewriteEntry.REWRITE_TYPE_SYSTEM;
+			case 1:
+			default:
+				return IRewriteEntry.REWRITE_TYPE_URI;
+			}
+		}
+		
+		protected boolean validateData() {
+			IRewriteEntry entry = getRewriteEntry();
+			String startString = startStringField.getText();
+			if(entry.getEntryType() != getEntryType() || !entry.getStartString().equals(startString)) {
+				IRewriteEntry[] entries = catalog.getRewriteEntries();
+				for (int i = 0; i < entries.length; i++) {
+					if (entries[i].getStartString().equals(startString) && entries[i].getEntryType() == getEntryType()) return false;
+				}
+			}
+			return true;
+		}
+			
+		public Control createControl(Composite parent) {
+	
+			fControl = createRewriteEntryPanel(parent);
+	
+			return fControl;
+		}
+	
+		public Control createRewriteEntryPanel(Composite parent) {
+			ModifyListener modifyListener = new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					updateWidgets(e.widget);
+				}
+			};
+
+			Composite composite = new Composite(parent, SWT.NONE);
+			GridData gd = new GridData(GridData.FILL_BOTH);
+			composite.setLayoutData(gd);
+
+			GridLayout layout = new GridLayout();
+			composite.setLayout(layout);
+
+			Composite group = new Composite(composite, SWT.NONE);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			group.setLayoutData(gd);
+
+			layout = new GridLayout();
+			group.setLayout(layout);
+				
+			Composite prefixComposite = new Composite(group, SWT.NONE);
+			
+			layout = new GridLayout();
+			layout.numColumns = 2;
+			layout.marginWidth = 0;
+			layout.marginHeight = 0;
+			layout.marginBottom = 5;
+			prefixComposite.setLayout(layout);
+			
+			// Key Type
+			//
+			Label keyTypeLabel = new Label(prefixComposite, SWT.NONE);
+			keyTypeLabel.setText(XMLCatalogMessages.UI_MATCH_KEY_TYPE_COLON);
+	
+			keyTypeCombo = new Combo(prefixComposite, SWT.READ_ONLY);
+			gd = new GridData();
+			gd.horizontalAlignment = SWT.FILL;
+			gd.grabExcessHorizontalSpace = true;
+			keyTypeCombo.setLayoutData(gd);
+			keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM);
+			keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI);
+			switch (getRewriteEntry().getEntryType()) {
+			case IDelegateCatalog.DELEGATE_TYPE_SYSTEM:
+				keyTypeCombo.select(0);
+				break;
+			default:
+			case IDelegateCatalog.DELEGATE_TYPE_URI:
+				keyTypeCombo.select(1);
+				break;
+			}
+			Label startStringLabel = new Label(prefixComposite, SWT.NONE);
+			startStringLabel.setText(XMLCatalogMessages.UI_LABEL_START_STRING_COLON);
+	
+			startStringField = new Text(prefixComposite, SWT.SINGLE | SWT.BORDER);
+			startStringField.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+			startStringField.setText(getDisplayValue(getRewriteEntry().getStartString()));
+			startStringField.addModifyListener(modifyListener);
+
+			Label prefixLabel = new Label(prefixComposite, SWT.NONE);
+			prefixLabel.setText(XMLCatalogMessages.UI_LABEL_REWRITE_PREFIX_COLON);
+	
+			prefixField = new Text(prefixComposite, SWT.SINGLE | SWT.BORDER);
+			prefixField.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+			prefixField.setText(getDisplayValue(getRewriteEntry().getRewritePrefix()));
+			prefixField.addModifyListener(modifyListener);
+	
+			prefixComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+
+			errorMessageLabel = new Label(group, SWT.NONE);
+			errorMessageLabel.setForeground(color);
+			errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			updateWidgets(null);
+			return composite;
+		}
+	}
+
+	protected class ToolBarItemSelectionChangeListener implements SelectionListener {
+		public void widgetDefaultSelected(SelectionEvent e) {}
+
+		public void widgetSelected(SelectionEvent e) {
+			Object selection = e.getSource();
+			if (selection instanceof ToolItem) {
+				ToolItem toolItem = (ToolItem)selection;
+				ToolBar toolbar = toolItem.getParent();
+				if(toolbar != null) {
+					ToolItem[] items = toolbar.getItems();
+					for (int i = 0; i < items.length; i++) {
+						items[i].setSelection(items[i] == toolItem);
+					}
+				}
+				if (!showPage((CatalogElementPage) toolItem.getData())) {
+					// Page flipping wasn't successful
+					// handleError();
+				}
+			}
+		}
+	}
+	
+	public static String[] createStringArray(List list) {
+		String[] stringArray = new String[list.size()];
+		for (int i = 0; i < stringArray.length; i++) {
+			stringArray[i] = (String) list.get(i);
+		}
+		return stringArray;
+	}
+
+	public static String removeLeadingSlash(String uri) {
+		// remove leading slash from the value to avoid the whole leading
+		// slash
+		// ambiguity problem
+		//       
+		if (uri != null) {
+			while (uri.startsWith("/") || uri.startsWith("\\")) { //$NON-NLS-1$ //$NON-NLS-2$
+				uri = uri.substring(1);
+			}
+		}
+		return uri;
+	}
+
+	protected ICatalog catalog;
+
+	protected ICatalogElement fCatalogElement;
+
+	protected String errorMessage;
+
+	protected String warningMessage;
+
+	protected Button okButton;
+
+	protected PageBook pageContainer;
+
+	protected CatalogElementPage selectedPage;
+
+	// protected TreeViewer treeViewer;
+	
+	protected ToolBar toolBar;
+
+	protected Composite elementTypeComposite;
+
+	protected Color color;
+	protected boolean dataSaved;
+
+	public EditCatalogEntryDialog(Shell parentShell, ICatalog aCatalog) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.catalog = aCatalog;
+	}
+
+	public EditCatalogEntryDialog(Shell parentShell, ICatalogElement catalogElement, ICatalog aCatalog) {
+		this(parentShell, aCatalog);
+		this.fCatalogElement = catalogElement;
+		// TODO EB: fix his
+		// entry.setURI(URIHelper.removePlatformResourceProtocol(entry.getURI()));
+	}
+
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			selectedPage.saveData();
+			if (!dataSaved) {				
+				// do not exit edit dialog
+				return;
+			}
+		}
+		super.buttonPressed(buttonId);
+	}
+
+
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		okButton.setEnabled(false);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+		updateOKButtonState();
+	}
+
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);
+		color = new Color(dialogAreaComposite.getDisplay(), 200, 0, 0);
+		GridLayout layout = new GridLayout();
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		dialogAreaComposite.setLayout(layout);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.widthHint = 550;
+		//gd.heightHint = 250;
+		dialogAreaComposite.setLayoutData(gd);
+		createMainComponent(dialogAreaComposite);
+		return this.dialogArea;
+	}
+
+	public boolean close() {
+		if (color != null) {
+			color.dispose();
+		}
+		return super.close();
+	}
+
+	protected Composite createMainComponent(Composite composite) {
+		if (fCatalogElement != null) // "edit" action
+		{
+			Composite composite1 = new Composite(composite, SWT.NONE);
+			GridData data = new GridData(GridData.FILL_BOTH);
+			composite1.setLayoutData(data);
+			GridLayout layout = new GridLayout();
+			composite1.setLayout(layout);
+
+			pageContainer = new PageBook(composite1, SWT.NONE);
+			pageContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+			if (fCatalogElement.getType() == ICatalogElement.TYPE_ENTRY) {
+				CatalogElementPage entryPage = new CatalogEntryPage();
+				entryPage.createControl(pageContainer);
+				showPage(entryPage);
+			}
+			else if (fCatalogElement.getType() == ICatalogElement.TYPE_NEXT_CATALOG) {
+				CatalogElementPage nextCatalogPage = new NextCatalogPage();
+				nextCatalogPage.createControl(pageContainer);
+				showPage(nextCatalogPage);
+			}
+			else if (fCatalogElement.getType() == ICatalogElement.TYPE_DELEGATE) {
+				DelegateCatalogPage delegateCatalogPage = new DelegateCatalogPage();
+				delegateCatalogPage.createControl(pageContainer);
+				showPage(delegateCatalogPage);
+			}
+			else if (fCatalogElement.getType() == ICatalogElement.TYPE_SUFFIX) {
+				SuffixEntryPage suffixEntryPage = new SuffixEntryPage();
+				suffixEntryPage.createControl(pageContainer);
+				showPage(suffixEntryPage);
+			}
+			else if (fCatalogElement.getType() == ICatalogElement.TYPE_REWRITE) {
+				RewriteEntryPage rewriteEntryPage = new RewriteEntryPage();
+				rewriteEntryPage.createControl(pageContainer);
+				showPage(rewriteEntryPage);
+			}
+
+			return composite1;
+		}
+		return createMainComponentWithToolbar(composite);
+
+	}
+
+	
+	protected Composite createMainComponentWithToolbar(Composite composite) {
+
+		FormLayout formLayout = new FormLayout();
+		formLayout.marginHeight = 5;
+		formLayout.marginWidth = 5;
+		composite.setLayout(formLayout);
+
+		Label label = new Label(composite, SWT.NONE);
+		FormData data = new FormData();
+		data.top = new FormAttachment(0, 0);
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(100, 0);
+		label.setLayoutData(data);
+
+		toolBar = new ToolBar(composite, SWT.BORDER | SWT.FLAT | SWT.VERTICAL);
+		
+
+		data = new FormData();
+		data.top = new FormAttachment(label, 0);
+		data.left = new FormAttachment(0, 0);
+		data.bottom = new FormAttachment(100, 0);
+		// data.height = 250;
+		// data.width = 50;
+		toolBar.setLayoutData(data);
+
+		Composite composite1 = new Composite(composite, SWT.BORDER);
+		data = new FormData();
+		data.top = new FormAttachment(label, 0);
+		data.left = new FormAttachment(toolBar, 0, SWT.DEFAULT);
+		data.right = new FormAttachment(100, 0);
+		data.bottom = new FormAttachment(100, 0);
+		composite1.setLayoutData(data);
+		GridLayout layout = new GridLayout();
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		composite1.setLayout(layout);
+
+		// createPageBookPanel(composite1);
+		pageContainer = new PageBook(composite1, SWT.NONE);
+		pageContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		// add pages for each type of catalog element
+		createCatalogEntryButton();
+		createRewriteButton();
+		createSuffixCatalogButton();
+		createNextCatalogButton();
+		createDelegateCatalogButton();
+		if (toolBar.getItemCount() > 0) {
+			ToolItem item = toolBar.getItem(0);
+			showPage((CatalogElementPage) (item.getData()));
+		}
+		return composite1;
+	}
+	
+	protected void createCatalogEntryButton() {
+		CatalogElementPage page = new CatalogEntryPage();
+		page.createControl(pageContainer);
+		ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK);
+		toolItem.setImage(catalogEntryToolBarImage);
+		toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_catalogEntryLabel);
+		toolItem.setData(page);
+		toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener());
+		toolItem.setSelection(true);
+	}
+
+	protected void createNextCatalogButton() {
+		CatalogElementPage page = new NextCatalogPage();
+		page.createControl(pageContainer);
+		ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK);
+		toolItem.setImage(nextCatalogToolBarImage);
+		toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_nextCatalogLabel);
+		toolItem.setData(page);
+		toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener());
+
+	}
+	
+	protected void createRewriteButton() {
+		CatalogElementPage page = new RewriteEntryPage();
+		page.createControl(pageContainer);
+		ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK);
+		toolItem.setImage(rewriteToolBarImage);
+		toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_rewriteEntryLabel);
+		toolItem.setData(page);
+		toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener());
+	}
+	
+	protected void createDelegateCatalogButton() {
+		CatalogElementPage page = new DelegateCatalogPage();
+		page.createControl(pageContainer);
+		ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK);
+		toolItem.setImage(delegateCatalogToolBarImage);
+		toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_delegateCatalogLabel);
+		toolItem.setData(page);
+		toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener());
+	}
+	
+	protected void createSuffixCatalogButton() {
+		CatalogElementPage page = new SuffixEntryPage();
+		page.createControl(pageContainer);
+		ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK);
+		toolItem.setImage(suffixToolBarImage);
+		toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_suffixEntryLabel);
+		toolItem.setData(page);
+		toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener());
+	}
+	
+	
+	
+	
+	
+	
+//
+//	protected void createRewriteEntryButton() {
+//		CatalogElementPage page = new RewriteEntryPage();
+//		page.createControl(pageContainer);
+//		Button radioButton = new Button(elementTypeComposite, SWT.RADIO);
+//		radioButton.setText(XMLCatalogMessages.EditCatalogEntryDialog_rewriteEntryLabel);
+//		radioButton.setData(page);
+//		radioButton.addSelectionListener(new RadioItemSelectionChangeListener());
+//	}
+//
+//	protected void createSuffixEntryButton() {
+//		CatalogElementPage page = new SuffixEntryPage();
+//		page.createControl(pageContainer);
+//		Button radioButton = new Button(elementTypeComposite, SWT.RADIO);
+//		radioButton.setText(XMLCatalogMessages.EditCatalogEntryDialog_suffixEntryLabel);
+//		radioButton.setData(page);
+//		radioButton.addSelectionListener(new RadioItemSelectionChangeListener());
+//	}
+//
+//	protected void createDelegateCatalogButton() {
+//		CatalogElementPage page = new DelegateCatalogPage();
+//		page.createControl(pageContainer);
+//		Button radioButton = new Button(elementTypeComposite, SWT.RADIO);
+//		radioButton.setText(XMLCatalogMessages.EditCatalogEntryDialog_delegateCatalogLabel);
+//		radioButton.setData(page);
+//		radioButton.addSelectionListener(new RadioItemSelectionChangeListener());
+//
+//	}
+
+	protected ICatalogElement getCatalogElement() {
+		return fCatalogElement;
+	}
+
+	protected String getDisplayValue(String string) {
+		return string != null ? string : ""; //$NON-NLS-1$
+	}
+
+	protected XMLCatalogFileType getMatchingFileType(String description) {
+		XMLCatalogFileType fileType = null;
+		for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) {
+			XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next();
+			if ((theFileType.description != null) && theFileType.description.equals(description)) {
+				fileType = theFileType;
+			}
+		}
+		return fileType;
+	}
+
+	protected boolean showPage(CatalogElementPage page) {
+		if (pageContainer.isDisposed()) {
+			return false;
+		}
+		selectedPage = page;
+		pageContainer.setVisible(true);
+		pageContainer.showPage(selectedPage.getControl());
+		fCatalogElement = selectedPage.getData();
+		selectedPage.refresh();
+		return true;
+	}
+
+	protected void updateErrorMessageLabel(Label errorMessageLabel) {
+		if (errorMessage != null) {
+			errorMessageLabel.setText(errorMessage);
+		}
+		else if (warningMessage != null) {
+			errorMessageLabel.setText(warningMessage);
+		}
+		else {
+			errorMessageLabel.setText("");
+		}
+	}
+
+	protected void updateOKButtonState() {
+		if (okButton != null) {
+			okButton.setEnabled(errorMessage == null);
+		}
+	}
+
+	protected Button createBrowseButton(Composite composite) {
+		Button browseButton = new Button(composite, SWT.PUSH);
+		// browseButton.setText(XMLCatalogMessages.
+		// UI_BUTTON_BROWSE"));
+		browseButton.setImage(borwseImage);
+		Rectangle r = borwseImage.getBounds();
+		GridData gd = new GridData();
+		int IMAGE_WIDTH_MARGIN = 6;
+		int IMAGE_HEIGHT_MARGIN = 6;
+		gd.heightHint = r.height + IMAGE_HEIGHT_MARGIN;
+		gd.widthHint = r.width + IMAGE_WIDTH_MARGIN;
+		browseButton.setLayoutData(gd);
+
+		return browseButton;
+
+	}
+	
+	protected Button createWorkspaceBrowseButton(Composite composite) {
+		Button browseWorkspaceButton = new Button(composite, SWT.PUSH);
+		browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE);
+		return browseWorkspaceButton;
+	}
+	
+	protected Button createFileSystemBrowseButton(Composite composite) {
+		Button browseFileSystemButton = new Button(composite, SWT.PUSH);
+		browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE);
+		return browseFileSystemButton;
+	}
+
+	
+	String invokeWorkspaceFileSelectionDialog() {
+		FilterableSelectSingleFileDialog dialog = new FilterableSelectSingleFileDialog(getShell());
+		dialog.createAndOpen();
+		IFile file = dialog.getFile();
+		String uri = null;
+		if (file != null) {
+			// remove leading slash from the value to avoid the
+			// whole leading slash ambiguity problem
+			//                    
+			uri = file.getFullPath().toString();
+			while (uri.startsWith("/") || uri.startsWith("\\")) { //$NON-NLS-1$ //$NON-NLS-2$
+				uri = uri.substring(1);
+			}
+		}
+		return uri;
+	}
+
+	String invokeFileSelectionDialog() {
+		FileDialog dialog = new FileDialog(getShell(), SWT.SINGLE);
+		return dialog.open();
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ElementNodePage.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ElementNodePage.java
new file mode 100644
index 0000000..0ec61e6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ElementNodePage.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+
+
+public abstract class ElementNodePage {
+
+	Control fControl;
+
+	public ElementNodePage() {
+		super();
+
+	}
+
+	public abstract Control createControl(Composite parent);
+
+	public Control getControl() {
+		return fControl;
+	}
+
+	public abstract void saveData();
+
+	public abstract ICatalogElement getData();
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ImageFactory.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ImageFactory.java
new file mode 100644
index 0000000..3938a7e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ImageFactory.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import java.util.Hashtable;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+public class ImageFactory {
+	public static final int TOP_LEFT = 1;
+	public static final int TOP_RIGHT = 2;
+	public static final int BOTTOM_LEFT = 3;
+	public static final int BOTTOM_RIGHT = 4;
+
+	protected static final int[][] OVERLAY_COORDINATE = {{0, 0}, {0, 2}, {2, 0}, {2, 2}};
+
+	protected static ImageFactory INSTANCE = new ImageFactory();
+
+	protected Hashtable compositeImageTable = new Hashtable();
+
+	public ImageFactory() {
+		super();
+	}
+
+	public Image getImage(String iconName) {
+		ImageRegistry imageRegistry = XMLUIPlugin.getDefault().getImageRegistry();
+
+		if (imageRegistry.get(iconName) != null) {
+			return imageRegistry.get(iconName);
+		}
+		else {
+			imageRegistry.put(iconName, ImageDescriptor.createFromFile(getClass(), iconName));
+			return imageRegistry.get(iconName);
+		}
+	}
+
+	public Image createCompositeImage(Image base, Image overlay, int overlayPosition) {
+		String key = base + "*" + overlay + "*" + overlayPosition; //$NON-NLS-1$ //$NON-NLS-2$
+		Image result = (Image) compositeImageTable.get(key);
+		if (result == null) {
+			ImageDescriptor overlays[][] = new ImageDescriptor[3][3];
+			int[] coord = OVERLAY_COORDINATE[overlayPosition];
+			overlays[coord[1]][coord[0]] = new ImageBasedImageDescriptor(overlay);
+			OverlayIcon icon = new OverlayIcon(new ImageBasedImageDescriptor(base), overlays, new Point(16, 16));
+			result = icon.createImage();
+			compositeImageTable.put(key, result);
+		}
+		return result;
+	}
+
+
+	public static ImageDescriptor createImageDescriptorWrapper(Image image) {
+		return new ImageBasedImageDescriptor(image);
+	}
+
+	/**
+	 * An OverlayIcon consists of a main icon and several adornments.
+	 */
+	class OverlayIcon extends CompositeImageDescriptor {
+
+		static final int DEFAULT_WIDTH = 22;
+
+		static final int DEFAULT_HEIGHT = 16;
+
+		private Point fSize = null;
+
+		private ImageDescriptor fBase;
+
+		private ImageDescriptor fOverlays[][];
+
+		public OverlayIcon(ImageDescriptor base, ImageDescriptor[][] overlays, Point size) {
+			fBase = base;
+			fOverlays = overlays;
+			fSize = size;
+		}
+
+		protected void drawBottomLeft(ImageDescriptor[] overlays) {
+			if (overlays == null) {
+				return;
+			}
+			int length = overlays.length;
+			int x = 0;
+			for (int i = 0; i < 3; i++) {
+				if ((i < length) && (overlays[i] != null)) {
+					ImageData id = overlays[i].getImageData();
+					drawImage(id, x, getSize().y - id.height);
+					x += id.width;
+				}
+			}
+		}
+
+		protected void drawBottomRight(ImageDescriptor[] overlays) {
+			if (overlays == null) {
+				return;
+			}
+			int length = overlays.length;
+			int x = getSize().x;
+			for (int i = 2; i >= 0; i--) {
+				if ((i < length) && (overlays[i] != null)) {
+					ImageData id = overlays[i].getImageData();
+					x -= id.width;
+					drawImage(id, x, getSize().y - id.height);
+				}
+			}
+		}
+
+		/**
+		 * @see CompositeImageDescriptor#drawCompositeImage(int, int)
+		 */
+		protected void drawCompositeImage(int width, int height) {
+			ImageData bg;
+			if ((fBase == null) || ((bg = fBase.getImageData()) == null)) {
+				bg = DEFAULT_IMAGE_DATA;
+			}
+			drawImage(bg, 0, 0);
+
+			if (fOverlays != null) {
+				if (fOverlays.length > 0) {
+					drawTopRight(fOverlays[0]);
+				}
+
+				if (fOverlays.length > 1) {
+					drawBottomRight(fOverlays[1]);
+				}
+
+				if (fOverlays.length > 2) {
+					drawBottomLeft(fOverlays[2]);
+				}
+
+				if (fOverlays.length > 3) {
+					drawTopLeft(fOverlays[3]);
+				}
+			}
+		}
+
+		protected void drawTopLeft(ImageDescriptor[] overlays) {
+			if (overlays == null) {
+				return;
+			}
+			int length = overlays.length;
+			int x = 0;
+			for (int i = 0; i < 3; i++) {
+				if ((i < length) && (overlays[i] != null)) {
+					ImageData id = overlays[i].getImageData();
+					drawImage(id, x, 0);
+					x += id.width;
+				}
+			}
+		}
+
+		protected void drawTopRight(ImageDescriptor[] overlays) {
+			if (overlays == null) {
+				return;
+			}
+			int length = overlays.length;
+			int x = getSize().x;
+			for (int i = 2; i >= 0; i--) {
+				if ((i < length) && (overlays[i] != null)) {
+					ImageData id = overlays[i].getImageData();
+					x -= id.width;
+					drawImage(id, x, 0);
+				}
+			}
+		}
+
+		/**
+		 * @see CompositeImageDescriptor#getSize()
+		 */
+		protected Point getSize() {
+			return fSize;
+		}
+	}
+
+	static class ImageBasedImageDescriptor extends ImageDescriptor {
+		protected Image image;
+
+		public ImageBasedImageDescriptor(Image image) {
+			this.image = image;
+		}
+
+		public ImageData getImageData() {
+			return image.getImageData();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/URIUtils.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/URIUtils.java
new file mode 100644
index 0000000..ea0c2bc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/URIUtils.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+
+public class URIUtils {
+	
+	  private static final String PROTOCOL_PATTERN = ":"; 
+	  private static final String FILE_PROTOCOL = "file:";
+	  private static final String PLATFORM_RESOURCE_PROTOCOL = "platform:/resource/";
+	  private static final String LOCAL_FILE_PROTOCOL_FORWARD_SLASH = "\\\\\\";
+	  private static final String LOCAL_FILE_PROTOCOL_BACK_SLASH = "///";
+	  private static final char   PATH_SEPARATOR_FORWARD_SLASH = '/';
+	  private static final char   PATH_SEPARATOR_BACK_SLASH = '\\';
+	  
+	  public static String convertURIToLocation(String uri) {
+			String location = uri;
+			if (uri != null) {
+				if (uri.startsWith(FILE_PROTOCOL)) {
+					location = org.eclipse.wst.common.uriresolver.internal.URI.createURI(uri).toFileString();
+					if (location != null && (location.startsWith(LOCAL_FILE_PROTOCOL_BACK_SLASH)
+							|| location.startsWith(LOCAL_FILE_PROTOCOL_FORWARD_SLASH))) {
+						location = location.substring(LOCAL_FILE_PROTOCOL_BACK_SLASH.length());
+					}
+				} else if (uri.startsWith(PLATFORM_RESOURCE_PROTOCOL)) {
+					location = uri.substring(PLATFORM_RESOURCE_PROTOCOL.length());
+				}
+			}
+		return location;
+	  }
+	  
+	  public static String convertLocationToURI(String location) {
+		  String uri = location;
+			if (!URIHelper.hasProtocol(location)) {
+				uri = URIHelper.isAbsolute(location)? org.eclipse.wst.common.uriresolver.internal.URI.createFileURI(location).toString()
+						: URIHelper.prependPlatformResourceProtocol(location);
+			}
+			if (uri.startsWith(FILE_PROTOCOL) && uri.indexOf(PROTOCOL_PATTERN, FILE_PROTOCOL.length()) != -1) {
+				uri = URIHelper.ensureFileURIProtocolFormat(uri);
+			}
+			uri = uri.replace(PATH_SEPARATOR_BACK_SLASH, PATH_SEPARATOR_FORWARD_SLASH);
+			return uri;
+	  }
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogEntriesView.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogEntriesView.java
new file mode 100644
index 0000000..92f8bb5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogEntriesView.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.core.internal.catalog.Catalog;
+import org.eclipse.wst.xml.core.internal.catalog.CatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+
+
+public class XMLCatalogEntriesView extends Composite {
+	protected Button newButton;
+	protected Button editButton;
+	protected Button deleteButton;
+	protected XMLCatalogTreeViewer tableViewer;
+	protected ICatalog workingUserCatalog;
+	protected ICatalog systemCatalog;
+
+	// protected boolean isPageEnabled = true;
+
+	public XMLCatalogEntriesView(Composite parent, ICatalog workingUserCatalog, ICatalog systemCatalog) {
+		super(parent, SWT.NONE);
+		this.workingUserCatalog = workingUserCatalog;
+		this.systemCatalog = systemCatalog;
+
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		this.setLayout(gridLayout);
+
+		tableViewer = createTableViewer(this);
+		tableViewer.setInput("dummy"); //$NON-NLS-1$
+		
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=202692
+		// specifically set size of tree before expanding it
+		Point initialSize = tableViewer.getTree().computeSize(SWT.DEFAULT, SWT.DEFAULT);
+		GridData gridData = new GridData(GridData.FILL_BOTH);
+		gridData.widthHint = initialSize.x;
+		gridData.heightHint = initialSize.y;
+		tableViewer.getControl().setLayoutData(gridData);
+		
+		tableViewer.expandToLevel(2);
+		tableViewer.reveal(XMLCatalogTreeViewer.USER_SPECIFIED_ENTRIES_OBJECT);
+		
+		ISelectionChangedListener listener = new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateWidgetEnabledState();
+			}
+		};
+		tableViewer.addSelectionChangedListener(listener);
+
+		createButtons(this);
+	}
+
+	public static String removeLeadingSlash(String uri) {
+		// remove leading slash from the value to avoid the whole leading
+		// slash ambiguity problem
+		//       
+		if (uri != null) {
+			while (uri.startsWith("/") || uri.startsWith("\\")) //$NON-NLS-1$ //$NON-NLS-2$
+			{
+				uri = uri.substring(1);
+			}
+		}
+		return uri;
+	}
+
+	protected XMLCatalogTreeViewer createTableViewer(Composite parent) {
+		String headings[] = new String[2];
+		headings[0] = XMLCatalogMessages.UI_LABEL_KEY;
+		headings[1] = XMLCatalogMessages.UI_LABEL_URI;
+
+		XMLCatalogTreeViewer theTableViewer = new XMLCatalogTreeViewer(parent, workingUserCatalog, systemCatalog);
+		return theTableViewer;
+	}
+
+	protected void createButtons(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridData gd = new GridData();
+		gd.verticalAlignment = GridData.BEGINNING;
+		composite.setLayoutData(gd);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.marginHeight = 0;
+		gridLayout.marginWidth = 0;
+		gridLayout.marginLeft = 3;
+		composite.setLayout(gridLayout);
+
+		SelectionListener selectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (e.widget == newButton) {
+					performNew();
+				}
+				else if (e.widget == editButton) {
+					performEdit();
+				}
+				else if (e.widget == deleteButton) {
+					performDelete();
+				}
+			}
+		};
+
+		// add the "New..." button
+		//
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.FILL;
+		gd.grabExcessHorizontalSpace = true;
+
+		newButton = new Button(composite, SWT.NONE);
+		newButton.setText(XMLCatalogMessages.UI_BUTTON_NEW);
+		// WorkbenchHelp.setHelp(newButton,
+		// XMLBuilderContextIds.XMLP_MAPPING_NEW);
+		newButton.setLayoutData(gd);
+		newButton.addSelectionListener(selectionListener);
+
+		// add the "Edit..." button
+		//
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.FILL;
+		gd.grabExcessHorizontalSpace = true;
+		editButton = new Button(composite, SWT.NONE);
+		editButton.setText(XMLCatalogMessages.UI_BUTTON_EDIT);
+		// WorkbenchHelp.setHelp(editButton,
+		// XMLBuilderContextIds.XMLP_MAPPING_EDIT);
+		editButton.setLayoutData(gd);
+		editButton.addSelectionListener(selectionListener);
+
+		// add the "Delete" button
+		//
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.FILL;
+		gd.grabExcessHorizontalSpace = true;
+		deleteButton = new Button(composite, SWT.NONE);
+		deleteButton.setText(XMLCatalogMessages.UI_BUTTON_REMOVE);
+		// WorkbenchHelp.setHelp(deleteButton,
+		// XMLBuilderContextIds.XMLP_MAPPING_DELETE);
+		deleteButton.setLayoutData(gd);
+		deleteButton.addSelectionListener(selectionListener);
+		
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.FILL;
+		gd.grabExcessHorizontalSpace = true;
+		gd.horizontalSpan = 4;
+
+		Button hiddenButton = new Button(composite, SWT.NONE);
+		hiddenButton.setLayoutData(gd);
+		hiddenButton.setVisible(false);
+		hiddenButton.setEnabled(false);
+
+		// a cruddy hack so that the PreferenceDialog doesn't close every time
+		// we press 'enter'
+		//
+		getShell().setDefaultButton(hiddenButton);
+		updateWidgetEnabledState();
+	}
+
+	public void refresh() {
+		tableViewer.refresh();// XMLCatalogTreeViewer.USER_SPECIFIED_ENTRIES_OBJECT);
+	}
+
+	protected EditCatalogEntryDialog invokeDialog(String title, ICatalogElement entry, ICatalog catalog) {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		EditCatalogEntryDialog dialog = entry != null ? new EditCatalogEntryDialog(shell, entry, catalog) : new EditCatalogEntryDialog(shell, catalog);
+		dialog.create();
+		dialog.getShell().setText(title);
+		dialog.setBlockOnOpen(true);
+		dialog.open();
+		return dialog;
+	}
+
+	protected EditCatalogEntryDialog invokeDialog(String title, ICatalog catalog) {
+		return invokeDialog(title, null, catalog);
+	}
+
+
+	protected void performNew() {
+
+		// ICatalogEntry newEntry =
+		// (ICatalogEntry)workingUserCatalog.createCatalogElement(ICatalogElement.TYPE_ENTRY);
+		EditCatalogEntryDialog dialog = invokeDialog(XMLCatalogMessages.UI_LABEL_NEW_DIALOG_TITLE, workingUserCatalog);
+		ICatalogElement element = dialog.getCatalogElement();
+		if (dialog.getReturnCode() == Window.OK) {
+			workingUserCatalog.addCatalogElement(element);
+			tableViewer.setSelection(new StructuredSelection(element), true);
+			tableViewer.refresh();
+		}
+	}
+
+	protected void performEdit() {
+		ISelection selection = tableViewer.getSelection();
+		Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;
+
+		if (selectedObject instanceof ICatalogElement) {
+			ICatalogElement oldEntry = (ICatalogElement) selectedObject;
+			ICatalogElement newEntry = (ICatalogElement) ((CatalogElement) oldEntry).clone();
+
+			EditCatalogEntryDialog dialog = invokeDialog(XMLCatalogMessages.UI_LABEL_EDIT_DIALOG_TITLE, newEntry, workingUserCatalog);
+			if (dialog.getReturnCode() == Window.OK) {
+				// delete the old value if the 'mapFrom' has changed
+				//
+				workingUserCatalog.removeCatalogElement(oldEntry);
+
+				// update the new mapping
+				//
+				workingUserCatalog.addCatalogElement(newEntry);
+				tableViewer.setSelection(new StructuredSelection(newEntry));
+			}
+		}
+	}
+
+	protected void performDelete() {
+		ISelection selection = tableViewer.getSelection();
+		if(selection instanceof IStructuredSelection) {
+			IStructuredSelection structuredSelection = (IStructuredSelection)selection;
+			Iterator iterator = structuredSelection.iterator();
+			while(iterator.hasNext()) {
+				Object selectedObject = iterator.next();
+				if (selectedObject instanceof ICatalogElement) {
+					ICatalogElement catalogElement = (ICatalogElement) selectedObject;
+					workingUserCatalog.removeCatalogElement(catalogElement);
+				}
+			}
+		}
+	}
+
+	protected void updateWidgetEnabledState() {
+		boolean isEditable = false;
+		ISelection selection = tableViewer.getSelection();
+		boolean multipleSelection = false;
+		if(selection instanceof IStructuredSelection) {
+			IStructuredSelection structuredSelection = (IStructuredSelection)selection;
+			if(structuredSelection.size() > 1) {
+				multipleSelection = true;
+			}
+			Object selectedObject = structuredSelection.getFirstElement();
+			if (selectedObject instanceof ICatalogElement) {
+				ICatalogElement[] elements = ((Catalog) workingUserCatalog).getCatalogElements();
+				// dw List entriesList = new ArrayList(elements.length);
+				for (int i = 0; i < elements.length; i++) {
+					ICatalogElement element = elements[i];
+					isEditable = selectedObject.equals(element);
+					if (isEditable) {
+						break;
+					}
+				}
+			}
+		}
+
+		// if (isPageEnabled)
+		{
+			editButton.setEnabled(isEditable & !multipleSelection);
+			deleteButton.setEnabled(isEditable);
+		}
+	}
+
+	/*
+	 * public void setPageEnabled(boolean enabled) { isPageEnabled = enabled;
+	 * 
+	 * tableViewer.getControl().setEnabled(isPageEnabled);
+	 * 
+	 * newButton.setEnabled(isPageEnabled);
+	 * editButton.setEnabled(isPageEnabled);
+	 * deleteButton.setEnabled(isPageEnabled); }
+	 */
+	public void updatePage() {
+		refresh();
+		updateWidgetEnabledState();
+	}
+
+	public Viewer getViewer() {
+		return tableViewer;
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogEntryDetailsView.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogEntryDetailsView.java
new file mode 100644
index 0000000..0546950
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogEntryDetailsView.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
+
+
+
+public class XMLCatalogEntryDetailsView {
+	protected Text detailsText;
+	protected ScrollBar verticalScroll, horizontalScroll;
+
+	public XMLCatalogEntryDetailsView(Composite parent) {
+		Color color = parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+
+		detailsText = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.heightHint = 85;
+		detailsText.setLayoutData(data);
+
+		verticalScroll = detailsText.getVerticalBar();
+		// verticalScroll.setVisible(false);
+		horizontalScroll = detailsText.getHorizontalBar();
+		detailsText.setEditable(false);
+		detailsText.setBackground(color);
+	}
+
+	protected void setCatalogEntry(ICatalogEntry entry) {
+		if (entry == null) {
+			detailsText.setText(""); //$NON-NLS-1$
+			return;
+		}
+		String value = getDisplayValue(entry != null ? entry.getURI() : ""); //$NON-NLS-1$
+		String line0 = XMLCatalogMessages.UI_LABEL_ENTRY_ELEMENT_COLON + "\t\t"; //$NON-NLS-1$
+		String line2 = XMLCatalogMessages.UI_LABEL_DETAILS_URI_COLON + "\t\t\t\t" + value; //$NON-NLS-1$
+		String line1;
+		if (value.startsWith("jar:file:")) { //$NON-NLS-1$
+			String jarFile = URIUtils.convertURIToLocation(URIHelper.ensureURIProtocolFormat(value.substring("jar:".length(), value.indexOf('!')))); //$NON-NLS-1$
+			String internalFile = URIUtils.convertURIToLocation(URIHelper.ensureURIProtocolFormat("file://" + value.substring(value.indexOf('!') + 1))); //$NON-NLS-1$
+			line1 = XMLCatalogMessages.UI_LABEL_DETAILS_URI_LOCATION + "\t\t\t" + internalFile + " " + XMLCatalogMessages.UI_LABEL_DETAILS_IN_JAR_FILE + " " + jarFile; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		else {
+			value = URIUtils.convertURIToLocation(value);
+			line1 = XMLCatalogMessages.UI_LABEL_DETAILS_URI_LOCATION + "\t\t\t" + value; //$NON-NLS-1$
+
+		}
+		switch(entry.getEntryType()) {
+			case ICatalogEntry.ENTRY_TYPE_PUBLIC: line0 += XMLCatalogMessages.UI_LABEL_PUBLIC; break;
+			case ICatalogEntry.ENTRY_TYPE_SYSTEM: line0 += XMLCatalogMessages.UI_LABEL_SYSTEM; break;
+			case ICatalogEntry.ENTRY_TYPE_URI: line0 += XMLCatalogMessages.UI_LABEL_URI; break;
+		}
+		value = entry != null ? getKeyTypeValue(entry) : ""; //$NON-NLS-1$
+		String line3 = XMLCatalogMessages.UI_KEY_TYPE_DETAILS_COLON + "\t\t\t" + value; //$NON-NLS-1$
+		value = getDisplayValue(entry != null ? entry.getKey() : ""); //$NON-NLS-1$
+		String line4 = XMLCatalogMessages.UI_LABEL_DETAILS_KEY_COLON + "\t\t\t\t" + value; //$NON-NLS-1$
+		String entireString = line0 + "\n" + line1 + "\n" + line2 + "\n" + line3 + "\n" + line4; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		detailsText.setText(entireString);
+	}
+
+	protected void setNextCatalog(INextCatalog nextCatalog) {
+		String value = getDisplayValue(nextCatalog != null ? nextCatalog.getCatalogLocation() : ""); //$NON-NLS-1$
+		String line0 = XMLCatalogMessages.UI_LABEL_ENTRY_ELEMENT_COLON + "\t\t" + XMLCatalogMessages.UI_LABEL_NEXT_CATALOG; //$NON-NLS-1$
+		String line1 = XMLCatalogMessages.UI_LABEL_DETAILS_URI_LOCATION + "\t\t\t" + URIUtils.convertURIToLocation(value); //$NON-NLS-1$
+		String line2 = XMLCatalogMessages.UI_LABEL_DETAILS_URI_COLON + "\t\t\t\t" + value; //$NON-NLS-1$
+		String entireString = line0 + "\n" + line1 + "\n" + line2; //$NON-NLS-1$ //$NON-NLS-2$
+		detailsText.setText(entireString);
+	}
+	
+	protected void setSuffixEntry(ISuffixEntry element) {
+		String value = getDisplayValue(element != null ? element.getURI() : ""); //$NON-NLS-1$
+		String line0 = XMLCatalogMessages.UI_LABEL_ENTRY_ELEMENT_COLON + "\t\t" + XMLCatalogMessages.UI_LABEL_SUFFIX_ENTRY; //$NON-NLS-1$
+		String line1 = XMLCatalogMessages.UI_LABEL_DETAILS_SUFFIX_COLON + "\t\t\t\t" + element.getSuffix(); //$NON-NLS-1$
+		String line2 = XMLCatalogMessages.UI_LABEL_DETAILS_URI_LOCATION + "\t\t\t" + URIUtils.convertURIToLocation(value); //$NON-NLS-1$
+		String line3 = XMLCatalogMessages.UI_KEY_TYPE_DETAILS_COLON + "\t\t\t"; //$NON-NLS-1$
+		String uri = element.getURI();
+		boolean isSchema = false;
+		if(uri != null && uri.endsWith("xsd")) { //$NON-NLS-1$
+			isSchema = true;
+		}
+		switch (element.getEntryType()) {
+		case ISuffixEntry.SUFFIX_TYPE_SYSTEM:
+			line3 += isSchema? XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM : XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM;
+			break;
+		default:
+		case ISuffixEntry.SUFFIX_TYPE_URI:
+			line3 += isSchema? XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC : XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI;
+			break;
+		}
+		String entireString = line0 + "\n" + line1 +"\n" + line2 + "\n" + line3; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		detailsText.setText(entireString);
+	}
+
+	protected void setRewriteEntry(IRewriteEntry element) {
+		String line0 = XMLCatalogMessages.UI_LABEL_ENTRY_ELEMENT_COLON + "\t\t" + XMLCatalogMessages.UI_LABEL_REWRITE_ENTRY; //$NON-NLS-1$
+		String line1 = XMLCatalogMessages.UI_LABEL_START_STRING + "\t\t" + element.getStartString(); //$NON-NLS-1$
+		String line2 = XMLCatalogMessages.UI_LABEL_REWRITE_PREFIX + "\t" + element.getRewritePrefix(); //$NON-NLS-1$
+		String line3 = XMLCatalogMessages.UI_KEY_TYPE_DETAILS_COLON  + "\t\t\t" ; //$NON-NLS-1$
+		switch (element.getEntryType()) {
+		case IRewriteEntry.REWRITE_TYPE_SYSTEM:
+			line3 += XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM;
+			break;
+		default:
+		case IRewriteEntry.REWRITE_TYPE_URI:
+			line3 += XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI;
+			break;
+		}
+		String entireString = line0 + "\n" + line1 + "\n" + line2 + "\n" + line3; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		detailsText.setText(entireString);
+	}
+
+	protected void setDelegateCatalog(IDelegateCatalog element) {
+		String value = getDisplayValue(element != null ? element.getCatalogLocation() : ""); //$NON-NLS-1$
+		String line0 = XMLCatalogMessages.UI_LABEL_ENTRY_ELEMENT_COLON + "\t\t" + XMLCatalogMessages.UI_LABEL_DELEGATE_CATALOG; //$NON-NLS-1$
+		String line1 = XMLCatalogMessages.UI_LABEL_START_STRING + "\t\t" + element.getStartString(); //$NON-NLS-1$
+		String line2 = XMLCatalogMessages.UI_LABEL_DETAILS_URI_LOCATION + "\t\t\t" + URIUtils.convertURIToLocation(value); //$NON-NLS-1$
+		String line3 = XMLCatalogMessages.UI_KEY_TYPE_DETAILS_COLON + "\t\t\t"; //$NON-NLS-1$
+		switch (element.getEntryType()) {
+		case IDelegateCatalog.DELEGATE_TYPE_PUBLIC:
+			line3 += XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC;
+			break;
+		case IDelegateCatalog.DELEGATE_TYPE_SYSTEM:
+			line3 += XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM;
+			break;
+		default:
+		case IDelegateCatalog.DELEGATE_TYPE_URI:
+			line3 += XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI;
+			break;
+		}
+		String entireString = line0 + "\n" + line1 + "\n" + line2 + "\n" + line3; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		detailsText.setText(entireString);
+	}
+
+	public void setCatalogElement(ICatalogElement element) {
+		// I wish we had a visitor for this kind of mess
+		if (element instanceof ICatalogEntry) setCatalogEntry((ICatalogEntry)element);
+		else if (element instanceof INextCatalog) setNextCatalog((INextCatalog)element);
+		else if (element instanceof IDelegateCatalog) setDelegateCatalog((IDelegateCatalog)element);
+		else if (element instanceof IRewriteEntry) setRewriteEntry((IRewriteEntry)element);
+		else if (element instanceof ISuffixEntry) setSuffixEntry((ISuffixEntry)element);
+		else setCatalogEntry(null); // Gives null text
+	}
+
+
+	protected String getDisplayValue(String string) {
+		return string != null ? string : ""; //$NON-NLS-1$
+	}
+
+	protected String getKeyTypeValue(ICatalogEntry entry) {
+		String result = null;
+		if ((entry.getURI() != null) && entry.getURI().endsWith("xsd")) //$NON-NLS-1$
+		{
+			result = (entry.getEntryType() == ICatalogEntry.ENTRY_TYPE_URI) ? XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC : XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM;
+		}
+		else {
+			switch (entry.getEntryType()) {
+				case ICatalogEntry.ENTRY_TYPE_PUBLIC :
+					result = XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC;
+					break;
+				case ICatalogEntry.ENTRY_TYPE_SYSTEM :
+					result = XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM;
+					break;
+				default :
+					result = XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI;
+					break;
+			}
+
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogFileType.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogFileType.java
new file mode 100644
index 0000000..c3cbbe8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogFileType.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.swt.graphics.Image;
+
+
+public class XMLCatalogFileType {
+	public String description;
+    public String id;
+	public List extensions = new ArrayList();
+	public String iconFileName;
+	public Image icon;
+
+	public void addExtensions(String contributedExtensions) {
+		List list = parseExtensions(contributedExtensions);
+		for (Iterator i = list.iterator(); i.hasNext();) {
+			String extension = (String) i.next();
+			if (!extensions.contains(extension)) {
+				extensions.add(extension);
+			}
+		}
+	}
+
+	protected List parseExtensions(String string) {
+		List list = new ArrayList();
+		for (StringTokenizer st = new StringTokenizer(string, ", "); st.hasMoreTokens();) //$NON-NLS-1$
+		{
+			String token = st.nextToken();
+			if (token != null) {
+				list.add(token);
+			}
+		}
+		return list;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogMessages.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogMessages.java
new file mode 100644
index 0000000..fc526b6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogMessages.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Strings used by XML Editor
+ * 
+ * @plannedfor 1.0
+ */
+public class XMLCatalogMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.xml.ui.internal.catalog.XMLCatalogResources";//$NON-NLS-1$
+
+	public static String UI_WIZARD_SCHEMA_AND_NAME_SPACE_INFO;
+	public static String UI_LABEL_NAME_SPACE_PREFIX;
+	public static String UI_LABEL_NAME_SPACE_URI;
+	public static String UI_LABEL_XSD_LOCATION;
+	public static String UI_LABEL_DOCTYPE_INFORMATION;
+	public static String UI_LABEL_SYSTEM_ID;
+	public static String UI_LABEL_PUBLIC_ID;
+	public static String UI_LABEL_SELECT_FILE;
+	public static String UI_LABEL_KEY;
+	public static String UI_LABEL_KEY_COLON;
+	public static String UI_LABEL_SUFFIX;
+	public static String UI_LABEL_SUFFIX_COLON;
+	public static String UI_LABEL_DETAILS_KEY_COLON;
+	public static String UI_LABEL_DETAILS_IN_JAR_FILE;
+	public static String UI_LABEL_URI;
+	public static String UI_LABEL_LOCATION_COLON;
+	public static String UI_MATCH_KEY_TYPE_COLON;
+	public static String UI_LABEL_ARROW;
+	public static String UI_LABEL_CATALOG_URI_COLON;
+	public static String UI_LABEL_DETAILS_URI_COLON;
+	public static String UI_LABEL_DETAILS_URI_LOCATION;
+	public static String UI_KEY_TYPE_COLON;
+	public static String UI_ELEMENT_TYPE_COLON;
+	public static String UI_LABEL_START_STRING_COLON;
+	public static String UI_LABEL_REWRITE_PREFIX_COLON;
+	public static String UI_KEY_TYPE_DETAILS_COLON;
+	public static String UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC;
+	public static String UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM;
+	public static String UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC;
+	public static String UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM;
+	public static String UI_KEY_TYPE_DESCRIPTION_URI;
+	public static String UI_LABEL_SPECIFY_ALTERNATIVE_WEB_URL;
+	public static String UI_WARNING_URI_MUST_NOT_HAVE_DOTS;
+	public static String UI_LABEL_FILE_SELECTION;
+	public static String UI_LABEL_CHOOSE_FILE_TO_ADD_TO_CATALOG;
+
+
+	public static String UI_WARNING_URI_NOT_FOUND_COLON;
+	public static String UI_WARNING_URI_NOT_FOUND_LONG;
+	public static String UI_WARNING_INVALID_FILE;
+	public static String UI_WARNING_INVALID_FILE_LONG;
+	public static String UI_WARNING_NO_ELEMENT;
+	public static String UI_WARNING_NO_ELEMENT_DTD_LONG;
+	public static String UI_WARNING_NO_ELEMENT_XSD_LONG;
+	public static String UI_WARNING_SHOULD_BE_FULLY_QUALIFIED_URI;
+	public static String UI_WARNING_DUPLICATE_ENTRY;
+	public static String UI_WARNING_DUPLICATE_SUFFIX;
+	public static String UI_WARNING_DUPLICATE_REWRITE;
+	public static String UI_WARNING_DUPLICATE_DELEGATE;
+	
+	// NewModelWizard
+	public static String UI_INVALID_GRAMMAR_ERROR;
+	public static String UI_BUTTON_BROWSE;
+
+	// XMLCatalogIdMappingPage
+	public static String UI_LABEL_MAP_TO;
+	public static String UI_LABEL_MAP_FROM;
+	public static String UI_BUTTON_NEW;
+	public static String UI_BUTTON_EDIT;
+	public static String UI_BUTTON_DELETE;
+	public static String UI_BUTTON_REMOVE;
+	public static String UI_LABEL_NEW_DIALOG_TITLE;
+	public static String UI_LABEL_EDIT_DIALOG_TITLE;
+
+
+	// XMLCatalogPreferencePage
+	public static String UI_LABEL_USER_ENTRIES;
+	public static String UI_LABEL_USER_ENTRIES_TOOL_TIP;
+	public static String UI_LABEL_SYSTEM_ENTRIES;
+	public static String UI_LABEL_SYSTEM_ENTRIES_TOOL_TIP;
+	public static String UI_BUTTON_CHANGE;
+	public static String UI_LABEL_SELECT_PROJECT;
+	public static String UI_LABEL_SPECIFY_PROJECT_DESCRIPTION;
+	public static String UI_WARNING_NO_PROJECTS_CREATED;
+	public static String UI_WARNING_PROJECT_NOT_SPECIFIED;
+	public static String UI_WARNING_PROJECT_DOES_NOT_EXIST;
+	public static String UI_LABEL_PROJECT_TO_USE;
+	public static String UI_LABEL_CATALOG_SAVE_ERROR;
+	public static String UI_LABEL_CATALOG_COULD_NOT_BE_SAVED;
+	public static String UI_LABEL_ADVANCED;
+	public static String UI_LABEL_ADVANCED_XML_CATALOG_PREFS;
+	public static String UI_LABEL_SPECIFY_PERSISTENCE_FILE;
+	public static String UI_LABEL_SAVE_CATALOG_DIALOG_TITLE;
+	public static String UI_LABEL_SAVE_CATALOG_DIALOG_DESC;
+	public static String UI_LABEL_BROWSE_CATALOG_FILE_TITLE;
+	public static String UI_LABEL_BROWSE_CATALOG_FILE_DESC;
+	public static String UI_LABEL_DETAILS;
+	public static String UI_LABEL_USER_SPECIFIED_ENTRIES;
+	public static String UI_LABEL_PLUGIN_SPECIFIED_ENTRIES;
+	public static String UI_LABEL_PLATFORM_RESOURCE;
+	public static String UI_LABEL_FILE_SYSTEM_RESOURCE;
+	// AdvancedOptionsDialog
+	public static String UI_BUTTON_IMPORT;
+	public static String UI_BUTTON_EXPORT;
+
+	public static String UI_LABEL_IMPORT_DIALOG_TITLE;
+	public static String UI_LABEL_IMPORT_DIALOG_HEADING;
+	public static String UI_LABEL_IMPORT_DIALOG_MESSAGE;
+
+	public static String UI_LABEL_EXPORT_DIALOG_TITLE;
+	public static String UI_LABEL_EXPORT_DIALOG_HEADING;
+	public static String UI_LABEL_EXPORT_DIALOG_MESSAGE;
+	public static String ERROR_SAVING_FILE;
+	public static String UI_LABEL_FILE_IS_READ_ONLY;
+	public static String UI_LABEL_DIALOG_DESCRIPTION;
+
+	public static String UI_LABEL_NEXT_CATALOG;
+	public static String UI_LABEL_DELEGATE_CATALOG;
+	public static String UI_LABEL_REWRITE_ENTRY;
+	public static String UI_LABEL_SUFFIX_ENTRY;
+
+	public static String UI_LABEL_DELEGATE_CATALOG_URI_COLON;
+	public static String EditCatalogEntryDialog_catalogEntryLabel;
+	public static String EditCatalogEntryDialog_nextCatalogLabel;
+	public static String EditCatalogEntryDialog_rewriteEntryLabel;
+	public static String EditCatalogEntryDialog_suffixEntryLabel;
+	public static String EditCatalogEntryDialog_delegateCatalogLabel;
+	public static String UI_BUTTON_MENU_BROWSE_WORKSPACE;
+	public static String UI_BUTTON_MENU_BROWSE_FILE_SYSTEM;
+	public static String UI_LABEL_SELECT_FILE_FILTER_CONTROL;
+	public static String UI_TEXT_SELECT_FILE_FILTER_CONTROL;
+	
+	public static String UI_LABEL_PUBLIC;
+	public static String UI_LABEL_SYSTEM;
+
+	public static String UI_LABEL_START_STRING;
+	public static String UI_LABEL_REWRITE_PREFIX;
+	public static String UI_LABEL_ENTRY_ELEMENT_COLON;
+
+	public static String UI_LABEL_DETAILS_SUFFIX_COLON;
+	
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, XMLCatalogMessages.class);
+	}
+
+	private XMLCatalogMessages() {
+		// cannot create new instance
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogPreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogPreferencePage.java
new file mode 100644
index 0000000..e84a82a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogPreferencePage.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     David Carver/STAR Standard - d_a_carver@yahoo.com - bug 192568
+ *            Removed Advanced button - Functionality is now in the
+ *            Import/Export XML Catalog Wizards. 
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.CatalogSet;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEvent;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogListener;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+
+public class XMLCatalogPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ICatalogListener {
+
+	protected XMLCatalogEntriesView catalogEntriesView;
+
+	protected ICatalog workingUserCatalog;
+
+	protected ICatalog systemCatalog;
+
+	protected ICatalog userCatalog;
+
+	protected ICatalog defaultCatalog;
+
+	protected Button advancedButton;
+
+	public XMLCatalogPreferencePage() {
+		defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs();
+		for (int i = 0; i < nextCatalogs.length; i++) {
+			INextCatalog catalog = nextCatalogs[i];
+			ICatalog referencedCatalog = catalog.getReferencedCatalog();
+			if (referencedCatalog != null) {
+				if (XMLCorePlugin.SYSTEM_CATALOG_ID.equals(referencedCatalog.getId())) {
+					systemCatalog = referencedCatalog;
+				}
+				else if (XMLCorePlugin.USER_CATALOG_ID.equals(referencedCatalog.getId())) {
+					userCatalog = referencedCatalog;
+				}
+			}
+		}
+	}
+
+	public void dispose() {
+		super.dispose();
+		workingUserCatalog.removeListener(this);
+	}
+
+	/**
+	 * Refresh the view in responce to an event sent by the Catalog
+	 */
+	public void catalogChanged(ICatalogEvent event) {
+		catalogEntriesView.updatePage();
+	}
+
+	/**
+	 * Creates preference page controls on demand.
+	 * 
+	 * @param parent
+	 *            the parent for the preference page
+	 */
+	protected Control createContents(Composite parent) {
+		// we create a working copy of the 'User Settings' for the Catalog
+		// that we can modify
+		CatalogSet tempCatalogSet = new CatalogSet();
+		workingUserCatalog = tempCatalogSet.lookupOrCreateCatalog("working", ""); //$NON-NLS-1$ //$NON-NLS-2$
+
+		// TODO: add entries from the nested catalogs as well
+		workingUserCatalog.addEntriesFromCatalog(userCatalog);
+		workingUserCatalog.addListener(this);
+		noDefaultAndApplyButton();
+		Composite composite = new Composite(parent, SWT.NULL);
+		// WorkbenchHelp.setHelp(composite, new
+		// ControlContextComputer(composite,
+		// XMLBuilderContextIds.XMLP_CATALOG_PAGE));
+		composite.setLayout(new GridLayout());
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+		createCatalogEntriesView(composite);
+		createCatalogDetailsView(composite);
+		//createAdvancedButton(composite);
+		// catalogEntriesView.updatePage();
+		applyDialogFont(composite);
+
+		return composite;
+	}
+
+	/**
+	 * @deprecated
+	 * @param composite
+	 */
+	protected void createAdvancedButton(Composite composite) {
+		Composite panel = new Composite(composite, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 3;
+		panel.setLayout(gridLayout);
+		panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		// TODO... is there a better way to expand the page width?
+		// This invisible label is created to force the width of the page to
+		// be
+		// wide enough to show
+		// the rather long uri and key fields of a catalog entry.
+		Label widthFudger = new Label(panel, SWT.NONE);
+		String widthFudgerString = ""; //$NON-NLS-1$
+		for (int i = 0; i < 55; i++) {
+			widthFudgerString += "x"; //$NON-NLS-1$
+		}
+		widthFudger.setText(widthFudgerString);
+		widthFudger.setVisible(false);
+		Composite placeHolder = new Composite(panel, SWT.NONE);
+		placeHolder.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		advancedButton = new Button(panel, SWT.NONE);
+		advancedButton.setText(XMLCatalogMessages.UI_LABEL_ADVANCED);
+		SelectionListener selectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				AdvancedOptionsDialog dialog = new AdvancedOptionsDialog(getShell(), workingUserCatalog);
+				dialog.create();
+				dialog.getShell().setText(XMLCatalogMessages.UI_LABEL_ADVANCED_XML_CATALOG_PREFS);
+				dialog.setBlockOnOpen(true);
+				dialog.open();
+			}
+		};
+		advancedButton.addSelectionListener(selectionListener);
+	}
+
+	public boolean isSameFileName(String a, String b) {
+		boolean result = false;
+		if ((a == null) && (b == null)) {
+			result = true;
+		}
+		else if ((a != null) && (b != null)) {
+			result = a.equals(b);
+		}
+		return result;
+	}
+
+	protected void createCatalogEntriesView(Composite parent) {
+		Group group = new Group(parent, SWT.NONE);
+		group.setLayout(new GridLayout());
+		group.setLayoutData(new GridData(GridData.FILL_BOTH));
+		group.setText(XMLCatalogMessages.UI_LABEL_USER_ENTRIES);
+		group.setToolTipText(XMLCatalogMessages.UI_LABEL_USER_ENTRIES_TOOL_TIP);
+		// WorkbenchHelp.setHelp(userEntriesGroup, new
+		// ControlContextComputer(userEntriesGroup,
+		// XMLBuilderContextIds.XMLP_CATALOG_USER_GROUP));
+		catalogEntriesView = new XMLCatalogEntriesView(group, workingUserCatalog, systemCatalog);
+		catalogEntriesView.setLayoutData(new GridData(GridData.FILL_BOTH));
+	}
+
+	protected void createCatalogDetailsView(Composite parent) {
+		Group detailsGroup = new Group(parent, SWT.NONE);
+		detailsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		detailsGroup.setLayout(new GridLayout());
+		detailsGroup.setText(XMLCatalogMessages.UI_LABEL_DETAILS);
+		final XMLCatalogEntryDetailsView detailsView = new XMLCatalogEntryDetailsView(detailsGroup);
+		ISelectionChangedListener listener = new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				ISelection selection = event.getSelection();
+				Object selectedObject = (selection instanceof IStructuredSelection) && ((IStructuredSelection) selection).size() == 1 ? ((IStructuredSelection) selection).getFirstElement() : null;
+				if (selectedObject instanceof ICatalogElement) {
+					detailsView.setCatalogElement((ICatalogElement)selectedObject);
+				} else {
+					detailsView.setCatalogElement(null);
+				}
+			}
+		};
+		catalogEntriesView.getViewer().addSelectionChangedListener(listener);
+	}
+
+	/**
+	 * Do anything necessary because the OK button has been pressed.
+	 * 
+	 * @return whether it is okay to close the preference page
+	 */
+	public boolean performOk() {
+		return storeValues();
+	}
+
+	/**
+	 * @see IWorkbenchPreferencePage
+	 */
+	public void init(IWorkbench workbench) {
+	}
+
+	/**
+	 * Stores the values of the controls back to the preference store.
+	 */
+	private boolean storeValues() {
+		// dw Object fileObject = null;
+		try {
+			// update the userCatalog so that its the same as the working
+			// catalog
+			userCatalog.clear();
+			// TODO add entries from the nested catalogs?
+			userCatalog.addEntriesFromCatalog(workingUserCatalog);
+			// now save the userCatalog
+			userCatalog.save();
+		}
+		catch (Exception e) {
+		}
+		return true;
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogResources.properties b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogResources.properties
new file mode 100644
index 0000000..9af908a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogResources.properties
@@ -0,0 +1,141 @@
+###############################################################################
+# Copyright (c) 2004, 2010 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     David Carver/STAR Standard, d_a_carver@yahoo.com, bug 192568
+#        - Fixed grammar in XML Catalog Import dialog.
+###############################################################################
+UI_WIZARD_SCHEMA_AND_NAME_SPACE_INFO = Schema and Namespace Information
+UI_LABEL_NAME_SPACE_PREFIX           = Namespace prefix:
+UI_LABEL_NAME_SPACE_URI              = Namespace URI:
+UI_LABEL_XSD_LOCATION                = Schema location:
+UI_LABEL_DOCTYPE_INFORMATION         = Document type information
+UI_LABEL_SYSTEM_ID                   = &System ID:
+UI_LABEL_PUBLIC_ID                   = &Public ID:
+UI_LABEL_SELECT_FILE                 = Select File
+UI_LABEL_KEY                         = Key
+UI_LABEL_KEY_COLON                   = &Key:
+UI_LABEL_SUFFIX                      = Suffix
+UI_LABEL_SUFFIX_COLON                = S&uffix:
+UI_LABEL_DETAILS_KEY_COLON           = Key:
+UI_LABEL_DETAILS_IN_JAR_FILE		 = in jar file
+UI_LABEL_URI                         = URI
+UI_LABEL_START_STRING_COLON          = &Matching start string:
+UI_LABEL_REWRITE_PREFIX_COLON        = Rewrite prefi&x:   
+UI_LABEL_ARROW				         = ->
+UI_LABEL_LOCATION_COLON              = &Location:  
+UI_LABEL_DELEGATE_CATALOG_URI_COLON	 = D&elegate to this XML Catalog file:
+UI_LABEL_CATALOG_URI_COLON		      = &Location of another XML Catalog file:
+UI_LABEL_DETAILS_URI_COLON           = URI:   
+UI_KEY_TYPE_COLON                    = Key &type:
+UI_KEY_TYPE_DETAILS_COLON            = Key type:
+UI_MATCH_KEY_TYPE_COLON              = &Key type to match:
+UI_LABEL_DETAILS_URI_LOCATION        = Location:
+UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC   = Namespace name
+UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM   = Schema location
+UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC   = Public ID
+UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM   = System ID
+UI_KEY_TYPE_DESCRIPTION_URI   		 = URI
+UI_LABEL_SPECIFY_ALTERNATIVE_WEB_URL = &Alternative web address:
+UI_WARNING_URI_MUST_NOT_HAVE_DOTS    = URI must not include '.' or '..'
+UI_LABEL_PLATFORM_RESOURCE 		 	 = Workspace
+UI_LABEL_FILE_SYSTEM_RESOURCE		 = File system
+UI_ELEMENT_TYPE_COLON                = Catalog element type:
+UI_LABEL_NEXT_CATALOG				 = Next catalog
+UI_LABEL_DELEGATE_CATALOG			 = Delegate catalog
+UI_LABEL_REWRITE_ENTRY				 = Rewrite
+UI_LABEL_SUFFIX_ENTRY				 = Suffix
+UI_LABEL_ENTRY_ELEMENT_COLON		 = Entry element:
+UI_LABEL_PUBLIC						 = Public
+UI_LABEL_SYSTEM						 = System
+
+UI_WARNING_URI_NOT_FOUND_COLON       = The specified resource can't be located :
+UI_WARNING_SHOULD_BE_FULLY_QUALIFIED_URI = Warning: the key value should be a fully qualified URI
+UI_WARNING_URI_NOT_FOUND_LONG        = The specified file cannot be found. It may have been moved to a different location. If the file is located remotely, a network connection cannot be established to the remote location. 
+UI_WARNING_INVALID_FILE              = The specified file is invalid.
+UI_WARNING_INVALID_FILE_LONG         = The specified file is invalid. A proper XML file cannot be generated from it. Open the DTD or XML schema file, edit it as necessary, validate it and try again.
+UI_WARNING_NO_ELEMENT                = The specified file must contain at least one element declaration.
+UI_WARNING_NO_ELEMENT_DTD_LONG       = The specified file must contain at least one element declaration that can be used as the root element in the generated XML file.
+UI_WARNING_NO_ELEMENT_XSD_LONG       = The specified file must contain at least one global element declaration that can be used as the root element in the generated XML file.
+UI_WARNING_DUPLICATE_ENTRY			 = The specified entry is invalid. An existing entry has the same key and key type.
+UI_WARNING_DUPLICATE_SUFFIX			 = The specified suffix is invalid. An existing entry has the same key type and suffix.
+UI_WARNING_DUPLICATE_REWRITE		 = The specified rewrite start string is invalid. An existing entry has the same start string.
+UI_WARNING_DUPLICATE_DELEGATE		 = The specified delegate start string is invalid. An existing entry has the same prefix.
+
+
+!NewModelWizard
+UI_INVALID_GRAMMAR_ERROR             = Invalid Grammar
+UI_BUTTON_BROWSE                     = &Browse...
+
+!XMLCatalogIdMappingPage
+UI_LABEL_MAP_TO                      = Map to:
+UI_LABEL_MAP_FROM                    = Map from:
+UI_BUTTON_NEW                        = &Add...
+UI_BUTTON_EDIT                       = &Edit...
+UI_BUTTON_DELETE                     = &Delete
+UI_BUTTON_REMOVE                     = &Remove
+UI_LABEL_NEW_DIALOG_TITLE            = Add XML Catalog Element
+UI_LABEL_EDIT_DIALOG_TITLE           = Edit XML Catalog Element
+
+
+!XMLCatalogPreferencePage
+UI_LABEL_USER_ENTRIES                = XML Catalog Entries
+UI_LABEL_USER_ENTRIES_TOOL_TIP       = XML Catalog entries that have been specified by the user
+UI_LABEL_SYSTEM_ENTRIES              = Plug-in specified entries
+UI_LABEL_SYSTEM_ENTRIES_TOOL_TIP     = XML Catalog entries that have been specified by a plug-in
+UI_BUTTON_CHANGE                     = Change...
+UI_LABEL_SELECT_PROJECT              = Select Project
+UI_LABEL_SPECIFY_PROJECT_DESCRIPTION = Specify the project to persist the XML Catalog information
+UI_WARNING_NO_PROJECTS_CREATED       = No projects have been created yet.
+UI_WARNING_PROJECT_NOT_SPECIFIED     = A project name has not been specified.
+UI_WARNING_PROJECT_DOES_NOT_EXIST    = The specified project does not exist.
+UI_LABEL_PROJECT_TO_USE              = Project to use to persist XML Catalog User Entries: 
+UI_LABEL_CATALOG_SAVE_ERROR          = XML Catalog Save Error
+UI_LABEL_CATALOG_COULD_NOT_BE_SAVED  = The XML Catalog entry could not be saved.
+UI_LABEL_ADVANCED                    = &Advanced...
+UI_LABEL_ADVANCED_XML_CATALOG_PREFS  = Advanced XML Catalog Preferences   
+UI_LABEL_SPECIFY_PERSISTENCE_FILE    = &Specify a file to use to persist the XML Catalog information.
+UI_LABEL_SAVE_CATALOG_DIALOG_TITLE   = Save Changes
+UI_LABEL_SAVE_CATALOG_DIALOG_DESC    = You have made unsaved changes to the current XML Catalog settings. Do you wish to save your changes before loading the new XML Catalog settings?   
+UI_LABEL_BROWSE_CATALOG_FILE_TITLE   = Select Folder
+UI_LABEL_BROWSE_CATALOG_FILE_DESC    = Select the folder that contains the '.xmlcatalog' file.   
+UI_LABEL_DETAILS                     = Details
+UI_LABEL_USER_SPECIFIED_ENTRIES      = User Specified Entries
+UI_LABEL_PLUGIN_SPECIFIED_ENTRIES    = Plugin Specified Entries
+UI_LABEL_FILE_SELECTION				 = File Selection
+UI_LABEL_CHOOSE_FILE_TO_ADD_TO_CATALOG				 = Choose a file to add to the XML Catalog
+ 
+!AdvancedOptionsDialog
+UI_LABEL_DIALOG_DESCRIPTION          = Use the buttons below to import or export XML Catalog settings.
+UI_BUTTON_IMPORT                     = Import...
+UI_BUTTON_EXPORT                     = Export...
+                                   
+UI_LABEL_IMPORT_DIALOG_TITLE         = Import XML Catalog Settings
+UI_LABEL_IMPORT_DIALOG_HEADING       = Specify XML Catalog File
+UI_LABEL_IMPORT_DIALOG_MESSAGE       = Specify the file that will be used to load the XML Catalog Settings
+
+UI_LABEL_EXPORT_DIALOG_TITLE         = Export XML Catalog Settings
+UI_LABEL_EXPORT_DIALOG_HEADING       = Specify XML Catalog File
+UI_LABEL_EXPORT_DIALOG_MESSAGE       = Specify the file that will used to save the XML Catalog Setting
+ERROR_SAVING_FILE					 = Error saving file %1
+UI_LABEL_FILE_IS_READ_ONLY           = File %1 is read only
+
+UI_LABEL_START_STRING = Start string:
+UI_LABEL_REWRITE_PREFIX = Rewrite prefix:
+
+UI_LABEL_DETAILS_SUFFIX_COLON = Suffix:
+
+EditCatalogEntryDialog_catalogEntryLabel=&Catalog Entry
+EditCatalogEntryDialog_nextCatalogLabel=&Next Catalog
+EditCatalogEntryDialog_rewriteEntryLabel=&Rewrite Entry
+EditCatalogEntryDialog_suffixEntryLabel=&Suffix Entry
+EditCatalogEntryDialog_delegateCatalogLabel=&Delegate Catalog
+UI_BUTTON_MENU_BROWSE_WORKSPACE=&Workspace...
+UI_BUTTON_MENU_BROWSE_FILE_SYSTEM=&File System...
+UI_LABEL_SELECT_FILE_FILTER_CONTROL=Files of type:
+UI_TEXT_SELECT_FILE_FILTER_CONTROL=All Supported Files
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogTreeViewer.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogTreeViewer.java
new file mode 100644
index 0000000..e09b35c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLCatalogTreeViewer.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import com.ibm.icu.text.Collator;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
+
+
+public class XMLCatalogTreeViewer extends TreeViewer {
+	protected static Image xmlCatalogImage = ImageFactory.INSTANCE.getImage("icons/obj16/xmlcatalog_obj.gif"); //$NON-NLS-1$
+	protected static Image errorImage = ImageFactory.INSTANCE.getImage("icons/ovr16/error-overlay.gif"); //$NON-NLS-1$
+	protected static Image entryImage = ImageFactory.INSTANCE.getImage("icons/obj16/entry_obj.png"); //$NON-NLS-1$
+	protected static Image nextCatalogImage = ImageFactory.INSTANCE.getImage("icons/obj16/nextCatalog_obj.gif"); //$NON-NLS-1$
+	protected static Image rewriteEntryImage = ImageFactory.INSTANCE.getImage("icons/obj16/rewrite_entry.gif"); //$NON-NLS-1$
+	protected static Image suffixEntryImage = ImageFactory.INSTANCE.getImage("icons/obj16/suffix_entry.gif"); //$NON-NLS-1$
+	protected static Image delegateCatalogImage = ImageFactory.INSTANCE.getImage("icons/obj16/delegate_catalog.gif"); //$NON-NLS-1$
+
+	protected static String ERROR_STATE_KEY = "errorstatekey"; //$NON-NLS-1$
+
+	protected ICatalog fWorkingUserCatalog;
+	protected ICatalog fSystemCatalog;
+
+	public static String USER_SPECIFIED_ENTRIES_OBJECT = XMLCatalogMessages.UI_LABEL_USER_SPECIFIED_ENTRIES;
+	public static String PLUGIN_SPECIFIED_ENTRIES_OBJECT = XMLCatalogMessages.UI_LABEL_PLUGIN_SPECIFIED_ENTRIES;
+
+	public XMLCatalogTreeViewer(Composite parent, ICatalog workingUserCatalog, ICatalog systemCatalog) {
+		super(parent, SWT.MULTI | SWT.BORDER);
+		this.fWorkingUserCatalog = workingUserCatalog;
+		this.fSystemCatalog = systemCatalog;
+
+		setContentProvider(new CatalogEntryContentProvider());
+		setLabelProvider(new CatalogEntryLabelProvider());
+	}
+
+	public void setFilterExtensions(String[] extensions) {
+		resetFilters();
+		addFilter(new XMLCatalogTableViewerFilter(extensions));
+	}
+
+	public class CatalogEntryLabelProvider extends LabelProvider {
+		protected HashMap imageTable = new HashMap();
+
+		public String getText(Object object) {
+			String result = null;
+			if (object instanceof ICatalogEntry) {
+				ICatalogEntry catalogEntry = (ICatalogEntry) object;
+				result = catalogEntry.getKey();
+			}
+			else if (object instanceof ISuffixEntry) {
+				ISuffixEntry entry = (ISuffixEntry) object;
+				result = "[...]" + entry.getSuffix() + " " + XMLCatalogMessages.UI_LABEL_ARROW + " " + entry.getURI();
+			}
+			else if (object instanceof IRewriteEntry) {
+				IRewriteEntry entry = (IRewriteEntry) object;
+				result = entry.getStartString() + "[...] " + XMLCatalogMessages.UI_LABEL_ARROW + " " + entry.getRewritePrefix() + "[...]";
+			}
+			else if (object instanceof INextCatalog) {
+				INextCatalog nextCatalog = (INextCatalog) object;
+				// result = nextCatalog.getCatalogLocation();
+				result = URIUtils.convertURIToLocation(nextCatalog.getCatalogLocation());
+				if (nextCatalog.getCatalogLocation().startsWith("file:")) {
+					result += " (" + XMLCatalogMessages.UI_LABEL_FILE_SYSTEM_RESOURCE + ")";
+				}
+				else if (nextCatalog.getCatalogLocation().startsWith("platform:")) {
+					result += " (" + XMLCatalogMessages.UI_LABEL_PLATFORM_RESOURCE + ")";
+				}
+			}
+			else if (object instanceof IDelegateCatalog) {
+				IDelegateCatalog nextCatalog = (IDelegateCatalog) object;
+				// result = nextCatalog.getCatalogLocation();
+				result = nextCatalog.getStartString() + " " + XMLCatalogMessages.UI_LABEL_ARROW + " " + URIUtils.convertURIToLocation(nextCatalog.getCatalogLocation());
+				if (nextCatalog.getCatalogLocation().startsWith("file:")) {
+					result += " (" + XMLCatalogMessages.UI_LABEL_FILE_SYSTEM_RESOURCE + ")";
+				}
+				else if (nextCatalog.getCatalogLocation().startsWith("platform:")) {
+					result += " (" + XMLCatalogMessages.UI_LABEL_PLATFORM_RESOURCE + ")";
+				}
+			}
+			return result != null ? result : object.toString();
+		}
+
+		public Image getImage(Object object) {
+			Image result = null;
+			if (object instanceof String) {
+				result = xmlCatalogImage;
+			}
+			else if (object instanceof ICatalogEntry) {
+				ICatalogEntry catalogEntry = (ICatalogEntry) object;
+				String uri = catalogEntry.getURI();
+				result = getResourceImage(uri);
+			}
+			else if (object instanceof INextCatalog) {
+				// TODO: add image to the imageTable and add error overlay if
+				// next catalog URI is not readable
+				result = nextCatalogImage;
+			}
+			else if (object instanceof IDelegateCatalog) {
+				// TODO: add image to the imageTable and add error overlay if
+				// next catalog URI is not readable
+				result = delegateCatalogImage;
+			}
+			else if (object instanceof ISuffixEntry) {
+				// TODO: add image to the imageTable and add error overlay if
+				// next catalog URI is not readable
+				result = suffixEntryImage;
+			}
+			else if (object instanceof IRewriteEntry) {
+				// TODO: add image to the imageTable and add error overlay if
+				// next catalog URI is not readable
+				result = rewriteEntryImage;
+			}
+			return result;
+		}
+
+		private Image getResourceImage(String uri) {
+			Image result = null;
+			Image base = null;
+
+			IEditorRegistry er = PlatformUI.getWorkbench().getEditorRegistry();
+			ImageDescriptor imageDescriptor = er.getImageDescriptor(uri);
+			Image image = (Image) imageTable.get(imageDescriptor);
+			if (image == null) {
+				image = imageDescriptor.createImage();
+				imageTable.put(imageDescriptor, image);
+			}
+			base = image;
+
+			if (base != null) {
+				// TODO: This should be moved into the catalog
+				if (URIHelper.isReadableURI(uri, false)) {
+					result = base;
+				}
+				else {
+					result = ImageFactory.INSTANCE.createCompositeImage(base, errorImage, ImageFactory.BOTTOM_LEFT);
+				}
+			}
+			return result;
+		}
+
+		public void dispose() {
+			super.dispose();
+			for (Iterator it = imageTable.values().iterator(); it.hasNext();) {
+				((Image) it.next()).dispose();
+			}
+		}
+	}
+
+
+	public class CatalogEntryContentProvider implements ITreeContentProvider {
+		protected Object[] roots;
+
+		public CatalogEntryContentProvider() {
+			roots = new Object[2];
+			roots[0] = USER_SPECIFIED_ENTRIES_OBJECT;
+			roots[1] = PLUGIN_SPECIFIED_ENTRIES_OBJECT;
+		}
+
+		public boolean isRoot(Object object) {
+			return (object instanceof String) || (object instanceof INextCatalog);
+		}
+
+		public Object[] getElements(Object element) {
+			return roots;
+		}
+
+		public Object[] getChildren(Object parentElement) {
+			Object[] result = new Object[0];
+			if (parentElement == roots[0]) {
+				result = getChildrenHelper(fWorkingUserCatalog);
+			}
+			else if (parentElement == roots[1]) {
+				result = getChildrenHelper(fSystemCatalog);
+			}
+			else if (parentElement instanceof INextCatalog) {
+				ICatalog nextCatalog = ((INextCatalog) parentElement).getReferencedCatalog();
+				result = getChildrenHelper(nextCatalog);
+			}
+			else if (parentElement instanceof IDelegateCatalog) {
+				ICatalog nextCatalog = ((IDelegateCatalog) parentElement).getReferencedCatalog();
+				result = getChildrenHelper(nextCatalog);
+			}
+			return result;
+		}
+
+		protected Object[] getChildrenHelper(ICatalog catalog) {
+
+			ICatalogEntry[] entries = catalog.getCatalogEntries();
+			if (entries.length > 0) {
+				Comparator comparator = new Comparator() {
+					public int compare(Object o1, Object o2) {
+						int result = 0;
+						if ((o1 instanceof ICatalogEntry) && (o2 instanceof ICatalogEntry)) {
+							ICatalogEntry entry1 = (ICatalogEntry) o1;
+							ICatalogEntry entry2 = (ICatalogEntry) o2;
+							result = Collator.getInstance().compare(entry1.getKey(), entry2.getKey());
+						}
+						return result;
+					}
+				};
+				Arrays.sort(entries, comparator);
+			}
+			Vector result = new Vector();
+			result.addAll(Arrays.asList(entries));
+			result.addAll(Arrays.asList(catalog.getRewriteEntries()));
+			result.addAll(Arrays.asList(catalog.getSuffixEntries()));
+			result.addAll(Arrays.asList(catalog.getDelegateCatalogs()));
+			INextCatalog[] nextCatalogs = catalog.getNextCatalogs();
+			List nextCatalogsList = Arrays.asList(nextCatalogs);
+			result.addAll(nextCatalogsList);
+
+			return result.toArray(new ICatalogElement[result.size()]);
+		}
+
+		public Object getParent(Object element) {
+			return (element instanceof String) ? null : USER_SPECIFIED_ENTRIES_OBJECT;
+		}
+
+		public boolean hasChildren(Object element) {
+			return isRoot(element) ? getChildren(element).length > 0 : false;
+		}
+
+		public void dispose() {
+			// nothing to dispose
+		}
+
+		public void inputChanged(Viewer viewer, Object old, Object newobj) {
+			// ISSUE: seems we should do something here
+		}
+
+		public boolean isDeleted(Object object) {
+			return false;
+		}
+	}
+
+
+	class XMLCatalogTableViewerFilter extends ViewerFilter {
+		protected String[] extensions;
+
+		public XMLCatalogTableViewerFilter(String[] extensions1) {
+			this.extensions = extensions1;
+		}
+
+		public boolean isFilterProperty(Object element, Object property) {
+			return false;
+		}
+
+		public boolean select(Viewer viewer, Object parent, Object element) {
+			boolean result = false;
+			if (element instanceof ICatalogEntry) {
+				ICatalogEntry catalogEntry = (ICatalogEntry) element;
+				for (int i = 0; i < extensions.length; i++) {
+					if (catalogEntry.getURI().endsWith(extensions[i])) {
+						result = true;
+						break;
+					}
+				}
+			}
+			else if (element.equals(XMLCatalogTreeViewer.PLUGIN_SPECIFIED_ENTRIES_OBJECT) || element.equals(XMLCatalogTreeViewer.USER_SPECIFIED_ENTRIES_OBJECT)) {
+				return true;
+			}
+			return result;
+		}
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLQuickScan.java b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLQuickScan.java
new file mode 100644
index 0000000..723539d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/XMLQuickScan.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.catalog;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * 
+ */
+public class XMLQuickScan {
+	public static String getTargetNamespaceURIForSchema(String uri) {
+		String result = null;
+		try {
+			URL url = new URL(uri);
+			InputStream inputStream = url.openStream();
+			result = XMLQuickScan.getTargetNamespaceURIForSchema(inputStream);
+		}
+		catch (Exception e) {
+		}
+		return result;
+	}
+
+	public static String getTargetNamespaceURIForSchema(InputStream input) {
+		TargetNamespaceURIContentHandler handler = new TargetNamespaceURIContentHandler();
+		ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();
+		try {
+			Thread.currentThread().setContextClassLoader(XMLQuickScan.class.getClassLoader());
+			SAXParserFactory factory = SAXParserFactory.newInstance();
+			factory.setNamespaceAware(true);
+			SAXParser parser = factory.newSAXParser();
+			parser.parse(new InputSource(input), handler);
+		}
+		catch (StopParseException e) {
+			// this is a normal exception to stop parsing early,
+			// when info is found, so we can safely ignore
+		}
+		catch (ParserConfigurationException e) {
+			Logger.logException(e);
+		}
+		catch (SAXException e) {
+			Logger.logException(e);
+		}
+		catch (IOException e) {
+			Logger.logException(e);
+		}
+		finally {
+			Thread.currentThread().setContextClassLoader(prevClassLoader);
+		}
+		return handler.targetNamespaceURI;
+	}
+
+	/**
+	 * This is a special exception that is used to stop parsing when required
+	 * information is found.
+	 */
+	static class StopParseException extends org.xml.sax.SAXException {
+		static final long serialVersionUID = 1L;
+
+		/**
+		 * Constructor StopParseException.
+		 */
+		StopParseException() {
+			super("targetnamespace found, no need to continue the parse");
+		}
+	}
+
+	static class TargetNamespaceURIContentHandler extends DefaultHandler {
+		public String targetNamespaceURI;
+
+		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+			if (localName.equals("schema")) //$NON-NLS-1$
+			{
+				int nAttributes = attributes.getLength();
+				for (int i = 0; i < nAttributes; i++) {
+					if (attributes.getLocalName(i).equals("targetNamespace")) //$NON-NLS-1$
+					{
+						targetNamespaceURI = attributes.getValue(i);
+						break;
+					}
+				}
+			}
+			throw new StopParseException();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/catalogEntry.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/catalogEntry.gif
new file mode 100644
index 0000000..d65b280
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/catalogEntry.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/delegateCatalog.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/delegateCatalog.gif
new file mode 100644
index 0000000..c0d85ee
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/delegateCatalog.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/nextCatalog.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/nextCatalog.gif
new file mode 100644
index 0000000..3a934b9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/nextCatalog.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/prefix.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/prefix.gif
new file mode 100644
index 0000000..6b87692
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/prefix.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/rewrite.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/rewrite.gif
new file mode 100644
index 0000000..f003064
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/rewrite.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/sufix.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/sufix.gif
new file mode 100644
index 0000000..2bd5b41
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/etool50/sufix.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/catalog_entry.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/catalog_entry.gif
new file mode 100644
index 0000000..a27e30a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/catalog_entry.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/delegate_catalog.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/delegate_catalog.gif
new file mode 100644
index 0000000..11bd2d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/delegate_catalog.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/entry_obj.png b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/entry_obj.png
new file mode 100644
index 0000000..be71474
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/entry_obj.png
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/file_expand.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/file_expand.gif
new file mode 100644
index 0000000..85f9baa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/file_expand.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/file_obj.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/file_obj.gif
new file mode 100644
index 0000000..061161a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/file_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/nextCatalog_obj.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/nextCatalog_obj.gif
new file mode 100644
index 0000000..d4bfe79
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/nextCatalog_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/next_catalog.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/next_catalog.gif
new file mode 100644
index 0000000..976cbc9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/next_catalog.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/rewrite_entry.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/rewrite_entry.gif
new file mode 100644
index 0000000..9cc8ee9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/rewrite_entry.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/suffix_entry.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/suffix_entry.gif
new file mode 100644
index 0000000..dc76407
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/suffix_entry.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/xmlcatalog_obj.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/xmlcatalog_obj.gif
new file mode 100644
index 0000000..a61441f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/obj16/xmlcatalog_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/ovr16/error-overlay.gif b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/ovr16/error-overlay.gif
new file mode 100644
index 0000000..119dccc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/icons/ovr16/error-overlay.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/DOMPropertyDescriptorFactory.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/DOMPropertyDescriptorFactory.java
new file mode 100644
index 0000000..5bebb72
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/DOMPropertyDescriptorFactory.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.ui.internal.properties.EnumeratedStringPropertyDescriptor;
+import org.w3c.dom.Attr;
+import org.w3c.dom.CDATASection;
+import org.w3c.dom.Comment;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
+
+
+public class DOMPropertyDescriptorFactory {
+
+	protected static final String HACK = "hack"; //$NON-NLS-1$
+
+	public DOMPropertyDescriptorFactory() {
+	}
+
+	public IPropertyDescriptor createAttributePropertyDescriptor(Attr attr) {
+		IPropertyDescriptor result = null;
+
+		String attributeName = attr.getName();
+
+		ModelQuery mq = ModelQueryUtil.getModelQuery(attr.getOwnerDocument());
+
+		if (mq != null) {
+			CMAttributeDeclaration ad = mq.getCMAttributeDeclaration(attr);
+			if (ad != null) {
+				String[] valuesArray = mq.getPossibleDataTypeValues(attr.getOwnerElement(), ad);
+				if ((valuesArray != null) && (valuesArray.length > 0)) {
+					result = new EnumeratedStringPropertyDescriptor(attributeName, attributeName, valuesArray);
+				}
+			}
+		}
+
+		if (result == null) {
+			result = createDefaultPropertyDescriptor(attributeName);
+		}
+		return result;
+	}
+
+	public IPropertyDescriptor createCDATASectionPropertyDescriptor(CDATASection cdataSection) {
+		return createDefaultPropertyDescriptor(HACK);
+	}
+
+	public IPropertyDescriptor createCommentPropertyDescriptor(Comment comment) {
+		return createDefaultPropertyDescriptor(HACK);
+	}
+
+	protected IPropertyDescriptor createDefaultPropertyDescriptor(String attributeName) {
+		TextPropertyDescriptor descriptor = new TextPropertyDescriptor(attributeName, attributeName);
+		return descriptor;
+	}
+
+	public IPropertyDescriptor createDocumentTypePropertyDescriptor(DocumentType documentType) {
+		return null; // new TextPropertyDescriptor(HACK, HACK);
+	}
+
+	public IPropertyDescriptor createElementPropertyDescriptor(Element element) {
+		return createDefaultPropertyDescriptor(HACK);
+	}
+
+	public IPropertyDescriptor createEntityReferencePropertyDescriptor(EntityReference entityReference) {
+		return createDefaultPropertyDescriptor(HACK);
+	}
+
+	public IPropertyDescriptor createProcessingInstructionPropertyDescriptor(ProcessingInstruction pi) {
+		return createDefaultPropertyDescriptor(HACK);
+	}
+
+	public IPropertyDescriptor createPropertyDescriptor(Object object) {
+		IPropertyDescriptor result = null;
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			int nodeType = node.getNodeType();
+			switch (nodeType) {
+				case Node.ATTRIBUTE_NODE : {
+					result = createAttributePropertyDescriptor((Attr) node);
+					break;
+				}
+				case Node.CDATA_SECTION_NODE : {
+					result = createCDATASectionPropertyDescriptor((CDATASection) node);
+					break;
+				}
+				case Node.COMMENT_NODE : {
+					result = createCommentPropertyDescriptor((Comment) node);
+					break;
+				}
+				case Node.DOCUMENT_TYPE_NODE : {
+					result = createDocumentTypePropertyDescriptor((DocumentType) node);
+					break;
+				}
+				case Node.ELEMENT_NODE : {
+					result = createElementPropertyDescriptor((Element) node);
+					break;
+				}
+				case Node.ENTITY_REFERENCE_NODE : {
+					result = createEntityReferencePropertyDescriptor((EntityReference) node);
+					break;
+				}
+				case Node.PROCESSING_INSTRUCTION_NODE : {
+					result = createProcessingInstructionPropertyDescriptor((ProcessingInstruction) node);
+					break;
+				}
+				case Node.TEXT_NODE : {
+					result = createTextPropertyDescriptor((Text) node);
+					break;
+				}
+			}
+		}
+		return result;
+	}
+
+	public IPropertyDescriptor createTextPropertyDescriptor(Text text) {
+		return createDefaultPropertyDescriptor(HACK);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/IDesignViewer.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/IDesignViewer.java
new file mode 100644
index 0000000..f1be97f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/IDesignViewer.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.widgets.Control;
+
+public interface IDesignViewer {
+	public Control getControl();
+
+	String getTitle();
+
+	void setDocument(IDocument document);
+
+	ISelectionProvider getSelectionProvider();
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/IDesignViewerActionBarContributor.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/IDesignViewerActionBarContributor.java
new file mode 100644
index 0000000..411a3f9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/IDesignViewerActionBarContributor.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+
+
+import org.eclipse.ui.IActionBars;
+import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
+
+
+public interface IDesignViewerActionBarContributor extends ISourceViewerActionBarContributor {
+	public void initViewerSpecificContributions(IActionBars bars);
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/SourceEditorActionBarContributor.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/SourceEditorActionBarContributor.java
new file mode 100644
index 0000000..d70cdd3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/SourceEditorActionBarContributor.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
+import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
+import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
+
+
+public class SourceEditorActionBarContributor extends MultiPageEditorActionBarContributor implements IExtendedContributor {
+
+	protected IEditorActionBarContributor designViewerActionBarContributor = null;
+	protected IEditorActionBarContributor sourceViewerActionContributor = null;
+	protected MultiPageEditorPart multiPageEditor = null;
+
+	// EditorExtension
+	private static final String EDITOR_ID = "org.eclipse.wst.xml.ui.XMLMultiPageEditorPart"; //$NON-NLS-1$
+	private IExtendedContributor extendedContributor;
+
+	public SourceEditorActionBarContributor() {
+		super();
+
+		sourceViewerActionContributor = new SourcePageActionContributor();
+
+		// Read action extensions.
+		ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
+		extendedContributor = builder.readActionExtensions(EDITOR_ID);
+	}
+
+	public void init(IActionBars actionBars) {
+		super.init(actionBars);
+
+		if (actionBars != null) {
+			initDesignViewerActionBarContributor(actionBars);
+			initSourceViewerActionContributor(actionBars);
+		}
+	}
+
+	protected void initDesignViewerActionBarContributor(IActionBars actionBars) {
+		if (designViewerActionBarContributor != null) {
+			designViewerActionBarContributor.init(actionBars, getPage());
+		}
+	}
+
+	protected void initSourceViewerActionContributor(IActionBars actionBars) {
+		if (sourceViewerActionContributor != null) {
+			sourceViewerActionContributor.init(actionBars, getPage());
+		}
+	}
+
+	public void dispose() {
+		super.dispose();
+
+		if (designViewerActionBarContributor != null) {
+			designViewerActionBarContributor.dispose();
+		}
+
+		if (sourceViewerActionContributor != null) {
+			sourceViewerActionContributor.dispose();
+		}
+
+		if (extendedContributor != null) {
+			extendedContributor.dispose();
+		}
+		
+		multiPageEditor = null;
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager)
+	 */
+	public final void contributeToMenu(IMenuManager menu) {
+		super.contributeToMenu(menu);
+
+		//addToMenu(menu);
+
+		if (extendedContributor != null) {
+			extendedContributor.contributeToMenu(menu);
+		}
+	}
+
+	protected void addToMenu(IMenuManager menu) {
+	}
+
+	/**
+	 * @see IExtendedContributor#contributeToPopupMenu(IMenuManager)
+	 */
+	public final void contributeToPopupMenu(IMenuManager menu) {
+
+		addToPopupMenu(menu);
+
+		if (extendedContributor != null) {
+			extendedContributor.contributeToPopupMenu(menu);
+		}
+	}
+
+	protected void addToPopupMenu(IMenuManager menu) {
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(IToolBarManager)
+	 */
+	public final void contributeToToolBar(IToolBarManager toolBarManager) {
+		super.contributeToToolBar(toolBarManager);
+
+		addToToolBar(toolBarManager);
+
+		if (extendedContributor != null) {
+			extendedContributor.contributeToToolBar(toolBarManager);
+		}
+	}
+
+	protected void addToToolBar(IToolBarManager toolBarManager) {
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToStatusLine(IStatusLineManager)
+	 */
+	public final void contributeToStatusLine(IStatusLineManager manager) {
+		super.contributeToStatusLine(manager);
+
+		addToStatusLine(manager);
+
+		if (extendedContributor != null) {
+			extendedContributor.contributeToStatusLine(manager);
+		}
+	}
+
+	protected void addToStatusLine(IStatusLineManager manager) {
+	}
+
+	/**
+	 * @see IExtendedContributor#updateToolbarActions()
+	 */
+	public void updateToolbarActions() {
+		if (extendedContributor != null) {
+			extendedContributor.updateToolbarActions();
+		}
+	}
+
+	public void setActiveEditor(IEditorPart targetEditor) {
+		// save multiPageEditor before calling
+		// super.setActiveEditor(targetEditor)
+		// super.setActiveEditor will call setActivePage(IEditorPart
+		// activeEditor)
+		// multiPageEditor is needed in setActivePage(IEditorPart
+		// activeEditor)
+		if (targetEditor instanceof MultiPageEditorPart) {
+			multiPageEditor = (MultiPageEditorPart) targetEditor;
+		}
+
+		super.setActiveEditor(targetEditor);
+
+		updateToolbarActions();
+
+		if (extendedContributor != null) {
+			extendedContributor.setActiveEditor(targetEditor);
+		}
+	}
+
+	public void setActivePage(IEditorPart activeEditor) {
+		// This contributor is designed for StructuredTextMultiPageEditorPart.
+		// To safe-guard this from problems caused by unexpected usage by
+		// other editors, the following
+		// check is added.
+		if (multiPageEditor != null) {
+			if ((activeEditor != null) && (activeEditor instanceof ITextEditor)) {
+				activateSourcePage(activeEditor);
+			}
+			else {
+				activateDesignPage(activeEditor);
+			}
+		}
+
+		updateToolbarActions();
+
+		IActionBars actionBars = getActionBars();
+		if (actionBars != null) {
+			// update menu bar and tool bar
+			actionBars.updateActionBars();
+		}
+	}
+
+	protected void activateDesignPage(IEditorPart activeEditor) {
+		if ((designViewerActionBarContributor != null) && (designViewerActionBarContributor instanceof IDesignViewerActionBarContributor)) {
+			designViewerActionBarContributor.setActiveEditor(multiPageEditor);
+		}
+
+		if ((sourceViewerActionContributor != null) && (sourceViewerActionContributor instanceof ISourceViewerActionBarContributor)) {
+			// if design page is not really an IEditorPart, activeEditor ==
+			// null, so pass in multiPageEditor instead (d282414)
+			if (activeEditor == null) {
+				sourceViewerActionContributor.setActiveEditor(multiPageEditor);
+			}
+			else {
+				sourceViewerActionContributor.setActiveEditor(activeEditor);
+			}
+			((ISourceViewerActionBarContributor) sourceViewerActionContributor).setViewerSpecificContributionsEnabled(false);
+		}
+	}
+
+	protected void activateSourcePage(IEditorPart activeEditor) {
+		if ((designViewerActionBarContributor != null) && (designViewerActionBarContributor instanceof IDesignViewerActionBarContributor)) {
+			designViewerActionBarContributor.setActiveEditor(multiPageEditor);
+		}
+
+		if ((sourceViewerActionContributor != null) && (sourceViewerActionContributor instanceof ISourceViewerActionBarContributor)) {
+			sourceViewerActionContributor.setActiveEditor(activeEditor);
+			((ISourceViewerActionBarContributor) sourceViewerActionContributor).setViewerSpecificContributionsEnabled(true);
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/SourcePageActionContributor.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/SourcePageActionContributor.java
new file mode 100644
index 0000000..bd1e251
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/SourcePageActionContributor.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+
+
+import org.eclipse.ui.IActionBars;
+import org.eclipse.wst.xml.ui.internal.actions.ActionContributorXML;
+
+
+/**
+ * SourcePageActionContributor
+ * 
+ * This class is for multi page editor's source page contributor.
+ * 
+ * Use XMLEditorActionContributor for single page editor.
+ */
+public class SourcePageActionContributor extends ActionContributorXML {
+
+	private IActionBars fBars;
+
+	/**
+	 * This method calls:
+	 * <ul>
+	 * <li><code>contributeToMenu</code> with <code>bars</code>' menu
+	 * manager</li>
+	 * <li><code>contributeToToolBar</code> with <code>bars</code>' tool
+	 * bar manager</li>
+	 * <li><code>contributeToStatusLine</code> with <code>bars</code>'
+	 * status line manager</li>
+	 * </ul>
+	 * The given action bars are also remembered and made accessible via
+	 * <code>getActionBars</code>.
+	 * 
+	 * @param bars
+	 *            the action bars
+	 * 
+	 */
+	public void init(IActionBars bars) {
+		fBars = bars;
+		contributeToMenu(bars.getMenuManager());
+		contributeToToolBar(bars.getToolBarManager());
+		contributeToStatusLine(bars.getStatusLineManager());
+	}
+
+	/**
+	 * Returns this contributor's action bars.
+	 * 
+	 * @return the action bars
+	 */
+	public IActionBars getActionBars() {
+		return fBars;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/TreeContentHelper.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/TreeContentHelper.java
new file mode 100644
index 0000000..9033227
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/TreeContentHelper.java
@@ -0,0 +1,513 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMWriter;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.w3c.dom.Attr;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
+
+
+/**
+ * This performs the work of taking a DOM tree and converting it to a
+ * displayable 'UI' tree.
+ * 
+ * For example : - white space text nodes are ommited from the 'UI' tree -
+ * adjacent Text and EntityReference nodes are combined into a single 'UI'
+ * node - Elements with 'text only' children are diplayed without children
+ * 
+ */
+public class TreeContentHelper {
+
+	public static final int HIDE_WHITE_SPACE_TEXT_NODES = 8;
+	public static final int COMBINE_ADJACENT_TEXT_AND_ENTITY_REFERENCES = 16;
+	public static final int HIDE_ELEMENT_CHILD_TEXT_NODES = 32;
+
+	protected int style = HIDE_WHITE_SPACE_TEXT_NODES | COMBINE_ADJACENT_TEXT_AND_ENTITY_REFERENCES | HIDE_ELEMENT_CHILD_TEXT_NODES;
+
+	/**
+	 * 
+	 */
+	public boolean hasStyleFlag(int flag) {
+		return (style & flag) != 0;
+	}
+
+	/**
+	 * 
+	 */
+	public Object[] getChildren(Object element) {
+		Object[] result = null;
+
+		if (element instanceof Node) {
+			Node node = (Node) element;
+			List list = new ArrayList();
+			boolean textContentOnly = true;
+
+			NamedNodeMap map = node.getAttributes();
+			if (map != null) {
+				int length = map.getLength();
+				for (int i = 0; i < length; i++) {
+					list.add(map.item(i));
+					textContentOnly = false;
+				}
+			}
+
+			Node prevIncludedNode = null;
+			for (Node childNode = node.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
+				int childNodeType = childNode.getNodeType();
+				boolean includeNode = true;
+
+				if (includeNode && hasStyleFlag(HIDE_WHITE_SPACE_TEXT_NODES)) {
+					if (isIgnorableText(childNode)) {
+						// filter out the ignorable text node
+						includeNode = false;
+					}
+				}
+
+				if (includeNode && hasStyleFlag(COMBINE_ADJACENT_TEXT_AND_ENTITY_REFERENCES)) {
+					if (isTextOrEntityReferenceNode(childNode) && (prevIncludedNode != null) && isTextOrEntityReferenceNode(prevIncludedNode)) {
+						// we only show the first of a list of adjacent text
+						// or entity reference node in the tree
+						// so we filter out this subsequent one
+						includeNode = false;
+					}
+				}
+
+				if (hasStyleFlag(HIDE_ELEMENT_CHILD_TEXT_NODES)) {
+					if ((childNodeType != Node.TEXT_NODE) && (childNodeType != Node.ENTITY_REFERENCE_NODE)) {
+						textContentOnly = false;
+					}
+				}
+
+				if (includeNode) {
+					list.add(childNode);
+					prevIncludedNode = childNode;
+				}
+			}
+
+			if (hasStyleFlag(HIDE_ELEMENT_CHILD_TEXT_NODES) && textContentOnly) {
+				result = new Object[0];
+			}
+			else {
+				result = list.toArray();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	protected boolean isTextOrEntityReferenceNode(Node node) {
+		return (node.getNodeType() == Node.TEXT_NODE) || (node.getNodeType() == Node.ENTITY_REFERENCE_NODE);
+	}
+
+	/**
+	 * 
+	 */
+	public boolean isIgnorableText(Node node) {
+		boolean result = false;
+		if (node.getNodeType() == Node.TEXT_NODE) {
+			String data = ((Text) node).getData();
+			result = ((data == null) || (data.trim().length() == 0));
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	public boolean isCombinedTextNode(Node node) {
+		boolean result = false;
+		if (node.getNodeType() == Node.TEXT_NODE) {
+			Node nextNode = node.getNextSibling();
+			if (nextNode != null) {
+				if (nextNode.getNodeType() == Node.ENTITY_REFERENCE_NODE) {
+					result = true;
+				}
+			}
+		}
+		else if (node.getNodeType() == Node.ENTITY_REFERENCE_NODE) {
+			result = true;
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	public List getCombinedTextNodeList(Node theNode) {
+		List list = new Vector();
+		boolean prevIsEntity = false;
+		for (Node node = theNode; node != null; node = node.getNextSibling()) {
+			int nodeType = node.getNodeType();
+			if (nodeType == Node.ENTITY_REFERENCE_NODE) {
+				prevIsEntity = true;
+				list.add(node);
+			}
+			else if ((nodeType == Node.TEXT_NODE) && (prevIsEntity || (node == theNode))) {
+				prevIsEntity = false;
+				list.add(node);
+			}
+			else {
+				break;
+			}
+		}
+		return list;
+	}
+
+	public String getElementTextValue(Element element) {
+		List list = _getElementTextContent(element);
+		return list != null ? getValueForTextContent(list) : null;
+	}
+
+	public void setElementTextValue(Element element, String value) {
+		setElementNodeValue(element, value);
+	}
+
+	private List _getElementTextContent(Element element) {
+		List result = null;
+
+		for (Node node = element.getFirstChild(); node != null; node = node.getNextSibling()) {
+			if ((node.getNodeType() == Node.TEXT_NODE) || (node.getNodeType() == Node.ENTITY_REFERENCE_NODE)) {
+				if (result == null) {
+					result = new Vector();
+				}
+				result.add(node);
+			}
+			else {
+				result = null;
+				break;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * If the element is has 'text only' content this method will return the
+	 * list of elements that compose the text only content
+	 */
+	public List getElementTextContent(Element element) {
+		List result = null;
+		if (!element.hasAttributes()) {
+			result = _getElementTextContent(element);
+		}
+		return result;
+	}
+
+
+	/**
+	 * 
+	 */
+	public String getNodeValue(Node node) {
+		String result = null;
+		int nodeType = node.getNodeType();
+		switch (nodeType) {
+			case Node.ATTRIBUTE_NODE : {
+				result = ((Attr) node).getValue();
+				break;
+			}
+			case Node.CDATA_SECTION_NODE :
+				// drop thru
+			case Node.COMMENT_NODE : {
+				result = ((CharacterData) node).getData();
+				break;
+			}
+			case Node.DOCUMENT_TYPE_NODE : {
+				result = getDocumentTypeValue((DocumentType) node);
+				break;
+			}
+			case Node.ELEMENT_NODE : {
+				result = getElementNodeValue((Element) node);
+				break;
+			}
+			case Node.ENTITY_REFERENCE_NODE :
+				// drop thru
+			case Node.TEXT_NODE : {
+				result = getTextNodeValue(node);
+				break;
+			}
+			case Node.PROCESSING_INSTRUCTION_NODE : {
+				result = ((ProcessingInstruction) node).getData();
+				break;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	public void setNodeValue(Node node, String value) {
+		setNodeValue(node, value, null);
+	}
+
+	/**
+	 * Checks that the resource backing the model is writeable utilizing <code>validateEdit</code>
+	 * on a given <tt>IWorkspace</tt>.
+	 * 
+	 * @param model the model to be checked
+	 * @param context the shell context for which <code>validateEdit</code> will be run
+	 * @return boolean result of checking <code>validateEdit</code>. If the resource is unwriteable, <code>status.isOK()</code>
+	 * will return true; otherwise, false.
+	 */
+	private boolean validateEdit(IStructuredModel model, Shell context) {
+		if (model != null && model.getBaseLocation() != null) {
+			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(model.getBaseLocation()));
+			return !file.isAccessible() || ResourcesPlugin.getWorkspace().validateEdit(new IFile[] {file}, context).isOK();
+		}
+		return false;
+	}
+
+	/**
+	 * 
+	 */
+	public void setNodeValue(Node node, String value, Shell context) {
+		// Model should not be edited because base location is read-only
+		if (node instanceof IDOMNode && !validateEdit(((IDOMNode) node).getModel(), context)) {
+			return;
+		}
+		int nodeType = node.getNodeType();
+		try {
+			switch (nodeType) {
+				case Node.ATTRIBUTE_NODE : {
+					((Attr) node).setValue(value);
+					break;
+				}
+				case Node.CDATA_SECTION_NODE :
+					// drop thru
+				case Node.COMMENT_NODE : {
+					((CharacterData) node).setData(value);
+					break;
+				}
+				case Node.ELEMENT_NODE : {
+					setElementNodeValue((Element) node, value);
+					break;
+				}
+				case Node.ENTITY_REFERENCE_NODE :
+					// drop thru
+				case Node.TEXT_NODE : {
+					setTextNodeValue(node, value);
+					break;
+				}
+				case Node.PROCESSING_INSTRUCTION_NODE : {
+					((ProcessingInstruction) node).setData(value);
+					break;
+				}
+			}
+		}
+		catch (DOMException e) {
+			Display d = getDisplay();
+			if (d != null) {
+				d.beep();
+			}
+		}
+	}
+
+	private Display getDisplay() {
+
+		return PlatformUI.getWorkbench().getDisplay();
+	}
+
+
+	/**
+	 * 
+	 */
+	protected String getDocumentTypeValue(DocumentType documentType) {
+		return DOMWriter.getDocumentTypeData(documentType);
+	}
+
+	/**
+	 * 
+	 */
+	protected String getElementNodeValue(Element element) {
+		String result = null;
+		List list = getElementTextContent(element);
+		if (list != null) {
+			result = getValueForTextContent(list);
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	protected void setElementNodeValue(Element element, String value) {
+		List list = getElementTextContent(element);
+		if (list != null) {
+			setValueForTextContent(list, value);
+		}
+		else {
+			Document document = element.getOwnerDocument();
+			Text text = document.createTextNode(value);
+			element.appendChild(text);
+		}
+	}
+
+	/**
+	 * 
+	 */
+	protected String getTextNodeValue(Node node) {
+		String result = null;
+		List list = null;
+		if (isCombinedTextNode(node)) {
+			list = getCombinedTextNodeList(node);
+		}
+		else {
+			list = new Vector();
+			list.add(node);
+		}
+		result = getValueForTextContent(list);
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	protected void setTextNodeValue(Node node, String value) {
+		List list = null;
+		if (isCombinedTextNode(node)) {
+			list = getCombinedTextNodeList(node);
+		}
+		else {
+			list = new Vector();
+			list.add(node);
+		}
+		setValueForTextContent(list, value);
+	}
+
+	public Text getEffectiveTextNodeForCombinedNodeList(List list) {
+		Text result = null;
+		for (Iterator i = list.iterator(); i.hasNext();) {
+			Node node = (Node) i.next();
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				result = (Text) node;
+				break;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	protected String getValueForTextContent(List list) {
+		String result = null;
+		if (list.size() > 0) {
+			if (list.get(0) instanceof IDOMNode) {
+				IDOMNode first = (IDOMNode) list.get(0);
+				IDOMNode last = (IDOMNode) list.get(list.size() - 1);
+				IDOMModel model = first.getModel();
+				int start = first.getStartOffset();
+				int end = last.getEndOffset();
+				try {
+					result = model.getStructuredDocument().get(start,
+							end - start);
+				} catch (Exception e) {
+
+				}
+			}
+			else
+			{
+				if (list.get(0) instanceof Node)
+				{
+					Node n = (Node) list.get(0);
+					for (Node node = n.getFirstChild(); node != null; node = node.getNextSibling()) {
+						if (node.getNodeType() == Node.TEXT_NODE) {
+							String text = node.getNodeValue();
+							if(!((text == null) || (text.trim().length() == 0))) {
+								result = text.trim();
+							}
+						}
+					}
+				}
+			}	
+		}
+
+		// we trim the content so that it looks nice when viewed
+		// we need to be carfull to preserve the 'trimmed' text when the value
+		// is set (see setValueForTextContent)
+		if (result != null) {
+			result = result.trim();
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	protected void setValueForTextContent(List list, String value) {
+		// String oldValue = getValueForTextContent();
+		// we worry about preserving trimmed text
+		if (list.size() > 0) {
+			if (list.get(0) instanceof IDOMNode) {
+				IDOMNode first = (IDOMNode) list.get(0);
+				IDOMNode last = (IDOMNode) list.get(list.size() - 1);
+				int start = first.getStartOffset();
+				int end = last.getEndOffset();
+				first.getModel().getStructuredDocument().replaceText(this,
+						start, end - start, value);
+			}
+		}
+	}
+
+	/**
+	 * 
+	 */
+	public boolean isEditable(Node node) {
+		int nodeType = node.getNodeType();
+		boolean result = false;
+		switch (nodeType) {
+			case Node.ATTRIBUTE_NODE :
+				// drop thru
+			case Node.CDATA_SECTION_NODE :
+				// drop thru
+			case Node.COMMENT_NODE :
+				// drop thru
+			case Node.ENTITY_REFERENCE_NODE :
+				// drop thru
+			case Node.TEXT_NODE :
+				// drop thru
+			case Node.PROCESSING_INSTRUCTION_NODE : {
+				result = true;
+				break;
+			}
+			case Node.ELEMENT_NODE : {
+				result = (getElementTextContent((Element) node) != null) || (node.getChildNodes().getLength() == 0);
+				break;
+			}
+		}
+		return result;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/TreeExtension.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/TreeExtension.java
new file mode 100644
index 0000000..c9832cc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/TreeExtension.java
@@ -0,0 +1,557 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellEditorListener;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
+
+
+public class TreeExtension implements PaintListener {
+
+	protected Tree fTree;
+	protected EditManager editManager;
+	protected String[] fColumnProperties;
+	protected ICellModifier cellModifier;
+	protected int columnPosition = 300;
+	protected int columnHitWidth = 5;
+	protected Color tableLineColor;
+	protected int controlWidth;
+	protected DelayedDrawTimer delayedDrawTimer;
+	private boolean fisUnsupportedInput = false;
+
+	public TreeExtension(Tree tree) {
+		this.fTree = tree;
+		InternalMouseListener listener = new InternalMouseListener();
+		tree.addMouseMoveListener(listener);
+		tree.addMouseListener(listener);
+		tree.addPaintListener(this);
+		editManager = new EditManager(tree);
+		delayedDrawTimer = new DelayedDrawTimer(tree);
+
+		tableLineColor = tree.getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
+	}
+
+	public void dispose() {
+		tableLineColor.dispose();
+	}
+
+	public void setCellModifier(ICellModifier modifier) {
+		cellModifier = modifier;
+	}
+
+	public void resetCachedData() {
+		// todo: sure seems we should reset something?
+	}
+
+	public ICellModifier getCellModifier() {
+		return cellModifier;
+	}
+
+	public List getItemList() {
+		List list = new Vector();
+		getItemListHelper(fTree.getItems(), list);
+		return list;
+	}
+
+	protected void getItemListHelper(TreeItem[] items, List list) {
+		for (int i = 0; i < items.length; i++) {
+			TreeItem item = items[i];
+			list.add(item);
+			getItemListHelper(item.getItems(), list);
+		}
+	}
+
+	protected TreeItem getTreeItemOnRow(int px, int py) {
+		TreeItem result = null;
+		List list = getItemList();
+		for (Iterator i = list.iterator(); i.hasNext();) {
+			TreeItem item = (TreeItem) i.next();
+			Rectangle r = item.getBounds();
+			if ((r != null) && (px >= r.x) && (py >= r.y) && (py <= r.y + r.height)) {
+				result = item;
+			}
+		}
+		return result;
+	}
+
+	protected class InternalMouseListener extends MouseAdapter implements MouseMoveListener {
+		protected int columnDragged = -1;
+		protected boolean isDown = false;
+		protected int prevX = -1;
+		protected Cursor cursor = null;
+
+		public void mouseMove(MouseEvent e) {
+			if ((e.x > columnPosition - columnHitWidth) && (e.x < columnPosition + columnHitWidth)) {
+				if (cursor == null) {
+					cursor = new Cursor(fTree.getDisplay(), SWT.CURSOR_SIZEWE);
+					fTree.setCursor(cursor);
+				}
+			}
+			else {
+				if (cursor != null) {
+					fTree.setCursor(null);
+					cursor.dispose();
+					cursor = null;
+				}
+			}
+
+			if (columnDragged != -1) {
+				// using the delay timer will make redraws less flickery
+				if (e.x > 20) {
+					columnPosition = e.x;
+					delayedDrawTimer.reset(20);
+				}
+			}
+		}
+
+		public void mouseDown(MouseEvent e) {
+			// here we handle the column resizing by detect if the user has
+			// click on a column separator
+			//
+			columnDragged = -1;
+			editManager.deactivateCellEditor();
+
+			if ((e.x > columnPosition - columnHitWidth) && (e.x < columnPosition + columnHitWidth)) {
+				columnDragged = 0;
+			}
+
+			// here we handle selecting tree items when any thing on the 'row'
+			// is clicked
+			//
+			TreeItem item = fTree.getItem(new Point(e.x, e.y));
+			if (item == null) {
+				item = getTreeItemOnRow(e.x, e.y);
+				if (item != null) {
+					TreeItem[] items = new TreeItem[1];
+					items[0] = item;
+					fTree.setSelection(items);
+				}
+			}
+		}
+
+		public void mouseUp(MouseEvent e) {
+			columnDragged = -1;
+		}
+	}
+
+	public String[] getColumnProperties() {
+		return fColumnProperties;
+	}
+
+	public void setColumnProperties(String[] columnProperties) {
+		this.fColumnProperties = columnProperties;
+	}
+
+	public void paintControl(PaintEvent event) {
+		GC gc = event.gc;
+		Rectangle treeBounds = fTree.getBounds();
+
+		controlWidth = treeBounds.width;
+		Color bg = fTree.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+		Color bg2 = fTree.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION);
+
+		gc.setBackground(bg2);
+
+		// // This next part causes problems on LINUX, so let's not do it
+		// there
+		// if (B2BHacks.IS_UNIX == false) {
+		// TreeItem[] selectedItems = tree.getSelection();
+		// if (selectedItems.length > 0) {
+		// for (int i = 0; i < selectedItems.length; i++) {
+		// TreeItem item = selectedItems[i];
+		// Rectangle bounds = item.getBounds();
+		// if (bounds != null) {
+		// gc.fillRectangle(bounds.x + bounds.width, bounds.y, controlWidth,
+		// bounds.height);
+		// }
+		// }
+		// }
+		// }
+		//
+		if (!fisUnsupportedInput) {
+			TreeItem[] items = fTree.getItems();
+			if (items.length > 0) {
+				gc.setForeground(tableLineColor);
+				gc.setBackground(bg);
+
+				gc.fillRectangle(columnPosition, treeBounds.x, treeBounds.width, treeBounds.height);
+
+				Rectangle itemBounds = items[0].getBounds();
+				int height = computeTreeItemHeight();
+
+				if (itemBounds != null) {
+					/*
+					 * Bounds will be for the first item, which will either be
+					 * visible at the top of the Tree, or scrolled off with
+					 * negative values
+					 */
+					int startY = itemBounds.y;
+
+					/* Only draw lines within the Tree boundaries */
+					for (int i = startY; i < treeBounds.height; i += height) {
+						if (i >= treeBounds.y) {
+							gc.drawLine(0, i, treeBounds.width, i);
+						}
+					}
+				}
+				gc.drawLine(columnPosition, 0, columnPosition, treeBounds.height);
+				paintItems(gc, items, treeBounds);
+
+			}
+			else {
+				addEmptyTreeMessage(gc);
+			}
+		}
+		else {
+			addUnableToPopulateTreeMessage(gc);
+		}
+	}
+
+	protected int computeTreeItemHeight() {
+		int result = -1;
+
+		/*
+		 * On GTK tree.getItemHeight() seems to lie to us. It reports that the
+		 * tree item occupies a few pixles less vertical space than it should
+		 * (possibly because of the image height vs. the text height?). This
+		 * foils our code that draws the 'row' lines since we assume that
+		 * lines should be drawn at 'itemHeight' increments. Don't trust
+		 * getItemHeight() to compute the increment... instead compute the
+		 * value based on distance between two TreeItems, and then use the
+		 * larger value.
+		 * 
+		 * This strategy only works on trees where the items are of even
+		 * height, however bug
+		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=117201 indicates that
+		 * this is no longer promised, at least on win32 and likely on other
+		 * platforms soon.
+		 */
+		if (fTree.getItemCount() > 0) {
+			TreeItem[] items = fTree.getItems();
+			Rectangle itemBounds = items[0].getBounds();
+
+			if (items[0].getExpanded()) {
+				TreeItem[] children = items[0].getItems();
+				if (children.length > 0) {
+					result = children[0].getBounds().y - itemBounds.y;
+				}
+			}
+			else if (items.length > 1) {
+				result = items[1].getBounds().y - itemBounds.y;
+			}
+		}
+
+		result = Math.max(fTree.getItemHeight(), result);
+		return result;
+	}
+
+	protected void addEmptyTreeMessage(GC gc) {
+		// nothing to add here
+	}
+
+	private void addUnableToPopulateTreeMessage(GC gc) {
+		// here we print a message when the document cannot be displayed just
+		// to give the
+		// user a visual cue
+		// so that they know how to proceed to edit the blank view
+		gc.setForeground(fTree.getDisplay().getSystemColor(SWT.COLOR_BLACK));
+		gc.setBackground(fTree.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+		gc.drawString(XMLEditorMessages.TreeExtension_0, 10, 10);
+	}
+
+	void setIsUnsupportedInput(boolean isUnsupported) {
+		fisUnsupportedInput = isUnsupported;
+	}
+
+	public void paintItems(GC gc, TreeItem[] items, Rectangle treeBounds) {
+		if (items != null) {
+			for (int i = 0; i < items.length; i++) {
+				TreeItem item = items[i];
+				if (item != null) {
+					Rectangle bounds = item.getBounds();
+					if (bounds != null) {
+						if (treeBounds.intersects(bounds)) {
+							paintItem(gc, item, bounds);
+						}
+					}
+
+					// defect 241039
+					//
+					if (item.getExpanded()) {
+						paintItems(gc, item.getItems(), treeBounds);
+					}
+				}
+			}
+		}
+	}
+
+	protected void paintItem(GC gc, TreeItem item, Rectangle bounds) {
+		// nothing to paint
+	}
+
+	public interface ICellEditorProvider {
+		CellEditor getCellEditor(Object o, int col);
+	}
+
+	/**
+	 * This class is used to improve drawing during a column resize.
+	 */
+	public class DelayedDrawTimer implements Runnable {
+		protected Control control;
+
+		public DelayedDrawTimer(Control control1) {
+			this.control = control1;
+		}
+
+		public void reset(int milliseconds) {
+			getDisplay().timerExec(milliseconds, this);
+		}
+
+		public void run() {
+			control.redraw();
+		}
+	}
+
+	Display getDisplay() {
+
+		return PlatformUI.getWorkbench().getDisplay();
+	}
+
+	/**
+	 * EditManager
+	 */
+	public class EditManager {
+		protected Tree fTree1;
+		protected Control cellEditorHolder;
+		protected CellEditorState cellEditorState;
+
+		public EditManager(Tree tree) {
+			this.fTree1 = tree;
+			this.cellEditorHolder = new Composite(tree, SWT.NONE);
+
+			final Tree theTree = tree;
+
+			MouseAdapter theMouseAdapter = new MouseAdapter() {
+				public void mouseDown(MouseEvent e) {
+					deactivateCellEditor();
+
+					if (e.x > columnPosition + columnHitWidth) {
+						TreeItem[] items = theTree.getSelection();
+						// No edit if more than one row is selected.
+						if (items.length == 1) {
+							Rectangle bounds = items[0].getBounds();
+							if ((bounds != null) && (e.y >= bounds.y) && (e.y <= bounds.y + bounds.height)) {
+								int columnToEdit = 1;
+								activateCellEditor(items[0], columnToEdit);
+							}
+						}
+					}
+				}
+			};
+
+			SelectionListener selectionListener = new SelectionListener() {
+				public void widgetDefaultSelected(SelectionEvent e) {
+					applyCellEditorValue();
+				}
+
+				public void widgetSelected(SelectionEvent e) {
+					applyCellEditorValue();
+				}
+			};
+
+			KeyListener keyListener = new KeyAdapter() {
+				public void keyPressed(KeyEvent e) {
+					if (e.character == SWT.CR) {
+						deactivateCellEditor();
+						TreeItem[] items = theTree.getSelection();
+						if (items.length == 1) {
+							activateCellEditor(items[0], 1);
+						}
+					}
+				}
+			};
+
+			tree.addMouseListener(theMouseAdapter);
+			tree.addKeyListener(keyListener);
+			ScrollBar hBar = tree.getHorizontalBar();
+			if (hBar != null) {
+				hBar.addSelectionListener(selectionListener);
+			}
+			ScrollBar vBar = tree.getVerticalBar();
+			if (vBar != null) {
+				vBar.addSelectionListener(selectionListener);
+			}
+		}
+
+		public boolean isCellEditorActive() {
+			return cellEditorState != null;
+		}
+
+		public void applyCellEditorValue() {
+			if ((cellEditorState != null) && (cellModifier != null)) {
+				TreeItem treeItem = cellEditorState.fTreeItem;
+
+				// The area below the cell editor needs to be explicity
+				// repainted on Linux
+				//
+				// Rectangle r = B2BHacks.IS_UNIX ? treeItem.getBounds() :
+				// null;
+
+				Object value = cellEditorState.fCellEditor.getValue();
+				String property = cellEditorState.fProperty;
+
+				deactivateCellEditor();
+
+				cellModifier.modify(treeItem, property, value);
+
+				// if (r != null) {
+				// tree.redraw(r.x, r.y, tree.getBounds().width, r.height,
+				// false);
+				// }
+			}
+		}
+
+		public void deactivateCellEditor() {
+			// Clean up any previous editor control
+			if (cellEditorState != null) {
+				cellEditorState.deactivate();
+				cellEditorState = null;
+			}
+		}
+
+		public void activateCellEditor(TreeItem treeItem, int column) {
+			if (cellModifier instanceof ICellEditorProvider) {
+				ICellEditorProvider cellEditorProvider = (ICellEditorProvider) cellModifier;
+				Object data = treeItem.getData();
+				if (fColumnProperties.length > column) {
+					String property = fColumnProperties[column];
+					if (cellModifier.canModify(data, property)) {
+						CellEditor newCellEditor = cellEditorProvider.getCellEditor(data, column);
+						if (newCellEditor != null) {
+							// The control that will be the editor must be a
+							// child of the columnPosition
+							Control control = newCellEditor.getControl();
+							if (control != null) {
+								cellEditorState = new CellEditorState(newCellEditor, control, treeItem, column, property);
+								cellEditorState.activate();
+							}
+						}
+					}
+				}
+			}
+		}
+
+		/**
+		 * this class holds the state that is need on a per cell editor
+		 * invocation basis
+		 */
+		public class CellEditorState implements ICellEditorListener, FocusListener {
+			public CellEditor fCellEditor;
+			public Control fControl;
+			public TreeItem fTreeItem;
+			public int fColumnNumber;
+			public String fProperty;
+
+			public CellEditorState(CellEditor cellEditor, Control control, TreeItem treeItem, int columnNumber, String property) {
+				this.fCellEditor = cellEditor;
+				this.fControl = control;
+				this.fTreeItem = treeItem;
+				this.fColumnNumber = columnNumber;
+				this.fProperty = property;
+			}
+
+			public void activate() {
+				Object element = fTreeItem.getData();
+				String value = cellModifier.getValue(element, fProperty).toString();
+				if (fControl instanceof Text) {
+					Text text = (Text) fControl;
+					int requiredSize = value.length() + 100;
+					if (text.getTextLimit() < requiredSize) {
+						text.setTextLimit(requiredSize);
+					}
+				}
+				Rectangle r = fTreeItem.getBounds();
+				if (r != null) {
+					fControl.setBounds(columnPosition + 5, r.y + 1, fTree1.getClientArea().width - (columnPosition + 5), r.height - 1);
+					fControl.setVisible(true);
+					fCellEditor.setValue(value);
+					fCellEditor.addListener(this);
+					fCellEditor.setFocus();
+					fControl.addFocusListener(this);
+				}
+			}
+
+			public void deactivate() {
+				fCellEditor.removeListener(this);
+				fControl.removeFocusListener(this);
+				fCellEditor.deactivate();
+				fTree1.forceFocus();
+			}
+
+			// ICellEditorListener methods
+			//
+			public void applyEditorValue() {
+				applyCellEditorValue();
+			}
+
+			public void cancelEditor() {
+				deactivateCellEditor();
+			}
+
+			public void editorValueChanged(boolean oldValidState, boolean newValidState) {
+				// nothing, for now
+			}
+
+			// FocusListener methods
+			//
+			public void focusGained(FocusEvent e) {
+				// do nothing
+			}
+
+			public void focusLost(FocusEvent e) {
+				applyCellEditorValue();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/ViewerExpandCollapseAction.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/ViewerExpandCollapseAction.java
new file mode 100644
index 0000000..02fd23c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/ViewerExpandCollapseAction.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class ViewerExpandCollapseAction extends Action {
+
+	protected boolean isExpandAction;
+	protected AbstractTreeViewer viewer = null;
+
+	public ViewerExpandCollapseAction(boolean isExpandAction) {
+		this.isExpandAction = isExpandAction;
+		if (isExpandAction) {
+			ImageDescriptor e_imageDescriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_ETOOL_EXPANDALL);
+			ImageDescriptor d_imageDescriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_DTOOL_EXPANDALL);
+
+			setImageDescriptor(e_imageDescriptor);
+			setDisabledImageDescriptor(d_imageDescriptor);
+			setToolTipText(XMLUIMessages._UI_INFO_EXPAND_ALL);
+		}
+		else {
+			ImageDescriptor e_imageDescriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_ETOOL_COLLAPSEALL);
+			ImageDescriptor d_imageDescriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_DTOOL_COLLAPSEALL);
+
+			setImageDescriptor(e_imageDescriptor);
+			setDisabledImageDescriptor(d_imageDescriptor);
+			setToolTipText(XMLUIMessages._UI_INFO_COLLAPSE_ALL);
+		}
+	}
+
+	public void setViewer(AbstractTreeViewer viewer) {
+		this.viewer = viewer;
+	}
+
+	public void run() {
+		if (viewer != null) {
+			// temporarily set the visibility to false
+			// this has a HUGE performance benefit
+			boolean isVisible = viewer.getControl().getVisible();
+			viewer.getControl().setVisible(false);
+
+			if (isExpandAction) {
+				viewer.expandAll();
+			}
+			else {
+				viewer.collapseAll();
+			}
+
+			// restore the previous visibility state
+			// 
+			viewer.getControl().setVisible(isVisible);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorActionDefinitionIds.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorActionDefinitionIds.java
new file mode 100644
index 0000000..1d380cf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorActionDefinitionIds.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+
+
+/**
+ * Defines the definitions ids for the XML editor actions.
+ * 
+ * @deprecated Use org.eclipse.wst.sse.ui.edit.util.ActionDefinitionIds
+ *             instead
+ */
+public interface XMLEditorActionDefinitionIds {
+	public final static String CLEANUP_DOCUMENT = "org.eclipse.wst.sse.ui.edit.ui.cleanup.document";//$NON-NLS-1$
+	public final static String FORMAT_DOCUMENT = "org.eclipse.wst.sse.ui.edit.ui.format.document";//$NON-NLS-1$
+	public final static String FORMAT_ACTIVE_ELEMENTS = "org.eclipse.wst.sse.ui.edit.ui.format.active.elements";//$NON-NLS-1$
+	public final static String OPEN_FILE = "org.eclipse.wst.sse.ui.edit.ui.open.file.from.source";//$NON-NLS-1$
+	// public final static String INFORMATION =
+	// "org.eclipse.wst.sse.ui.edit.ui.show.tooltip.information";//$NON-NLS-1$
+	public final static String INFORMATION = "org.eclipse.jdt.ui.edit.text.java.show.javadoc";//$NON-NLS-1$
+	public final static String ADD_BREAKPOINTS = "org.eclipse.wst.sse.ui.edit.ui.add.breakpoints";//$NON-NLS-1$
+	public final static String MANAGE_BREAKPOINTS = "org.eclipse.wst.sse.ui.edit.ui.manage.breakpoints";//$NON-NLS-1$
+	public final static String ENABLE_BREAKPOINTS = "org.eclipse.wst.sse.ui.edit.ui.enable.breakpoints";//$NON-NLS-1$
+	public final static String DISABLE_BREAKPOINTS = "org.eclipse.wst.sse.ui.edit.ui.disable.breakpoints";//$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorMessages.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorMessages.java
new file mode 100644
index 0000000..4fbac12
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorMessages.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Strings used by XML Editor
+ * 
+ * @plannedfor 1.0
+ */
+public class XMLEditorMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.xml.ui.internal.tabletree.XMLEditorResources";//$NON-NLS-1$
+
+	public static String XMLTableTreeViewer_0;
+	public static String XMLTableTreeViewer_1;
+	public static String XMLTableTreeViewer_2;
+	public static String XMLMultiPageEditorPart_0;
+	public static String XMLTreeExtension_0;
+	public static String XMLTreeExtension_1;
+	public static String XMLTreeExtension_3;
+	public static String XMLTreeExtension_4;
+	public static String XMLTableTreeActionBarContributor_0;
+	public static String XMLTableTreeActionBarContributor_1;
+	public static String XMLTableTreeActionBarContributor_2;
+	public static String XMLTableTreeActionBarContributor_3;
+	public static String XMLTableTreeActionBarContributor_4;
+	public static String XMLTableTreeActionBarContributor_5;
+	public static String XMLTableTreeActionBarContributor_6;
+	public static String XMLTableTreeActionBarContributor_7;
+	public static String XMLTableTreeActionBarContributor_8;
+	public static String An_error_has_occurred_when1_ERROR_;
+	public static String Resource__does_not_exist;
+	public static String Editor_could_not_be_open;
+	public static String TreeExtension_0;
+
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, XMLEditorMessages.class);
+	}
+
+	private XMLEditorMessages() {
+		// cannot create new instance
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorPluginImageHelper.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorPluginImageHelper.java
new file mode 100644
index 0000000..b0d11df
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorPluginImageHelper.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+/**
+ * Helper class to handle images provided by this plug-in.
+ * 
+ * NOTE: For internal use only. For images used externally, please use the
+ * Shared***ImageHelper class instead.
+ * 
+ * @author amywu
+ */
+public class XMLEditorPluginImageHelper {
+	private final String PLUGINID = XMLUIPlugin.ID;
+	private static XMLEditorPluginImageHelper instance = null;
+
+	// save a descriptor for each image
+	private HashMap fImageDescRegistry = null;
+
+	/**
+	 * Gets the instance.
+	 * 
+	 * @return Returns a XMLEditorPluginImageHelper
+	 */
+	public synchronized static XMLEditorPluginImageHelper getInstance() {
+		if (instance == null) {
+			instance = new XMLEditorPluginImageHelper();
+		}
+		return instance;
+	}
+
+	/**
+	 * Retrieves the image associated with resource from the image registry.
+	 * If the image cannot be retrieved, attempt to find and load the image at
+	 * the location specified in resource.
+	 * 
+	 * @param resource
+	 *            the image to retrieve
+	 * @return Image the image associated with resource or null if one could
+	 *         not be found
+	 */
+	public Image getImage(String resource) {
+		Image image = getImageRegistry().get(resource);
+		if (image == null) {
+			// create an image
+			image = createImage(resource);
+		}
+		return image;
+	}
+
+	/**
+	 * Retrieves the image descriptor associated with resource from the image
+	 * descriptor registry. If the image descriptor cannot be retrieved,
+	 * attempt to find and load the image descriptor at the location specified
+	 * in resource.
+	 * 
+	 * @param resource
+	 *            the image descriptor to retrieve
+	 * @return ImageDescriptor the image descriptor assocated with resource or
+	 *         the default "missing" image descriptor if one could not be
+	 *         found
+	 */
+	public ImageDescriptor getImageDescriptor(String resource) {
+		ImageDescriptor imageDescriptor = null;
+		Object o = getImageDescriptorRegistry().get(resource);
+		if (o == null) {
+			// create a descriptor
+			imageDescriptor = createImageDescriptor(resource);
+		}
+		else {
+			imageDescriptor = (ImageDescriptor) o;
+		}
+		return imageDescriptor;
+	}
+
+	/**
+	 * Returns the image descriptor registry for this plugin.
+	 * 
+	 * @return HashMap - image descriptor registry for this plugin
+	 */
+	private HashMap getImageDescriptorRegistry() {
+		if (fImageDescRegistry == null) {
+			fImageDescRegistry = new HashMap();
+		}
+		return fImageDescRegistry;
+	}
+
+	/**
+	 * Returns the image registry for this plugin.
+	 * 
+	 * @return ImageRegistry - image registry for this plugin
+	 */
+	private ImageRegistry getImageRegistry() {
+		return JFaceResources.getImageRegistry();
+	}
+
+	/**
+	 * Creates an image from the given resource and adds the image to the
+	 * image registry.
+	 * 
+	 * @param resource
+	 * @return Image
+	 */
+	private Image createImage(String resource) {
+		ImageDescriptor desc = getImageDescriptor(resource);
+		Image image = null;
+
+		if (desc != null) {
+			image = desc.createImage();
+			// dont add the missing image descriptor image to the image
+			// registry
+			if (!desc.equals(ImageDescriptor.getMissingImageDescriptor())) {
+				getImageRegistry().put(resource, image);
+			}
+		}
+		return image;
+	}
+
+	/**
+	 * Creates an image descriptor from the given imageFilePath and adds the
+	 * image descriptor to the image descriptor registry. If an image
+	 * descriptor could not be created, the default "missing" image descriptor
+	 * is returned but not added to the image descriptor registry.
+	 * 
+	 * @param imageFilePath
+	 * @return ImageDescriptor image descriptor for imageFilePath or default
+	 *         "missing" image descriptor if resource could not be found
+	 */
+	private ImageDescriptor createImageDescriptor(String imageFilePath) {
+		ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGINID, imageFilePath);
+		if (imageDescriptor != null) {
+			getImageDescriptorRegistry().put(imageFilePath, imageDescriptor);
+		}
+		else {
+			imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
+		}
+
+		return imageDescriptor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorPluginImages.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorPluginImages.java
new file mode 100644
index 0000000..a35f00f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorPluginImages.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+/**
+ * Bundle of most images used by the XML Editor plug-in.
+ */
+public class XMLEditorPluginImages {
+	public static final String IMG_DTOOL_COLLAPSE = "icons/full/dtool16/collapse.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_COLLAPSE = "icons/full/etool16/collapse.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL_COLLAPSEALL = "icons/full/dtool16/collapse_all.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_COLLAPSEALL = "icons/full/etool16/collapse_all.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL_EXPAND = "icons/full/dtool16/expand.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_EXPAND = "icons/full/etool16/expand.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL_EXPANDALL = "icons/full/dtool16/expand_all.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_EXPANDALL = "icons/full/etool16/expand_all.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL_NEW_XML = "icons/full/dtool16/new_xml.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_NEW_XML = "icons/full/etool16/new_xml.gif"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorResources.properties b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorResources.properties
new file mode 100644
index 0000000..1943b11
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLEditorResources.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2004, 2009 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+XMLTableTreeViewer_0=Design
+XMLTableTreeViewer_1=Node
+XMLTableTreeViewer_2=Content
+XMLMultiPageEditorPart_0=Source
+XMLTreeExtension_0=Structure
+XMLTreeExtension_1=Value
+XMLTreeExtension_3=The document is empty.
+XMLTreeExtension_4=Right mouse click here to insert content.
+XMLTableTreeActionBarContributor_0=&XML
+XMLTableTreeActionBarContributor_1=&Expand All
+XMLTableTreeActionBarContributor_2=&Collapse All
+XMLTableTreeActionBarContributor_3=Turn Grammar Constraints Off
+XMLTableTreeActionBarContributor_4=&Turn Grammar Constraints Off
+XMLTableTreeActionBarContributor_5=Turn Grammar Constraints On
+XMLTableTreeActionBarContributor_6=&Turn Grammar Constraints On
+XMLTableTreeActionBarContributor_7=Reload Dependencies
+XMLTableTreeActionBarContributor_8=&Reload Dependencies
+##
+An_error_has_occurred_when1_ERROR_=An error has occurred when initializing the input for the the editor's source page.
+Resource__does_not_exist=Resource {0} does not exist.
+Editor_could_not_be_open=Editor could not be open on {0}
+TreeExtension_0=Cannot display document contents.
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorActionBarContributor.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorActionBarContributor.java
new file mode 100644
index 0000000..7d4ee4b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorActionBarContributor.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+
+
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
+
+
+public class XMLMultiPageEditorActionBarContributor extends SourceEditorActionBarContributor {
+
+	private boolean needsMultiInit = true;
+
+	public XMLMultiPageEditorActionBarContributor() {
+		super();
+	}
+
+	protected void initDesignViewerActionBarContributor(IActionBars actionBars) {
+		super.initDesignViewerActionBarContributor(actionBars);
+
+		if (designViewerActionBarContributor != null) {
+			if (designViewerActionBarContributor instanceof IDesignViewerActionBarContributor) {
+				((IDesignViewerActionBarContributor) designViewerActionBarContributor).initViewerSpecificContributions(actionBars);
+			}
+		}
+	}
+
+	protected void activateDesignPage(IEditorPart activeEditor) {
+		if ((sourceViewerActionContributor != null) && (sourceViewerActionContributor instanceof ISourceViewerActionBarContributor)) {
+			// if design page is not really an IEditorPart, activeEditor ==
+			// null, so pass in multiPageEditor instead (d282414)
+			if (activeEditor == null) {
+				sourceViewerActionContributor.setActiveEditor(multiPageEditor);
+			}
+			else {
+				sourceViewerActionContributor.setActiveEditor(activeEditor);
+			}
+			((ISourceViewerActionBarContributor) sourceViewerActionContributor).setViewerSpecificContributionsEnabled(false);
+		}
+
+		if ((designViewerActionBarContributor != null) && (designViewerActionBarContributor instanceof IDesignViewerActionBarContributor)) {
+			designViewerActionBarContributor.setActiveEditor(multiPageEditor);
+			((IDesignViewerActionBarContributor) designViewerActionBarContributor).setViewerSpecificContributionsEnabled(true);
+		}
+	}
+
+	protected void activateSourcePage(IEditorPart activeEditor) {
+		if ((designViewerActionBarContributor != null) && (designViewerActionBarContributor instanceof IDesignViewerActionBarContributor)) {
+			designViewerActionBarContributor.setActiveEditor(multiPageEditor);
+			((IDesignViewerActionBarContributor) designViewerActionBarContributor).setViewerSpecificContributionsEnabled(false);
+		}
+
+		if ((sourceViewerActionContributor != null) && (sourceViewerActionContributor instanceof ISourceViewerActionBarContributor)) {
+			sourceViewerActionContributor.setActiveEditor(activeEditor);
+			((ISourceViewerActionBarContributor) sourceViewerActionContributor).setViewerSpecificContributionsEnabled(true);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#init(org.eclipse.ui.IActionBars)
+	 */
+	public void init(IActionBars actionBars) {
+		super.init(actionBars);
+		needsMultiInit = true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(org.eclipse.ui.IEditorPart)
+	 */
+	public void setActiveEditor(IEditorPart targetEditor) {
+		if (needsMultiInit) {
+			designViewerActionBarContributor = new XMLTableTreeActionBarContributor();
+			initDesignViewerActionBarContributor(getActionBars());
+			needsMultiInit = false;
+		}
+		super.setActiveEditor(targetEditor);
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorPart.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorPart.java
new file mode 100644
index 0000000..57e8337
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorPart.java
@@ -0,0 +1,1060 @@
+/*****************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others. All rights reserved. This
+ * program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and
+ * is available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: IBM Corporation - initial API and implementation
+ ****************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.eclipse.ui.part.MultiPageSelectionProvider;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.xml.core.internal.provisional.IXMLPreferenceNames;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class XMLMultiPageEditorPart extends MultiPageEditorPart {
+
+	/**
+	 * Internal part activation listener, copied from AbstractTextEditor
+	 */
+	class ActivationListener implements IPartListener, IWindowListener {
+
+		/**
+		 * The maximum number of children the root nodes can have for the
+		 * design page to auto expand the root nodes
+		 */
+		private static final int MAX_NUM_CHILD_NODES_FOR_AUTO_EXPAND = 500;
+		
+		/** Cache of the active workbench part. */
+		private IWorkbenchPart fActivePart;
+		/** Indicates whether activation handling is currently be done. */
+		private boolean fIsHandlingActivation = false;
+		/**
+		 * The part service.
+		 * 
+		 * @since 3.1
+		 */
+		private IPartService fPartService;
+
+		/**
+		 * Creates this activation listener.
+		 * 
+		 * @param partService
+		 *            the part service on which to add the part listener
+		 * @since 3.1
+		 */
+		public ActivationListener(IPartService partService) {
+			fPartService = partService;
+			fPartService.addPartListener(this);
+			PlatformUI.getWorkbench().addWindowListener(this);
+		}
+
+		/**
+		 * Disposes this activation listener.
+		 * 
+		 * @since 3.1
+		 */
+		public void dispose() {
+			fPartService.removePartListener(this);
+			PlatformUI.getWorkbench().removeWindowListener(this);
+			fPartService = null;
+		}
+
+		/*
+		 * @see IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
+		 */
+		public void partActivated(IWorkbenchPart part) {
+			fActivePart = part;
+			handleActivation();
+		}
+
+		/*
+		 * @see IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
+		 */
+		public void partBroughtToTop(IWorkbenchPart part) {
+			// do nothing
+		}
+
+		/*
+		 * @see IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
+		 */
+		public void partClosed(IWorkbenchPart part) {
+			// do nothing
+		}
+
+		/*
+		 * @see IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
+		 */
+		public void partDeactivated(IWorkbenchPart part) {
+			fActivePart = null;
+		}
+
+		/*
+		 * @see IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
+		 */
+		public void partOpened(IWorkbenchPart part) {
+			if (fDesignViewer instanceof AbstractTreeViewer) {
+				IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+				try {
+					if (model instanceof IDOMModel) {
+						IDOMDocument modelDocument = ((IDOMModel) model).getDocument();
+						NodeList rootChildren = modelDocument.getChildNodes();
+
+						boolean tooManyChildren = (rootChildren.getLength() > MAX_NUM_CHILD_NODES_FOR_AUTO_EXPAND);
+						/*
+						 * For each root (there should really only be one
+						 * real root but there are also could be empty
+						 * text regions and doc type at the root level)
+						 * determine if it has to many children or not to
+						 * auto expand
+						 */
+						for (int i = 0; i < rootChildren.getLength() && !tooManyChildren; ++i) {
+							tooManyChildren = (rootChildren.item(i).getChildNodes().getLength() > MAX_NUM_CHILD_NODES_FOR_AUTO_EXPAND);
+						}
+
+						/*
+						 * if root node does not have to many children then
+						 * auto expand the root node
+						 */
+						if (!tooManyChildren) {
+							((AbstractTreeViewer) fDesignViewer).expandToLevel(2);
+						}
+					}
+				}
+				finally {
+					if (model != null) {
+						model.releaseFromRead();
+					}
+				}
+			}
+		}
+
+		/**
+		 * Handles the activation triggering a element state check in the
+		 * editor.
+		 */
+		void handleActivation() {
+			if (fIsHandlingActivation || (getTextEditor() == null)) {
+				return;
+			}
+
+			if (fActivePart == XMLMultiPageEditorPart.this) {
+				fIsHandlingActivation = true;
+				try {
+					getTextEditor().safelySanityCheckState(getEditorInput());
+				}
+				finally {
+					fIsHandlingActivation = false;
+				}
+			}
+		}
+
+		/*
+		 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
+		 * @since 3.1
+		 */
+		public void windowActivated(IWorkbenchWindow window) {
+			if (window == getEditorSite().getWorkbenchWindow()) {
+				/*
+				 * Workaround for problem described in
+				 * http://dev.eclipse.org/bugs/show_bug.cgi?id=11731 Will be
+				 * removed when SWT has solved the problem.
+				 */
+				window.getShell().getDisplay().asyncExec(new Runnable() {
+					public void run() {
+						handleActivation();
+					}
+				});
+			}
+		}
+
+		/*
+		 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
+		 * @since 3.1
+		 */
+		public void windowDeactivated(IWorkbenchWindow window) {
+			// do nothing
+		}
+
+		/*
+		 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
+		 * @since 3.1
+		 */
+		public void windowClosed(IWorkbenchWindow window) {
+			// do nothing
+		}
+
+		/*
+		 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
+		 * @since 3.1
+		 */
+		public void windowOpened(IWorkbenchWindow window) {
+			// do nothing
+		}
+	}
+
+	/**
+	 * Listens for selection from the source page, applying it to the design
+	 * viewer.
+	 */
+	private class TextEditorPostSelectionAdapter extends UIJob implements ISelectionChangedListener {
+		boolean forcePostSelection = false;
+		ISelection selection = null;
+
+		public TextEditorPostSelectionAdapter() {
+			super(getTitle());
+			setUser(true);
+		}
+
+		public IStatus runInUIThread(IProgressMonitor monitor) {
+			if (selection != null) {
+				fDesignViewer.getSelectionProvider().setSelection(selection);
+			}
+			return Status.OK_STATUS;
+		}
+
+		public void selectionChanged(SelectionChangedEvent event) {
+			if ((fDesignViewer != null) && ((getActivePage() != fDesignPageIndex) || !XMLMultiPageEditorPart.this.equals(getSite().getPage().getActivePart()))) {
+				if (forcePostSelection) {
+					selection = event.getSelection();
+					schedule(200);
+				}
+				else {
+					fDesignViewer.getSelectionProvider().setSelection(event.getSelection());
+				}
+			}
+		}
+	}
+
+	private class PageInitializationData {
+		IConfigurationElement fElement;
+		String fPropertyName;
+		Object fData;
+
+		PageInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
+			super();
+			fElement = cfig;
+			fPropertyName = propertyName;
+			fData = data;
+		}
+
+		void sendInitializationData(IExecutableExtension executableExtension) {
+			try {
+				executableExtension.setInitializationData(fElement, fPropertyName, fData);
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+	}
+
+	/**
+	 * Internal IPropertyListener on the source page
+	 */
+	class PropertyListener implements IPropertyListener {
+		public void propertyChanged(Object source, int propId) {
+			switch (propId) {
+				// had to implement input changed "listener" so that
+				// StructuredTextEditor could tell it containing editor that
+				// the input has change, when a 'resource moved' event is
+				// found.
+				case IEditorPart.PROP_INPUT : {
+					if (source == getTextEditor() && fDesignViewer instanceof XMLTableTreeViewer) {
+						IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+						try {
+							if (model instanceof IDOMModel) {
+								IDOMDocument modelDocument = ((IDOMModel) model).getDocument();
+								Object designInput = ((XMLTableTreeViewer) fDesignViewer).getInput();
+								if (modelDocument != designInput)
+									setInput(getTextEditor().getEditorInput());
+							}
+						}
+						finally {
+							if (model != null)
+								model.releaseFromRead();
+						}
+					}
+				}
+				case IEditorPart.PROP_DIRTY : {
+					if (source == getTextEditor()) {
+						if (getTextEditor().getEditorInput() != getEditorInput()) {
+							setInput(getTextEditor().getEditorInput());
+							/*
+							 * title should always change when input changes.
+							 * create runnable for following post call
+							 */
+							Runnable runnable = new Runnable() {
+								public void run() {
+									_firePropertyChange(IWorkbenchPart.PROP_TITLE);
+								}
+							};
+							/*
+							 * Update is just to post things on the display
+							 * queue (thread). We have to do this to get the
+							 * dirty property to get updated after other
+							 * things on the queue are executed.
+							 */
+							((Control) getTextEditor().getAdapter(Control.class)).getDisplay().asyncExec(runnable);
+						}
+					}
+					break;
+				}
+				case IWorkbenchPart.PROP_TITLE : {
+					// update the input if the title is changed
+					if (source == getTextEditor()) {
+						if (getTextEditor().getEditorInput() != getEditorInput()) {
+							setInput(getTextEditor().getEditorInput());
+						}
+					}
+					break;
+				}
+				default : {
+					// propagate changes. Is this needed? Answer: Yes.
+					if (source == getTextEditor()) {
+						_firePropertyChange(propId);
+					}
+					break;
+				}
+			}
+
+		}
+	}
+
+	class TextInputListener implements ITextInputListener {
+		public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+			// do nothing
+		}
+
+		public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+			if ((fDesignViewer != null) && (newInput != null)) {
+				fDesignViewer.setDocument(newInput);
+			}
+		}
+	}
+
+	class StatusLineLabelProvider extends JFaceNodeLabelProvider {
+		public StatusLineLabelProvider() {
+		}
+
+		public String getText(Object element) {
+			if (element == null)
+				return null;
+
+			Node node = (Node) element;
+			if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+				return getText(((Attr) node).getOwnerElement());
+			}
+
+			StringBuffer s = new StringBuffer();
+			if (node.getNodeType() != Node.DOCUMENT_NODE) {
+				while (node != null && node instanceof INodeNotifier) {
+					INodeNotifier notifier = (INodeNotifier) node;
+					if (node.getNodeType() != Node.DOCUMENT_NODE) {
+						IJFaceNodeAdapter adapter = (IJFaceNodeAdapter) notifier.getAdapterFor(IJFaceNodeAdapter.class);
+						if (adapter != null) {
+							s.insert(0, adapter.getLabelText(node));
+						}
+					}
+					node = node.getParentNode();
+					if (node != null && node.getNodeType() != Node.DOCUMENT_NODE)
+						s.insert(0, IPath.SEPARATOR);
+				}
+			}
+			return s.toString();
+		}
+
+		public Image getImage(Object element) {
+			if (element == null)
+				return null;
+
+			Node node = (Node) element;
+			if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+				return getImage(((Attr) node).getOwnerElement());
+			}
+			return super.getImage(element);
+		}
+	}
+
+	/** The design page index. */
+	private int fDesignPageIndex;
+
+	/** The design viewer */
+	IDesignViewer fDesignViewer;
+	/** Any container for the design viewer */
+	private Composite fDesignContainer;
+
+	private ActivationListener fActivationListener;
+
+	IPropertyListener fPropertyListener = null;
+
+	/** The source page index. */
+	int fSourcePageIndex;
+
+	/** The text editor. */
+	private StructuredTextEditor fTextEditor;
+
+	private TextEditorPostSelectionAdapter fTextEditorSelectionListener;
+
+	private ILabelProvider fStatusLineLabelProvider;
+
+	private PageInitializationData fPageInitializer;
+	
+	private ToolBarManager fToolbarManager;
+
+	private boolean fAllocateToolbar = true;
+	
+	/**
+	 * StructuredTextMultiPageEditorPart constructor comment.
+	 */
+	public XMLMultiPageEditorPart() {
+		super();
+		fStatusLineLabelProvider = new StatusLineLabelProvider();
+	}
+
+	/*
+	 * This method is just to make firePropertyChanged accessible from some
+	 * (anonomous) inner classes.
+	 */
+	void _firePropertyChange(int property) {
+		super.firePropertyChange(property);
+	}
+
+	/**
+	 * Adds the source page of the multi-page editor.
+	 */
+	private void addSourcePage() throws PartInitException {
+		fSourcePageIndex = addPage(fTextEditor, getEditorInput());
+		setPageText(fSourcePageIndex, XMLEditorMessages.XMLMultiPageEditorPart_0);
+
+		firePropertyChange(PROP_TITLE);
+
+		// Changes to the Text Viewer's document instance should also
+		// force an
+		// input refresh
+		fTextEditor.getTextViewer().addTextInputListener(new TextInputListener());
+	}
+
+	/**
+	 * Connects the design viewer with the viewer selection manager. Should be
+	 * done after createSourcePage() is done because we need to get the
+	 * ViewerSelectionManager from the TextEditor. setModel is also done here
+	 * because getModel() needs to reference the TextEditor.
+	 */
+	private void connectDesignPage() {
+		if (fDesignViewer != null) {
+			fDesignViewer.setDocument(getDocument());
+		}
+
+		/*
+		 * Connect selection from the Design page to the selection provider
+		 * for the XMLMultiPageEditorPart so that selection changes in the
+		 * Design page will propagate across the workbench
+		 */
+		if (fDesignViewer.getSelectionProvider() instanceof IPostSelectionProvider) {
+			((IPostSelectionProvider) fDesignViewer.getSelectionProvider()).addPostSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					((MultiPageSelectionProvider) getSite().getSelectionProvider()).firePostSelectionChanged(event);
+				}
+			});
+		}
+		fDesignViewer.getSelectionProvider().addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				((MultiPageSelectionProvider) getSite().getSelectionProvider()).fireSelectionChanged(event);
+			}
+		});
+
+		/*
+		 * Connect selection from the Design page to the selection provider of
+		 * the Source page so that selection in the Design page will drive
+		 * selection in the Source page. Prefer post selection.
+		 */
+		if (fDesignViewer.getSelectionProvider() instanceof IPostSelectionProvider) {
+			((IPostSelectionProvider) fDesignViewer.getSelectionProvider()).addPostSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(final SelectionChangedEvent event) {
+					/*
+					 * Only force selection update if source page is not
+					 * active
+					 */
+					if (getActivePage() != fSourcePageIndex) {
+						getTextEditor().getSelectionProvider().setSelection(event.getSelection());
+					}
+				}
+			});
+		}
+		else {
+			fDesignViewer.getSelectionProvider().addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					/*
+					 * Only force selection update if source page is not
+					 * active
+					 */
+					if (getActivePage() != fSourcePageIndex) {
+						getTextEditor().getSelectionProvider().setSelection(event.getSelection());
+					}
+					/*
+					 * Bug 210481 - Removed call to updateStatusLine because
+					 * this is already handled by the selection in the source
+					 * page
+					 */
+				}
+			});
+		}
+
+		/*
+		 * Handle double-click in the Design page by selecting the
+		 * corresponding amount of text in the Source page.
+		 * 
+		 * Warning: This implies more knowledge of the design viewer's underlying
+		 * Control than expressed in the IDesignViewer interface
+		 */
+		fDesignViewer.getControl().addListener(SWT.MouseDoubleClick, new Listener() {
+			public void handleEvent(Event event) {
+				ISelection selection = fDesignViewer.getSelectionProvider().getSelection();
+				int start = -1;
+				int length = -1;
+				if (selection instanceof IStructuredSelection) {
+					/*
+					 * selection goes from the start of the first object to
+					 * the end of the last
+					 */
+					IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+					Object o = structuredSelection.getFirstElement();
+					Object o2 = null;
+					if (structuredSelection.size() > 1) {
+						o2 = structuredSelection.toArray()[structuredSelection.size() - 1];
+					}
+					else {
+						o2 = o;
+					}
+					if (o instanceof IndexedRegion) {
+						start = ((IndexedRegion) o).getStartOffset();
+						length = ((IndexedRegion) o2).getEndOffset() - start;
+					}
+					else if (o2 instanceof ITextRegion) {
+						start = ((ITextRegion) o).getStart();
+						length = ((ITextRegion) o2).getEnd() - start;
+					}
+				}
+				else if (selection instanceof ITextSelection) {
+					start = ((ITextSelection) selection).getOffset();
+					length = ((ITextSelection) selection).getLength();
+				}
+				if ((start > -1) && (length > -1)) {
+					getTextEditor().selectAndReveal(start, length);
+				}
+			}
+		});
+
+		/*
+		 * Connect selection from the Source page to the selection provider of
+		 * the Design page so that selection in the Source page will drive
+		 * selection in the Design page. Prefer post selection.
+		 */
+		ISelectionProvider provider = getTextEditor().getSelectionProvider();
+		if (fTextEditorSelectionListener == null) {
+			fTextEditorSelectionListener = new TextEditorPostSelectionAdapter();
+		}
+		if (provider instanceof IPostSelectionProvider) {
+			fTextEditorSelectionListener.forcePostSelection = false;
+			((IPostSelectionProvider) provider).addPostSelectionChangedListener(fTextEditorSelectionListener);
+		}
+		else {
+			fTextEditorSelectionListener.forcePostSelection = true;
+			provider.addSelectionChangedListener(fTextEditorSelectionListener);
+		}
+	}
+
+	/**
+	 * Create and Add the Design Page using a registered factory
+	 * 
+	 */
+	private void createAndAddDesignPage() {
+		IDesignViewer designViewer = createDesignPage();
+
+		fDesignViewer = designViewer;
+		// note: By adding the design page as a Control instead of an
+		// IEditorPart, page switches will indicate
+		// a "null" active editor when the design page is made active
+		if (fDesignContainer != null)
+			fDesignPageIndex = addPage(fDesignContainer);
+		else
+			fDesignPageIndex = addPage(designViewer.getControl());
+			
+		setPageText(fDesignPageIndex, designViewer.getTitle());
+	}
+
+	protected IDesignViewer createDesignPage() {		
+		Composite container = getDesignContainer(getContainer());
+
+		XMLTableTreeViewer tableTreeViewer = new XMLTableTreeViewer(container);
+		tableTreeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+		// Set the default info-pop for XML design viewer.
+		XMLUIPlugin.getInstance().getWorkbench().getHelpSystem().setHelp(tableTreeViewer.getControl(), XMLTableTreeHelpContextIds.XML_DESIGN_VIEW_HELPID);
+
+		// Toolbar wasn't allocated
+		if (fToolbarManager != null) {
+			addToolBarActions(tableTreeViewer);
+		}
+		return tableTreeViewer;
+	}
+
+	protected Composite getDesignContainer(Composite defaultContainer) {
+		Composite container = defaultContainer;
+		// create a container to hold the toolbar if it should be created
+		if (fAllocateToolbar) {
+			container = new Composite(defaultContainer, SWT.NONE);
+			GridLayout layout = new GridLayout();
+			layout.marginHeight = 0;
+			layout.verticalSpacing = 0;
+			layout.marginWidth = 0;
+			container.setLayout(layout);
+	
+			ToolBar tb = new ToolBar(container, SWT.FLAT);
+			fToolbarManager = new ToolBarManager(tb);
+			tb.setLayoutData(new GridData(GridData.END, GridData.VERTICAL_ALIGN_BEGINNING, true, false));
+			fDesignContainer = container;
+		}
+		return container;
+	}
+
+	private void addToolBarActions(IDesignViewer viewer) {
+		if (viewer instanceof AbstractTreeViewer) {
+			ViewerExpandCollapseAction expand = new ViewerExpandCollapseAction(true);
+			ViewerExpandCollapseAction collapse = new ViewerExpandCollapseAction(false);
+			fToolbarManager.add(expand);
+			fToolbarManager.add(collapse);
+			fToolbarManager.update(true);
+	
+	
+			expand.setViewer((AbstractTreeViewer) viewer);
+			collapse.setViewer((AbstractTreeViewer) viewer);
+		}
+	}
+
+	/**
+	 * Creates the pages of this multi-page editor.
+	 * <p>
+	 * Subclasses of <code>MultiPageEditor</code> must implement this method.
+	 * </p>
+	 */
+	protected void createPages() {
+		try {
+			// source page MUST be created before design page, now
+			createSourcePage();
+
+			createAndAddDesignPage();
+			addSourcePage();
+			connectDesignPage();
+
+			// set the active editor in the action bar contributor first
+			// before setactivepage calls action bar contributor's
+			// setactivepage (bug141013 - remove when bug151488 is fixed)
+			IEditorActionBarContributor contributor = getEditorSite().getActionBarContributor();
+			if (contributor instanceof MultiPageEditorActionBarContributor) {
+				((MultiPageEditorActionBarContributor) contributor).setActiveEditor(this);
+			}
+
+			int activePageIndex = getPreferenceStore().getInt(IXMLPreferenceNames.LAST_ACTIVE_PAGE);
+			if ((activePageIndex >= 0) && (activePageIndex < getPageCount())) {
+				setActivePage(activePageIndex);
+			}
+			else {
+				setActivePage(fSourcePageIndex);
+			}
+		}
+		catch (PartInitException e) {
+			Logger.logException(e);
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart)
+	 */
+	protected IEditorSite createSite(IEditorPart editor) {
+		IEditorSite site = null;
+		if (editor == fTextEditor) {
+			site = new MultiPageEditorSite(this, editor) {
+				/**
+				 * @see org.eclipse.ui.part.MultiPageEditorSite#getActionBarContributor()
+				 */
+				public IEditorActionBarContributor getActionBarContributor() {
+					IEditorActionBarContributor contributor = super.getActionBarContributor();
+					IEditorActionBarContributor multiContributor = XMLMultiPageEditorPart.this.getEditorSite().getActionBarContributor();
+					if (multiContributor instanceof XMLMultiPageEditorActionBarContributor) {
+						contributor = ((XMLMultiPageEditorActionBarContributor) multiContributor).sourceViewerActionContributor;
+					}
+					return contributor;
+				}
+
+				public String getId() {
+					// sets this id so nested editor is considered xml source
+					// page
+					return ContentTypeIdForXML.ContentTypeID_XML + ".source"; //$NON-NLS-1$;
+				}
+			};
+		}
+		else {
+			site = super.createSite(editor);
+		}
+		return site;
+	}
+
+	/**
+	 * Creates the source page of the multi-page editor.
+	 */
+	protected void createSourcePage() throws PartInitException {
+		fTextEditor = createTextEditor();
+		fTextEditor.setEditorPart(this);
+
+		/*
+		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=134301 - XML editor
+		 * does not remember font settings
+		 * 
+		 * @see
+		 * org.eclipse.ui.texteditor.AbstractTextEditor#getSymbolicFontName()
+		 */
+		fPageInitializer.sendInitializationData(fTextEditor);
+
+		if (fPropertyListener == null) {
+			fPropertyListener = new PropertyListener();
+		}
+		fTextEditor.addPropertyListener(fPropertyListener);
+	}
+
+	/**
+	 * Method createTextEditor.
+	 * 
+	 * @return StructuredTextEditor
+	 */
+	private StructuredTextEditor createTextEditor() {
+		return new StructuredTextEditor();
+	}
+
+	private void disconnectDesignPage() {
+		if (fDesignViewer != null) {
+			fDesignViewer.setDocument(null);
+		}
+	}
+
+	public void dispose() {
+		Logger.trace("Source Editor", "XMLMultiPageEditorPart::dispose entry"); //$NON-NLS-1$ //$NON-NLS-2$
+
+		disconnectDesignPage();
+
+		if (fActivationListener != null) {
+			fActivationListener.dispose();
+			fActivationListener = null;
+		}
+
+		if ((fTextEditor != null) && (fPropertyListener != null)) {
+			fTextEditor.removePropertyListener(fPropertyListener);
+		}
+		
+		// moved to last when added window ... seems like
+		// we'd be in danger of losing some data, like site,
+		// or something.
+		super.dispose();
+
+		Logger.trace("Source Editor", "StructuredTextMultiPageEditorPart::dispose exit"); //$NON-NLS-1$ //$NON-NLS-2$
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void doSave(IProgressMonitor monitor) {
+		fTextEditor.doSave(monitor);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
+	 */
+	public void doSaveAs() {
+		fTextEditor.doSaveAs();
+		/*
+		 * Update the design viewer since the editor input would have changed
+		 * to the new file.
+		 */
+		if (fDesignViewer != null) {
+			fDesignViewer.setDocument(getDocument());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class key) {
+		Object result = null;
+
+		// we extend superclass, not override it, so allow it first
+		// chance to satisfy request.
+		result = super.getAdapter(key);
+
+		if (result == null) {
+			if (key == IDesignViewer.class) {
+				result = fDesignViewer;
+
+			}
+			else if (key.equals(IGotoMarker.class)) {
+				result = new IGotoMarker() {
+					public void gotoMarker(IMarker marker) {
+						XMLMultiPageEditorPart.this.gotoMarker(marker);
+					}
+				};
+			}
+			else {
+				/*
+				 * DMW: I'm bullet-proofing this because its been reported (on
+				 * very early versions) a null pointer sometimes happens here
+				 * on startup, when an editor has been left open when
+				 * workbench shutdown.
+				 */
+				if (fTextEditor != null) {
+					result = fTextEditor.getAdapter(key);
+				}
+			}
+		}
+		return result;
+	}
+
+	private IDocument getDocument() {
+		IDocument document = null;
+		if (fTextEditor != null) {
+			document = fTextEditor.getDocumentProvider().getDocument(fTextEditor.getEditorInput());
+		}
+		return document;
+	}
+
+	private IPreferenceStore getPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	StructuredTextEditor getTextEditor() {
+		return fTextEditor;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPart#getTitle()
+	 */
+	public String getTitle() {
+		String title = null;
+		if (getTextEditor() == null) {
+			if (getEditorInput() != null) {
+				title = getEditorInput().getName();
+			}
+		}
+		else {
+			title = getTextEditor().getTitle();
+		}
+		if (title == null) {
+			title = getPartName();
+		}
+		return title;
+	}
+
+	void gotoMarker(IMarker marker) {
+		setActivePage(fSourcePageIndex);
+		IDE.gotoMarker(fTextEditor, marker);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite,
+	 * org.eclipse.ui.IEditorInput)
+	 */
+	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+		try {
+			super.init(site, input);
+			// we want to listen for our own activation
+			fActivationListener = new ActivationListener(site.getWorkbenchWindow().getPartService());
+		}
+		catch (Exception e) {
+			Logger.logException("exception initializing " + getClass().getName(), e); //$NON-NLS-1$
+		}
+		setPartName(input.getName());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
+	 */
+	public boolean isSaveAsAllowed() {
+		return (fTextEditor != null) && fTextEditor.isSaveAsAllowed();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
+	 */
+	public boolean isSaveOnCloseNeeded() {
+		// overriding super class since it does a lowly isDirty!
+		if (fTextEditor != null) {
+			return fTextEditor.isSaveOnCloseNeeded();
+		}
+		return isDirty();
+	}
+	
+	/**
+	 * Prevents the creation of the in-editor toolbar, if called before
+	 * createPageContainer() during editor initialization.
+	 */
+	protected final void noToolbar() {
+		fAllocateToolbar = false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int)
+	 */
+	protected void pageChange(int newPageIndex) {
+		super.pageChange(newPageIndex);
+		saveLastActivePageIndex(newPageIndex);
+
+		if (newPageIndex == fDesignPageIndex) {
+			// design page isn't an IEditorPart, therefore we have to send
+			// selection changes ourselves
+			ISelectionProvider selectionProvider = fDesignViewer.getSelectionProvider();
+			if (selectionProvider != null) {
+				SelectionChangedEvent event = new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection());
+				((MultiPageSelectionProvider) getSite().getSelectionProvider()).fireSelectionChanged(event);
+				((MultiPageSelectionProvider) getSite().getSelectionProvider()).firePostSelectionChanged(event);
+			}
+		}
+	}
+
+	private void saveLastActivePageIndex(int newPageIndex) {
+		// save the last active page index to preference manager
+		getPreferenceStore().setValue(IXMLPreferenceNames.LAST_ACTIVE_PAGE, newPageIndex);
+	}
+
+	public void setFocus() {
+		super.setFocus();
+		Control control = fDesignViewer.getControl();
+		control.setFocus();
+		// 271382 - Focus not set properly after activating XML editor
+		control.forceFocus();
+	}
+
+	public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
+		super.setInitializationData(cfig, propertyName, data);
+		fPageInitializer = new PageInitializationData(cfig, propertyName, data);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
+	 */
+	protected void setInput(IEditorInput input) {
+		/*
+		 * If driven from the Source page, it's "model" may not be up to date
+		 * with (or even exist for) the input just yet. Later notification
+		 * from the TextViewer could set us straight, although it's not
+		 * guaranteed to happen after the model has been created.
+		 */
+		super.setInput(input);
+		if (fDesignViewer != null) {
+			fDesignViewer.setDocument(getDocument());
+		}
+		setPartName(input.getName());
+	}
+
+	void updateStatusLine(ISelection selection) {
+		IStatusLineManager statusLineManager = getEditorSite().getActionBars().getStatusLineManager();
+		if (fStatusLineLabelProvider != null && statusLineManager != null) {
+			String text = null;
+			Image image = null;
+			if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
+				Object firstElement = ((IStructuredSelection) selection).getFirstElement();
+				if (firstElement != null) {
+					text = fStatusLineLabelProvider.getText(firstElement);
+					image = fStatusLineLabelProvider.getImage((firstElement));
+				}
+			}
+			if (image == null) {
+				statusLineManager.setMessage(text);
+			}
+			else {
+				statusLineManager.setMessage(image, text);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeActionBarContributor.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeActionBarContributor.java
new file mode 100644
index 0000000..4af5032
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeActionBarContributor.java
@@ -0,0 +1,321 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Carver - bug 212330 - migrate to org.eclipse.ui.menus extension point
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.CMDocumentLoader;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.InferredGrammarBuildingCMDocumentLoader;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.ui.internal.util.SharedXMLEditorPluginImageHelper;
+import org.w3c.dom.Document;
+
+/**
+ * 
+ */
+public class XMLTableTreeActionBarContributor implements IDesignViewerActionBarContributor {
+
+	protected IEditorPart editorPart;
+	protected final static String DESIGN_VIEWER_SEPARATOR_1_ID = "sed.tabletree.separator.1"; //$NON-NLS-1$
+	protected final static String DESIGN_VIEWER_SEPARATOR_2_ID = "sed.tabletree.separator.2"; //$NON-NLS-1$
+	protected final static String VALIDATE_XML_ID = "sed.tabletree.validateXML"; //$NON-NLS-1$
+	protected final static String RELOAD_GRAMMAR_ID = "sed.tabletree.reloadGrammar"; //$NON-NLS-1$
+	protected final static String TOGGLE_EDIT_MODE_ID = "sed.tabletree.toggleEditMode"; //$NON-NLS-1$
+	protected final static String EXPAND_ALL_ID = "sed.tabletree.expandAll"; //$NON-NLS-1$
+	protected final static String COLLAPSE_ALL_ID = "sed.tabletree.collapseAll"; //$NON-NLS-1$
+
+	protected ToggleEditModeAction toggleAction;
+	protected ReloadGrammarAction reloadGrammarAction;
+	// protected ValidateXMLAction validateXMLAction;
+	protected ViewerExpandCollapseAction expandAction;
+	protected ViewerExpandCollapseAction collapseAction;
+	protected ViewerExpandCollapseAction xmlMenuExpandAction;
+	protected ViewerExpandCollapseAction xmlMenuCollapseAction;
+
+	public XMLTableTreeActionBarContributor() {
+	}
+
+	protected void removeContributions(IContributionManager manager) {
+/*		try {
+			doRemove(manager, DESIGN_VIEWER_SEPARATOR_1_ID);
+			doRemove(manager, DESIGN_VIEWER_SEPARATOR_2_ID);
+			doRemove(manager, VALIDATE_XML_ID);
+			doRemove(manager, RELOAD_GRAMMAR_ID);
+			doRemove(manager, TOGGLE_EDIT_MODE_ID);
+			doRemove(manager, EXPAND_ALL_ID);
+			doRemove(manager, COLLAPSE_ALL_ID);
+		}
+		catch (Exception e) {
+		}
+*/		
+	}
+
+	protected void doRemove(IContributionManager manager, String id) {
+/*		try {
+			if (manager.find(id) != null) {
+				manager.remove(id);
+			}
+		}
+		catch (Exception e) {
+		}
+*/	}
+
+	public void init(IActionBars bars, IWorkbenchPage page) {
+		init(bars);
+	}
+
+	public void init(IActionBars bars) {
+//		IToolBarManager tbm = bars.getToolBarManager();
+
+/*		IMenuManager xmlMenu = bars.getMenuManager().findMenuUsingPath("org.eclipse.core.runtime.xml.design.xmlmenu"); //$NON-NLS-1$
+
+		if (xmlMenu == null) {
+			xmlMenu = new MenuManager(XMLEditorMessages.XMLTableTreeActionBarContributor_0, "org.eclipse.core.runtime.xml.design.xmlmenu"); //$NON-NLS-1$
+			// For RCP usage
+			if (bars.getMenuManager().find(IWorkbenchActionConstants.M_WINDOW) != null) {
+				bars.getMenuManager().insertBefore(IWorkbenchActionConstants.M_WINDOW, xmlMenu);
+			}
+		}
+		else {
+			removeContributions(xmlMenu);
+		}
+
+		tbm.add(new Separator("DESIGN_VIEWER_SEPARATOR_1_ID")); //$NON-NLS-1$
+*/
+		// ToggleEditModeAction
+		//           
+/*		toggleAction = new ToggleEditModeAction();
+		toggleAction.setId(TOGGLE_EDIT_MODE_ID);
+		xmlMenu.add(toggleAction);
+		tbm.add(toggleAction);
+*/
+		// ReloadGrammarAction
+		//
+/*		reloadGrammarAction = new ReloadGrammarAction();
+		reloadGrammarAction.setId(RELOAD_GRAMMAR_ID);
+		tbm.add(reloadGrammarAction);
+		xmlMenu.add(reloadGrammarAction);
+
+		xmlMenu.add(new Separator());
+*/
+		// ExpandCollapseAction
+		//
+/*		xmlMenuExpandAction = new ViewerExpandCollapseAction(true);
+		xmlMenuExpandAction.setId(EXPAND_ALL_ID);
+		xmlMenuExpandAction.setText(XMLEditorMessages.XMLTableTreeActionBarContributor_1);
+		xmlMenu.add(xmlMenuExpandAction);
+
+		xmlMenuCollapseAction = new ViewerExpandCollapseAction(false);
+		xmlMenuCollapseAction.setId(COLLAPSE_ALL_ID);
+		xmlMenuCollapseAction.setId(EXPAND_ALL_ID);
+		xmlMenuCollapseAction.setText(XMLEditorMessages.XMLTableTreeActionBarContributor_2);
+		xmlMenu.add(xmlMenuCollapseAction);
+*/		
+	}
+
+	protected void addActionWithId(IMenuManager menuManager, Action action, String id) {
+		action.setId(id);
+		menuManager.add(action);
+	}
+
+	public void initViewerSpecificContributions(IActionBars bars) {
+/*		IToolBarManager tbm = bars.getToolBarManager();
+		tbm.add(new Separator(DESIGN_VIEWER_SEPARATOR_2_ID));
+
+		expandAction = new ViewerExpandCollapseAction(true);
+		expandAction.setId(EXPAND_ALL_ID);
+		tbm.add(expandAction);
+
+		collapseAction = new ViewerExpandCollapseAction(false);
+		collapseAction.setId(COLLAPSE_ALL_ID);
+		tbm.add(collapseAction);
+*/		
+	}
+
+	public void setViewerSpecificContributionsEnabled(boolean enabled) {
+/*		if (expandAction != null) {
+			expandAction.setEnabled(enabled);
+			xmlMenuExpandAction.setEnabled(enabled);
+		}
+
+		if (collapseAction != null) {
+			collapseAction.setEnabled(enabled);
+			xmlMenuCollapseAction.setEnabled(enabled);
+		}
+*/		
+	}
+
+	public void setActiveEditor(IEditorPart targetEditor) {
+		editorPart = targetEditor;
+
+//		IStructuredModel model = getModelForEditorPart(targetEditor);
+/*		reloadGrammarAction.setModel(model);
+		toggleAction.setModelQuery(ModelQueryUtil.getModelQuery(model));
+
+		XMLTableTreeViewer tableTreeViewer = getTableTreeViewerForEditorPart(editorPart);
+		if (tableTreeViewer != null) {
+			expandAction.setViewer(tableTreeViewer);
+			collapseAction.setViewer(tableTreeViewer);
+
+			xmlMenuExpandAction.setViewer(tableTreeViewer);
+			xmlMenuCollapseAction.setViewer(tableTreeViewer);
+		}
+*/
+		if (editorPart instanceof XMLMultiPageEditorPart) {
+			IWorkbenchPartSite site = editorPart.getSite();
+			if (site instanceof IEditorSite) {
+				ITextEditor textEditor = ((XMLMultiPageEditorPart) editorPart).getTextEditor();
+				IActionBars actionBars = ((IEditorSite) site).getActionBars();
+				actionBars.setGlobalActionHandler(ITextEditorActionConstants.UNDO, getAction(textEditor, ITextEditorActionConstants.UNDO));
+				actionBars.setGlobalActionHandler(ITextEditorActionConstants.REDO, getAction(textEditor, ITextEditorActionConstants.REDO));
+			}
+		}
+
+		// TODO... uncomment this and investigate NPE
+		//
+		// add the cut/copy/paste for text fields
+		// ActionHandlerPlugin.connectPart(editorPart);
+	}
+
+	protected final IAction getAction(ITextEditor editor, String actionId) {
+		return (editor == null ? null : editor.getAction(actionId));
+	}
+
+	/**
+	 * @deprecated - not to be used
+	 */
+	protected IStructuredModel getModelForEditorPart(IEditorPart targetEditor) {
+		IStructuredModel result = null;
+		if (editorPart instanceof XMLMultiPageEditorPart) {
+			StructuredTextEditor textEditor = ((XMLMultiPageEditorPart) targetEditor).getTextEditor();
+			result = (textEditor != null) ? textEditor.getModel() : null;
+		}
+		return result;
+	}
+
+	/**
+	 * @deprecated - not to be used
+	 */
+	protected XMLTableTreeViewer getTableTreeViewerForEditorPart(IEditorPart targetEditor) {
+		XMLTableTreeViewer result = null;
+		Object object = targetEditor.getAdapter(IDesignViewer.class);
+		if (object instanceof XMLTableTreeViewer) {
+			result = (XMLTableTreeViewer) object;
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	public class ToggleEditModeAction extends Action {
+		protected ImageDescriptor onImage = SharedXMLEditorPluginImageHelper.getImageDescriptor(SharedXMLEditorPluginImageHelper.IMG_ETOOL_CONSTRAINON);
+		protected ImageDescriptor offImage = SharedXMLEditorPluginImageHelper.getImageDescriptor(SharedXMLEditorPluginImageHelper.IMG_ETOOL_CONSTRAINOFF);
+		protected ModelQuery modelQuery;
+
+		public ToggleEditModeAction() {
+			setAppearanceForEditMode(ModelQuery.EDIT_MODE_CONSTRAINED_STRICT);
+		}
+
+		public void run() {
+			if (modelQuery != null) {
+				int newState = getNextState(modelQuery.getEditMode());
+				modelQuery.setEditMode(newState);
+				setAppearanceForEditMode(newState);
+			}
+		}
+
+		public void setModelQuery(ModelQuery newModelQuery) {
+			modelQuery = newModelQuery;
+			if (modelQuery != null) {
+				setAppearanceForEditMode(modelQuery.getEditMode());
+			}
+		}
+
+		public void setAppearanceForEditMode(int editMode) {
+			if (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) {
+				setToolTipText(XMLEditorMessages.XMLTableTreeActionBarContributor_3);
+				setText(XMLEditorMessages.XMLTableTreeActionBarContributor_4);
+				setImageDescriptor(onImage);
+			}
+			else {
+				setToolTipText(XMLEditorMessages.XMLTableTreeActionBarContributor_5);
+				setText(XMLEditorMessages.XMLTableTreeActionBarContributor_6);
+				setImageDescriptor(offImage);
+			}
+		}
+
+		public int getNextState(int editMode) {
+			int result = -1;
+			if (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) {
+				result = ModelQuery.EDIT_MODE_UNCONSTRAINED;
+			}
+			else {
+				result = ModelQuery.EDIT_MODE_CONSTRAINED_STRICT;
+			}
+			return result;
+		}
+	}
+
+	/**
+	 * 
+	 */
+	public class ReloadGrammarAction extends Action {
+		protected IStructuredModel model;
+
+		public ReloadGrammarAction() {
+			setDisabledImageDescriptor(SharedXMLEditorPluginImageHelper.getImageDescriptor(SharedXMLEditorPluginImageHelper.IMG_DTOOL_RLDGRMR));
+			setImageDescriptor(SharedXMLEditorPluginImageHelper.getImageDescriptor(SharedXMLEditorPluginImageHelper.IMG_ETOOL_RLDGRMR));
+			setToolTipText(XMLEditorMessages.XMLTableTreeActionBarContributor_7);
+			setText(XMLEditorMessages.XMLTableTreeActionBarContributor_8);
+		}
+
+		public void setModel(IStructuredModel newModel) {
+			this.model = newModel;
+		}
+
+		public void run() {
+			if (model != null) {
+				ModelQuery modelQuery = ModelQueryUtil.getModelQuery(model);
+				Document document = ((IDOMModel) model).getDocument();
+				if ((modelQuery != null) && (modelQuery.getCMDocumentManager() != null)) {
+					modelQuery.getCMDocumentManager().getCMDocumentCache().clear();
+					// TODO... need to figure out how to access the
+					// DOMObserver via ModelQuery
+					// ...why?
+					CMDocumentLoader loader = new InferredGrammarBuildingCMDocumentLoader(document, modelQuery);
+					loader.loadCMDocuments();
+				}
+			}
+		}
+	}
+
+	/**
+	 * @see org.eclipse.ui.IEditorActionBarContributor#dispose()
+	 */
+	public void dispose() {
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeContentProvider.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeContentProvider.java
new file mode 100644
index 0000000..95125b6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeContentProvider.java
@@ -0,0 +1,381 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableColorProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapterFactory;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManagerListener;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDescriptionBuilder;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.util.SharedXMLEditorPluginImageHelper;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
+
+
+public class XMLTableTreeContentProvider implements ITreeContentProvider, ITableLabelProvider, ITableColorProvider, ILabelProvider, CMDocumentManagerListener {
+
+	protected CMDocumentManager documentManager;
+
+	StructuredViewer fViewer = null;
+
+	private TreeContentHelper treeContentHelper = new TreeContentHelper();
+
+	private CMDescriptionBuilder descriptionBuilder = new CMDescriptionBuilder();
+
+	private Color fCMColor = null;
+
+	public XMLTableTreeContentProvider() {
+		super();
+	}
+
+	//
+	// ILabelProvider stuff
+	//
+	public void addListener(ILabelProviderListener listener) {
+		// since we always return 'false' for "isLabelProperty",
+		// not need to listen. Maybe that should change some day?
+	}
+
+	// CMDocumentManagerListener
+	//
+	public void cacheCleared(CMDocumentCache cache) {
+		doDelayedRefreshForViewers();
+	}
+
+	public void cacheUpdated(CMDocumentCache cache, final String uri, int oldStatus, int newStatus, CMDocument cmDocument) {
+		if ((newStatus == CMDocumentCache.STATUS_LOADED) || (newStatus == CMDocumentCache.STATUS_ERROR)) {
+			doDelayedRefreshForViewers();
+		}
+	}
+
+	public void dispose() {
+		if (documentManager != null) {
+			documentManager.removeListener(this);
+		}
+		if (fViewer != null && fViewer.getInput() != null) {
+			if (fViewer.getInput() instanceof IDOMNode) {
+				IJFaceNodeAdapterFactory factory = (IJFaceNodeAdapterFactory) ((IDOMNode) fViewer.getInput()).getModel().getFactoryRegistry().getFactoryFor(IJFaceNodeAdapter.class);
+				if (factory != null) {
+					factory.removeListener(fViewer);
+				}
+			}
+		}
+		if (fCMColor != null) {
+			fCMColor.dispose();
+		}
+	}
+
+	private void doDelayedRefreshForViewers() {
+		if ((fViewer != null) && !fViewer.getControl().isDisposed()) {
+			fViewer.getControl().getDisplay().asyncExec(new Runnable() {
+				public void run() {
+					if ((fViewer != null) && !fViewer.getControl().isDisposed()) {
+						fViewer.refresh(true);
+					}
+				}
+			});
+		}
+	}
+
+	public Object[] getChildren(Object element) {
+		if (element instanceof INodeNotifier) {
+			((INodeNotifier) element).getAdapterFor(IJFaceNodeAdapter.class);
+		}
+		return treeContentHelper.getChildren(element);
+	}
+
+	public Image getColumnImage(Object object, int columnIndex) {
+		return (columnIndex == 0) ? getImage(object) : null;
+	}
+
+	//
+	// ITableLabelProvider stuff
+	//
+	public String getColumnText(Object object, int column) {
+		String result = null;
+		if (column == 0) {
+			result = getText(object);
+		}
+		else if ((column == 1) && (object instanceof Node)) {
+			result = treeContentHelper.getNodeValue((Node) object);
+			if (result == null)
+				result = getElementValueHelper((Element) object);
+				
+		}
+		return result != null ? result : ""; //$NON-NLS-1$
+	}
+	
+	private String getElementValueHelper(Element element) {
+		String result = null;
+
+		ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
+		if ((result == null) && (mq != null)) {
+			CMElementDeclaration ed = mq.getCMElementDeclaration(element);
+			if ((ed != null) && !Boolean.TRUE.equals(ed.getProperty("isInferred"))) { //$NON-NLS-1$
+				result = descriptionBuilder.buildDescription(ed);
+			}
+		}
+		return result != null ? result : ""; //$NON-NLS-1$
+	}
+
+	public Object[] getElements(Object element) {
+		return getChildren(element);
+	}
+
+	public Image getImage(Object object) {
+		if (object instanceof INodeNotifier) {
+			((INodeNotifier) object).getAdapterFor(IJFaceNodeAdapter.class);
+		}
+
+		Image image = null;
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			switch (node.getNodeType()) {
+				case Node.ATTRIBUTE_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_ATTRIBUTE);
+					break;
+				}
+				case Node.CDATA_SECTION_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_CDATASECTION);
+					break;
+				}
+				case Node.COMMENT_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_COMMENT);
+					break;
+				}
+				case Node.DOCUMENT_TYPE_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_DOCTYPE);
+					break;
+				}
+				case Node.ELEMENT_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_ELEMENT);
+					break;
+				}
+				case Node.PROCESSING_INSTRUCTION_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_PROCESSINGINSTRUCTION);
+					break;
+				}
+				case Node.TEXT_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_TXTEXT);
+					break;
+				}
+				case Node.ENTITY_REFERENCE_NODE : {
+					image = SharedXMLEditorPluginImageHelper.getImage(SharedXMLEditorPluginImageHelper.IMG_OBJ_ENTITY_REFERENCE);
+					break;
+				}
+			}
+
+			// if (image != null) {
+			// Image markerOverlayImage =
+			// overlayIconManager.getOverlayImageForObject(node);
+			// if (markerOverlayImage != null) {
+			// image = imageFactory.createCompositeImage(image,
+			// markerOverlayImage, ImageFactory.BOTTOM_LEFT);
+			// }
+			// }
+		}
+		return image;
+	}
+
+	public Object getParent(Object o) {
+		if (o instanceof INodeNotifier) {
+			((INodeNotifier) o).getAdapterFor(IJFaceNodeAdapter.class);
+		}
+
+		Object result = null;
+		if (o instanceof Node) {
+			Node node = (Node) o;
+			if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+				result = ((Attr) node).getOwnerElement();
+			}
+			else {
+				result = node.getParentNode();
+			}
+		}
+		return result;
+	}
+
+	public Element getRootElement(Document document) {
+		Element rootElement = null;
+
+		for (Node childNode = document.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
+			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
+				rootElement = (Element) childNode;
+				break;
+			}
+		}
+		return rootElement;
+	}
+
+	public String getText(Object object) {
+		if (object instanceof INodeNotifier) {
+			((INodeNotifier) object).getAdapterFor(IJFaceNodeAdapter.class);
+		}
+
+		String result = null;
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			switch (node.getNodeType()) {
+				case Node.ATTRIBUTE_NODE : {
+					result = node.getNodeName();
+					break;
+				}
+				case Node.DOCUMENT_TYPE_NODE : {
+					result = "DOCTYPE"; //$NON-NLS-1$
+					break;
+				}
+				case Node.ELEMENT_NODE : {
+					result = node.getNodeName();
+					break;
+				}
+				case Node.PROCESSING_INSTRUCTION_NODE : {
+					result = ((ProcessingInstruction) node).getTarget();
+					break;
+				}
+			}
+		}
+		return result != null ? result : ""; //$NON-NLS-1$
+	}
+
+	public boolean hasChildren(Object element) {
+		return getChildren(element).length > 0;
+	}
+
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		// remove our listeners to the old state
+		if (oldInput != null) {
+			Document domDoc = (Document) oldInput;
+			ModelQuery mq = ModelQueryUtil.getModelQuery(domDoc);
+			if (mq != null) {
+				documentManager = mq.getCMDocumentManager();
+				if (documentManager != null) {
+					documentManager.removeListener(this);
+				}
+			}
+		}
+
+		if ((oldInput != null) && (oldInput instanceof IDOMNode)) {
+			IJFaceNodeAdapterFactory factory = (IJFaceNodeAdapterFactory) ((IDOMNode) oldInput).getModel().getFactoryRegistry().getFactoryFor(IJFaceNodeAdapter.class);
+			if (factory != null) {
+				factory.removeListener(viewer);
+			}
+		}
+
+		if (viewer instanceof StructuredViewer) {
+			fViewer = null;
+		}
+		else {
+			fViewer = (StructuredViewer) viewer;
+		}
+
+		if ((newInput != null) && (newInput instanceof IDOMNode)) {
+			IJFaceNodeAdapterFactory factory = (IJFaceNodeAdapterFactory) ((IDOMNode) newInput).getModel().getFactoryRegistry().getFactoryFor(IJFaceNodeAdapter.class);
+			if (factory != null) {
+				factory.addListener(viewer);
+			}
+		}
+
+		if (newInput != null) {
+			Document domDoc = (Document) newInput;
+			ModelQuery mq = ModelQueryUtil.getModelQuery(domDoc);
+
+			if (mq != null) {
+				documentManager = mq.getCMDocumentManager();
+				if (documentManager != null) {
+					documentManager.setPropertyEnabled(CMDocumentManager.PROPERTY_ASYNC_LOAD, true);
+					documentManager.addListener(this);
+				}
+			}
+		}
+	}
+
+	public boolean isDeleted(Object element) {
+		return element != null;
+	}
+
+	// the following methods handle filtering aspects of the viewer
+	//
+	//
+	public boolean isIgnorableText(Node node) {
+		boolean result = false;
+		try {
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				String data = ((Text) node).getData();
+				result = ((data == null) || (data.trim().length() == 0));
+			}
+		}
+		catch (Exception e) {
+			Logger.logException(e);
+		}
+		return result;
+	}
+
+	public boolean isLabelProperty(Object object, String property) {
+		return false;
+	}
+
+	public void propertyChanged(CMDocumentManager cmDocumentManager, String propertyName) {
+		if (cmDocumentManager.getPropertyEnabled(CMDocumentManager.PROPERTY_AUTO_LOAD)) {
+			doDelayedRefreshForViewers();
+		}
+	}
+
+	public void removeListener(ILabelProviderListener listener) {
+		// since we always return 'false' for "isLabelProperty",
+		// not need to listen. Maybe that should change some day?
+	}
+
+	public Color getBackground(Object element, int columnIndex) {
+		return null;
+	}
+
+	public Color getForeground(Object element, int columnIndex) {
+		if (columnIndex == 1 && treeContentHelper.getNodeValue((Node) element) == null)
+			return getCMColor();
+		return null;
+	}
+	
+	private Color getCMColor() {
+		if (fCMColor == null) {
+			Color background = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+			int r = Math.abs(background.getRed() - 125);
+			int g = Math.abs(background.getGreen() - 85);
+			int b = Math.abs(background.getBlue() - 105);
+			fCMColor = new Color(Display.getCurrent(), r, g, b);
+		}
+		return fCMColor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeHelpContextIds.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeHelpContextIds.java
new file mode 100644
index 0000000..60bc4df
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeHelpContextIds.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+
+
+/**
+ * Help context ids for the TableTree view.
+ * <p>
+ * This interface contains constants only; it is not intended to be
+ * implemented or extended.
+ * </p>
+ * 
+ */
+public interface XMLTableTreeHelpContextIds {
+	// org.eclipse.wst.xml.ui.
+	public static final String PREFIX = XMLUIPlugin.ID + "."; //$NON-NLS-1$
+
+	// XML Design View
+	public static final String XML_DESIGN_VIEW_HELPID = PREFIX + "xmlm3000"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreePropertyDescriptorFactory.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreePropertyDescriptorFactory.java
new file mode 100644
index 0000000..b929b4c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreePropertyDescriptorFactory.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import java.util.List;
+
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.ui.internal.properties.EnumeratedStringPropertyDescriptor;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+
+public class XMLTableTreePropertyDescriptorFactory extends DOMPropertyDescriptorFactory {
+
+	protected TreeContentHelper treeContentHelper = new TreeContentHelper();
+
+	public XMLTableTreePropertyDescriptorFactory() {
+		super();
+	}
+
+	protected IPropertyDescriptor createPropertyDescriptorHelper(String name, Element element, CMNode cmNode) {
+		IPropertyDescriptor result = null;
+
+		ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
+		String[] valuesArray = null;
+		if (mq != null) {
+			valuesArray = mq.getPossibleDataTypeValues(element, cmNode);
+		}
+		if ((valuesArray != null) && (valuesArray.length > 0)) {
+			result = new EnumeratedStringPropertyDescriptor(name, name, valuesArray);
+		}
+		else {
+			result = createDefaultPropertyDescriptor(name);
+		}
+
+		return result;
+	}
+
+	public IPropertyDescriptor createTextPropertyDescriptor(Text text) {
+		IPropertyDescriptor result = null;
+		Node parentNode = text.getParentNode();
+		if ((parentNode != null) && (parentNode.getNodeType() == Node.ELEMENT_NODE)) {
+			Element parentElement = (Element) parentNode;
+			ModelQuery mq = ModelQueryUtil.getModelQuery(text.getOwnerDocument());
+			CMElementDeclaration ed = null;
+			if (mq != null) {
+				ed = mq.getCMElementDeclaration(parentElement);
+			}
+			if (ed != null) {
+				result = createPropertyDescriptorHelper(HACK, parentElement, ed);
+			}
+			else {
+				result = createDefaultPropertyDescriptor(parentElement.getNodeName());
+			}
+		}
+
+		if (result == null) {
+			result = new TextPropertyDescriptor(HACK, HACK);
+		}
+
+		return result;
+	}
+
+	public IPropertyDescriptor createAttributePropertyDescriptor(Attr attr) {
+		IPropertyDescriptor result = null;
+
+		String attributeName = attr.getName();
+		ModelQuery mq = ModelQueryUtil.getModelQuery(attr.getOwnerDocument());
+
+		CMAttributeDeclaration ad = null;
+		if (mq != null) {
+			ad = mq.getCMAttributeDeclaration(attr);
+		}
+		if (ad != null) {
+			result = createPropertyDescriptorHelper(attributeName, attr.getOwnerElement(), ad);
+		}
+
+		if (result == null) {
+			result = new TextPropertyDescriptor(attributeName, attributeName);
+		}
+
+		return result;
+	}
+
+	public IPropertyDescriptor createElementPropertyDescriptor(Element element) {
+		IPropertyDescriptor result = null;
+		List list = treeContentHelper.getElementTextContent(element);
+		if (list != null) {
+			Text text = treeContentHelper.getEffectiveTextNodeForCombinedNodeList(list);
+			if (text != null) {
+				result = createTextPropertyDescriptor(text);
+			}
+		}
+
+		if (result == null) {
+			result = new TextPropertyDescriptor(HACK, HACK);
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
new file mode 100644
index 0000000..4a994d7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
@@ -0,0 +1,428 @@
+/*****************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others. All rights reserved. This
+ * program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and
+ * is available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: IBM Corporation - initial API and implementation
+ ****************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.actions.NodeAction;
+import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
+import org.eclipse.wst.xml.ui.internal.dnd.DragNodeCommand;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class XMLTableTreeViewer extends TreeViewer implements IDesignViewer {
+
+	class NodeActionMenuListener implements IMenuListener {
+		public void menuAboutToShow(IMenuManager menuManager) {
+			// used to disable NodeSelection listening while running
+			// NodeAction
+			XMLNodeActionManager nodeActionManager = new XMLNodeActionManager(((IDOMDocument) getInput()).getModel(), XMLTableTreeViewer.this) {
+				public void beginNodeAction(NodeAction action) {
+					super.beginNodeAction(action);
+				}
+
+				public void endNodeAction(NodeAction action) {
+					super.endNodeAction(action);
+				}
+			};
+			nodeActionManager.fillContextMenu(menuManager, getSelection());
+		}
+	}
+	
+	private class SelectionProvider implements IPostSelectionProvider {
+
+		public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
+			XMLTableTreeViewer.this.addPostSelectionChangedListener(listener);
+		}
+
+		public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
+			XMLTableTreeViewer.this.removePostSelectionChangedListener(listener);
+		}
+
+		public void addSelectionChangedListener(ISelectionChangedListener listener) {
+			XMLTableTreeViewer.this.addSelectionChangedListener(listener);
+		}
+
+		public ISelection getSelection() {
+			return XMLTableTreeViewer.this.getSelection();
+		}
+
+		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+			XMLTableTreeViewer.this.removeSelectionChangedListener(listener);
+		}
+
+		public void setSelection(ISelection selection) {
+			boolean selectionSet = false;
+			if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
+				IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+				if (selection instanceof ITextSelection) {
+					ITextSelection textSelection = (ITextSelection) selection;
+					
+					if (structuredSelection.size() == 1) {
+						if (structuredSelection.getFirstElement() instanceof IDOMNode) {
+							IDOMNode domNode = (IDOMNode) structuredSelection.getFirstElement();
+							IStructuredDocumentRegion startStructuredDocumentRegion = domNode.getStartStructuredDocumentRegion();
+							if (startStructuredDocumentRegion != null) {
+								ITextRegion matchingRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(textSelection.getOffset());
+								int allowedIterations = 40;
+								while (matchingRegion != null && !matchingRegion.getType().equals(DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) && allowedIterations > 0) {
+									matchingRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(startStructuredDocumentRegion.getStartOffset(matchingRegion) - 1);
+									allowedIterations--;
+								}
+								if (matchingRegion != null && matchingRegion.getType().equals(DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)) {
+									String attrName = startStructuredDocumentRegion.getText(matchingRegion);
+									NamedNodeMap attributes = domNode.getAttributes();
+									if (attributes != null && attrName.length() > 0) {
+										Node attr = attributes.getNamedItem(attrName);
+										if (attr != null) {
+											selectionSet = true;
+											XMLTableTreeViewer.this.setSelection(new StructuredSelection(attr));
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+			if (!selectionSet) {
+				XMLTableTreeViewer.this.setSelection(selection);
+			}
+		}
+	}
+
+	private PaintListener fContentPaintListener = new PaintListener() {
+
+		public void paintControl(PaintEvent e) {
+			GC gc = e.gc;
+			if (getTree().getItemCount() == 0) {
+				gc.setForeground(getTree().getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
+				gc.setBackground(getTree().getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+				gc.drawString(XMLEditorMessages.XMLTreeExtension_3, 10, 10);
+				gc.drawString(XMLEditorMessages.XMLTreeExtension_4, 10, 10 + gc.getFontMetrics().getHeight());
+			}
+		}
+		
+	};
+
+	private ISelectionProvider fSelectionProvider = new SelectionProvider();
+	// node: 40%, content: 60%
+	static final double[] WEIGHTS = { .4, .6 };
+
+	private ControlAdapter fResizeAdapter = new ControlAdapter() {
+		public void controlResized(ControlEvent e) {
+			sizeColumns(getTree().getSize().x, WEIGHTS);
+		}
+
+		private void sizeColumns(int width, double[] weights) {
+			TreeColumn[] columns = getTree().getColumns();
+			int size = columns.length;
+			for (int i = 0; i < size; i++) {
+				columns[i].setWidth((int)(weights[i] * width));
+			}
+		}
+	};
+
+	public XMLTableTreeViewer(Composite parent) {
+		super(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+		
+		TreeColumn column = new TreeColumn(this.getTree(), SWT.LEFT);
+		column.setText(XMLEditorMessages.XMLTableTreeViewer_1);
+
+		column = new TreeColumn(this.getTree(), SWT.LEFT);
+		column.setText(XMLEditorMessages.XMLTableTreeViewer_2);
+
+		this.getTree().setHeaderVisible(true);
+		this.getTree().setLinesVisible(true);
+		getTree().addControlListener(fResizeAdapter);
+
+		// set up providers
+		propertyDescriptorFactory = new XMLTableTreePropertyDescriptorFactory();
+
+		XMLTableTreeContentProvider provider = new XMLTableTreeContentProvider();
+		setContentProvider(provider);
+		setLabelProvider(provider);
+
+		setColumnProperties(new String[] {STRUCTURE_PROPERTY, VALUE_PROPERTY});
+		setCellEditors(new CellEditor[] {null, new TextCellEditor(this.getTree())});
+
+		setCellModifier(new XMLCMCellModifier());
+		createContextMenu();
+
+		DragSource dragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+		dragSource.addDragListener(createDragSourceListener());
+		dragSource.setTransfer(new Transfer[] {LocalSelectionTransfer.getTransfer()});
+		DropTarget dropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+		dropTarget.addDropListener(createDropTargetListener());
+		dropTarget.setTransfer(new Transfer[] {LocalSelectionTransfer.getTransfer()});
+
+		this.getTree().addPaintListener(fContentPaintListener);
+	}
+
+	/**
+	 * This creates a context menu for the viewer and adds a listener as well
+	 * registering the menu for extension.
+	 */
+	protected void createContextMenu() {
+		MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
+		contextMenu.add(new Separator("additions")); //$NON-NLS-1$
+		contextMenu.setRemoveAllWhenShown(true);
+		contextMenu.addMenuListener(new NodeActionMenuListener());
+		Menu menu = contextMenu.createContextMenu(getControl());
+		getControl().setMenu(menu);
+	}
+
+	private DragSourceListener createDragSourceListener() {
+		return new DragSourceListener() {
+			public void dragFinished(DragSourceEvent event) {
+				LocalSelectionTransfer.getTransfer().setSelection(null);
+			}
+
+			public void dragSetData(DragSourceEvent event) {
+			}
+
+			public void dragStart(DragSourceEvent event) {
+				LocalSelectionTransfer.getTransfer().setSelection(getSelection());
+			}
+		};
+	}
+
+	private DropTargetListener createDropTargetListener() {
+		return new DropTargetListener() {
+			public void dragEnter(DropTargetEvent event) {
+			}
+
+			public void dragLeave(DropTargetEvent event) {
+			}
+
+			public void dragOperationChanged(DropTargetEvent event) {
+			}
+
+			public void drop(DropTargetEvent event) {
+				if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() instanceof IStructuredSelection) {
+					dragOver(event);
+					IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+					if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+						/*
+						 * the command uses these numbers instead of the
+						 * feedback constants (even though it converts in
+						 * the other direction as well)
+						 */
+						float feedbackFloat = getHeightInItem(event);
+
+						final DragNodeCommand command = new DragNodeCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList(), XMLTableTreeViewer.this);
+						if (command != null && command.canExecute()) {
+							SafeRunnable.run(new SafeRunnable() {
+								public void run() throws Exception {
+									command.execute();
+								}
+							});
+						}
+					}
+				}
+			}
+
+			public void dropAccept(DropTargetEvent event) {
+			}
+
+			public void dragOver(DropTargetEvent event) {
+				event.feedback = DND.FEEDBACK_SELECT;
+				float feedbackFloat = getHeightInItem(event);
+				if (feedbackFloat > 0.75) {
+					event.feedback = DND.FEEDBACK_INSERT_AFTER;
+				}
+				else if (feedbackFloat < 0.25) {
+					event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+				}
+				event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
+				if ( getLocalNodeSelection(event) == null){
+					event.detail = DND.DROP_NONE;
+				}
+			}
+
+			private IStructuredSelection getLocalNodeSelection(DropTargetEvent event){
+				IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+				if (selection != null && !selection.isEmpty() ) {
+					for (Iterator i = selection.iterator(); i.hasNext();) {
+						Object node = i.next();
+						if (node instanceof Node){
+							return selection;
+						}
+					}
+				}
+				return null;
+			}
+			private float getHeightInItem(DropTargetEvent event) {
+				if(event.item == null) return .5f;
+				if (event.item instanceof TreeItem) {
+					TreeItem treeItem = (TreeItem) event.item;
+					Control control = treeItem.getParent();
+					Point point = control.toControl(new Point(event.x, event.y));
+					Rectangle bounds = treeItem.getBounds();
+					return (float) (point.y - bounds.y) / (float) bounds.height;
+				}
+				else if (event.item instanceof TableItem) {
+					TableItem tableItem = (TableItem) event.item;
+					Control control = tableItem.getParent();
+					Point point = control.toControl(new Point(event.x, event.y));
+					Rectangle bounds = tableItem.getBounds(0);
+					return (float) (point.y - bounds.y) / (float) bounds.height;
+				}
+				else {
+					return 0.0F;
+				}
+			}
+		};
+	}
+	
+	protected void doRefresh(Object o, boolean fromDelayed) {
+		super.refresh(o);
+	}
+
+	public ISelectionProvider getSelectionProvider() {
+		return fSelectionProvider;
+	}
+
+	public String getTitle() {
+		return XMLEditorMessages.XMLTableTreeViewer_0;
+	}
+
+	protected void handleDispose(DisposeEvent event) {
+		super.handleDispose(event);
+		this.getTree().removePaintListener(fContentPaintListener);
+		getTree().removeControlListener(fResizeAdapter);
+		setDocument(null);
+	}
+
+	public void setDocument(IDocument document) {
+		/*
+		 * let the text editor to be the one that manages the model's lifetime
+		 */
+		IStructuredModel model = null;
+		try {
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+
+			if ((model != null) && (model instanceof IDOMModel)) {
+				Document domDoc = null;
+				domDoc = ((IDOMModel) model).getDocument();
+				setInput(domDoc);
+			}
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+
+	}
+	
+	protected TreeContentHelper treeContentHelper = new TreeContentHelper();
+	protected XMLTableTreePropertyDescriptorFactory propertyDescriptorFactory;
+	
+	private final static String STRUCTURE_PROPERTY = XMLEditorMessages.XMLTreeExtension_0;
+	private final static String VALUE_PROPERTY = XMLEditorMessages.XMLTreeExtension_1;
+	
+	public class XMLCMCellModifier implements ICellModifier, TreeExtension.ICellEditorProvider {
+		public boolean canModify(Object element, String property) {
+			boolean result = false;
+			if (element instanceof Node) {
+				Node node = (Node) element;
+				if (property == VALUE_PROPERTY) {
+					result = treeContentHelper.isEditable(node);
+					if (result) {
+						/* Set up the cell editor based on the element */
+						CellEditor[] editors = getCellEditors();
+						if (editors.length > 0) {
+							if (editors[1] != null)
+								editors[1].dispose();
+							editors[1] = getCellEditor(element, 1);
+						}
+					}
+					
+				}
+			}
+			return result;
+		}
+
+		public Object getValue(Object object, String property) {
+			String result = null;
+			if (object instanceof Node) {
+				result = treeContentHelper.getNodeValue((Node) object);
+			}
+			return (result != null) ? result : ""; //$NON-NLS-1$
+		}
+
+		public void modify(Object element, String property, Object value) {
+			Item item = (Item) element;
+			String oldValue = treeContentHelper.getNodeValue((Node) item.getData());
+			String newValue = value.toString();
+			if ((newValue != null) && !newValue.equals(oldValue)) {
+				treeContentHelper.setNodeValue((Node) item.getData(), value.toString(), getControl().getShell());
+			}
+		}
+
+		public CellEditor getCellEditor(Object o, int col) {
+			IPropertyDescriptor pd = propertyDescriptorFactory.createPropertyDescriptor(o);
+			return pd != null ? pd.createPropertyEditor(XMLTableTreeViewer.this.getTree()) : null;
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTreeExtension.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTreeExtension.java
new file mode 100644
index 0000000..b8601f8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTreeExtension.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.tabletree;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDescriptionBuilder;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * 
+ * @deprecated No longer used
+ */
+public class XMLTreeExtension extends TreeExtension {
+
+	public final static String STRUCTURE_PROPERTY = XMLEditorMessages.XMLTreeExtension_0;
+	public final static String VALUE_PROPERTY = XMLEditorMessages.XMLTreeExtension_1;
+
+	protected Composite control;
+	protected MyCellModifier modifier;
+	protected XMLTableTreePropertyDescriptorFactory propertyDescriptorFactory;
+	protected CMDescriptionBuilder decriptionBuilder = new CMDescriptionBuilder();
+	protected TreeContentHelper treeContentHelper = new TreeContentHelper();
+
+	protected Color f1, f2, b1, b2;
+	protected boolean cachedDataIsValid = true;
+
+	public XMLTreeExtension(Tree tree) {
+		super(tree);
+		control = tree;
+		modifier = new MyCellModifier();
+		setCellModifier(modifier);
+		String[] properties = {STRUCTURE_PROPERTY, VALUE_PROPERTY};
+		setColumnProperties(properties);
+
+		/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=185851 - Used to be hardcoded as COLOR_BLACK */
+		f1 = tree.getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+		Color background = tree.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+
+		int r = Math.abs(background.getRed() - 125);
+		int g = Math.abs(background.getGreen() - 85);
+		int b = Math.abs(background.getBlue() - 105);
+
+		f2 = new Color(tree.getDisplay(), r, g, b);
+		b1 = tree.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION);
+		b2 = background;
+
+		propertyDescriptorFactory = new XMLTableTreePropertyDescriptorFactory();
+	}
+
+	public void dispose() {
+		super.dispose();
+		f2.dispose();
+	}
+
+	public void resetCachedData() {
+		cachedDataIsValid = false;
+	}
+
+	public void paintItems(GC gc, TreeItem[] items, Rectangle treeBounds) {
+		super.paintItems(gc, items, treeBounds);
+		cachedDataIsValid = true;
+	}
+
+	protected Object[] computeTreeExtensionData(Object object) {
+		Color color = f1;
+		String string = ""; //$NON-NLS-1$
+		if (string.length() == 0) {
+			string = (String) modifier.getValue(object, VALUE_PROPERTY);
+			color = f1;
+		}
+		if ((string.length() == 0) && (object instanceof Element)) {
+			string = getElementValueHelper((Element) object);
+			color = f2;
+		}
+		Object[] data = new Object[2];
+		data[0] = string;
+		data[1] = color;
+		return data;
+	}
+
+	protected void paintItem(GC gc, TreeItem item, Rectangle bounds) {
+		super.paintItem(gc, item, bounds);
+		Object[] data = computeTreeExtensionData(item.getData());
+		if ((data != null) && (data.length == 2)) {
+			gc.setClipping(columnPosition, bounds.y + 1, controlWidth, bounds.height);
+			gc.setForeground((Color) data[1]);
+			gc.drawString((String) data[0], columnPosition + 5, bounds.y + 1);
+			gc.setClipping((Rectangle) null);
+		}
+	}
+
+	protected void addEmptyTreeMessage(GC gc) {
+		// here we print a message when the document is empty just to give the
+		// user a visual cue
+		// so that they know how to proceed to edit the blank view
+		gc.setForeground(fTree.getDisplay().getSystemColor(SWT.COLOR_BLACK));
+		gc.setBackground(fTree.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+		gc.drawString(XMLEditorMessages.XMLTreeExtension_3, 10, 10);
+		gc.drawString(XMLEditorMessages.XMLTreeExtension_4, 10, 10 + gc.getFontMetrics().getHeight());
+	}
+
+	public String getElementValueHelper(Element element) {
+		String result = null;
+
+		ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
+		if ((result == null) && (mq != null)) {
+			CMElementDeclaration ed = mq.getCMElementDeclaration(element);
+			if ((ed != null) && !Boolean.TRUE.equals(ed.getProperty("isInferred"))) { //$NON-NLS-1$
+				result = decriptionBuilder.buildDescription(ed);
+			}
+		}
+		return result != null ? result : ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * 
+	 */
+	public class MyCellModifier implements ICellModifier, TreeExtension.ICellEditorProvider {
+		public boolean canModify(Object element, String property) {
+			boolean result = false;
+			if (element instanceof Node) {
+				Node node = (Node) element;
+				result = (property == VALUE_PROPERTY) && treeContentHelper.isEditable(node);
+			}
+			return result;
+		}
+
+		public Object getValue(Object object, String property) {
+			String result = null;
+			if (object instanceof Node) {
+				result = treeContentHelper.getNodeValue((Node) object);
+			}
+			return (result != null) ? result : ""; //$NON-NLS-1$
+		}
+
+		public void modify(Object element, String property, Object value) {
+			// enableNodeSelectionListener(false);
+			Item item = (Item) element;
+			String oldValue = treeContentHelper.getNodeValue((Node) item.getData());
+			String newValue = value.toString();
+			if ((newValue != null) && !newValue.equals(oldValue)) {
+				treeContentHelper.setNodeValue((Node) item.getData(), value.toString());
+			}
+			// enableNodeSelectionListener(true);
+		}
+
+		public CellEditor getCellEditor(Object o, int col) {
+			IPropertyDescriptor pd = propertyDescriptorFactory.createPropertyDescriptor(o);
+			return pd != null ? pd.createPropertyEditor(control) : null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/XMLValidationUIMessages.java b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/XMLValidationUIMessages.java
new file mode 100644
index 0000000..ff3bea2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/XMLValidationUIMessages.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.validation;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Strings used by XML Validation
+ */
+public class XMLValidationUIMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.xml.ui.internal.validation.xmlvalidation"; //$NON-NLS-1$
+
+	private XMLValidationUIMessages() {
+		// cannot create new instance
+	}
+
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, XMLValidationUIMessages.class);
+	}
+	public static String _UI_REF_FILE_ERROR_DESCRIPTION;
+	public static String _UI_REF_FILE_ERROR_MESSAGE;
+	public static String _UI_REF_FILE_ERROR_DETAILS;
+	public static String _UI_DETAILS_INFORMATION_UNAVAILABLE;
+	public static String _UI_DETAILS_INFO_REVALIDATE_TO_REGENERATE;
+	public static String _UI_SAVE_DIRTY_FILE_MESSAGE;
+	public static String _UI_SAVE_DIRTY_FILE_TITLE;
+	public static String TaskListTableViewer_0;
+	public static String TaskListTableViewer_1;
+	public static String TaskListTableViewer_2;
+	public static String TaskListTableViewer_3;
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/GroupNamePropertyTester.java b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/GroupNamePropertyTester.java
new file mode 100644
index 0000000..7c3e9bc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/GroupNamePropertyTester.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.validation.core.errorinfo;
+
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.core.resources.IMarker;
+
+
+/**
+ * Custom property tester used to determine if the groupName attribute is
+ * present on a marker and that its value starts with a given expected value.
+ */
+public class GroupNamePropertyTester extends PropertyTester
+{
+  /**
+   * The group name prefix property name.
+   */
+  private static final String GROUP_NAME_PREFIX = "groupNamePrefix"; //$NON-NLS-1$  
+
+  /**
+   * The group name marker attribute.
+   */
+  private static final String GROUP_NAME = "groupName"; //$NON-NLS-1$
+
+  public boolean test(Object receiver, String property, Object[] args, Object expectedValue)
+  {
+    if (GROUP_NAME_PREFIX.equals(property))
+    {
+      if (receiver instanceof IMarker)
+      {
+        IMarker marker = (IMarker)receiver;
+
+        String groupName = marker.getAttribute(GROUP_NAME, null);
+
+        boolean testValue = groupName != null && expectedValue instanceof String && groupName.startsWith((String)expectedValue);
+        return testValue;
+      }
+    }
+
+    return false;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorDialog.java b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorDialog.java
new file mode 100644
index 0000000..4cc9f29
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorDialog.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.validation.core.errorinfo;
+
+import java.util.List;
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.xml.core.internal.validation.core.ValidationMessage;
+import org.eclipse.wst.xml.ui.internal.validation.XMLValidationUIMessages;
+
+
+public class ReferencedFileErrorDialog extends Dialog {
+	protected TaskListTableViewer tableViewer;
+	protected List errorList;
+	protected String markedUpDetailsMessage;
+	protected String contextFile;
+	protected String referencedFile;
+	protected StyledText styledText;
+	protected Text fullFileNameField;
+
+	public ReferencedFileErrorDialog(Shell parentShell, List errorList, String contextFile, String referencedFile) {
+		super(parentShell);
+
+		int styleBits = getShellStyle() | SWT.RESIZE;
+		styleBits &= ~SWT.APPLICATION_MODAL;
+
+		setShellStyle(styleBits);
+		this.errorList = errorList;
+
+		this.referencedFile = referencedFile;
+		this.contextFile = contextFile;
+		this.markedUpDetailsMessage = getMarkedUpDetailsMessage();
+	}
+
+	public int createAndOpen() {
+		create();
+		getShell().setText(XMLValidationUIMessages._UI_REF_FILE_ERROR_DETAILS);
+
+		setBlockOnOpen(false);
+		return open();
+	}
+
+
+	protected Control createButtonBar(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		composite.setLayout(new GridLayout(2, false));
+		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		fullFileNameField = new Text(composite, SWT.NONE);
+		fullFileNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		fullFileNameField.setBackground(parent.getBackground());
+		fullFileNameField.setEditable(false);
+
+		super.createButtonBar(composite);
+
+		return composite;
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		dialogArea.setLayout(new GridLayout());
+
+		Composite c = new Composite(dialogArea, SWT.NONE);
+		c.setLayout(new GridLayout());
+		c.setLayoutData(createGridData(true, -1, 200));
+
+		styledText = new StyledText(c, SWT.MULTI | SWT.WRAP);
+		styledText.setBackground(c.getBackground());
+		setStyledText(styledText, markedUpDetailsMessage);
+		styledText.setEditable(false);
+		styledText.setLayoutData(createGridData(false, 650, -1));
+
+		MouseListener mouseListener = new MouseListener();
+		styledText.addMouseMoveListener(mouseListener);
+
+		tableViewer = new TaskListTableViewer(c, 10);
+		tableViewer.setInput(errorList);
+		tableViewer.addSelectionChangedListener(new InternalSelectionListener());
+		tableViewer.getControl().setLayoutData(createGridData(true, 700, -1));
+		return dialogArea;
+	}
+
+	String getFullURI(int offset) {
+		String uri = ""; //$NON-NLS-1$
+		int index = getIndex(offset);
+		if (index != -1) {
+			if ((index == 0) || (index == 2) || (index == 3)) {
+				uri = referencedFile;
+			}
+			else {
+				uri = contextFile;
+			}
+		}
+		return uri;
+	}
+
+	private int getIndex(int offset) {
+		int result = -1;
+		StyleRange[] range = styledText.getStyleRanges();
+		for (int i = 0; i < range.length; i++) {
+			int l = range[i].start;
+			int r = l + range[i].length;
+			if ((l <= offset) && (r >= offset)) {
+				result = i;
+				break;
+			}
+		}
+		return result;
+	}
+
+	class MouseListener implements MouseMoveListener {
+		public void mouseMove(MouseEvent event) {
+			String toolTipText = ""; //$NON-NLS-1$
+			try {
+
+				int offset = styledText.getOffsetAtLocation(new Point(event.x, event.y));
+				toolTipText = getFullURI(offset);
+
+			}
+			catch (Exception e) {
+				// Do nothing.
+			}
+			styledText.setToolTipText(toolTipText);
+			if ((toolTipText != null) && (toolTipText.length() > 0)) {
+				fullFileNameField.setText(toolTipText);
+			}
+		}
+	}
+
+	private String getMarkedUpDetailsMessage() {
+		String detailsMessage = ""; //$NON-NLS-1$
+		// TODO... need to move '_UI_REF_FILE_ERROR_DESCRIPTION' to this
+		// plugin's properties file
+		//			
+		String string = XMLValidationUIMessages._UI_REF_FILE_ERROR_DESCRIPTION;
+		// TODO... need to edit the properties file to remove "'" characters
+		// from the string
+		// I'm using these characters to markup the bold font. It's safer if I
+		// add these programtically.
+		//
+		string = removePattern(string, "'"); //$NON-NLS-1$
+
+		String c = "'" + getLastSegment(contextFile) + "'"; //$NON-NLS-1$ //$NON-NLS-2$
+		String r = "'" + getLastSegment(referencedFile) + "'"; //$NON-NLS-1$ //$NON-NLS-2$
+
+		detailsMessage = NLS.bind(string, new Object[]{r, c, r, c});
+		return detailsMessage;
+	}
+
+	private String removePattern(String string, String pattern) {
+		while (true) {
+			int index = string.indexOf(pattern);
+			if (index != -1) {
+				string = string.substring(0, index) + string.substring(index + pattern.length());
+			}
+			else {
+				break;
+			}
+		}
+		return string;
+	}
+
+	private void setStyledText(StyledText styledText, String text) {
+		String visibleMessage = ""; //$NON-NLS-1$
+		for (StringTokenizer st = new StringTokenizer(markedUpDetailsMessage, "'", false); st.hasMoreTokens();) //$NON-NLS-1$
+		{
+			String token = st.nextToken();
+			visibleMessage += token;
+		}
+
+		styledText.setText(visibleMessage);
+		// dw Font font = styledText.getFont();
+
+		boolean inQuote = false;
+		int position = 0;
+		for (StringTokenizer st = new StringTokenizer(markedUpDetailsMessage, "'", true); st.hasMoreTokens();) //$NON-NLS-1$
+		{
+			String token = st.nextToken();
+
+			if (token.equals("'")) //$NON-NLS-1$
+			{
+				inQuote = !inQuote;
+			}
+			else {
+				if (inQuote) {
+					try {
+
+						StyleRange style = new StyleRange(position, token.length(), styledText.getForeground(), styledText.getBackground(), SWT.BOLD);
+						styledText.setStyleRange(style);
+					}
+					catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+				position = position + token.length();
+			}
+		}
+	}
+
+	private static GridData createGridData(boolean fillBoth, int w, int h) {
+		GridData gd = new GridData(fillBoth ? GridData.FILL_BOTH : GridData.FILL_HORIZONTAL);
+		gd.widthHint = w;
+		gd.heightHint = h;
+		return gd;
+	}
+
+	private static String getLastSegment(String uri) {
+		String result = uri;
+		int index = Math.max(uri.lastIndexOf("/"), uri.lastIndexOf("\\")); //$NON-NLS-1$ //$NON-NLS-2$
+		if (index != -1) {
+			result = uri.substring(index + 1);
+		}
+		return result;
+	}
+
+	protected class InternalSelectionListener implements ISelectionChangedListener {
+		public void selectionChanged(SelectionChangedEvent event) {
+			ISelection selection = event.getSelection();
+			if (selection instanceof StructuredSelection) {
+				ValidationMessage validationMessage = (ValidationMessage) ((StructuredSelection) selection).getFirstElement();
+				if (validationMessage != null) {
+					String uristring = validationMessage.getUri();
+					ReferencedFileErrorUtility.openEditorAndGotoError(uristring, validationMessage.getLineNumber(), validationMessage.getColumnNumber());
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorUtility.java b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorUtility.java
new file mode 100644
index 0000000..378ee89
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorUtility.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.validation.core.errorinfo;
+
+import java.net.URL;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.wst.xml.core.internal.validation.core.logging.LoggerFactory;
+
+
+public class ReferencedFileErrorUtility {
+	public static void openEditorAndGotoError(String uristring, final int line, final int column) {
+		if (uristring != null) {
+			try {
+				URL uri = new URL(uristring);
+				if (uri != null) {
+					if ("file".equals(uri.getProtocol())) //$NON-NLS-1$
+					{
+						String pathString = uri.getPath();
+						IPath path = new Path(pathString);
+						String device = path.getDevice();
+						if ((device != null) && device.startsWith("/")) //$NON-NLS-1$
+						{
+							path = path.setDevice(device.substring(1));
+						}
+						final IFile iFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
+						if ((iFile != null) && iFile.exists()) {
+							// Open the editor for this file.
+							final IWorkbench workbench = PlatformUI.getWorkbench();
+							final IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+
+							Display.getDefault().asyncExec(new Runnable() {
+								public void run() {
+									try {
+										IContentType contentType = iFile.getContentDescription().getContentType();
+										IEditorRegistry editorRegistry = workbench.getEditorRegistry();
+										String fileName = iFile.getName();
+										IEditorDescriptor descriptor = editorRegistry.getDefaultEditor(fileName, contentType);
+										String editorId;
+										if (descriptor != null) {
+											editorId = descriptor.getId();
+										}
+										else {
+											descriptor = editorRegistry.getDefaultEditor(fileName + ".txt"); //$NON-NLS-1$
+											editorId = descriptor.getId(); 
+										}
+										
+										if (editorId != null)
+										{
+										  FileEditorInput editorInput = new FileEditorInput(iFile);
+										  IWorkbenchPage activePage = workbenchWindow.getActivePage();
+										  activePage.openEditor(editorInput, editorId);
+										}
+									}
+									catch (Exception ex) {
+										LoggerFactory.getLoggerInstance().logError("Exception encountered when attempting to open file: " + iFile + "\n\n", ex); //$NON-NLS-1$ //$NON-NLS-2$
+									}
+								}
+							});
+
+							Runnable runnable = new Runnable() {
+								public void run() {
+									IEditorPart editorPart = workbenchWindow.getActivePage().getActiveEditor();
+									gotoError(editorPart, line, column);
+								}
+							};
+							Display.getCurrent().asyncExec(runnable);
+						}
+					}
+				}
+			}
+			catch (Exception e) {
+				// Do nothing.
+			}
+		}
+	}
+
+	static void gotoError(IEditorPart editorPart, int line, int column) {
+		if (editorPart != null) {
+			TextEditor textEditor = (TextEditor) editorPart.getAdapter(TextEditor.class);
+			if (textEditor != null) {
+				try {
+					IDocumentProvider dp = textEditor.getDocumentProvider();
+					IDocument document = (dp != null) ? dp.getDocument(textEditor.getEditorInput()) : null;
+					textEditor.selectAndReveal(document.getLineOffset(line - 1) + column - 1, 0);
+				}
+				catch (BadLocationException x) {
+					// marker refers to invalid text position -> do nothing
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorsHandler.java b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorsHandler.java
new file mode 100644
index 0000000..3db6243
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/ReferencedFileErrorsHandler.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.validation.core.errorinfo;
+
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.views.markers.MarkerViewHandler;
+import org.eclipse.wst.xml.core.internal.validation.core.ValidationMessage;
+import org.eclipse.wst.xml.ui.internal.validation.XMLValidationUIMessages;
+
+
+/**
+ * Handler for the referenced file errors command. This class replaces the old
+ * ReferencedFileErrorActionDelegate.
+ */
+public class ReferencedFileErrorsHandler extends MarkerViewHandler
+{
+  public Object execute(ExecutionEvent event) throws ExecutionException
+  {
+    final IMarker[] selectedMarkers = getSelectedMarkers(event);
+
+    IMarker selectedMarker = selectedMarkers[0];
+
+    if (selectedMarker != null)
+    {
+      try
+      {
+
+        IResource resource = selectedMarker.getResource();
+        Map map = (Map)resource.getSessionProperty(ValidationMessage.ERROR_MESSAGE_MAP_QUALIFIED_NAME);
+        if (map == null)
+        {
+          String infoUnavailable = XMLValidationUIMessages._UI_DETAILS_INFORMATION_UNAVAILABLE;
+          String revalidateToRegenerateErrors = XMLValidationUIMessages._UI_DETAILS_INFO_REVALIDATE_TO_REGENERATE;
+          MessageDialog.openInformation(Display.getCurrent().getActiveShell(), infoUnavailable, revalidateToRegenerateErrors);
+        }
+        else
+        {
+          String uri = null;
+
+          String groupName = (String)selectedMarker.getAttribute("groupName"); //$NON-NLS-1$
+          if (groupName.startsWith("referencedFileError")) //$NON-NLS-1$
+          {
+            int index1 = groupName.indexOf("("); //$NON-NLS-1$
+            int index2 = groupName.lastIndexOf(")"); //$NON-NLS-1$
+            if ((index1 != -1) && (index2 > index1))
+            {
+              uri = groupName.substring(index1 + 1, index2);
+            }
+          }
+
+          if (uri != null)
+          {
+            List list = Collections.EMPTY_LIST;
+
+            ValidationMessage message = (ValidationMessage)map.get(uri);
+            if (message != null)
+            {
+              list = message.getNestedMessages();
+            }
+
+            IPath resourceLocation = resource.getLocation();
+            
+            if (resourceLocation != null)
+            {
+              String validatedFileURI = resourceLocation.toOSString();
+              validatedFileURI = "file:/" + validatedFileURI; //$NON-NLS-1$
+
+              ReferencedFileErrorDialog dialog = new ReferencedFileErrorDialog(
+                HandlerUtil.getActiveShell(event),
+                list,
+                validatedFileURI,
+                uri);
+              dialog.createAndOpen();
+            }
+          }
+        }
+      }
+      catch (CoreException e)
+      {
+        // Do nothing.
+      }
+    }
+
+    return this;
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/TaskListTableViewer.java b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/TaskListTableViewer.java
new file mode 100644
index 0000000..433edf7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/core/errorinfo/TaskListTableViewer.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.validation.core.errorinfo;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.xml.core.internal.validation.core.ValidationMessage;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.validation.XMLValidationUIMessages;
+
+
+
+public class TaskListTableViewer extends TableViewer {
+	protected static final int COLUMN_ICON = 0;
+	protected static final int COLUMN_DESCRIPTION = 1;
+	protected static final int COLUMN_RESOURCE = 3;
+	protected static final int COLUMN_LOCATION = 2;
+
+	protected static final String LABEL_ICON = ""; //$NON-NLS-1$
+	protected static final String LABEL_DESCRIPTION = XMLValidationUIMessages.TaskListTableViewer_0;
+	protected static final String LABEL_RESOURCE = XMLValidationUIMessages.TaskListTableViewer_1;
+	protected static final String LABEL_LOCATION = XMLValidationUIMessages.TaskListTableViewer_2;
+
+	protected int visibleRows = -1;
+
+	protected int getColumnWidth(int column) {
+		int result = 0;
+		switch (column) {
+			case COLUMN_ICON : {
+				result = 1;
+				break;
+			}
+			case COLUMN_DESCRIPTION : {
+				result = 20;
+				break;
+			}
+			case COLUMN_RESOURCE : {
+				result = 3;
+				break;
+			}
+			case COLUMN_LOCATION : {
+				result = 3;
+				break;
+			}
+		}
+		return result;
+	}
+
+	public TaskListTableViewer(Composite parent, int visibleRows) {
+		this(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER, visibleRows);
+	}
+
+	public TaskListTableViewer(Composite parent, int style, int visibleRows) {
+		super(new Table(parent, style));
+		getTable().setLinesVisible(true);
+
+		Provider provider = new Provider();
+		setContentProvider(provider);
+		setLabelProvider(provider);
+
+		String[] columnPropertiesArray = {LABEL_ICON, LABEL_DESCRIPTION, LABEL_LOCATION};
+		setColumnProperties(columnPropertiesArray);
+
+		Table table = getTable();
+		table.setHeaderVisible(true);
+		table.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		TableLayout layout = new TableLayout();
+
+		for (int i = 0; i < columnPropertiesArray.length; i++) {
+			TableColumn column = new TableColumn(table, i);
+			column.setText(columnPropertiesArray[i]);
+			column.setAlignment(SWT.LEFT);
+			layout.addColumnData(new ColumnWeightData(getColumnWidth(i), true));
+		}
+
+		table.setLayout(layout);
+
+		this.visibleRows = visibleRows;
+	}
+
+	/**
+	 * NamespaceInfoTableLabelProvider
+	 */
+	protected class Provider extends LabelProvider implements ITableLabelProvider, IStructuredContentProvider {
+		Viewer viewer;
+		Image errorImage;
+		Image warnImage;
+
+		public Provider() {
+			errorImage = XMLUIPlugin.getInstance().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
+
+			warnImage = XMLUIPlugin.getInstance().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			this.viewer = viewer;
+		}
+
+		public Object[] getElements(Object inputElement) {
+			List list = (List) viewer.getInput();
+			return list != null ? list.toArray() : null;
+		}
+
+		public Image getColumnImage(Object object, int columnIndex) {
+			ValidationMessage validationMessage = (ValidationMessage) object;
+			Image result = null;
+			if (columnIndex == 0) {
+				int severity = validationMessage.getSeverity();
+				if ((severity == IMessage.HIGH_SEVERITY) || (severity == IMessage.NORMAL_SEVERITY)) {
+					result = errorImage;
+				}
+				else {
+					result = warnImage;
+				}
+			}
+			return result;
+		}
+
+		public String getColumnText(Object object, int column) {
+			ValidationMessage errorMessage = (ValidationMessage) object;
+			String result = ""; //$NON-NLS-1$
+			switch (column) {
+				case COLUMN_DESCRIPTION : {
+					result = errorMessage.getMessage();
+					break;
+				}
+				case COLUMN_LOCATION : {
+					result = XMLValidationUIMessages.TaskListTableViewer_3 + errorMessage.getLineNumber();
+					break;
+				}
+			}
+			return result;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/xmlvalidation.properties b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/xmlvalidation.properties
new file mode 100644
index 0000000..c35c849
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-validation/org/eclipse/wst/xml/ui/internal/validation/xmlvalidation.properties
@@ -0,0 +1,29 @@
+###############################################################################
+# Copyright (c) 2001, 2006 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+### Constants for strings  
+
+#
+# Referenced File Dialog Related Message
+#
+_UI_REF_FILE_ERROR_DESCRIPTION      = The errors below were detected when validating the file "{0}" via the file "{1}".  In most cases these errors can be detected by validating "{2}" directly.  However it is possible that errors will only occur when {2} is validated in the context of {3}.
+_UI_REF_FILE_ERROR_MESSAGE          = Referenced file contains errors ({0}).  For more information, right click on the message and select "Show Details..."
+_UI_REF_FILE_ERROR_DETAILS          = Referenced File Error Details
+
+_UI_DETAILS_INFORMATION_UNAVAILABLE       = Details Information Unavailable
+_UI_DETAILS_INFO_REVALIDATE_TO_REGENERATE = Details information currently unavailable.  Please revalidate the file to regenerate the error details.
+
+#
+# Dirty File Dialog Related Messages
+#
+TaskListTableViewer_0=Description
+TaskListTableViewer_1=Resource
+TaskListTableViewer_2=Location
+TaskListTableViewer_3=line 
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationOperation.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationOperation.java
new file mode 100644
index 0000000..cd809c7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationOperation.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.ui.dialogs.IOverwriteQuery;
+import org.eclipse.ui.wizards.datatransfer.ImportOperation;
+import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.osgi.framework.Bundle;
+
+public class ExampleProjectCreationOperation implements IRunnableWithProgress {
+
+	private IResource elementToOpen;
+
+	private IOverwriteQuery overwriteQuery;
+
+	private ExampleProjectCreationWizardPage[] pages;
+
+	/**
+	 * Constructor for ExampleProjectCreationOperation
+	 */
+	public ExampleProjectCreationOperation(ExampleProjectCreationWizardPage[] myPages, IOverwriteQuery myOverwriteQuery) {
+		elementToOpen = null;
+		pages = myPages;
+		overwriteQuery = myOverwriteQuery;
+	}
+
+	private IProject configNewProject(IWorkspaceRoot root, String name, String[] natureIds, IProject[] referencedProjects, IProgressMonitor monitor) throws InvocationTargetException {
+		try {
+			IProject project = root.getProject(name);
+			if (!project.exists()) {
+				project.create(null);
+			}
+			if (!project.isOpen()) {
+				project.open(null);
+			}
+			IProjectDescription desc = project.getDescription();
+			desc.setLocation(null);
+			desc.setNatureIds(natureIds);
+			desc.setReferencedProjects(referencedProjects);
+
+			project.setDescription(desc, new SubProgressMonitor(monitor, 1));
+
+			return project;
+		}
+		catch (CoreException e) {
+			throw new InvocationTargetException(e);
+		}
+	}
+
+	private void createProject(IWorkspaceRoot root, ExampleProjectCreationWizardPage page, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+		IConfigurationElement desc = page.getConfigurationElement();
+
+		IConfigurationElement[] imports = desc.getChildren("import"); //$NON-NLS-1$
+		IConfigurationElement[] natures = desc.getChildren("nature"); //$NON-NLS-1$
+		IConfigurationElement[] references = desc.getChildren("references"); //$NON-NLS-1$
+		int nImports = (imports == null) ? 0 : imports.length;
+		int nNatures = (natures == null) ? 0 : natures.length;
+		int nReferences = (references == null) ? 0 : references.length;
+
+		monitor.beginTask(XMLWizardsMessages.ExampleProjectCreationOperation_op_desc_proj, nImports + 1);
+
+		String name = page.getProjectName();
+
+		String[] natureIds = new String[nNatures];
+		for (int i = 0; i < nNatures; i++) {
+			natureIds[i] = natures[i].getAttribute("id"); //$NON-NLS-1$
+		}
+		IProject[] referencedProjects = new IProject[nReferences];
+		for (int i = 0; i < nReferences; i++) {
+			referencedProjects[i] = root.getProject(references[i].getAttribute("id")); //$NON-NLS-1$
+		}
+
+		IProject proj = configNewProject(root, name, natureIds, referencedProjects, monitor);
+
+		for (int i = 0; i < nImports; i++) {
+			doImports(proj, imports[i], new SubProgressMonitor(monitor, 1));
+		}
+
+		String open = desc.getAttribute("open"); //$NON-NLS-1$
+		if ((open != null) && (open.length() > 0)) {
+			IResource fileToOpen = proj.findMember(new Path(open));
+			if (fileToOpen != null) {
+				elementToOpen = fileToOpen;
+			}
+		}
+
+	}
+
+	private void doImports(IProject project, IConfigurationElement curr, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+		try {
+			IPath destPath;
+			String name = curr.getAttribute("dest"); //$NON-NLS-1$
+			if ((name == null) || (name.length() == 0)) {
+				destPath = project.getFullPath();
+			}
+			else {
+				IFolder folder = project.getFolder(name);
+				if (!folder.exists()) {
+					folder.create(true, true, null);
+				}
+				destPath = folder.getFullPath();
+			}
+			String importPath = curr.getAttribute("src"); //$NON-NLS-1$
+			if (importPath == null) {
+				importPath = ""; //$NON-NLS-1$
+				Logger.log(Logger.ERROR, "projectsetup descriptor: import missing"); //$NON-NLS-1$
+				return;
+			}
+
+			ZipFile zipFile = getZipFileFromPluginDir(importPath, getContributingPlugin(curr));
+			importFilesFromZip(zipFile, destPath, new SubProgressMonitor(monitor, 1));
+		}
+		catch (CoreException e) {
+			throw new InvocationTargetException(e);
+		}
+	}
+
+	private String getContributingPlugin(IConfigurationElement configurationElement) {
+		Object parent = configurationElement;
+		while (parent != null) {
+			if (parent instanceof IExtension) {
+				return ((IExtension) parent).getNamespace();
+			}
+			parent = ((IConfigurationElement) parent).getParent();
+		}
+		return null;
+	}
+
+	public IResource getElementToOpen() {
+		return elementToOpen;
+	}
+
+	private ZipFile getZipFileFromPluginDir(String pluginRelativePath, String symbolicName) throws CoreException {
+		try {
+			Bundle bundle = Platform.getBundle(symbolicName);
+			URL starterURL = new URL(bundle.getEntry("/"), pluginRelativePath); //$NON-NLS-1$
+			return new ZipFile(Platform.asLocalURL(starterURL).getFile());
+		}
+		catch (IOException e) {
+			String message = pluginRelativePath + ": " + e.getMessage(); //$NON-NLS-1$
+			Status status = new Status(IStatus.ERROR, XMLUIPlugin.ID, IStatus.ERROR, message, e);
+			throw new CoreException(status);
+		}
+	}
+
+	private void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+		ZipFileStructureProvider structureProvider = new ZipFileStructureProvider(srcZipFile);
+		ImportOperation op = new ImportOperation(destPath, structureProvider.getRoot(), structureProvider, overwriteQuery);
+		op.run(monitor);
+	}
+
+	/*
+	 * @see IRunnableWithProgress#run(IProgressMonitor)
+	 */
+	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+		if (monitor == null) {
+			monitor = new NullProgressMonitor();
+		}
+		try {
+			monitor.beginTask(XMLWizardsMessages.ExampleProjectCreationOperation_op_desc, pages.length);
+			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+
+			for (int i = 0; i < pages.length; i++) {
+				createProject(root, pages[i], new SubProgressMonitor(monitor, 1));
+			}
+		}
+		finally {
+			monitor.done();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationWizard.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationWizard.java
new file mode 100644
index 0000000..d968c92
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationWizard.java
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
+import org.eclipse.ui.dialogs.IOverwriteQuery;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
+import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+public class ExampleProjectCreationWizard extends Wizard implements INewWizard, IExecutableExtension {
+
+	private class ImportOverwriteQuery implements IOverwriteQuery {
+
+		private int openDialog(final String file) {
+			final int[] result = {IDialogConstants.CANCEL_ID};
+			getShell().getDisplay().syncExec(new Runnable() {
+				public void run() {
+					String title = XMLWizardsMessages.ExampleProjectCreationWizard_overwritequery_title;
+					String msg = NLS.bind(XMLWizardsMessages.ExampleProjectCreationWizard_overwritequery_message, file);
+					String[] options = {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.YES_TO_ALL_LABEL, IDialogConstants.CANCEL_LABEL};
+					MessageDialog dialog = new MessageDialog(getShell(), title, null, msg, MessageDialog.QUESTION, options, 0);
+					result[0] = dialog.open();
+				}
+			});
+			return result[0];
+		}
+
+		public String queryOverwrite(String file) {
+			String[] returnCodes = {YES, NO, ALL, CANCEL};
+			int returnVal = openDialog(file);
+			return returnVal < 0 ? CANCEL : returnCodes[returnVal];
+		}
+	}
+
+	private IConfigurationElement wizardConfigElement;
+	private IConfigurationElement exampleConfigElement;
+
+	private String EXAMPLE_WIZARD_XP_ID = "org.eclipse.wst.common.ui.exampleProjectCreationWizard"; //$NON-NLS-1$
+
+	private ExampleProjectCreationWizardPage[] pages;
+
+	private final String WEB_BROWSER_ID = "org.eclipse.ui.browser.editor"; //$NON-NLS-1$
+
+	public ExampleProjectCreationWizard() {
+		super();
+		setDialogSettings(XMLUIPlugin.getDefault().getDialogSettings());
+		setWindowTitle(XMLWizardsMessages.ExampleProjectCreationWizard_title);
+		setNeedsProgressMonitor(true);
+	}
+
+	/*
+	 * @see Wizard#addPages
+	 */
+	public void addPages() {
+		super.addPages();
+
+		if (exampleConfigElement == null) {
+			return;
+		}
+		IConfigurationElement[] children = exampleConfigElement.getChildren("projectsetup"); //$NON-NLS-1$
+		if ((children == null) || (children.length == 0)) {
+			Logger.log(Logger.ERROR, "descriptor must contain one ore more projectsetup tags"); //$NON-NLS-1$
+			return;
+		}
+
+		pages = new ExampleProjectCreationWizardPage[children.length];
+
+		for (int i = 0; i < children.length; i++) {
+			pages[i] = new ExampleProjectCreationWizardPage(i, children[i]);
+			addPage(pages[i]);
+		}
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
+		if (exampleConfigElement != null) {
+			String banner = exampleConfigElement.getAttribute("banner"); //$NON-NLS-1$
+			if (banner != null) {
+				URL imageURL = Platform.find(Platform.getBundle(exampleConfigElement.getDeclaringExtension().getNamespace()), new Path(banner));
+				ImageDescriptor desc = ImageDescriptor.createFromURL(imageURL);
+				setDefaultPageImageDescriptor(desc);
+			}
+		}
+	}
+
+	protected IConfigurationElement[] getExtendedConfigurationElements() {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IExtensionPoint exampleWizardXP = registry.getExtensionPoint(EXAMPLE_WIZARD_XP_ID);
+		if (exampleWizardXP == null) {
+			return new IConfigurationElement[0];
+		}
+		IExtension extension = exampleWizardXP.getExtension(getWizardExtensionId());
+		if (extension != null) {
+			return extension.getConfigurationElements();
+		}
+		IConfigurationElement[] exampleWizardCEs = exampleWizardXP.getConfigurationElements();
+		return exampleWizardCEs;
+	}
+
+	private void handleException(Throwable target) {
+		String title = XMLWizardsMessages.ExampleProjectCreationWizard_op_error_title;
+		String message = XMLWizardsMessages.ExampleProjectCreationWizard_op_error_message;
+		if (target instanceof CoreException) {
+			IStatus status = ((CoreException) target).getStatus();
+			ErrorDialog.openError(getShell(), title, message, status);
+			Logger.logException(status.getMessage(), status.getException());
+		}
+		else {
+			MessageDialog.openError(getShell(), title, target.getMessage());
+			Logger.logException(target);
+		}
+	}
+
+	private void openResource(final IResource resource) {
+		if (resource.getType() != IResource.FILE) {
+			return;
+		}
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (window == null) {
+			return;
+		}
+		final IWorkbenchPage activePage = window.getActivePage();
+		if (activePage != null) {
+			final Display display = getShell().getDisplay();
+			display.asyncExec(new Runnable() {
+				public void run() {
+					try {
+						IDE.openEditor(activePage, (IFile) resource, WEB_BROWSER_ID, true);
+					}
+					catch (PartInitException e) {
+						Logger.logException(e);
+					}
+				}
+			});
+			BasicNewResourceWizard.selectAndReveal(resource, activePage.getWorkbenchWindow());
+		}
+	}
+
+	/*
+	 * @see Wizard#performFinish
+	 */
+	public boolean performFinish() {
+		ExampleProjectCreationOperation runnable = new ExampleProjectCreationOperation(pages, new ImportOverwriteQuery());
+
+		IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(runnable);
+		try {
+			getContainer().run(false, true, op);
+		}
+		catch (InvocationTargetException e) {
+			handleException(e.getTargetException());
+			return false;
+		}
+		catch (InterruptedException e) {
+			return false;
+		}
+		BasicNewProjectResourceWizard.updatePerspective(wizardConfigElement);
+		IResource res = runnable.getElementToOpen();
+		if (res != null) {
+			openResource(res);
+		}
+		return true;
+	}
+
+	/**
+	 * Stores the configuration element for the wizard. The config element
+	 * will be used in <code>performFinish</code> to set the result
+	 * perspective.
+	 */
+	public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
+		wizardConfigElement = cfig;
+		String title = wizardConfigElement.getAttribute("name"); //$NON-NLS-1$
+		if (title != null) {
+			setWindowTitle(title);
+		}
+		String wizardId = getWizardExtensionId();
+		IConfigurationElement[] exampleWizardCEs = getExtendedConfigurationElements();
+		for (int i = 0; i < exampleWizardCEs.length; i++) {
+			IConfigurationElement element = exampleWizardCEs[i];
+			String extWizardId = element.getAttribute("id"); //$NON-NLS-1$
+			if ((wizardId != null) && (extWizardId != null) && wizardId.equals(extWizardId)) {
+				exampleConfigElement = element;
+			}
+		}
+		// initializeDefaultPageImageDescriptor();
+	}
+
+	public String getWizardExtensionId() {
+		return wizardConfigElement.getAttribute("id"); //$NON-NLS-1$
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationWizardPage.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationWizardPage.java
new file mode 100644
index 0000000..3f13b33
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExampleProjectCreationWizardPage.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
+
+public class ExampleProjectCreationWizardPage extends WizardNewProjectCreationPage {
+
+	private IConfigurationElement configurationElement;
+
+	public ExampleProjectCreationWizardPage(int pageNumber, IConfigurationElement elem) {
+
+		super("page" + pageNumber); //$NON-NLS-1$
+		configurationElement = elem;
+
+		String name = getAttribute(elem, "name"); //$NON-NLS-1$
+		setInitialProjectName(calculateInitialProjectName(name));
+
+		setDescription(getAttribute(configurationElement, "pagedescription")); //$NON-NLS-1$
+		setTitle(getAttribute(configurationElement, "pagetitle")); //$NON-NLS-1$
+
+	}
+
+	/*
+	 * Set the default project name that is to appear on the initialPage page
+	 * of this wizard.
+	 */
+	protected String calculateInitialProjectName(String projectName) {
+		IProject projectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		if (!projectHandle.exists()) {
+			return projectName;
+		}
+		// Change the name until it doesn't exists. Try 9 times and then
+		// give up.
+		for (int i = 1; i < 10; i++) {
+			projectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName + i);
+			if (!projectHandle.exists()) {
+				return projectName + i;
+			}
+		}
+		return projectName + "9"; //$NON-NLS-1$
+
+	}
+
+	private String getAttribute(IConfigurationElement elem, String tag) {
+		String res = elem.getAttribute(tag);
+		if (res == null) {
+			return '!' + tag + '!';
+		}
+		return res;
+	}
+
+
+
+	/**
+	 * Returns the configuration element of this page.
+	 * 
+	 * @return Returns a IConfigurationElement
+	 */
+	public IConfigurationElement getConfigurationElement() {
+		return configurationElement;
+	}
+
+	/**
+	 * @see org.eclipse.ui.dialogs.WizardNewProjectCreationPage#validatePage()
+	 */
+	protected boolean validatePage() {
+		if (!super.validatePage()) {
+			return false;
+		}
+
+		String projectName = getProjectName();
+		if (projectName == null) {
+			return false;
+		}
+
+		IWizard wizard = getWizard();
+		if (wizard instanceof ExampleProjectCreationWizard) {
+			IWizardPage[] pages = wizard.getPages();
+			for (int i = 0; i < pages.length; i++) {
+				if ((pages[i] != this) && (pages[i] instanceof ExampleProjectCreationWizardPage)) {
+					if (projectName.equals(((ExampleProjectCreationWizardPage) pages[i]).getProjectName())) {
+						setErrorMessage(XMLWizardsMessages.ExampleProjectCreationWizardPage_error_alreadyexists);
+						return false;
+					}
+				}
+			}
+		}
+
+		return true;
+	}
+
+
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExportXMLCatalogWizard.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExportXMLCatalogWizard.java
new file mode 100644
index 0000000..478d459
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ExportXMLCatalogWizard.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 Standards for Technology in Automotive Retail (STAR) and
+ * others. All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver/STAR - dcarver@starstandard.org/d_a_carver@yahoo.com - bug 192568
+ *            Initial API - This implements the functionality of the
+ *            old Export Dialog for the XML Catalog. 
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IExportWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.CatalogSet;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+public class ExportXMLCatalogWizard extends BasicNewFileResourceWizard implements IExportWizard {
+
+	protected WizardNewFileCreationPage exportPage = null;
+	protected ICatalog workingUserCatalog = null;
+	protected ICatalog userCatalog = null;
+	
+	public ExportXMLCatalogWizard() {
+		setWindowTitle(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_EXPORT_TITLE);
+		ImageDescriptor descriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_WIZBAN_GENERATEXML);
+		setDefaultPageImageDescriptor(descriptor);
+		ICatalog defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs();
+		for (int i = 0; i < nextCatalogs.length; i++) {
+			INextCatalog catalog = nextCatalogs[i];
+			ICatalog referencedCatalog = catalog.getReferencedCatalog();
+			if (referencedCatalog != null) {
+				if (XMLCorePlugin.USER_CATALOG_ID.equals(referencedCatalog.getId())) {
+					userCatalog = referencedCatalog;
+				}
+			}
+		}
+		CatalogSet tempCatalogSet = new CatalogSet();
+		workingUserCatalog = tempCatalogSet.lookupOrCreateCatalog("working", ""); //$NON-NLS-1$ //$NON-NLS-2$
+		workingUserCatalog.addEntriesFromCatalog(userCatalog);
+
+	}
+
+	public boolean performFinish() {
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		IWorkspaceRoot workspaceRoot = workspace.getRoot();
+		String workspacePath = workspaceRoot.getLocation().toOSString();
+		String fullPath = workspacePath + exportPage.getContainerFullPath().toOSString();
+		String requiredString=fullPath + File.separator + exportPage.getFileName();
+		try {
+			IFile file = exportPage.createNewFile();
+			workingUserCatalog.setLocation(requiredString);
+			workingUserCatalog.save();
+			file.refreshLocal(IResource.DEPTH_ZERO, null);
+		} catch (Exception ex) {
+			return false;
+		}
+		return true;
+	}
+	
+	public void addPages() {
+		exportPage = new WizardNewFileCreationPage("XML Catalog Export",  getSelection());
+		exportPage.setTitle(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_EXPORT_TITLE);
+		exportPage.setDescription(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_EXPORT_DESCRIPTION);
+		exportPage.setFileExtension("xml"); //$NON-NLS-1$
+		
+		addPage(exportPage);
+	}
+	
+	public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
+		super.init(workbench, currentSelection);
+		setWindowTitle(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_EXPORT_TITLE);
+		ImageDescriptor descriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_WIZBAN_GENERATEXML);
+		setDefaultPageImageDescriptor(descriptor);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/IXMLWizardHelpContextIds.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/IXMLWizardHelpContextIds.java
new file mode 100644
index 0000000..e342efa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/IXMLWizardHelpContextIds.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+/**
+ * Help context ids for the xml wizard.
+ * <p>
+ * This interface contains constants only; it is not intended to be
+ * implemented.
+ * </p>
+ */
+interface IXMLWizardHelpContextIds {
+	// org.eclipse.wst.xml.ui.
+	public static final String PREFIX = XMLUIPlugin.ID + "."; //$NON-NLS-1$
+	// Create XML file from a DTD file radio
+	public static final String XML_NEWWIZARD_CREATEXML1_HELPID = PREFIX + "xmlc0101"; //$NON-NLS-1$
+	// Create XML file from an XML schema file radio button
+	public static final String XML_NEWWIZARD_CREATEXML2_HELPID = PREFIX + "xmlc0102"; //$NON-NLS-1$
+	// Create XML file from scratch radio button
+	public static final String XML_NEWWIZARD_CREATEXML3_HELPID = PREFIX + "xmlc0103"; //$NON-NLS-1$
+	// Select Source file page
+	public static final String XML_NEWWIZARD_SELECTSOURCE_HELPID = PREFIX + "xmlc0500"; //$NON-NLS-1$
+	// Root element for both DTD and XML schema
+	public static final String XML_NEWWIZARD_SELECTROOTELEMENT_HELPID = PREFIX + "xmlc0410"; //$NON-NLS-1$
+	// Create Optional Attributes
+	public static final String XML_NEWWIZARD_SELECTROOTELEMENT1_HELPID = PREFIX + "xmlc0441"; //$NON-NLS-1$
+	// Create Optional Elements
+	public static final String XML_NEWWIZARD_SELECTROOTELEMENT2_HELPID = PREFIX + "xmlc0442"; //$NON-NLS-1$
+	// Create first choice of required choice
+	public static final String XML_NEWWIZARD_SELECTROOTELEMENT3_HELPID = PREFIX + "xmlc0443"; //$NON-NLS-1$
+	// Fill elements and attribute with data
+	public static final String XML_NEWWIZARD_SELECTROOTELEMENT4_HELPID = PREFIX + "xmlc0444"; //$NON-NLS-1$
+	// System ID for DTD
+	public static final String XML_NEWWIZARD_SELECTROOTELEMENT5_HELPID = PREFIX + "xmlc0210"; //$NON-NLS-1$
+	// Public ID for DTD
+	public static final String XML_NEWWIZARD_SELECTROOTELEMENT6_HELPID = PREFIX + "xmlc0220"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ImportXMLCatalogPage.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ImportXMLCatalogPage.java
new file mode 100644
index 0000000..38e3447
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ImportXMLCatalogPage.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 Standards for Technology in Automotive Retail (STAR) and
+ * others. All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver/STAR - dcarver@starstandard.org/d_a_carver@yahoo.com - bug 192568
+ *            Initial API - This implements the functionality of the
+ *            old Import Dialog for the XML Catalog. 
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.ui.internal.viewers.SelectSingleFileView;
+
+public class ImportXMLCatalogPage extends WizardPage {
+
+	protected SelectSingleFileView selectSingleFileView;
+	protected IStructuredSelection selection;
+	
+
+	public ImportXMLCatalogPage() {
+		super(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_IMPORT_TITLE);
+		setTitle(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_IMPORT_TITLE);
+		selection = new StructuredSelection();
+		selectSingleFileView = new SelectSingleFileView(selection, false) {
+			public void createFilterControl(Composite composite) {
+				ImportXMLCatalogPage.this.createFilterControl(composite);
+			}
+		};
+
+	}
+
+	public void createControl(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		composite.setLayout(new GridLayout());
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.widthHint = 350;
+		gd.heightHint = 350;
+		composite.setLayoutData(gd);
+		String[] extensions = { ".xmlcatalog", ".xml" }; //$NON-NLS-1$ //$NON-NLS-2$
+		selectSingleFileView.addFilterExtensions(extensions);
+		selectSingleFileView.createControl(composite);
+		selectSingleFileView.setVisibleHelper(true);
+		selectSingleFileView.addSelectionChangedTreeListener(new ISelectionChangedListener(){
+			public void selectionChanged(SelectionChangedEvent event) {
+				ImportXMLCatalogPage.this.setPageComplete(selectSingleFileView.getFile() != null);
+			}
+		});
+		setControl(composite);
+	}
+
+	public void createFilterControl(Composite composite) {
+	}
+
+	public IFile getFile() {
+		return selectSingleFileView.getFile();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ImportXMLCatalogWizard.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ImportXMLCatalogWizard.java
new file mode 100644
index 0000000..f1200a2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/ImportXMLCatalogWizard.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail (STAR) and
+ * others. All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver/STAR - dcarver@starstandard.org/d_a_carver@yahoo.com - bug 192568
+ *            Initial API - This implements the functionality of the
+ *            old Import Dialog for the XML Catalog. 
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.CatalogSet;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.ui.internal.catalog.XMLCatalogMessages;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+public class ImportXMLCatalogWizard extends Wizard implements IImportWizard {
+
+	protected ImportXMLCatalogPage importPage = null;
+	protected ICatalog workingUserCatalog = null;
+	protected ICatalog userCatalog = null;
+	
+	public ImportXMLCatalogWizard() {
+		setWindowTitle(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_IMPORT_TITLE);
+		ImageDescriptor descriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_WIZBAN_GENERATEXML);
+		setDefaultPageImageDescriptor(descriptor);
+		ICatalog defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs();
+		for (int i = 0; i < nextCatalogs.length; i++) {
+			INextCatalog catalog = nextCatalogs[i];
+			ICatalog referencedCatalog = catalog.getReferencedCatalog();
+			if (referencedCatalog != null) {
+				if (XMLCorePlugin.USER_CATALOG_ID.equals(referencedCatalog.getId())) {
+					userCatalog = referencedCatalog;
+				}
+			}
+		}
+
+		CatalogSet tempCatalogSet = new CatalogSet();
+		workingUserCatalog = tempCatalogSet.lookupOrCreateCatalog("working", ""); //$NON-NLS-1$ //$NON-NLS-2$
+		workingUserCatalog.addEntriesFromCatalog(userCatalog);
+	}
+	
+	public boolean canFinish() {
+		return importPage.isPageComplete();
+	}
+
+	public boolean performFinish() {
+		IFile file = importPage.getFile();
+		if (file != null) {
+			String fileName = file.getLocation().toFile().toURI().toString();
+			try {
+				CatalogSet tempResourceSet = new CatalogSet();
+				ICatalog newCatalog = tempResourceSet.lookupOrCreateCatalog("temp", fileName); //$NON-NLS-1$
+				
+				workingUserCatalog.addEntriesFromCatalog(newCatalog);
+				userCatalog.clear();
+				userCatalog.addEntriesFromCatalog(workingUserCatalog);
+				userCatalog.save();
+			}
+			catch (Exception e) {
+				return false;
+			}
+		}
+		
+		return true;
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		// TODO Auto-generated method stub
+
+	}
+	
+	public void addPages() {
+		importPage = new ImportXMLCatalogPage();
+		importPage.setTitle(XMLCatalogMessages.UI_LABEL_IMPORT_DIALOG_HEADING);
+		importPage.setDescription(XMLWizardsMessages._UI_DIALOG_XMLCATALOG_IMPORT_DESCRIPTION);
+		importPage.setMessage(XMLCatalogMessages.UI_LABEL_IMPORT_DIALOG_MESSAGE);
+		addPage(importPage);
+		importPage.setPageComplete(false);
+	}
+}
+
+
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NamespaceInfoContentBuilder.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NamespaceInfoContentBuilder.java
new file mode 100644
index 0000000..09eed81
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NamespaceInfoContentBuilder.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAnyElement;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.ContentBuilder;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+
+public class NamespaceInfoContentBuilder extends ContentBuilder {
+	protected int count = 1;
+	public List list = new Vector();
+	protected Hashtable table = new Hashtable();
+
+	public NamespaceInfoContentBuilder() {
+		super();
+	}
+
+	public void visitCMElementDeclaration(CMElementDeclaration ed) {
+		if (ed.getProperty("http://org.eclipse.wst/cm/properties/definitionInfo") != null) //$NON-NLS-1$
+		{
+			super.visitCMElementDeclaration(ed);
+		}
+	}
+
+	protected void createAnyElementNode(CMAnyElement anyElement) {
+		String uri = anyElement.getNamespaceURI();
+		if ((uri != null) && !uri.startsWith("##")) //$NON-NLS-1$
+		{
+			if (table.get(uri) == null) {
+				NamespaceInfo info = new NamespaceInfo();
+				info.uri = uri;
+				info.prefix = "p" + count++; //$NON-NLS-1$
+				table.put(uri, info);
+				list.add(info);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewModelWizard.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewModelWizard.java
new file mode 100644
index 0000000..4a400f2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewModelWizard.java
@@ -0,0 +1,329 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *	   David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+
+public class NewModelWizard extends Wizard implements INewWizard {
+
+	protected IStructuredSelection fSelection;
+	protected IWorkbench fWorkbench;
+	protected String fCurrentDirectory;
+
+	public NewModelWizard() {
+		super();
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		this.fWorkbench = workbench;
+		this.fSelection = selection;
+	}
+
+	public boolean performFinish() {
+		boolean result = true;
+		WizardPage currentPage = (WizardPage) getContainer().getCurrentPage();
+		if (currentPage != null) {
+			result = currentPage.isPageComplete();
+		}
+		return result;
+	}
+
+	/**
+	 * showFileDialog
+	 */
+	public FileDialog showFileDialog(Shell shell, String defaultDirectory, String defaultFile, String[] filterExtensions) {
+		FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
+
+		// Get the last visit directory if we haven't defined a particular one
+		// here.
+		if ((defaultDirectory == null) || (defaultDirectory.length() == 0)) {
+			// defaultDirectory =
+			// Locate.instance(this).getLastSelectedDirectory(getResourcePath());
+		}
+
+		if ((defaultDirectory != null) && (defaultDirectory.length() != 0)) {
+			fileDialog.setFilterPath(defaultDirectory);
+		}
+
+		fileDialog.setFileName(defaultFile);
+		fileDialog.setFilterExtensions(filterExtensions);
+
+		fileDialog.open();
+
+		return fileDialog;
+	}
+
+
+	public void setCurrentDirectory(String currentDirectory1) {
+		this.fCurrentDirectory = currentDirectory1;
+	}
+
+
+	public void createWorkbenchResource(IContainer container, String fileName) {
+		IPath path = container.getFullPath();
+		path = path.append(fileName);
+		IFile file = container.getWorkspace().getRoot().getFile(path);
+		if (!file.exists()) {
+			try {
+				file.create(null, true, null);
+			}
+			catch (CoreException e) {
+				// XMLBuilderPlugin.getPlugin().getMsgLogger().write("Encountered
+				// exception creating file: " + e.getMessage());
+			}
+		}
+	}
+
+	/**
+	 * StartPage
+	 */
+	public class StartPage extends WizardPage implements Listener {
+		protected int selectedButton;
+		protected String[] radioButtonLabel;
+		protected Button[] radioButton;
+
+		public StartPage(String pageName, String[] radioButtonLabel) {
+			super(pageName);
+			this.radioButtonLabel = radioButtonLabel;
+			radioButton = new Button[radioButtonLabel.length];
+		}
+
+		public Button getRadioButtonAtIndex(int i) {
+			Button result = null;
+			if ((i >= 0) && (i < radioButton.length)) {
+				result = radioButton[i];
+			}
+			return result;
+		}
+
+		public int getSelectedRadioButtonIndex() {
+			int result = -1;
+			for (int i = 0; i < radioButton.length; i++) {
+				if (radioButton[i].getSelection()) {
+					result = i;
+				}
+			}
+			return result;
+		}
+
+		public void createControl(Composite parent) {
+			Composite base = new Composite(parent, SWT.NONE);
+			base.setLayout(new GridLayout());
+
+			// radio buttons' container
+			Composite radioButtonsGroup = new Composite(base, SWT.NONE);
+			GridLayout layout = new GridLayout();
+			layout.numColumns = 1;
+			layout.makeColumnsEqualWidth = true;
+			layout.marginWidth = 0;
+
+			radioButtonsGroup.setLayout(layout);
+			GridData gd = new GridData(GridData.FILL_BOTH);
+			gd.heightHint = 300;
+			gd.widthHint = 400;
+			radioButtonsGroup.setLayoutData(gd);
+
+			for (int i = 0; i < radioButtonLabel.length; i++) {
+				radioButton[i] = new Button(radioButtonsGroup, SWT.RADIO);
+				radioButton[i].setText(radioButtonLabel[i]);
+				radioButton[i].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+				// radioButton[i].addListener(SWT.Modify, this);
+			}
+			setControl(base);
+			setPageComplete(isPageComplete());
+			Dialog.applyDialogFont(parent);
+		}
+
+		public void handleEvent(Event event) {
+			if (event.type == SWT.Modify) {
+				setPageComplete(isPageComplete());
+			}
+		}
+	}
+
+
+	/**
+	 * NewFilePage
+	 */
+	public class NewFilePage extends WizardNewFileCreationPage {
+		public String defaultName = "NewFile"; //$NON-NLS-1$
+		public String defaultFileExtension = ".txt"; //$NON-NLS-1$
+		public String[] filterExtensions = {"*.txt"}; //$NON-NLS-1$
+		private List fValidExtensions = null;
+
+		public NewFilePage(IStructuredSelection selection) {
+			super("", selection); //$NON-NLS-1$
+		}
+
+		protected String computeDefaultFileName() {
+			int count = 0;
+			String fileName = defaultName + defaultFileExtension;
+			IPath containerFullPath = getContainerFullPath();
+			if (containerFullPath != null) {
+				while (true) {
+					IPath path = containerFullPath.append(fileName);
+					if (ResourcesPlugin.getWorkspace().getRoot().exists(path)) {
+						count++;
+						fileName = defaultName + count + defaultFileExtension;
+					}
+					else {
+						break;
+					}
+				}
+			}
+			return fileName;
+		}
+
+		// returns true if file of specified name exists in any case for
+		// selected container
+		protected String existsFileAnyCase(String fileName) {
+			if ((getContainerFullPath() != null) && (getContainerFullPath().isEmpty() == false) && (fileName.compareTo("") != 0)) //$NON-NLS-1$
+			{
+				// look through all resources at the specified container -
+				// compare in upper case
+				IResource parent = ResourcesPlugin.getWorkspace().getRoot().findMember(getContainerFullPath());
+				if (parent instanceof IContainer) {
+					IContainer container = (IContainer) parent;
+					try {
+						IResource[] members = container.members();
+						String enteredFileUpper = fileName.toUpperCase();
+						for (int i = 0; i < members.length; i++) {
+							String resourceUpperName = members[i].getName().toUpperCase();
+							if (resourceUpperName.equals(enteredFileUpper)) {
+								return members[i].getName();
+							}
+						}
+					}
+					catch (CoreException e) {
+					}
+				}
+			}
+			return null;
+		}
+
+
+		protected boolean validatePage() {
+			String fullFileName = getFileName();
+			if (!extensionValidForContentType(fullFileName)) {
+				setErrorMessage(NLS.bind(XMLWizardsMessages._ERROR_BAD_FILENAME_EXTENSION, getValidExtensions().toString()));
+				return false;
+			}
+			// no fileExtension, let's check for this file with default file
+			// extension
+			if (fullFileName.lastIndexOf('.') == -1)
+			{
+				fullFileName += defaultFileExtension;
+			}
+
+			if ((getContainerFullPath() != null) && (getContainerFullPath().isEmpty() == false) && (getFileName().compareTo("") != 0)) //$NON-NLS-1$
+			{
+				Path fullPath = new Path(getContainerFullPath().toString() + '/' + fullFileName);
+				IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(fullPath);
+				if (resource != null) {
+					setErrorMessage(XMLWizardsMessages._ERROR_FILE_ALREADY_EXISTS);
+					return false;
+				}
+			}
+
+			// check for file should be case insensitive
+			String sameName = existsFileAnyCase(fullFileName);
+			if (sameName != null) {
+				// ISSUE: is qualitifedFileName not needed, or is it supposed
+				// to be used in error message?
+				// String qualifiedFileName =
+				// getContainerFullPath().toString() + '/' + fullFileName;
+				setErrorMessage(XMLWizardsMessages._ERROR_FILE_ALREADY_EXISTS + " " + sameName); //$NON-NLS-1$
+				return false;
+			}
+
+			return super.validatePage();
+		}
+
+		public void createControl(Composite parent) {
+			// inherit default container and name specification widgets
+			super.createControl(parent);
+			this.setFileName(computeDefaultFileName());
+			setPageComplete(validatePage());
+		}
+
+		/**
+		 * Get list of valid extensions for XML Content type
+		 * 
+		 * @return List
+		 */
+		List getValidExtensions() {
+			if (fValidExtensions == null) {
+				IContentType type = Platform.getContentTypeManager().getContentType(ContentTypeIdForXML.ContentTypeID_XML);
+				fValidExtensions = new ArrayList(Arrays.asList(type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC)));
+			}
+			return fValidExtensions;
+		}
+
+		/**
+		 * Verifies if fileName is valid name for content type. Takes base
+		 * content type into consideration.
+		 * 
+		 * @param fileName
+		 * @return true if extension is valid for this content type
+		 */
+		boolean extensionValidForContentType(String fileName) {
+			boolean valid = false;
+
+			IContentType type = Platform.getContentTypeManager().getContentType(ContentTypeIdForXML.ContentTypeID_XML);
+			// there is currently an extension
+			if (fileName.lastIndexOf('.') != -1) {
+				// check what content types are associated with current
+				// extension
+				IContentType[] types = Platform.getContentTypeManager().findContentTypesFor(fileName);
+				int i = 0;
+				while ((i < types.length) && !valid) {
+					valid = types[i].isKindOf(type);
+					++i;
+				}
+			}
+			else {
+				valid = true; // no extension so valid
+			}
+			return valid;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLGenerator.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLGenerator.java
new file mode 100644
index 0000000..476a754
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLGenerator.java
@@ -0,0 +1,422 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.ContentModelManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.ContentBuilder;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMContentBuilderImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMWriter;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class NewXMLGenerator {
+
+	protected String grammarURI;
+	protected CMDocument cmDocument;
+	protected int buildPolicy;
+	protected String rootElementName;
+
+	protected ICatalogEntry xmlCatalogEntry;
+	protected int optionalElementDepthLimit = -1;
+
+	// info for dtd
+	protected String publicId;
+	protected String systemId;
+	protected String defaultSystemId;
+
+	// info for xsd
+	public List namespaceInfoList;
+
+	public NewXMLGenerator() {
+		super();
+	}
+
+	public NewXMLGenerator(String grammarURI, CMDocument cmDocument) {
+		this.grammarURI = grammarURI;
+		this.cmDocument = cmDocument;
+	}
+
+
+	public static CMDocument createCMDocument(String uri, String[] errorInfo) {
+		String title = null;
+		String message = null;
+		List errorList = new Vector();
+		CMDocument cmDocument = null;
+
+		if (URIHelper.isReadableURI(uri, true)) {
+			// (cs) assume the uri has been provided in a normalized form
+			cmDocument = ContentModelManager.getInstance().createCMDocument(uri, null);
+
+			if (uri.endsWith(".dtd")) { //$NON-NLS-1$
+				if (errorList.size() > 0) {
+					title = XMLWizardsMessages._UI_INVALID_GRAMMAR_ERROR;
+					message = XMLWizardsMessages._UI_LABEL_ERROR_DTD_INVALID_INFO;
+				}
+			}
+			else // ".xsd"
+			{
+				// To be consistent with the schema editor validation
+				XMLSchemaValidationChecker validator = new XMLSchemaValidationChecker();
+				if (!validator.isValid(uri)) {
+					title = XMLWizardsMessages._UI_INVALID_GRAMMAR_ERROR;
+					message = XMLWizardsMessages._UI_LABEL_ERROR_SCHEMA_INVALID_INFO;
+				}
+				else if (cmDocument != null) {
+					int globalElementCount = cmDocument.getElements().getLength();
+					if (globalElementCount == 0) {
+						title = XMLWizardsMessages._UI_WARNING_TITLE_NO_ROOT_ELEMENTS;
+						message = XMLWizardsMessages._UI_WARNING_MSG_NO_ROOT_ELEMENTS;
+					}
+				}
+			}
+		}
+		else {
+			title = XMLWizardsMessages._UI_WARNING_TITLE_NO_ROOT_ELEMENTS;
+			message = XMLWizardsMessages._UI_WARNING_URI_NOT_FOUND_COLON + " " + uri; //$NON-NLS-1$
+		}
+		errorInfo[0] = title;
+		errorInfo[1] = message;
+
+		return cmDocument;
+	}
+	
+	private String applyLineDelimiter(IFile file, String text) {
+		String systemLineSeparator = System.getProperty("line.separator");
+		String lineDelimiter = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, systemLineSeparator, new IScopeContext[] {new ProjectScope(file.getProject()), new InstanceScope() });//$NON-NLS-1$
+		if(!systemLineSeparator.equals(lineDelimiter)) {
+			String convertedText = StringUtils.replace(text, "\r\n", "\n");
+			convertedText = StringUtils.replace(convertedText, "\r", "\n");
+			convertedText = StringUtils.replace(convertedText, "\n", lineDelimiter);
+			return convertedText;
+		}
+		return text;
+	}
+
+	/**
+	 * @deprecated use createTemplateXMLDocument(IFile, String) instead
+	 */
+	public void createEmptyXMLDocument(IFile newFile) throws Exception {
+		String charSet = getUserPreferredCharset();
+		String contents = "<?xml version=\"1.0\" encoding=\"" + charSet + "\"?>"; //$NON-NLS-1$ //$NON-NLS-2$
+		createTemplateXMLDocument(newFile, contents);
+	}
+	
+	void createTemplateXMLDocument(IFile newFile, String contents) throws Exception {
+		if (contents != null) {
+			String charSet = getUserPreferredCharset();
+			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+	
+			PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, charSet));
+			contents = applyLineDelimiter(newFile, contents);
+			writer.println(contents);
+			writer.flush();
+			outputStream.close();
+	
+			ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+			newFile.setContents(inputStream, true, true, null);
+			inputStream.close();
+		}
+	}
+
+	private String getUserPreferredCharset() {
+		Preferences preference = XMLCorePlugin.getDefault().getPluginPreferences();
+		String charSet = preference.getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
+		return charSet;
+	}
+
+	public void createXMLDocument(String xmlFileName) throws Exception {
+		IContentType contentType = Platform.getContentTypeManager().findContentTypeFor(xmlFileName);
+		String charset = null;
+		if (contentType != null) {
+			charset = contentType.getDefaultCharset();
+		}
+		ByteArrayOutputStream outputStream = createXMLDocument(xmlFileName, charset);
+
+		File file = new File(xmlFileName);
+		FileOutputStream fos = new FileOutputStream(file);
+		outputStream.writeTo(fos);
+		fos.close();
+	}
+
+
+	public void createXMLDocument(IFile newFile, String xmlFileName) throws Exception {
+		String charset = newFile.getCharset();
+		ByteArrayOutputStream outputStream = createXMLDocument(xmlFileName, charset);
+
+		String contents = outputStream.toString(charset);
+		contents = applyLineDelimiter(newFile, contents);
+
+		ByteArrayInputStream inputStream = new ByteArrayInputStream(contents.getBytes(charset));
+		newFile.setContents(inputStream, true, true, null);
+		inputStream.close();
+	}
+
+
+	public ByteArrayOutputStream createXMLDocument(String xmlFileName, String charset) throws Exception {
+		if (charset == null) {
+			charset = getUserPreferredCharset();
+			if (charset == null) {
+				charset = "UTF-8"; //$NON-NLS-1$
+			}
+		}
+		CMDocument cmDocument = getCMDocument();
+
+		Assert.isNotNull(cmDocument);
+		Assert.isNotNull(getRootElementName());
+
+		// create the xml model
+		CMNamedNodeMap nameNodeMap = cmDocument.getElements();
+		CMElementDeclaration cmElementDeclaration = (CMElementDeclaration) nameNodeMap.getNamedItem(getRootElementName());
+
+		Document xmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+		DOMContentBuilderImpl contentBuilder = new DOMContentBuilderImpl(xmlDocument);
+
+		// this 'uglyTempHack' flag is required in order to supress the
+		// creation a default encoding
+		// we'll handle this later in the domWriter.print() method used below
+		//
+		contentBuilder.supressCreationOfDoctypeAndXMLDeclaration = true;
+		contentBuilder.setBuildPolicy(buildPolicy);
+		contentBuilder.setOptionalElementDepthLimit(optionalElementDepthLimit);
+		contentBuilder.setExternalCMDocumentSupport(new MyExternalCMDocumentSupport(namespaceInfoList, xmlFileName));
+		contentBuilder.createDefaultRootContent(cmDocument, cmElementDeclaration, namespaceInfoList);
+
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, charset);
+
+		DOMWriter domWriter = new DOMWriter(outputStreamWriter);
+
+		// TODO... instead of relying on file extensions, we need to keep
+		// track of the grammar type
+		// better yet we should reate an SSE document so that we can format it
+		// nicely before saving
+		// then we won't need the DOMWriter at all
+		//
+		domWriter.print(xmlDocument, charset, cmDocument.getNodeName(), getNonWhitespaceString(getPublicId()), getNonWhitespaceString(getSystemId()));
+		outputStream.flush();
+		outputStream.close();
+
+		return outputStream;
+	}
+
+
+	public void createNamespaceInfoList() {
+		List result = new Vector();
+		if (cmDocument != null) {
+			result = (List) cmDocument.getProperty("http://org.eclipse.wst/cm/properties/completeNamespaceInfo"); //$NON-NLS-1$
+			if (result != null) {
+				int size = result.size();
+				for (int i = 0; i < size; i++) {
+					NamespaceInfo info = (NamespaceInfo) result.get(i);
+					if (i == 0) {
+						String locationInfo = null;
+						if (xmlCatalogEntry != null) {
+							if (xmlCatalogEntry.getEntryType() == ICatalogEntry.ENTRY_TYPE_PUBLIC) {
+								locationInfo = xmlCatalogEntry.getAttributeValue(ICatalogEntry.ATTR_WEB_URL);
+							}
+							else {
+								locationInfo = xmlCatalogEntry.getKey();
+							}
+						}
+						if (locationInfo == null) {
+							locationInfo = defaultSystemId;
+						}
+						info.locationHint = locationInfo;
+						info.setProperty("locationHint-readOnly", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+						info.setProperty("uri-readOnly", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+						info.setProperty("unremovable", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+					} else {
+						info.locationHint = null;
+					}
+				}
+			}
+
+			NamespaceInfoContentBuilder builder = new NamespaceInfoContentBuilder();
+			builder.setBuildPolicy(ContentBuilder.BUILD_ONLY_REQUIRED_CONTENT);
+			builder.visitCMNode(cmDocument);
+			result.addAll(builder.list);
+		}
+		namespaceInfoList = result;
+	}
+
+
+	public boolean isMissingNamespaceLocation() {
+		boolean result = false;
+		for (Iterator i = namespaceInfoList.iterator(); i.hasNext();) {
+			NamespaceInfo info = (NamespaceInfo) i.next();
+			if (info.locationHint == null) {
+				result = true;
+				break;
+			}
+		}
+		return result;
+	}
+
+
+	public String[] getNamespaceInfoErrors() {
+		String[] errorList = null;
+
+// No warnings should be given when namespaces entries have missing location hints
+// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=105128		
+//		if ((namespaceInfoList != null) && isMissingNamespaceLocation()) {
+//			String title = XMLWizardsMessages._UI_LABEL_NO_LOCATION_HINT;
+//			String message = XMLWizardsMessages._UI_WARNING_MSG_NO_LOCATION_HINT_1 + " " + XMLWizardsMessages._UI_WARNING_MSG_NO_LOCATION_HINT_2 + "\n\n" + XMLWizardsMessages._UI_WARNING_MSG_NO_LOCATION_HINT_3; //$NON-NLS-1$ //$NON-NLS-2$
+//
+//			errorList = new String[2];
+//			errorList[0] = title;
+//			errorList[1] = message;
+//		}
+		return errorList;
+	}
+
+
+	public void setXMLCatalogEntry(ICatalogEntry catalogEntry) {
+		xmlCatalogEntry = catalogEntry;
+	}
+
+	public ICatalogEntry getXMLCatalogEntry() {
+		return xmlCatalogEntry;
+	}
+
+
+	public void setBuildPolicy(int policy) {
+		buildPolicy = policy;
+	}
+
+
+	public void setDefaultSystemId(String sysId) {
+		defaultSystemId = sysId;
+	}
+
+	public String getDefaultSystemId() {
+		return defaultSystemId;
+	}
+
+	public void setSystemId(String sysId) {
+		systemId = sysId;
+	}
+
+	public String getSystemId() {
+		return systemId;
+	}
+
+	public void setPublicId(String pubId) {
+		publicId = pubId;
+	}
+
+	public String getPublicId() {
+		return publicId;
+	}
+
+	public void setGrammarURI(String gramURI) {
+		grammarURI = gramURI;
+	}
+
+	public String getGrammarURI() {
+		return grammarURI;
+	}
+
+	public void setCMDocument(CMDocument cmDoc) {
+		cmDocument = cmDoc;
+	}
+
+	public CMDocument getCMDocument() {
+		return cmDocument;
+	}
+
+	public void setRootElementName(String rootName) {
+		rootElementName = rootName;
+	}
+
+	public String getRootElementName() {
+		return rootElementName;
+	}
+
+
+	protected class MyExternalCMDocumentSupport implements DOMContentBuilderImpl.ExternalCMDocumentSupport {
+		protected List namespaceInfoList1;
+		protected URIResolver idResolver;
+		protected String resourceLocation;
+
+		protected MyExternalCMDocumentSupport(List namespaceInfoListParam, String resourceLocation) {
+			this.namespaceInfoList1 = namespaceInfoListParam;
+			this.resourceLocation = resourceLocation;
+			idResolver = URIResolverPlugin.createResolver();
+		}
+
+		public CMDocument getCMDocument(Element element, String namespaceURI) {
+			CMDocument result = null;
+			if ((namespaceURI != null) && (namespaceURI.trim().length() > 0)) {
+				String locationHint = null;
+				for (Iterator i = namespaceInfoList1.iterator(); i.hasNext();) {
+					NamespaceInfo info = (NamespaceInfo) i.next();
+					if (namespaceURI.equals(info.uri)) {
+						locationHint = info.locationHint;
+						break;
+					}
+				}
+				if (locationHint != null) {
+					grammarURI = idResolver.resolve(resourceLocation, locationHint, locationHint);
+					result = ContentModelManager.getInstance().createCMDocument(getGrammarURI(), null);
+				}
+			}
+			else {
+				result = cmDocument;
+			}
+			return result;
+		}
+	}
+
+	public static String getNonWhitespaceString(String string) {
+		String result = null;
+		if (string != null) {
+			if (string.trim().length() > 0) {
+				result = string;
+			}
+		}
+		return result;
+	}
+	
+	public void setOptionalElementDepthLimit(int optionalElementDepthLimit) {
+		this.optionalElementDepthLimit = optionalElementDepthLimit;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLHandler.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLHandler.java
new file mode 100644
index 0000000..38c2669
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLHandler.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class NewXMLHandler extends AbstractHandler implements IHandler {
+
+	/**
+	 * 
+	 */
+	public NewXMLHandler() {
+		super();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IWorkbenchWindow workbenchWindow = 	HandlerUtil.getActiveWorkbenchWindow(event);
+		ISelection selection = workbenchWindow.getSelectionService().getSelection();
+		Object selectedObject = getSelection(selection);
+
+		if ((selectedObject instanceof IFile) && (selection instanceof IStructuredSelection)) {
+			IFile file = (IFile) selectedObject;
+			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+			try {
+				NewXMLWizard.showDialog(workbenchWindow.getShell(), file, structuredSelection);
+			}
+			catch (Exception e) {
+				// XMLCorePlugin.getDefault().getLog().log();
+			}
+		}
+		return null;
+	}
+	
+	public static Object getSelection(ISelection selection) {
+		if (selection == null) {
+			return null;
+		} 
+
+		Object result = null;
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection es = (IStructuredSelection) selection;
+			Iterator i = es.iterator();
+			if (i.hasNext()) {
+				result = i.next();
+			}
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLTemplatesWizardPage.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLTemplatesWizardPage.java
new file mode 100644
index 0000000..0a4b580
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLTemplatesWizardPage.java
@@ -0,0 +1,524 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.templates.DocumentTemplateContext;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.ui.StructuredTextViewerConfigurationXML;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+import org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeIdsXML;
+
+/**
+ * Templates page in new file wizard. Allows users to select a new file
+ * template to be applied in new file.
+ * 
+ */
+public class NewXMLTemplatesWizardPage extends WizardPage {
+
+	/**
+	 * Content provider for templates
+	 */
+	private class TemplateContentProvider implements IStructuredContentProvider {
+		/** The template store. */
+		private TemplateStore fStore;
+
+		/*
+		 * @see IContentProvider#dispose()
+		 */
+		public void dispose() {
+			fStore = null;
+		}
+
+		/*
+		 * @see IStructuredContentProvider#getElements(Object)
+		 */
+		public Object[] getElements(Object input) {
+			return fStore.getTemplates(TemplateContextTypeIdsXML.NEW);
+		}
+
+		/*
+		 * @see IContentProvider#inputChanged(Viewer, Object, Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			fStore = (TemplateStore) newInput;
+		}
+	}
+
+	/**
+	 * Label provider for templates.
+	 */
+	private class TemplateLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+		/*
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
+		 *      int)
+		 */
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		/*
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object,
+		 *      int)
+		 */
+		public String getColumnText(Object element, int columnIndex) {
+			Template template = (Template) element;
+
+			switch (columnIndex) {
+				case 0 :
+					return template.getName();
+				case 1 :
+					return template.getDescription();
+				default :
+					return ""; //$NON-NLS-1$
+			}
+		}
+	}
+
+	/** Last selected template name */
+	private String fLastSelectedTemplateName;
+	/** The viewer displays the pattern of selected template. */
+	private SourceViewer fPatternViewer;
+	/** The table presenting the templates. */
+	private TableViewer fTableViewer;
+	/** Template store used by this wizard page */
+	private TemplateStore fTemplateStore;
+	/** Checkbox for using templates. */
+	private Button fUseTemplateButton;
+
+	public NewXMLTemplatesWizardPage() {
+		super("NewXMLTemplatesWizardPage", XMLWizardsMessages.NewXMLTemplatesWizardPage_0, null); //$NON-NLS-1$
+		setDescription(XMLWizardsMessages.NewXMLTemplatesWizardPage_1);
+	}
+
+	/**
+	 * Correctly resizes the table so no phantom columns appear
+	 * 
+	 * @param parent
+	 *            the parent control
+	 * @param buttons
+	 *            the buttons
+	 * @param table
+	 *            the table
+	 * @param column1
+	 *            the first column
+	 * @param column2
+	 *            the second column
+	 * @param column3
+	 *            the third column
+	 */
+	private void configureTableResizing(final Composite parent, final Table table, final TableColumn column1, final TableColumn column2) {
+		parent.addControlListener(new ControlAdapter() {
+			public void controlResized(ControlEvent e) {
+				Rectangle area = parent.getClientArea();
+				Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+				int width = area.width - 2 * table.getBorderWidth();
+				if (preferredSize.y > area.height) {
+					// Subtract the scrollbar width from the total column
+					// width
+					// if a vertical scrollbar will be required
+					Point vBarSize = table.getVerticalBar().getSize();
+					width -= vBarSize.x;
+				}
+
+				Point oldSize = table.getSize();
+				if (oldSize.x > width) {
+					// table is getting smaller so make the columns
+					// smaller first and then resize the table to
+					// match the client area width
+					column1.setWidth(width / 2);
+					column2.setWidth(width / 2);
+					table.setSize(width, area.height);
+				}
+				else {
+					// table is getting bigger so make the table
+					// bigger first and then make the columns wider
+					// to match the client area width
+					table.setSize(width, area.height);
+					column1.setWidth(width / 2);
+					column2.setWidth(width / 2);
+				}
+			}
+		});
+	}
+
+	public void createControl(Composite ancestor) {
+		Composite parent = new Composite(ancestor, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+
+		// create checkbox for user to use XML Template
+		fUseTemplateButton = new Button(parent, SWT.CHECK);
+		fUseTemplateButton.setText(XMLWizardsMessages.NewXMLTemplatesWizardPage_4);
+		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		fUseTemplateButton.setLayoutData(data);
+		fUseTemplateButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				enableTemplates();
+			}
+		});
+
+		// create composite for Templates table
+		Composite innerParent = new Composite(parent, SWT.NONE);
+		GridLayout innerLayout = new GridLayout();
+		innerLayout.numColumns = 2;
+		innerLayout.marginHeight = 0;
+		innerLayout.marginWidth = 0;
+		innerParent.setLayout(innerLayout);
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
+		innerParent.setLayoutData(gd);
+
+		Label label = new Label(innerParent, SWT.NONE);
+		label.setText(XMLWizardsMessages.NewXMLTemplatesWizardPage_7);
+		data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+		label.setLayoutData(data);
+
+		// create table that displays templates
+		Table table = new Table(innerParent, SWT.BORDER | SWT.FULL_SELECTION);
+
+		data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = convertWidthInCharsToPixels(2);
+		data.heightHint = convertHeightInCharsToPixels(10);
+		data.horizontalSpan = 2;
+		table.setLayoutData(data);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(true);
+		TableLayout tableLayout = new TableLayout();
+		table.setLayout(tableLayout);
+
+		TableColumn column1 = new TableColumn(table, SWT.NONE);
+		column1.setText(XMLWizardsMessages.NewXMLTemplatesWizardPage_2);
+
+		TableColumn column2 = new TableColumn(table, SWT.NONE);
+		column2.setText(XMLWizardsMessages.NewXMLTemplatesWizardPage_3);
+
+		fTableViewer = new TableViewer(table);
+		fTableViewer.setLabelProvider(new TemplateLabelProvider());
+		fTableViewer.setContentProvider(new TemplateContentProvider());
+
+		fTableViewer.setSorter(new ViewerSorter() {
+			public int compare(Viewer viewer, Object object1, Object object2) {
+				if ((object1 instanceof Template) && (object2 instanceof Template)) {
+					Template left = (Template) object1;
+					Template right = (Template) object2;
+					int result = left.getName().compareToIgnoreCase(right.getName());
+					if (result != 0) {
+						return result;
+					}
+					return left.getDescription().compareToIgnoreCase(right.getDescription());
+				}
+				return super.compare(viewer, object1, object2);
+			}
+
+			public boolean isSorterProperty(Object element, String property) {
+				return true;
+			}
+		});
+
+		fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent e) {
+				updateViewerInput();
+			}
+		});
+
+		// create viewer that displays currently selected template's contents
+		fPatternViewer = doCreateViewer(parent);
+
+		fTemplateStore = XMLUIPlugin.getDefault().getTemplateStore();
+		fTableViewer.setInput(fTemplateStore);
+
+		// Create linked text to just to templates preference page
+		Link link = new Link(parent, SWT.NONE);
+		link.setText(XMLWizardsMessages.NewXMLTemplatesWizardPage_6);
+		data = new GridData(SWT.END, SWT.FILL, true, false, 2, 1);
+		link.setLayoutData(data);
+		link.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				linkClicked();
+			}
+		});
+
+		configureTableResizing(innerParent, table, column1, column2);
+		loadLastSavedPreferences();
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpContextIds.XML_NEWWIZARD_TEMPLATE_HELPID);
+		Dialog.applyDialogFont(parent);
+		setControl(parent);
+	}
+
+	/**
+	 * Creates, configures and returns a source viewer to present the template
+	 * pattern on the preference page. Clients may override to provide a
+	 * custom source viewer featuring e.g. syntax coloring.
+	 * 
+	 * @param parent
+	 *            the parent control
+	 * @return a configured source viewer
+	 */
+	private SourceViewer createViewer(Composite parent) {
+		SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
+			StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationXML();
+
+			public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+				return baseConfiguration.getConfiguredContentTypes(sourceViewer);
+			}
+
+			public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+				return baseConfiguration.getLineStyleProviders(sourceViewer, partitionType);
+			}
+		};
+		SourceViewer viewer = new StructuredTextViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+		viewer.getTextWidget().setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
+		IStructuredModel scratchModel = StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
+		IDocument document = scratchModel.getStructuredDocument();
+		viewer.configure(sourceViewerConfiguration);
+		viewer.setDocument(document);
+		return viewer;
+	}
+
+	private SourceViewer doCreateViewer(Composite parent) {
+		Label label = new Label(parent, SWT.NONE);
+		label.setText(XMLWizardsMessages.NewXMLTemplatesWizardPage_5);
+		GridData data = new GridData();
+		data.horizontalSpan = 2;
+		label.setLayoutData(data);
+
+		SourceViewer viewer = createViewer(parent);
+		viewer.setEditable(false);
+
+		Control control = viewer.getControl();
+		data = new GridData(GridData.FILL_BOTH);
+		data.horizontalSpan = 2;
+		data.heightHint = convertHeightInCharsToPixels(5);
+		// [261274] - source viewer was growing to fit the max line width of the template
+		data.widthHint = convertWidthInCharsToPixels(2);
+		control.setLayoutData(data);
+
+		return viewer;
+	}
+
+	/**
+	 * Enable/disable controls in page based on fUseTemplateButton's current
+	 * state.
+	 */
+	void enableTemplates() {
+		boolean enabled = fUseTemplateButton.getSelection();
+
+		if (!enabled) {
+			// save last selected template
+			Template template = getSelectedTemplate();
+			if (template != null) {
+				fLastSelectedTemplateName = template.getName();
+			}
+			else {
+				fLastSelectedTemplateName = ""; //$NON-NLS-1$
+			}
+
+			fTableViewer.setSelection(null);
+		}
+		else {
+			setSelectedTemplate(fLastSelectedTemplateName);
+		}
+
+		fTableViewer.getControl().setEnabled(enabled);
+		fPatternViewer.getControl().setEnabled(enabled);
+	}
+
+	/**
+	 * Return the template preference page id
+	 * 
+	 * @return
+	 */
+	private String getPreferencePageId() {
+		return "org.eclipse.wst.sse.ui.preferences.xml.templates"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Get the currently selected template.
+	 * 
+	 * @return
+	 */
+	private Template getSelectedTemplate() {
+		Template template = null;
+		IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
+
+		if (selection.size() == 1) {
+			template = (Template) selection.getFirstElement();
+		}
+		return template;
+	}
+
+	/**
+	 * Returns template string to insert.
+	 * 
+	 * @return String to insert or null if none is to be inserted
+	 */
+	String getTemplateString() {
+		String templateString = null;
+
+		Template template = getSelectedTemplate();
+		if (template != null) {
+			TemplateContextType contextType = XMLUIPlugin.getDefault().getTemplateContextRegistry().getContextType(TemplateContextTypeIdsXML.NEW);
+			IDocument document = new Document();
+			TemplateContext context = new DocumentTemplateContext(contextType, document, 0, 0);
+			try {
+				TemplateBuffer buffer = context.evaluate(template);
+				templateString = buffer.getString();
+			}
+			catch (Exception e) {
+				Logger.log(Logger.WARNING_DEBUG, "Could not create template for new xml", e); //$NON-NLS-1$
+			}
+		}
+
+		return templateString;
+	}
+
+	void linkClicked() {
+		String pageId = getPreferencePageId();
+		PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(getShell(), pageId, new String[]{pageId}, null);
+		dialog.open();
+		fTableViewer.refresh();
+	}
+
+	/**
+	 * Load the last template name used in New XML File wizard.
+	 */
+	private void loadLastSavedPreferences() {
+		fLastSelectedTemplateName = ""; //$NON-NLS-1$
+		boolean setSelection = false;
+		String templateName = XMLUIPlugin.getDefault().getPreferenceStore().getString(XMLUIPreferenceNames.NEW_FILE_TEMPLATE_NAME);
+		if (templateName == null || templateName.length() == 0) {
+			templateName = XMLUIPlugin.getDefault().getPreferenceStore().getString(XMLUIPreferenceNames.NEW_FILE_TEMPLATE_ID);
+			if (templateName != null && templateName.length() > 0) {
+				Template template = fTemplateStore.findTemplateById(templateName);
+				if (template != null) {
+					fLastSelectedTemplateName = template.getName();
+					setSelection = true;
+				}
+			}
+		}
+		else {
+			fLastSelectedTemplateName = templateName;
+			setSelection = true;
+		}
+		fUseTemplateButton.setSelection(setSelection);
+		enableTemplates();
+	}
+
+	/**
+	 * Save template name used for next call to New XML File wizard.
+	 */
+	void saveLastSavedPreferences() {
+		String templateName = ""; //$NON-NLS-1$
+
+		Template template = getSelectedTemplate();
+		if (template != null) {
+			templateName = template.getName();
+		}
+
+		XMLUIPlugin.getDefault().getPreferenceStore().setValue(XMLUIPreferenceNames.NEW_FILE_TEMPLATE_NAME, templateName);
+		XMLUIPlugin.getDefault().savePluginPreferences();
+	}
+
+	/**
+	 * Select a template in the table viewer given the template name. If
+	 * template name cannot be found or templateName is null, just select
+	 * first item in table. If no items in table select nothing.
+	 * 
+	 * @param templateName
+	 */
+	private void setSelectedTemplate(String templateName) {
+		Object template = null;
+
+		if ((templateName != null) && (templateName.length() > 0)) {
+			// pick the last used template
+			template = fTemplateStore.findTemplate(templateName, TemplateContextTypeIdsXML.NEW);
+		}
+
+		// no record of last used template so just pick first element
+		if (template == null) {
+			// just pick first element
+			template = fTableViewer.getElementAt(0);
+		}
+
+		if (template != null) {
+			IStructuredSelection selection = new StructuredSelection(template);
+			fTableViewer.setSelection(selection, true);
+		}
+	}
+
+	/**
+	 * Updates the pattern viewer.
+	 */
+	void updateViewerInput() {
+		Template template = getSelectedTemplate();
+		if (template != null) {
+			fPatternViewer.getDocument().set(template.getPattern());
+		}
+		else {
+			fPatternViewer.getDocument().set(""); //$NON-NLS-1$
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLWizard.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLWizard.java
new file mode 100644
index 0000000..bc77849
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLWizard.java
@@ -0,0 +1,967 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *	   David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMContentBuilder;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.dialogs.NamespaceInfoErrorHelper;
+import org.eclipse.wst.xml.ui.internal.dialogs.SelectFileOrXMLCatalogIdPanel;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.eclipse.wst.xml.ui.internal.nsedit.CommonEditNamespacesDialog;
+
+import com.ibm.icu.text.Collator;
+
+public class NewXMLWizard extends NewModelWizard {
+	protected static final int CREATE_FROM_DTD = 0;
+	protected static final int CREATE_FROM_XSD = 1;
+	protected static final int CREATE_FROM_SCRATCH = 2;
+
+	protected static final String[] createFromRadioButtonLabel = {XMLWizardsMessages._UI_RADIO_XML_FROM_DTD, XMLWizardsMessages._UI_RADIO_XML_FROM_SCHEMA, XMLWizardsMessages._UI_RADIO_XML_FROM_SCRATCH};
+
+	protected static final String[] filePageFilterExtensions = {".xml"}; //$NON-NLS-1$
+	protected static final String[] browseXSDFilterExtensions = {".xsd"}; //$NON-NLS-1$
+	protected static final String[] browseDTDFilterExtensions = {".dtd"}; //$NON-NLS-1$
+	
+	protected static final int OPTIONAL_ELEMENT_DEPTH_LIMIT_DEFAULT_VALUE = 2;
+	
+	protected static final long XML_EDITOR_FILE_SIZE_LIMIT = 26214400; // 25 mb
+
+	protected NewFilePage newFilePage;
+	/**
+	 * @deprecated clients should not be allowed to change start page
+	 */
+	protected StartPage startPage;
+	private StartPage fCreateXMLFromWizardPage;
+	protected SelectGrammarFilePage selectGrammarFilePage;
+	protected SelectRootElementPage selectRootElementPage;
+
+	protected String cmDocumentErrorMessage;
+
+	protected NewXMLGenerator generator;
+	private NewXMLTemplatesWizardPage fNewXMLTemplatesWizardPage;
+
+
+	public NewXMLWizard() {
+		setWindowTitle(XMLWizardsMessages._UI_WIZARD_CREATE_NEW_TITLE);
+		ImageDescriptor descriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_WIZBAN_GENERATEXML);
+		setDefaultPageImageDescriptor(descriptor);
+		generator = new NewXMLGenerator();
+	}
+
+
+	public NewXMLWizard(IFile file, CMDocument cmDocument) {
+		this();
+
+		generator.setGrammarURI(URIHelper.getPlatformURI(file));
+		generator.setCMDocument(cmDocument);
+	}
+
+
+	public static void showDialog(Shell shell, IFile file, IStructuredSelection structuredSelection) {
+		String[] errorInfo = new String[2];
+		// (cs) the URI argument to createCMDocument needs to be a fully
+		// qualified URI
+		//
+		CMDocument cmDocument = NewXMLGenerator.createCMDocument(URIHelper.getPlatformURI(file), errorInfo);
+		if (errorInfo[0] == null) {
+			NewXMLWizard wizard = new NewXMLWizard(file, cmDocument);
+			wizard.init(PlatformUI.getWorkbench(), structuredSelection);
+			wizard.setNeedsProgressMonitor(true);
+			WizardDialog dialog = new WizardDialog(shell, wizard);
+			dialog.create();
+			dialog.getShell().setText(XMLWizardsMessages._UI_DIALOG_NEW_TITLE);
+			dialog.setBlockOnOpen(true);
+			dialog.open();
+		}
+		else {
+			MessageDialog.openInformation(shell, errorInfo[0], errorInfo[1]);
+		}
+	}
+
+	public void addPages() {
+		String grammarURI = generator.getGrammarURI();
+		
+		// new file page
+		newFilePage = new NewFilePage(fSelection);
+		newFilePage.setTitle(XMLWizardsMessages._UI_WIZARD_CREATE_XML_FILE_HEADING);
+		newFilePage.setDescription(XMLWizardsMessages._UI_WIZARD_CREATE_XML_FILE_EXPL);
+		newFilePage.defaultName = (grammarURI != null) ? URIHelper.removeFileExtension(URIHelper.getLastSegment(grammarURI)) : "NewFile"; //$NON-NLS-1$
+		Preferences preference = XMLCorePlugin.getDefault().getPluginPreferences();
+		String ext = preference.getString(XMLCorePreferenceNames.DEFAULT_EXTENSION);
+		newFilePage.defaultFileExtension = "." + ext; //$NON-NLS-1$
+		newFilePage.filterExtensions = filePageFilterExtensions;
+		addPage(newFilePage);
+
+		if (grammarURI == null) {
+			// create xml from page
+			fCreateXMLFromWizardPage = new StartPage("StartPage", createFromRadioButtonLabel) //$NON-NLS-1$
+			{
+				public void createControl(Composite parent) {
+					super.createControl(parent);
+				}
+
+				public void setVisible(boolean visible) {
+					super.setVisible(visible);
+					getRadioButtonAtIndex(getCreateMode()).setSelection(true);
+					getRadioButtonAtIndex(getCreateMode()).setFocus();
+
+					// Set the help context for each button
+					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(0), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML1_HELPID);
+					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(1), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML2_HELPID);
+					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(2), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML3_HELPID);
+				}
+			};
+
+
+			fCreateXMLFromWizardPage.setTitle(XMLWizardsMessages._UI_WIZARD_CREATE_XML_HEADING);
+			fCreateXMLFromWizardPage.setDescription(XMLWizardsMessages._UI_WIZARD_CREATE_XML_EXPL);
+			addPage(fCreateXMLFromWizardPage);
+		}
+
+		// selectGrammarFilePage
+		selectGrammarFilePage = new SelectGrammarFilePage();
+		addPage(selectGrammarFilePage);
+
+		// select root element page
+		selectRootElementPage = new SelectRootElementPage();
+		selectRootElementPage.setTitle(XMLWizardsMessages._UI_WIZARD_SELECT_ROOT_HEADING);
+		selectRootElementPage.setDescription(XMLWizardsMessages._UI_WIZARD_SELECT_ROOT_EXPL);
+		addPage(selectRootElementPage);
+
+		// from "scratch"
+		fNewXMLTemplatesWizardPage = new NewXMLTemplatesWizardPage();
+		addPage(fNewXMLTemplatesWizardPage);
+	}
+
+
+	public IWizardPage getStartingPage() {
+		WizardPage result = null;
+		if (startPage != null) {
+			result = startPage;
+		}
+		else {
+			result = newFilePage;
+		}
+		return result;
+	}
+
+
+	public int getCreateMode() {
+		String grammarURI = generator.getGrammarURI();
+
+		int result = CREATE_FROM_SCRATCH;
+		if (grammarURI != null) {
+			if (grammarURI.endsWith(".dtd")) //$NON-NLS-1$
+			{
+				result = CREATE_FROM_DTD;
+			}
+			else if (grammarURI.endsWith(".xsd")) //$NON-NLS-1$
+			{
+				result = CREATE_FROM_XSD;
+			}
+		}
+		else if (fCreateXMLFromWizardPage != null) {
+			int selectedIndex = fCreateXMLFromWizardPage.getSelectedRadioButtonIndex();
+			if (selectedIndex != -1) {
+				result = selectedIndex;
+			}
+		}
+		return result;
+	}
+
+
+	public IWizardPage getNextPage(IWizardPage currentPage) {
+		WizardPage nextPage = null;
+		if (currentPage == startPage) {
+			nextPage = newFilePage;
+		}
+		else if (currentPage == newFilePage) {
+			if (generator.getGrammarURI() == null)
+				nextPage = fCreateXMLFromWizardPage;
+			else
+				nextPage = selectRootElementPage;
+		}
+		else if (currentPage == fCreateXMLFromWizardPage) {
+			if (getCreateMode() == CREATE_FROM_SCRATCH) {
+				nextPage = fNewXMLTemplatesWizardPage;
+			}
+			else if (generator.getGrammarURI() == null) {
+				nextPage = selectGrammarFilePage;
+			}
+			else {
+				nextPage = selectRootElementPage;
+			}
+		}
+		else if (currentPage == selectGrammarFilePage) {
+			nextPage = selectRootElementPage;
+		}
+		return nextPage;
+	}
+
+
+	public boolean canFinish() {
+		boolean result = false;
+
+		IWizardPage currentPage = getContainer().getCurrentPage();
+		// can finish on: new file page, create from & template page if creating from scratch, select root element page
+		if ((currentPage == newFilePage && generator.getGrammarURI() == null) || (fCreateXMLFromWizardPage != null && fCreateXMLFromWizardPage.getSelectedRadioButtonIndex() == CREATE_FROM_SCRATCH) || (currentPage == selectRootElementPage)) {
+			result = currentPage.isPageComplete();
+		}
+		return result;
+	}
+
+
+	public boolean performFinish() {
+		boolean result = super.performFinish();
+		// save user options for next use
+		fNewXMLTemplatesWizardPage.saveLastSavedPreferences();
+		
+		String fileName = null;
+		try {
+
+			String[] namespaceErrors = generator.getNamespaceInfoErrors();
+			if (namespaceErrors != null) {
+				String title = namespaceErrors[0];
+				String message = namespaceErrors[1];
+				result = MessageDialog.openQuestion(getShell(), title, message);
+			}
+
+			if (result) {
+				fileName = newFilePage.getFileName();
+				if ((new Path(fileName)).getFileExtension() == null) {
+					newFilePage.setFileName(fileName.concat(newFilePage.defaultFileExtension));
+				}
+
+				final IFile newFile = newFilePage.createNewFile();
+				final String xmlFileName = newFile.getLocation().toOSString();
+				final String grammarFileName = fileName;
+
+				if (getContainer().getCurrentPage() == selectRootElementPage) {
+
+					int limit = selectRootElementPage.getOptionalElementDepthLimit();
+					generator.setOptionalElementDepthLimit(limit);
+					setNeedsProgressMonitor(true);
+					getContainer().run(true, false, new IRunnableWithProgress(){
+						public void run(IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException {
+							progressMonitor.beginTask(XMLWizardsMessages._UI_WIZARD_GENERATING_XML_DOCUMENT, IProgressMonitor.UNKNOWN);
+							try {
+								generator.createXMLDocument(newFile, xmlFileName);
+							} catch (Exception exception) {
+								Logger.logException("Exception completing New XML wizard " + grammarFileName, exception); //$NON-NLS-1$
+							}
+							progressMonitor.done();
+						}
+					});
+				}
+				else {
+					// put template contents into file
+					String templateString = fNewXMLTemplatesWizardPage.getTemplateString();
+					generator.createTemplateXMLDocument(newFile, templateString);
+				}
+				newFile.refreshLocal(IResource.DEPTH_ONE, null);
+				IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+				BasicNewResourceWizard.selectAndReveal(newFile, workbenchWindow);
+				openEditor(newFile);
+			}
+		}
+		catch (Exception e) {
+			Logger.logException("Exception completing New XML wizard " + fileName, e); //$NON-NLS-1$
+		}
+		return result;
+	}
+
+	public void openEditor(IFile file) {
+		long length = 0;
+		IPath location = file.getLocation();
+		if (location != null) {
+			File localFile = location.toFile();
+			length = localFile.length();
+		}
+		if(length < XML_EDITOR_FILE_SIZE_LIMIT) {
+			// Open editor on new file.
+			String editorId = null;
+			try {
+				IEditorDescriptor editor = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getLocation().toOSString(), file.getContentDescription().getContentType());
+				if (editor != null) {
+					editorId = editor.getId();
+				}
+			}
+			catch (CoreException e1) {
+				// editor id could not be retrieved, so we can not open editor
+				return;
+			}
+			IWorkbenchWindow dw = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			try {
+				if (dw != null) {
+					IWorkbenchPage page = dw.getActivePage();
+					if (page != null) {
+						page.openEditor(new FileEditorInput(file), editorId, true);
+					}
+				}
+			}
+			catch (PartInitException e) {
+				// editor can not open for some reason
+				return;
+			}
+		}
+	}
+
+
+	protected String getDefaultSystemId() {
+		String relativePath = "platform:/resource/" + newFilePage.getContainerFullPath().toString() + "/dummy"; //$NON-NLS-1$ //$NON-NLS-2$
+		return URIHelper.getRelativeURI(generator.getGrammarURI(), relativePath);
+	}
+
+
+	/**
+	 * SelectGrammarFilePage
+	 */
+	class SelectGrammarFilePage extends WizardPage {
+		protected SelectFileOrXMLCatalogIdPanel panel;
+
+		SelectGrammarFilePage() {
+			super("SelectGrammarFilePage"); //$NON-NLS-1$
+		}
+
+		public void createControl(Composite parent) {
+			Composite composite = new Composite(parent, SWT.NONE);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTSOURCE_HELPID);
+			composite.setLayout(new GridLayout());
+			composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+			setControl(composite);
+
+			panel = new SelectFileOrXMLCatalogIdPanel(composite);
+			panel.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+			SelectFileOrXMLCatalogIdPanel.Listener listener = new SelectFileOrXMLCatalogIdPanel.Listener() {
+				public void completionStateChanged() {
+					updateErrorMessage();
+				}
+			};
+			panel.setListener(listener);
+			Dialog.applyDialogFont(parent);
+		}
+
+		public void setVisible(boolean visible) {
+			super.setVisible(visible);
+			if (visible) {
+				if (getCreateMode() == CREATE_FROM_DTD) {
+					setTitle(XMLWizardsMessages._UI_WIZARD_SELECT_DTD_FILE_TITLE);
+					setDescription(XMLWizardsMessages._UI_WIZARD_SELECT_DTD_FILE_DESC);
+					panel.setFilterExtensions(browseDTDFilterExtensions);
+				}
+				else {
+					setTitle(XMLWizardsMessages._UI_WIZARD_SELECT_XSD_FILE_TITLE);
+					setDescription(XMLWizardsMessages._UI_WIZARD_SELECT_XSD_FILE_DESC);
+					panel.setFilterExtensions(browseXSDFilterExtensions);
+				}
+				generator.setGrammarURI(null);
+				generator.setCMDocument(null);
+				cmDocumentErrorMessage = null;
+			}
+			panel.setVisibleHelper(visible);
+		}
+
+		public String getURI() {
+			String uri = panel.getXMLCatalogURI();
+			if (uri == null) {
+				IFile file = panel.getFile();
+				if (file != null) {
+					uri = URIHelper.getPlatformURI(file);
+				}
+			}
+			return uri;
+		}
+
+		public boolean isPageComplete() {
+			return (getURI() != null) && (getErrorMessage() == null);
+		}
+
+		public String getXMLCatalogId() {
+			return panel.getXMLCatalogId();
+		}
+
+		public ICatalogEntry getXMLCatalogEntry() {
+			return panel.getXMLCatalogEntry();
+		}
+
+		public String computeErrorMessage() {
+			String errorMessage = null;
+			String uri = getURI();
+			if (uri != null) {
+				if (!URIHelper.isReadableURI(uri, false)) {
+					errorMessage = XMLWizardsMessages._UI_LABEL_ERROR_CATALOG_ENTRY_INVALID;
+				}
+			}
+			return errorMessage;
+		}
+
+
+		public void updateErrorMessage() {
+			String errorMessage = computeErrorMessage();
+			setErrorMessage(errorMessage);
+			setPageComplete(isPageComplete());
+		}
+	}
+
+
+	/**
+	 * SelectRootElementPage
+	 */
+	class SelectRootElementPage extends WizardPage implements SelectionListener {
+		protected Combo combo;
+		protected Button[] radioButton;
+		protected PageBook pageBook;
+		protected XSDOptionsPanel xsdOptionsPanel;
+		protected DTDOptionsPanel dtdOptionsPanel;
+		protected Text limitOptionalElementDepthTextControl;
+		protected Button limitOptionalElementDepthCheckButtonControl;
+		 
+
+
+		SelectRootElementPage() {
+			super("SelectRootElementPage"); //$NON-NLS-1$
+		}
+
+		public void createControl(Composite parent) {
+			// container group
+			Composite containerGroup = new Composite(parent, SWT.NONE);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(containerGroup, IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTROOTELEMENT_HELPID);
+			containerGroup.setLayout(new GridLayout());
+			containerGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			setControl(containerGroup);
+
+			// select root element
+			Label containerLabel = new Label(containerGroup, SWT.NONE);
+			containerLabel.setText(XMLWizardsMessages._UI_LABEL_ROOT_ELEMENT);
+			combo = new Combo(containerGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
+			combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			combo.addSelectionListener(this);
+
+			// Options
+			{
+				Group group = new Group(containerGroup, SWT.NONE);
+				group.setText(XMLWizardsMessages._UI_WIZARD_CONTENT_OPTIONS);
+
+				GridLayout layout = new GridLayout();
+				layout.numColumns = 1;
+				layout.makeColumnsEqualWidth = true;
+				layout.marginWidth = 0;
+				group.setLayout(layout);
+				group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+				radioButton = new Button[4];
+
+				radioButton[0] = new Button(group, SWT.CHECK);
+				radioButton[0].setText(XMLWizardsMessages._UI_WIZARD_CREATE_OPTIONAL_ATTRIBUTES);
+				radioButton[0].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+				radioButton[0].setSelection(false);
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(radioButton[0], IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTROOTELEMENT1_HELPID);
+
+				radioButton[1] = new Button(group, SWT.CHECK);
+				radioButton[1].setText(XMLWizardsMessages._UI_WIZARD_CREATE_OPTIONAL_ELEMENTS);
+				radioButton[1].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+				radioButton[1].setSelection(false);
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(radioButton[1], IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTROOTELEMENT2_HELPID);
+
+				radioButton[1].addSelectionListener(new SelectionAdapter(){
+					public void widgetSelected(SelectionEvent selectionEvent) {
+						boolean enabled = radioButton[1].getSelection();
+						limitOptionalElementDepthCheckButtonControl.setEnabled(enabled);
+						enabled = enabled && limitOptionalElementDepthCheckButtonControl.getSelection();
+						limitOptionalElementDepthTextControl.setEnabled(enabled);
+					}
+				});
+				Composite composite = new Composite(group, SWT.NONE);
+				GridLayout gridLayout = new GridLayout();
+				gridLayout.marginHeight = 0;
+				gridLayout.marginWidth = 0;
+				gridLayout.numColumns = 2;
+				gridLayout.marginLeft = 20;
+				composite.setLayout(gridLayout);
+				limitOptionalElementDepthCheckButtonControl = new Button(composite, SWT.CHECK);
+				limitOptionalElementDepthCheckButtonControl.setText(XMLWizardsMessages._UI_WIZARD_LIMIT_OPTIONAL_ELEMENT_DEPTH);
+				limitOptionalElementDepthCheckButtonControl.setEnabled(false);
+				limitOptionalElementDepthCheckButtonControl.setSelection(true);
+				limitOptionalElementDepthCheckButtonControl.addSelectionListener(new SelectionAdapter(){
+					public void widgetSelected(SelectionEvent selectionEvent) {
+						boolean enabled = limitOptionalElementDepthCheckButtonControl.getSelection();
+						limitOptionalElementDepthTextControl.setEnabled(enabled);
+					}
+				});
+				limitOptionalElementDepthTextControl = new Text(composite, SWT.BORDER);
+				limitOptionalElementDepthTextControl.setText(Integer.toString(OPTIONAL_ELEMENT_DEPTH_LIMIT_DEFAULT_VALUE));
+				limitOptionalElementDepthTextControl.setEnabled(false);
+				GridData gridaData = new GridData();
+				gridaData.widthHint = 25;
+				limitOptionalElementDepthTextControl.setLayoutData(gridaData);
+				limitOptionalElementDepthTextControl.addListener(SWT.Verify, new Listener() {
+					public void handleEvent(Event event) {
+						String string = event.text;
+						char[] chars = new char[string.length()];
+						string.getChars(0, chars.length, chars, 0);
+						for (int i = 0; i < chars.length; i++) {
+							if (!('0' <= chars[i] && chars[i] <= '9')) {
+								event.doit = false;
+								return;
+							}
+						}
+					}
+				});
+				
+				radioButton[2] = new Button(group, SWT.CHECK);
+				radioButton[2].setText(XMLWizardsMessages._UI_WIZARD_CREATE_FIRST_CHOICE);
+				radioButton[2].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+				radioButton[2].setSelection(true);
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(radioButton[2], IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTROOTELEMENT3_HELPID);
+
+				radioButton[3] = new Button(group, SWT.CHECK);
+				radioButton[3].setText(XMLWizardsMessages._UI_WIZARD_FILL_ELEMENTS_AND_ATTRIBUTES);
+				radioButton[3].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+				radioButton[3].setSelection(true);
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(radioButton[3], IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTROOTELEMENT4_HELPID);
+				/*
+				 * radioButton = new Button[2];
+				 * 
+				 * radioButton[0] = new Button(group, SWT.RADIO);
+				 * radioButton[0].setText(XMLWizardsMessages.getString("_UI_WIZARD_CREATE_REQUIRED"));
+				 * radioButton[0].setLayoutData(new
+				 * GridData(GridData.FILL_HORIZONTAL));
+				 * radioButton[0].setSelection(true);
+				 * WorkbenchHelp.setHelp(radioButton[0],
+				 * XMLBuilderContextIds.XMLC_CREATE_REQUIRED_ONLY);
+				 * 
+				 * radioButton[1] = new Button(group, SWT.RADIO);
+				 * radioButton[1].setText(XMLWizardsMessages.getString("_UI_WIZARD_CREATE_OPTIONAL"));
+				 * radioButton[1].setLayoutData(new
+				 * GridData(GridData.FILL_HORIZONTAL));
+				 * WorkbenchHelp.setHelp(radioButton[1],
+				 * XMLBuilderContextIds.XMLC_CREATE_REQUIRED_AND_OPTION);
+				 */
+			}
+
+			// add the grammar specific generation options
+			//
+			{
+				pageBook = new PageBook(containerGroup, SWT.NONE);
+				pageBook.setLayoutData(new GridData(GridData.FILL_BOTH));
+				xsdOptionsPanel = new XSDOptionsPanel(this, pageBook);
+				dtdOptionsPanel = new DTDOptionsPanel(this, pageBook);
+				pageBook.showPage(xsdOptionsPanel);
+			}
+		}
+
+		public void widgetSelected(SelectionEvent event) {
+			int index = combo.getSelectionIndex();
+			String rootElementName = (index != -1) ? combo.getItem(index) : null;
+			generator.setRootElementName(rootElementName);
+		}
+
+		public void widgetDefaultSelected(SelectionEvent event) {
+			// do nothing
+		}
+
+		public void setVisible(boolean visible) {
+			super.setVisible(visible);
+
+			if (visible) {
+				try {
+					if (generator.getGrammarURI() == null) {
+						generator.setGrammarURI(selectGrammarFilePage.getURI());
+						generator.setXMLCatalogEntry(selectGrammarFilePage.getXMLCatalogEntry());
+					}
+					Assert.isNotNull(generator.getGrammarURI());
+
+					if (generator.getCMDocument() == null) {
+						final String[] errorInfo = new String[2];
+						final CMDocument[] cmdocs = new CMDocument[1];
+						Runnable r = new Runnable() {
+							public void run() {
+								cmdocs[0] = NewXMLGenerator.createCMDocument(generator.getGrammarURI(), errorInfo);
+							}
+						};
+						org.eclipse.swt.custom.BusyIndicator.showWhile(Display.getCurrent(), r);
+
+						generator.setCMDocument(cmdocs[0]);
+						cmDocumentErrorMessage = errorInfo[1];
+					}
+
+					combo.removeAll();
+					if ((generator.getCMDocument() != null) && (cmDocumentErrorMessage == null)) {
+						CMNamedNodeMap nameNodeMap = generator.getCMDocument().getElements();
+						Vector nameNodeVector = new Vector();
+
+						for (int i = 0; i < nameNodeMap.getLength(); i++) {
+							CMElementDeclaration cmElementDeclaration = (CMElementDeclaration) nameNodeMap.item(i);
+							Object value = cmElementDeclaration.getProperty("Abstract"); //$NON-NLS-1$
+							if (value != Boolean.TRUE) {
+								nameNodeVector.add(cmElementDeclaration.getElementName());
+							}
+						}
+
+						Object[] nameNodeArray = nameNodeVector.toArray();
+						if (nameNodeArray.length > 0) {
+							Arrays.sort(nameNodeArray, Collator.getInstance());
+						}
+
+						String defaultRootName = (String) (generator.getCMDocument()).getProperty("http://org.eclipse.wst/cm/properties/defaultRootName"); //$NON-NLS-1$
+						int defaultRootIndex = -1;
+						for (int i = 0; i < nameNodeArray.length; i++) {
+							String elementName = (String) nameNodeArray[i];
+
+							combo.add(elementName);
+							if ((defaultRootName != null) && defaultRootName.equals(elementName)) {
+								defaultRootIndex = i;
+							}
+						}
+
+						if (nameNodeArray.length > 0) {
+							defaultRootIndex = defaultRootIndex != -1 ? defaultRootIndex : 0;
+							combo.select(defaultRootIndex);
+							generator.setRootElementName(combo.getItem(defaultRootIndex));
+						}
+					}
+
+					if (generator.getGrammarURI().endsWith("xsd")) //$NON-NLS-1$
+					{
+						pageBook.showPage(xsdOptionsPanel);
+						generator.setDefaultSystemId(getDefaultSystemId());
+						generator.createNamespaceInfoList();
+
+						// Provide default namespace prefix if none
+						for (int i = 0; i < generator.namespaceInfoList.size(); i++) {
+							NamespaceInfo nsinfo = (NamespaceInfo) generator.namespaceInfoList.get(i);
+							if (((nsinfo.prefix == null) || (nsinfo.prefix.trim().length() == 0)) && ((nsinfo.uri != null) && (nsinfo.uri.trim().length() != 0))) {
+								nsinfo.prefix = getDefaultPrefix(generator.namespaceInfoList);
+							}
+						}
+						xsdOptionsPanel.setNamespaceInfoList(generator.namespaceInfoList);
+					}
+					else if (generator.getGrammarURI().endsWith("dtd")) //$NON-NLS-1$
+					{
+						pageBook.showPage(dtdOptionsPanel);
+						dtdOptionsPanel.update();
+					}
+				}
+				catch (Exception e) {
+					// XMLBuilderPlugin.getPlugin().getMsgLogger().writeCurrentThread();
+				}
+
+				/*
+				 * String errorMessage = computeErrorMessage(); if
+				 * (errorMessage == null) super.setVisible(visible);
+				 */
+
+				updateErrorMessage();
+			}
+		}
+
+		private String getDefaultPrefix(List nsInfoList) {
+			String defaultPrefix = "p"; //$NON-NLS-1$
+			if (nsInfoList == null) {
+				return defaultPrefix;
+			}
+
+			Vector v = new Vector();
+			for (int i = 0; i < nsInfoList.size(); i++) {
+				NamespaceInfo nsinfo = (NamespaceInfo) nsInfoList.get(i);
+				if (nsinfo.prefix != null) {
+					v.addElement(nsinfo.prefix);
+				}
+			}
+
+			if (v.contains(defaultPrefix)) {
+				String s = defaultPrefix;
+				for (int j = 0; v.contains(s); j++) {
+					s = defaultPrefix + Integer.toString(j);
+				}
+				return s;
+			}
+			return defaultPrefix;
+		}
+		
+		public int getOptionalElementDepthLimit() {
+			int depth = -1;
+			if(radioButton[1].getSelection() && limitOptionalElementDepthCheckButtonControl.getSelection()) {
+				try {
+					depth = Integer.parseInt(limitOptionalElementDepthTextControl.getText());
+				} catch( Exception exception) {}
+			}
+			return depth;
+		}
+
+		public boolean isPageComplete() {
+			boolean complete = ((generator.getRootElementName() != null) && (generator.getRootElementName().length() > 0)) && (getErrorMessage() == null);
+
+			if (complete) {
+				/*
+				 * int buildPolicy = radioButton[0].getSelection() ?
+				 * DOMContentBuilder.BUILD_ONLY_REQUIRED_CONTENT :
+				 * DOMContentBuilder.BUILD_ALL_CONTENT;
+				 */
+				int buildPolicy = 0;
+				if (radioButton[0].getSelection()) {
+					buildPolicy = buildPolicy | DOMContentBuilder.BUILD_OPTIONAL_ATTRIBUTES;
+				}
+				if (radioButton[1].getSelection()) {
+					buildPolicy = buildPolicy | DOMContentBuilder.BUILD_OPTIONAL_ELEMENTS;
+				}
+				if (radioButton[2].getSelection()) {
+					buildPolicy = buildPolicy | DOMContentBuilder.BUILD_FIRST_CHOICE | DOMContentBuilder.BUILD_FIRST_SUBSTITUTION;
+				}
+				if (radioButton[3].getSelection()) {
+					buildPolicy = buildPolicy | DOMContentBuilder.BUILD_TEXT_NODES;
+				}
+
+				generator.setBuildPolicy(buildPolicy);
+			}
+
+			return complete;
+		}
+
+		public String computeErrorMessage() {
+			String errorMessage = null;
+
+			if (cmDocumentErrorMessage != null) {
+				errorMessage = cmDocumentErrorMessage;
+			}
+			else if ((generator.getRootElementName() == null) || (generator.getRootElementName().length() == 0)) {
+				errorMessage = XMLWizardsMessages._ERROR_ROOT_ELEMENT_MUST_BE_SPECIFIED;
+			}
+
+			return errorMessage;
+		}
+
+
+		public void updateErrorMessage() {
+			String errorMessage = computeErrorMessage();
+			if (errorMessage == null) {
+				if (xsdOptionsPanel.isVisible()) {
+
+					errorMessage = xsdOptionsPanel.computeErrorMessage();
+				}
+				else if (dtdOptionsPanel.isVisible()) {
+					errorMessage = dtdOptionsPanel.computeErrorMessage();
+				}
+			}
+			setErrorMessage(errorMessage);
+			setPageComplete(isPageComplete());
+		}
+	}
+
+	// //////////////End SelectRootElementPage
+
+
+
+	public static GridLayout createOptionsPanelLayout() {
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.marginWidth = 0;
+		gridLayout.horizontalSpacing = 0;
+		return gridLayout;
+	}
+
+
+
+	/**
+	 * 
+	 */
+	class XSDOptionsPanel extends Composite {
+		protected String errorMessage = null;
+		protected SelectRootElementPage parentPage;
+		protected CommonEditNamespacesDialog editNamespaces;
+		private IPath currentPath = null;
+
+		public XSDOptionsPanel(SelectRootElementPage parentPage, Composite parent) {
+			super(parent, SWT.NONE);
+			this.parentPage = parentPage;
+
+			setLayout(createOptionsPanelLayout());
+			setLayoutData(new GridData(GridData.FILL_BOTH));
+		}
+		
+		private CommonEditNamespacesDialog getEditNamespaces() {
+			if (editNamespaces == null) {
+				Composite co = new Composite(this, SWT.NONE);
+				co.setLayout(new GridLayout());
+				String tableTitle = XMLWizardsMessages._UI_LABEL_NAMESPACE_INFORMATION;
+				editNamespaces = new CommonEditNamespacesDialog(co, null, tableTitle, true, true);
+				this.layout();
+			}
+			return editNamespaces;
+		}
+
+		public void setNamespaceInfoList(List list) {
+			CommonEditNamespacesDialog editDialog = getEditNamespaces();
+			
+		    if (newFilePage != null) {
+		      IPath newPath = newFilePage.getContainerFullPath();
+		      if (newPath != null) {
+		        if (!newPath.equals(currentPath)) {
+	                String resourceURI = "platform:/resource" + newPath.toString() + "/dummy"; //$NON-NLS-1$ //$NON-NLS-2$
+	                String resolvedPath = URIHelper.normalize(resourceURI, null, null);
+	                resolvedPath = URIHelper.removeProtocol(resolvedPath);
+	                
+	                currentPath = new Path(resolvedPath);
+	                editDialog.setResourcePath(currentPath);
+		        }
+		      }
+		    }
+		    editDialog.setNamespaceInfoList(list);
+		    editDialog.updateErrorMessage(list);
+		}
+
+		public void updateErrorMessage(List namespaceInfoList) {
+			NamespaceInfoErrorHelper helper = new NamespaceInfoErrorHelper();
+			errorMessage = helper.computeErrorMessage(namespaceInfoList, null);
+			parentPage.updateErrorMessage();
+		}
+
+
+		public String computeErrorMessage() {
+			return errorMessage;
+		}
+	}
+
+
+	/**
+	 * 
+	 */
+	public class DTDOptionsPanel extends Composite implements ModifyListener {
+		protected Group group;
+		protected Text systemIdField;
+		protected Text publicIdField;
+		protected SelectRootElementPage parentPage;
+
+		public DTDOptionsPanel(SelectRootElementPage parentPage, Composite parent) {
+			super(parent, SWT.NONE);
+			this.parentPage = parentPage;
+			setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+			setLayout(createOptionsPanelLayout());
+			Group group = new Group(this, SWT.NONE);
+			group.setText(XMLWizardsMessages._UI_LABEL_DOCTYPE_INFORMATION);
+
+			GridLayout layout = new GridLayout();
+			layout.numColumns = 2;
+			group.setLayout(layout);
+			group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+			Label publicIdLabel = new Label(group, SWT.NONE);
+			publicIdLabel.setText(XMLWizardsMessages._UI_LABEL_PUBLIC_ID);
+			publicIdField = new Text(group, SWT.SINGLE | SWT.BORDER);
+			publicIdField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			publicIdField.addModifyListener(this);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(publicIdField, IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTROOTELEMENT5_HELPID);
+
+			Label systemIdLabel = new Label(group, SWT.NONE);
+			systemIdLabel.setText(XMLWizardsMessages._UI_LABEL_SYSTEM_ID);
+			systemIdField = new Text(group, SWT.SINGLE | SWT.BORDER);
+			systemIdField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			systemIdField.addModifyListener(this);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(systemIdField, IXMLWizardHelpContextIds.XML_NEWWIZARD_SELECTROOTELEMENT6_HELPID);
+		}
+
+		public void update() {
+			String thePublicId = null;
+			String theSystemId = null;
+			ICatalogEntry xmlCatalogEntry = generator.getXMLCatalogEntry();
+
+			if (xmlCatalogEntry != null) {
+				if (xmlCatalogEntry.getEntryType() == ICatalogEntry.ENTRY_TYPE_PUBLIC) {
+					thePublicId = xmlCatalogEntry.getKey();
+					theSystemId = xmlCatalogEntry.getAttributeValue(ICatalogEntry.ATTR_WEB_URL);
+					if (theSystemId == null) {
+						theSystemId = generator.getGrammarURI().startsWith("http:") ? generator.getGrammarURI() : URIHelper.getLastSegment(generator.getGrammarURI()); //$NON-NLS-1$
+					}
+				}
+				else {
+					theSystemId = xmlCatalogEntry.getKey();
+				}
+			}
+			else {
+				theSystemId = getDefaultSystemId();
+			}
+
+			publicIdField.setText(thePublicId != null ? thePublicId : ""); //$NON-NLS-1$
+			systemIdField.setText(theSystemId != null ? theSystemId : ""); //$NON-NLS-1$
+		}
+
+		public void modifyText(ModifyEvent e) {
+			generator.setSystemId(systemIdField.getText());
+			generator.setPublicId(publicIdField.getText());
+			parentPage.updateErrorMessage();
+		}
+
+		public String computeErrorMessage() {
+			return null;
+		}
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLImportActionDelegate.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLImportActionDelegate.java
new file mode 100644
index 0000000..4b923c4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLImportActionDelegate.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.util.Iterator;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+// TODO cs... rename this class NewXMLActionDelegate
+// we need to re-add pre-validation using the validation framework API's
+// since we also need to add validation to the 'New XML' case, this
+// prevalidation
+// function should really go into the NewWizard somewhere
+//
+public class XMLImportActionDelegate implements IActionDelegate {
+	/**
+	 * Checks the current selection and runs the separate browser to show the
+	 * content of the Readme file. This code shows how to launch separate
+	 * browsers that are not VA/Base desktop parts.
+	 * 
+	 * @param action
+	 *            the action that was performed
+	 */
+	public void run(IAction action) {
+		IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		ISelection selection = workbenchWindow.getSelectionService().getSelection();
+		Object selectedObject = getSelection(selection);
+
+		if ((selectedObject instanceof IFile) && (selection instanceof IStructuredSelection)) {
+			IFile file = (IFile) selectedObject;
+			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+			try {
+				NewXMLWizard.showDialog(workbenchWindow.getShell(), file, structuredSelection);
+			}
+			catch (Exception e) {
+				// XMLCorePlugin.getDefault().getLog().log();
+			}
+		}
+	}
+
+	/**
+	 * unused
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		// unused
+	}
+
+	// scammed from WindowUtility
+	//
+	public static Object getSelection(ISelection selection) {
+		if (selection == null) {
+			return null;
+		} // end of if ()
+
+		Object result = null;
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection es = (IStructuredSelection) selection;
+			Iterator i = es.iterator();
+			if (i.hasNext()) {
+				result = i.next();
+			}
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLSchemaValidationChecker.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLSchemaValidationChecker.java
new file mode 100644
index 0000000..e56a3d3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLSchemaValidationChecker.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class XMLSchemaValidationChecker {
+	public boolean isValid(IFile ifile) {
+		String xsdFileName = ifile.getLocation().toString();
+		return isValid(xsdFileName);
+	}
+
+	/**
+	 * Should this be implemented as a Validator and simply called as such
+	 * with a reporter that only checks the results for severity = error? Or
+	 * should the Xerces requirement be broken using a plug-in extension?
+	 */
+
+	public boolean isValid(String xsdFileName) {
+		// DOMASBuilderImpl builder = new DOMASBuilderImpl();
+		// DOMErrorHandler errorHandler = new DOMErrorHandler();
+		// builder.setErrorHandler(errorHandler);
+		try {
+			// String uri =
+			URIHelper.getURIForFilePath(xsdFileName);
+			// ASModel model = builder.parseASURI(uri);
+			// if (errorHandler.hasError())
+			// return false;
+		}
+		catch (Exception e) // invalid schema
+		{
+			return false;
+		}
+
+		return true;
+	}
+
+	// inner class
+	class DOMErrorHandler implements ErrorHandler {
+		private boolean hasError = false;
+
+		public boolean hasError() {
+			return hasError;
+		}
+
+		public void error(SAXParseException err) {
+			hasError = true;
+		}
+
+		public void fatalError(SAXParseException exception) throws SAXException {
+			hasError = true;
+		}
+
+		public void warning(SAXParseException exception) throws SAXException {
+			// not an error
+		}
+	} // end DOMErrorHandlerImpl
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizard.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizard.java
new file mode 100644
index 0000000..ffea5d4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizard.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+public class XMLWizard {
+	protected static XMLWizard instance = new XMLWizard();
+
+	public synchronized static XMLWizard getInstance() {
+		return instance;
+	}
+
+	public XMLWizard() {
+		instance = this;
+
+	}
+
+	public ImageDescriptor getImageDescriptor(String name) {
+		try {
+			URL url = new URL(Platform.getBundle("org.eclipse.wst.xml.ui").getEntry("/"), name); //$NON-NLS-1$ //$NON-NLS-2$
+			return ImageDescriptor.createFromURL(url);
+		}
+		catch (MalformedURLException e) {
+			return ImageDescriptor.getMissingImageDescriptor();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizardsMessages.java b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizardsMessages.java
new file mode 100644
index 0000000..61e8947
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizardsMessages.java
@@ -0,0 +1,101 @@
+/**********************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others. All rights reserved.   This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: 
+ * IBM - Initial API and implementation
+ * David Carver/STAR Standard - d_a_carver@yahoo.com - bug 192568
+ **********************************************************************/
+package org.eclipse.wst.xml.ui.internal.wizards;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Strings used by XML Wizards
+ * 
+ * @plannedfor 1.0
+ */
+public class XMLWizardsMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.xml.ui.internal.wizards.wizardResource";//$NON-NLS-1$
+
+	public static String _UI_DIALOG_NEW_TITLE;
+	public static String _UI_DIALOG_TITLE_INVALID_GRAMMAR;
+	public static String _UI_DIALOG_MESSAGE_INVALID_GRAMMAR;
+	public static String _UI_WIZARD_CREATE_NEW_TITLE;
+	public static String _UI_RADIO_XML_FROM_DTD;
+	public static String _UI_RADIO_XML_FROM_SCHEMA;
+	public static String _UI_RADIO_XML_FROM_SCRATCH;
+	public static String _UI_WIZARD_CREATE_XML_HEADING;
+	public static String _UI_WIZARD_CREATE_XML_EXPL;
+	public static String _UI_WIZARD_CREATE_XML_FILE_HEADING;
+	public static String _UI_WIZARD_CREATE_XML_FILE_EXPL;
+	public static String _UI_WIZARD_SELECT_DTD_FILE_DESC;
+	public static String _UI_WIZARD_SELECT_DTD_FILE_TITLE;
+	public static String _UI_WIZARD_SELECT_XSD_FILE_DESC;
+	public static String _UI_WIZARD_SELECT_XSD_FILE_TITLE;
+	public static String _UI_WIZARD_SELECT_ROOT_HEADING;
+	public static String _UI_WIZARD_SELECT_ROOT_EXPL;
+	public static String _UI_LABEL_ROOT_ELEMENT;
+	public static String _UI_WARNING_TITLE_NO_ROOT_ELEMENTS;
+	public static String _UI_WARNING_MSG_NO_ROOT_ELEMENTS;
+	public static String _UI_LABEL_NO_LOCATION_HINT;
+	public static String _UI_WARNING_MSG_NO_LOCATION_HINT_1;
+	public static String _UI_WARNING_MSG_NO_LOCATION_HINT_2;
+	public static String _UI_WARNING_MSG_NO_LOCATION_HINT_3;
+	public static String _UI_WIZARD_CONTENT_OPTIONS;
+	public static String _UI_WIZARD_CREATE_REQUIRED;// commented out
+	public static String _UI_WIZARD_CREATE_OPTIONAL;// commented out
+	public static String _UI_WIZARD_CREATE_OPTIONAL_ATTRIBUTES;
+	public static String _UI_WIZARD_CREATE_OPTIONAL_ELEMENTS;
+	public static String _UI_WIZARD_CREATE_FIRST_CHOICE;
+	public static String _UI_WIZARD_FILL_ELEMENTS_AND_ATTRIBUTES;
+	public static String _UI_LABEL_DOCTYPE_INFORMATION;
+	public static String _UI_LABEL_SYSTEM_ID;
+	public static String _UI_LABEL_PUBLIC_ID;
+	public static String _UI_WARNING_URI_NOT_FOUND_COLON;
+	public static String _UI_INVALID_GRAMMAR_ERROR;
+	public static String _ERROR_BAD_FILENAME_EXTENSION;
+	public static String _ERROR_FILE_ALREADY_EXISTS;
+	public static String _ERROR_ROOT_ELEMENT_MUST_BE_SPECIFIED;
+	public static String _UI_LABEL_ERROR_SCHEMA_INVALID_INFO;
+	public static String _UI_LABEL_ERROR_DTD_INVALID_INFO;
+	public static String _UI_LABEL_ERROR_CATALOG_ENTRY_INVALID;
+	public static String _UI_LABEL_NAMESPACE_INFORMATION;
+	public static String Validation_Plugins_Unavailable;
+	public static String Validation_cannot_be_performed;
+	public static String ExampleProjectCreationOperation_op_desc;
+	public static String ExampleProjectCreationOperation_op_desc_proj;
+	public static String ExampleProjectCreationWizard_title;
+	public static String ExampleProjectCreationWizard_op_error_title;
+	public static String ExampleProjectCreationWizard_op_error_message;
+	public static String ExampleProjectCreationWizard_overwritequery_title;
+	public static String ExampleProjectCreationWizard_overwritequery_message;
+	public static String ExampleProjectCreationWizardPage_error_alreadyexists;
+
+	public static String NewXMLTemplatesWizardPage_0;
+	public static String NewXMLTemplatesWizardPage_1;
+	public static String NewXMLTemplatesWizardPage_2;
+	public static String NewXMLTemplatesWizardPage_3;
+	public static String NewXMLTemplatesWizardPage_4;
+	public static String NewXMLTemplatesWizardPage_5;
+	public static String NewXMLTemplatesWizardPage_6;
+	public static String NewXMLTemplatesWizardPage_7;
+	
+	public static String _UI_DIALOG_XMLCATALOG_IMPORT_TITLE;
+	public static String _UI_DIALOG_XMLCATALOG_EXPORT_TITLE;
+	public static String _UI_DIALOG_XMLCATALOG_EXPORT_DESCRIPTION;
+    public static String _UI_DIALOG_XMLCATALOG_IMPORT_DESCRIPTION;
+    public static String _UI_WIZARD_LIMIT_OPTIONAL_ELEMENT_DEPTH;
+    public static String _UI_WIZARD_GENERATING_XML_DOCUMENT;
+    
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, XMLWizardsMessages.class);
+	}
+
+	private XMLWizardsMessages() {
+		// cannot create new instance
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/wizardResource.properties b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/wizardResource.properties
new file mode 100644
index 0000000..06a2a6f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/wizardResource.properties
@@ -0,0 +1,102 @@
+###############################################################################
+# Copyright (c) 2001, 2009 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     David Carver/STAR Standard - d_a_carver@yahoo.com - bug 192568
+###############################################################################
+! Properties file for component: XML Tools -  New XML Wizard
+! Packaged for translation in:  xml.zip
+
+!XMLImportActionDelegate
+_UI_DIALOG_NEW_TITLE        = New XML File
+_UI_DIALOG_TITLE_INVALID_GRAMMAR = Invalid Grammar
+_UI_DIALOG_MESSAGE_INVALID_GRAMMAR = The grammar file contains errors. If you proceed, an incorrect result file will be generated. Do you want to continue?
+
+!NewXMLBWizard
+_UI_WIZARD_CREATE_NEW_TITLE           = New XML File
+_UI_RADIO_XML_FROM_DTD                = Create XML file from a &DTD file
+_UI_RADIO_XML_FROM_SCHEMA             = Create XML file from an &XML schema file
+_UI_RADIO_XML_FROM_SCRATCH            = Create XML file from an XML &template
+_UI_WIZARD_CREATE_XML_HEADING         = Create XML File From
+_UI_WIZARD_CREATE_XML_EXPL            = Select how you would like to create your XML file.
+_UI_WIZARD_CREATE_XML_FILE_HEADING    = XML
+_UI_WIZARD_CREATE_XML_FILE_EXPL       = Create a new XML file.
+_UI_WIZARD_SELECT_DTD_FILE_DESC       = Select the DTD file to create the XML file.
+_UI_WIZARD_SELECT_DTD_FILE_TITLE      = Select DTD File
+_UI_WIZARD_SELECT_XSD_FILE_DESC       = Select the schema file to create the XML file.
+_UI_WIZARD_SELECT_XSD_FILE_TITLE      = Select XML Schema File
+_UI_WIZARD_SELECT_ROOT_HEADING        = Select Root Element
+_UI_WIZARD_SELECT_ROOT_EXPL           = Select the root element of the XML file.
+_UI_LABEL_ROOT_ELEMENT                = Root element:
+_UI_WARNING_TITLE_NO_ROOT_ELEMENTS    = No Root Elements
+_UI_WARNING_MSG_NO_ROOT_ELEMENTS      = No root element exists since the schema provided has no global elements.
+_UI_LABEL_NO_LOCATION_HINT            = Unspecified Namespace Location
+_UI_WARNING_MSG_NO_LOCATION_HINT_1    = You have not specified a location hint for one or more namespace entries.
+_UI_WARNING_MSG_NO_LOCATION_HINT_2    = Elements from these namespaces will not be generated. This may lead to an invalid generated document.
+_UI_WARNING_MSG_NO_LOCATION_HINT_3    = Click Yes to continue, Click No to go back and specify the location hints.
+_UI_WIZARD_CONTENT_OPTIONS            = Content options
+
+_UI_WIZARD_CREATE_REQUIRED            = &Create required content only
+_UI_WIZARD_CREATE_OPTIONAL            = Create required and &optional content
+_UI_WIZARD_LIMIT_OPTIONAL_ELEMENT_DEPTH = L&imit optional element depth to:
+_UI_WIZARD_GENERATING_XML_DOCUMENT	  = Generating XML document...
+
+_UI_WIZARD_CREATE_OPTIONAL_ATTRIBUTES = Create optional &attributes
+_UI_WIZARD_CREATE_OPTIONAL_ELEMENTS   = Create optional e&lements
+_UI_WIZARD_CREATE_FIRST_CHOICE        = Create first choice of required &choice
+_UI_WIZARD_FILL_ELEMENTS_AND_ATTRIBUTES = Fill elements and attributes with &data
+
+_UI_LABEL_DOCTYPE_INFORMATION         = Document type information
+_UI_LABEL_SYSTEM_ID                   = &System ID:
+_UI_LABEL_PUBLIC_ID                   = &Public ID:
+
+_UI_WARNING_URI_NOT_FOUND_COLON       = The specified resource cannot be located :
+
+!NewModelWizard
+_UI_INVALID_GRAMMAR_ERROR             = Invalid Grammar
+
+!NewModelWizard
+_ERROR_BAD_FILENAME_EXTENSION         = The file name must end in one of the following extensions {0}.
+_ERROR_FILE_ALREADY_EXISTS            = The same file already exists.
+_ERROR_ROOT_ELEMENT_MUST_BE_SPECIFIED = A root element must be specified.
+_UI_LABEL_ERROR_SCHEMA_INVALID_INFO   = The schema file contains errors. Open it in the XML schema editor for details.
+_UI_LABEL_ERROR_DTD_INVALID_INFO      = The DTD file contains errors. Open it in the DTD editor for details.
+
+_UI_LABEL_ERROR_CATALOG_ENTRY_INVALID = The selected catalog entry specifies a URI that can not be located.
+
+_UI_LABEL_NAMESPACE_INFORMATION=Namespace Information
+
+Validation_Plugins_Unavailable=Validation Plugins Unavailable
+Validation_cannot_be_performed=Validation cannot be performed because the validation plugins were disabled or not found.  The generated file may be invalid.  Do you wish to continue?
+
+!ImportXMLCatalogWizard
+_UI_DIALOG_XMLCATALOG_IMPORT_TITLE    = Import XML Catalog
+_UI_DIALOG_XMLCATALOG_IMPORT_DESCRIPTION = Import all entries from an existing XML Catalog into the User Catalog.
+
+!ExportXMLCatalogWizard
+_UI_DIALOG_XMLCATALOG_EXPORT_TITLE    = Export Existing XML Catalog
+_UI_DIALOG_XMLCATALOG_EXPORT_DESCRIPTION = Export all existing User Catalog entries.
+#
+# ExampleProject
+ExampleProjectCreationOperation_op_desc=Creating example projects...
+ExampleProjectCreationOperation_op_desc_proj=Configuring project...
+ExampleProjectCreationWizard_title=New Example Project
+ExampleProjectCreationWizard_op_error_title=Project Creation Failed
+ExampleProjectCreationWizard_op_error_message=Project could not be created.
+ExampleProjectCreationWizard_overwritequery_title=Overwrite
+ExampleProjectCreationWizard_overwritequery_message=Do you want to overwrite {0}?
+ExampleProjectCreationWizardPage_error_alreadyexists=Project already exists.
+
+NewXMLTemplatesWizardPage_0=Select XML Template
+NewXMLTemplatesWizardPage_1=Select a template as initial content in the XML page.
+NewXMLTemplatesWizardPage_2=Name
+NewXMLTemplatesWizardPage_3=Description
+NewXMLTemplatesWizardPage_4=&Use XML Template
+NewXMLTemplatesWizardPage_5=&Preview:
+NewXMLTemplatesWizardPage_6=Templates are 'New XML' templates found in the <a>XML Templates</a> preference page.
+NewXMLTemplatesWizardPage_7=&Templates:
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/StructuredTextViewerConfigurationXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/StructuredTextViewerConfigurationXML.java
new file mode 100644
index 0000000..2c11ee3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/StructuredTextViewerConfigurationXML.java
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.formatter.IContentFormatter;
+import org.eclipse.jface.text.formatter.MultiPassContentFormatter;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.wst.sse.core.text.IStructuredPartitions;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.core.internal.text.rules.StructuredTextPartitionerForXML;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+import org.eclipse.wst.xml.ui.internal.XMLFormattingStrategy;
+import org.eclipse.wst.xml.ui.internal.autoedit.AutoEditStrategyForTabs;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLStructuredContentAssistProcessor;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
+import org.eclipse.wst.xml.ui.internal.style.LineStyleProviderForXML;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+/**
+ * Configuration for a source viewer which shows XML content.
+ * <p>
+ * Clients can subclass and override just those methods which must be specific
+ * to their needs.
+ * </p>
+ * 
+ * @see org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration
+ * @since 1.0
+ */
+public class StructuredTextViewerConfigurationXML extends StructuredTextViewerConfiguration {
+	/*
+	 * One instance per configuration because not sourceviewer-specific and
+	 * it's a String array
+	 */
+	private String[] fConfiguredContentTypes;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForXML;
+	private ILabelProvider fStatusLineLabelProvider;
+
+	/**
+	 * Create new instance of StructuredTextViewerConfigurationXML
+	 */
+	public StructuredTextViewerConfigurationXML() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+	}
+
+	public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) {
+		List allStrategies = new ArrayList(0);
+
+		IAutoEditStrategy[] superStrategies = super.getAutoEditStrategies(sourceViewer, contentType);
+		for (int i = 0; i < superStrategies.length; i++) {
+			allStrategies.add(superStrategies[i]);
+		}
+
+		// be sure this is last, so it can modify any results form previous
+		// commands that might on on same partiion type.
+		// add auto edit strategy that handles when tab key is pressed
+		allStrategies.add(new AutoEditStrategyForTabs());
+
+		return (IAutoEditStrategy[]) allStrategies.toArray(new IAutoEditStrategy[allStrategies.size()]);
+	}
+
+	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+
+		if (fConfiguredContentTypes == null) {
+			String[] xmlTypes = StructuredTextPartitionerForXML.getConfiguredContentTypes();
+			fConfiguredContentTypes = new String[xmlTypes.length + 2];
+			fConfiguredContentTypes[0] = IStructuredPartitions.DEFAULT_PARTITION;
+			fConfiguredContentTypes[1] = IStructuredPartitions.UNKNOWN_PARTITION;
+			int index = 0;
+			System.arraycopy(xmlTypes, 0, fConfiguredContentTypes, index += 2, xmlTypes.length);
+		}
+		return fConfiguredContentTypes;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration#getContentAssistProcessors(
+	 * 	org.eclipse.jface.text.source.ISourceViewer, java.lang.String)
+	 */
+	protected IContentAssistProcessor[] getContentAssistProcessors(ISourceViewer sourceViewer, String partitionType) {
+		IContentAssistProcessor processor = new XMLStructuredContentAssistProcessor(
+				this.getContentAssistant(), partitionType, sourceViewer);
+		return new IContentAssistProcessor[]{processor};
+	}
+
+	public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
+		IContentFormatter formatter = super.getContentFormatter(sourceViewer);
+		// super was unable to create a formatter, probably because
+		// sourceViewer does not have document set yet, so just create a
+		// generic one
+		if (!(formatter instanceof MultiPassContentFormatter))
+			formatter = new MultiPassContentFormatter(getConfiguredDocumentPartitioning(sourceViewer), IXMLPartitions.XML_DEFAULT);
+		((MultiPassContentFormatter) formatter).setMasterStrategy(new XMLFormattingStrategy());		
+//		((MultiPassContentFormatter) formatter).setMasterStrategy(new StructuredFormattingStrategy(new FormatProcessorXML()));
+
+		return formatter;
+	}
+
+	public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
+		Vector vector = new Vector();
+
+		// prefix[0] is either '\t' or ' ' x tabWidth, depending on preference
+		Preferences preferences = XMLCorePlugin.getDefault().getPluginPreferences();
+		int indentationWidth = preferences.getInt(XMLCorePreferenceNames.INDENTATION_SIZE);
+		String indentCharPref = preferences.getString(XMLCorePreferenceNames.INDENTATION_CHAR);
+		boolean useSpaces = XMLCorePreferenceNames.SPACE.equals(indentCharPref);
+
+		for (int i = 0; i <= indentationWidth; i++) {
+			StringBuffer prefix = new StringBuffer();
+			boolean appendTab = false;
+
+			if (useSpaces) {
+				for (int j = 0; j + i < indentationWidth; j++) {
+					prefix.append(' ');
+				}
+
+				if (i != 0) {
+					appendTab = true;
+				}
+			}
+			else {
+				for (int j = 0; j < i; j++) {
+					prefix.append(' ');
+				}
+
+				if (i != indentationWidth) {
+					appendTab = true;
+				}
+			}
+
+			if (appendTab) {
+				prefix.append('\t');
+				vector.add(prefix.toString());
+				// remove the tab so that indentation - tab is also an indent
+				// prefix
+				prefix.deleteCharAt(prefix.length() - 1);
+			}
+			vector.add(prefix.toString());
+		}
+
+		vector.add(""); //$NON-NLS-1$
+
+		return (String[]) vector.toArray(new String[vector.size()]);
+	}
+
+	public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+		LineStyleProvider[] providers = null;
+
+		if ((partitionType == IXMLPartitions.XML_DEFAULT) || (partitionType == IXMLPartitions.XML_CDATA) || (partitionType == IXMLPartitions.XML_COMMENT) || (partitionType == IXMLPartitions.XML_DECLARATION) || (partitionType == IXMLPartitions.XML_PI)) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForXML()};
+		}
+
+		return providers;
+	}
+
+	private LineStyleProvider getLineStyleProviderForXML() {
+		if (fLineStyleProviderForXML == null) {
+			fLineStyleProviderForXML = new LineStyleProviderForXML();
+		}
+		return fLineStyleProviderForXML;
+	}
+
+	public ILabelProvider getStatusLineLabelProvider(ISourceViewer sourceViewer) {
+		if (fStatusLineLabelProvider == null) {
+			fStatusLineLabelProvider = new JFaceNodeLabelProvider() {
+				public String getText(Object element) {
+					if (element == null)
+						return null;
+
+					StringBuffer s = new StringBuffer();
+					Node node = (Node) element;
+					while (node != null) {
+						if (node.getNodeType() != Node.DOCUMENT_NODE) {
+							s.insert(0, super.getText(node));
+						}
+
+						if (node.getNodeType() == Node.ATTRIBUTE_NODE)
+							node = ((Attr) node).getOwnerElement();
+						else
+							node = node.getParentNode();
+					
+						if (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
+							s.insert(0, IPath.SEPARATOR);
+						}
+					}
+					return s.toString();
+				}
+
+			};
+		}
+		return fStatusLineLabelProvider;
+	}
+
+	protected Map getHyperlinkDetectorTargets(ISourceViewer sourceViewer) {
+		Map targets = super.getHyperlinkDetectorTargets(sourceViewer);
+		targets.put(ContentTypeIdForXML.ContentTypeID_XML, null);
+		return targets;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/DOMObserver.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/DOMObserver.java
new file mode 100644
index 0000000..4b90cfb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/DOMObserver.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.CMDocumentLoader;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.InferredGrammarBuildingCMDocumentLoader;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * This class is used to observe changes in the DOM and perform
+ * occasional'scans' to deduce information. We use a delay timer mechanism to
+ * ensure scans are made every couple of seconds to avoid performance
+ * problems. Currently this class is used to keep track of referenced grammar
+ * uri's within the document ensure that they are loaded by the
+ * CMDocumentManager. We might want to generalize this class to perform other
+ * suplimental information gathering that is suitable for 'time delayed'
+ * computation (error hints etc.).
+ */
+// TODO: Where should this class go?
+public class DOMObserver {
+
+
+	// An abstract adapter that ensures that the children of a new Node are
+	// also adapted
+	//
+	abstract class DocumentAdapter implements INodeAdapter {
+		public DocumentAdapter() {
+		}
+
+		public void connect(Document document) {
+			((INodeNotifier) document).addAdapter(this);
+			adapt(document.getDocumentElement());
+		}
+
+		public void dicconnect(Document document) {
+			((INodeNotifier) document).removeAdapter(this);
+		}
+
+		public void adapt(Element element) {
+			if (element != null) {
+				if (((INodeNotifier) element).getExistingAdapter(this) == null) {
+					((INodeNotifier) element).addAdapter(this);
+
+					for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+						if (child.getNodeType() == Node.ELEMENT_NODE) {
+							adapt((Element) child);
+						}
+					}
+				}
+			}
+		}
+
+		public boolean isAdapterForType(Object type) {
+			return type == this;
+		}
+
+		abstract public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index);
+	}
+
+	/**
+	 * This class listens to the changes in the CMDocument and triggers a
+	 * CMDocument load
+	 */
+	class MyDocumentAdapter extends DocumentAdapter {
+
+		public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index) {
+			switch (eventType) {
+				case INodeNotifier.ADD : {
+					if (newValue instanceof Element) {
+						// System.out.println("ADD (to " +
+						// ((Node)notifier).getNodeName() + ") " +
+						// ((Element)newValue).getNodeName() + " old " +
+						// oldValue);
+						adapt((Element) newValue);
+					}
+					break;
+				}
+					// case INodeNotifier.REMOVE:
+				case INodeNotifier.CHANGE :
+				case INodeNotifier.STRUCTURE_CHANGED :
+				case INodeNotifier.CONTENT_CHANGED : {
+					Node node = (Node) notifier;
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						switch (eventType) {
+							case INodeNotifier.CHANGE :
+							case INodeNotifier.STRUCTURE_CHANGED : {
+								// structure change
+								invokeDelayedCMDocumentLoad();
+								break;
+							}
+							case INodeNotifier.CONTENT_CHANGED : {
+								// some content changed
+								break;
+							}
+						}
+					}
+					else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+						invokeDelayedCMDocumentLoad();
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * Intentionally left visible to the user
+	 */
+	class TimerJob extends Job {
+		public TimerJob() {
+			super(SSEUIMessages.LoadingReferencedGrammars);
+		}
+
+		public IStatus run(IProgressMonitor monitor) {
+			monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+			Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
+			invokeCMDocumentLoad();
+			monitor.done();
+			return Status.OK_STATUS;
+		}
+	}
+
+	private Job timer = new TimerJob();
+	protected Document fDocument;
+	protected boolean isGrammarInferenceEnabled;
+	/**
+	 * If true, DOMObserver is currently disabled and not loading the content
+	 * model
+	 */
+	private boolean fIsDisabled = false;
+	/**
+	 * If true, DOMObserver is currently trying to load the content model
+	 */
+	private boolean fIsLoading = false;
+
+	public DOMObserver(IStructuredModel model) {
+		fDocument = (model instanceof IDOMModel) ? ((IDOMModel) model).getDocument() : null;
+
+		if (fDocument != null) {
+			// here we create and init an adapter that will listen to
+			// changes to the document and contained elements
+			MyDocumentAdapter adapter = new MyDocumentAdapter();
+			adapter.connect(fDocument);
+
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fDocument);
+			if ((modelQuery != null) && (modelQuery.getCMDocumentManager() != null)) {
+				CMDocumentManager cmDocumentManager = modelQuery.getCMDocumentManager();
+				cmDocumentManager.setPropertyEnabled(CMDocumentManager.PROPERTY_AUTO_LOAD, false);
+			}
+			
+			// attach a dom observer adapter to the document so others have access to
+			// domobserver if needed
+			INodeAdapter domObserverAdapter = ((INodeNotifier)fDocument).getExistingAdapter(DOMObserverAdapter.class);
+			if (domObserverAdapter == null) {
+				domObserverAdapter = new DOMObserverAdapter();
+				((INodeNotifier)fDocument).addAdapter(domObserverAdapter);
+			}
+			((DOMObserverAdapter)domObserverAdapter).setDOMObserver(this);
+		}
+	}
+
+	public void init() {
+		// CS: we seem to expose an XSD initialization problem when we do this
+		// immediately
+		// very nasty... I need to revist this problem with Ed Merks
+		//
+		timer.schedule();
+	}
+
+	public void invokeCMDocumentLoad() {
+		if (fIsDisabled) return;
+		try {
+			fIsLoading = true;
+			
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fDocument);
+			if ((modelQuery != null) && (modelQuery.getCMDocumentManager() != null)) {
+				CMDocumentLoader loader = isGrammarInferenceEnabled ? new InferredGrammarBuildingCMDocumentLoader(fDocument, modelQuery) : new CMDocumentLoader(fDocument, modelQuery);
+				loader.loadCMDocuments();
+			}
+		} finally {
+			fIsLoading = false;
+		}
+	}
+
+	public void invokeDelayedCMDocumentLoad() {
+		if (fIsDisabled) return;
+		timer.schedule(2000);
+	}
+
+	public void setGrammarInferenceEnabled(boolean isEnabled) {
+		isGrammarInferenceEnabled = isEnabled;
+	}
+	
+	boolean setDisabled(boolean isDisabled, boolean forced) {
+		boolean success = true;
+		
+		if (fIsDisabled != isDisabled) {
+			fIsDisabled = isDisabled;
+			if (forced) {
+				if (isDisabled)
+					success = timer.cancel();
+				else
+					invokeCMDocumentLoad();
+			}
+		}
+		return success;
+	}
+	
+	boolean isLoading() {
+		return fIsLoading;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/DOMObserverAdapter.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/DOMObserverAdapter.java
new file mode 100644
index 0000000..fcd60c4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/DOMObserverAdapter.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+
+/**
+ * This is just an adapter that sits on a document node to allow clients
+ * limited access to the DOMObserver. Clients who handle their own content
+ * model document loading (as opposed to letting the DOMObserver do it) may
+ * use this class to stop the DOMObserver from loading and possibly
+ * interfering with the client's document loading.
+ */
+public class DOMObserverAdapter implements INodeAdapter {
+	private DOMObserver fObserver = null;
+
+	public boolean isAdapterForType(Object type) {
+		return type == DOMObserverAdapter.class;
+	}
+
+	public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+		// do nothing
+	}
+
+	/**
+	 * The DOMObserver is the one that adds the adapter to the document node,
+	 * so it'll set itself up here as well.
+	 * 
+	 * @param observer
+	 */
+	void setDOMObserver(DOMObserver observer) {
+		fObserver = observer;
+	}
+
+	/**
+	 * Disable the DOMObserver to prevent it from future content model loading
+	 * for this document.
+	 * 
+	 * @param disable
+	 *            true if caller wants DOMObserver disabled. false if caller
+	 *            wants DOMObserver enabled.
+	 * @param force
+	 *            if true, DOMObserver will forcibly be disabled (if the
+	 *            DOMObserver model loading job is scheduled, it will be
+	 *            cancelled)
+	 * @return true if DOMObserver was successfully disabled. false if
+	 *         DOMObserver was already in the process of loading and was
+	 *         unable to stop
+	 */
+	public boolean disableObserver(boolean disable, boolean force) {
+		return fObserver.setDisabled(disable, force);
+	}
+
+	/**
+	 * Returns whether or not DOMObserver is currently attempting to load the
+	 * content model.
+	 * 
+	 * @return true if DOMObserver is currently in the process of loading the
+	 *         content models. false otherwise.
+	 */
+	public boolean isObserverLoading() {
+		return fObserver.isLoading();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/IProductConstants.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/IProductConstants.java
new file mode 100644
index 0000000..ab66be9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/IProductConstants.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+public interface IProductConstants {
+	/**
+	 * The explorer view to use when creating the XML perspective
+	 */
+	String PERSPECTIVE_EXPLORER_VIEW = "idPerspectiveHierarchyView"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/Logger.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/Logger.java
new file mode 100644
index 0000000..b98e7ab
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/Logger.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+
+
+import com.ibm.icu.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.Bundle;
+
+/**
+ * Small convenience class to log messages to plugin's log file and also, if
+ * desired, the console. This class should only be used by classes in this
+ * plugin. Other plugins should make their own copy, with appropriate ID.
+ */
+public class Logger {
+	private static final String PLUGIN_ID = "org.eclipse.wst.xml.ui"; //$NON-NLS-1$
+
+	public static final int ERROR = IStatus.ERROR; // 4
+	public static final int ERROR_DEBUG = 200 + ERROR;
+	public static final int INFO = IStatus.INFO; // 1
+	public static final int INFO_DEBUG = 200 + INFO;
+
+	public static final int OK = IStatus.OK; // 0
+
+	public static final int OK_DEBUG = 200 + OK;
+
+	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
+	public static final int WARNING = IStatus.WARNING; // 2
+	public static final int WARNING_DEBUG = 200 + WARNING;
+
+	/**
+	 * Adds message to log.
+	 * 
+	 * @param level
+	 *            severity level of the message (OK, INFO, WARNING, ERROR,
+	 *            OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
+	 * @param message
+	 *            text to add to the log
+	 * @param exception
+	 *            exception thrown
+	 */
+	protected static void _log(int level, String message, Throwable exception) {
+		if ((level == OK_DEBUG) || (level == INFO_DEBUG) || (level == WARNING_DEBUG) || (level == ERROR_DEBUG)) {
+			if (!isDebugging()) {
+				return;
+			}
+		}
+
+		int severity = IStatus.OK;
+		switch (level) {
+			case INFO_DEBUG :
+			case INFO :
+				severity = IStatus.INFO;
+				break;
+			case WARNING_DEBUG :
+			case WARNING :
+				severity = IStatus.WARNING;
+				break;
+			case ERROR_DEBUG :
+			case ERROR :
+				severity = IStatus.ERROR;
+		}
+		message = (message != null) ? message : "null"; //$NON-NLS-1$
+		Status statusObj = new Status(severity, PLUGIN_ID, severity, message, exception);
+		Bundle bundle = Platform.getBundle(PLUGIN_ID);
+		if (bundle != null) {
+			Platform.getLog(bundle).log(statusObj);
+		}
+	}
+
+	/**
+	 * Prints message to log if category matches /debug/tracefilter option.
+	 * 
+	 * @param message
+	 *            text to print
+	 * @param category
+	 *            category of the message, to be compared with
+	 *            /debug/tracefilter
+	 */
+	protected static void _trace(String category, String message, Throwable exception) {
+		if (isTracing(category)) {
+			message = (message != null) ? message : "null"; //$NON-NLS-1$
+			Status statusObj = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, exception);
+			Bundle bundle = Platform.getBundle(PLUGIN_ID);
+			if (bundle != null) {
+				Platform.getLog(bundle).log(statusObj);
+			}
+		}
+	}
+
+	/**
+	 * @return true if the platform is debugging
+	 */
+	public static boolean isDebugging() {
+		return Platform.inDebugMode();
+	}
+
+	/**
+	 * Determines if currently tracing a category
+	 * 
+	 * @param category
+	 * @return true if tracing category, false otherwise
+	 */
+	public static boolean isTracing(String category) {
+		if (!isDebugging()) {
+			return false;
+		}
+
+		String traceFilter = Platform.getDebugOption(PLUGIN_ID + TRACEFILTER_LOCATION);
+		if (traceFilter != null) {
+			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
+			while (tokenizer.hasMoreTokens()) {
+				String cat = tokenizer.nextToken().trim();
+				if (category.equals(cat)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	public static void log(int level, String message) {
+		_log(level, message, null);
+	}
+
+	public static void log(int level, String message, Throwable exception) {
+		_log(level, message, exception);
+	}
+
+	public static void logException(String message, Throwable exception) {
+		_log(ERROR, message, exception);
+	}
+
+	public static void logException(Throwable exception) {
+		_log(ERROR, exception.getMessage(), exception);
+	}
+
+	public static void trace(String category, String message) {
+		_trace(category, message, null);
+	}
+
+	public static void traceException(String category, String message, Throwable exception) {
+		_trace(category, message, exception);
+	}
+
+	public static void traceException(String category, Throwable exception) {
+		_trace(category, exception.getMessage(), exception);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/ProductProperties.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/ProductProperties.java
new file mode 100644
index 0000000..6f88be4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/ProductProperties.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.ui.IPageLayout;
+
+public class ProductProperties {
+	/**
+	 * Default values for WTP level product
+	 */
+	static final String ID_PERSPECTIVE_EXPLORER_VIEW = IPageLayout.ID_PROJECT_EXPLORER;
+
+	/**
+	 * Return the value for the associated key from the Platform Product registry or return the
+	 * WTP default.
+	 * 
+	 * @param key
+	 * @return String value of product's property
+	 */
+	public static String getProperty(String key) {
+		if (key == null)
+			return null;
+		String value = null;
+		if (Platform.getProduct()!=null)
+			value = Platform.getProduct().getProperty(key);
+		if (value == null) {
+			if (key.equals(IProductConstants.PERSPECTIVE_EXPLORER_VIEW))
+				return ID_PERSPECTIVE_EXPLORER_VIEW;
+		}
+		return value;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLFormattingStrategy.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLFormattingStrategy.java
new file mode 100644
index 0000000..39432ef
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLFormattingStrategy.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+import java.util.LinkedList;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TypedPosition;
+import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
+import org.eclipse.jface.text.formatter.FormattingContextProperties;
+import org.eclipse.jface.text.formatter.IFormattingContext;
+import org.eclipse.jface.text.formatter.IFormattingStrategyExtension;
+import org.eclipse.text.edits.TextEdit;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.xml.core.internal.formatter.DefaultXMLPartitionFormatter;
+
+public class XMLFormattingStrategy extends ContextBasedFormattingStrategy implements IFormattingStrategyExtension {
+
+	/** Documents to be formatted by this strategy */
+	private final LinkedList fDocuments = new LinkedList();
+	/** Partitions to be formatted by this strategy */
+	private final LinkedList fPartitions = new LinkedList();
+	private IRegion fRegion;
+	private DefaultXMLPartitionFormatter formatter = new DefaultXMLPartitionFormatter();
+
+	/**
+	 * @param formatProcessor
+	 */
+	public XMLFormattingStrategy() {
+		super();
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#format()
+	 */
+	public void format() {
+		super.format();
+
+		final IDocument document = (IDocument) fDocuments.removeFirst();
+		final TypedPosition partition = (TypedPosition) fPartitions.removeFirst();
+
+		if (document != null && partition != null && fRegion != null) {
+			try {
+				if (document instanceof IStructuredDocument) {
+					IStructuredModel model = StructuredModelManager.getModelManager().getModelForEdit((IStructuredDocument) document);
+					if (model != null) {
+						try {
+							TextEdit edit = formatter.format(model, fRegion.getOffset(), fRegion.getLength());
+							if (edit != null) {
+								try {
+									model.aboutToChangeModel();
+									edit.apply(document);
+								}
+								finally {
+									model.changedModel();
+								}
+							}
+						}
+						finally {
+							model.releaseFromEdit();
+						}
+					}
+				}
+			}
+			catch (BadLocationException e) {
+				// log for now, unless we find reason not to
+				Logger.log(Logger.INFO, e.getMessage());
+			}
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStarts(org.eclipse.jface.text.formatter.IFormattingContext)
+	 */
+	public void formatterStarts(final IFormattingContext context) {
+		super.formatterStarts(context);
+
+		fPartitions.addLast(context.getProperty(FormattingContextProperties.CONTEXT_PARTITION));
+		fDocuments.addLast(context.getProperty(FormattingContextProperties.CONTEXT_MEDIUM));
+		fRegion = (IRegion) context.getProperty(FormattingContextProperties.CONTEXT_REGION);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStops()
+	 */
+	public void formatterStops() {
+		super.formatterStops();
+
+		fPartitions.clear();
+		fDocuments.clear();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIMessages.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIMessages.java
new file mode 100644
index 0000000..2f03c15
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIMessages.java
@@ -0,0 +1,358 @@
+/**********************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others. All rights reserved.   This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: 
+ * IBM - Initial API and implementation
+ * Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference
+ * David Carver - STAR - [205989] - [validation] validate XML after XInclude resolution
+ **********************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Strings used by XML UI
+ * 
+ * @plannedfor 1.0
+ */
+public class XMLUIMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.xml.ui.internal.XMLUIPluginResources";//$NON-NLS-1$
+	private static ResourceBundle fResourceBundle;
+
+	public static String Sample_XML_doc;
+	public static String Comment_Delimiters_UI_;
+	public static String Comment_Content_UI_;
+	public static String Tag_Delimiters_UI_;
+	public static String Tag_Names_UI_;
+	public static String Attribute_Names_UI_;
+	public static String Attribute_Equals_UI_;
+	public static String Attribute_Values_UI_;
+	public static String Declaration_Delimiters_UI_;
+	public static String Content_UI_;
+	public static String CDATA_Delimiters_UI_;
+	public static String CDATA_Content_UI_;
+	public static String Processing_Instruction_Del_UI_;
+	public static String Processing_Instruction_Con_UI__UI_;
+	public static String DOCTYPE_Name_UI_;
+	public static String DOCTYPE_SYSTEM_PUBLIC_Keyw_UI_;
+	public static String DOCTYPE_Public_Reference_UI_;
+	public static String DOCTYPE_System_Reference_UI_;
+	public static String Entity_Reference_UI_;
+	public static String DELETE;
+	public static String ADD_PROCESSING_INSTRUCTION;
+	public static String _UI_MENU_ADD_AFTER;
+	public static String _UI_MENU_ADD_ATTRIBUTE;
+	public static String _UI_MENU_ADD_BEFORE;
+	public static String _UI_MENU_ADD_CHILD;
+	public static String _UI_MENU_REMOVE;
+	public static String _UI_MENU_REPLACE_WITH;
+	public static String _UI_MENU_EDIT_DOCTYPE;
+	public static String _UI_LABEL_UNDO_REPLACE_DESCRIPTION;
+	public static String _UI_LABEL_EDIT_DOCTYPE;
+	public static String _UI_INFO_EXPAND_ALL;
+	public static String _UI_INFO_COLLAPSE_ALL;
+	public static String _UI_MENU_ADD_DTD_INFORMATION;
+	public static String _UI_MENU_ADD_SCHEMA_INFORMATION;
+	public static String _UI_MENU_EDIT_PROCESSING_INSTRUCTION;
+	public static String _UI_MENU_EDIT_NAMESPACES;
+	public static String _UI_MENU_ADD_DTD_INFORMATION_TITLE;
+	public static String _UI_MENU_EDIT_PROCESSING_INSTRUCTION_TITLE;
+	public static String _UI_MENU_EDIT_SCHEMA_INFORMATION_TITLE;
+	public static String _UI_MENU_NEW_ATTRIBUTE;
+	public static String _UI_MENU_NEW_ATTRIBUTE_TITLE;
+	public static String _UI_MENU_EDIT_ATTRIBUTE;
+	public static String _UI_MENU_EDIT_ATTRIBUTE_TITLE;
+	public static String _UI_MENU_NEW_ELEMENT;
+	public static String _UI_MENU_NEW_ELEMENT_TITLE;
+	public static String _UI_MENU_RENAME;
+	public static String _UI_MENU_RENAME_TITLE;
+	public static String _UI_LABEL_ELEMENT_NAME;
+	public static String _UI_MENU_ADD_COMMENT;
+	public static String _UI_MENU_ADD_PROCESSING_INSTRUCTION;
+	public static String _UI_MENU_ADD_CDATA_SECTION;
+	public static String _UI_MENU_ADD_PCDATA;
+	public static String _UI_MENU_COMMENT;
+	public static String _UI_MENU_PROCESSING_INSTRUCTION;
+	public static String _UI_MENU_CDATA_SECTION;
+	public static String _UI_MENU_PCDATA;
+	public static String _UI_MENU_ADD;
+	public static String _UI_COMMENT_VALUE;
+	public static String _UI_PI_TARGET_VALUE;
+	public static String _UI_PI_DATA_VALUE;
+	public static String _UI_LABEL_ROOT_ELEMENT_VALUE;
+	public static String _UI_LABEL_TARGET_COLON;
+	public static String _UI_LABEL_DATA_COLON;
+	public static String _UI_LABEL_ROOT_ELEMENT_NAME_COLON;
+	public static String _UI_LABEL_PUBLIC_ID_COLON;
+	public static String _UI_LABEL_SYSTEM_ID_COLON;
+	public static String _UI_LABEL_BROWSE;
+	public static String _UI_LABEL_SELECT_XML_CATALOG_ENTRY;
+	public static String _UI_LABEL_SPECIFY_SYSTEM_ID;
+	public static String _UI_LABEL_SELECT_FILE;
+	public static String _UI_LABEL_KEY;
+	public static String _UI_LABEL_URI;
+	public static String _UI_LABEL_XML_CATALOG_COLON;
+	public static String _UI_LABEL_NAMESPACE_NAME;
+	public static String _UI_LABEL_LOCATION_HINT;
+	public static String _UI_LABEL_PREFIX;
+	public static String _UI_LABEL_NAMESPACE_NAME_COLON;
+	public static String _UI_LABEL_LOCATION_HINT_COLON;
+	public static String _UI_LABEL_PREFIX_COLON;
+	public static String _UI_NO_NAMESPACE_NAME;
+	public static String _UI_NO_PREFIX;
+	public static String _UI_LABEL_XML_SCHEMA_INFORMATION;
+	public static String _UI_LABEL_NAME_COLON;
+	public static String _UI_LABEL_VALUE_COLON;
+	public static String _UI_BUTTON_DELETE;
+	public static String _UI_BUTTON_NEW;
+	public static String _UI_BUTTON_EDIT;
+	public static String _UI_LABEL_NEW_NAMESPACE_INFORMATION;
+	public static String _UI_RADIO_BUTTON_SELECT_FROM_WORKSPACE;
+	public static String _UI_RADIO_BUTTON_SELECT_FROM_CATALOG;
+	public static String _UI_WARNING_MORE_THAN_ONE_NS_WITH_NAME;
+	public static String _UI_WARNING_MORE_THAN_ONE_NS_WITHOUT_NAME;
+	public static String _UI_WARNING_MORE_THAN_ONE_NS_WITHOUT_PREFIX;
+	public static String _UI_WARNING_MORE_THAN_ONE_NS_WITH_PREFIX;
+	public static String _UI_WARNING_SCHEMA_CAN_NOT_BE_LOCATED;
+	public static String _UI_WARNING_LOCATION_HINT_NOT_SPECIFIED;
+	public static String _UI_WARNING_NAMESPACE_NAME_NOT_SPECIFIED;
+	public static String _UI_WARNING_PREFIX_NOT_SPECIFIED;
+	public static String _UI_WARNING_ROOT_ELEMENT_MUST_BE_SPECIFIED;
+	public static String _UI_WARNING_SYSTEM_ID_MUST_BE_SPECIFIED;
+	public static String _UI_INVALID_NAME;
+	public static String _UI_ENTER_REQ_PREFIX_AND_NAMESPACE;
+	public static String _UI_SELECT_REGISTERED_NAMESPACES;
+	public static String _UI_SPECIFY_NEW_NAMESPACE;
+	public static String _UI_SELECT_NAMESPACE_TO_ADD;
+	public static String _UI_ADD_NAMESPACE_DECLARATIONS;
+	public static String _UI_NAMESPACE_DECLARATIONS;
+	public static String _UI_TARGET_NAMESPACE;
+	public static String _ERROR_XML_ATTRIBUTE_ALREADY_EXISTS;
+	public static String error_message_goes_here;
+	public static String SurroundWithNewElementQuickAssistProposal_0;
+	public static String SurroundWithNewElementQuickAssistProposal_1;
+	public static String RenameInFileQuickAssistProposal_0;
+	public static String RenameInFileQuickAssistProposal_1;
+	public static String InsertRequiredAttrsQuickAssistProposal_0;
+	public static String InsertRequiredAttrsQuickAssistProposal_1;
+	public static String EncodingSettings_0;
+	public static String EncodingSettings_1;
+	public static String DragNodeCommand_0;
+	public static String DragNodeCommand_1;
+	public static String CommonEditNamespacesDialog_0;
+	public static String JFaceNodeAdapter_1;
+	public static String QuickFixProcessorXML_0;
+	public static String QuickFixProcessorXML_1;
+	public static String QuickFixProcessorXML_2;
+	public static String QuickFixProcessorXML_3;
+	public static String QuickFixProcessorXML_4;
+	public static String QuickFixProcessorXML_5;
+	public static String QuickFixProcessorXML_6;
+	public static String QuickFixProcessorXML_7;
+	public static String QuickFixProcessorXML_8;
+	public static String QuickFixProcessorXML_9;
+	public static String QuickFixProcessorXML_10;
+	public static String QuickFixProcessorXML_11;
+	public static String QuickFixProcessorXML_12;
+	public static String QuickFixProcessorXML_13;
+	public static String QuickFixProcessorXML_14;
+	public static String QuickFixProcessorXML_15;
+	public static String XMLPropertySourceAdapter_0;
+	public static String WorkbenchDefaultEncodingSettings_0;
+	public static String refreshoutline_0;
+	public static String Creating_files_encoding;
+	public static String End_tag_has_attributes;
+	public static String Attribute__is_missing_a_value;
+	public static String Attribute__has_no_value;
+	public static String Missing_end_tag_;
+	public static String Missing_start_tag_;
+	public static String ReconcileStepForMarkup_0;
+	public static String ReconcileStepForMarkup_1;
+	public static String ReconcileStepForMarkup_2;
+	public static String ReconcileStepForMarkup_3;
+	public static String ReconcileStepForMarkup_4;
+	public static String ReconcileStepForMarkup_5;
+	public static String ReconcileStepForMarkup_6;
+	public static String End_with_;
+	public static String SEVERE_internal_error_occu_UI_;
+	public static String No_known_attribute__UI_;
+	public static String Content_Assist_not_availab_UI_;
+	public static String Element__is_unknown;
+	public static String Comment__;
+	public static String Close_with__;
+	public static String End_with__;
+	public static String Close_with___;
+	public static String Close_with____;
+	public static String _Has_no_available_child;
+	public static String No_known_child_tag;
+	public static String __Has_no_known_child;
+	public static String No_known_child_tag_names;
+	public static String The_document_element__;
+	public static String No_definition_for_in;
+	public static String No_definition_for;
+	public static String No_content_model_for;
+	public static String No_content_model_found_UI_;
+	public static String Cleanup_UI_;
+	public static String Compress_empty_element_tags_UI_;
+	public static String Insert_required_attributes_UI_;
+	public static String Insert_missing_tags_UI_;
+	public static String Quote_attribute_values_UI_;
+	public static String Format_source_UI_;
+	public static String Convert_EOL_codes_UI_;
+	public static String Insert_XML_decl;
+	public static String EOL_Windows_UI;
+	public static String EOL_Unix_UI;
+	public static String EOL_Mac_UI;
+	public static String Creating_files;
+	public static String Encoding_desc;
+	public static String Encoding;
+	public static String Creating_or_saving_files;
+	public static String End_of_line_code_desc;
+	public static String End_of_line_code;
+	public static String EOL_Windows;
+	public static String EOL_Unix;
+	public static String EOL_Mac;
+	public static String EOL_NoTranslation;
+	public static String XMLFilesPreferencePage_ExtensionLabel;
+	public static String XMLFilesPreferencePage_ExtensionError;
+	public static String XMLContentAssistPreferencePage_Auto_Activation_UI_;
+	public static String XMLContentAssistPreferencePage_Cycling_UI_;
+	public static String Automatically_make_suggest_UI_;
+	public static String Prompt_when_these_characte_UI_;
+	public static String Formatting_UI_;
+	public static String Line_width__UI_;
+	public static String Split_multiple_attributes;
+	public static String Align_final_bracket;
+	public static String Preserve_PCDATA_Content;
+	public static String Space_before_empty_close_tag;
+	public static String Indent_using_tabs;
+	public static String Indent_using_spaces;
+	public static String Indentation_size;
+	public static String Indentation_size_tip;
+	public static String Clear_all_blank_lines_UI_;
+	public static String Format_comments;
+	public static String Format_comments_join_lines;
+	public static String Grammar_Constraints;
+	public static String Use_inferred_grammar_in_absence_of;
+	public static String Suggestion_Strategy;
+	public static String Suggestion_Strategy_Lax;
+	public static String Suggestion_Strategy_Strict;
+	public static String Element____1;
+	public static String Content_Model____2;
+	public static String Attribute____3;
+	public static String Data_Type____4;
+	public static String Enumerated_Values____5;
+	public static String Default_Value____6;
+	public static String SourceMenu_label;
+	public static String Comment_label; // Resource bundle
+	public static String Comment_tooltip; // Resource bundle
+	public static String Comment_description; // Resource bundle
+	public static String Uncomment_label; // Resource bundle
+	public static String Uncomment_tooltip; // Resource bundle
+	public static String Uncomment_description; // Resource bundle
+	public static String ToggleComment_label; // Resource bundle
+	public static String ToggleComment_tooltip; // Resource bundle
+	public static String ToggleComment_description; // Resource bundle
+	public static String AddBlockComment_label; // Resource bundle
+	public static String AddBlockComment_tooltip; // Resource bundle
+	public static String AddBlockComment_description; // Resource bundle
+	public static String RemoveBlockComment_label; // Resource bundle
+	public static String RemoveBlockComment_tooltip; // Resource bundle
+	public static String RemoveBlockComment_description; // Resource bundle
+	public static String CleanupDocument_label; // Resource bundle
+	public static String CleanupDocument_tooltip; // Resource bundle
+	public static String CleanupDocument_description; // Resource bundle
+	public static String FindOccurrences_label; // Resource bundle
+	public static String OpenFileFromSource_label; // Resource bundle
+	public static String OpenFileFromSource_tooltip; // Resource bundle
+	public static String OpenFileFromSource_description; // Resource bundle
+	public static String XMLContentOutlineConfiguration_0;
+	public static String XMLTyping_Auto_Complete;
+	public static String XMLTyping_Auto_Remove;
+	public static String XMLTyping_Complete_Comments;
+	public static String XMLTyping_Close_Strings;
+	public static String XMLTyping_Close_Brackets;
+	public static String XMLTyping_Complete_End_Tags;
+	public static String XMLTyping_Complete_Elements;
+	public static String XMLTyping_Remove_End_Tags;
+	public static String XMLTyping_Start_Tag;
+	public static String XMLTyping_End_Tag;
+	public static String StructureSelectEnclosing_label;
+	public static String StructureSelectEnclosing_tooltip;
+	public static String StructureSelectEnclosing_description;
+	public static String StructureSelectNext_label;
+	public static String StructureSelectNext_tooltip;
+	public static String StructureSelectNext_description;
+	public static String StructureSelectPrevious_label;
+	public static String StructureSelectPrevious_tooltip;
+	public static String StructureSelectPrevious_description;
+	public static String MESSAGE_XML_VALIDATION_MESSAGE_UI_;
+	public static String Indicate_no_grammar_specified;
+	public static String Indicate_no_grammar_specified_severities_error;
+	public static String Indicate_no_grammar_specified_severities_warning;
+	public static String Indicate_no_grammar_specified_severities_ignore;
+	public static String Validating_files;
+	public static String SyntaxColoringPage_0;
+	public static String SyntaxColoringPage_2;
+	public static String SyntaxColoringPage_3;
+	public static String SyntaxColoringPage_4;
+	public static String SyntaxColoringPage_5;
+	public static String SyntaxColoringPage_6;
+	public static String EmptyFilePreferencePage_0;
+	public static String _UI_STRUCTURED_TEXT_EDITOR_PREFS_LINK;
+	public static String gotoMatchingTag_label;
+	public static String gotoMatchingTag_description;
+	public static String gotoMatchingTag_start;
+	public static String gotoMatchingTag_end;
+	public static String nextSibling_label;
+	public static String nextSibling_description;
+	public static String previousSibling_label;
+	public static String previousSibling_description;
+	public static String Use_XInclude;
+    public static String Honour_all_schema_locations;   
+	public static String Open;
+	public static String _UI_BUTTON_SORT;
+	public static String MarkupValidation_files_label;
+	public static String MarkupValidation_files;
+	public static String Severity_error;
+	public static String Severity_warning;
+	public static String Severity_ignore;
+	public static String Empty_element_tag;
+	public static String End_tag_with_attributes;
+	public static String Invalid_whitespace_before_tagname;
+	public static String Missing_closing_bracket;
+	public static String Missing_closing_quote;
+	public static String Missing_end_tag;
+	public static String Missing_start_tag;
+	public static String Missing_quotes;
+	public static String Namespace_in_pi_target;
+	public static String Tag_name_missing;
+	public static String Whitespace_at_start;
+
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, XMLUIMessages.class);
+	}
+
+	private XMLUIMessages() {
+		// cannot create new instance
+	}
+
+	public static ResourceBundle getResourceBundle() {
+		try {
+			if (fResourceBundle == null) {
+				fResourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
+			}
+		}
+		catch (MissingResourceException x) {
+			fResourceBundle = null;
+		}
+		return fResourceBundle;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIPlugin.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIPlugin.java
new file mode 100644
index 0000000..fe8f171
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIPlugin.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal;
+
+import java.io.IOException;
+
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry;
+import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistry;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryRegistryImpl;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+import org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeIdsXML;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class XMLUIPlugin extends AbstractUIPlugin {
+	public final static String ID = "org.eclipse.wst.xml.ui"; //$NON-NLS-1$
+
+	protected static XMLUIPlugin instance = null;
+
+	public static XMLUIPlugin getDefault() {
+		return instance;
+	}
+
+	public synchronized static XMLUIPlugin getInstance() {
+		return instance;
+	}
+
+	/**
+	 * The template context type registry for the xml editor.
+	 */
+	private ContextTypeRegistry fContextTypeRegistry;
+
+	/**
+	 * The template store for the xml editor.
+	 * 
+	 */
+	private TemplateStore fTemplateStore;
+
+	public XMLUIPlugin() {
+		super();
+		instance = this;
+	}
+
+	public AdapterFactoryRegistry getAdapterFactoryRegistry() {
+		return AdapterFactoryRegistryImpl.getInstance();
+
+	}
+
+	/**
+	 * Returns the template store for the xml editor templates.
+	 * 
+	 * @return the template store for the xml editor templates
+	 */
+	public TemplateStore getTemplateStore() {
+		if (fTemplateStore == null) {
+			fTemplateStore = new ContributionTemplateStore(getTemplateContextRegistry(), getPreferenceStore(), XMLUIPreferenceNames.TEMPLATES_KEY);
+
+			try {
+				fTemplateStore.load();
+			}
+			catch (IOException e) {
+				Logger.logException(e);
+			}
+		}
+		return fTemplateStore;
+	}
+
+	/**
+	 * Returns the template context type registry for the xml plugin.
+	 * 
+	 * @return the template context type registry for the xml plugin
+	 */
+	public ContextTypeRegistry getTemplateContextRegistry() {
+		if (fContextTypeRegistry == null) {
+			ContributionContextTypeRegistry registry = new ContributionContextTypeRegistry();
+			registry.addContextType(TemplateContextTypeIdsXML.ALL);
+			registry.addContextType(TemplateContextTypeIdsXML.NEW);
+			registry.addContextType(TemplateContextTypeIdsXML.TAG);
+			registry.addContextType(TemplateContextTypeIdsXML.ATTRIBUTE);
+			registry.addContextType(TemplateContextTypeIdsXML.ATTRIBUTE_VALUE);
+
+			fContextTypeRegistry = registry;
+		}
+
+		return fContextTypeRegistry;
+	}
+
+	/**
+	 * Get an image from the registry.
+	 * 
+	 * *This method is used by the referencingfile dialog and should be
+	 * removed when the dialog is moved to anothercomponent.
+	 * 
+	 * @param imageName
+	 *            The name of the image.
+	 * @return The image registered for the given name.
+	 */
+	public Image getImage(String imageName) {
+		return getWorkbench().getSharedImages().getImage(imageName);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIPluginResources.properties b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIPluginResources.properties
new file mode 100644
index 0000000..7c1f7c3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/XMLUIPluginResources.properties
@@ -0,0 +1,370 @@
+###############################################################################
+# Copyright (c) 2001, 2010 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Jens Lukowski/Innoopract - initial renaming/restructuring
+#     Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference
+#     David Carver - STAR - [205989] - [validation] validate XML after XInclude resolution
+###############################################################################
+## The following line is a sample XML document.  Please translate only the following parts:
+## begin color definitions
+## Normal text content.
+Sample_XML_doc=<?xml version=\"1.0\"?>\n<?customProcessingInstruction\n\tXML processor specific\n\tcontent ?>\n<!DOCTYPE colors\n\tPUBLIC \"//IBM/XML/COLORS/\" \"colors.dtd\">\n<colors>\n\t<!-- begin color definitions -->\n\t<color name=\"plaintext\" foreground=\"#000000\"\n\t\tbackground=\"#D4D0C8\" />\n\t<color name=\"bold\" foreground=\"#000000\"\n\t\tbackground=\"#B3ACA0\" />\n\t<![CDATA[<123456789>]]>\n\tNormal text content.\n\t===&gt;look at me!&lt;===\n\t<color name=\"inverse\" foreground=\"#F0F0F0\"\n\t\tbackground=\"#D4D0C8\" />\n\n</colors>\n
+Comment_Delimiters_UI_=Comment Delimiters
+Comment_Content_UI_=Comment Content
+Tag_Delimiters_UI_=Tag Delimiters
+Tag_Names_UI_=Tag Names
+Attribute_Names_UI_=Attribute Names
+Attribute_Equals_UI_=Attribute Equal Signs
+Attribute_Values_UI_=Attribute Values
+Declaration_Delimiters_UI_=Declaration Delimiters
+Content_UI_=Content
+Entity_Reference_UI_=Entity References
+## on the following 2 lines, do not translate CDATA
+CDATA_Delimiters_UI_=CDATA Delimiters
+CDATA_Content_UI_=CDATA Content
+Processing_Instruction_Del_UI_=Processing Instruction Delimiters
+Processing_Instruction_Con_UI__UI_=Processing Instruction Content
+## on the following line solely translate:  Name
+DOCTYPE_Name_UI_=DOCTYPE Name
+## on the following line solely translate:  Keyword
+DOCTYPE_SYSTEM_PUBLIC_Keyw_UI_=DOCTYPE SYSTEM/PUBLIC Keyword
+## on the following line solely translate:  Public Reference
+DOCTYPE_Public_Reference_UI_=DOCTYPE Public Reference
+## on the following line solely translate:  System Reference
+DOCTYPE_System_Reference_UI_=DOCTYPE System Reference
+# XML Common UI
+# Constants for strings
+
+DELETE=Remove
+ADD_PROCESSING_INSTRUCTION=Add Processing Instruction
+
+_UI_MENU_ADD_AFTER=Add &After
+_UI_MENU_ADD_ATTRIBUTE=Add A&ttribute
+_UI_MENU_ADD_BEFORE=Add &Before
+_UI_MENU_ADD_CHILD=Add &Child
+_UI_MENU_REMOVE=Re&move
+_UI_MENU_REPLACE_WITH=Re&place With
+_UI_MENU_EDIT_DOCTYPE=Edit DOCTYPE...
+_UI_LABEL_UNDO_REPLACE_DESCRIPTION=Replace
+_UI_LABEL_EDIT_DOCTYPE=Edit DOCTYPE
+_UI_INFO_EXPAND_ALL=Expand All
+_UI_INFO_COLLAPSE_ALL=Collapse All
+
+_UI_MENU_ADD_DTD_INFORMATION=Add DTD Information...
+_UI_MENU_ADD_SCHEMA_INFORMATION=Add Schema Information...
+_UI_MENU_EDIT_PROCESSING_INSTRUCTION=Edit Process&ing Instruction...
+_UI_MENU_EDIT_NAMESPACES=Edit &Namespaces...
+
+_UI_MENU_ADD_DTD_INFORMATION_TITLE=Add DTD Information
+_UI_MENU_EDIT_PROCESSING_INSTRUCTION_TITLE=Edit Processing Instruction
+_UI_MENU_EDIT_SCHEMA_INFORMATION_TITLE=Edit Schema Information
+
+_UI_MENU_NEW_ATTRIBUTE=&New Attribute...
+_UI_MENU_NEW_ATTRIBUTE_TITLE=New Attribute
+_UI_MENU_EDIT_ATTRIBUTE=Edit Attribute...
+_UI_MENU_EDIT_ATTRIBUTE_TITLE=Edit Attribute
+_UI_MENU_NEW_ELEMENT=New &Element...
+_UI_MENU_NEW_ELEMENT_TITLE=New Element
+_UI_MENU_RENAME=R&ename
+_UI_MENU_RENAME_TITLE=Rename
+_UI_LABEL_ELEMENT_NAME=Element name:
+
+_UI_MENU_ADD_COMMENT=Add Comment
+_UI_MENU_ADD_PROCESSING_INSTRUCTION=Add Processing Instruction
+_UI_MENU_ADD_CDATA_SECTION=Add CDATA Section
+_UI_MENU_ADD_PCDATA=Add #PCDATA;
+
+_UI_MENU_COMMENT=C&omment
+_UI_MENU_PROCESSING_INSTRUCTION=P&rocessing Instruction
+_UI_MENU_CDATA_SECTION=CDATA Section
+_UI_MENU_PCDATA=#PC&DATA;
+
+_UI_MENU_ADD=Add
+
+_UI_COMMENT_VALUE=comment
+_UI_PI_TARGET_VALUE=target
+_UI_PI_DATA_VALUE=data
+_UI_LABEL_ROOT_ELEMENT_VALUE=RootElement
+
+_UI_LABEL_TARGET_COLON=Target:
+_UI_LABEL_DATA_COLON=Data:
+_UI_LABEL_ROOT_ELEMENT_NAME_COLON=Root element name:
+_UI_LABEL_PUBLIC_ID_COLON=Public ID:
+_UI_LABEL_SYSTEM_ID_COLON=System ID:
+_UI_LABEL_BROWSE=Browse...
+_UI_LABEL_SELECT_XML_CATALOG_ENTRY=Select XML Catalog Entry
+_UI_LABEL_SPECIFY_SYSTEM_ID=Specify System ID
+_UI_LABEL_SELECT_FILE=Select File
+
+_UI_LABEL_KEY=Key
+_UI_LABEL_URI=URI:
+_UI_LABEL_XML_CATALOG_COLON=XML Catalog
+_UI_LABEL_NAMESPACE_NAME=Namespace Name
+_UI_LABEL_LOCATION_HINT=Location Hint
+_UI_LABEL_PREFIX=Prefix
+_UI_LABEL_NAMESPACE_NAME_COLON=Namespace Name:
+_UI_LABEL_LOCATION_HINT_COLON=Location Hint:
+_UI_LABEL_PREFIX_COLON=Prefix:
+_UI_NO_NAMESPACE_NAME=<no namespace name>
+_UI_NO_PREFIX=<no prefix>
+
+_UI_LABEL_XML_SCHEMA_INFORMATION=XML Schema Information
+
+_UI_LABEL_NAME_COLON=Name:
+_UI_LABEL_VALUE_COLON=Value:
+
+_UI_BUTTON_DELETE=Delete
+_UI_BUTTON_NEW=New...
+_UI_BUTTON_EDIT=Edit...
+
+_UI_LABEL_NEW_NAMESPACE_INFORMATION=New Namespace Information
+
+# SelectFileOrXMLCatalogIdPanel.java
+
+_UI_RADIO_BUTTON_SELECT_FROM_WORKSPACE=Select file from Workspace
+_UI_RADIO_BUTTON_SELECT_FROM_CATALOG=Select XML Catalog entry
+
+_UI_WARNING_MORE_THAN_ONE_NS_WITH_NAME=More than one namespace has been specified with the namespace name :
+_UI_WARNING_MORE_THAN_ONE_NS_WITHOUT_NAME=More than one schema has been specified without a namespace name
+_UI_WARNING_MORE_THAN_ONE_NS_WITHOUT_PREFIX=More than one namespace has been specificed without a prefix
+_UI_WARNING_MORE_THAN_ONE_NS_WITH_PREFIX=More than one namespace has been specified with the prefix :
+_UI_WARNING_SCHEMA_CAN_NOT_BE_LOCATED=The specified schema can not be located :
+_UI_WARNING_LOCATION_HINT_NOT_SPECIFIED=A location hint has not been specified for the namespace with name
+_UI_WARNING_NAMESPACE_NAME_NOT_SPECIFIED=A name must be specified for the namespace with prefix :
+_UI_WARNING_PREFIX_NOT_SPECIFIED=A prefix must be specified for the namespace named :
+_UI_WARNING_ROOT_ELEMENT_MUST_BE_SPECIFIED=A root element name must be specified.
+_UI_WARNING_SYSTEM_ID_MUST_BE_SPECIFIED=A system ID must be specified.
+
+_UI_INVALID_NAME=Invalid name
+
+# String used for editing namespaces (org.eclipse.wst.xml.ui.nsedit)
+_UI_ENTER_REQ_PREFIX_AND_NAMESPACE=Enter the required prefix and namespace URI for the namespace declaration.
+_UI_SELECT_REGISTERED_NAMESPACES=Select From Registered Namespaces
+_UI_SPECIFY_NEW_NAMESPACE=Specify New Namespace
+_UI_SELECT_NAMESPACE_TO_ADD=Select the namespace declarations to add.
+_UI_ADD_NAMESPACE_DECLARATIONS=Add Namespace Declarations
+_UI_NAMESPACE_DECLARATIONS=Namespace Declarations
+_UI_TARGET_NAMESPACE=Target Namespace
+
+_ERROR_XML_ATTRIBUTE_ALREADY_EXISTS=The element already has an attribute with this name.
+
+#
+error_message_goes_here=error message goes here
+SurroundWithNewElementQuickAssistProposal_0=Surround with new element
+SurroundWithNewElementQuickAssistProposal_1=Surround with new element
+RenameInFileQuickAssistProposal_0=Link all references for a rename in file (does not change references in other files)
+RenameInFileQuickAssistProposal_1=Rename in file
+InsertRequiredAttrsQuickAssistProposal_0=Insert required attributes
+InsertRequiredAttrsQuickAssistProposal_1=Insert required attributes
+EncodingSettings_0=IANA:
+EncodingSettings_1=Encoding:
+DragNodeCommand_0=Move
+DragNodeCommand_1=Copy
+CommonEditNamespacesDialog_0=Add...
+JFaceNodeAdapter_1=Refresh Property Sheet
+QuickFixProcessorXML_0=Remove empty tag
+QuickFixProcessorXML_1=Change to empty-element tag
+QuickFixProcessorXML_2=Remove this tag
+QuickFixProcessorXML_3=Insert end tag before first child element
+QuickFixProcessorXML_4=Insert end tag at end of element
+QuickFixProcessorXML_5=Remove attributes in end tag
+QuickFixProcessorXML_6=Insert default attribute value
+QuickFixProcessorXML_7=Remove this attribute
+QuickFixProcessorXML_8=Remove spaces before tag name
+QuickFixProcessorXML_9=Remove spaces before processing instruction
+QuickFixProcessorXML_10=Remove namespace in processing instruction
+QuickFixProcessorXML_11=Remove this element
+QuickFixProcessorXML_12=Remove this attribute value
+QuickFixProcessorXML_13=Insert required attribute
+QuickFixProcessorXML_14=Quote attribute value
+QuickFixProcessorXML_15=Insert closing bracket
+XMLPropertySourceAdapter_0=Attributes
+
+WorkbenchDefaultEncodingSettings_0=Use workspace encoding
+refreshoutline_0=Refreshing Outline
+Creating_files_encoding=Creating files encoding preference
+# ReconcileStepForMarkup
+End_tag_has_attributes=End tag has attributes
+Attribute__is_missing_a_value=Attribute \"{0}\" is missing a value
+Attribute__has_no_value=Attribute \"{0}\"  has no value
+Missing_start_tag_=Missing start tag \"{0}\"
+Missing_end_tag_=Missing end tag \"{0}\"
+ReconcileStepForMarkup_0=Missing closing quote
+ReconcileStepForMarkup_1=Missing quotes for attribute value
+ReconcileStepForMarkup_2=A tagname cannot start with a space
+ReconcileStepForMarkup_3=Empty tags are not allowed
+ReconcileStepForMarkup_4=Namespaces are not allowed in a Processing Instruction target
+ReconcileStepForMarkup_5=Spaces are not allowed before a Processing Instruction
+ReconcileStepForMarkup_6=Tag missing closing bracket '>'
+# Content Assist
+End_with_=End with {0}>
+SEVERE_internal_error_occu_UI_=SEVERE internal error occurred
+No_known_attribute__UI_=No known attribute
+Content_Assist_not_availab_UI_=Content Assist not available at the current location
+Element__is_unknown=Element <{0}> is unknown.
+Comment__=comment {0}
+Close_with__=Close with {0}
+End_with__=End with \"</{0}>\"
+Close_with___=Close with \"{0}\"
+Close_with____=Close with \"></{0}>\"
+_Has_no_available_child={0} has no available child tags.
+No_known_child_tag=No known child tag names of <{0}> begin with \"{1}\".
+__Has_no_known_child=<{0}> has no known child tags.
+No_known_child_tag_names=No known child tag names of <{0}> begin with \"{1}\"
+The_document_element__=The document element <{0}> is already present.
+No_definition_for_in=No definition was found for element <{0}> in {1}
+No_definition_for=No definition was found for element <{0}>
+No_content_model_for=No content model found for {0}.
+No_content_model_found_UI_=No content model found
+## The following strings are for the XML Cleanup dialog
+Cleanup_UI_=Cleanup
+Compress_empty_element_tags_UI_=&Compress empty element tags
+Insert_required_attributes_UI_=Insert &required attributes
+Insert_missing_tags_UI_=&Insert missing tags
+Quote_attribute_values_UI_=&Quote attribute values
+Format_source_UI_=&Format source
+Convert_EOL_codes_UI_=Convert line &delimiters to
+Insert_XML_decl=Fix XML declaration
+EOL_Windows_UI=&Windows
+EOL_Unix_UI=U&NIX
+EOL_Mac_UI=&Mac
+## XML Files preference page
+Creating_files=Creating files
+Encoding_desc=The following encoding will apply:
+Encoding=En&coding:
+Creating_or_saving_files=Creating or saving files
+End_of_line_code_desc=The following line delimiter will apply:
+End_of_line_code=&Line delimiter:
+EOL_Windows=Windows
+EOL_Unix=UNIX
+EOL_Mac=Mac
+EOL_NoTranslation=No translation
+Validating_files=Validating files
+Indicate_no_grammar_specified=Indicate when no &grammar is specified:
+Indicate_no_grammar_specified_severities_error=Error
+Indicate_no_grammar_specified_severities_warning=Warning
+Indicate_no_grammar_specified_severities_ignore=Ignore
+XMLFilesPreferencePage_ExtensionLabel=Add this suffix (if not specified):
+XMLFilesPreferencePage_ExtensionError=Suffix must be one of the following {0}.
+## XML Source preference page
+XMLContentAssistPreferencePage_Auto_Activation_UI_=Auto Activation
+XMLContentAssistPreferencePage_Cycling_UI_=Cycling
+Automatically_make_suggest_UI_=Automatically ma&ke suggestions
+Prompt_when_these_characte_UI_=P&rompt when these characters are inserted:
+Formatting_UI_=Formatting
+Line_width__UI_=Line &width:
+Split_multiple_attributes=Split &multiple attributes each on a new line
+Align_final_bracket=&Align final bracket in multi-line element tags
+Preserve_PCDATA_Content=&Preserve whitespace in tags with PCDATA content
+Space_before_empty_close_tag=Ins&ert whitespace before closing empty end-tags
+Indent_using_tabs=&Indent using tabs
+Indent_using_spaces=I&ndent using spaces
+Indentation_size=In&dentation size:
+Indentation_size_tip=Indentation size
+Clear_all_blank_lines_UI_=Clear all &blank lines
+Format_comments=&Format comments
+Format_comments_join_lines=&Join lines
+Grammar_Constraints=Grammar Constraints
+Use_inferred_grammar_in_absence_of=&Use inferred grammar in absence of DTD/Schema
+Suggestion_Strategy=&Suggestion strategy:
+Suggestion_Strategy_Lax=Lax
+Suggestion_Strategy_Strict=Strict
+## tag info
+Element____1=Element :
+Content_Model____2=Content Model :
+Attribute____3=Attribute :
+Data_Type____4=Data Type :
+Enumerated_Values____5=Enumerated Values :
+Default_Value____6=Default Value :
+## copied from sse.ui
+SourceMenu_label=&Source
+Comment_label=Co&mment
+Comment_tooltip=Comment
+Comment_description=Comment
+Uncomment_label=&Uncomment
+Uncomment_tooltip=Uncomment
+Uncomment_description=Uncomment
+ToggleComment_label=Toggle Comment
+ToggleComment_tooltip=Toggle Comment
+ToggleComment_description=Toggle Comment
+AddBlockComment_label=Add Block Comment
+AddBlockComment_tooltip=Add Block Comment
+AddBlockComment_description=Add Block Comment
+RemoveBlockComment_label=Remove Block Comment
+RemoveBlockComment_tooltip=Remove Block Comment
+RemoveBlockComment_description=Remove Block Comment
+CleanupDocument_label=Cleanup Document...
+CleanupDocument_tooltip=Cleanup Document
+CleanupDocument_description=Cleanup Document
+FindOccurrences_label=Occurrences in File
+OpenFileFromSource_label=Op&en Selection
+OpenFileFromSource_tooltip=Open an editor on the selected link
+OpenFileFromSource_description=Open an editor on the selected link
+XMLContentOutlineConfiguration_0=Show Attributes
+XMLTyping_Auto_Complete=Automatically close
+XMLTyping_Auto_Remove=Automatically remove
+XMLTyping_Complete_Comments=&Comments
+XMLTyping_Close_Strings=A&ttribute values
+XMLTyping_Close_Brackets=(Parentheses) and [square] brac&kets
+XMLTyping_Complete_End_Tags=&Automatically close the tag
+XMLTyping_Complete_Elements=&Insert a matching end tag
+XMLTyping_Remove_End_Tags=E&nd tags when creating empty self-closing tags
+XMLTyping_Start_Tag=When typing a start tag
+XMLTyping_End_Tag=When typing an end tag
+StructureSelectEnclosing_label=Enclosing Element
+StructureSelectEnclosing_tooltip=Expand selection to include enclosing element
+StructureSelectEnclosing_description=Expand selection to include enclosing element
+StructureSelectNext_label=Next Element
+StructureSelectNext_tooltip=Expand selection to include next sibling
+StructureSelectNext_description=Expand selection to include next sibling
+StructureSelectPrevious_label=Previous Element
+StructureSelectPrevious_tooltip=Expand selection to include previous sibling
+StructureSelectPrevious_description=Expand selection to include previous sibling
+MESSAGE_XML_VALIDATION_MESSAGE_UI_=XML Validator validating {0}
+SyntaxColoringPage_0=Syntax Element:
+SyntaxColoringPage_2=Enable
+SyntaxColoringPage_3=&Bold
+SyntaxColoringPage_4=&Italic
+SyntaxColoringPage_5=&Strikethrough
+SyntaxColoringPage_6=&Underline
+EmptyFilePreferencePage_0=Expand the tree to edit preferences for a specific feature.
+_UI_STRUCTURED_TEXT_EDITOR_PREFS_LINK=XML editing preferences.  Note that some preferences may be set on the <a>{0}</a> preference page.
+Use_XInclude=Process XML &Inclusions
+Honour_all_schema_locations=&Honour all XML schema locations
+nextSibling_label=Next Sibling
+nextSibling_description=Go to Next Sibling
+previousSibling_label=Previous Sibling
+previousSibling_description=Go to Previous Sibling
+gotoMatchingTag_label=Matching Tag
+gotoMatchingTag_description=Go To Matching Tag
+gotoMatchingTag_start=Start tag of element <{0}>
+gotoMatchingTag_end=End tag of element <{0}>
+Open=Open ''{0}''
+_UI_BUTTON_SORT=Sort
+Validating_files=Validating files
+Indicate_no_grammar_specified=Indicate when no &grammar is specified:
+Indicate_no_grammar_specified_severities_error=Error
+Indicate_no_grammar_specified_severities_warning=Warning
+Indicate_no_grammar_specified_severities_ignore=Ignore
+MarkupValidation_files_label=Errors/Warnings
+MarkupValidation_files=&Enable markup validation
+Severity_error=Error
+Severity_warning=Warning
+Severity_ignore=Ignore
+Empty_element_tag=Invalid e&mpty element tag:
+End_tag_with_attributes=Invalid end &tag with attributes:
+Invalid_whitespace_before_tagname=Invalid &white space before tag name:
+Missing_closing_bracket=Missing &closing bracket:
+Missing_closing_quote=Missing closing &quote:
+Missing_end_tag=Missing e&nd tag:
+Missing_start_tag=Missing &start tag:
+Missing_quotes=Missing q&uotes:
+Namespace_in_pi_target=In&valid name space in PI:
+Tag_name_missing=Missing tag n&ame:
+Whitespace_at_start=Inva&lid white space at start:
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AbstractCommentActionXMLDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AbstractCommentActionXMLDelegate.java
new file mode 100644
index 0000000..e00b29d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AbstractCommentActionXMLDelegate.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.xml.ui.internal.Logger;
+
+/**
+ * Abstract comment action delegate for XML editors
+ */
+abstract public class AbstractCommentActionXMLDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate {
+	static final String CLOSE_COMMENT = "-->"; //$NON-NLS-1$
+	static final String OPEN_COMMENT = "<!--"; //$NON-NLS-1$
+
+	IEditorPart fEditor;
+
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		fEditor = targetEditor;
+	}
+
+	public void dispose() {
+		// nulling out just in case
+		fEditor = null;
+	}
+
+	public void runWithEvent(IAction action, Event event) {
+		run(action);
+	}
+
+	public void run(IAction action) {
+		if (fEditor instanceof ITextEditor) {
+			ITextEditor textEditor = (ITextEditor) fEditor;
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null) {
+				// get current text selection
+				ITextSelection textSelection = getCurrentSelection();
+				if (textSelection.isEmpty()) {
+					return;
+				}
+
+				processAction(document, textSelection);
+			}
+		}
+	}
+
+	public void init(IViewPart view) {
+		// do nothing
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		// do nothing
+	}
+
+	private ITextSelection getCurrentSelection() {
+		if (fEditor instanceof ITextEditor) {
+			ISelectionProvider provider = ((ITextEditor) fEditor).getSelectionProvider();
+			if (provider != null) {
+				ISelection selection = provider.getSelection();
+				if (selection instanceof ITextSelection) {
+					return (ITextSelection) selection;
+				}
+			}
+		}
+		return TextSelection.emptySelection();
+	}
+
+	abstract void processAction(IDocument document, ITextSelection textSelection);
+
+	void removeOpenCloseComments(IDocument document, int offset, int length) {
+		try {
+			int adjusted_length = length;
+
+			// remove open comments
+			String string = document.get(offset, length);
+			int index = string.lastIndexOf(OPEN_COMMENT);
+			while (index != -1) {
+				document.replace(offset + index, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+				index = string.lastIndexOf(OPEN_COMMENT, index - 1);
+				adjusted_length -= OPEN_COMMENT.length();
+			}
+
+			// remove close comments
+			string = document.get(offset, adjusted_length);
+			index = string.lastIndexOf(CLOSE_COMMENT);
+			while (index != -1) {
+				document.replace(offset + index, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+				index = string.lastIndexOf(CLOSE_COMMENT, index - 1);
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AbstractNodeActionManager.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AbstractNodeActionManager.java
new file mode 100644
index 0000000..be7e202
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AbstractNodeActionManager.java
@@ -0,0 +1,690 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDescriptionBuilder;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMContentBuilder;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMContentBuilderImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.CMImageUtil;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
+
+public abstract class AbstractNodeActionManager extends BaseNodeActionManager {
+
+
+	/**
+	 * AddNodeAction
+	 */
+	public class AddNodeAction extends NodeAction {
+		protected CMNode cmnode;
+		protected String description;
+		protected int index;
+		protected int nodeType;
+		protected Node parent;
+		protected String undoDescription;
+
+
+		public AddNodeAction(CMNode cmnode, Node parent, int index) {
+			this.cmnode = cmnode;
+			this.parent = parent;
+			this.index = index;
+
+			String text = getLabel(parent, cmnode);
+			setText(text);
+			description = text;
+			undoDescription = XMLUIMessages._UI_MENU_ADD + " " + text; //$NON-NLS-1$ 
+			ImageDescriptor descriptor = CMImageUtil.getImageDescriptor(cmnode);
+			if (descriptor == null) {
+				descriptor = imageDescriptorCache.getImageDescriptor(cmnode);
+			}
+			setImageDescriptor(descriptor);
+		}
+
+
+		public AddNodeAction(int nodeType, Node parent, int index) {
+			this.nodeType = nodeType;
+			this.index = index;
+			this.parent = parent;
+
+			switch (nodeType) {
+				case Node.COMMENT_NODE : {
+					description = XMLUIMessages._UI_MENU_COMMENT;
+					undoDescription = XMLUIMessages._UI_MENU_ADD_COMMENT;
+					break;
+				}
+				case Node.PROCESSING_INSTRUCTION_NODE : {
+					description = XMLUIMessages._UI_MENU_PROCESSING_INSTRUCTION;
+					undoDescription = XMLUIMessages._UI_MENU_ADD_PROCESSING_INSTRUCTION;
+					break;
+				}
+				case Node.CDATA_SECTION_NODE : {
+					description = XMLUIMessages._UI_MENU_CDATA_SECTION;
+					undoDescription = XMLUIMessages._UI_MENU_ADD_CDATA_SECTION;
+					break;
+				}
+				case Node.TEXT_NODE : {
+					description = XMLUIMessages._UI_MENU_PCDATA;
+					undoDescription = XMLUIMessages._UI_MENU_ADD_PCDATA;
+					break;
+				}
+			}
+			setText(description);
+			setImageDescriptor(imageDescriptorCache.getImageDescriptor(new Integer(nodeType)));
+		}
+
+
+		protected void addNodeForCMNode() {
+			if (parent != null) {
+				insert(parent, cmnode, index);
+			}
+		}
+
+
+		protected void addNodeForNodeType() {
+			Document document = parent.getNodeType() == Node.DOCUMENT_NODE ? (Document) parent : parent.getOwnerDocument();
+			Node newChildNode = null;
+			boolean format = true;
+			switch (nodeType) {
+				case Node.COMMENT_NODE : {
+					newChildNode = document.createComment(XMLUIMessages._UI_COMMENT_VALUE);
+					break;
+				}
+				case Node.PROCESSING_INSTRUCTION_NODE : {
+					newChildNode = document.createProcessingInstruction(XMLUIMessages._UI_PI_TARGET_VALUE, XMLUIMessages._UI_PI_DATA_VALUE);
+					break;
+				}
+				case Node.CDATA_SECTION_NODE : {
+					newChildNode = document.createCDATASection(""); //$NON-NLS-1$
+					break;
+				}
+				case Node.TEXT_NODE : {
+					format = false;
+					newChildNode = document.createTextNode(parent.getNodeName());
+					break;
+				}
+			}
+
+			if (newChildNode != null) {
+				List list = new Vector(1);
+				list.add(newChildNode);
+				insertNodesAtIndex(parent, list, index, format);
+			}
+		}
+
+
+		public String getUndoDescription() {
+			return undoDescription;
+		}
+
+
+		public void run() {
+			if (validateEdit(getModel(), getWorkbenchWindowShell())) {
+				beginNodeAction(this);
+				if (cmnode != null) {
+					addNodeForCMNode();
+				}
+				else {
+					addNodeForNodeType();
+				}
+				endNodeAction(this);
+			}
+		}
+	}
+
+
+	/**
+	 * DeleteAction
+	 */
+	public class DeleteAction extends NodeAction {
+		protected List list;
+
+		public DeleteAction(List list) {
+			setText(XMLUIMessages._UI_MENU_REMOVE);
+			this.list = list;
+		}
+
+		public DeleteAction(Node node) {
+			setText(XMLUIMessages._UI_MENU_REMOVE);
+			list = new Vector();
+			list.add(node);
+		}
+
+		public String getUndoDescription() {
+			return XMLUIMessages.DELETE;
+		}
+
+		public void run() {
+			if (validateEdit(getModel(), getWorkbenchWindowShell())) {
+				beginNodeAction(this);
+	
+				for (Iterator i = list.iterator(); i.hasNext();) {
+					Node node = (Node) i.next();
+					if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+						Attr attr = (Attr) node;
+						attr.getOwnerElement().removeAttributeNode(attr);
+					}
+					else {
+						Node parent = node.getParentNode();
+						if (parent != null) {
+							Node previousSibling = node.getPreviousSibling();
+							if ((previousSibling != null) && isWhitespaceTextNode(previousSibling)) {
+								parent.removeChild(previousSibling);
+							}
+							parent.removeChild(node);
+						}
+					}
+				}
+
+				endNodeAction(this);
+			}
+		}
+	}
+
+
+	class ImageDescriptorCache {
+		protected ImageDescriptor attributeImage = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);
+		protected ImageDescriptor attributeReqImage = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ATT_REQ_OBJ);
+		protected ImageDescriptor cdataSectionImage = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_CDATASECTION);
+		protected ImageDescriptor commentImage = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_COMMENT);
+		protected ImageDescriptor elementImage = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ELEMENT);
+		protected ImageDescriptor piImage = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_PROCESSINGINSTRUCTION);
+		protected ImageDescriptor textImage = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_TXTEXT);
+
+		public ImageDescriptor getImageDescriptor(Object object) {
+			ImageDescriptor result = null;
+			if (object instanceof CMNode) {
+				CMNode cmnode = (CMNode) object;
+				switch (cmnode.getNodeType()) {
+					case CMNode.ATTRIBUTE_DECLARATION : {
+						result = CMImageUtil.getImageDescriptor(cmnode);
+						if (result == null) {
+							if (((CMAttributeDeclaration) cmnode).getUsage() == CMAttributeDeclaration.REQUIRED) {
+								result = attributeReqImage;
+							}
+							else {
+								result = attributeImage;
+							}
+						}
+						break;
+					}
+					case CMNode.DATA_TYPE : {
+						result = textImage;
+						break;
+					}
+					case CMNode.ELEMENT_DECLARATION : {
+						result = CMImageUtil.getImageDescriptor(cmnode);
+						if (result == null) {
+							result = elementImage;
+						}
+						break;
+					}
+					case CMNode.GROUP : {
+						result = elementImage;
+						break;
+					}
+				}
+			}
+			else if (object instanceof Integer) {
+				Integer integer = (Integer) object;
+				switch (integer.intValue()) {
+					case Node.COMMENT_NODE : {
+						result = commentImage;
+						break;
+					}
+					case Node.PROCESSING_INSTRUCTION_NODE : {
+						result = piImage;
+						break;
+					}
+					case Node.CDATA_SECTION_NODE : {
+						result = cdataSectionImage;
+						break;
+					}
+					case Node.TEXT_NODE : {
+						result = textImage;
+						break;
+					}
+				}
+			}
+			return result;
+		}
+	}
+
+	// TODO... remove this class. I'm pretty sure it is no longer used by
+	// anyone.
+	/**
+	 * @depracated
+	 */
+	public class InsertAction extends NodeAction {
+		protected String description;
+		protected int index;
+		protected int nodeType;
+		protected Node parent;
+
+		public InsertAction(int nodeType, Node parent, int index) {
+			this.nodeType = nodeType;
+			this.index = index;
+			this.parent = parent;
+			switch (nodeType) {
+				case Node.COMMENT_NODE : {
+					description = XMLUIMessages._UI_MENU_COMMENT;
+					break;
+				}
+				case Node.PROCESSING_INSTRUCTION_NODE : {
+					description = XMLUIMessages._UI_MENU_PROCESSING_INSTRUCTION;
+					break;
+				}
+				case Node.CDATA_SECTION_NODE : {
+					description = XMLUIMessages._UI_MENU_CDATA_SECTION;
+					break;
+				}
+				case Node.TEXT_NODE : {
+					description = XMLUIMessages._UI_MENU_PCDATA;
+					break;
+				}
+			}
+			setText(description);
+			setImageDescriptor(imageDescriptorCache.getImageDescriptor(new Integer(nodeType)));
+		}
+
+		public InsertAction(int nodeType, Node parent, int index, String title) {
+			this.nodeType = nodeType;
+			this.index = index;
+			this.parent = parent;
+			description = title;
+			setText(description);
+			setImageDescriptor(imageDescriptorCache.getImageDescriptor(new Integer(nodeType)));
+		}
+
+		public String getUndoDescription() {
+			return XMLUIMessages._UI_MENU_ADD + " " + description; //$NON-NLS-1$ 
+		}
+
+		public void run() {
+			if (validateEdit(getModel(), getWorkbenchWindowShell())) {
+				beginNodeAction(this);
+	
+				Document document = parent.getNodeType() == Node.DOCUMENT_NODE ? (Document) parent : parent.getOwnerDocument();
+				Node newChildNode = null;
+				boolean format = true;
+				switch (nodeType) {
+					case Node.COMMENT_NODE : {
+						newChildNode = document.createComment(XMLUIMessages._UI_COMMENT_VALUE);
+						break;
+					}
+					case Node.PROCESSING_INSTRUCTION_NODE : {
+						newChildNode = document.createProcessingInstruction(XMLUIMessages._UI_PI_TARGET_VALUE, XMLUIMessages._UI_PI_DATA_VALUE);
+						break;
+					}
+					case Node.CDATA_SECTION_NODE : {
+						newChildNode = document.createCDATASection(""); //$NON-NLS-1$
+						break;
+					}
+					case Node.TEXT_NODE : {
+						format = false;
+						newChildNode = document.createTextNode(parent.getNodeName());
+						break;
+					}
+				}
+	
+				if (newChildNode != null) {
+					List list = new Vector(1);
+					list.add(newChildNode);
+					insertNodesAtIndex(parent, list, index, format);
+				}
+	
+				endNodeAction(this);
+			}
+		}
+	}
+
+
+	/**
+	 * ReplaceNodeAction
+	 */
+	public class ReplaceNodeAction extends NodeAction {
+		protected CMNode cmnode;
+		protected String description;
+		protected int endIndex;
+		protected Node parent;
+		protected int startIndex;
+
+
+		public ReplaceNodeAction(Node parent, CMNode cmnode, int startIndex, int endIndex) {
+			this.parent = parent;
+			this.cmnode = cmnode;
+			this.startIndex = startIndex;
+			this.endIndex = endIndex;
+
+			setText(getLabel(parent, cmnode));
+			setImageDescriptor(imageDescriptorCache.getImageDescriptor(cmnode));
+		}
+
+		public String getUndoDescription() {
+			String result = XMLUIMessages._UI_LABEL_UNDO_REPLACE_DESCRIPTION;
+			result += " " + getLabel(parent, cmnode); //$NON-NLS-1$
+			return result;
+		}
+
+		public void run() {
+			if (validateEdit(getModel(), getWorkbenchWindowShell())) {
+				beginNodeAction(this);
+	
+				if ((parent != null) && (cmnode != null)) {
+					remove(parent, startIndex, endIndex);
+					insert(parent, cmnode, startIndex);
+				}
+				endNodeAction(this);
+			}
+		}
+	}
+
+	protected ImageDescriptorCache imageDescriptorCache = new ImageDescriptorCache();
+	protected Viewer fViewer;
+
+	public AbstractNodeActionManager(IStructuredModel model, ModelQuery modelQuery, Viewer viewer) {
+		super(model, modelQuery);
+		this.fViewer = viewer;
+	}
+
+
+	public void beginNodeAction(NodeAction action) {
+		fModel.beginRecording(action, action.getUndoDescription());
+	}
+
+
+	protected Action createAddAttributeAction(Element parent, CMAttributeDeclaration ad) {
+		Action action = null;
+		if (ad == null) {
+			action = new EditAttributeAction(this, parent, null, XMLUIMessages._UI_MENU_NEW_ATTRIBUTE, XMLUIMessages._UI_MENU_NEW_ATTRIBUTE_TITLE);
+		}
+		else {
+			action = new AddNodeAction(ad, parent, -1);
+		}
+		return action;
+	}
+
+
+	protected Action createAddCDataSectionAction(Node parent, int index) {
+		return new AddNodeAction(Node.CDATA_SECTION_NODE, parent, index);
+	}
+
+
+	protected Action createAddCommentAction(Node parent, int index) {
+		return new AddNodeAction(Node.COMMENT_NODE, parent, index);
+	}
+
+
+	protected Action createAddDoctypeAction(Document document, int index) {
+		return new EditDoctypeAction(fModel, document, fModel.getBaseLocation(), XMLUIMessages._UI_MENU_ADD_DTD_INFORMATION);
+	}
+
+
+	protected Action createAddElementAction(Node parent, CMElementDeclaration ed, int index) {
+		Action action = null;
+		if (ed == null) {
+			action = new EditElementAction(this, parent, index, XMLUIMessages._UI_MENU_NEW_ELEMENT, XMLUIMessages._UI_MENU_NEW_ELEMENT_TITLE);
+		}
+		else {
+			action = new AddNodeAction(ed, parent, index);
+		}
+		return action;
+	}
+
+
+	protected Action createAddPCDataAction(Node parent, CMDataType dataType, int index) {
+		Action action = null;
+		if (dataType == null) {
+			action = new AddNodeAction(Node.TEXT_NODE, parent, index);
+		}
+		else {
+			action = new AddNodeAction(dataType, parent, index);
+		}
+		return action;
+	}
+
+
+	protected Action createAddProcessingInstructionAction(Node parent, int index) {
+		Node refChild = getRefChildNodeAtIndex(parent, index);
+		Action action = new EditProcessingInstructionAction(this, parent, refChild, XMLUIMessages._UI_MENU_ADD_PROCESSING_INSTRUCTION, XMLUIMessages.ADD_PROCESSING_INSTRUCTION);
+		action.setImageDescriptor(imageDescriptorCache.getImageDescriptor(new Integer(Node.PROCESSING_INSTRUCTION_NODE)));
+		return action;
+	}
+
+
+	protected Action createAddSchemaInfoAction(Element element) {
+		return new EditSchemaInfoAction(this, element.getOwnerDocument(), fModel.getBaseLocation(), XMLUIMessages._UI_MENU_ADD_SCHEMA_INFORMATION);
+	}
+
+
+	protected Action createDeleteAction(List selection) {
+		DeleteAction deleteAction = new DeleteAction(selection);
+		deleteAction.setEnabled(selection.size() > 0);
+		return deleteAction;
+	}
+
+
+	public DOMContentBuilder createDOMContentBuilder(Document document) {
+		DOMContentBuilderImpl builder = new DOMContentBuilderImpl(document);
+		return builder;
+	}
+
+
+	protected Action createEditAttributeAction(Attr attr, CMAttributeDeclaration ad) {
+		return new EditAttributeAction(this, attr.getOwnerElement(), attr, XMLUIMessages._UI_MENU_EDIT_ATTRIBUTE, XMLUIMessages._UI_MENU_EDIT_ATTRIBUTE_TITLE);
+	}
+
+
+	protected Action createEditDoctypeAction(DocumentType doctype) {
+		return new EditDoctypeAction(fModel, doctype, fModel.getBaseLocation(), XMLUIMessages._UI_MENU_EDIT_DOCTYPE);
+	}
+
+
+	protected Action createEditProcessingInstructionAction(ProcessingInstruction pi) {
+		return new EditProcessingInstructionAction(this, pi, XMLUIMessages._UI_MENU_EDIT_PROCESSING_INSTRUCTION, XMLUIMessages._UI_MENU_EDIT_PROCESSING_INSTRUCTION_TITLE);
+	}
+
+
+	protected Action createEditSchemaInfoAction(Element element) {
+		return new EditSchemaInfoAction(this, element.getOwnerDocument(), fModel.getBaseLocation(), XMLUIMessages._UI_MENU_EDIT_NAMESPACES);
+	}
+
+
+	protected Action createRenameAction(Node node) {
+		Action result = null;
+		if (node instanceof Element) {
+			result = new EditElementAction(this, (Element) node, XMLUIMessages._UI_MENU_RENAME, XMLUIMessages._UI_MENU_RENAME_TITLE);
+		}
+		return result;
+	}
+
+
+	protected Action createReplaceAction(Node parent, CMNode cmnode, int startIndex, int endIndex) {
+		return new ReplaceNodeAction(parent, cmnode, startIndex, endIndex);
+	}
+
+	public void endNodeAction(NodeAction action) {
+		fModel.endRecording(action);
+	}
+
+
+
+	public void fillContextMenu(IMenuManager menuManager, ISelection selection) {
+		try {
+			List selectionList = new ArrayList();
+			if (selection instanceof IStructuredSelection) {
+				IStructuredSelection es = (IStructuredSelection) selection;
+				selectionList.addAll(es.toList());
+			}
+
+			contributeActions(menuManager, selectionList);
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 
+	 */
+	public String getLabel(Node parent, CMNode cmnode) {
+		String result = "?" + cmnode + "?"; //$NON-NLS-1$ //$NON-NLS-2$
+		if (cmnode != null) {
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=155800
+			result = cmnode.getNodeName();
+			if(result == null) {
+				result = (String) cmnode.getProperty("description"); //$NON-NLS-1$
+			}
+			if (result == null || result.length() == 0) {
+				if (cmnode.getNodeType() == CMNode.GROUP) {
+					CMDescriptionBuilder descriptionBuilder = new CMDescriptionBuilder();
+					result = descriptionBuilder.buildDescription(cmnode);
+				}
+				else {
+					result = DOMNamespaceHelper.computeName(cmnode, parent, null);
+				}
+			}
+		}
+		return result;
+	}
+
+
+	public IStructuredModel getModel() {
+		return fModel;
+	}
+
+
+	public Shell getWorkbenchWindowShell() {
+		return XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+	}
+
+
+	public void insert(Node parent, CMNode cmnode, int index) {
+		Document document = parent.getNodeType() == Node.DOCUMENT_NODE ? (Document) parent : parent.getOwnerDocument();
+		DOMContentBuilder builder = createDOMContentBuilder(document);
+		builder.setBuildPolicy(DOMContentBuilder.BUILD_ONLY_REQUIRED_CONTENT);
+		builder.build(parent, cmnode);
+		insertNodesAtIndex(parent, builder.getResult(), index);
+	}
+
+
+	public void insertNodesAtIndex(Node parent, List list, int index) {
+		insertNodesAtIndex(parent, list, index, true);
+	}
+
+
+	public void insertNodesAtIndex(Node parent, List list, int index, boolean format) {
+		NodeList nodeList = parent.getChildNodes();
+		if (index == -1) {
+			index = nodeList.getLength();
+		}
+		Node refChild = (index < nodeList.getLength()) ? nodeList.item(index) : null;
+
+		// here we consider the case where the previous node is a 'white
+		// space' Text node
+		// we should really do the insert before this node
+		//
+		int prevIndex = index - 1;
+		Node prevChild = (prevIndex < nodeList.getLength()) ? nodeList.item(prevIndex) : null;
+		if (isWhitespaceTextNode(prevChild)) {
+			refChild = prevChild;
+		}
+
+		for (Iterator i = list.iterator(); i.hasNext();) {
+			Node newNode = (Node) i.next();
+
+			if (newNode.getNodeType() == Node.ATTRIBUTE_NODE) {
+				Element parentElement = (Element) parent;
+				parentElement.setAttributeNode((Attr) newNode);
+			}
+			else {
+				parent.insertBefore(newNode, refChild);
+			}
+		}
+
+		boolean formatDeep = false;
+		for (Iterator i = list.iterator(); i.hasNext();) {
+			Node newNode = (Node) i.next();
+			if (newNode.getNodeType() == Node.ELEMENT_NODE) {
+				formatDeep = true;
+			}
+
+			if (format) {
+				reformat(newNode, formatDeep);
+			}
+		}
+
+		setViewerSelection(list);
+	}
+
+
+	/**
+	 * This method is abstract since currently, the sed editor is required to
+	 * perform formating and we don't want to create a dependency on the sed
+	 * editor.
+	 */
+	public abstract void reformat(Node parent, boolean deep);
+
+
+	public void remove(Node parent, int startIndex, int endIndex) {
+		NodeList nodeList = parent.getChildNodes();
+		for (int i = endIndex; i >= startIndex; i--) {
+			Node node = nodeList.item(i);
+			if (node != null) {
+				parent.removeChild(node);
+			}
+		}
+	}
+
+
+	public void setViewerSelection(List list) {
+		if (fViewer != null) {
+			fViewer.setSelection(new StructuredSelection(list), true);
+		}
+	}
+
+
+	public void setViewerSelection(Node node) {
+		if (fViewer != null) {
+			fViewer.setSelection(new StructuredSelection(node), true);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ActionContributorXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ActionContributorXML.java
new file mode 100644
index 0000000..c4f8285
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ActionContributorXML.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.RetargetTextEditorAction;
+import org.eclipse.wst.sse.ui.internal.actions.ActionContributor;
+import org.eclipse.wst.sse.ui.internal.actions.ActionDefinitionIds;
+import org.eclipse.wst.sse.ui.internal.actions.StructuredTextEditorActionConstants;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * XMLEditorActionContributor
+ * 
+ * This class should not be used inside multi page editor's
+ * ActionBarContributor, since cascaded init() call from the
+ * ActionBarContributor will causes exception and it leads to lose whole
+ * toolbars.
+ * 
+ * Instead, use SourcePageActionContributor for source page contributor of
+ * multi page editor.
+ * 
+ * Note that this class is still valid for single page editor.
+ */
+public class ActionContributorXML extends ActionContributor {
+	private static final String[] EDITOR_IDS = {"org.eclipse.core.runtime.xml.source", "org.eclipse.core.runtime.xml.source2", "org.eclipse.wst.sse.ui.StructuredTextEditor"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	private static final String GO_TO_MATCHING_TAG_ID = "org.eclipse.wst.xml.ui.gotoMatchingTag"; //$NON-NLS-1$
+	
+	protected RetargetTextEditorAction fCleanupDocument = null;
+	protected RetargetTextEditorAction fComment = null;
+	protected RetargetTextEditorAction fContentAssist = null;
+	protected RetargetTextEditorAction fFindOccurrences = null;
+	protected RetargetTextEditorAction fFormatActiveElements = null;
+	protected RetargetTextEditorAction fFormatDocument = null;
+	protected RetargetTextEditorAction fOpenFileAction = null; // open file
+
+	protected RetargetTextEditorAction fUncomment = null;
+	private GoToMatchingTagAction fGoToMatchingTagAction;
+
+	public ActionContributorXML() {
+		super();
+
+		ResourceBundle resourceBundle = XMLUIMessages.getResourceBundle();
+
+		fContentAssist = new RetargetTextEditorAction(resourceBundle, ""); //$NON-NLS-1$
+		fContentAssist.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+
+		// source commands
+		fCleanupDocument = new RetargetTextEditorAction(resourceBundle, ""); //$NON-NLS-1$
+		fCleanupDocument.setActionDefinitionId(ActionDefinitionIds.CLEANUP_DOCUMENT);
+
+		fFormatDocument = new RetargetTextEditorAction(resourceBundle, ""); //$NON-NLS-1$
+		fFormatDocument.setActionDefinitionId(ActionDefinitionIds.FORMAT_DOCUMENT);
+
+		fFormatActiveElements = new RetargetTextEditorAction(resourceBundle, ""); //$NON-NLS-1$
+		fFormatActiveElements.setActionDefinitionId(ActionDefinitionIds.FORMAT_ACTIVE_ELEMENTS);
+
+		// navigate commands
+		fOpenFileAction = new RetargetTextEditorAction(resourceBundle, ""); //$NON-NLS-1$
+		fOpenFileAction.setActionDefinitionId(ActionDefinitionIds.OPEN_FILE);
+
+		fFindOccurrences = new RetargetTextEditorAction(resourceBundle, ""); //$NON-NLS-1$
+		fFindOccurrences.setActionDefinitionId(ActionDefinitionIds.FIND_OCCURRENCES);
+
+		fGoToMatchingTagAction = new GoToMatchingTagAction(resourceBundle, "gotoMatchingTag_", null); //$NON-NLS-1$
+		fGoToMatchingTagAction.setActionDefinitionId(GO_TO_MATCHING_TAG_ID);
+		fGoToMatchingTagAction.setId(GO_TO_MATCHING_TAG_ID);
+	}
+	
+	/**
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager)
+	 */
+	public void contributeToMenu(IMenuManager menu) {
+		// navigate commands
+		IMenuManager navigateMenu = menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
+		if (navigateMenu != null) {
+			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fCommandsSeparator);
+			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fOpenFileAction);
+
+			IMenuManager gotoGroup = navigateMenu.findMenuUsingPath(IWorkbenchActionConstants.GO_TO);
+			if (gotoGroup != null) {
+				gotoGroup.appendToGroup("matchingBegin", fGoToMatchingTagAction); //$NON-NLS-1$
+			}
+		}
+		super.contributeToMenu(menu);
+	}
+
+	protected void addToMenu(IMenuManager menu) {
+/*
+		// edit commands
+		IMenuManager editMenu = menu.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
+		if (editMenu != null) {
+			editMenu.add(fCommandsSeparator);
+			editMenu.add(fToggleInsertModeAction);
+			editMenu.add(fCommandsSeparator);
+			editMenu.add(fExpandSelectionToMenu);
+			editMenu.add(fCommandsSeparator);
+			editMenu.add(fContentAssist);
+			editMenu.add(fMenuAdditionsGroupMarker);
+		}
+
+		// source commands
+		String sourceMenuLabel = XMLUIMessages.SourceMenu_label;
+		String sourceMenuId = "sourceMenuId"; //$NON-NLS-1$
+		IMenuManager sourceMenu = new MenuManager(sourceMenuLabel, sourceMenuId);
+		menu.insertAfter(IWorkbenchActionConstants.M_EDIT, sourceMenu);
+		if (sourceMenu != null) {
+			sourceMenu.add(fCommandsSeparator);
+			sourceMenu.add(fToggleComment);
+			sourceMenu.add(fAddBlockComment);
+			sourceMenu.add(fRemoveBlockComment);
+			sourceMenu.add(fShiftRight);
+			sourceMenu.add(fShiftLeft);
+			sourceMenu.add(fCleanupDocument);
+			sourceMenu.add(fFormatDocument);
+			sourceMenu.add(fFormatActiveElements);
+			sourceMenu.add(fCommandsSeparator);
+			sourceMenu.add(fFindOccurrences);
+		}
+
+		// navigate commands
+		IMenuManager navigateMenu = menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
+		if (navigateMenu != null) {
+			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fCommandsSeparator);
+			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fOpenFileAction);
+
+			IMenuManager gotoGroup = navigateMenu.findMenuUsingPath(IWorkbenchActionConstants.GO_TO);
+			if (gotoGroup != null) {
+				gotoGroup.add(fGotoMatchingBracketAction);
+				gotoGroup.add(fGoToMatchingTagAction);
+				gotoGroup.add(new Separator());
+			}
+		}
+*/
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.edit.util.ActionContributor#getExtensionIDs()
+	 */
+	protected String[] getExtensionIDs() {
+		return EDITOR_IDS;
+	}
+
+	/**
+	 * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(IEditorPart)
+	 */
+	public void setActiveEditor(IEditorPart activeEditor) {
+		if (getActiveEditorPart() == activeEditor) {
+			return;
+		}
+		super.setActiveEditor(activeEditor);
+
+		IActionBars actionBars = getActionBars();
+		if (actionBars != null) {
+			IStatusLineManager statusLineManager = actionBars.getStatusLineManager();
+			if (statusLineManager != null) {
+				statusLineManager.setMessage(null);
+				statusLineManager.setErrorMessage(null);
+			}
+		}
+
+		ITextEditor textEditor = getTextEditor(activeEditor);
+
+		fContentAssist.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_PROPOSALS));
+
+		fCleanupDocument.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_CLEANUP_DOCUMENT));
+		fFormatDocument.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT));
+		fFormatActiveElements.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_ACTIVE_ELEMENTS));
+		fCleanupDocument.setEnabled((textEditor != null) && textEditor.isEditable());
+		fFormatDocument.setEnabled((textEditor != null) && textEditor.isEditable());
+		fFormatActiveElements.setEnabled((textEditor != null) && textEditor.isEditable());
+
+		fOpenFileAction.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE));
+
+		fFindOccurrences.setAction(getAction(textEditor, StructuredTextEditorActionConstants.ACTION_NAME_FIND_OCCURRENCES));
+
+		fGoToMatchingTagAction.setEditor(textEditor);
+		if (textEditor != null) {
+			textEditor.setAction(GO_TO_MATCHING_TAG_ID, fGoToMatchingTagAction);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.ISourceViewerActionBarContributor#setViewerSpecificContributionsEnabled(boolean)
+	 */
+	public void setViewerSpecificContributionsEnabled(boolean enabled) {
+		super.setViewerSpecificContributionsEnabled(enabled);
+
+		fContentAssist.setEnabled(enabled);
+		// cleanup and format document actions do not rely on source viewer
+		// being enabled
+		// fCleanupDocument.setEnabled(enabled);
+		// fFormatDocument.setEnabled(enabled);
+
+		fFormatActiveElements.setEnabled(enabled);
+		fOpenFileAction.setEnabled(enabled);
+		fFindOccurrences.setEnabled(enabled);
+
+		fGoToMatchingTagAction.setEnabled(enabled);
+		fGotoMatchingBracketAction.setEnabled(enabled);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AddBlockCommentActionXMLDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AddBlockCommentActionXMLDelegate.java
new file mode 100644
index 0000000..a038376
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AddBlockCommentActionXMLDelegate.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.xml.core.internal.document.CommentImpl;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * Add block comment action delegate for XML editor
+ */
+public class AddBlockCommentActionXMLDelegate extends AbstractCommentActionXMLDelegate {
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(XMLUIMessages.AddBlockComment_label);
+			action.setToolTipText(XMLUIMessages.AddBlockComment_tooltip);
+			action.setDescription(XMLUIMessages.AddBlockComment_description);
+		}
+	}
+
+	void processAction(IDocument document, ITextSelection textSelection) {
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+		if (model != null) {
+			try {
+				IndexedRegion selectionStartIndexedRegion = model.getIndexedRegion(textSelection.getOffset());
+				IndexedRegion selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength());
+
+				if (selectionStartIndexedRegion == null) {
+					return;
+				}
+				if ((selectionEndIndexedRegion == null) && (textSelection.getLength() > 0)) {
+					selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength() - 1);
+				}
+				if (selectionEndIndexedRegion == null) {
+					return;
+				}
+
+				int openCommentOffset = selectionStartIndexedRegion.getStartOffset();
+				int closeCommentOffset = selectionEndIndexedRegion.getEndOffset() + OPEN_COMMENT.length();
+
+
+				if ((textSelection.getLength() == 0) && (selectionStartIndexedRegion instanceof CommentImpl)) {
+					return;
+				}
+
+				model.beginRecording(this, XMLUIMessages.AddBlockComment_tooltip);
+				model.aboutToChangeModel();
+
+				try {
+					document.replace(openCommentOffset, 0, OPEN_COMMENT);
+					document.replace(closeCommentOffset, 0, CLOSE_COMMENT);
+					removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length());
+				}
+				catch (BadLocationException e) {
+					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+				}
+				finally {
+					model.changedModel();
+					model.endRecording(this);
+				}
+			}
+			finally {
+				model.releaseFromEdit();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/BaseNodeActionManager.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/BaseNodeActionManager.java
new file mode 100644
index 0000000..4465152
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/BaseNodeActionManager.java
@@ -0,0 +1,521 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryAction;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
+
+public abstract class BaseNodeActionManager {
+
+
+	/**
+	 * MyMenuManager
+	 */
+	public static class MyMenuManager extends MenuManager {
+		protected String title;
+
+		public MyMenuManager(String s) {
+			super(s);
+			title = s;
+		}
+
+		public boolean isEnabled() {
+			return !isEmpty();
+		}
+
+		public String toString() {
+			return title;
+		}
+	}
+
+	public static DocumentType getDoctype(Node node) {
+		Document document = (node.getNodeType() == Node.DOCUMENT_NODE) ? (Document) node : node.getOwnerDocument();
+		return document.getDoctype();
+	}
+
+	protected MenuBuilder menuBuilder = new MenuBuilder();
+	protected IStructuredModel fModel;
+	protected ModelQuery modelQuery;
+
+	protected BaseNodeActionManager(IStructuredModel model, ModelQuery modelQuery) {
+		this.fModel = model;
+		this.modelQuery = modelQuery;
+	}
+
+
+	protected void addActionHelper(IMenuManager menu, List modelQueryActionList) {
+		List actionList = new Vector();
+		for (Iterator i = modelQueryActionList.iterator(); i.hasNext();) {
+			ModelQueryAction action = (ModelQueryAction) i.next();
+			if (action.getCMNode() != null) {
+				int cmNodeType = action.getCMNode().getNodeType();
+				if (action.getKind() == ModelQueryAction.INSERT) {
+					switch (cmNodeType) {
+						case CMNode.ATTRIBUTE_DECLARATION : {
+							actionList.add(createAddAttributeAction((Element) action.getParent(), (CMAttributeDeclaration) action.getCMNode()));
+							break;
+						}
+						case CMNode.ELEMENT_DECLARATION : {
+							actionList.add(createAddElementAction(action.getParent(), (CMElementDeclaration) action.getCMNode(), action.getStartIndex()));
+							break;
+						}
+					}
+				}
+				else if (action.getKind() == ModelQueryAction.REPLACE) {
+					if ((action.getParent() != null) && (action.getCMNode() != null)) {
+						actionList.add(createReplaceAction(action.getParent(), action.getCMNode(), action.getStartIndex(), action.getEndIndex()));
+					}
+				}
+			}
+		}
+		menuBuilder.populateMenu(menu, actionList, false);
+	}
+
+	protected void contributeAction(IMenuManager menu, Action action) {
+		if (action != null) {
+			menu.add(action);
+		}
+	}
+
+
+	public void contributeActions(IMenuManager menu, List selection) {
+		int editMode = modelQuery.getEditMode();
+		int ic = ModelQuery.INCLUDE_CHILD_NODES;
+		int vc = (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) ? ModelQuery.VALIDITY_STRICT : ModelQuery.VALIDITY_NONE;
+
+		List implicitlySelectedNodeList = null;
+
+		if (selection.size() > 0) {
+			implicitlySelectedNodeList = getSelectedNodes(selection, true);
+
+			// contribute delete actions
+			contributeDeleteActions(menu, implicitlySelectedNodeList, ic, vc);
+		}
+
+		if (selection.size() == 1) {
+			Node node = (Node) selection.get(0);
+
+			// contribute edit actions
+			contributeEditActions(menu, node);
+
+			// contribute add child actions
+			contributeAddChildActions(menu, node, ic, vc);
+
+			// contribute add before actions
+			contributeAddSiblingActions(menu, node, ic, vc);
+		}
+
+		if (selection.size() > 0) {
+			// contribute replace actions
+			contributeReplaceActions(menu, implicitlySelectedNodeList, ic, vc);
+		}
+
+		if (selection.size() == 0) {
+			Document document = ((IDOMModel) fModel).getDocument();
+			contributeAddDocumentChildActions(menu, document, ic, vc);
+			contributeEditGrammarInformationActions(menu, document);
+		}
+	}
+
+	protected boolean canContributeChildActions(Node node){
+		return true;
+	}
+
+	protected void contributeAddChildActions(IMenuManager menu, Node node, int ic, int vc) {
+		int nodeType = node.getNodeType();
+
+		if (nodeType == Node.ELEMENT_NODE && canContributeChildActions(node)) {
+			// 'Add Child...' and 'Add Attribute...' actions
+			//
+			Element element = (Element) node;
+
+			IMenuManager addAttributeMenu = new MyMenuManager(XMLUIMessages._UI_MENU_ADD_ATTRIBUTE);
+			IMenuManager addChildMenu = new MyMenuManager(XMLUIMessages._UI_MENU_ADD_CHILD);
+			menu.add(addAttributeMenu);
+			menu.add(addChildMenu);
+		
+			CMElementDeclaration ed = modelQuery.getCMElementDeclaration(element);
+			if (ed != null) {
+				// add insert attribute actions
+				//
+				List modelQueryActionList = new ArrayList();
+				modelQuery.getInsertActions(element, ed, -1, ModelQuery.INCLUDE_ATTRIBUTES, vc, modelQueryActionList);
+				addActionHelper(addAttributeMenu, modelQueryActionList);
+				// add insert child node actions
+				//
+				modelQueryActionList = new ArrayList();
+				modelQuery.getInsertActions(element, ed, -1, ic, vc, modelQueryActionList);
+				addActionHelper(addChildMenu, modelQueryActionList);
+			}
+
+			// add PI and COMMENT
+			contributePIAndCommentActions(addChildMenu, element, ed, -1);
+
+			// add PCDATA, CDATA_SECTION
+			contributeTextNodeActions(addChildMenu, element, ed, -1);
+
+			// add NEW ELEMENT
+			contributeUnconstrainedAddElementAction(addChildMenu, element, ed, -1);
+
+			// add ATTRIBUTE
+			contributeUnconstrainedAttributeActions(addAttributeMenu, element, ed);
+		}
+	}
+
+
+	protected void contributeAddDocumentChildActions(IMenuManager menu, Document document, int ic, int vc) {
+		IMenuManager addChildMenu = new MyMenuManager(XMLUIMessages._UI_MENU_ADD_CHILD);
+		menu.add(addChildMenu);
+
+		// add PI and COMMENT
+		contributePIAndCommentActions(addChildMenu, document, -1);
+
+		// add NEW ELEMENT
+		contributeUnconstrainedAddElementAction(addChildMenu, document, -1);
+	}
+
+
+	protected void contributeAddSiblingActions(IMenuManager menu, Node node, int ic, int vc) {
+		IMenuManager addBeforeMenu = new MyMenuManager(XMLUIMessages._UI_MENU_ADD_BEFORE);
+		IMenuManager addAfterMenu = new MyMenuManager(XMLUIMessages._UI_MENU_ADD_AFTER);
+		menu.add(addBeforeMenu);
+		menu.add(addAfterMenu);
+
+		Node parentNode = node.getParentNode();
+		if (parentNode != null) {
+			int index = getIndex(parentNode, node);
+			if (parentNode.getNodeType() == Node.ELEMENT_NODE) {
+				Element parentElement = (Element) parentNode;
+				CMElementDeclaration parentED = modelQuery.getCMElementDeclaration(parentElement);
+				if (parentED != null) {
+					// 'Add Before...' and 'Add After...' actions
+					//
+					List modelQueryActionList = new ArrayList();
+					modelQuery.getInsertActions(parentElement, parentED, index, ic, vc, modelQueryActionList);
+					addActionHelper(addBeforeMenu, modelQueryActionList);
+
+					modelQueryActionList = new ArrayList();
+					modelQuery.getInsertActions(parentElement, parentED, index + 1, ic, vc, modelQueryActionList);
+					addActionHelper(addAfterMenu, modelQueryActionList);
+				}
+
+				// add COMMENT and PI before and after
+				contributePIAndCommentActions(addBeforeMenu, parentElement, parentED, index);
+				contributePIAndCommentActions(addAfterMenu, parentElement, parentED, index + 1);
+
+				// add PCDATA, CDATA_SECTION before and after
+				contributeTextNodeActions(addBeforeMenu, parentElement, parentED, index);
+				contributeTextNodeActions(addAfterMenu, parentElement, parentED, index + 1);
+
+				// add NEW ELEMENT before and after
+				contributeUnconstrainedAddElementAction(addBeforeMenu, parentElement, parentED, index);
+				contributeUnconstrainedAddElementAction(addAfterMenu, parentElement, parentED, index + 1);
+			}
+			else if (parentNode.getNodeType() == Node.DOCUMENT_NODE) {
+				Document document = (Document) parentNode;
+				CMDocument cmDocument = modelQuery.getCorrespondingCMDocument(parentNode);
+				if (cmDocument != null) {
+					// add possible root element insertions
+					//        
+					List modelQueryActionList = new ArrayList();
+					modelQuery.getInsertActions(document, cmDocument, index, ic, vc, modelQueryActionList);
+					addActionHelper(addAfterMenu, modelQueryActionList);
+
+					modelQueryActionList = new ArrayList();
+					modelQuery.getInsertActions(document, cmDocument, index + 1, ic, vc, modelQueryActionList);
+					addActionHelper(addAfterMenu, modelQueryActionList);
+				}
+
+				// add COMMENT and PI before and after
+				contributePIAndCommentActions(addBeforeMenu, document, index);
+				contributePIAndCommentActions(addAfterMenu, document, index + 1);
+
+				// add ELEMENT before and after
+				contributeUnconstrainedAddElementAction(addBeforeMenu, document, index);
+				contributeUnconstrainedAddElementAction(addAfterMenu, document, index + 1);
+			}
+		}
+	}
+
+	protected void contributeDeleteActions(IMenuManager menu, List list, int ic, int vc) {
+		boolean canRemove = modelQuery.canRemove(list, vc);
+
+
+		// a delete action with an empty list will produce a disabled menu
+		// item
+		//
+		List resultList = canRemove ? list : Collections.EMPTY_LIST;
+		contributeAction(menu, createDeleteAction(resultList));
+	}
+
+
+	protected void contributeEditActions(IMenuManager menu, Node node) {
+		contributeEditGrammarInformationActions(menu, node);
+
+		if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {
+			contributeAction(menu, createEditProcessingInstructionAction((ProcessingInstruction) node));
+		}
+		else if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+			contributeAction(menu, createEditAttributeAction((Attr) node, null));
+		}
+	}
+
+
+	protected void contributeEditGrammarInformationActions(IMenuManager menu, Node node) {
+		Document document = node.getNodeType() == Node.DOCUMENT_NODE ? (Document) node : node.getOwnerDocument();
+
+		DocumentType doctype = getDoctype(node);
+		if (doctype == null) {
+			contributeAction(menu, createAddDoctypeAction(document, -1));
+		}
+
+		if (node.getNodeType() == Node.DOCUMENT_TYPE_NODE) {
+			contributeAction(menu, createEditDoctypeAction((DocumentType) node));
+		}
+
+		if ((doctype == null) && (getRootElement(document) != null)) {
+			contributeAction(menu, createEditSchemaInfoAction(getRootElement(document)));
+		}
+	}
+
+	protected void contributePIAndCommentActions(IMenuManager menu, Document document, int index) {
+		// test to make sure that the index isn't before the XML declaration
+		// 
+		contributeAction(menu, createAddCommentAction(document, index));
+		contributeAction(menu, createAddProcessingInstructionAction(document, index));
+	}
+
+
+	protected void contributePIAndCommentActions(IMenuManager menu, Element parentElement, CMElementDeclaration parentEd, int index) {
+		if ((parentEd == null) || isCommentAllowed(parentEd)) {
+			contributeAction(menu, createAddCommentAction(parentElement, index));
+			contributeAction(menu, createAddProcessingInstructionAction(parentElement, index));
+		}
+	}
+
+
+	protected void contributeReplaceActions(IMenuManager menu, List selectedNodeList, int ic, int vc) {
+		// 'Replace With...' actions
+		//                                                                                                                   
+		IMenuManager replaceWithMenu = new MyMenuManager(XMLUIMessages._UI_MENU_REPLACE_WITH);
+		menu.add(replaceWithMenu);
+
+		if ((modelQuery.getEditMode() == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) && (selectedNodeList.size() > 0)) {
+			Node node = (Node) selectedNodeList.get(0);
+			Node parentNode = node.getParentNode();
+			if ((parentNode != null) && (parentNode.getNodeType() == Node.ELEMENT_NODE)) {
+				Element parentElement = (Element) parentNode;
+				CMElementDeclaration parentED = modelQuery.getCMElementDeclaration(parentElement);
+				if (parentED != null) {
+					List replaceActionList = new Vector();
+					modelQuery.getReplaceActions(parentElement, parentED, selectedNodeList, ic, vc, replaceActionList);
+					addActionHelper(replaceWithMenu, replaceActionList);
+				}
+			}
+		}
+	}
+
+	protected void contributeTextNodeActions(IMenuManager menu, Element parentElement, CMElementDeclaration parentEd, int index) {
+		if ((parentEd == null) || isTextAllowed(parentEd)) {
+			CMDataType dataType = parentEd != null ? parentEd.getDataType() : null;
+			contributeAction(menu, createAddPCDataAction(parentElement, dataType, index));
+			contributeAction(menu, createAddCDataSectionAction(parentElement, index));
+		}
+	}
+
+
+	protected void contributeUnconstrainedAddElementAction(IMenuManager menu, Document document, int index) {
+		if (isUnconstrainedActionAllowed()) {
+			if (getRootElement(document) == null) {
+				int xmlDeclarationIndex = -1;
+				int doctypeIndex = -1;
+				NodeList nodeList = document.getChildNodes();
+				int nodeListLength = nodeList.getLength();
+				for (int i = 0; i < nodeListLength; i++) {
+					Node node = nodeList.item(i);
+					int nodeType = node.getNodeType();
+					if (nodeType == Node.DOCUMENT_TYPE_NODE) {
+						doctypeIndex = i;
+						break;
+					}
+					else if (nodeType == Node.PROCESSING_INSTRUCTION_NODE) {
+						ProcessingInstruction pi = (ProcessingInstruction) node;
+						if (pi.getTarget().equalsIgnoreCase("xml") && (xmlDeclarationIndex == -1)) { //$NON-NLS-1$
+							xmlDeclarationIndex = i;
+						}
+					}
+				}
+
+				if (((xmlDeclarationIndex == -1) || (index > xmlDeclarationIndex)) && ((doctypeIndex == -1) || (index > doctypeIndex))) {
+					contributeAction(menu, createAddElementAction(document, null, index));
+				}
+			}
+		}
+	}
+
+
+	protected void contributeUnconstrainedAddElementAction(IMenuManager menu, Element parentElement, CMElementDeclaration parentEd, int index) {
+		if (isUnconstrainedActionAllowed()) {
+			if ((parentEd == null) || (parentEd.getProperty("isInferred") == Boolean.TRUE) || ((modelQuery.getEditMode() != ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) && isElementAllowed(parentEd))) { //$NON-NLS-1$
+				contributeAction(menu, createAddElementAction(parentElement, null, index));
+			}
+		}
+	}
+
+
+	protected void contributeUnconstrainedAttributeActions(IMenuManager menu, Element parentElement, CMElementDeclaration parentEd) {
+		if (isUnconstrainedActionAllowed()) {
+			if ((parentEd == null) || (parentEd.getProperty("isInferred") == Boolean.TRUE) || (modelQuery.getEditMode() != ModelQuery.EDIT_MODE_CONSTRAINED_STRICT)) { //$NON-NLS-1$
+				contributeAction(menu, createAddAttributeAction(parentElement, null));
+			}
+		}
+	}
+
+	abstract protected Action createAddAttributeAction(Element parent, CMAttributeDeclaration ad);
+
+	abstract protected Action createAddCDataSectionAction(Node parent, int index);
+
+	abstract protected Action createAddCommentAction(Node parent, int index);
+
+	abstract protected Action createAddDoctypeAction(Document parent, int index);
+
+	abstract protected Action createAddElementAction(Node parent, CMElementDeclaration ed, int index);
+
+	abstract protected Action createAddPCDataAction(Node parent, CMDataType dataType, int index);
+
+	abstract protected Action createAddProcessingInstructionAction(Node parent, int index);
+
+	abstract protected Action createAddSchemaInfoAction(Element element);
+
+	abstract protected Action createDeleteAction(List selection);
+
+	abstract protected Action createEditAttributeAction(Attr attribute, CMAttributeDeclaration ad);
+
+	abstract protected Action createEditDoctypeAction(DocumentType doctype);
+
+	abstract protected Action createEditProcessingInstructionAction(ProcessingInstruction pi);
+
+	abstract protected Action createEditSchemaInfoAction(Element element);
+
+	abstract protected Action createRenameAction(Node node);
+
+	abstract protected Action createReplaceAction(Node parent, CMNode cmnode, int startIndex, int endIndex);
+
+
+	public int getIndex(Node parentNode, Node child) {
+		NodeList nodeList = parentNode.getChildNodes();
+		int index = -1;
+		int size = nodeList.getLength();
+		for (int i = 0; i < size; i++) {
+			if (nodeList.item(i) == child) {
+				index = i;
+				break;
+			}
+		}
+		return index;
+	}
+
+
+	public Node getRefChildNodeAtIndex(Node parent, int index) {
+		NodeList nodeList = parent.getChildNodes();
+		Node refChild = ((index >= 0) && (index < nodeList.getLength())) ? nodeList.item(index) : null;
+		return refChild;
+	}
+
+
+	protected Element getRootElement(Document document) {
+		Element result = null;
+		NodeList nodeList = document.getChildNodes();
+		int nodeListLength = nodeList.getLength();
+		for (int i = 0; i < nodeListLength; i++) {
+			Node node = nodeList.item(i);
+			if (node.getNodeType() == Node.ELEMENT_NODE) {
+				result = (Element) node;
+				break;
+			}
+		}
+		return result;
+	}
+
+
+	protected List getSelectedNodes(List list, boolean includeTextNodes) {
+		List result = new ArrayList(0);
+		for (Iterator i = list.iterator(); i.hasNext();) {
+			Object object = i.next();
+			if (object instanceof Node) {
+				Node node = (Node) object;
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					if (includeTextNodes) {
+						result.add(object);
+					}
+				}
+				else {
+					result.add(node);
+				}
+			}
+		}
+		return result;
+	}
+
+
+	protected boolean isCommentAllowed(CMElementDeclaration parentEd) {
+		int contentType = parentEd.getContentType();
+		return (contentType == CMElementDeclaration.ELEMENT) || (contentType == CMElementDeclaration.MIXED) || (contentType == CMElementDeclaration.PCDATA) || (contentType == CMElementDeclaration.ANY);
+	}
+
+
+	protected boolean isElementAllowed(CMElementDeclaration parentEd) {
+		int contentType = parentEd.getContentType();
+		return (contentType == CMElementDeclaration.ELEMENT) || (contentType == CMElementDeclaration.MIXED) || (contentType == CMElementDeclaration.ANY);
+	}
+
+
+	protected boolean isTextAllowed(CMElementDeclaration parentEd) {
+		int contentType = parentEd.getContentType();
+		return (contentType == CMElementDeclaration.MIXED) || (contentType == CMElementDeclaration.PCDATA) || (contentType == CMElementDeclaration.ANY);
+	}
+
+
+	protected boolean isUnconstrainedActionAllowed() {
+		return true;
+	}
+
+
+	protected boolean isWhitespaceTextNode(Node node) {
+		return (node != null) && (node.getNodeType() == Node.TEXT_NODE) && (node.getNodeValue().trim().length() == 0);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/CleanupActionXMLDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/CleanupActionXMLDelegate.java
new file mode 100644
index 0000000..d91a815
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/CleanupActionXMLDelegate.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.xml.core.internal.cleanup.CleanupProcessorXML;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * Cleanup action delegate for CSS editor
+ */
+public class CleanupActionXMLDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate {
+	private IEditorPart fEditor;
+	private IStructuredCleanupProcessor fCleanupProcessor;
+
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		fEditor = targetEditor;
+	}
+
+	public void dispose() {
+		// nulling out just in case
+		fEditor = null;
+		fCleanupProcessor = null;
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(XMLUIMessages.CleanupDocument_label);
+			action.setToolTipText(XMLUIMessages.CleanupDocument_tooltip);
+			action.setDescription(XMLUIMessages.CleanupDocument_description);
+		}
+	}
+
+	public void runWithEvent(IAction action, Event event) {
+		run(action);
+	}
+
+	public void init(IViewPart view) {
+		// do nothing
+	}
+
+	public void run(IAction action) {
+		if (fEditor instanceof ITextEditor) {
+			final ITextEditor editor = (ITextEditor) fEditor;
+			Dialog cleanupDialog = new CleanupDialogXML(editor.getSite().getShell());
+			if (cleanupDialog.open() == Window.OK) {
+				// setup runnable
+				Runnable runnable = new Runnable() {
+					public void run() {
+						IStructuredCleanupProcessor cleanupProcessor = getCleanupProcessor();
+						if (cleanupProcessor != null) {
+							IStructuredModel model = null;
+							try {
+								model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput()));
+								if (model != null) {
+									cleanupProcessor.cleanupModel(model);
+								}
+							}
+							finally {
+								if (model != null) {
+									model.releaseFromEdit();
+								}
+							}
+						}
+					}
+				};
+
+				// TODO: make independent of 'model'.
+				IStructuredModel model = null;
+				try {
+					model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput()));
+					if (model != null) {
+						// begin recording
+						ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+						model.beginRecording(this, SSEUIMessages.Cleanup_Document_UI_, SSEUIMessages.Cleanup_Document_UI_, selection.getOffset(), selection.getLength());
+
+						// tell the model that we are about to make a big
+						// model change
+						model.aboutToChangeModel();
+
+						// run
+						BusyIndicator.showWhile(fEditor.getEditorSite().getWorkbenchWindow().getShell().getDisplay(), runnable);
+					}
+				}
+				finally {
+					if (model != null) {
+						// tell the model that we are done with the big
+						// model
+						// change
+						model.changedModel();
+
+						// end recording
+						ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+						model.endRecording(this, selection.getOffset(), selection.getLength());
+						model.releaseFromEdit();
+					}
+				}
+			}
+		}
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		// do nothing
+	}
+
+	IStructuredCleanupProcessor getCleanupProcessor() {
+		if (fCleanupProcessor == null) {
+			fCleanupProcessor = new CleanupProcessorXML();
+		}
+
+		return fCleanupProcessor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/CleanupDialogXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/CleanupDialogXML.java
new file mode 100644
index 0000000..199eac0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/CleanupDialogXML.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+
+public class CleanupDialogXML extends Dialog implements SelectionListener {
+	protected Button fCheckBoxCompressEmptyElementTags;
+	protected Button fCheckBoxConvertEOLCodes;
+	protected Button fCheckBoxFormatSource;
+	protected Button fCheckBoxInsertMissingTags;
+	protected Button fCheckBoxInsertRequiredAttrs;
+	protected Button fCheckBoxQuoteAttrValues;
+	protected Button fCheckBoxInsertXMLDeclaration;
+	protected IStructuredModel fModel = null;
+	protected Preferences fPreferences = null;
+	protected Button fRadioButtonAttrNameCaseAsis;
+	protected Button fRadioButtonAttrNameCaseLower;
+	protected Button fRadioButtonAttrNameCaseUpper;
+	protected Button fRadioButtonConvertEOLMac;
+	protected Button fRadioButtonConvertEOLUnix;
+	protected Button fRadioButtonConvertEOLWindows;
+
+	protected Button fRadioButtonTagNameCaseAsis;
+	protected Button fRadioButtonTagNameCaseLower;
+	protected Button fRadioButtonTagNameCaseUpper;
+
+	public CleanupDialogXML(Shell shell) {
+
+		super(shell);
+	}
+
+	public Control createDialogArea(Composite parent) {
+
+		getShell().setText(XMLUIMessages.Cleanup_UI_);
+		Composite composite = new Composite(parent, SWT.NULL);
+		createDialogAreaInComposite(composite);
+		initializeOptions();
+		return composite;
+	}
+
+	protected void createDialogAreaInComposite(Composite composite) {
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.CLEANUP_XML_HELPID); // use
+		// XML
+		// specific
+		// help
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.makeColumnsEqualWidth = true;
+		composite.setLayout(layout);
+
+		// Compress empty element tags
+		fCheckBoxCompressEmptyElementTags = new Button(composite, SWT.CHECK);
+		fCheckBoxCompressEmptyElementTags.setText(XMLUIMessages.Compress_empty_element_tags_UI_);
+		fCheckBoxCompressEmptyElementTags.addSelectionListener(this);
+
+		// Insert missing required attrs
+		fCheckBoxInsertRequiredAttrs = new Button(composite, SWT.CHECK);
+		fCheckBoxInsertRequiredAttrs.setText(XMLUIMessages.Insert_required_attributes_UI_);
+		fCheckBoxInsertRequiredAttrs.addSelectionListener(this);
+
+		// Insert missing begin/end tags
+		fCheckBoxInsertMissingTags = new Button(composite, SWT.CHECK);
+		fCheckBoxInsertMissingTags.setText(XMLUIMessages.Insert_missing_tags_UI_);
+		fCheckBoxInsertMissingTags.addSelectionListener(this);
+
+		// Quote attribute values
+		fCheckBoxQuoteAttrValues = new Button(composite, SWT.CHECK);
+		fCheckBoxQuoteAttrValues.setText(XMLUIMessages.Quote_attribute_values_UI_);
+		fCheckBoxQuoteAttrValues.addSelectionListener(this);
+
+		// Format source
+		fCheckBoxFormatSource = new Button(composite, SWT.CHECK);
+		fCheckBoxFormatSource.setText(XMLUIMessages.Format_source_UI_);
+		fCheckBoxFormatSource.addSelectionListener(this);
+
+		fCheckBoxInsertXMLDeclaration = new Button(composite, SWT.CHECK);
+		fCheckBoxInsertXMLDeclaration.setText(XMLUIMessages.Insert_XML_decl);
+		fCheckBoxInsertXMLDeclaration.addSelectionListener(this);
+
+		// Convert EOL code
+		fCheckBoxConvertEOLCodes = new Button(composite, SWT.CHECK);
+		fCheckBoxConvertEOLCodes.setText(XMLUIMessages.Convert_EOL_codes_UI_);
+		fCheckBoxConvertEOLCodes.addSelectionListener(this);
+		Composite EOLCodes = new Composite(composite, SWT.NULL);
+		GridLayout hLayout = new GridLayout();
+		hLayout.numColumns = 3;
+		EOLCodes.setLayout(hLayout);
+		fRadioButtonConvertEOLWindows = new Button(EOLCodes, SWT.RADIO);
+		fRadioButtonConvertEOLWindows.setText(XMLUIMessages.EOL_Windows_UI);
+		fRadioButtonConvertEOLWindows.addSelectionListener(this);
+		fRadioButtonConvertEOLUnix = new Button(EOLCodes, SWT.RADIO);
+		fRadioButtonConvertEOLUnix.setText(XMLUIMessages.EOL_Unix_UI);
+		fRadioButtonConvertEOLUnix.addSelectionListener(this);
+		fRadioButtonConvertEOLMac = new Button(EOLCodes, SWT.RADIO);
+		fRadioButtonConvertEOLMac.setText(XMLUIMessages.EOL_Mac_UI);
+		fRadioButtonConvertEOLMac.addSelectionListener(this);
+	}
+
+	protected void enableEOLCodeRadios(boolean enable) {
+
+		if ((fRadioButtonConvertEOLWindows != null) && (fRadioButtonConvertEOLUnix != null) && (fRadioButtonConvertEOLMac != null)) {
+			fRadioButtonConvertEOLWindows.setEnabled(enable);
+			fRadioButtonConvertEOLUnix.setEnabled(enable);
+			fRadioButtonConvertEOLMac.setEnabled(enable);
+			if (!fRadioButtonConvertEOLWindows.getSelection() && !fRadioButtonConvertEOLUnix.getSelection() && !fRadioButtonConvertEOLMac.getSelection()) {
+				fRadioButtonConvertEOLWindows.setSelection(true);
+			}
+		}
+	}
+
+	protected Preferences getModelPreferences() {
+		return XMLCorePlugin.getDefault().getPluginPreferences();
+	}
+
+	protected void initializeOptions() {
+
+		fCheckBoxCompressEmptyElementTags.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.COMPRESS_EMPTY_ELEMENT_TAGS));
+		fCheckBoxInsertRequiredAttrs.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.INSERT_REQUIRED_ATTRS));
+		fCheckBoxInsertMissingTags.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.INSERT_MISSING_TAGS));
+		fCheckBoxQuoteAttrValues.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.QUOTE_ATTR_VALUES));
+		fCheckBoxFormatSource.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.FORMAT_SOURCE));
+		fCheckBoxConvertEOLCodes.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.CONVERT_EOL_CODES));
+		fCheckBoxInsertXMLDeclaration.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.FIX_XML_DECLARATION));
+		String EOLCode = getModelPreferences().getString(XMLCorePreferenceNames.CLEANUP_EOL_CODE);
+		if (EOLCode.compareTo(CommonEncodingPreferenceNames.LF) == 0) {
+			fRadioButtonConvertEOLUnix.setSelection(true);
+		}
+		else if (EOLCode.compareTo(CommonEncodingPreferenceNames.CR) == 0) {
+			fRadioButtonConvertEOLMac.setSelection(true);
+		}
+		else {
+			fRadioButtonConvertEOLWindows.setSelection(true);
+		}
+		enableEOLCodeRadios(fCheckBoxConvertEOLCodes.getSelection());
+	}
+
+	protected void okPressed() {
+
+		storeOptions();
+		super.okPressed();
+	}
+
+	public void setModel(IStructuredModel model) {
+
+		fModel = model;
+	}
+
+	protected void storeOptions() {
+
+		getModelPreferences().setValue(XMLCorePreferenceNames.COMPRESS_EMPTY_ELEMENT_TAGS, fCheckBoxCompressEmptyElementTags.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.INSERT_REQUIRED_ATTRS, fCheckBoxInsertRequiredAttrs.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.INSERT_MISSING_TAGS, fCheckBoxInsertMissingTags.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.QUOTE_ATTR_VALUES, fCheckBoxQuoteAttrValues.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.FORMAT_SOURCE, fCheckBoxFormatSource.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.CONVERT_EOL_CODES, fCheckBoxConvertEOLCodes.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.FIX_XML_DECLARATION, fCheckBoxInsertXMLDeclaration.getSelection());
+		if (fRadioButtonConvertEOLUnix.getSelection()) {
+			getModelPreferences().setValue(XMLCorePreferenceNames.CLEANUP_EOL_CODE, CommonEncodingPreferenceNames.LF);
+		}
+		else if (fRadioButtonConvertEOLMac.getSelection()) {
+			getModelPreferences().setValue(XMLCorePreferenceNames.CLEANUP_EOL_CODE, CommonEncodingPreferenceNames.CR);
+		}
+		else {
+			getModelPreferences().setValue(XMLCorePreferenceNames.CLEANUP_EOL_CODE, CommonEncodingPreferenceNames.CRLF);
+		}
+		// explicitly save plugin preferences so values are stored
+		XMLCorePlugin.getDefault().savePluginPreferences();
+	}
+
+	public void widgetDefaultSelected(SelectionEvent e) {
+
+		widgetSelected(e);
+	}
+
+	public void widgetSelected(SelectionEvent e) {
+
+		getButton(OK).setEnabled(((fRadioButtonTagNameCaseLower != null) && (fRadioButtonTagNameCaseLower.getSelection() || fRadioButtonTagNameCaseUpper.getSelection())) 
+				|| ((fRadioButtonAttrNameCaseLower != null) && (fRadioButtonAttrNameCaseLower.getSelection() || fRadioButtonAttrNameCaseUpper.getSelection()))
+				|| fCheckBoxInsertMissingTags.getSelection()
+				|| fCheckBoxQuoteAttrValues.getSelection() 
+				|| fCheckBoxFormatSource.getSelection() 
+				|| fCheckBoxInsertXMLDeclaration.getSelection()
+				|| fCheckBoxCompressEmptyElementTags.getSelection()
+				|| fCheckBoxInsertRequiredAttrs.getSelection()
+				|| (( fCheckBoxConvertEOLCodes.getSelection() && fRadioButtonConvertEOLUnix != null ) && (fRadioButtonConvertEOLUnix.getSelection() || fRadioButtonConvertEOLMac.getSelection()
+						|| fRadioButtonConvertEOLWindows.getSelection())));
+		if (e.widget == fCheckBoxConvertEOLCodes) {
+			enableEOLCodeRadios(fCheckBoxConvertEOLCodes.getSelection());
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditAttributeAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditAttributeAction.java
new file mode 100644
index 0000000..0cdc771
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditAttributeAction.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.dialogs.EditAttributeDialog;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class EditAttributeAction extends NodeAction {
+	protected static ImageDescriptor imageDescriptor;
+
+	public static ImageDescriptor createImageDescriptor() {
+		if (imageDescriptor == null) {
+			imageDescriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);
+		}
+		return imageDescriptor;
+	}
+
+	protected Attr attr;
+	protected AbstractNodeActionManager manager;
+	protected Element ownerElement;
+	protected String title;
+
+	public EditAttributeAction(AbstractNodeActionManager manager, Element ownerElement, Attr attr, String actionLabel, String title) {
+		this.manager = manager;
+		this.ownerElement = ownerElement;
+		this.attr = attr;
+		this.title = title;
+		setText(actionLabel);
+		// assume if attr is null then this is an 'Add' that requires action
+		// an icons... otherwise this is an edit
+		if (attr == null) {
+			setImageDescriptor(createImageDescriptor());
+		}
+	}
+
+	public String getUndoDescription() {
+		return title;
+	}
+
+	public void run() {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		if (validateEdit(manager.getModel(), shell)) {
+			manager.beginNodeAction(this);
+			EditAttributeDialog dialog = new EditAttributeDialog(shell, ownerElement, attr);
+			dialog.create();
+			dialog.getShell().setText(title);
+			dialog.setBlockOnOpen(true);
+			dialog.open();
+	
+			if (dialog.getReturnCode() == Window.OK) {
+				if (attr != null) {
+					ownerElement.removeAttributeNode(attr);
+				}
+				Document document = ownerElement.getOwnerDocument();
+				Attr newAttribute = document.createAttribute(dialog.getAttributeName());
+				newAttribute.setValue(dialog.getAttributeValue());
+				ownerElement.setAttributeNode(newAttribute);
+				manager.setViewerSelection(newAttribute);
+			}
+			manager.endNodeAction(this);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditDoctypeAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditDoctypeAction.java
new file mode 100644
index 0000000..4ce515c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditDoctypeAction.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocumentType;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.dialogs.EditDoctypeDialog;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * EditDoctypeAction
+ */
+public class EditDoctypeAction extends NodeAction {
+	protected DocumentType doctype;
+	protected Document document;
+	protected IStructuredModel model;
+	protected String resourceLocation;
+	protected String title;
+
+	/**
+	 * This constructor is used to create a new doctype.
+	 */
+	public EditDoctypeAction(IStructuredModel model, Document document, String resourceLocation, String title) {
+		setText(title);
+		this.model = model;
+		this.document = document;
+		this.resourceLocation = resourceLocation;
+		this.title = title;
+	}
+
+	/**
+	 * This constructor is used to edit an exisitng doctype.
+	 */
+	public EditDoctypeAction(IStructuredModel model, DocumentType doctype, String resourceLocation, String title) {
+		setText(title);
+		this.model = model;
+		this.doctype = doctype;
+		this.resourceLocation = resourceLocation;
+		this.title = title;
+	}
+
+
+	protected DocumentType createDoctype(EditDoctypeDialog dialog, Document document) {
+		DocumentType result = null;
+		if (document instanceof DocumentImpl) {
+			IDOMDocument documentImpl = (IDOMDocument) document;
+			IDOMDocumentType doctypeImpl = (IDOMDocumentType) documentImpl.createDoctype(dialog.getName());
+			doctypeImpl.setPublicId(dialog.getPublicId());
+			doctypeImpl.setSystemId(dialog.getSystemId());
+			result = doctypeImpl;
+		}
+		return result;
+	}
+
+	private Display getDisplay() {
+
+		return PlatformUI.getWorkbench().getDisplay();
+	}
+
+
+	protected String getRootElementName(Document document) {
+		Element rootElement = null;
+		NodeList nodeList = document.getChildNodes();
+		int nodeListLength = nodeList.getLength();
+		for (int i = 0; i < nodeListLength; i++) {
+			Node childNode = nodeList.item(i);
+			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
+				rootElement = (Element) childNode;
+				break;
+			}
+		}
+		return rootElement != null ? rootElement.getNodeName() : XMLUIMessages._UI_LABEL_ROOT_ELEMENT_VALUE;
+	}
+
+	public String getUndoDescription() {
+		return title;
+	}
+
+
+	protected void insertDoctype(DocumentType doctype, Document document) {
+		Node refChild = null;
+		NodeList nodeList = document.getChildNodes();
+		int nodeListLength = nodeList.getLength();
+		for (int i = 0; i < nodeListLength; i++) {
+			Node childNode = nodeList.item(i);
+			if ((childNode.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) || (childNode.getNodeType() == Node.COMMENT_NODE)) {
+				// continue on to the nextNode
+			}
+			else {
+				refChild = childNode;
+				break;
+			}
+		}
+
+		document.insertBefore(doctype, refChild);
+		// manager.reformat(doctype, false);
+	}
+
+	public void run() {
+		Shell shell = getDisplay().getActiveShell();
+		if (validateEdit(model, shell)) {
+			model.beginRecording(this, getUndoDescription());
+			// Shell shell =
+			// XMLCommonUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+			EditDoctypeDialog dialog = showEditDoctypeDialog(shell);
+	
+			if (dialog.getReturnCode() == Window.OK) {
+				if (doctype != null) {
+					updateDoctype(dialog, doctype);
+				}
+				else if (document != null) {
+					DocumentType doctype = createDoctype(dialog, document);
+					if (doctype != null) {
+						insertDoctype(doctype, document);
+					}
+				}
+			}
+			model.endRecording(this);
+		}
+	}
+
+	protected EditDoctypeDialog showEditDoctypeDialog(Shell shell) {
+		EditDoctypeDialog dialog = null;
+
+		if (doctype != null) {
+			dialog = new EditDoctypeDialog(shell, doctype);
+			if (title == null) {
+				title = XMLUIMessages._UI_LABEL_EDIT_DOCTYPE;
+			}
+		}
+		else if (document != null) {
+			String rootElementName = getRootElementName(document);
+			dialog = new EditDoctypeDialog(shell, rootElementName, "", rootElementName + ".dtd"); //$NON-NLS-1$ //$NON-NLS-2$
+			if (title == null) {
+				title = XMLUIMessages._UI_MENU_ADD_DTD_INFORMATION_TITLE;
+			}
+		}
+
+		dialog.setComputeSystemId((doctype == null) || (doctype.getSystemId() == null) || (doctype.getSystemId().trim().length() == 0));
+
+		dialog.setErrorChecking(false);// !model.getType().equals(IStructuredModel.HTML));
+		dialog.create();
+		dialog.getShell().setText(title);
+		dialog.setBlockOnOpen(true);
+		dialog.setResourceLocation(new Path(resourceLocation));
+		dialog.open();
+
+		return dialog;
+	}
+
+
+	protected void updateDoctype(EditDoctypeDialog dialog, DocumentType doctype) {
+		if (doctype instanceof IDOMDocumentType) {
+			IDOMDocumentType doctypeImpl = (IDOMDocumentType) doctype;
+			if (doctypeImpl.getName().equals(dialog.getName())) {
+				doctypeImpl.setPublicId(dialog.getPublicId());
+				doctypeImpl.setSystemId(dialog.getSystemId());
+			}
+			else {
+				// we need to create a new one and remove the old
+				//                  
+				Document document = doctype.getOwnerDocument();
+				DocumentType newDoctype = createDoctype(dialog, document);
+				document.insertBefore(newDoctype, doctype);
+				document.removeChild(doctype);
+				// manager.reformat(newDoctype, false);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditElementAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditElementAction.java
new file mode 100644
index 0000000..21b55fe
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditElementAction.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.dialogs.EditElementDialog;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class EditElementAction extends NodeAction {
+
+	protected static ImageDescriptor imageDescriptor;
+
+	public static ImageDescriptor createImageDescriptor() {
+		if (imageDescriptor == null) {
+			imageDescriptor = XMLEditorPluginImageHelper.getInstance().getImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ELEMENT);
+		}
+		return imageDescriptor;
+	}
+
+	protected Element element;
+	protected int insertionIndex = -1;
+	protected AbstractNodeActionManager manager;
+	protected Node parent;
+	protected String title;
+
+	public EditElementAction(AbstractNodeActionManager manager, Element element, String actionLabel, String dialogTitle) {
+		this(manager, element.getParentNode(), -1, element, actionLabel, dialogTitle);
+	}
+
+	protected EditElementAction(AbstractNodeActionManager manager, Node parent, int index, Element element, String actionLabel, String title) {
+		this.manager = manager;
+		this.parent = parent;
+		this.insertionIndex = index;
+		this.element = element;
+		this.title = title;
+		setText(actionLabel);
+		if (element == null) {
+			setImageDescriptor(createImageDescriptor());
+		}
+	}
+
+	public EditElementAction(AbstractNodeActionManager manager, Node parent, int index, String actionLabel, String title) {
+		this(manager, parent, index, null, actionLabel, title);
+	}
+
+	public String getUndoDescription() {
+		return title;
+	}
+
+	public void run() {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		if (validateEdit(manager.getModel(), shell)) {
+			manager.beginNodeAction(this);
+			EditElementDialog dialog = new EditElementDialog(shell, element);
+			dialog.create();
+			dialog.getShell().setText(title);
+			dialog.setBlockOnOpen(true);
+			dialog.open();
+	
+			if (dialog.getReturnCode() == Window.OK) {
+				Document document = parent.getNodeType() == Node.DOCUMENT_NODE ? (Document) parent : parent.getOwnerDocument();
+				if (element != null) {
+					// here we need to do a rename... which seems to be quite hard
+					// to do :-(
+					if (element instanceof IDOMElement) {
+						IDOMElement elementImpl = (IDOMElement) element;
+						IDOMModel model = elementImpl.getModel();
+						String oldName = elementImpl.getNodeName();
+						String newName = dialog.getElementName();
+						setStructuredDocumentRegionElementName(model, elementImpl.getStartStructuredDocumentRegion(), oldName, newName);
+						setStructuredDocumentRegionElementName(model, elementImpl.getEndStructuredDocumentRegion(), oldName, newName);
+					}
+				}
+				else {
+					Element newElement = document.createElement(dialog.getElementName());
+					NodeList nodeList = parent.getChildNodes();
+					int nodeListLength = nodeList.getLength();
+					Node refChild = (insertionIndex < nodeListLength) && (insertionIndex >= 0) ? nodeList.item(insertionIndex) : null;
+					parent.insertBefore(newElement, refChild);
+					manager.reformat(newElement, false);
+					manager.setViewerSelection(newElement);
+				}
+			}
+			manager.endNodeAction(this);
+		}
+	}
+
+	protected void setStructuredDocumentRegionElementName(IDOMModel model, IStructuredDocumentRegion flatNode, String oldName, String newName) {
+		if (flatNode != null) {
+			String string = flatNode.getText();
+			int index = string.indexOf(oldName);
+			if (index != -1) {
+				index += flatNode.getStart();
+				model.getStructuredDocument().replaceText(this, index, oldName.length(), newName);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditProcessingInstructionAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditProcessingInstructionAction.java
new file mode 100644
index 0000000..5578cf2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditProcessingInstructionAction.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.dialogs.EditProcessingInstructionDialog;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+
+/**
+ * EditProcessingInstructionAction
+ */
+public class EditProcessingInstructionAction extends NodeAction {
+	protected Node childRef;
+	protected AbstractNodeActionManager manager;
+	protected Node parent;
+	protected ProcessingInstruction pi;
+	protected String title;
+
+	/**
+	 * This constructor is used to add a new ProcessingInstruction
+	 */
+	public EditProcessingInstructionAction(AbstractNodeActionManager manager, Node parent, Node childRef, String actionLabel, String title) {
+		setText(actionLabel);
+		this.manager = manager;
+		this.parent = parent;
+		this.childRef = childRef;
+		this.title = title;
+	}
+
+	/**
+	 * This constructor is used to edit a ProcessingInstruction
+	 */
+	public EditProcessingInstructionAction(AbstractNodeActionManager manager, ProcessingInstruction pi, String actionLabel, String title) {
+		setText(actionLabel);
+		this.manager = manager;
+		this.pi = pi;
+		this.parent = pi.getParentNode();
+		this.title = title;
+	}
+
+	public String getUndoDescription() {
+		return title;
+	}
+
+	public void run() {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		if (validateEdit(manager.getModel(), shell)) {
+			manager.beginNodeAction(this);
+			
+	
+			EditProcessingInstructionDialog dialog = null;
+			if (pi != null) {
+				dialog = new EditProcessingInstructionDialog(shell, pi);
+			}
+			else {
+				dialog = new EditProcessingInstructionDialog(shell, XMLUIMessages._UI_PI_TARGET_VALUE, XMLUIMessages._UI_PI_DATA_VALUE);
+			}
+	
+			dialog.create();
+			dialog.getShell().setText(title);
+			dialog.setBlockOnOpen(true);
+			dialog.open();
+	
+			if (dialog.getReturnCode() == Window.OK) {
+				if (pi != null) {
+					childRef = pi;
+				}
+	
+				Document document = parent.getNodeType() == Node.DOCUMENT_NODE ? (Document) parent : parent.getOwnerDocument();
+				Node newNode = document.createProcessingInstruction(dialog.getTarget(), dialog.getData());
+				parent.insertBefore(newNode, childRef);
+	
+				if (pi != null) {
+					parent.removeChild(pi);
+				}
+	
+				manager.reformat(newNode, false);
+				manager.setViewerSelection(newNode);
+			}
+			manager.endNodeAction(this);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditSchemaInfoAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditSchemaInfoAction.java
new file mode 100644
index 0000000..c07557a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/EditSchemaInfoAction.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceInfoManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.dialogs.EditSchemaInfoDialog;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * EditDoctypeAction
+ */
+public class EditSchemaInfoAction extends NodeAction {
+	protected AbstractNodeActionManager manager;
+	protected DOMNamespaceInfoManager namespaceInfoManager = new DOMNamespaceInfoManager();
+	protected Node node;
+	protected String resourceLocation;
+	protected String title;
+
+	public EditSchemaInfoAction(AbstractNodeActionManager manager, Node node, String resourceLocation, String title) {
+		this.manager = manager;
+		this.node = node;
+		setText(title);
+		this.resourceLocation = resourceLocation;
+		this.title = title;
+	}
+
+	protected Map createPrefixMapping(List oldList, List newList) {
+		Map map = new Hashtable();
+
+		Hashtable oldURIToPrefixTable = new Hashtable();
+		for (Iterator i = oldList.iterator(); i.hasNext();) {
+			NamespaceInfo oldInfo = (NamespaceInfo) i.next();
+			oldURIToPrefixTable.put(oldInfo.uri, oldInfo);
+		}
+
+		for (Iterator i = newList.iterator(); i.hasNext();) {
+			NamespaceInfo newInfo = (NamespaceInfo) i.next();
+			NamespaceInfo oldInfo = (NamespaceInfo) oldURIToPrefixTable.get(newInfo.uri != null ? newInfo.uri : ""); //$NON-NLS-1$
+
+
+			// if oldInfo is non null ... there's a matching URI in the old
+			// set
+			// we can use its prefix to detemine out mapping
+			//
+			// if oldInfo is null ... we use the 'oldCopy' we stashed away
+			// assuming that the user changed the URI and the prefix
+			if (oldInfo == null) {
+				oldInfo = (NamespaceInfo) newInfo.getProperty("oldCopy"); //$NON-NLS-1$
+			}
+
+			if (oldInfo != null) {
+				String newPrefix = newInfo.prefix != null ? newInfo.prefix : ""; //$NON-NLS-1$
+				String oldPrefix = oldInfo.prefix != null ? oldInfo.prefix : ""; //$NON-NLS-1$
+				if (!oldPrefix.equals(newPrefix)) {
+					map.put(oldPrefix, newPrefix);
+				}
+			}
+		}
+		return map;
+	}
+
+	public Element getElement(Node node) {
+		Element result = null;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			result = (Element) node;
+		}
+		else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			result = getRootElement((Document) node);
+		}
+		return result;
+	}
+
+
+	public Element getRootElement(Document document) {
+		Element rootElement = null;
+		NodeList nodeList = document.getChildNodes();
+		int nodeListLength = nodeList.getLength();
+		for (int i = 0; i < nodeListLength; i++) {
+			Node childNode = nodeList.item(i);
+			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
+				rootElement = (Element) childNode;
+				break;
+			}
+		}
+		return rootElement;
+	}
+
+	public String getUndoDescription() {
+		return title;
+	}
+
+	public void run() {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		if (validateEdit(manager.getModel(), shell)) {
+			manager.beginNodeAction(this);
+	
+			// todo... change constructor to take an element
+			Element element = getElement(node);
+			if (element != null) {
+				EditSchemaInfoDialog dialog = new EditSchemaInfoDialog(shell, new Path(resourceLocation));
+	
+				List namespaceInfoList = namespaceInfoManager.getNamespaceInfoList(element);
+				List oldNamespaceInfoList = NamespaceInfo.cloneNamespaceInfoList(namespaceInfoList);
+	
+				// here we store a copy of the old info for each NamespaceInfo
+				// this info will be used in createPrefixMapping() to figure out
+				// how to update the document
+				// in response to these changes
+				for (Iterator i = namespaceInfoList.iterator(); i.hasNext();) {
+					NamespaceInfo info = (NamespaceInfo) i.next();
+					NamespaceInfo oldCopy = new NamespaceInfo(info);
+					info.setProperty("oldCopy", oldCopy); //$NON-NLS-1$
+				}
+	
+				dialog.setNamespaceInfoList(namespaceInfoList);
+				dialog.create();
+				// dialog.getShell().setSize(500, 300);
+				dialog.getShell().setText(XMLUIMessages._UI_MENU_EDIT_SCHEMA_INFORMATION_TITLE);
+				dialog.setBlockOnOpen(true);
+				dialog.open();
+	
+				if (dialog.getReturnCode() == Window.OK) {
+					List newInfoList = dialog.getNamespaceInfoList();
+					namespaceInfoManager.removeNamespaceInfo(element);
+					namespaceInfoManager.addNamespaceInfo(element, newInfoList, false);
+	
+					// see if we need to rename any prefixes
+					Map prefixMapping = createPrefixMapping(oldNamespaceInfoList, namespaceInfoList);
+					if (prefixMapping.size() > 0) {
+						try {
+							manager.getModel().aboutToChangeModel();
+							ReplacePrefixAction replacePrefixAction = new ReplacePrefixAction(manager, element, prefixMapping);
+							replacePrefixAction.run();
+						}
+						finally {
+							manager.getModel().changedModel();
+						}
+					}
+				}
+			}
+			manager.endNodeAction(this);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/GoToMatchingTagAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/GoToMatchingTagAction.java
new file mode 100644
index 0000000..5d7e7a3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/GoToMatchingTagAction.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModelExtension;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextEditorAction;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+/**
+ * Moves the cursor to the end tag if it is in a start tag, and vice versa.
+ * Also updates the matching tag annotation in the active editor.
+ * 
+ * @author nitin
+ * 
+ */
+class GoToMatchingTagAction extends TextEditorAction {
+
+	private class UpdateListener implements ISelectionChangedListener {
+		public void selectionChanged(SelectionChangedEvent event) {
+			updateFor(event.getSelection());
+		}
+	}
+
+	private static final String ANNOTATION_TYPE = "org.eclipse.wst.xml.ui.matching.tag"; //$NON-NLS-1$
+	private ISelectionChangedListener fUpdateListener = null;
+	static final boolean DEBUG = false;
+
+	/**
+	 * @param bundle
+	 * @param prefix
+	 * @param editor
+	 * @param style
+	 */
+	GoToMatchingTagAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+		super(bundle, prefix, editor);
+		fUpdateListener = new UpdateListener();
+	}
+
+	void removeAnnotation(boolean allMatching) {
+		ITextEditor textEditor = getTextEditor();
+		if (textEditor == null) {
+			if (DEBUG) {
+				System.out.println("no editor"); //$NON-NLS-1$
+			}
+			return;
+		}
+		IDocumentProvider documentProvider = textEditor.getDocumentProvider();
+		if (documentProvider == null) {
+			if (DEBUG) {
+				System.out.println("no document provider"); //$NON-NLS-1$
+			}
+			return;
+		}
+		IAnnotationModel annotationModel = documentProvider.getAnnotationModel(textEditor.getEditorInput());
+		if (annotationModel == null) {
+			if (DEBUG) {
+				System.out.println("no annotation model"); //$NON-NLS-1$
+			}
+			return;
+		}
+
+		Iterator annotationIterator = annotationModel.getAnnotationIterator();
+		List oldAnnotations = new ArrayList();
+		while (annotationIterator.hasNext()) {
+			Annotation annotation = (Annotation) annotationIterator.next();
+			if (ANNOTATION_TYPE.equals(annotation.getType())) {
+				annotation.markDeleted(true);
+				/**
+				 * Sometimes it is supported, sometime's it is not. Confusing.
+				 */
+				try {
+					annotationIterator.remove();
+				}
+				catch (UnsupportedOperationException e) {
+					oldAnnotations.add(annotation);
+				}
+				if (DEBUG) {
+					System.out.println("removed " + annotation); //$NON-NLS-1$
+				}
+				if (!allMatching)
+					break;
+			}
+		}
+		if (!oldAnnotations.isEmpty()) {
+			int size = oldAnnotations.size();
+			for (int i = 0; i < size; i++) {
+				annotationModel.removeAnnotation((Annotation) oldAnnotations.get(i));
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event)
+	 */
+	public void runWithEvent(Event event) {
+		super.runWithEvent(event);
+		if (getTextEditor() == null)
+			return;
+
+		ISelection selection = getTextEditor().getSelectionProvider().getSelection();
+		if (!selection.isEmpty() && selection instanceof IStructuredSelection && selection instanceof ITextSelection) {
+			Object o = ((IStructuredSelection) selection).getFirstElement();
+			if (o instanceof IDOMNode) {
+				int offset = ((ITextSelection) selection).getOffset();
+				IStructuredDocumentRegion matchRegion = null;
+				if (((Node) o).getNodeType() == Node.ATTRIBUTE_NODE) {
+					o = ((Attr) o).getOwnerElement();
+				}
+
+				int targetOffset = -1;
+				if (o instanceof IDOMNode) {
+					IDOMNode node = (IDOMNode) o;
+					IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
+					if (startStructuredDocumentRegion != null && startStructuredDocumentRegion.containsOffset(offset)) {
+						matchRegion = ((IDOMNode) o).getEndStructuredDocumentRegion();
+						if (matchRegion != null)
+							targetOffset = matchRegion.getStartOffset() + 2;
+					}
+					else {
+						IStructuredDocumentRegion endStructuredDocumentRegion = node.getEndStructuredDocumentRegion();
+						if (endStructuredDocumentRegion != null && endStructuredDocumentRegion.containsOffset(offset)) {
+							matchRegion = ((IDOMNode) o).getStartStructuredDocumentRegion();
+							if (matchRegion != null)
+								targetOffset = matchRegion.getStartOffset() + 1;
+						}
+					}
+				}
+
+				if (targetOffset >= 0) {
+					getTextEditor().getSelectionProvider().setSelection(new TextSelection(targetOffset, 0));
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.TextEditorAction#setEditor(org.eclipse.ui.texteditor.ITextEditor)
+	 */
+	public void setEditor(ITextEditor editor) {
+		ITextEditor textEditor = getTextEditor();
+		if (textEditor != null) {
+			removeAnnotation(true);
+
+			ISelectionProvider selectionProvider = textEditor.getSelectionProvider();
+			if (selectionProvider instanceof IPostSelectionProvider) {
+				((IPostSelectionProvider) selectionProvider).removePostSelectionChangedListener(fUpdateListener);
+			}
+		}
+		super.setEditor(editor);
+		if (editor != null) {
+			ISelectionProvider selectionProvider = editor.getSelectionProvider();
+			if (selectionProvider instanceof IPostSelectionProvider) {
+				((IPostSelectionProvider) selectionProvider).addPostSelectionChangedListener(fUpdateListener);
+			}
+
+			updateFor(selectionProvider.getSelection());
+		}
+	}
+
+	public void update() {
+		setEnabled(true);
+
+	}
+
+	void updateFor(ISelection selection) {
+		ITextEditor textEditor = getTextEditor();
+		if (textEditor == null) {
+			if (DEBUG) {
+				System.out.println("no editor"); //$NON-NLS-1$
+			}
+			return;
+		}
+		IDocumentProvider documentProvider = textEditor.getDocumentProvider();
+		if (documentProvider == null) {
+			if (DEBUG) {
+				System.out.println("no document provider"); //$NON-NLS-1$
+			}
+			return;
+		}
+		IAnnotationModel annotationModel = documentProvider.getAnnotationModel(textEditor.getEditorInput());
+		if (annotationModel == null || !(annotationModel instanceof IAnnotationModelExtension)) {
+			if (DEBUG) {
+				System.out.println("no annotation model"); //$NON-NLS-1$
+			}
+			return;
+		}
+
+		List oldAnnotations = new ArrayList(2);
+		Iterator annotationIterator = annotationModel.getAnnotationIterator();
+		while (annotationIterator.hasNext()) {
+			Annotation annotation = (Annotation) annotationIterator.next();
+			if (ANNOTATION_TYPE.equals(annotation.getType())) {
+				annotation.markDeleted(true);
+				if (DEBUG) {
+					System.out.println("removing " + annotation); //$NON-NLS-1$
+				}
+				oldAnnotations.add(annotation);
+			}
+		}
+
+		Map newAnnotations = new HashMap();
+		if (!selection.isEmpty() && selection instanceof IStructuredSelection && selection instanceof ITextSelection) {
+			Object o = ((IStructuredSelection) selection).getFirstElement();
+			if (o instanceof IDOMNode) {
+				int offset = ((ITextSelection) selection).getOffset();
+				IStructuredDocumentRegion matchRegion = null;
+				if (((Node) o).getNodeType() == Node.ATTRIBUTE_NODE) {
+					o = ((Attr) o).getOwnerElement();
+				}
+
+				Position pStart = null;
+				Position pEnd = null;
+				String tag = ""; //$NON-NLS-1$
+				if (o instanceof IDOMNode) {
+					IDOMNode node = (IDOMNode) o;
+					IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
+					if (startStructuredDocumentRegion != null && startStructuredDocumentRegion.containsOffset(offset)) {
+						if (startStructuredDocumentRegion.getNumberOfRegions() > 1) {
+							ITextRegion nameRegion = startStructuredDocumentRegion.getRegions().get(1);
+							pStart = new Position(startStructuredDocumentRegion.getStartOffset(nameRegion), nameRegion.getTextLength());
+							tag = startStructuredDocumentRegion.getText(nameRegion);
+						}
+						matchRegion = ((IDOMNode) o).getEndStructuredDocumentRegion();
+						if (matchRegion != null && matchRegion.getNumberOfRegions() > 1) {
+							ITextRegion nameRegion = matchRegion.getRegions().get(1);
+							pEnd = new Position(matchRegion.getStartOffset(nameRegion), nameRegion.getTextLength());
+						}
+					}
+					else {
+						IStructuredDocumentRegion endStructuredDocumentRegion = node.getEndStructuredDocumentRegion();
+						if (endStructuredDocumentRegion != null && endStructuredDocumentRegion.containsOffset(offset)) {
+							if (endStructuredDocumentRegion.getNumberOfRegions() > 1) {
+								ITextRegion nameRegion = endStructuredDocumentRegion.getRegions().get(1);
+								pEnd = new Position(endStructuredDocumentRegion.getStartOffset(nameRegion), nameRegion.getTextLength());
+								tag = endStructuredDocumentRegion.getText(nameRegion);
+							}
+							matchRegion = ((IDOMNode) o).getStartStructuredDocumentRegion();
+							if (matchRegion != null && matchRegion.getNumberOfRegions() > 1) {
+								ITextRegion nameRegion = matchRegion.getRegions().get(1);
+								pStart = new Position(matchRegion.getStartOffset(nameRegion), nameRegion.getTextLength());
+							}
+						}
+					}
+				}
+				if (pStart != null && pEnd != null) {
+					Annotation annotation = new Annotation(ANNOTATION_TYPE, false, NLS.bind(XMLUIMessages.gotoMatchingTag_start, tag));
+					newAnnotations.put(annotation, pStart);
+					if (DEBUG) {
+						System.out.println("adding " + annotation); //$NON-NLS-1$
+					}
+					annotation = new Annotation(ANNOTATION_TYPE, false, NLS.bind(XMLUIMessages.gotoMatchingTag_end, tag));
+					newAnnotations.put(annotation, pEnd);
+					if (DEBUG) {
+						System.out.println("adding " + annotation); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+		((IAnnotationModelExtension) annotationModel).replaceAnnotations((Annotation[]) oldAnnotations.toArray(new Annotation[oldAnnotations.size()]), newAnnotations);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/MenuBuilder.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/MenuBuilder.java
new file mode 100644
index 0000000..78f3ceb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/MenuBuilder.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import com.ibm.icu.text.Collator;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+
+
+public class MenuBuilder {
+
+
+	protected Comparator comparator = new Comparator() {
+
+		public int compare(Object o1, Object o2) {
+			return Collator.getInstance().compare(getSortKey(o1), getSortKey(o2));
+		}
+
+		protected String getSortKey(Object o) {
+			String result = ""; //$NON-NLS-1$
+			if (o instanceof IAction) {
+				IAction action = (IAction) o;
+				result = action.getText();
+			}
+			// else if (o instanceof MenuData)
+			// {
+			// result = "z" + ((MenuData)o).name;
+			// }
+			return result;
+		}
+	};
+
+
+	protected void createAlphebeticalGrouping(IMenuManager menu, List actionList) {
+		Object[] array = actionList.toArray();
+		if (array.length > 0) {
+			Arrays.sort(array, comparator);
+		}
+
+		int groupSize = 15;
+		int minGroupSize = 5;
+		int numberOfGroups = (array.length / groupSize) + ((array.length % groupSize > minGroupSize) ? 1 : 0);
+
+		for (int i = 0; i < numberOfGroups; i++) {
+			boolean isLastGroup = (i == (numberOfGroups - 1));
+			int firstIndex = i * groupSize;
+			int lastIndex = isLastGroup ? array.length - 1 : i * groupSize + groupSize - 1;
+			Action firstAction = (Action) array[firstIndex];
+			Action lastAction = (Action) array[lastIndex];
+			MenuManager submenu = new MenuManager(firstAction.getText() + " - " + lastAction.getText()); //$NON-NLS-1$
+			menu.add(submenu);
+			for (int j = firstIndex; j <= lastIndex; j++) {
+				submenu.add((Action) array[j]);
+			}
+		}
+	}
+
+
+	public void populateMenu(IMenuManager menu, List actionList, boolean createTiered) {
+		// sort the actions
+		if (actionList.size() < 25) {
+			Object[] array = actionList.toArray();
+			if (array.length > 0) {
+				Arrays.sort(array, comparator);
+			}
+			for (int i = 0; i < array.length; i++) {
+				menu.add((Action) array[i]);
+			}
+		}
+		else {
+			createAlphebeticalGrouping(menu, actionList);
+		}
+	}
+
+	/*
+	 * protected void createPropertyGrouping(IMenuManager menu, List
+	 * actionList) { MenuDataTable menuDataTable = new MenuDataTable();
+	 * 
+	 * for (Iterator i = actionList.iterator(); i.hasNext(); ) { String
+	 * groupName = null; Action action = (Action)i.next(); if (action
+	 * instanceof NodeAction) { groupName =
+	 * ((NodeAction)action).getGroupName(); } if (groupName == null) {
+	 * groupName = ""; } MenuData menuData =
+	 * menuDataTable.lookupOrCreate(groupName, "");
+	 * menuData.childList.add(action); } populateMenu(menu,
+	 * menuDataTable.getRoot()); }
+	 * 
+	 * 
+	 * protected void populateMenu(MenuManager menuManager, MenuData menuData) {
+	 * for (Iterator i = menuData.childList.iterator(); i.hasNext(); ) {
+	 * Object o = i.next(); if (o instanceof Action) {
+	 * menuManager.add((Action)o); } else if (o instanceof MenuData) {
+	 * MenuData childMenuData = (MenuData)o; MenuManager childMenuManager =
+	 * new MenuManager(childMenuData.name); menuManager.add(childMenuManager);
+	 * populateMenu(childMenuManager, childMenuData); } } }
+	 * 
+	 * 
+	 * public MenuDataTable { protected Hashtable table = new Hashtable();
+	 * protected MenuData root;
+	 * 
+	 * public MenuDataTable() { root = lookupOrCreateMenuData(null, null); }
+	 * 
+	 * protected MenuData lookupMenuData(String name) { String key = name !=
+	 * null ? name : ""; return (MenuData)menuDataTable.get(key); }
+	 * 
+	 * protected MenuData lookupOrCreateMenuData(String name, String
+	 * parentName) { String key = name != null ? name : ""; MenuData menuData =
+	 * (MenuData)menuDataTable.get(key); if (menuData == null) { menuData =
+	 * new MenuData(name, parentName); menuDataTable.put(key, menuData); }
+	 * return menuData; }
+	 * 
+	 * public MenuData getRoot() { return root; } }
+	 * 
+	 * 
+	 * protected class MenuData { public String name; public String
+	 * parentName; public List childList = new Vector();
+	 * 
+	 * MenuData(String name, String parentName) { this.name = name;
+	 * this.parentName = parentName; }
+	 * 
+	 * protected void sort() { Object[] array = childList.toArray(); if
+	 * (array.length > 0 ) { Arrays.sort(array, comparator); } childList =
+	 * Arrays.asList(array);
+	 * 
+	 * for (Iterator i = childList.iterator(); i.hasNext(); ) { Object o =
+	 * i.next(); if (o instanceof MenuData) { ((MenuData)o).sort(); } } } }
+	 */
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/NodeAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/NodeAction.java
new file mode 100644
index 0000000..1ce764a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/NodeAction.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.Action;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+
+public abstract class NodeAction extends Action {
+
+	public String getSortKey() {
+		return null;
+	}
+
+	/**
+	 * Checks that the resource backing the model is writeable utilizing <code>validateEdit</code>
+	 * on a given <tt>IWorkspace</tt>.
+	 * 
+	 * @param model the model to be checked
+	 * @param context the shell context for which <code>validateEdit</code> will be run
+	 * @return boolean result of checking <code>validateEdit</code>. If the resource is unwriteable, <code>status.isOK()</code>
+	 * will return true; otherwise, false.
+	 */
+	protected final boolean validateEdit(IStructuredModel model, Shell context) {
+		if (model != null && model.getBaseLocation() != null) {
+			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(model.getBaseLocation()));
+			return !file.isAccessible() || ResourcesPlugin.getWorkspace().validateEdit(new IFile[] {file}, context).isOK();
+		}
+		return false; //$NON-NLS-1$
+	}
+
+	public abstract String getUndoDescription();
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/RemoveBlockCommentActionXMLDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/RemoveBlockCommentActionXMLDelegate.java
new file mode 100644
index 0000000..473e5f2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/RemoveBlockCommentActionXMLDelegate.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.xml.core.internal.document.CommentImpl;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * Remove block comment action delegate for XML editor
+ */
+public class RemoveBlockCommentActionXMLDelegate extends AbstractCommentActionXMLDelegate {
+
+	void processAction(IDocument document, ITextSelection textSelection) {
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+		if (model != null) {
+			try {
+				IndexedRegion selectionStartIndexedRegion = model.getIndexedRegion(textSelection.getOffset());
+				IndexedRegion selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength());
+
+				if ((selectionStartIndexedRegion == null) || (selectionEndIndexedRegion == null)) {
+					return;
+				}
+
+				int openCommentOffset = selectionStartIndexedRegion.getStartOffset();
+				int closeCommentOffset = selectionEndIndexedRegion.getEndOffset() - OPEN_COMMENT.length() - CLOSE_COMMENT.length();
+
+				model.beginRecording(this, XMLUIMessages.RemoveBlockComment_tooltip);
+				model.aboutToChangeModel();
+
+				try {
+					if (textSelection.getLength() == 0) {
+						if (selectionStartIndexedRegion instanceof CommentImpl) {
+							document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+							document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+						}
+					}
+					else {
+						if (selectionStartIndexedRegion instanceof CommentImpl) {
+							document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+						}
+
+						if (selectionEndIndexedRegion instanceof CommentImpl) {
+							document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+						}
+					}
+					removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length());
+				}
+				catch (BadLocationException e) {
+					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+				}
+				finally {
+					model.changedModel();
+					model.endRecording(this);
+				}
+			}
+			finally {
+				model.releaseFromEdit();
+			}
+		}
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(XMLUIMessages.RemoveBlockComment_label);
+			action.setToolTipText(XMLUIMessages.RemoveBlockComment_tooltip);
+			action.setDescription(XMLUIMessages.RemoveBlockComment_description);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ReplacePrefixAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ReplacePrefixAction.java
new file mode 100644
index 0000000..18599bd
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ReplacePrefixAction.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMVisitor;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+
+public class ReplacePrefixAction extends NodeAction {
+
+	class NodeCollectingDOMVisitor extends DOMVisitor {
+		public List list = new Vector();
+
+		protected boolean isPrefixChangedNeeded(Node node) {
+			String key = node.getPrefix() != null ? node.getPrefix() : ""; //$NON-NLS-1$
+			return prefixMapping.get(key) != null;
+		}
+
+		public void visitAttr(Attr attr) {
+			/*
+			 * if (isPrefixChangedNeeded(element)) { list.add(attr); }
+			 */
+		}
+
+		protected void visitElement(Element element) {
+			super.visitElement(element);
+			if (isPrefixChangedNeeded(element)) {
+				list.add(element);
+			}
+		}
+	}
+
+	protected static ImageDescriptor imageDescriptor;
+	protected Element element;
+	protected AbstractNodeActionManager manager;
+	protected Map prefixMapping;
+
+	public ReplacePrefixAction(AbstractNodeActionManager manager, Element element, Map prefixMapping) {
+		this.manager = manager;
+		this.element = element;
+		this.prefixMapping = prefixMapping;
+	}
+
+	public String getUndoDescription() {
+		return ""; //$NON-NLS-1$
+	}
+
+	public void run() {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		if (validateEdit(manager.getModel(), shell)) {
+			NodeCollectingDOMVisitor visitor = new NodeCollectingDOMVisitor();
+			visitor.visitNode(element);
+			for (Iterator i = visitor.list.iterator(); i.hasNext();) {
+				Node node = (Node) i.next();
+				String key = node.getPrefix() != null ? node.getPrefix() : ""; //$NON-NLS-1$
+				String newPrefix = (String) prefixMapping.get(key);
+				if (newPrefix != null) {
+					node.setPrefix(newPrefix);
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/SiblingNavigationAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/SiblingNavigationAction.java
new file mode 100644
index 0000000..a08b44f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/SiblingNavigationAction.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextEditorAction;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+/**
+ * Provides navigation to next/previous DOM sibling Nodes
+ * 
+ * @author nitin
+ * 
+ */
+class SiblingNavigationAction extends TextEditorAction {
+
+	private boolean fForward;
+
+	/**
+	 * @param bundle
+	 * @param prefix
+	 * @param editor
+	 */
+	SiblingNavigationAction(ResourceBundle bundle, String prefix, ITextEditor editor, boolean forward) {
+		super(bundle, prefix, editor);
+		fForward = forward;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event)
+	 */
+	public void runWithEvent(Event event) {
+		super.runWithEvent(event);
+		if (getTextEditor() == null)
+			return;
+
+		ISelection selection = getTextEditor().getSelectionProvider().getSelection();
+		if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
+			Object o = ((IStructuredSelection) selection).getFirstElement();
+			if (o instanceof Node) {
+				Node sibling = null;
+
+				if (((Node) o).getNodeType() == Node.ATTRIBUTE_NODE) {
+					o = ((Attr) o).getOwnerElement();
+				}
+				if (fForward) {
+					sibling = ((Node) o).getNextSibling();
+					while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+						sibling = sibling.getNextSibling();
+					}
+					if (sibling == null) {
+						sibling = ((Node) o).getParentNode().getFirstChild();
+						while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+							sibling = sibling.getNextSibling();
+						}
+					}
+				}
+				else {
+					sibling = ((Node) o).getPreviousSibling();
+					while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+						sibling = sibling.getPreviousSibling();
+					}
+					if (sibling == null) {
+						sibling = ((Node) o).getParentNode().getLastChild();
+						while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+							sibling = sibling.getPreviousSibling();
+						}
+					}
+				}
+
+				// The only child is a Text Node, go to the parent Node
+				if (((Node) o).getNodeType() == Node.TEXT_NODE && o.equals(sibling)) {
+					sibling = ((Node) o).getParentNode();
+				}
+
+
+				if (sibling != null) {
+					getTextEditor().getSelectionProvider().setSelection(new StructuredSelection(sibling));
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.TextEditorAction#update()
+	 */
+	public void update() {
+
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ToggleCommentActionXMLDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ToggleCommentActionXMLDelegate.java
new file mode 100644
index 0000000..09d81d1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/ToggleCommentActionXMLDelegate.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * Toggle comment action delegate for XML editor
+ */
+public class ToggleCommentActionXMLDelegate extends AbstractCommentActionXMLDelegate {
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(XMLUIMessages.ToggleComment_label);
+			action.setToolTipText(XMLUIMessages.ToggleComment_tooltip);
+			action.setDescription(XMLUIMessages.ToggleComment_description);
+		}
+	}
+
+	void processAction(IDocument document, ITextSelection textSelection) {
+		// get text selection lines info
+		int selectionStartLine = textSelection.getStartLine();
+		int selectionEndLine = textSelection.getEndLine();
+		try {
+			int selectionEndLineOffset = document.getLineOffset(selectionEndLine);
+			int selectionEndOffset = textSelection.getOffset() + textSelection.getLength();
+
+			// adjust selection end line
+			if ((selectionEndLine > selectionStartLine) && (selectionEndLineOffset == selectionEndOffset)) {
+				selectionEndLine--;
+			}
+
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+
+		// save the selection position since it will be changing
+		Position selectionPosition = null;
+		boolean updateStartOffset = false;
+		try {
+			selectionPosition = new Position(textSelection.getOffset(), textSelection.getLength());
+			document.addPosition(selectionPosition);
+
+			// extra check if commenting from beginning of line
+			int selectionStartLineOffset = document.getLineOffset(selectionStartLine);
+			if ((textSelection.getLength() > 0) && (selectionStartLineOffset == textSelection.getOffset()) && !isCommentLine(document, selectionStartLine)) {
+				updateStartOffset = true;
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+
+		processAction(document, selectionStartLine, selectionEndLine);
+
+		updateCurrentSelection(selectionPosition, document, updateStartOffset);
+	}
+
+	private void processAction(IDocument document, int selectionStartLine, int selectionEndLine) {
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+		if (model != null) {
+			try {
+				model.beginRecording(this, XMLUIMessages.ToggleComment_tooltip);
+				model.aboutToChangeModel();
+
+				for (int i = selectionStartLine; i <= selectionEndLine; i++) {
+					try {
+						if (document.getLineLength(i) > 0) {
+							if (isCommentLine(document, i)) {
+								int lineOffset = document.getLineOffset(i);
+								IRegion region = document.getLineInformation(i);
+								String string = document.get(region.getOffset(), region.getLength());
+								int openCommentOffset = lineOffset + string.indexOf(OPEN_COMMENT);
+								int closeCommentOffset = lineOffset + string.indexOf(CLOSE_COMMENT) - OPEN_COMMENT.length();
+								uncomment(document, openCommentOffset, closeCommentOffset);
+							}
+							else {
+								int openCommentOffset = document.getLineOffset(i);
+								int lineDelimiterLength = document.getLineDelimiter(i) == null ? 0 : document.getLineDelimiter(i).length();
+								int closeCommentOffset = openCommentOffset + document.getLineLength(i) - lineDelimiterLength + OPEN_COMMENT.length();
+								comment(document, openCommentOffset, closeCommentOffset);
+							}
+						}
+					}
+					catch (BadLocationException e) {
+						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+					}
+				}
+			}
+			finally {
+				model.changedModel();
+				model.endRecording(this);
+				model.releaseFromEdit();
+			}
+		}
+	}
+
+	private boolean isCommentLine(IDocument document, int line) {
+		boolean isComment = false;
+
+		try {
+			IRegion region = document.getLineInformation(line);
+			String string = document.get(region.getOffset(), region.getLength()).trim();
+			isComment = (string.length() >= OPEN_COMMENT.length() + CLOSE_COMMENT.length()) && string.startsWith(OPEN_COMMENT) && string.endsWith(CLOSE_COMMENT);
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+		return isComment;
+	}
+
+	private void comment(IDocument document, int openCommentOffset, int closeCommentOffset) {
+		try {
+			document.replace(openCommentOffset, 0, OPEN_COMMENT);
+			document.replace(closeCommentOffset, 0, CLOSE_COMMENT);
+			removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length());
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+
+	private void uncomment(IDocument document, int openCommentOffset, int closeCommentOffset) {
+		try {
+			document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+			document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+
+	private void updateCurrentSelection(Position selectionPosition, IDocument document, boolean updateStartOffset) {
+		if (fEditor instanceof ITextEditor) {
+			// update the selection if text selection changed
+			if (selectionPosition != null) {
+				ITextSelection selection = null;
+				if (updateStartOffset) {
+					selection = new TextSelection(document, selectionPosition.getOffset() - OPEN_COMMENT.length(), selectionPosition.getLength() + OPEN_COMMENT.length());
+				}
+				else {
+					selection = new TextSelection(document, selectionPosition.getOffset(), selectionPosition.getLength());
+				}
+				ISelectionProvider provider = ((ITextEditor) fEditor).getSelectionProvider();
+				if (provider != null) {
+					provider.setSelection(selection);
+				}
+				document.removePosition(selectionPosition);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/autoedit/AutoEditStrategyForTabs.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/autoedit/AutoEditStrategyForTabs.java
new file mode 100644
index 0000000..1b416cc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/autoedit/AutoEditStrategyForTabs.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.autoedit;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.ConfigurableLineTracker;
+import org.eclipse.jface.text.DocumentCommand;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ILineTracker;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension3;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.ui.internal.Logger;
+
+/**
+ * AutoEditStrategy to handle characters inserted when Tab key is pressed
+ */
+public class AutoEditStrategyForTabs implements IAutoEditStrategy {
+	private final String TAB_CHARACTER = "\t"; //$NON-NLS-1$
+
+	public void customizeDocumentCommand(IDocument document, DocumentCommand command) {
+		// if not in smart insert mode just ignore
+		if (!isSmartInsertMode()) {
+			return;
+		}
+
+		// spaces for tab character
+		if ((command.length == 0) && (command.text != null) && (command.text.length() > 0) && (command.text.indexOf(TAB_CHARACTER) != -1)) {
+			smartInsertForTab(command, document);
+		}
+	}
+
+	/**
+	 * Insert spaces for tabs
+	 * 
+	 * @param command
+	 */
+	private void smartInsertForTab(DocumentCommand command, IDocument document) {
+		// tab key was pressed. now check preferences to see if need to insert
+		// spaces instead of tab
+		int indentationWidth = getIndentationWidth();
+		if (indentationWidth > -1) {
+			String originalText = command.text;
+			StringBuffer newText = new StringBuffer(originalText);
+
+			// determine where in line this command begins
+			int lineOffset = -1;
+			try {
+				IRegion lineInfo = document.getLineInformationOfOffset(command.offset);
+				lineOffset = command.offset - lineInfo.getOffset();
+			}
+			catch (BadLocationException e) {
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			}
+
+			ILineTracker lineTracker = getLineTracker(document, originalText);
+
+			int startIndex = 0;
+			int index = newText.indexOf(TAB_CHARACTER);
+			while (index != -1) {
+				String indent = getIndentString(indentationWidth, lineOffset, lineTracker, index);
+
+				// replace \t character with spaces
+				newText.replace(index, index + 1, indent);
+				if (lineTracker != null) {
+					try {
+						lineTracker.replace(index, 1, indent);
+					}
+					catch (BadLocationException e) {
+						// if something goes wrong with replacing text, just
+						// reset to current string
+						lineTracker.set(newText.toString());
+						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+					}
+				}
+
+				startIndex = index + indent.length();
+				index = newText.indexOf(TAB_CHARACTER, startIndex);
+			}
+			command.text = newText.toString();
+		}
+	}
+
+	/**
+	 * Calculate number of spaces for next tab stop
+	 */
+	private String getIndentString(int indentationWidth, int lineOffset, ILineTracker lineTracker, int index) {
+		int indentSize = indentationWidth;
+		int offsetInLine = -1;
+		if (lineTracker != null) {
+			try {
+				IRegion lineInfo = lineTracker.getLineInformationOfOffset(index);
+				if ((lineInfo.getOffset() == 0) && (lineOffset > -1)) {
+					offsetInLine = lineOffset + index;
+				}
+				else {
+					offsetInLine = index - lineInfo.getOffset();
+				}
+			}
+			catch (BadLocationException e) {
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			}
+		}
+		else {
+			if (lineOffset > -1) {
+				offsetInLine = lineOffset + index;
+			}
+		}
+		if ((offsetInLine > -1) && (indentationWidth > 0)) {
+			int remainder = offsetInLine % indentationWidth;
+			indentSize = indentationWidth - remainder;
+		}
+
+		StringBuffer indent = new StringBuffer();
+		for (int i = 0; i < indentSize; i++) {
+			indent.append(' ');
+		}
+		return indent.toString();
+	}
+
+	/**
+	 * Set up a line tracker for text within command if text is multi-line
+	 */
+	private ILineTracker getLineTracker(IDocument document, String originalText) {
+		ConfigurableLineTracker lineTracker = null;
+		int[] delims = TextUtilities.indexOf(document.getLegalLineDelimiters(), originalText, 0);
+		if ((delims[0] != -1) || (delims[1] != -1)) {
+			lineTracker = new ConfigurableLineTracker(document.getLegalLineDelimiters());
+			lineTracker.set(originalText);
+		}
+		return lineTracker;
+	}
+
+	/**
+	 * Return true if active editor is in smart insert mode, false otherwise
+	 * 
+	 * @return boolean
+	 */
+	private boolean isSmartInsertMode() {
+		boolean isSmartInsertMode = false;
+
+		ITextEditor textEditor = null;
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (window != null) {
+			IWorkbenchPage page = window.getActivePage();
+			if (page != null) {
+				IEditorPart editor = page.getActiveEditor();
+				if (editor != null) {
+					if (editor instanceof ITextEditor) {
+						textEditor = (ITextEditor) editor;
+					}
+					else {
+						textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);
+					}
+				}
+			}
+		}
+
+		// check if smart insert mode
+		if ((textEditor instanceof ITextEditorExtension3) && (((ITextEditorExtension3) textEditor).getInsertMode() == ITextEditorExtension3.SMART_INSERT)) {
+			isSmartInsertMode = true;
+		}
+		return isSmartInsertMode;
+	}
+
+	/**
+	 * Returns indentation width if using spaces for indentation, -1 otherwise
+	 * 
+	 * @return int
+	 */
+	private int getIndentationWidth() {
+		int width = -1;
+
+		Preferences preferences = XMLCorePlugin.getDefault().getPluginPreferences();
+		if (XMLCorePreferenceNames.SPACE.equals(preferences.getString(XMLCorePreferenceNames.INDENTATION_CHAR))) {
+			width = preferences.getInt(XMLCorePreferenceNames.INDENTATION_SIZE);
+		}
+
+		return width;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/autoedit/StructuredAutoEditStrategyXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/autoedit/StructuredAutoEditStrategyXML.java
new file mode 100644
index 0000000..3dc10be
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/autoedit/StructuredAutoEditStrategyXML.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.autoedit;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentCommand;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension3;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+import org.w3c.dom.Node;
+
+/**
+ * Automatically inserts closing comment tag or end tag when appropriate.
+ */
+public class StructuredAutoEditStrategyXML implements IAutoEditStrategy {
+	/*
+	 * NOTE: copies of this class exists in
+	 * org.eclipse.wst.xml.ui.internal.autoedit
+	 * org.eclipse.wst.html.ui.internal.autoedit
+	 */
+	public void customizeDocumentCommand(IDocument document, DocumentCommand command) {
+		Object textEditor = getActiveTextEditor();
+		if (!((textEditor instanceof ITextEditorExtension3) && (((ITextEditorExtension3) textEditor).getInsertMode() == ITextEditorExtension3.SMART_INSERT))) {
+			return;
+		}
+
+		IStructuredModel model = null;
+		try {
+			model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+			if (model != null) {
+				if (command.text != null) {
+					smartInsertCloseElement(command, document, model);
+					smartInsertForComment(command, document, model);
+					smartInsertForEndTag(command, document, model);
+					smartRemoveEndTag(command, document, model);
+				}
+			}
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+	}
+
+	private boolean isPreferenceEnabled(String key) {
+		return (key != null && XMLUIPlugin.getDefault().getPreferenceStore().getBoolean(key));
+	}
+
+	private boolean isCommentNode(IDOMNode node) {
+		return ((node != null) && (node instanceof IDOMElement) && ((IDOMElement) node).isCommentTag());
+	}
+
+	private boolean isDocumentNode(IDOMNode node) {
+		return ((node != null) && (node.getNodeType() == Node.DOCUMENT_NODE));
+	}
+
+	/**
+	 * Attempts to clean up an end-tag if a start-tag is converted into an empty-element
+	 * tag (e.g., <node />) and the original element was empty.
+	 * 
+	 * @param command the document command describing the change
+	 * @param document the document that will be changed
+	 * @param model the model based on the document
+	 */
+	private void smartRemoveEndTag(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			// An opening tag is now a self-terminated end-tag
+			if ("/".equals(command.text) && ">".equals(document.get(command.offset, 1)) && command.length == 0 && isPreferenceEnabled(XMLUIPreferenceNames.TYPING_REMOVE_END_TAGS)) { //$NON-NLS-1$ //$NON-NLS-2$
+				IDOMNode node = (IDOMNode) model.getIndexedRegion(command.offset);
+				if (node != null && !node.hasChildNodes()) {
+					IStructuredDocumentRegion region = node.getFirstStructuredDocumentRegion();
+					if(region.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN && command.offset <= region.getEnd()) {
+						
+						/* if the region before the command offset is a an attribute value region
+						 * check to see if it has both and opening and closing quote
+						 */
+						ITextRegion prevTextRegion = region.getRegionAtCharacterOffset(command.offset-1);
+						boolean inUnclosedAttValueRegion = false;
+						if(prevTextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+							//get the text of the attribute value region
+							String prevText = region.getText(prevTextRegion);
+							inUnclosedAttValueRegion = (prevText.startsWith("'") && ((prevText.length() == 1) || !prevText.endsWith("'"))) ||
+								(prevText.startsWith("\"") && ((prevText.length() == 1) || !prevText.endsWith("\"")));
+						} 
+						//if command offset is in an unclosed attribute value region then done remove the end tag
+						if(!inUnclosedAttValueRegion) {
+							region = node.getEndStructuredDocumentRegion();
+							if (region != null && region.isEnded()) {
+								document.replace(region.getStartOffset(), region.getLength(), ""); //$NON-NLS-1$
+							}
+						}
+					}
+				}
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+	}
+
+	private void smartInsertForComment(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			if (command.text.equals("-") && (document.getLength() >= 3) && document.get(command.offset - 3, 3).equals("<!-") && isPreferenceEnabled(XMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS)) { //$NON-NLS-1$ //$NON-NLS-2$
+				command.text += "  -->"; //$NON-NLS-1$
+				command.shiftsCaret = false;
+				command.caretOffset = command.offset + 2;
+				command.doit = false;
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+
+	}
+	
+	/**
+	 * Attempts to insert the end tag when completing a start-tag with the '&gt;' character.
+	 * 
+	 * @param command
+	 * @param document
+	 * @param model
+	 */
+	private void smartInsertCloseElement(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			// Check terminating start tag, but ignore empty-element tags
+			if (command.text.equals(">") && document.getLength() > 0 && document.getChar(command.offset - 1) != '/' && isPreferenceEnabled(XMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS)) { //$NON-NLS-1$
+				IDOMNode node = (IDOMNode) model.getIndexedRegion(command.offset - 1);
+				boolean isClosedByParent = false;
+				// Only insert an end-tag if necessary. Because of the way the document is parsed, it is possible for a child tag with the same
+				// name as an ancestor to be paired with the end-tag of an ancestor, so the ancestors must be checked for an unclosed tag.
+				if (node != null && node.getNodeType() == Node.ELEMENT_NODE && (!node.isClosed() || (isClosedByParent = hasUnclosedAncestor(node)))) {
+					IStructuredDocumentRegion region = node.getEndStructuredDocumentRegion();
+					if (region != null && region.getRegions().size() > 0 && region.getRegions().get(0).getType() == DOMRegionContext.XML_END_TAG_OPEN && !isClosedByParent)
+						return;
+					command.text += "</" + getElementName(node, command.offset) + ">"; //$NON-NLS-1$ //$NON-NLS-2$
+					command.shiftsCaret = false;
+					command.caretOffset = command.offset + 1;
+				}
+				
+			}
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Get the element name that will be created by closing the start tag. Defaults
+	 * to the node's nodeName.
+	 * @param node the node that is being edited
+	 * @param offset the offset in the document where the start tag is closed
+	 * @return The element name of the tag
+	 */
+	private String getElementName(IDOMNode node, int offset) {
+		String name = null;
+		
+		IStructuredDocumentRegion region = node.getFirstStructuredDocumentRegion();
+		ITextRegion textRegion = region.getRegionAtCharacterOffset(offset);
+		if (textRegion != null && textRegion.getType() == DOMRegionContext.XML_TAG_NAME) {
+			int nameStart = region.getStartOffset(textRegion);
+			String regionText = region.getText(textRegion);
+			int length = offset - nameStart;
+			if (length <= regionText.length())
+				name = regionText.substring(0, length);
+		}
+		
+		// Default to the node name
+		if (name == null)
+			name = node.getNodeName();
+		return name;
+	}
+
+	private void smartInsertForEndTag(DocumentCommand command, IDocument document, IStructuredModel model) {
+		try {
+			if (command.text.equals("/") && (document.getLength() >= 1) && document.get(command.offset - 1, 1).equals("<") && isPreferenceEnabled(XMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS)) { //$NON-NLS-1$ //$NON-NLS-2$
+				IDOMNode parentNode = (IDOMNode) ((IDOMNode) model.getIndexedRegion(command.offset - 1)).getParentNode();
+				if (isCommentNode(parentNode)) {
+					// loop and find non comment node parent
+					while ((parentNode != null) && isCommentNode(parentNode)) {
+						parentNode = (IDOMNode) parentNode.getParentNode();
+					}
+				}
+
+				if (!isDocumentNode(parentNode)) {
+					// only add end tag if one does not already exist or if
+					// add '/' does not create one already
+					IStructuredDocumentRegion endTagStructuredDocumentRegion = parentNode.getEndStructuredDocumentRegion();
+					IDOMNode ancestor = parentNode;
+					boolean smartInsertForEnd = false;
+					if(endTagStructuredDocumentRegion != null) {
+						// Look for ancestors by the same name that are missing end tags
+						while((ancestor = (IDOMNode) ancestor.getParentNode()) != null) {
+							if(ancestor.getEndStructuredDocumentRegion() == null && parentNode.getNodeName().equals(ancestor.getNodeName())) {
+								smartInsertForEnd = true;
+								break;
+							}
+						}
+					}
+					if (endTagStructuredDocumentRegion == null || smartInsertForEnd) {
+						StringBuffer toAdd = new StringBuffer(parentNode.getNodeName());
+						if (toAdd.length() > 0) {
+							toAdd.append(">"); //$NON-NLS-1$
+							String suffix = toAdd.toString();
+							if ((document.getLength() < command.offset + suffix.length()) || (!suffix.equals(document.get(command.offset, suffix.length())))) {
+								command.text += suffix;
+							}
+						}
+					}
+				}
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+	}
+	
+	/**
+	 * Checks if <code>node</code> has an unclosed ancestor by the same name
+	 * 
+	 * @param node the node to check
+	 * @return true if <code>node</code> has an unclosed parent with the same node name
+	 */
+	private boolean hasUnclosedAncestor(IDOMNode node) {
+		IDOMNode parent = (IDOMNode) node.getParentNode();
+		while (parent != null && parent.getNodeType() != Node.DOCUMENT_NODE && parent.getNodeName().equals(node.getNodeName())) {
+			if (!parent.isClosed())
+				return true;
+			parent = (IDOMNode) parent.getParentNode();
+		}
+		return false;
+	}
+
+	/**
+	 * Return the active text editor if possible, otherwise the active editor
+	 * part.
+	 * 
+	 * @return Object
+	 */
+	private Object getActiveTextEditor() {
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (window != null) {
+			IWorkbenchPage page = window.getActivePage();
+			if (page != null) {
+				IEditorPart editor = page.getActiveEditor();
+				if (editor != null) {
+					if (editor instanceof ITextEditor) {
+						return editor;
+					}
+					ITextEditor textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);
+					if (textEditor != null) {
+						return textEditor;
+					}
+					return editor;
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
new file mode 100644
index 0000000..c103fbf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
@@ -0,0 +1,2509 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.encoding.ContentTypeEncodingPreferences;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer;
+import org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMEntityDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryAction;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
+import org.eclipse.wst.xml.core.internal.document.AttrImpl;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.CMImageUtil;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @deprecated This class is no longer used locally and will be removed in the future.
+ * Implementers of this class should now use the <code>org.eclipse.wst.sse.ui.completionProposal</code>
+ * extension point in conjunction with the {@link ICompletionProposalComputer} interface.
+ * 
+ * @see StructuredContentAssistProcessor
+ */
+abstract public class AbstractContentAssistProcessor implements IContentAssistProcessor, IReleasable {
+	/**
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	private class DOMJSPRegionContextsPrivateCopy {
+		private static final String JSP_CLOSE = "JSP_CLOSE"; //$NON-NLS-1$
+		private static final String JSP_COMMENT_CLOSE = "JSP_COMMENT_CLOSE"; //$NON-NLS-1$
+
+		private static final String JSP_COMMENT_OPEN = "JSP_COMMENT_OPEN"; //$NON-NLS-1$
+		private static final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$
+		private static final String JSP_DIRECTIVE_CLOSE = "JSP_DIRECTIVE_CLOSE"; //$NON-NLS-1$
+		private static final String JSP_DIRECTIVE_NAME = "JSP_DIRECTIVE_NAME"; //$NON-NLS-1$
+
+		private static final String JSP_DIRECTIVE_OPEN = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$
+		private static final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$NON-NLS-1$
+
+		private static final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$
+
+		private static final String JSP_SCRIPTLET_OPEN = "JSP_SCRIPTLET_OPEN"; //$NON-NLS-1$
+
+	}
+
+	protected static final String INTERNALERROR = XMLUIMessages.SEVERE_internal_error_occu_UI_;
+	protected static final String UNKNOWN_ATTR = XMLUIMessages.No_known_attribute__UI_;
+	protected static final String UNKNOWN_CONTEXT = XMLUIMessages.Content_Assist_not_availab_UI_;
+	protected char completionProposalAutoActivationCharacters[] = null;
+	protected char contextInformationAutoActivationCharacters[] = null;
+	private AttributeContextInformationPresenter fContextInformationPresenter = null;
+
+	protected String fErrorMessage = null;
+	protected XMLContentModelGenerator fGenerator;
+	// protected IResource resource = null;
+	protected MarkupTagInfoProvider fInfoProvider = null;
+	protected ITextViewer fTextViewer = null;
+
+	private final boolean showValues = true;
+
+	public AbstractContentAssistProcessor() {
+		init();
+	}
+
+	protected void addAttributeNameProposals(ContentAssistRequest contentAssistRequest) {
+		IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
+		IStructuredDocumentRegion sdRegion = contentAssistRequest.getDocumentRegion();
+		// retrieve the list of attributes
+		CMElementDeclaration elementDecl = getCMElementDeclaration(node);
+		if (elementDecl != null) {
+			CMNamedNodeMap attributes = elementDecl.getAttributes();
+			
+			CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributes);
+			if (node.getNodeType() == Node.ELEMENT_NODE) {
+				List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+				for (int k = 0; k < nodes.size(); k++) {
+					CMNode cmnode = (CMNode) nodes.get(k);
+					if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+						allAttributes.put(cmnode);
+					}
+				}
+			}
+			attributes = allAttributes;
+
+			String matchString = contentAssistRequest.getMatchString();
+
+			// check whether an attribute really exists for the replacement
+			// offsets AND if it possesses a value
+			boolean attrAtLocationHasValue = false;
+			NamedNodeMap attrs = node.getAttributes();
+			for (int i = 0; i < attrs.getLength(); i++) {
+				AttrImpl existingAttr = (AttrImpl) attrs.item(i);
+				ITextRegion name = existingAttr.getNameRegion();
+
+				if ((sdRegion.getStartOffset(name) <= contentAssistRequest.getReplacementBeginPosition()) && (sdRegion.getStartOffset(name) + name.getLength() >= contentAssistRequest.getReplacementBeginPosition() + contentAssistRequest.getReplacementLength()) && (existingAttr.getValueRegion() != null)) {
+					attrAtLocationHasValue = true;
+					break;
+				}
+			}
+
+			// only add proposals for the attributes whose names begin with
+			// the matchstring
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) attributes.item(i);
+
+					int isRequired = 0;
+					if (attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED) {
+						isRequired = XMLRelevanceConstants.R_REQUIRED;
+					}
+
+					boolean showAttribute = true;
+					showAttribute = showAttribute && beginsWith(getRequiredName(node, attrDecl), matchString.trim());
+					AttrImpl attr = (AttrImpl) node.getAttributes().getNamedItem(getRequiredName(node, attrDecl));
+					ITextRegion nameRegion = attr != null ? attr.getNameRegion() : null;
+					// nameRegion.getEndOffset() + 1 is required to allow for
+					// matches against the full name of an existing Attr
+					showAttribute = showAttribute && ((attr == null) || ((nameRegion != null) && (sdRegion.getStartOffset(nameRegion) <= contentAssistRequest.getReplacementBeginPosition()) && (sdRegion.getStartOffset(nameRegion) + nameRegion.getLength() >= contentAssistRequest.getReplacementBeginPosition() + contentAssistRequest.getReplacementLength())));
+					if (showAttribute) {
+						Image attrImage = CMImageUtil.getImage(attrDecl);
+						if (attrImage == null) {
+							if (isRequired > 0) {
+								attrImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATT_REQ_OBJ);
+							}
+							else {
+								attrImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);
+							}
+						}
+
+						String proposedText = null;
+						String proposedInfo = getAdditionalInfo(elementDecl, attrDecl);
+						CustomCompletionProposal proposal = null;
+						// attribute is at this location and already exists
+						if (attrAtLocationHasValue) {
+							// only propose the name
+							proposedText = getRequiredName(node, attrDecl);
+							proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), proposedText.length(), attrImage, proposedText, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_NAME + isRequired, true);
+						}
+						// no attribute exists or is elsewhere, generate
+						// minimally
+						else {
+							Attr existingAttrNode = (Attr) node.getAttributes().getNamedItem(getRequiredName(node, attrDecl));
+							String value = null;
+							if (existingAttrNode != null) {
+								value = existingAttrNode.getNodeValue();
+							}
+							if ((value != null) && (value.length() > 0)) {
+								proposedText = getRequiredName(node, attrDecl);
+							}
+							else {
+								proposedText = getRequiredText(node, attrDecl);
+							}
+							proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), attrDecl.getNodeName().length() + 2, attrImage,
+							// if the value isn't empty (no empty set of
+										// quotes), show it
+							// BUG 203494, content strings may have "", but not be empty
+							// An empty string is when there's no content between double quotes
+							// and there is no single quote that may be encasing a double quote
+										(showValues && (proposedText.lastIndexOf('\"') - proposedText.indexOf('\"') ==  1 && proposedText.indexOf('\'') == -1)) ? getRequiredName(node, attrDecl) : proposedText,
+										null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_NAME + isRequired);
+						}
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+			}
+		}
+		else {
+			setErrorMessage(NLS.bind(XMLUIMessages.Element__is_unknown, (new Object[]{node.getNodeName()})));
+		}
+	}
+
+	protected void addAttributeValueProposals(ContentAssistRequest contentAssistRequest) {
+
+		IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
+
+		// Find the attribute region and name for which this position should
+		// have a value proposed
+		IStructuredDocumentRegion open = node.getFirstStructuredDocumentRegion();
+		ITextRegionList openRegions = open.getRegions();
+		int i = openRegions.indexOf(contentAssistRequest.getRegion());
+		if (i < 0) {
+			return;
+		}
+		ITextRegion nameRegion = null;
+		while (i >= 0) {
+			nameRegion = openRegions.get(i--);
+			if (nameRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+				break;
+			}
+		}
+
+		// the name region is REQUIRED to do anything useful
+		if (nameRegion != null) {
+			// Retrieve the declaration
+			CMElementDeclaration elementDecl = getCMElementDeclaration(node);
+
+			// String attributeName = nameRegion.getText();
+			String attributeName = open.getText(nameRegion);
+
+			CMAttributeDeclaration attrDecl = null;
+
+			// No CMElementDeclaration means no attribute metadata, but
+			// retrieve the
+			// declaration for the attribute otherwise
+			if (elementDecl != null) {
+				CMNamedNodeMap attributes = elementDecl.getAttributes();
+
+				CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributes) {
+					private Map caseInsensitive;
+					
+					private Map getCaseInsensitiveMap() {
+						if(caseInsensitive == null)
+							caseInsensitive = new HashMap();
+						return caseInsensitive;
+					}
+
+					public CMNode getNamedItem(String name) {
+						CMNode node = super.getNamedItem(name);
+						if (node == null) {
+							node = (CMNode) getCaseInsensitiveMap().get(name.toLowerCase(Locale.US));
+						}
+						return node;
+					}
+
+					public void put(CMNode cmNode) {
+						super.put(cmNode);
+						getCaseInsensitiveMap().put(cmNode.getNodeName().toLowerCase(Locale.US), cmNode);
+					}
+				};
+				if (node.getNodeType() == Node.ELEMENT_NODE) {
+					List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+					for (int k = 0; k < nodes.size(); k++) {
+						CMNode cmnode = (CMNode) nodes.get(k);
+						if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+							allAttributes.put(cmnode);
+						}
+					}
+				}
+				attributes = allAttributes;
+
+				String noprefixName = DOMNamespaceHelper.getUnprefixedName(attributeName);
+				if (attributes != null) {
+					attrDecl = (CMAttributeDeclaration) attributes.getNamedItem(noprefixName);
+					if (attrDecl == null) {
+						attrDecl = (CMAttributeDeclaration) attributes.getNamedItem(attributeName);
+					}
+				}
+				if (attrDecl == null) {
+					setErrorMessage(UNKNOWN_ATTR, attributeName);
+				}
+			}
+
+			String currentValue = node.getAttributes().getNamedItem(attributeName).getNodeValue();
+			String proposedInfo = null;
+			Image image = CMImageUtil.getImage(attrDecl);
+			if (image == null) {
+				if ((attrDecl != null) && (attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED)) {
+					image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATT_REQ_OBJ);
+				}
+				else {
+					image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);
+				}
+			}
+
+			if ((attrDecl != null) && (attrDecl.getAttrType() != null)) {
+				// attribute is known, prompt with values from the declaration
+				proposedInfo = getAdditionalInfo(elementDecl, attrDecl);
+				List possibleValues = getPossibleDataTypeValues(node, attrDecl);
+				String defaultValue = attrDecl.getAttrType().getImpliedValue();
+				if (possibleValues.size() > 0 || defaultValue != null) {
+					// ENUMERATED VALUES
+					String matchString = contentAssistRequest.getMatchString();
+					if (matchString == null) {
+						matchString = ""; //$NON-NLS-1$
+					}
+					if ((matchString.length() > 0) && (matchString.startsWith("\"") || matchString.startsWith("'"))) {
+						matchString = matchString.substring(1);
+					}
+					boolean currentValid = false;
+
+					// d210858, if the region's a container, don't suggest the
+					// enumerated values as they probably won't help
+					boolean existingComplicatedValue = (contentAssistRequest.getRegion() != null) && (contentAssistRequest.getRegion() instanceof ITextRegionContainer);
+					if (!existingComplicatedValue) {
+						int rOffset = contentAssistRequest.getReplacementBeginPosition();
+						int rLength = contentAssistRequest.getReplacementLength();
+						for (Iterator j = possibleValues.iterator(); j.hasNext();) {
+							String possibleValue = (String) j.next();
+							if(!possibleValue.equals(defaultValue)) {
+								currentValid = currentValid || possibleValue.equals(currentValue);
+								if ((matchString.length() == 0) || possibleValue.startsWith(matchString)) {
+									String rString = "\"" + possibleValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
+									CustomCompletionProposal proposal = new CustomCompletionProposal(rString, rOffset, rLength, possibleValue.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENUM), rString, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+									contentAssistRequest.addProposal(proposal);
+								}
+							}
+						}
+						if(defaultValue != null && ((matchString.length() == 0) || defaultValue.startsWith(matchString))) {
+							String rString = "\"" + defaultValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
+							CustomCompletionProposal proposal = new CustomCompletionProposal(rString, rOffset, rLength, defaultValue.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DEFAULT), rString, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+				else if (((attrDecl.getUsage() == CMAttributeDeclaration.FIXED) || (attrDecl.getAttrType().getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED)) && (attrDecl.getAttrType().getImpliedValue() != null)) {
+					// FIXED values
+					String value = attrDecl.getAttrType().getImpliedValue();
+					if ((value != null) && (value.length() > 0)) {
+						String rValue = "\"" + value + "\"";//$NON-NLS-2$//$NON-NLS-1$
+						CustomCompletionProposal proposal = new CustomCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), rValue.length() + 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+						contentAssistRequest.addProposal(proposal);
+						if ((currentValue.length() > 0) && !value.equals(currentValue)) {
+							rValue = "\"" + currentValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
+							proposal = new CustomCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), rValue.length() + 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+			}
+			else {
+				// unknown attribute, so supply nice empty values
+				proposedInfo = getAdditionalInfo(null, elementDecl);
+				CustomCompletionProposal proposal = null;
+				if ((currentValue != null) && (currentValue.length() > 0)) {
+					String rValue = "\"" + currentValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
+					proposal = new CustomCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+					contentAssistRequest.addProposal(proposal);
+				}
+			}
+		}
+		else {
+			setErrorMessage(UNKNOWN_CONTEXT);
+		}
+	}
+
+	protected void addCommentProposal(ContentAssistRequest contentAssistRequest) {
+		contentAssistRequest.addProposal(new CustomCompletionProposal("<!--  -->", //$NON-NLS-1$
+					contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 5, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_COMMENT), NLS.bind(XMLUIMessages.Comment__, (new Object[]{" <!--  -->"})), //$NON-NLS-1$
+					null, null, XMLRelevanceConstants.R_COMMENT));
+	}
+
+	/**
+	 * Add all of the element declarations int the CMContent object into one
+	 * big list.
+	 */
+	protected void addContent(List contentList, CMContent content) {
+		if (content == null) {
+			return;
+		}
+		if (content instanceof CMGroup) {
+			CMNodeList children = ((CMGroup) content).getChildNodes();
+			if (children == null) {
+				return;
+			}
+			for (int i = 0; i < children.getLength(); i++) {
+				CMNode child = children.item(i);
+				if (child.getNodeType() == CMNode.ELEMENT_DECLARATION) {
+					contentList.add(child);
+				}
+				else {
+					if (child.getNodeType() == CMNode.GROUP) {
+						addContent(contentList, (CMContent) child);
+					}
+					else {
+						throw new IllegalArgumentException("Unknown content child: " + child); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+		else {
+			contentList.add(content);
+		}
+	}
+
+	protected void addDocTypeProposal(ContentAssistRequest contentAssistRequest) {
+		// if a DocumentElement exists, use that for the root Element name
+		String rootname = "unspecified"; //$NON-NLS-1$
+		if (contentAssistRequest.getNode().getOwnerDocument().getDocumentElement() != null) {
+			rootname = contentAssistRequest.getNode().getOwnerDocument().getDocumentElement().getNodeName();
+		}
+
+		String proposedText = "<!DOCTYPE " + rootname + " PUBLIC \"//UNKNOWN/\" \"unknown.dtd\">"; //$NON-NLS-1$ //$NON-NLS-2$
+		ICompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 10, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DOCTYPE), "<!DOCTYPE ... >", //$NON-NLS-1$
+					null, null, XMLRelevanceConstants.R_DOCTYPE);
+		// TODO provide special documentation on doc type
+		contentAssistRequest.addProposal(proposal);
+	}
+
+	/**
+	 * Add the proposals for a completely empty document
+	 */
+	protected void addEmptyDocumentProposals(ContentAssistRequest contentAssistRequest) {
+		// nothing
+	}
+
+	/**
+	 * Add the proposals for the name in an end tag
+	 */
+	protected void addEndTagNameProposals(ContentAssistRequest contentAssistRequest) {
+
+		if (contentAssistRequest.getStartOffset() + contentAssistRequest.getRegion().getTextLength() < contentAssistRequest.getReplacementBeginPosition()) {
+			CustomCompletionProposal proposal = new CustomCompletionProposal(">", //$NON-NLS-1$
+						contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC), NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" '>'"})), //$NON-NLS-1$
+						null, null, XMLRelevanceConstants.R_END_TAG_NAME);
+			contentAssistRequest.addProposal(proposal);
+		}
+		else {
+			IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+			Node aNode = contentAssistRequest.getNode();
+			String matchString = contentAssistRequest.getMatchString();
+			if (matchString.startsWith("</")) {
+				matchString = matchString.substring(2);
+			}
+			while (aNode != null) {
+				if (aNode.getNodeType() == Node.ELEMENT_NODE) {
+					if (aNode.getNodeName().startsWith(matchString)) {
+						IDOMNode aXMLNode = (IDOMNode) aNode;
+						CMElementDeclaration ed = modelQuery.getCMElementDeclaration((Element) aNode);
+						if ((aXMLNode.getEndStructuredDocumentRegion() == null) && ((ed == null) || (ed.getContentType() != CMElementDeclaration.EMPTY))) {
+							String replacementText = aNode.getNodeName();
+							String displayText = replacementText;
+							String proposedInfo = (ed != null) ? getAdditionalInfo(null, ed) : null;
+							if(!contentAssistRequest.getDocumentRegion().isEnded()) {
+								replacementText += ">"; //$NON-NLS-1$
+							}
+							CustomCompletionProposal proposal = null;
+							// double check to see if the region acted upon is
+							// a tag name; replace it if so
+							Image image = CMImageUtil.getImage(ed);
+							if (image == null) {
+								image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+							}
+							if (contentAssistRequest.getRegion().getType() == DOMRegionContext.XML_TAG_NAME) {
+								proposal = new CustomCompletionProposal(replacementText, contentAssistRequest.getStartOffset(), contentAssistRequest.getRegion().getTextLength(), replacementText.length(), image, displayText, null, proposedInfo, XMLRelevanceConstants.R_END_TAG_NAME);
+							}
+							else {
+								proposal = new CustomCompletionProposal(replacementText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), replacementText.length(), image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{"'" + displayText + "'"})), //$NON-NLS-1$ //$NON-NLS-2$
+											null, proposedInfo, XMLRelevanceConstants.R_END_TAG_NAME);
+							}
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+				aNode = aNode.getParentNode();
+			}
+		}
+	}
+
+	/**
+	 * Prompt for end tags to a non-empty Node that hasn't ended Handles these
+	 * cases: <br>
+	 * <tagOpen>| <br>
+	 * <tagOpen>< |<br>
+	 * <tagOpen></ |
+	 * 
+	 * @param contentAssistRequest
+	 */
+	protected void addEndTagProposals(ContentAssistRequest contentAssistRequest) {
+		IDOMNode node = (IDOMNode) contentAssistRequest.getParent();
+
+		if (isCommentNode(node)) {
+			// loop and find non comment node parent
+			while ((node != null) && isCommentNode(node)) {
+				node = (IDOMNode) node.getParentNode();
+			}
+		}
+
+		// node is already closed
+		if (node.isClosed()) {
+			// loop and find non comment unclose node parent
+			while ((node != null) && node.isClosed()) {
+				node = (IDOMNode) node.getParentNode();
+			}
+		}
+		// there were no unclosed tags
+		if (node == null) {
+			return;
+		}
+
+		// data to create a CustomCompletionProposal
+		String replaceText = node.getNodeName() + ">"; //$NON-NLS-1$
+		int replaceBegin = contentAssistRequest.getReplacementBeginPosition();
+		int replaceLength = contentAssistRequest.getReplacementLength();
+		int cursorOffset = node.getNodeName().length() + 1;
+		String displayString = ""; //$NON-NLS-1$
+		String proposedInfo = ""; //$NON-NLS-1$
+		Image image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+
+		setErrorMessage(null);
+		boolean addProposal = false;
+
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			// ////////////////////////////////////////////////////////////////////////////////////
+			IStructuredDocument sDoc = (IStructuredDocument) fTextViewer.getDocument();
+			IStructuredDocumentRegion xmlEndTagOpen = sDoc.getRegionAtCharacterOffset(contentAssistRequest.getReplacementBeginPosition());
+			// skip backward to "<", "</", or the (unclosed) start tag, null
+			// if not found
+			String type = ""; //$NON-NLS-1$
+			while ((xmlEndTagOpen != null) && ((type = xmlEndTagOpen.getType()) != DOMRegionContext.XML_END_TAG_OPEN) && (type != DOMRegionContext.XML_TAG_CLOSE) && !needsEndTag(xmlEndTagOpen) && (type != DOMRegionContext.XML_TAG_OPEN)) {
+				xmlEndTagOpen = xmlEndTagOpen.getPrevious();
+			}
+
+			if (xmlEndTagOpen == null) {
+				return;
+			}
+
+			node = (IDOMNode) node.getModel().getIndexedRegion(xmlEndTagOpen.getStartOffset());
+			node = (IDOMNode) node.getParentNode();
+
+			if (isStartTag(xmlEndTagOpen)) {
+				// this is the case for a start tag w/out end tag
+				// eg:
+				// <p>
+				// <% String test = "test"; %>
+				// |
+				if (needsEndTag(xmlEndTagOpen)) {
+					String tagName = getTagName(xmlEndTagOpen);
+					xmlEndTagOpen.getTextEndOffset();
+					replaceLength = 0;
+					replaceText = "</" + tagName + ">"; //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
+					// replaceText = "</" + node.getNodeName() + ">";
+					// //$NON-NLS-1$ $NON-NLS-2$
+					cursorOffset = tagName.length() + 3;
+					displayString = NLS.bind(XMLUIMessages.End_with__, (new Object[]{tagName}));
+					addProposal = true;
+				}
+			}
+			else if (type == DOMRegionContext.XML_END_TAG_OPEN) {
+				// this is the case for: <tag> </ |
+				// possibly <tag> </ |<anotherTag>
+				// should only be replacing white space...
+				replaceLength = (replaceBegin > xmlEndTagOpen.getTextEndOffset()) ? replaceBegin - xmlEndTagOpen.getTextEndOffset() : 0;
+				replaceText = node.getNodeName() + ">"; //$NON-NLS-1$
+				cursorOffset = replaceText.length();
+				replaceBegin = xmlEndTagOpen.getTextEndOffset();
+				displayString = NLS.bind(XMLUIMessages.End_with_, (new Object[]{node.getNodeName()}));
+				addProposal = true;
+			}
+			else if (type == DOMRegionContext.XML_TAG_OPEN) {
+				// this is the case for: <tag> < |
+				replaceText = "/" + node.getNodeName() + ">"; //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
+				cursorOffset = replaceText.length();
+				// replaceText = "/" + node.getNodeName() + ">"; //$NON-NLS-1$
+				// $NON-NLS-2$
+				// should only be replacing white space...
+				replaceLength = (replaceBegin > xmlEndTagOpen.getTextEndOffset()) ? replaceBegin - xmlEndTagOpen.getTextEndOffset() : 0;
+				replaceBegin = xmlEndTagOpen.getTextEndOffset();
+				displayString = NLS.bind(XMLUIMessages.End_with_, (new Object[]{"/" + node.getNodeName()})); //$NON-NLS-1$
+				addProposal = true;
+			}
+		}
+		// ////////////////////////////////////////////////////////////////////////////////////
+		// sometimes the node is not null, but
+		// getNodeValue() is null, put in a null check
+		else if ((node.getNodeValue() != null) && (node.getNodeValue().indexOf("</") != -1)) { //$NON-NLS-1$
+			// the case where "</" is started, but the nodes comes in as a
+			// text node (instead of element)
+			// like this: <tag> </|
+			Node parent = node.getParentNode();
+			if ((parent != null) && (parent.getNodeType() != Node.DOCUMENT_NODE)) {
+				replaceText = parent.getNodeName() + ">"; //$NON-NLS-1$
+				cursorOffset = replaceText.length();
+				displayString = NLS.bind(XMLUIMessages.End_with__, (new Object[]{parent.getNodeName()}));
+				setErrorMessage(null);
+				addProposal = true;
+			}
+		}
+		// ////////////////////////////////////////////////////////////////////////////////////
+		else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			setErrorMessage(UNKNOWN_CONTEXT);
+		}
+		if (addProposal == true) {
+			CustomCompletionProposal proposal = new CustomCompletionProposal(replaceText, replaceBegin, replaceLength, cursorOffset, image, displayString, null, proposedInfo, XMLRelevanceConstants.R_END_TAG);
+			contentAssistRequest.addProposal(proposal);
+		}
+	}
+
+	protected void addEntityProposals(ContentAssistRequest contentAssistRequest, int documentPosition, ITextRegion completionRegion, IDOMNode treeNode) {
+		ICompletionProposal[] eps = computeEntityReferenceProposals(documentPosition, completionRegion, treeNode);
+		for (int i = 0; (eps != null) && (i < eps.length); i++) {
+			contentAssistRequest.addProposal(eps[i]);
+		}
+	}
+
+	protected void addEntityProposals(Vector proposals, Properties map, String key, int nodeOffset, IStructuredDocumentRegion sdRegion, ITextRegion completionRegion) {
+		if (map == null) {
+			return;
+		}
+		String entityName = ""; //$NON-NLS-1$
+		String entityValue = ""; //$NON-NLS-1$
+		Image entityIcon = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENTITY_REFERENCE);
+		String replacementText = ""; //$NON-NLS-1$
+		String displayString = ""; //$NON-NLS-1$
+		Enumeration keys = map.keys();
+
+		while ((keys != null) && keys.hasMoreElements()) {
+			entityName = (String) keys.nextElement();
+			entityValue = map.getProperty(entityName);
+			// filter based on partial entity string...
+			if (entityName.toLowerCase().startsWith(key.toLowerCase()) || key.trim().equals("")) //$NON-NLS-1$
+			{
+				// figure out selection...if text is selected, add it to
+				// selection length
+				int selectionLength = nodeOffset;
+				if (fTextViewer != null) {
+					selectionLength += fTextViewer.getSelectedRange().y;
+				}
+				// create a new proposal for entity string...
+				replacementText = "&" + entityName + ";"; //$NON-NLS-1$ //$NON-NLS-2$ 
+				displayString = "&" + entityName + "; (" + entityValue + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				ICompletionProposal cp = new CustomCompletionProposal(replacementText, sdRegion.getStartOffset(completionRegion), selectionLength, replacementText.length(), entityIcon, displayString, null, null, XMLRelevanceConstants.R_ENTITY);
+				if (cp != null) {
+					proposals.add(cp);
+				}
+			}
+		}
+	}
+
+	protected void addPCDATAProposal(String nodeName, ContentAssistRequest contentAssistRequest) {
+		CustomCompletionProposal proposal = new CustomCompletionProposal("<![CDATA[]]>", //$NON-NLS-1$
+					contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 9, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_CDATASECTION), "CDATA Section", //$NON-NLS-1$
+					null, null, XMLRelevanceConstants.R_CDATA);
+		contentAssistRequest.addProposal(proposal);
+
+		proposal = new CustomCompletionProposal(nodeName, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), nodeName.length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TXTEXT), "#PCDATA", //$NON-NLS-1$
+					null, null, XMLRelevanceConstants.R_CDATA);
+		contentAssistRequest.addProposal(proposal);
+	}
+
+	protected void addStartDocumentProposals(ContentAssistRequest contentAssistRequest) {
+		Node aNode = contentAssistRequest.getNode();
+		boolean xmlpiFound = false;
+		Document owningDocument = aNode.getOwnerDocument();
+		// ==> // int xmlpiNodePosition = -1;
+
+		// make sure xmlpi is root element
+		// don't want doctype proposal if XMLPI isn't first element...
+		Node first = owningDocument.getFirstChild();
+		boolean xmlpiIsFirstElement = ((first != null) && (first.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE));
+		boolean insertDoctype = xmlpiIsFirstElement;
+
+		for (Node child = owningDocument.getFirstChild(); child != null; child = child.getNextSibling()) {
+			boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) && child.getNodeName().equals("xml")); //$NON-NLS-1$
+			xmlpiFound = xmlpiFound || xmlpi;
+			if (xmlpiFound) {
+				if (child instanceof IDOMNode) {
+					// ==> // int xmlpiNodePosition =
+					// ((XMLNode)child).getEndOffset();
+				}
+				// skip white space and text
+				while (((child = child.getNextSibling()) != null) && (child.getNodeType() == Node.TEXT_NODE)) {
+					// just skipping
+				}
+				// check if theres a node inbetween XMLPI and cursor position
+				if ((child != null) && (child instanceof IDOMNode)) {
+					if ((contentAssistRequest.getReplacementBeginPosition() >= ((IDOMNode) child).getEndOffset()) || !xmlpiIsFirstElement) {
+						insertDoctype = false;
+					}
+				}
+				break;
+			}
+		}
+
+		if (xmlpiFound && (owningDocument.getDoctype() == null) && isCursorAfterXMLPI(contentAssistRequest) && insertDoctype) {
+			addDocTypeProposal(contentAssistRequest);
+		}
+	}
+
+	/**
+	 * Close an unclosed start tag
+	 */
+	protected void addTagCloseProposals(ContentAssistRequest contentAssistRequest) {
+		IDOMNode node = (IDOMNode) contentAssistRequest.getParent();
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+
+			CMElementDeclaration elementDecl = getCMElementDeclaration(node);
+			String proposedInfo = (elementDecl != null) ? getAdditionalInfo(null, elementDecl) : null;
+			int contentType = (elementDecl != null) ? elementDecl.getContentType() : CMElementDeclaration.ANY;
+			// if it's XML and content doesn't HAVE to be element, add "/>"
+			// proposal.
+			boolean endWithSlashBracket = (getXML(node) && (contentType != CMElementDeclaration.ELEMENT));
+
+			Image image = CMImageUtil.getImage(elementDecl);
+			if (image == null) {
+				image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+			}
+
+			// is the start tag ended properly?
+			if ((contentAssistRequest.getDocumentRegion() == node.getFirstStructuredDocumentRegion()) && !(node.getFirstStructuredDocumentRegion()).isEnded()) {
+				setErrorMessage(null);
+				// Is this supposed to be an empty tag? Note that if we can't
+				// tell, we assume it's not.
+				if ((elementDecl != null) && (elementDecl.getContentType() == CMElementDeclaration.EMPTY)) {
+					// prompt with a self-closing end character if needed
+					CustomCompletionProposal proposal = new CustomCompletionProposal(getContentGenerator().getStartTagClose(node, elementDecl), contentAssistRequest.getReplacementBeginPosition(),
+					// this is one of the few times to ignore the length --
+								// always insert
+								// contentAssistRequest.getReplacementLength(),
+								0, getContentGenerator().getStartTagClose(node, elementDecl).length(), image, NLS.bind(XMLUIMessages.Close_with___, (new Object[]{getContentGenerator().getStartTagClose(node, elementDecl)})), null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+					contentAssistRequest.addProposal(proposal);
+				}
+				else {
+					// prompt with a close for the start tag
+					CustomCompletionProposal proposal = new CustomCompletionProposal(">", //$NON-NLS-1$
+								contentAssistRequest.getReplacementBeginPosition(),
+								// this is one of the few times to ignore the
+								// length -- always insert
+								// contentAssistRequest.getReplacementLength(),
+								0, 1, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" '>'"})), //$NON-NLS-1$
+								null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+					contentAssistRequest.addProposal(proposal);
+
+					// prompt with the closer for the start tag and an end tag
+					// if one is not present
+					if (node.getEndStructuredDocumentRegion() == null) {
+						// make sure tag name is actually what it thinks it
+						// is...(eg. <%@ vs. <jsp:directive)
+						IStructuredDocumentRegion sdr = contentAssistRequest.getDocumentRegion();
+						String openingTagText = (sdr != null) ? sdr.getFullText() : ""; //$NON-NLS-1$
+						if ((openingTagText != null) && (openingTagText.indexOf(node.getNodeName()) != -1)) {
+							proposal = new CustomCompletionProposal("></" + node.getNodeName() + ">", //$NON-NLS-2$//$NON-NLS-1$
+										contentAssistRequest.getReplacementBeginPosition(),
+										// this is one of the few times to
+										// ignore the length -- always insert
+										// contentAssistRequest.getReplacementLength(),
+										0, 1, image, NLS.bind(XMLUIMessages.Close_with____, (new Object[]{node.getNodeName()})), null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+					// prompt with slash bracket "/>" incase if it's a self
+					// ending tag
+					if (endWithSlashBracket) {
+						proposal = new CustomCompletionProposal("/>", //$NON-NLS-1$
+									contentAssistRequest.getReplacementBeginPosition(),
+									// this is one of the few times to ignore
+									// the length -- always insert
+									// contentAssistRequest.getReplacementLength(),
+									0, 2, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" \"/>\""})), //$NON-NLS-1$
+									null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG + 1); // +1
+						// to
+						// bring
+						// to
+						// top
+						// of
+						// list
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+			}
+			else if ((contentAssistRequest.getDocumentRegion() == node.getLastStructuredDocumentRegion()) && !node.getLastStructuredDocumentRegion().isEnded()) {
+				setErrorMessage(null);
+				// prompt with a closing end character for the end tag
+				CustomCompletionProposal proposal = new CustomCompletionProposal(">", //$NON-NLS-1$
+							contentAssistRequest.getReplacementBeginPosition(),
+							// this is one of the few times to ignore the
+							// length -- always insert
+							// contentAssistRequest.getReplacementLength(),
+							0, 1, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" '>'"})), //$NON-NLS-1$
+							null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+				contentAssistRequest.addProposal(proposal);
+			}
+		}
+		else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			setErrorMessage(UNKNOWN_CONTEXT);
+		}
+	}
+
+	protected void addTagInsertionProposals(ContentAssistRequest contentAssistRequest, int childPosition) {
+		List cmnodes = null;
+		Node parent = contentAssistRequest.getParent();
+		String error = null;
+
+		// (nsd) This is only valid at the document element level
+		// only valid if it's XML (check added 2/17/2004)
+		if ((parent != null) && (parent.getNodeType() == Node.DOCUMENT_NODE) && ((IDOMDocument) parent).isXMLType() && !isCursorAfterXMLPI(contentAssistRequest)) {
+			return;
+		}
+		// only want proposals if cursor is after doctype...
+		if (!isCursorAfterDoctype(contentAssistRequest)) {
+			return;
+		}
+
+		// fix for meta-info comment nodes.. they currently "hide" other
+		// proposals because the don't
+		// have a content model (so can't propose any children..)
+		if ((parent != null) && (parent instanceof IDOMNode) && isCommentNode((IDOMNode) parent)) {
+			// loop and find non comment node?
+			while ((parent != null) && isCommentNode((IDOMNode) parent)) {
+				parent = parent.getParentNode();
+			}
+		}
+
+		if (parent.getNodeType() == Node.ELEMENT_NODE) {
+			CMElementDeclaration parentDecl = getCMElementDeclaration(parent);
+			if (parentDecl != null) {
+				// XSD-specific ability - no filtering
+				CMDataType childType = parentDecl.getDataType();
+				if (childType != null) {
+					String[] childStrings = childType.getEnumeratedValues();
+					String defaultValue = childType.getImpliedValue();
+					if (childStrings != null || defaultValue != null) {
+						// the content string is the sole valid child...so
+						// replace the rest
+						int begin = contentAssistRequest.getReplacementBeginPosition();
+						int length = contentAssistRequest.getReplacementLength();
+						if (parent instanceof IDOMNode) {
+							if (((IDOMNode) parent).getLastStructuredDocumentRegion() != ((IDOMNode) parent).getFirstStructuredDocumentRegion()) {
+								begin = ((IDOMNode) parent).getFirstStructuredDocumentRegion().getEndOffset();
+								length = ((IDOMNode) parent).getLastStructuredDocumentRegion().getStartOffset() - begin;
+							}
+						}
+						String proposedInfo = getAdditionalInfo(parentDecl, childType);
+						for (int i = 0; i < childStrings.length; i++) {
+							if(!childStrings[i].equals(defaultValue))
+							{
+								CustomCompletionProposal textProposal = new CustomCompletionProposal(childStrings[i], begin, length, childStrings[i].length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENUM), childStrings[i], null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);
+								contentAssistRequest.addProposal(textProposal);
+							}
+						}
+						if(defaultValue != null) {
+							CustomCompletionProposal textProposal = new CustomCompletionProposal(defaultValue, begin, length, defaultValue.length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DEFAULT), defaultValue, null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);
+							contentAssistRequest.addProposal(textProposal);
+						}
+					}
+				}
+			}
+			if ((parentDecl != null) && (parentDecl.getContentType() == CMElementDeclaration.PCDATA)) {
+				addPCDATAProposal(parentDecl.getNodeName(), contentAssistRequest);
+			}
+			else {
+				// retrieve the list of all possible children within this
+				// parent context
+				cmnodes = getAvailableChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);
+
+				// retrieve the list of the possible children within this
+				// parent context and at this index
+				List strictCMNodeSuggestions = null;
+				if (XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_STRICT.equals(XMLUIPlugin.getInstance().getPreferenceStore().getString(XMLUIPreferenceNames.SUGGESTION_STRATEGY))) {
+					strictCMNodeSuggestions = getValidChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);
+				}
+				Iterator nodeIterator = cmnodes.iterator();
+				if (!nodeIterator.hasNext()) {
+					if (getCMElementDeclaration(parent) != null) {
+						error = NLS.bind(XMLUIMessages._Has_no_available_child, (new Object[]{parent.getNodeName()}));
+					}
+					else {
+						error = NLS.bind(XMLUIMessages.Element__is_unknown, (new Object[]{parent.getNodeName()}));
+					}
+				}
+				String matchString = contentAssistRequest.getMatchString();
+				// chop off any leading <'s and whitespace from the
+				// matchstring
+				while ((matchString.length() > 0) && (Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, "<"))) {
+					//$NON-NLS-1$
+					matchString = matchString.substring(1);
+				}
+				while (nodeIterator.hasNext()) {
+					Object o = nodeIterator.next();
+					if (o instanceof CMElementDeclaration) {
+						CMElementDeclaration elementDecl = (CMElementDeclaration) o;
+						// only add proposals for the child element's that
+						// begin with the matchstring
+						String tagname = getRequiredName(parent, elementDecl);
+						boolean isStrictCMNodeSuggestion = strictCMNodeSuggestions != null ? strictCMNodeSuggestions.contains(elementDecl) : false;
+
+						Image image = CMImageUtil.getImage(elementDecl);
+
+						if (image == null) {
+							if (strictCMNodeSuggestions != null) {
+								image = isStrictCMNodeSuggestion ? XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC_EMPHASIZED) : XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC_DEEMPHASIZED);
+							}
+							else {
+								image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+							}
+
+						}
+
+						// int markupAdjustment =
+						// getContentGenerator().getMinimalStartTagLength(parent,
+						// elementDecl);
+						if (beginsWith(tagname, matchString)) {
+							String proposedText = getRequiredText(parent, elementDecl);
+
+							// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89811
+							// place cursor in first empty quotes
+							int markupAdjustment = getCursorPositionForProposedText(proposedText);
+
+							String proposedInfo = getAdditionalInfo(parentDecl, elementDecl);
+							int relevance = isStrictCMNodeSuggestion ? XMLRelevanceConstants.R_STRICTLY_VALID_TAG_INSERTION : XMLRelevanceConstants.R_TAG_INSERTION;
+							CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), markupAdjustment, image, tagname, null, proposedInfo, relevance);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+				if (contentAssistRequest.getProposals().size() == 0) {
+					if (error != null) {
+						setErrorMessage(error);
+					}
+					else if ((contentAssistRequest.getMatchString() != null) && (contentAssistRequest.getMatchString().length() > 0)) {
+						setErrorMessage(NLS.bind(XMLUIMessages.No_known_child_tag, (new Object[]{parent.getNodeName(), contentAssistRequest.getMatchString()})));
+						//$NON-NLS-1$ = "No known child tag names of <{0}> begin with \"{1}\"."
+					}
+					else {
+						setErrorMessage(NLS.bind(XMLUIMessages.__Has_no_known_child, (new Object[]{parent.getNodeName()})));
+					}
+				}
+			}
+		}
+		else if (parent.getNodeType() == Node.DOCUMENT_NODE) {
+			// Can only prompt with elements if the cursor position is past
+			// the XML processing
+			// instruction and DOCTYPE declaration
+			boolean xmlpiFound = false;
+			boolean doctypeFound = false;
+			int minimumOffset = -1;
+
+			for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
+
+				boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) && child.getNodeName().equals("xml")); //$NON-NLS-1$
+				boolean doctype = child.getNodeType() == Node.DOCUMENT_TYPE_NODE;
+				if (xmlpi || (doctype && (minimumOffset < 0))) {
+					minimumOffset = ((IDOMNode) child).getFirstStructuredDocumentRegion().getStartOffset() + ((IDOMNode) child).getFirstStructuredDocumentRegion().getTextLength();
+				}
+				xmlpiFound = xmlpiFound || xmlpi;
+				doctypeFound = doctypeFound || doctype;
+			}
+
+			if (contentAssistRequest.getReplacementBeginPosition() >= minimumOffset) {
+				List childDecls = getAvailableRootChildren((Document) parent, childPosition);
+				for (int i = 0; i < childDecls.size(); i++) {
+					CMElementDeclaration ed = (CMElementDeclaration) childDecls.get(i);
+					if (ed != null) {
+						Image image = CMImageUtil.getImage(ed);
+						if (image == null) {
+							image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+						}
+						String proposedText = getRequiredText(parent, ed);
+						String tagname = getRequiredName(parent, ed);
+						// account for the &lt; and &gt;
+						int markupAdjustment = getContentGenerator().getMinimalStartTagLength(parent, ed);
+						String proposedInfo = getAdditionalInfo(null, ed);
+						CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), markupAdjustment, image, tagname, null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+			}
+		}
+	}
+
+	protected void addTagNameProposals(ContentAssistRequest contentAssistRequest, int childPosition) {
+		List cmnodes = null;
+		Node parent = contentAssistRequest.getParent();
+		IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
+		String error = null;
+		String matchString = contentAssistRequest.getMatchString();
+		if (parent.getNodeType() == Node.ELEMENT_NODE) {
+			// retrieve the list of children
+			// validActions = getAvailableChildrenAtIndex((Element) parent,
+			// childPosition);
+			cmnodes = getAvailableChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);
+			Iterator nodeIterator = cmnodes.iterator();
+			// chop off any leading <'s and whitespace from the matchstring
+			while ((matchString.length() > 0) && (Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, "<"))) {
+				//$NON-NLS-1$
+				matchString = matchString.substring(1);
+			}
+			if (!nodeIterator.hasNext()) {
+				error = NLS.bind(XMLUIMessages.__Has_no_known_child, (new Object[]{parent.getNodeName()}));
+			}
+			while (nodeIterator.hasNext()) {
+				CMNode elementDecl = (CMNode) nodeIterator.next();
+				if (elementDecl != null) {
+					// only add proposals for the child element's that begin
+					// with the matchstring
+					String proposedText = null;
+					int cursorAdjustment = 0;
+
+					// do a check to see if partial attributes of partial tag
+					// names are in list
+					if (((node != null) && (node.getAttributes() != null) && (node.getAttributes().getLength() > 0) && attributeInList(node, parent, elementDecl)) || ((node.getNodeType() != Node.TEXT_NODE) && node.getFirstStructuredDocumentRegion().isEnded())) {
+
+						proposedText = getRequiredName(parent, elementDecl);
+						cursorAdjustment = proposedText.length();
+					}
+					else {
+						proposedText = getRequiredName(parent, elementDecl);
+						cursorAdjustment = proposedText.length();
+						if (elementDecl instanceof CMElementDeclaration) {
+							CMElementDeclaration ed = (CMElementDeclaration) elementDecl;
+							// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89811
+							StringBuffer sb = new StringBuffer();
+							getContentGenerator().generateTag(parent, ed, sb);
+							// since it's a name proposal, assume '<' is
+							// already there
+							// only return the rest of the tag
+							proposedText = sb.toString().substring(1);
+							cursorAdjustment = getCursorPositionForProposedText(proposedText);
+
+							// cursorAdjustment = proposedText.length() +
+							// 1;
+							// proposedText += "></" +
+							// getRequiredName(parent, elementDecl) + ">";
+							// //$NON-NLS-2$//$NON-NLS-1$
+						}
+					}
+					if (beginsWith(proposedText, matchString)) {
+						Image image = CMImageUtil.getImage(elementDecl);
+						if (image == null) {
+							image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+						}
+						String proposedInfo = getAdditionalInfo(getCMElementDeclaration(parent), elementDecl);
+						CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), cursorAdjustment, image, getRequiredName(parent, elementDecl), null, proposedInfo, XMLRelevanceConstants.R_TAG_NAME);
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+			}
+			if (contentAssistRequest.getProposals().size() == 0) {
+				if (error != null) {
+					setErrorMessage(error);
+				}
+				else if ((contentAssistRequest.getMatchString() != null) && (contentAssistRequest.getMatchString().length() > 0)) {
+					setErrorMessage(NLS.bind(XMLUIMessages.No_known_child_tag_names, (new Object[]{parent.getNodeName(), contentAssistRequest.getMatchString()})));
+					//$NON-NLS-1$ = "No known child tag names of <{0}> begin with \"{1}\""
+				}
+				else {
+					setErrorMessage(NLS.bind(XMLUIMessages.__Has_no_known_child, (new Object[]{parent.getNodeName()})));
+				}
+			}
+		}
+		else if (parent.getNodeType() == Node.DOCUMENT_NODE) {
+			List childElements = getAvailableRootChildren((Document) parent, childPosition);
+			for (int i = 0; i < childElements.size(); i++) {
+				CMNode ed = (CMNode) childElements.get(i);
+				if (ed == null) {
+					continue;
+				}
+				String proposedText = null;
+				int cursorAdjustment = 0;
+				if (ed instanceof CMElementDeclaration) {
+					// proposedText = getRequiredName(parent, ed);
+					StringBuffer sb = new StringBuffer();
+					getContentGenerator().generateTag(parent, (CMElementDeclaration) ed, sb);
+					// tag starts w/ '<', but we want to compare to name
+					proposedText = sb.toString().substring(1);
+
+					if (!beginsWith(proposedText, matchString)) {
+						continue;
+					}
+
+					cursorAdjustment = getCursorPositionForProposedText(proposedText);
+
+					String proposedInfo = getAdditionalInfo(null, ed);
+					Image image = CMImageUtil.getImage(ed);
+					if (image == null) {
+						image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+					}
+					CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), cursorAdjustment, image, getRequiredName(parent, ed), null, proposedInfo, XMLRelevanceConstants.R_TAG_NAME);
+					contentAssistRequest.addProposal(proposal);
+				}
+			}
+		}
+	}
+
+	/**
+	 * this is the position the cursor should be in after the proposal is
+	 * applied
+	 * 
+	 * @param proposedText
+	 * @return the position the cursor should be in after the proposal is
+	 *         applied
+	 */
+	private int getCursorPositionForProposedText(String proposedText) {
+		int cursorAdjustment;
+		cursorAdjustment = proposedText.indexOf("\"\"") + 1; //$NON-NLS-1$
+		// otherwise, after the first tag
+		if (cursorAdjustment == 0) {
+			cursorAdjustment = proposedText.indexOf('>') + 1;
+		}
+		if (cursorAdjustment == 0) {
+			cursorAdjustment = proposedText.length() + 1;
+		}
+
+		return cursorAdjustment;
+	}
+
+	/**
+	 * @deprecated XML proposal is added via xml declaration template instead
+	 */
+	protected void addXMLProposal(ContentAssistRequest contentAssistRequest) {
+		String proposedText = "<?xml version=\"1.0\" encoding=\"" + ContentTypeEncodingPreferences.getUserPreferredCharsetName(ContentTypeIdForXML.ContentTypeID_XML) + "\"?>"; //$NON-NLS-2$//$NON-NLS-1$
+		ICompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), proposedText.length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_PROCESSINGINSTRUCTION), proposedText, null, null, XMLRelevanceConstants.R_XML_DECLARATION);
+		// TODO add special XML proposal info
+		contentAssistRequest.addProposal(proposal);
+	}
+
+	/**
+	 * This method determines if any of the attributes in the proposed XMLNode
+	 * node, are possible values of attributes from possible Elements at this
+	 * point in the document according to the Content Model.
+	 * 
+	 * @param node
+	 *            the element with attributes that you would like to test if
+	 *            are possible for possible Elements at this point
+	 * @param cmnode
+	 *            possible element at this point in the document (depending on
+	 *            what 'node' is) true if any attributes of 'node' match any
+	 *            possible attributes from 'cmnodes' list.
+	 */
+	protected boolean attributeInList(IDOMNode node, Node parent, CMNode cmnode) {
+		if ((node == null) || (parent == null) || (cmnode == null)) {
+			return false;
+		}
+		String elementMatchString = node.getNodeName();
+		String cmnodeName = getRequiredName(parent, cmnode);// cmnode.getNodeName();
+		if (node instanceof Element) {
+			NamedNodeMap map = ((Element) node).getAttributes();
+			String attrMatchString = ""; //$NON-NLS-1$
+			CMNamedNodeMap cmattrMap = null;
+			// iterate attribute possibilities for partially started node
+			for (int i = 0; (map != null) && (i < map.getLength()); i++) {
+				attrMatchString = map.item(i).getNodeName();
+				// filter on whatever user typed for element name already
+				if (beginsWith(cmnodeName, elementMatchString)) {
+					if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION) {
+						cmattrMap = ((CMElementDeclaration) cmnode).getAttributes();
+
+						CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(cmattrMap);
+						List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, (CMElementDeclaration) cmnode, ModelQuery.INCLUDE_ATTRIBUTES);
+						for (int k = 0; k < nodes.size(); k++) {
+							CMNode adnode = (CMNode) nodes.get(k);
+							if (adnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+								allAttributes.put(adnode);
+							}
+						}
+						cmattrMap = allAttributes;
+						
+						// iterate possible attributes from a cmnode in
+						// proposal list
+						for (int k = 0; (cmattrMap != null) && (k < cmattrMap.getLength()); k++) {
+							// check if name matches
+							if (cmattrMap.item(k).getNodeName().equals(attrMatchString)) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	protected boolean beginsWith(String aString, String prefix) {
+		if ((aString == null) || (prefix == null)) {
+			return true;
+		}
+		// (pa) matching independent of case to be consistant with Java
+		// editor CA
+		return aString.toLowerCase().startsWith(prefix.toLowerCase());
+	}
+
+	protected ContentAssistRequest computeAttributeProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		if (documentPosition < sdRegion.getStartOffset(completionRegion)) {
+			// setup to insert new attributes
+			contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+		}
+		else {
+			// Setup to replace an existing attribute name
+			contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);
+		}
+		addAttributeNameProposals(contentAssistRequest);
+		contentAssistRequest.setReplacementBeginPosition(documentPosition);
+		contentAssistRequest.setReplacementLength(0);
+		if ((node.getFirstStructuredDocumentRegion() != null) && (!node.getFirstStructuredDocumentRegion().isEnded())) {
+			addTagCloseProposals(contentAssistRequest);
+		}
+		return contentAssistRequest;
+	}
+
+	protected ContentAssistRequest computeAttributeValueProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		if ((documentPosition > sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) && (sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength() != sdRegion.getStartOffset(completionRegion) + completionRegion.getLength())) {
+			// setup to add a new attribute at the documentPosition
+			IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+			contentAssistRequest = newContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);
+			addAttributeNameProposals(contentAssistRequest);
+			if ((actualNode.getFirstStructuredDocumentRegion() != null) && !actualNode.getFirstStructuredDocumentRegion().isEnded()) {
+				addTagCloseProposals(contentAssistRequest);
+			}
+		}
+		else {
+			// setup to replace the existing value
+			if (!nodeAtOffset.getFirstStructuredDocumentRegion().isEnded() && (documentPosition < sdRegion.getStartOffset(completionRegion))) {
+				// if the IStructuredDocumentRegion isn't closed and the
+				// cursor is in front of the value, add
+				contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+				addAttributeNameProposals(contentAssistRequest);
+			}
+			else {
+				contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);
+				addAttributeValueProposals(contentAssistRequest);
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	protected ContentAssistRequest computeCompletionProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode treeNode, IDOMNode xmlnode) {
+		ContentAssistRequest contentAssistRequest = null;
+		String regionType = completionRegion.getType();
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+
+		// Handle the most common and best supported cases
+		if ((xmlnode.getNodeType() == Node.ELEMENT_NODE) || (xmlnode.getNodeType() == Node.DOCUMENT_NODE)) {
+			if (regionType == DOMRegionContext.XML_TAG_OPEN) {
+				contentAssistRequest = computeTagOpenProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_NAME) {
+				contentAssistRequest = computeTagNameProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+				contentAssistRequest = computeAttributeProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+				contentAssistRequest = computeEqualsProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+			else if ((regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) && (documentPosition == sdRegion.getTextEndOffset()) && (sdRegion.getText(completionRegion).endsWith("\"") || sdRegion.getText(completionRegion).endsWith("\'"))) //$NON-NLS-1$ //$NON-NLS-2$
+			{
+				// this is for when the cursor is at the end of the closing
+				// quote for an attribute..
+				IDOMNode actualNode = (IDOMNode) xmlnode.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+				contentAssistRequest = newContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);
+				addTagCloseProposals(contentAssistRequest);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+				contentAssistRequest = computeAttributeValueProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+			else if ((regionType == DOMRegionContext.XML_TAG_CLOSE) || (regionType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) || (regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_CLOSE))) {
+				contentAssistRequest = computeTagCloseProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+			else if (regionType == DOMRegionContext.XML_END_TAG_OPEN) {
+				contentAssistRequest = computeEndTagOpenProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+			else if ((regionType == DOMRegionContext.XML_CONTENT) || (regionType == DOMRegionContext.XML_CHAR_REFERENCE) || (regionType == DOMRegionContext.XML_ENTITY_REFERENCE) || (regionType == DOMRegionContext.XML_PE_REFERENCE)) {
+				contentAssistRequest = computeContentProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+			}
+
+			// These ITextRegion types begin DOM Elements as well and although
+			// internally harder to assist,
+			// text insertions directly before them can be made
+			else if ((documentPosition == sdRegion.getStartOffset(completionRegion)) && (regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DECLARATION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_EXPRESSION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_SCRIPTLET_OPEN) || (regionType == DOMRegionContext.XML_DECLARATION_OPEN) || (regionType == DOMRegionContext.XML_PI_OPEN) || (regionType == DOMRegionContext.XML_COMMENT_OPEN) || (regionType == DOMRegionContext.XML_CDATA_OPEN))) {
+				contentAssistRequest = newContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+				addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(treeNode));
+				addStartDocumentProposals(contentAssistRequest);
+			}
+		}
+		// Not a Document or Element? (odd cases go here for now)
+		else if (isCloseRegion(completionRegion)) {
+			contentAssistRequest = newContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion) + completionRegion.getLength(), 0, matchString);
+			addStartDocumentProposals(contentAssistRequest);
+			if (documentPosition >= sdRegion.getTextEndOffset(completionRegion)) {
+				addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(treeNode) + 1);
+			}
+		}
+		else if ((documentPosition == sdRegion.getStartOffset(completionRegion)) && (regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DECLARATION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_EXPRESSION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_SCRIPTLET_OPEN) || (regionType == DOMRegionContext.XML_DECLARATION_OPEN) || (regionType == DOMRegionContext.XML_PI_OPEN) || (regionType == DOMRegionContext.XML_COMMENT_OPEN) || (regionType == DOMRegionContext.XML_CDATA_OPEN))) {
+			contentAssistRequest = newContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+			addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(treeNode));
+			addStartDocumentProposals(contentAssistRequest);
+		}
+		return contentAssistRequest;
+	}
+
+	/**
+	 * CONTENT ASSIST STARTS HERE
+	 * 
+	 * Return a list of proposed code completions based on the specified
+	 * location within the document that corresponds to the current cursor
+	 * position within the text-editor control.
+	 * 
+	 * @param textViewer
+	 * @param documentPosition -
+	 *            the cursor location within the document
+	 * 
+	 * an array of ICompletionProposals
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer textViewer, int documentPosition) {
+
+		setErrorMessage(null);
+
+		fTextViewer = textViewer;
+
+		IndexedRegion treeNode = ContentAssistUtils.getNodeAt(textViewer, documentPosition);
+
+		Node node = (Node) treeNode;
+		while ((node != null) && (node.getNodeType() == Node.TEXT_NODE) && (node.getParentNode() != null)) {
+			node = node.getParentNode();
+		}
+		IDOMNode xmlnode = (IDOMNode) node;
+
+		ContentAssistRequest contentAssistRequest = null;
+
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		ITextRegion completionRegion = getCompletionRegion(documentPosition, node);
+
+		String matchString = getMatchString(sdRegion, completionRegion, documentPosition);
+
+		// Handle empty Documents
+		if (completionRegion == null) {
+			if (((treeNode == null) || (((Node) treeNode).getNodeType() == Node.DOCUMENT_NODE)) && (completionRegion == null) && ((xmlnode == null) || (xmlnode.getChildNodes() == null) || (xmlnode.getChildNodes().getLength() == 0))) {
+				IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(textViewer.getDocument());
+				try {
+					if (sModel != null) {
+						IDOMDocument docNode = ((IDOMModel) sModel).getDocument();
+						contentAssistRequest = newContentAssistRequest(docNode, docNode, sdRegion, completionRegion, documentPosition, 0, null);
+						addEmptyDocumentProposals(contentAssistRequest);
+					}
+				}
+				finally {
+					if (sModel != null) {
+						sModel.releaseFromRead();
+					}
+				}
+				if (contentAssistRequest == null) {
+					Logger.logException(new IllegalStateException("problem getting model")); //$NON-NLS-1$
+					return new ICompletionProposal[0];
+				}
+				return contentAssistRequest.getCompletionProposals();
+			}
+			// MASSIVE ERROR CONDITION
+			Logger.logException(new IllegalStateException("completion region was null")); //$NON-NLS-1$
+			setErrorMessage(INTERNALERROR);
+			contentAssistRequest = newContentAssistRequest((Node) treeNode, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, ""); //$NON-NLS-1$
+			return contentAssistRequest.getCompletionProposals();
+		}
+
+
+		// catch documents where no region can be determined
+		if ((xmlnode.getNodeType() == Node.DOCUMENT_NODE) && ((completionRegion == null) || (xmlnode.getChildNodes() == null) || (xmlnode.getChildNodes().getLength() == 0))) {
+			contentAssistRequest = computeStartDocumentProposals(documentPosition, matchString, completionRegion, (IDOMNode) treeNode, xmlnode);
+			return contentAssistRequest.getCompletionProposals();
+		}
+
+		// compute normal proposals
+		contentAssistRequest = computeCompletionProposals(documentPosition, matchString, completionRegion, (IDOMNode) treeNode, xmlnode);
+		if (contentAssistRequest == null) {
+			contentAssistRequest = newContentAssistRequest((Node) treeNode, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, ""); //$NON-NLS-1$
+			if (Debug.displayWarnings) {
+				System.out.println(UNKNOWN_CONTEXT + " " + completionRegion.getType() + "@" + documentPosition); //$NON-NLS-2$//$NON-NLS-1$
+			}
+			setErrorMessage(UNKNOWN_CONTEXT);
+		}
+
+		/* 
+		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=123892
+		 * Only set this error message if nothing else was already set 
+		 **/
+		if (contentAssistRequest.getProposals().size() == 0 && getErrorMessage() == null) {
+			setErrorMessage(UNKNOWN_CONTEXT);
+		}
+
+		return contentAssistRequest.getCompletionProposals();
+	}
+
+	protected ContentAssistRequest computeContentProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+
+		// setup to add children at the content node's position
+		contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, getStructuredDocumentRegion(documentPosition), completionRegion, documentPosition, 0, matchString);
+		if ((node != null) && (node.getNodeType() == Node.DOCUMENT_NODE) && (((Document) node).getDoctype() == null)) {
+			addStartDocumentProposals(contentAssistRequest);
+		}
+		addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));
+		if (node.getNodeType() != Node.DOCUMENT_NODE) {
+			addEndTagProposals(contentAssistRequest);
+		}
+		// entities?
+		addEntityProposals(contentAssistRequest, documentPosition, completionRegion, node);
+		// addEntityProposals(contentAssistRequest);
+		return contentAssistRequest;
+	}
+
+	/**
+	 * Returns information about possible contexts based on the specified
+	 * location within the document that corresponds to the current cursor
+	 * position within the text viewer.
+	 * 
+	 * @param viewer
+	 *            the viewer whose document is used to compute the possible
+	 *            contexts an array of context information objects or
+	 *            <code>null</code> if no context could be found
+	 */
+	public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
+		return new IContextInformation[0];
+	}
+
+	protected ContentAssistRequest computeEndTagOpenProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		int completionRegionStart = sdRegion.getStartOffset(completionRegion);
+		int completionRegionLength = completionRegion.getLength();
+		IStructuredDocumentRegion sdRegionAtCompletionOffset = node.getStructuredDocument().getRegionAtCharacterOffset(completionRegionStart + completionRegionLength);
+		ITextRegion regionAtEndOfCompletion = sdRegionAtCompletionOffset.getRegionAtCharacterOffset(completionRegionStart + completionRegionLength);
+
+		if ((documentPosition != completionRegionStart) && (regionAtEndOfCompletion != null) && (regionAtEndOfCompletion.getType() == DOMRegionContext.XML_TAG_NAME)) {
+			ITextRegion nameRegion = regionAtEndOfCompletion;
+			contentAssistRequest = newContentAssistRequest(nodeAtOffset, nodeAtOffset.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(nameRegion), nameRegion.getTextLength(), matchString);
+		}
+		else {
+			if (nodeAtOffset.getFirstStructuredDocumentRegion() == sdRegion) {
+				// abnormal case, this unmatched end tag will be a sibling
+				contentAssistRequest = newContentAssistRequest(nodeAtOffset, nodeAtOffset.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+			}
+			else {
+				// normal case, this end tag is the parent
+				contentAssistRequest = newContentAssistRequest(nodeAtOffset, nodeAtOffset, sdRegion, completionRegion, documentPosition, 0, matchString);
+			}
+		}
+		// if (documentPosition >= sdRegion.getStartOffset(completionRegion) +
+		// completionRegion.getTextLength())
+		addEndTagProposals(contentAssistRequest);
+		// else
+		if (completionRegionStart == documentPosition) {
+			// positioned at start of end tag
+			addTagInsertionProposals(contentAssistRequest, node.getChildNodes().getLength());
+		}
+		return contentAssistRequest;
+	}
+
+	/**
+	 * return all possible EntityReferenceProposals (according to current
+	 * position in doc)
+	 */
+	protected ICompletionProposal[] computeEntityReferenceProposals(int documentPosition, ITextRegion completionRegion, IDOMNode treeNode) {
+		// only handle XML content for now
+		Vector proposals = new Vector(); // ICompletionProposals
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		if ((completionRegion != null) && (completionRegion.getType() == DOMRegionContext.XML_CONTENT)) {
+			int nodeOffset = documentPosition - sdRegion.getStartOffset(completionRegion);
+			String regionText = sdRegion.getFullText(completionRegion);
+
+			// if directly to the right of a &, region will be null, need to
+			// move to
+			// the previous region...there might be a better way to do this
+			if ((regionText != null) && regionText.trim().equals("") && (documentPosition > 0)) { //$NON-NLS-1$
+				IStructuredDocumentRegion prev = treeNode.getStructuredDocument().getRegionAtCharacterOffset(documentPosition - 1);
+				if ((prev != null) && prev.getText().equals("&")) { //$NON-NLS-1$
+					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=206680
+					// examine previous region
+					sdRegion = prev;
+					completionRegion = prev.getLastRegion();
+					regionText = prev.getFullText();
+					nodeOffset = 1;
+				}
+			}
+
+			// string must start w/ &
+			if ((regionText != null) && regionText.startsWith("&")) { //$NON-NLS-1$						 		
+				String key = (nodeOffset > 0) ? regionText.substring(1, nodeOffset) : ""; //$NON-NLS-1$
+
+				// get entity proposals, passing in the appropriate start
+				// string
+				ModelQuery mq = ModelQueryUtil.getModelQuery(((Node) treeNode).getOwnerDocument());
+				if (mq != null) {
+					CMDocument xmlDoc = mq.getCorrespondingCMDocument(treeNode);
+					CMNamedNodeMap cmmap = null;
+					Properties entities = null;
+					if (xmlDoc != null) {
+						cmmap = xmlDoc.getEntities();
+					}
+					if (cmmap != null) {
+						entities = mapToProperties(cmmap);
+					}
+					else // 224787 in absence of content model, just use
+					// minimal 5 entities
+					{
+						entities = new Properties();
+						entities.put("quot", "\""); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("apos", "'"); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("amp", "&"); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("lt", "<"); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("gt", ">"); //$NON-NLS-1$ //$NON-NLS-2$	
+						entities.put("nbsp", " "); //$NON-NLS-1$ //$NON-NLS-2$									
+					}
+					addEntityProposals(proposals, entities, key, nodeOffset, sdRegion, completionRegion);
+				}
+			}
+		}
+		return (ICompletionProposal[]) ((proposals.size() > 0) ? proposals.toArray(new ICompletionProposal[proposals.size()]) : null);
+	}
+
+	protected ContentAssistRequest computeEqualsProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		ITextRegion valueRegion = node.getStartStructuredDocumentRegion().getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) + completionRegion.getLength());
+		if ((valueRegion != null) && (valueRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) && (sdRegion.getStartOffset(valueRegion) <= documentPosition)) {
+			// replace the adjacent attribute value
+			contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, valueRegion, sdRegion.getStartOffset(valueRegion), valueRegion.getTextLength(), matchString);
+		}
+		else {
+			// append an attribute value after the '='
+			contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+		}
+		addAttributeValueProposals(contentAssistRequest);
+		return contentAssistRequest;
+	}
+
+	protected ContentAssistRequest computeStartDocumentProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		// setup for a non-empty document, but one that hasn't been formally
+		// started
+		ContentAssistRequest contentAssistRequest = null;
+		contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, getStructuredDocumentRegion(documentPosition), completionRegion, documentPosition, 0, matchString);
+		addStartDocumentProposals(contentAssistRequest);
+		return contentAssistRequest;
+	}
+
+	protected ContentAssistRequest computeTagCloseProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+
+		if ((node.getNodeType() == Node.DOCUMENT_NODE) || (documentPosition >= sdRegion.getEndOffset())) {
+			// this is a content request as the documentPosition is AFTER the
+			// end of the closing region
+			if ((node == nodeAtOffset) && (node.getParentNode() != null)) {
+				node = (IDOMNode) node.getParentNode();
+			}
+			contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+			addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));
+			if ((node.getNodeType() != Node.DOCUMENT_NODE) && (node.getEndStructuredDocumentRegion() == null)) {
+				addEndTagProposals(contentAssistRequest);
+			}
+		}
+		else {
+			// at the start of the tag's close or within it
+			ITextRegion closeRegion = sdRegion.getLastRegion();
+			boolean insideTag = !sdRegion.isEnded() || (documentPosition <= sdRegion.getStartOffset(closeRegion));
+			if (insideTag) {
+				// this is a request for completions within a tag
+				contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+				if ((node.getNodeType() != Node.DOCUMENT_NODE) && (node.getEndStructuredDocumentRegion() != null)) {
+					addTagCloseProposals(contentAssistRequest);
+				}
+				if (sdRegion == nodeAtOffset.getFirstStructuredDocumentRegion()) {
+					contentAssistRequest.setReplacementBeginPosition(documentPosition);
+					contentAssistRequest.setReplacementLength(0);
+					addAttributeNameProposals(contentAssistRequest);
+				}
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	protected ContentAssistRequest computeTagNameProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+
+		if (sdRegion != nodeAtOffset.getFirstStructuredDocumentRegion()) {
+			// completing the *first* tag in "<tagname1 |<tagname2"
+			IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+			if (actualNode != null) {
+				if (actualNode.getFirstStructuredDocumentRegion() == sdRegion) {
+					// start tag
+					if (documentPosition > sdRegion.getStartOffset(completionRegion) + completionRegion.getLength()) {
+						// it's attributes
+						contentAssistRequest = newContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition - matchString.length(), matchString.length(), matchString);
+						if (node.getStructuredDocument().getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) - 1).getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) - 1).getType() == DOMRegionContext.XML_TAG_OPEN) {
+							addAttributeNameProposals(contentAssistRequest);
+						}
+						addTagCloseProposals(contentAssistRequest);
+					}
+					else {
+						// it's name
+						contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition - matchString.length(), matchString.length(), matchString);
+						addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(actualNode));
+					}
+				}
+				else {
+					if (documentPosition >= sdRegion.getStartOffset(completionRegion) + completionRegion.getLength()) {
+						// insert name
+						contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+					}
+					else {
+						// replace name
+						contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);
+					}
+					addEndTagNameProposals(contentAssistRequest);
+				}
+			}
+		}
+		else {
+			if (documentPosition > sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) {
+				// unclosed tag with only a name; should prompt for attributes
+				// and a close instead
+				contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition - matchString.length(), matchString.length(), matchString);
+				addAttributeNameProposals(contentAssistRequest);
+				addTagCloseProposals(contentAssistRequest);
+			}
+			else {
+				if (sdRegion.getRegions().get(0).getType() != DOMRegionContext.XML_END_TAG_OPEN) {
+					int replaceLength = documentPosition - sdRegion.getStartOffset(completionRegion);
+					contentAssistRequest = newContentAssistRequest(node, node.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), replaceLength, matchString);
+					addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));
+				}
+				else {
+					IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(documentPosition);
+					if (actualNode != null) {
+						if (documentPosition >= sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) {
+							contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+						}
+						else {
+							contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);
+						}
+						addEndTagNameProposals(contentAssistRequest);
+					}
+				}
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	protected ContentAssistRequest computeTagOpenProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		if (sdRegion != nodeAtOffset.getFirstStructuredDocumentRegion() || sdRegion.getPrevious() != null && sdRegion.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_TAG_OPEN) {
+			// completing the *first* XML_TAG_OPEN in "<<tagname"
+			IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+			if (actualNode != null) {
+				if(sdRegion.getFirstRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN) {
+					contentAssistRequest = newContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);
+					if(actualNode.hasChildNodes())
+						addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(actualNode.getLastChild()));
+					else
+						addTagNameProposals(contentAssistRequest, 0);
+				}
+				else {
+					contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+					addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(actualNode));
+				}
+				addEndTagProposals(contentAssistRequest); // (pa) 220850
+			}
+		}
+		else {
+			if (documentPosition == sdRegion.getStartOffset(completionRegion)) {
+				if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// at the start of an existing tag, right before the '<'
+					contentAssistRequest = newContentAssistRequest(nodeAtOffset, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+					addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));
+					addEndTagProposals(contentAssistRequest);
+				}
+				else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+					// at the opening of the VERY first tag with a '<'
+					contentAssistRequest = newContentAssistRequest(nodeAtOffset, node.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);
+					addStartDocumentProposals(contentAssistRequest);
+				}
+			}
+			else {
+				// within the white space
+				ITextRegion name = getNameRegion(node.getStartStructuredDocumentRegion());
+				// (pa) ITextRegion refactor
+				// if (name != null && name.containsOffset(documentPosition))
+				// {
+				if ((name != null) && ((sdRegion.getStartOffset(name) <= documentPosition) && (sdRegion.getEndOffset(name) >= documentPosition)) && (sdRegion.getLastRegion().getType() == DOMRegionContext.XML_TAG_CLOSE || sdRegion.getLastRegion().getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE)){ 
+					// replace the existing name
+					contentAssistRequest = newContentAssistRequest(node, node.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(name), name.getTextLength(), matchString);
+				}
+				else {
+					// insert a valid new name, or possibly an end tag
+					contentAssistRequest = newContentAssistRequest(nodeAtOffset, ((Node) nodeAtOffset).getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+					addEndTagProposals(contentAssistRequest);
+					contentAssistRequest.setReplacementBeginPosition(documentPosition);
+					contentAssistRequest.setReplacementLength(0);
+				}
+				addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	/**
+	 * Retreives cmnode's documentation to display in the completion
+	 * proposal's additional info. If no documentation exists for cmnode, try
+	 * displaying parentOrOwner's documentation
+	 * 
+	 * String any documentation information to display for cmnode.
+	 * <code>null</code> if there is nothing to display.
+	 */
+	protected String getAdditionalInfo(CMNode parentOrOwner, CMNode cmnode) {
+		String addlInfo = null;
+
+		if (cmnode == null) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return null;
+		}
+
+		addlInfo = getInfoProvider().getInfo(cmnode);
+		if ((addlInfo == null) && (parentOrOwner != null)) {
+			addlInfo = getInfoProvider().getInfo(parentOrOwner);
+		}
+		return addlInfo;
+	}
+
+	// returns a list of ModelQueryActions
+	protected List getAvailableChildrenAtIndex(Element parent, int index, int validityChecking) {
+		List list = new ArrayList();
+		CMElementDeclaration parentDecl = getCMElementDeclaration(parent);
+		if (parentDecl != null) {
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(parent.getOwnerDocument());
+			// taken from ActionManagers
+			// int editMode = modelQuery.getEditMode();
+			int editMode = ModelQuery.EDIT_MODE_UNCONSTRAINED;
+			int ic = (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) ? ModelQuery.INCLUDE_CHILD_NODES | ModelQuery.INCLUDE_SEQUENCE_GROUPS : ModelQuery.INCLUDE_CHILD_NODES;
+			modelQuery.getInsertActions(parent, parentDecl, index, ic, validityChecking, list);
+		}
+		return list;
+	}
+
+	// returns a list of CMElementDeclarations
+	protected List getAvailableRootChildren(Document document, int childIndex) {
+		List list = null;
+
+		// extract the valid 'root' node name from the DocumentType Node
+		DocumentType docType = document.getDoctype();
+		String rootName = null;
+		if (docType != null) {
+			rootName = docType.getNodeName();
+		}
+		if (rootName == null) {
+			return new ArrayList(0);
+		}
+
+		for (Node child = document.getFirstChild(); child != null; child = child.getNextSibling()) {
+			// make sure the "root" Element isn't already present
+			// is it required to be an Element?
+			if ((child.getNodeType() == Node.ELEMENT_NODE) && stringsEqual(child.getNodeName(), rootName)) {
+				// if the node is missing either the start or end tag, don't
+				// count it as present
+				if ((child instanceof IDOMNode) && ((((IDOMNode) child).getStartStructuredDocumentRegion() == null) || (((IDOMNode) child).getEndStructuredDocumentRegion() == null))) {
+					continue;
+				}
+				if (Debug.displayInfo) {
+					System.out.println(rootName + " already present!"); //$NON-NLS-1$
+				}
+				setErrorMessage(NLS.bind(XMLUIMessages.The_document_element__, (new Object[]{rootName})));
+				return new ArrayList(0);
+			}
+		}
+
+		list = new ArrayList(1);
+		ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document);
+		if (modelQuery != null) {
+			CMDocument cmdoc = modelQuery.getCorrespondingCMDocument(document);
+			if (cmdoc != null) {
+				if (rootName != null) {
+					CMElementDeclaration rootDecl = (CMElementDeclaration) cmdoc.getElements().getNamedItem(rootName);
+					if (rootDecl != null) {
+						list.add(rootDecl);
+					}
+					else {
+						// supply the given document name anyway, even if it
+						// is an error
+						list.add(new SimpleCMElementDeclaration(rootName));
+						if (Debug.displayInfo || Debug.displayWarnings) {
+							System.out.println("No definition found for " + rootName + " in " + docType.getPublicId() + "/" + docType.getSystemId()); //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+						}
+						String location = "" + (docType.getPublicId() != null ? docType.getPublicId() + "/" : "") + (docType.getSystemId() != null ? docType.getSystemId() : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+						//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+						//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+						if (location.length() > 0) {
+							setErrorMessage(NLS.bind(XMLUIMessages.No_definition_for_in, (new Object[]{rootName, location})));
+						}
+						else {
+							setErrorMessage(NLS.bind(XMLUIMessages.No_definition_for, (new Object[]{rootName})));
+						}
+					}
+				}
+			}
+			else {
+				if (Debug.displayInfo || Debug.displayWarnings) {
+					System.out.println("No content model found."); //$NON-NLS-1$
+				}
+				//$NON-NLS-1$
+				//$NON-NLS-1$
+				String location = "" + (docType.getPublicId() != null ? docType.getPublicId() + "/" : "") + (docType.getSystemId() != null ? docType.getSystemId() : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+				//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+				//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+				if (location.length() > 0) {
+					setErrorMessage(NLS.bind(XMLUIMessages.No_content_model_for, (new Object[]{location})));
+				}
+				else {
+					setErrorMessage(XMLUIMessages.No_content_model_found_UI_);
+				}
+			}
+		}
+
+		return list;
+	}
+
+	protected CMElementDeclaration getCMElementDeclaration(Node node) {
+		CMElementDeclaration result = null;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+			if (modelQuery != null) {
+				result = modelQuery.getCMElementDeclaration((Element) node);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Returns the characters which when entered by the user should
+	 * automatically trigger the presentation of possible completions.
+	 * 
+	 * the auto activation characters for completion proposal or
+	 * <code>null</code> if no auto activation is desired
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return completionProposalAutoActivationCharacters;
+	}
+
+	protected ITextRegion getCompletionRegion(int offset, IStructuredDocumentRegion sdRegion) {
+		ITextRegion region = sdRegion.getRegionAtCharacterOffset(offset);
+		if (region == null) {
+			return null;
+		}
+
+		if (sdRegion.getStartOffset(region) == offset) {
+			// The offset is at the beginning of the region
+			if ((sdRegion.getStartOffset(region) == sdRegion.getStartOffset()) && (sdRegion.getPrevious() != null) && (!sdRegion.getPrevious().isEnded())) {
+				// Is the region also the start of the node? If so, the
+				// previous IStructuredDocumentRegion is
+				// where to look for a useful region.
+				region = sdRegion.getPrevious().getRegionAtCharacterOffset(offset - 1);
+			}
+			else {
+				// Is there no separating whitespace from the previous region?
+				// If not,
+				// then that region is the important one
+				ITextRegion previousRegion = sdRegion.getRegionAtCharacterOffset(offset - 1);
+				if ((previousRegion != null) && (previousRegion != region) && (previousRegion.getTextLength() == previousRegion.getLength())) {
+					region = previousRegion;
+				}
+			}
+		}
+		else {
+			// The offset is NOT at the beginning of the region
+			if (offset > sdRegion.getStartOffset(region) + region.getTextLength()) {
+				// Is the offset within the whitespace after the text in this
+				// region?
+				// If so, use the next region
+				ITextRegion nextRegion = sdRegion.getRegionAtCharacterOffset(sdRegion.getStartOffset(region) + region.getLength());
+				if (nextRegion != null) {
+					region = nextRegion;
+				}
+			}
+			else {
+				// Is the offset within the important text for this region?
+				// If so, then we've already got the right one.
+			}
+		}
+
+		// valid WHITE_SPACE region handler (#179924)
+		if ((region != null) && (region.getType() == DOMRegionContext.WHITE_SPACE)) {
+			ITextRegion previousRegion = sdRegion.getRegionAtCharacterOffset(sdRegion.getStartOffset(region) - 1);
+			if (previousRegion != null) {
+				region = previousRegion;
+			}
+		}
+
+		return region;
+	}
+
+	/**
+	 * Return the region whose content's require completion. This is something
+	 * of a misnomer as sometimes the user wants to be prompted for contents
+	 * of a non-existant ITextRegion, such as for enumerated attribute values
+	 * following an '=' sign.
+	 */
+	protected ITextRegion getCompletionRegion(int documentPosition, Node domnode) {
+		if (domnode == null) {
+			return null;
+		}
+
+		ITextRegion region = null;
+		int offset = documentPosition;
+		IStructuredDocumentRegion flatNode = null;
+		IDOMNode node = (IDOMNode) domnode;
+
+		if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			if (node.getStructuredDocument().getLength() == 0) {
+				return null;
+			}
+			ITextRegion result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);
+			while (result == null) {
+				offset--;
+				result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);
+			}
+			return result;
+		}
+
+		IStructuredDocumentRegion startTag = node.getStartStructuredDocumentRegion();
+		IStructuredDocumentRegion endTag = node.getEndStructuredDocumentRegion();
+
+		// Determine if the offset is within the start
+		// IStructuredDocumentRegion, end IStructuredDocumentRegion, or
+		// somewhere within the Node's XML content.
+		if ((startTag != null) && (startTag.getStartOffset() <= offset) && (offset < startTag.getStartOffset() + startTag.getLength())) {
+			flatNode = startTag;
+		}
+		else if ((endTag != null) && (endTag.getStartOffset() <= offset) && (offset < endTag.getStartOffset() + endTag.getLength())) {
+			flatNode = endTag;
+		}
+
+		if (flatNode != null) {
+			// the offset is definitely within the start or end tag, continue
+			// on and find the region
+			region = getCompletionRegion(offset, flatNode);
+		}
+		else {
+			// the docPosition is neither within the start nor the end, so it
+			// must be content
+			flatNode = node.getStructuredDocument().getRegionAtCharacterOffset(offset);
+			// (pa) ITextRegion refactor
+			// if (flatNode.contains(documentPosition)) {
+			if ((flatNode.getStartOffset() <= documentPosition) && (flatNode.getEndOffset() >= documentPosition)) {
+				// we're interesting in completing/extending the previous
+				// IStructuredDocumentRegion if the current
+				// IStructuredDocumentRegion isn't plain content or if it's
+				// preceded by an orphan '<'
+				if ((offset == flatNode.getStartOffset()) && (flatNode.getPrevious() != null) && (((flatNode.getRegionAtCharacterOffset(documentPosition) != null) && (flatNode.getRegionAtCharacterOffset(documentPosition).getType() != DOMRegionContext.XML_CONTENT)) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_TAG_OPEN) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN))) {
+					// Is the region also the start of the node? If so, the
+					// previous IStructuredDocumentRegion is
+					// where to look for a useful region.
+					region = flatNode.getPrevious().getLastRegion();
+				}
+				else if (flatNode.getEndOffset() == documentPosition) {
+					region = flatNode.getLastRegion();
+				}
+				else {
+					region = flatNode.getFirstRegion();
+				}
+			}
+			else {
+				// catch end of document positions where the docPosition isn't
+				// in a IStructuredDocumentRegion
+				region = flatNode.getLastRegion();
+			}
+		}
+
+		return region;
+	}
+
+	/**
+	 * Provided by default. Subclasses may override with their own
+	 * implementations.
+	 * 
+	 * @see AbstractContentAssistProcessor#getContentGenerator()
+	 */
+	public XMLContentModelGenerator getContentGenerator() {
+		if (fGenerator == null) {
+			fGenerator = new XMLContentModelGenerator();
+		}
+		return fGenerator;
+	}
+
+	/**
+	 * Returns the characters which when entered by the user should
+	 * automatically trigger the presentation of context information.
+	 * 
+	 * the auto activation characters for presenting context information or
+	 * <code>null</code> if no auto activation is desired
+	 */
+	public char[] getContextInformationAutoActivationCharacters() {
+		return contextInformationAutoActivationCharacters;
+	}
+
+	/**
+	 * Returns a validator used to determine when displayed context
+	 * information should be dismissed. May only return <code>null</code> if
+	 * the processor is incapable of computing context information.
+	 * 
+	 * a context information validator, or <code>null</code> if the
+	 * processor is incapable of computing context information
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		if (fContextInformationPresenter == null) {
+			fContextInformationPresenter = new AttributeContextInformationPresenter();
+		}
+		return fContextInformationPresenter;
+	}
+
+	protected int getElementPosition(Node child) {
+		Node parent = child.getParentNode();
+		if (parent == null) {
+			return 0;
+		}
+
+		NodeList children = parent.getChildNodes();
+		if (children == null) {
+			return 0;
+		}
+		int count = 0;
+
+		for (int i = 0; i < children.getLength(); i++) {
+			if (children.item(i) == child) {
+				return count;
+			}
+			else {
+				// if (children.item(i).getNodeType() == Node.ELEMENT_NODE)
+				count++;
+			}
+		}
+		return 0;
+	}
+
+	private int getElementPositionForModelQuery(Node child) {
+		return getElementPosition(child);
+		// return -1;
+	}
+
+	/**
+	 * Return the reason why computeProposals was not able to find any
+	 * completions.
+	 * 
+	 * an error message or null if no error occurred
+	 */
+	public String getErrorMessage() {
+		return fErrorMessage;
+	}
+
+	/**
+	 * @param iResource
+	 */
+	// public void initialize(IResource iResource) {
+	// this.resource = iResource;
+	// }
+	/**
+	 * Gets the infoProvider.
+	 * 
+	 * fInfoProvider and if fInfoProvider was <code>null</code> create a new
+	 * instance
+	 */
+	public MarkupTagInfoProvider getInfoProvider() {
+		if (fInfoProvider == null) {
+			fInfoProvider = new MarkupTagInfoProvider();
+		}
+		return fInfoProvider;
+	}
+
+	protected String getMatchString(IStructuredDocumentRegion parent, ITextRegion aRegion, int offset) {
+		if ((aRegion == null) || isCloseRegion(aRegion)) {
+			return ""; //$NON-NLS-1$
+		}
+		String matchString = null;
+		String regionType = aRegion.getType();
+		if ((regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) || (regionType == DOMRegionContext.XML_TAG_OPEN) || (offset > parent.getStartOffset(aRegion) + aRegion.getTextLength())) {
+			matchString = ""; //$NON-NLS-1$
+		}
+		else if (regionType == DOMRegionContext.XML_CONTENT) {
+			matchString = ""; //$NON-NLS-1$
+		}
+		else {
+			if ((parent.getText(aRegion).length() > 0) && (parent.getStartOffset(aRegion) < offset)) {
+				matchString = parent.getText(aRegion).substring(0, offset - parent.getStartOffset(aRegion));
+			}
+			else {
+				matchString = ""; //$NON-NLS-1$
+			}
+		}
+		return matchString;
+	}
+
+	protected ITextRegion getNameRegion(IStructuredDocumentRegion flatNode) {
+		if (flatNode == null) {
+			return null;
+		}
+		Iterator regionList = flatNode.getRegions().iterator();
+		while (regionList.hasNext()) {
+			ITextRegion region = (ITextRegion) regionList.next();
+			if (isNameRegion(region)) {
+				return region;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Retrieves all of the possible valid values for this attribute
+	 * declaration
+	 */
+	protected List getPossibleDataTypeValues(Node node, CMAttributeDeclaration ad) {
+		List list = null;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			Element element = (Element) node;
+			String[] dataTypeValues = null;
+			// The ModelQuery may not be available if the corresponding
+			// adapter
+			// is absent
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
+			if (modelQuery != null) {
+				dataTypeValues = modelQuery.getPossibleDataTypeValues(element, ad);
+			}
+			else {
+				if (ad.getAttrType() != null) {
+					dataTypeValues = ad.getAttrType().getEnumeratedValues();
+				}
+			}
+			if (dataTypeValues != null) {
+				list = new ArrayList(dataTypeValues.length);
+				for (int i = 0; i < dataTypeValues.length; i++) {
+					list.add(dataTypeValues[i]);
+				}
+			}
+		}
+		if (list == null) {
+			list = new ArrayList(0);
+		}
+		return list;
+	}
+
+	protected String getRequiredName(Node parentOrOwner, CMNode cmnode) {
+		if ((cmnode == null) || (parentOrOwner == null)) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return ""; //$NON-NLS-1$
+		}
+		return getContentGenerator().getRequiredName(parentOrOwner, cmnode);
+	}
+
+	protected String getRequiredText(Node parentOrOwner, CMAttributeDeclaration attrDecl) {
+		if (attrDecl == null) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null attribute declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return ""; //$NON-NLS-1$
+		}
+		StringBuffer buff = new StringBuffer();
+		getContentGenerator().generateRequiredAttribute(parentOrOwner, attrDecl, buff);
+		return buff.toString();
+	}
+
+	protected String getRequiredText(Node parentOrOwner, CMElementDeclaration elementDecl) {
+		if (elementDecl == null) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null attribute declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return ""; //$NON-NLS-1$
+		}
+		StringBuffer buff = new StringBuffer();
+		getContentGenerator().generateTag(parentOrOwner, elementDecl, buff);
+		return buff.toString();
+	}
+
+	/**
+	 * StructuredTextViewer must be set before using this.
+	 */
+	public IStructuredDocumentRegion getStructuredDocumentRegion(int pos) {
+		// (pa) ITextRegion refactor defect 245190
+		// return
+		// (IStructuredDocumentRegion)ContentAssistUtils.getNodeAt((StructuredTextViewer)fTextViewer,
+		// pos);
+		return ContentAssistUtils.getStructuredDocumentRegion(fTextViewer, pos);
+	}
+
+	private String getTagName(IStructuredDocumentRegion sdRegion) {
+		ITextRegionList regions = sdRegion.getRegions();
+		ITextRegion region = null;
+		String name = ""; //$NON-NLS-1$
+		for (int i = 0; i < regions.size(); i++) {
+			region = regions.get(i);
+			if (region.getType() == DOMRegionContext.XML_TAG_NAME) {
+				name = sdRegion.getText(region);
+				break;
+			}
+		}
+		return name;
+	}
+
+	// returns a list of CMNodes that are available within this parent context
+	// Given the grammar shown below and a snippet of XML code (where the '|'
+	// indicated the cursor position)
+	// the list would return all of the element declarations that are
+	// potential child elements of Foo.
+	//
+	// grammar : Foo -> (A, B, C)
+	// snippet : <Foo><A>|
+	// result : {A, B, C}
+	// 
+	// TODO cs... do we need to pass in the 'kindOfAction'? Seems to me we
+	// could assume it's always an insert.
+	protected List getAvailableChildElementDeclarations(Element parent, int childPosition, int kindOfAction) {
+		List modelQueryActions = getAvailableChildrenAtIndex(parent, childPosition, ModelQuery.VALIDITY_NONE);
+		Iterator iterator = modelQueryActions.iterator();
+		List cmnodes = new Vector();
+		while (iterator.hasNext()) {
+			ModelQueryAction action = (ModelQueryAction) iterator.next();
+			if ((childPosition < 0) || (((action.getStartIndex() <= childPosition) && (childPosition <= action.getEndIndex())) && (action.getKind() == kindOfAction))) {
+				CMNode actionCMNode = action.getCMNode();
+				if ((actionCMNode != null) && !cmnodes.contains(actionCMNode)) {
+					cmnodes.add(actionCMNode);
+				}
+			}
+		}
+		return cmnodes;
+	}
+
+	// returns a list of CMNodes that can be validly inserted at this
+	// childPosition
+	// Given the grammar shown below and a snippet of XML code (where the '|'
+	// indicated the cursor position)
+	// the list would return only the element declarations can be inserted
+	// while maintaing validity of the content.
+	//
+	// grammar : Foo -> (A, B, C)
+	// snippet : <Foo><A>|
+	// result : {B}
+	//    
+	protected List getValidChildElementDeclarations(Element parent, int childPosition, int kindOfAction) {
+		List modelQueryActions = getAvailableChildrenAtIndex(parent, childPosition, ModelQuery.VALIDITY_STRICT);
+		Iterator iterator = modelQueryActions.iterator();
+		List cmnodes = new Vector();
+		while (iterator.hasNext()) {
+			ModelQueryAction action = (ModelQueryAction) iterator.next();
+			if ((childPosition < 0) || (((action.getStartIndex() <= childPosition) && (childPosition <= action.getEndIndex())) && (action.getKind() == kindOfAction))) {
+				CMNode actionCMNode = action.getCMNode();
+				if ((actionCMNode != null) && !cmnodes.contains(actionCMNode)) {
+					cmnodes.add(actionCMNode);
+				}
+			}
+		}
+		return cmnodes;
+	}
+
+	/**
+	 * Similar to the call in HTMLContentAssistProcessor. Pass in a node, it
+	 * tells you if the document is XML type.
+	 * 
+	 * @param node
+	 * 
+	 */
+	protected boolean getXML(Node node) {
+		if (node == null) {
+			return false;
+		}
+
+		Document doc = null;
+		doc = (node.getNodeType() != Node.DOCUMENT_NODE) ? node.getOwnerDocument() : ((Document) node);
+
+		return (doc instanceof IDOMDocument) && ((IDOMDocument) doc).isXMLType();
+	}
+
+	// Initialize local settings
+	protected void init() {
+		// implement in subclasses
+	}
+
+	protected boolean isCloseRegion(ITextRegion region) {
+		String type = region.getType();
+		return ((type == DOMRegionContext.XML_PI_CLOSE) || (type == DOMRegionContext.XML_TAG_CLOSE) || (type == DOMRegionContext.XML_EMPTY_TAG_CLOSE) || (type == DOMRegionContext.XML_CDATA_CLOSE) || (type == DOMRegionContext.XML_COMMENT_CLOSE) || (type == DOMRegionContext.XML_ATTLIST_DECL_CLOSE) || (type == DOMRegionContext.XML_ELEMENT_DECL_CLOSE) || (type == DOMRegionContext.XML_DOCTYPE_DECLARATION_CLOSE) || (type == DOMJSPRegionContextsPrivateCopy.JSP_CLOSE) || (type == DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_CLOSE) || (type.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_CLOSE)) || (type == DOMRegionContext.XML_DECLARATION_CLOSE));
+	}
+
+	/*
+	 * This is to determine if a tag is a special meta-info comment tag that
+	 * shows up as an ELEMENT
+	 */
+	private boolean isCommentNode(IDOMNode node) {
+		return ((node != null) && (node instanceof IDOMElement) && ((IDOMElement) node).isCommentTag());
+	}
+
+	/**
+	 * Checks if cursor position is after doctype tag...
+	 * 
+	 * @param car
+	 * 
+	 */
+	protected boolean isCursorAfterDoctype(ContentAssistRequest car) {
+		Node aNode = car.getNode();
+		Document parent = aNode.getOwnerDocument();
+		int xmldoctypeNodePosition = -1;
+		boolean isAfterDoctype = true;
+
+		if (parent == null) {
+			return true; // blank document case
+		}
+
+		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
+			if (child instanceof IDOMNode) {
+				if (child.getNodeType() == Node.DOCUMENT_TYPE_NODE) {
+					xmldoctypeNodePosition = ((IDOMNode) child).getEndOffset();
+					isAfterDoctype = (car.getReplacementBeginPosition() >= xmldoctypeNodePosition);
+					break;
+				}
+			}
+		}
+		return isAfterDoctype;
+	}
+
+	/**
+	 * This method can check if the cursor is after the XMLPI
+	 * 
+	 * @param car
+	 * 
+	 */
+	protected boolean isCursorAfterXMLPI(ContentAssistRequest car) {
+		Node aNode = car.getNode();
+		boolean xmlpiFound = false;
+		Document parent = aNode.getOwnerDocument();
+		int xmlpiNodePosition = -1;
+		boolean isAfterXMLPI = false;
+
+		if (parent == null) {
+			return true; // blank document case
+		}
+
+		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
+			boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) && child.getNodeName().equals("xml")); //$NON-NLS-1$
+			xmlpiFound = xmlpiFound || xmlpi;
+			if (xmlpiFound) {
+				if (child instanceof IDOMNode) {
+					xmlpiNodePosition = ((IDOMNode) child).getEndOffset();
+					isAfterXMLPI = (car.getReplacementBeginPosition() >= xmlpiNodePosition);
+				}
+				break;
+			}
+		}
+		return isAfterXMLPI;
+	}
+
+	protected boolean isNameRegion(ITextRegion region) {
+		String type = region.getType();
+		return ((type == DOMRegionContext.XML_TAG_NAME) || (type == DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_NAME) || (type == DOMRegionContext.XML_ELEMENT_DECL_NAME) || (type == DOMRegionContext.XML_DOCTYPE_NAME) || (type == DOMRegionContext.XML_ATTLIST_DECL_NAME) || (type == DOMJSPRegionContextsPrivateCopy.JSP_ROOT_TAG_NAME) || type.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_NAME));
+	}
+
+	protected boolean isQuote(String string) {
+		String trimmed = string.trim();
+		if (trimmed.length() > 0) {
+			return (trimmed.charAt(0) == '\'') || (trimmed.charAt(0) == '"');
+		}
+		return false;
+	}
+
+	private boolean isSelfClosed(IStructuredDocumentRegion startTag) {
+		ITextRegionList regions = startTag.getRegions();
+		return regions.get(regions.size() - 1).getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE;
+	}
+
+	private boolean isStartTag(IStructuredDocumentRegion sdRegion) {
+		boolean result = false;
+		if (sdRegion.getRegions().size() > 0) {
+			ITextRegion r = sdRegion.getRegions().get(0);
+			result = (r.getType() == DOMRegionContext.XML_TAG_OPEN) && sdRegion.isEnded();
+		}
+		return result;
+	}
+
+	protected Properties mapToProperties(CMNamedNodeMap map) {
+		Properties p = new Properties();
+		for (int i = 0; i < map.getLength(); i++) {
+			CMEntityDeclaration decl = (CMEntityDeclaration) map.item(i);
+			p.put(decl.getName(), decl.getValue());
+		}
+		return p;
+	}
+
+	/**
+	 * Gets the corresponding XMLNode, and checks if it's closed.
+	 * 
+	 * @param startTag
+	 * 
+	 */
+	private boolean needsEndTag(IStructuredDocumentRegion startTag) {
+		boolean result = false;
+		IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(fTextViewer.getDocument());
+		try {
+			if (sModel != null) {
+				IDOMNode xmlNode = (IDOMNode) sModel.getIndexedRegion(startTag.getStart());
+				if (!isStartTag(startTag)) {
+					result = false;
+				}
+				else if (isSelfClosed(startTag)) {
+					result = false;
+				}
+				else if (!xmlNode.isContainer()) {
+					result = false;
+				}
+				else {
+					result = xmlNode.getEndStructuredDocumentRegion() == null;
+				}
+			}
+		}
+		finally {
+			if (sModel != null) {
+				sModel.releaseFromRead();
+			}
+		}
+		return result;
+	}
+
+	protected ContentAssistRequest newContentAssistRequest(Node node, Node possibleParent, IStructuredDocumentRegion documentRegion, ITextRegion completionRegion, int begin, int length, String filter) {
+		return new ContentAssistRequest(node, possibleParent, documentRegion, completionRegion, begin, length, filter);
+	}
+
+	public void release() {
+		fGenerator = null;
+	}
+
+	/**
+	 * Set the reason why computeProposals was not able to find any
+	 * completions.
+	 */
+	public void setErrorMessage(String errorMessage) {
+		fErrorMessage = errorMessage;
+	}
+
+	/**
+	 * Set the reason why computeProposals was not able to find any
+	 * completions.
+	 */
+	protected void setErrorMessage(String errorMessage, String append) {
+		setErrorMessage(errorMessage + append);
+	}
+
+	/**
+	 * Set the reason why computeProposals was not able to find any
+	 * completions.
+	 */
+	protected void setErrorMessage(String errorMessage, String prepend, String append) {
+		setErrorMessage(prepend + errorMessage + append);
+	}
+
+	protected boolean stringsEqual(String a, String b) {
+		// (pa) 221190 matching independent of case to be consistant with Java
+		// editor CA
+		return a.equalsIgnoreCase(b);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentModelGenerator.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentModelGenerator.java
new file mode 100644
index 0000000..7884482
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentModelGenerator.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
+import org.w3c.dom.Node;
+
+
+public abstract class AbstractContentModelGenerator {
+
+	public static boolean generateChildren = false;
+
+	public AbstractContentModelGenerator() {
+		super();
+	}
+
+	public abstract void generateAttribute(CMAttributeDeclaration attrDecl, StringBuffer buffer);
+
+	protected void generateAttributes(CMElementDeclaration elementDecl, StringBuffer buffer) {
+		CMNamedNodeMap attributes = elementDecl.getAttributes();
+		if (attributes == null) {
+			return;
+		}
+		for (int i = 0; i < attributes.getLength(); i++) {
+			generateAttribute((CMAttributeDeclaration) attributes.item(i), buffer);
+		}
+		return;
+	}
+
+	protected abstract void generateEndTag(String tagName, Node parentNode, CMElementDeclaration elementDecl, StringBuffer buffer);
+
+	public void generateRequiredChildren(Node parentNode, CMElementDeclaration elementDecl, StringBuffer buffer) {
+		if (generateChildren) {
+		}
+		return;
+	}
+
+	protected abstract void generateStartTag(String tagName, Node parentNode, CMElementDeclaration elementDecl, StringBuffer buffer);
+
+	public void generateTag(Node parent, CMElementDeclaration elementDecl, StringBuffer buffer) {
+		if ((elementDecl == null) || (buffer == null)) {
+			return;
+		}
+
+		String tagName = getRequiredName(parent, elementDecl);
+
+		generateStartTag(tagName, parent, elementDecl, buffer);
+		generateRequiredChildren(parent, elementDecl, buffer);
+		generateEndTag(tagName, parent, elementDecl, buffer);
+		return;
+	}
+
+	public abstract int getMinimalStartTagLength(Node node, CMElementDeclaration elementDecl);
+
+	public String getRequiredName(Node ownerNode, CMNode cmnode) {
+		if (ownerNode != null) {
+			return DOMNamespaceHelper.computeName(cmnode, ownerNode, null);
+		}
+		return cmnode.getNodeName();
+	}
+
+	public abstract String getStartTagClose(Node parentNode, CMElementDeclaration elementDecl);
+
+	protected boolean requiresAttributes(CMElementDeclaration ed) {
+		CMNamedNodeMap attributes = ed.getAttributes();
+		if (attributes == null) {
+			return false;
+		}
+		for (int i = 0; i < attributes.getLength(); i++) {
+			if (((CMAttributeDeclaration) attributes.item(i)).getUsage() == CMAttributeDeclaration.REQUIRED) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractXMLCompletionProposalComputer.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractXMLCompletionProposalComputer.java
new file mode 100644
index 0000000..dd21a18
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractXMLCompletionProposalComputer.java
@@ -0,0 +1,1112 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * <p>Implements the framework for making proposals in XML type documents.  Deals with
+ * all the nastiness needed to figure out where in an XML type document the content
+ * assist was invoked and then calls one of many abstract methods depending on the
+ * area the content assist was invoked.  In this way implementers only have to worry about
+ * implementing what to do in each situation while not having to deal with figuring out
+ * which situation the content assist was invoked in.</p>
+ * 
+ * @base org.eclipse.wst.xml.ui.internal.contentassist.AbstractContentAssistProcessor
+ * @see DefaultXMLCompletionProposalComputer
+ */
+public abstract class AbstractXMLCompletionProposalComputer implements ICompletionProposalComputer {
+	/**
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	private class DOMJSPRegionContextsPrivateCopy {
+		private static final String JSP_CLOSE = "JSP_CLOSE"; //$NON-NLS-1$
+		private static final String JSP_COMMENT_CLOSE = "JSP_COMMENT_CLOSE"; //$NON-NLS-1$
+
+		private static final String JSP_COMMENT_OPEN = "JSP_COMMENT_OPEN"; //$NON-NLS-1$
+		private static final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$
+		private static final String JSP_DIRECTIVE_CLOSE = "JSP_DIRECTIVE_CLOSE"; //$NON-NLS-1$
+		private static final String JSP_DIRECTIVE_NAME = "JSP_DIRECTIVE_NAME"; //$NON-NLS-1$
+
+		private static final String JSP_DIRECTIVE_OPEN = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$
+		private static final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$NON-NLS-1$
+
+		private static final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$
+
+		private static final String JSP_SCRIPTLET_OPEN = "JSP_SCRIPTLET_OPEN"; //$NON-NLS-1$
+	}
+
+	private String fErrorMessage;
+	private ITextViewer fTextViewer;
+
+	public AbstractXMLCompletionProposalComputer() {
+		fErrorMessage = null;
+		fTextViewer = null;
+	}
+	
+	/**
+	 * <p>Return a list of proposed code completions based on the specified
+	 * location within the document that corresponds to the current cursor
+	 * position within the text-editor control.</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer#computeCompletionProposals(org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public List computeCompletionProposals(
+			CompletionProposalInvocationContext context,
+			IProgressMonitor monitor) {
+		
+		ITextViewer textViewer = context.getViewer();
+		int documentPosition = context.getInvocationOffset();
+
+		setErrorMessage(null);
+
+		fTextViewer = textViewer;
+
+		IndexedRegion treeNode = ContentAssistUtils.getNodeAt(textViewer, documentPosition);
+
+		Node node = (Node) treeNode;
+		while ((node != null) && (node.getNodeType() == Node.TEXT_NODE) && (node.getParentNode() != null)) {
+			node = node.getParentNode();
+		}
+		IDOMNode xmlnode = (IDOMNode) node;
+
+		ContentAssistRequest contentAssistRequest = null;
+
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		ITextRegion completionRegion = getCompletionRegion(documentPosition, node);
+
+		String matchString = getMatchString(sdRegion, completionRegion, documentPosition);
+
+		// Handle empty Documents
+		if (completionRegion == null) {
+			if (((treeNode == null) || (((Node) treeNode).getNodeType() == Node.DOCUMENT_NODE)) && (completionRegion == null) &&
+					((xmlnode == null) || (xmlnode.getChildNodes() == null) || (xmlnode.getChildNodes().getLength() == 0))) {
+				
+				IStructuredModel sModel = null;
+				try {
+					if(textViewer.getDocument() instanceof IStructuredDocument) {
+						sModel = StructuredModelManager.getModelManager().getModelForRead((IStructuredDocument)textViewer.getDocument());
+					}
+					if (sModel != null) {
+						IDOMDocument docNode = ((IDOMModel) sModel).getDocument();
+						contentAssistRequest = new ContentAssistRequest(docNode, docNode, sdRegion, completionRegion, documentPosition, 0, null);
+						addEmptyDocumentProposals(contentAssistRequest, context);
+					}
+				}
+				finally {
+					if (sModel != null) {
+						sModel.releaseFromRead();
+					}
+				}
+				if (contentAssistRequest == null) {
+					Logger.logException(new IllegalStateException("problem getting model")); //$NON-NLS-1$
+					return new ArrayList(0);
+				}
+				
+				ICompletionProposal[] props = contentAssistRequest.getCompletionProposals();
+				return (props != null) ? Arrays.asList(props) : new ArrayList(0);
+			}
+			// MASSIVE ERROR CONDITION
+			Logger.logException(new IllegalStateException("completion region was null")); //$NON-NLS-1$
+			setErrorMessage(XMLUIMessages.SEVERE_internal_error_occu_UI_);
+			contentAssistRequest = new ContentAssistRequest((Node) treeNode, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, ""); //$NON-NLS-1$
+			ICompletionProposal[] props = contentAssistRequest.getCompletionProposals();
+			return (props != null) ? Arrays.asList(props) : new ArrayList(0);
+		}
+
+
+		// catch documents where no region can be determined
+		if ((xmlnode.getNodeType() == Node.DOCUMENT_NODE) && ((completionRegion == null) ||
+				(xmlnode.getChildNodes() == null) || (xmlnode.getChildNodes().getLength() == 0))) {
+			
+			contentAssistRequest = computeStartDocumentProposals(matchString, completionRegion,
+					(IDOMNode) treeNode,xmlnode, context);
+			ICompletionProposal[] props = contentAssistRequest.getCompletionProposals();
+			return (props != null) ? Arrays.asList(props) : new ArrayList(0);
+		}
+
+		// compute normal proposals
+		contentAssistRequest = computeCompletionProposals(matchString, completionRegion, (IDOMNode) treeNode, xmlnode, context);
+		if (contentAssistRequest == null) {
+			contentAssistRequest = new ContentAssistRequest((Node) treeNode, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, ""); //$NON-NLS-1$
+			setErrorMessage(XMLUIMessages.Content_Assist_not_availab_UI_);
+		}
+
+		/* 
+		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=123892
+		 * Only set this error message if nothing else was already set 
+		 **/
+		if (contentAssistRequest.getProposals().size() == 0 && getErrorMessage() == null) {
+			setErrorMessage(XMLUIMessages.Content_Assist_not_availab_UI_);
+		}
+
+		ICompletionProposal[] props = contentAssistRequest.getCompletionProposals();
+		return (props != null) ? Arrays.asList(props) : new ArrayList(0);
+	}
+	
+	/**
+	 * <p>Returns information about possible contexts based on the specified
+	 * location within the document that corresponds to the current cursor
+	 * position within the text viewer.</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer#computeContextInformation(org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public List computeContextInformation(
+			CompletionProposalInvocationContext context,
+			IProgressMonitor monitor) {
+		
+		//no default context info
+		return Collections.EMPTY_LIST;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer#getErrorMessage()
+	 */
+	public String getErrorMessage() {
+		return fErrorMessage;
+	}
+
+	/**
+	 * Add proposals for attribute names
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addAttributeNameProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+
+	/**
+	 * Add proposals for attribute values
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addAttributeValueProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+
+	/**
+	 * Add comment proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addCommentProposal(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+
+	/**
+	 * Add the proposals for a completely empty document
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addEmptyDocumentProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+	
+	/**
+	 * Add the proposals for the name in an end tag
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addEndTagNameProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+	
+	/**
+	 * Prompt for end tags to a non-empty Node that hasn't ended Handles these
+	 * cases: <br>
+	 * <tagOpen>| <br>
+	 * <tagOpen>< |<br>
+	 * <tagOpen></ |
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addEndTagProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+	
+	/**
+	 * Add entity proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param completionRegion
+	 * @param treeNode
+	 * @param context
+	 */
+	protected abstract void addEntityProposals(ContentAssistRequest contentAssistRequest,
+			ITextRegion completionRegion, IDOMNode treeNode, CompletionProposalInvocationContext context);
+
+	/**
+	 * add entity proposals
+	 * 
+	 * @param proposals
+	 * @param map
+	 * @param key
+	 * @param nodeOffset
+	 * @param sdRegion
+	 * @param completionRegion
+	 * @param context
+	 */
+	protected abstract void addEntityProposals(Vector proposals, Properties map, String key,
+			int nodeOffset, IStructuredDocumentRegion sdRegion, ITextRegion completionRegion,
+			CompletionProposalInvocationContext context);
+
+	/**
+	 * Add PCData proposals
+	 * 
+	 * @param nodeName
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addPCDATAProposal(String nodeName, ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+
+	/**
+	 * Add start document proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addStartDocumentProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+
+	/**
+	 * Close an unclosed start tag
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	protected abstract void addTagCloseProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context);
+
+	/**
+	 * Add tag insertion proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param childPosition
+	 * @param context
+	 */
+	protected abstract void addTagInsertionProposals(ContentAssistRequest contentAssistRequest,
+			int childPosition, CompletionProposalInvocationContext context);
+
+	/**
+	 * Add tag name proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param childPosition
+	 * @param context
+	 */
+	protected abstract void addTagNameProposals(ContentAssistRequest contentAssistRequest,
+			int childPosition, CompletionProposalInvocationContext context);
+	
+	/**
+	 * @param errorMessage the reason why computeProposals was not able to find any
+	 * completions.
+	 */
+	protected void setErrorMessage(String errorMessage) {
+		fErrorMessage = errorMessage;
+	}
+	
+	/**
+	 * <p>This does all the magic of figuring out where in the XML type document
+	 * the content assist was invoked and then calling the corresponding method
+	 * to add the correct proposals</p>
+	 * 
+	 * <p><b>NOTE: </b>if overriding be sure to make super call back to this method otherwise
+	 * you will loose all of the proposals generated by this method</p>
+	 * 
+	 * @param matchString
+	 * @param completionRegion
+	 * @param treeNode
+	 * @param xmlnode
+	 * @param context
+	 * 
+	 * @return {@link ContentAssistRequest} that now has all the proposals in it
+	 */
+	protected ContentAssistRequest computeCompletionProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode treeNode, IDOMNode xmlnode, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		
+		ContentAssistRequest contentAssistRequest = null;
+		String regionType = completionRegion.getType();
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+
+		// Handle the most common and best supported cases
+		if ((xmlnode.getNodeType() == Node.ELEMENT_NODE) || (xmlnode.getNodeType() == Node.DOCUMENT_NODE)) {
+			if (regionType == DOMRegionContext.XML_TAG_OPEN) {
+				contentAssistRequest = computeTagOpenProposals(matchString, completionRegion, treeNode, xmlnode, context);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_NAME) {
+				contentAssistRequest = computeTagNameProposals(matchString, completionRegion,
+						treeNode, xmlnode, context);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+				contentAssistRequest = computeAttributeProposals(matchString, completionRegion, treeNode, xmlnode, context);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+				contentAssistRequest = computeEqualsProposals(matchString, completionRegion,
+						treeNode, xmlnode, context);
+			}
+			else if ((regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) && (documentPosition == sdRegion.getTextEndOffset()) &&
+					(sdRegion.getText(completionRegion).endsWith("\"") || sdRegion.getText(completionRegion).endsWith("\'"))) { //$NON-NLS-1$ //$NON-NLS-2$ 
+				// this is for when the cursor is at the end of the closing
+				// quote for an attribute..
+				IDOMNode actualNode = (IDOMNode) xmlnode.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+				contentAssistRequest = new ContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);
+				addTagCloseProposals(contentAssistRequest, context);
+			}
+			else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+				contentAssistRequest = computeAttributeValueProposals(matchString, completionRegion, treeNode, xmlnode, context);
+			}
+			else if ((regionType == DOMRegionContext.XML_TAG_CLOSE) || (regionType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) ||
+					(regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_CLOSE))) {
+				
+				contentAssistRequest = computeTagCloseProposals(matchString, completionRegion, treeNode, xmlnode, context);
+			}
+			else if (regionType == DOMRegionContext.XML_END_TAG_OPEN) {
+				contentAssistRequest = computeEndTagOpenProposals(matchString, completionRegion,
+						treeNode, xmlnode, context);
+			}
+			else if ((regionType == DOMRegionContext.XML_CONTENT) || (regionType == DOMRegionContext.XML_CHAR_REFERENCE) ||
+					(regionType == DOMRegionContext.XML_ENTITY_REFERENCE) || (regionType == DOMRegionContext.XML_PE_REFERENCE)) {
+				
+				contentAssistRequest = computeContentProposals(matchString, completionRegion,
+						treeNode, xmlnode, context);
+			}
+
+			// These ITextRegion types begin DOM Elements as well and although
+			// internally harder to assist,
+			// text insertions directly before them can be made
+			else if ((documentPosition == sdRegion.getStartOffset(completionRegion)) &&
+					(regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_OPEN) ||
+							regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DECLARATION_OPEN) ||
+							regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_OPEN) ||
+							regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_EXPRESSION_OPEN) ||
+							regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_SCRIPTLET_OPEN) ||
+							(regionType == DOMRegionContext.XML_DECLARATION_OPEN) ||
+							(regionType == DOMRegionContext.XML_PI_OPEN) ||
+							(regionType == DOMRegionContext.XML_COMMENT_OPEN) ||
+							(regionType == DOMRegionContext.XML_CDATA_OPEN))) {
+				
+				contentAssistRequest = new ContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+				addTagInsertionProposals(contentAssistRequest, getElementPosition(treeNode), context);
+				addStartDocumentProposals(contentAssistRequest, context);
+			}
+		}
+		// Not a Document or Element? (odd cases go here for now)
+		else if (isCloseRegion(completionRegion)) {
+			contentAssistRequest = new ContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion) + completionRegion.getLength(), 0, matchString);
+			addStartDocumentProposals(contentAssistRequest, context);
+			if (documentPosition >= sdRegion.getTextEndOffset(completionRegion)) {
+				addTagInsertionProposals(contentAssistRequest, getElementPosition(treeNode) + 1, context);
+			}
+		}
+		else if ((documentPosition == sdRegion.getStartOffset(completionRegion)) &&
+				(regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_OPEN) ||
+						regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DECLARATION_OPEN) ||
+						regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_OPEN) ||
+						regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_EXPRESSION_OPEN) ||
+						regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_SCRIPTLET_OPEN) ||
+						(regionType == DOMRegionContext.XML_DECLARATION_OPEN) ||
+						(regionType == DOMRegionContext.XML_PI_OPEN) ||
+						(regionType == DOMRegionContext.XML_COMMENT_OPEN) ||
+						(regionType == DOMRegionContext.XML_CDATA_OPEN))) {
+			
+			contentAssistRequest = new ContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+			addTagInsertionProposals(contentAssistRequest, getElementPosition(treeNode), context);
+			addStartDocumentProposals(contentAssistRequest, context);
+		}
+		return contentAssistRequest;
+	}
+	
+	/**
+	 * <p>Similar to {@link #computeCompletionProposals(CompletionProposalInvocationContext, IProgressMonitor)} only specificly for
+	 * attribute proposals</p>
+	 * 
+	 * <p>Implementers should not override this method, it is made available to implementers so that if they override
+	 * {@link #computeCompletionProposals(String, ITextRegion, IDOMNode, IDOMNode, CompletionProposalInvocationContext)}
+	 * they can call this method if needed</p>
+	 * 
+	 * @param matchString
+	 * @param completionRegion
+	 * @param nodeAtOffset
+	 * @param node
+	 * @param context
+	 * @return
+	 */
+	protected final ContentAssistRequest computeAttributeProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		ITextViewer viewer = context.getViewer();
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		// if the attribute name is selected, replace it instead of creating a new attribute
+		if (documentPosition <= sdRegion.getStartOffset(completionRegion) && (viewer != null && viewer.getSelectedRange().y != (sdRegion.getEndOffset(completionRegion) - sdRegion.getStartOffset(completionRegion)))) {
+			// setup to insert new attributes
+			contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+		}
+		else {
+			// Setup to replace an existing attribute name
+			contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);
+		}
+		addAttributeNameProposals(contentAssistRequest, context);
+		contentAssistRequest.setReplacementBeginPosition(documentPosition);
+		contentAssistRequest.setReplacementLength(0);
+		if ((node.getFirstStructuredDocumentRegion() != null) && (!node.getFirstStructuredDocumentRegion().isEnded())) {
+			addTagCloseProposals(contentAssistRequest, context);
+		}
+		return contentAssistRequest;
+	}
+	
+	/**
+	 * <p>this is the position the cursor should be in after the proposal is
+	 * applied</p>
+	 * 
+	 * @param proposedText
+	 * @return the position the cursor should be in after the proposal is
+	 *         applied
+	 */
+	protected static int getCursorPositionForProposedText(String proposedText) {
+		int cursorAdjustment;
+		cursorAdjustment = proposedText.indexOf("\"\"") + 1; //$NON-NLS-1$
+		// otherwise, after the first tag
+		if (cursorAdjustment == 0) {
+			cursorAdjustment = proposedText.indexOf('>') + 1;
+		}
+		if (cursorAdjustment == 0) {
+			cursorAdjustment = proposedText.length() + 1;
+		}
+
+		return cursorAdjustment;
+	}
+	
+	/**
+	 * <p>helpful utility method for determining if one string starts with another one.
+	 * This is case insensitive. If either are null then result is <code>true</code></p>
+	 * 
+	 * @param aString the string to check to see if it starts with the given prefix
+	 * @param prefix check that the given string starts with this prefix
+	 * 
+	 * @return <code>true</code> if the given string starts with the given prefix,
+	 * <code>false</code> otherwise
+	 */
+	protected static boolean beginsWith(String aString, String prefix) {
+		if ((aString == null) || (prefix == null)) {
+			return true;
+		}
+		return aString.toLowerCase().startsWith(prefix.toLowerCase());
+	}
+
+	private ContentAssistRequest computeAttributeValueProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		if ((documentPosition > sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) && (sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength() != sdRegion.getStartOffset(completionRegion) + completionRegion.getLength())) {
+			// setup to add a new attribute at the documentPosition
+			IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+			contentAssistRequest = new ContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);
+			addAttributeNameProposals(contentAssistRequest, context);
+			if ((actualNode.getFirstStructuredDocumentRegion() != null) && !actualNode.getFirstStructuredDocumentRegion().isEnded()) {
+				addTagCloseProposals(contentAssistRequest, context);
+			}
+		}
+		else {
+			// setup to replace the existing value
+			if (!nodeAtOffset.getFirstStructuredDocumentRegion().isEnded() && (documentPosition < sdRegion.getStartOffset(completionRegion))) {
+				// if the IStructuredDocumentRegion isn't closed and the
+				// cursor is in front of the value, add
+				contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+				addAttributeNameProposals(contentAssistRequest, context);
+			}
+			else {
+				int replaceLength = completionRegion.getTextLength();
+				
+				//if container region, be sure replace length is only the attribute value region not the entire container
+				if(completionRegion instanceof ITextRegionContainer){
+					ITextRegion openRegion = ((ITextRegionContainer) completionRegion).getFirstRegion();
+					ITextRegion closeRegion = ((ITextRegionContainer) completionRegion).getLastRegion();
+					
+					/*
+					 * check to see if the container is opened the same way its closed.
+					 * Such as:
+					 * <img src=' '
+					 * But not:
+					 * <img src='
+					 * 
+					 * </body>
+					 * </html>
+					 * In the latter case we only want to replace the opening text of the container
+					 * Admittedly crude test, but effective.
+					 */
+					if(openRegion.getType() != closeRegion.getType()) {
+						replaceLength = openRegion.getTextLength();
+					}
+				} 
+				
+				contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion,
+						completionRegion, sdRegion.getStartOffset(completionRegion),
+						replaceLength, matchString);
+				
+				addAttributeValueProposals(contentAssistRequest, context);
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	private ContentAssistRequest computeContentProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		ContentAssistRequest contentAssistRequest = null;
+
+		// setup to add children at the content node's position
+		contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, getStructuredDocumentRegion(documentPosition), completionRegion, documentPosition, 0, matchString);
+		if ((node != null) && (node.getNodeType() == Node.DOCUMENT_NODE) && (((Document) node).getDoctype() == null)) {
+			addStartDocumentProposals(contentAssistRequest, context);
+		}
+		addTagInsertionProposals(contentAssistRequest, getElementPosition(nodeAtOffset), context);
+		if (node.getNodeType() != Node.DOCUMENT_NODE) {
+			addEndTagProposals(contentAssistRequest, context);
+		}
+		// entities?
+		addEntityProposals(contentAssistRequest, completionRegion, node, context);
+		// addEntityProposals(contentAssistRequest);
+		return contentAssistRequest;
+	}
+
+	private ContentAssistRequest computeEndTagOpenProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		int completionRegionStart = sdRegion.getStartOffset(completionRegion);
+		int completionRegionLength = completionRegion.getLength();
+		IStructuredDocumentRegion sdRegionAtCompletionOffset = node.getStructuredDocument().getRegionAtCharacterOffset(completionRegionStart + completionRegionLength);
+		ITextRegion regionAtEndOfCompletion = sdRegionAtCompletionOffset.getRegionAtCharacterOffset(completionRegionStart + completionRegionLength);
+
+		if ((documentPosition != completionRegionStart) && (regionAtEndOfCompletion != null) && (regionAtEndOfCompletion.getType() == DOMRegionContext.XML_TAG_NAME)) {
+			ITextRegion nameRegion = regionAtEndOfCompletion;
+			contentAssistRequest = new ContentAssistRequest(nodeAtOffset, nodeAtOffset.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(nameRegion), nameRegion.getTextLength(), matchString);
+		}
+		else {
+			if (nodeAtOffset.getFirstStructuredDocumentRegion() == sdRegion) {
+				// abnormal case, this unmatched end tag will be a sibling
+				contentAssistRequest = new ContentAssistRequest(nodeAtOffset, nodeAtOffset.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+			}
+			else {
+				// normal case, this end tag is the parent
+				contentAssistRequest = new ContentAssistRequest(nodeAtOffset, nodeAtOffset, sdRegion, completionRegion, documentPosition, 0, matchString);
+			}
+		}
+		// if (documentPosition >= sdRegion.getStartOffset(completionRegion) +
+		// completionRegion.getTextLength())
+		addEndTagProposals(contentAssistRequest, context);
+		// else
+		if (completionRegionStart == documentPosition) {
+			// positioned at start of end tag
+			addTagInsertionProposals(contentAssistRequest, node.getChildNodes().getLength(), context);
+		}
+		return contentAssistRequest;
+	}
+
+
+	private ContentAssistRequest computeEqualsProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		ITextRegion valueRegion = node.getStartStructuredDocumentRegion().getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) + completionRegion.getLength());
+		if ((valueRegion != null) && (valueRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) && (sdRegion.getStartOffset(valueRegion) <= documentPosition)) {
+			// replace the adjacent attribute value
+			contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, valueRegion, sdRegion.getStartOffset(valueRegion), valueRegion.getTextLength(), matchString);
+		}
+		else {
+			// append an attribute value after the '='
+			contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+		}
+		addAttributeValueProposals(contentAssistRequest, context);
+		return contentAssistRequest;
+	}
+
+	private ContentAssistRequest computeStartDocumentProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		
+		// setup for a non-empty document, but one that hasn't been formally
+		// started
+		ContentAssistRequest contentAssistRequest = null;
+		contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node,
+				getStructuredDocumentRegion(documentPosition), completionRegion,
+				documentPosition, 0, matchString);
+		addStartDocumentProposals(contentAssistRequest, context);
+		return contentAssistRequest;
+	}
+
+	private ContentAssistRequest computeTagCloseProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+
+		if ((node.getNodeType() == Node.DOCUMENT_NODE) || (documentPosition >= sdRegion.getEndOffset())) {
+			// this is a content request as the documentPosition is AFTER the
+			// end of the closing region
+			if ((node == nodeAtOffset) && (node.getParentNode() != null)) {
+				node = (IDOMNode) node.getParentNode();
+			}
+			contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+			addTagInsertionProposals(contentAssistRequest, getElementPosition(nodeAtOffset), context);
+			if ((node.getNodeType() != Node.DOCUMENT_NODE) && (node.getEndStructuredDocumentRegion() == null)) {
+				addEndTagProposals(contentAssistRequest, context);
+			}
+		}
+		else {
+			// at the start of the tag's close or within it
+			ITextRegion closeRegion = sdRegion.getLastRegion();
+			boolean insideTag = !sdRegion.isEnded() || (documentPosition <= sdRegion.getStartOffset(closeRegion));
+			if (insideTag) {
+				// this is a request for completions within a tag
+				contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);
+				if ((node.getNodeType() != Node.DOCUMENT_NODE) && (node.getEndStructuredDocumentRegion() != null)) {
+					addTagCloseProposals(contentAssistRequest, context);
+				}
+				if (sdRegion == nodeAtOffset.getFirstStructuredDocumentRegion()) {
+					contentAssistRequest.setReplacementBeginPosition(documentPosition);
+					contentAssistRequest.setReplacementLength(0);
+					addAttributeNameProposals(contentAssistRequest, context);
+				}
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	private ContentAssistRequest computeTagNameProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+
+		if (sdRegion != nodeAtOffset.getFirstStructuredDocumentRegion()) {
+			// completing the *first* tag in "<tagname1 |<tagname2"
+			IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+			if (actualNode != null) {
+				if (actualNode.getFirstStructuredDocumentRegion() == sdRegion) {
+					// start tag
+					if (documentPosition > sdRegion.getStartOffset(completionRegion) + completionRegion.getLength()) {
+						// it's attributes
+						contentAssistRequest = new ContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition - matchString.length(), matchString.length(), matchString);
+						if (node.getStructuredDocument().getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) - 1).getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) - 1).getType() == DOMRegionContext.XML_TAG_OPEN) {
+							addAttributeNameProposals(contentAssistRequest, context);
+						}
+						addTagCloseProposals(contentAssistRequest, context);
+					}
+					else {
+						// it's name
+						contentAssistRequest = new ContentAssistRequest(actualNode, actualNode.getParentNode(),
+								sdRegion, completionRegion, documentPosition - matchString.length(),
+								matchString.length(), matchString);
+						addTagNameProposals(contentAssistRequest, getElementPosition(actualNode),
+								context);
+					}
+				}
+				else {
+					if (documentPosition >= sdRegion.getStartOffset(completionRegion) + completionRegion.getLength()) {
+						// insert name
+						contentAssistRequest = new ContentAssistRequest(actualNode, actualNode.getParentNode(),
+								sdRegion, completionRegion, documentPosition, 0, matchString);
+					}
+					else {
+						// replace name
+						contentAssistRequest = new ContentAssistRequest(actualNode, actualNode.getParentNode(),
+								sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion),
+								completionRegion.getTextLength(), matchString);
+					}
+					addEndTagNameProposals(contentAssistRequest, context);
+				}
+			}
+		}
+		else {
+			if (documentPosition > sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) {
+				// unclosed tag with only a name; should prompt for attributes
+				// and a close instead
+				contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion,
+						documentPosition - matchString.length(), matchString.length(), matchString);
+				addAttributeNameProposals(contentAssistRequest, context);
+				addTagCloseProposals(contentAssistRequest, context);
+			}
+			else {
+				if (sdRegion.getRegions().get(0).getType() != DOMRegionContext.XML_END_TAG_OPEN) {
+					int replaceLength = documentPosition - sdRegion.getStartOffset(completionRegion);
+					contentAssistRequest = new ContentAssistRequest(node, node.getParentNode(), sdRegion,
+							completionRegion, sdRegion.getStartOffset(completionRegion), replaceLength, matchString);
+					addTagNameProposals(contentAssistRequest, getElementPosition(nodeAtOffset), context);
+				}
+				else {
+					IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(documentPosition);
+					if (actualNode != null) {
+						if (documentPosition >= sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) {
+							contentAssistRequest = new ContentAssistRequest(actualNode, actualNode.getParentNode(),
+									sdRegion, completionRegion, documentPosition, 0, matchString);
+						}
+						else {
+							contentAssistRequest = new ContentAssistRequest(actualNode, actualNode.getParentNode(),
+									sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion),
+									completionRegion.getTextLength(), matchString);
+						}
+						addEndTagNameProposals(contentAssistRequest, context);
+					}
+				}
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	private ContentAssistRequest computeTagOpenProposals(String matchString, ITextRegion completionRegion,
+			IDOMNode nodeAtOffset, IDOMNode node, CompletionProposalInvocationContext context) {
+		
+		int documentPosition = context.getInvocationOffset();
+		ContentAssistRequest contentAssistRequest = null;
+		IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);
+		if (sdRegion != nodeAtOffset.getFirstStructuredDocumentRegion() || sdRegion.getPrevious() != null && sdRegion.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_TAG_OPEN) {
+			// completing the *first* XML_TAG_OPEN in "<<tagname"
+			IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));
+			if (actualNode != null) {
+				if(sdRegion.getFirstRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN) {
+					contentAssistRequest = new ContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);
+					if(actualNode.hasChildNodes())
+						addTagNameProposals(contentAssistRequest,
+								getElementPosition(actualNode.getLastChild()), context);
+					else
+						addTagNameProposals(contentAssistRequest, 0, context);
+				}
+				else {
+					contentAssistRequest = new ContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+					addTagNameProposals(contentAssistRequest, getElementPosition(actualNode), context);
+				}
+				addEndTagProposals(contentAssistRequest, context); // (pa) 220850
+			}
+		}
+		else {
+			if (documentPosition == sdRegion.getStartOffset(completionRegion)) {
+				if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// at the start of an existing tag, right before the '<'
+					contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node.getParentNode(), sdRegion,
+							completionRegion, documentPosition, 0, matchString);
+					addTagInsertionProposals(contentAssistRequest, getElementPosition(nodeAtOffset), context);
+					addEndTagProposals(contentAssistRequest, context);
+				}
+				else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+					// at the opening of the VERY first tag with a '<'
+					contentAssistRequest = new ContentAssistRequest(nodeAtOffset, node.getParentNode(), sdRegion,
+							completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);
+					addStartDocumentProposals(contentAssistRequest, context);
+				}
+			}
+			else {
+				// within the white space
+				ITextRegion name = getNameRegion(node.getStartStructuredDocumentRegion());
+				// (pa) ITextRegion refactor
+				// if (name != null && name.containsOffset(documentPosition))
+				// {
+				if ((name != null) &&
+						((sdRegion.getStartOffset(name) <= documentPosition) && (sdRegion.getEndOffset(name) >= documentPosition)) &&
+						(sdRegion.getLastRegion().getType() == DOMRegionContext.XML_TAG_CLOSE || sdRegion.getLastRegion().getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE)){ 
+					
+					// replace the existing name
+					contentAssistRequest = new ContentAssistRequest(node, node.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(name), name.getTextLength(), matchString);
+				}
+				else {
+					// insert a valid new name, or possibly an end tag
+					contentAssistRequest = new ContentAssistRequest(nodeAtOffset, ((Node) nodeAtOffset).getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);
+					addEndTagProposals(contentAssistRequest, context);
+					contentAssistRequest.setReplacementBeginPosition(documentPosition);
+					contentAssistRequest.setReplacementLength(0);
+				}
+				addTagNameProposals(contentAssistRequest, getElementPosition(nodeAtOffset), context);
+			}
+		}
+		return contentAssistRequest;
+	}
+
+	private ITextRegion getCompletionRegion(int offset, IStructuredDocumentRegion sdRegion) {
+		ITextRegion region = sdRegion.getRegionAtCharacterOffset(offset);
+		if (region == null) {
+			return null;
+		}
+
+		if (sdRegion.getStartOffset(region) == offset) {
+			// The offset is at the beginning of the region
+			if ((sdRegion.getStartOffset(region) == sdRegion.getStartOffset()) && (sdRegion.getPrevious() != null) && (!sdRegion.getPrevious().isEnded())) {
+				// Is the region also the start of the node? If so, the
+				// previous IStructuredDocumentRegion is
+				// where to look for a useful region.
+				region = sdRegion.getPrevious().getRegionAtCharacterOffset(offset - 1);
+			}
+			else {
+				// Is there no separating whitespace from the previous region?
+				// If not,
+				// then that region is the important one
+				ITextRegion previousRegion = sdRegion.getRegionAtCharacterOffset(offset - 1);
+				if ((previousRegion != null) && (previousRegion != region) && (previousRegion.getTextLength() == previousRegion.getLength())) {
+					region = previousRegion;
+				}
+			}
+		}
+		else {
+			// The offset is NOT at the beginning of the region
+			if (offset > sdRegion.getStartOffset(region) + region.getTextLength()) {
+				// Is the offset within the whitespace after the text in this
+				// region?
+				// If so, use the next region
+				ITextRegion nextRegion = sdRegion.getRegionAtCharacterOffset(sdRegion.getStartOffset(region) + region.getLength());
+				if (nextRegion != null) {
+					region = nextRegion;
+				}
+			}
+			else {
+				// Is the offset within the important text for this region?
+				// If so, then we've already got the right one.
+			}
+		}
+
+		// valid WHITE_SPACE region handler (#179924)
+		if ((region != null) && (region.getType() == DOMRegionContext.WHITE_SPACE)) {
+			ITextRegion previousRegion = sdRegion.getRegionAtCharacterOffset(sdRegion.getStartOffset(region) - 1);
+			if (previousRegion != null) {
+				region = previousRegion;
+			}
+		}
+
+		return region;
+	}
+
+	/**
+	 * Return the region whose content's require completion. This is something
+	 * of a misnomer as sometimes the user wants to be prompted for contents
+	 * of a non-existant ITextRegion, such as for enumerated attribute values
+	 * following an '=' sign.
+	 */
+	private ITextRegion getCompletionRegion(int documentPosition, Node domnode) {
+		if (domnode == null) {
+			return null;
+		}
+
+		ITextRegion region = null;
+		int offset = documentPosition;
+		IStructuredDocumentRegion flatNode = null;
+		IDOMNode node = (IDOMNode) domnode;
+
+		if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			if (node.getStructuredDocument().getLength() == 0) {
+				return null;
+			}
+			ITextRegion result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);
+			while (result == null) {
+				offset--;
+				result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);
+			}
+			return result;
+		}
+
+		IStructuredDocumentRegion startTag = node.getStartStructuredDocumentRegion();
+		IStructuredDocumentRegion endTag = node.getEndStructuredDocumentRegion();
+
+		// Determine if the offset is within the start
+		// IStructuredDocumentRegion, end IStructuredDocumentRegion, or
+		// somewhere within the Node's XML content.
+		if ((startTag != null) && (startTag.getStartOffset() <= offset) && (offset < startTag.getStartOffset() + startTag.getLength())) {
+			flatNode = startTag;
+		}
+		else if ((endTag != null) && (endTag.getStartOffset() <= offset) && (offset < endTag.getStartOffset() + endTag.getLength())) {
+			flatNode = endTag;
+		}
+
+		if (flatNode != null) {
+			// the offset is definitely within the start or end tag, continue
+			// on and find the region
+			region = getCompletionRegion(offset, flatNode);
+		}
+		else {
+			// the docPosition is neither within the start nor the end, so it
+			// must be content
+			flatNode = node.getStructuredDocument().getRegionAtCharacterOffset(offset);
+			// (pa) ITextRegion refactor
+			// if (flatNode.contains(documentPosition)) {
+			if ((flatNode.getStartOffset() <= documentPosition) && (flatNode.getEndOffset() >= documentPosition)) {
+				// we're interesting in completing/extending the previous
+				// IStructuredDocumentRegion if the current
+				// IStructuredDocumentRegion isn't plain content or if it's
+				// preceded by an orphan '<'
+				if ((offset == flatNode.getStartOffset()) &&
+						(flatNode.getPrevious() != null) &&
+						(((flatNode.getRegionAtCharacterOffset(documentPosition) != null) &&
+								(flatNode.getRegionAtCharacterOffset(documentPosition).getType() != DOMRegionContext.XML_CONTENT)) ||
+								(flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_TAG_OPEN) ||
+								(flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN))) {
+					
+					// Is the region also the start of the node? If so, the
+					// previous IStructuredDocumentRegion is
+					// where to look for a useful region.
+					region = flatNode.getPrevious().getLastRegion();
+				}
+				else if (flatNode.getEndOffset() == documentPosition) {
+					region = flatNode.getLastRegion();
+				}
+				else {
+					region = flatNode.getFirstRegion();
+				}
+			}
+			else {
+				// catch end of document positions where the docPosition isn't
+				// in a IStructuredDocumentRegion
+				region = flatNode.getLastRegion();
+			}
+		}
+
+		return region;
+	}
+
+	private int getElementPosition(Node child) {
+		Node parent = child.getParentNode();
+		if (parent == null) {
+			return 0;
+		}
+
+		NodeList children = parent.getChildNodes();
+		if (children == null) {
+			return 0;
+		}
+		int count = 0;
+
+		for (int i = 0; i < children.getLength(); i++) {
+			if (children.item(i) == child) {
+				return count;
+			}
+			else {
+				// if (children.item(i).getNodeType() == Node.ELEMENT_NODE)
+				count++;
+			}
+		}
+		return 0;
+	}
+
+	private String getMatchString(IStructuredDocumentRegion parent, ITextRegion aRegion, int offset) {
+		if ((aRegion == null) || isCloseRegion(aRegion)) {
+			return ""; //$NON-NLS-1$
+		}
+		String matchString = null;
+		String regionType = aRegion.getType();
+		if ((regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) || (regionType == DOMRegionContext.XML_TAG_OPEN) || (offset > parent.getStartOffset(aRegion) + aRegion.getTextLength())) {
+			matchString = ""; //$NON-NLS-1$
+		}
+		else if (regionType == DOMRegionContext.XML_CONTENT) {
+			matchString = ""; //$NON-NLS-1$
+		}
+		else {
+			if ((parent.getText(aRegion).length() > 0) && (parent.getStartOffset(aRegion) < offset)) {
+				matchString = parent.getText(aRegion).substring(0, offset - parent.getStartOffset(aRegion));
+			}
+			else {
+				matchString = ""; //$NON-NLS-1$
+			}
+		}
+		return matchString;
+	}
+
+	private ITextRegion getNameRegion(IStructuredDocumentRegion flatNode) {
+		if (flatNode == null) {
+			return null;
+		}
+		Iterator regionList = flatNode.getRegions().iterator();
+		while (regionList.hasNext()) {
+			ITextRegion region = (ITextRegion) regionList.next();
+			if (isNameRegion(region)) {
+				return region;
+			}
+		}
+		return null;
+	}
+
+	private boolean isCloseRegion(ITextRegion region) {
+		String type = region.getType();
+		return ((type == DOMRegionContext.XML_PI_CLOSE) ||
+				(type == DOMRegionContext.XML_TAG_CLOSE) ||
+				(type == DOMRegionContext.XML_EMPTY_TAG_CLOSE) ||
+				(type == DOMRegionContext.XML_CDATA_CLOSE) ||
+				(type == DOMRegionContext.XML_COMMENT_CLOSE) ||
+				(type == DOMRegionContext.XML_ATTLIST_DECL_CLOSE) ||
+				(type == DOMRegionContext.XML_ELEMENT_DECL_CLOSE) ||
+				(type == DOMRegionContext.XML_DOCTYPE_DECLARATION_CLOSE) ||
+				(type == DOMJSPRegionContextsPrivateCopy.JSP_CLOSE) ||
+				(type == DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_CLOSE) ||
+				(type.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_CLOSE)) ||
+				(type == DOMRegionContext.XML_DECLARATION_CLOSE));
+	}
+
+	private boolean isNameRegion(ITextRegion region) {
+		String type = region.getType();
+		return ((type == DOMRegionContext.XML_TAG_NAME) ||
+				(type == DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_NAME) ||
+				(type == DOMRegionContext.XML_ELEMENT_DECL_NAME) ||
+				(type == DOMRegionContext.XML_DOCTYPE_NAME) ||
+				(type == DOMRegionContext.XML_ATTLIST_DECL_NAME) ||
+				(type == DOMJSPRegionContextsPrivateCopy.JSP_ROOT_TAG_NAME) ||
+				type.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_NAME));
+	}
+	
+	/**
+	 * StructuredTextViewer must be set before using this.
+	 */
+	private IStructuredDocumentRegion getStructuredDocumentRegion(int pos) {
+		return ContentAssistUtils.getStructuredDocumentRegion(fTextViewer, pos);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractXMLModelQueryCompletionProposalComputer.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractXMLModelQueryCompletionProposalComputer.java
new file mode 100644
index 0000000..303104a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractXMLModelQueryCompletionProposalComputer.java
@@ -0,0 +1,1855 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMEntityDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryAction;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
+import org.eclipse.wst.xml.core.internal.document.AttrImpl;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.CMImageUtil;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+
+/**
+ * <p>Implementation of an {@link AbstractXMLCompletionProposalComputer} that uses {@link ModelQuery}s
+ * to make its proposals.</p>
+ * 
+ * @base org.eclipse.wst.xml.ui.internal.contentassist.AbstractContentAssistProcessor
+ */
+public abstract class AbstractXMLModelQueryCompletionProposalComputer extends AbstractXMLCompletionProposalComputer {
+	
+	private static MarkupTagInfoProvider infoProvider = new MarkupTagInfoProvider();
+	
+	/**
+	 * <p>Default constructor</p>
+	 */
+	public AbstractXMLModelQueryCompletionProposalComputer() {
+	}
+	
+	/**
+	 * <p>default is to do nothing</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer#sessionEnded()
+	 */
+	public void sessionEnded() {
+		//default is to do nothing
+	}
+
+	/**
+	 * <p>default is to do nothing</p>
+	 * 
+	 * @see org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer#sessionStarted()
+	 */
+	public void sessionStarted() {
+		//default is to do nothing
+	}
+	
+	/**
+	 * @return {@link XMLContentModelGenerator} used to generate proposals
+	 */
+	protected abstract XMLContentModelGenerator getContentGenerator();
+	
+	/**
+	 * <p>Given a {@link CMNode} generated by a model query should decide if the
+	 * action is valid for this implementation of the model query proposal computer</p>
+	 * 
+	 * <p>This is needed because {@link ModelQuery}s return a lot of {@link CMNode}s that
+	 * can come from multiple sources and a particular computer may not want to propose
+	 * all of the actions as content assist proposals</p>
+	 * 
+	 * @param action {@link CMNode} to decide if it is valid as a result
+	 * for this model query proposal computer
+	 * 
+	 * @return <code>true</code> if the given {@link CMNode} is valid for this
+	 * computer, <code>false</code> otherwise
+	 */
+	protected abstract boolean validModelQueryNode(CMNode node);
+	
+	protected void addAttributeNameProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
+		IStructuredDocumentRegion sdRegion = contentAssistRequest.getDocumentRegion();
+		// retrieve the list of attributes
+		CMElementDeclaration elementDecl = getCMElementDeclaration(node);
+		if (elementDecl != null) {
+			CMNamedNodeMapImpl attributes = new CMNamedNodeMapImpl(elementDecl.getAttributes());
+			addModelQueryAttributeDeclarations(node, elementDecl,attributes);
+
+			String matchString = contentAssistRequest.getMatchString();
+			int cursorOffset = context.getInvocationOffset();
+			// check whether an attribute really exists for the replacement
+			// offsets AND if it possesses a value
+			boolean attrAtLocationHasValue = false;
+			boolean proposalNeedsSpace = false;
+			NamedNodeMap attrs = node.getAttributes();
+			for (int i = 0; i < attrs.getLength(); i++) {
+				AttrImpl existingAttr = (AttrImpl) attrs.item(i);
+				ITextRegion name = existingAttr.getNameRegion();
+				
+				if ((sdRegion.getStartOffset(name) <= contentAssistRequest.getReplacementBeginPosition()) &&
+						(sdRegion.getStartOffset(name) + name.getLength() >= contentAssistRequest.getReplacementBeginPosition() + contentAssistRequest.getReplacementLength()) &&
+						(existingAttr.getValueRegion() != null)) {
+					// selected region is attribute name
+					if (cursorOffset >= sdRegion.getStartOffset(name) && contentAssistRequest.getReplacementLength() != 0)
+						attrAtLocationHasValue = true;
+					// propose new attribute, cursor is at the start of another attribute name
+					else if (cursorOffset == sdRegion.getStartOffset(name))
+						proposalNeedsSpace = true;
+					break;
+				}
+			}
+
+			// only add proposals for the attributes whose names begin with the matchstring
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) attributes.item(i);
+
+					if(validModelQueryNode(attrDecl)) {
+						int isRequired = 0;
+						if (attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED) {
+							isRequired = XMLRelevanceConstants.R_REQUIRED;
+						}
+	
+						boolean showAttribute = true;
+						showAttribute = showAttribute && beginsWith(getRequiredName(node, attrDecl), matchString.trim());
+						AttrImpl attr = (AttrImpl) node.getAttributes().getNamedItem(getRequiredName(node, attrDecl));
+						ITextRegion nameRegion = attr != null ? attr.getNameRegion() : null;
+						// nameRegion.getEndOffset() + 1 is required to allow for
+						// matches against the full name of an existing Attr
+						showAttribute = showAttribute && ((attr == null) ||
+								((nameRegion != null) &&
+										(sdRegion.getStartOffset(nameRegion) <
+											contentAssistRequest.getReplacementBeginPosition()) &&
+										(sdRegion.getStartOffset(nameRegion) + nameRegion.getLength() >=
+											(contentAssistRequest.getReplacementBeginPosition() +
+											contentAssistRequest.getReplacementLength()) )));
+						if (showAttribute) {
+							//get the proposal image
+							Image attrImage = CMImageUtil.getImage(attrDecl);
+							if (attrImage == null) {
+								if (isRequired > 0) {
+									attrImage = this.getRequiredAttributeImage();
+								} else {
+									attrImage = this.getNotRequiredAttributeImage();
+								}
+							}
+	
+							String proposedText = null;
+							String proposedInfo = getAdditionalInfo(elementDecl, attrDecl);
+							CustomCompletionProposal proposal = null;
+							// attribute is at this location and already exists
+							if (attrAtLocationHasValue) {
+								// only propose the name
+								proposedText = getRequiredName(node, attrDecl);
+								proposal = new CustomCompletionProposal(
+										proposedText, contentAssistRequest.getReplacementBeginPosition(),
+										contentAssistRequest.getReplacementLength(), proposedText.length(),
+										attrImage, proposedText, null, proposedInfo,
+										XMLRelevanceConstants.R_XML_ATTRIBUTE_NAME + isRequired, true);
+							}
+							// no attribute exists or is elsewhere, generate
+							// minimally
+							else {
+								Attr existingAttrNode = (Attr) node.getAttributes().getNamedItem(getRequiredName(node, attrDecl));
+								String value = null;
+								if (existingAttrNode != null) {
+									value = existingAttrNode.getNodeValue();
+								}
+								if ((value != null) && (value.length() > 0)) {
+									proposedText = getRequiredName(node, attrDecl);
+								}
+								else {
+									proposedText = getRequiredText(node, attrDecl);
+								}
+								if (proposalNeedsSpace)
+									proposedText += " "; //$NON-NLS-1$
+								proposal = new CustomCompletionProposal(proposedText,
+										contentAssistRequest.getReplacementBeginPosition(),
+										contentAssistRequest.getReplacementLength(),
+										attrDecl.getNodeName().length() + 2, attrImage,
+								// if the value isn't empty (no empty set of quotes), show it
+								// BUG 203494, content strings may have "", but not be empty
+								// An empty string is when there's no content between double quotes
+								// and there is no single quote that may be encasing a double quote
+										((proposedText.lastIndexOf('\"') - proposedText.indexOf('\"') ==  1 &&
+												proposedText.indexOf('\'') == -1)) ? getRequiredName(node, attrDecl) : proposedText,
+										null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_NAME + isRequired);
+							}
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+			}
+		}
+		else {
+			setErrorMessage(NLS.bind(XMLUIMessages.Element__is_unknown, (new Object[]{node.getNodeName()})));
+		}
+	}
+	
+	protected void addAttributeValueProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
+
+		// Find the attribute region and name for which this position should
+		// have a value proposed
+		IStructuredDocumentRegion open = node.getFirstStructuredDocumentRegion();
+		ITextRegionList openRegions = open.getRegions();
+		int i = openRegions.indexOf(contentAssistRequest.getRegion());
+		if (i < 0) {
+			return;
+		}
+		ITextRegion nameRegion = null;
+		while (i >= 0) {
+			nameRegion = openRegions.get(i--);
+			if (nameRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+				break;
+			}
+		}
+
+		// the name region is REQUIRED to do anything useful
+		if (nameRegion != null) {
+			// Retrieve the declaration
+			CMElementDeclaration elementDecl = getCMElementDeclaration(node);
+
+			// String attributeName = nameRegion.getText();
+			String attributeName = open.getText(nameRegion);
+
+			CMAttributeDeclaration attrDecl = null;
+
+			// No CMElementDeclaration means no attribute metadata, but retrieve the
+			// declaration for the attribute otherwise
+			if (elementDecl != null) {
+				CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(elementDecl.getAttributes()) {
+					private Map caseInsensitive;
+					
+					private Map getCaseInsensitiveMap() {
+						if(caseInsensitive == null)
+							caseInsensitive = new HashMap();
+						return caseInsensitive;
+					}
+
+					public CMNode getNamedItem(String name) {
+						CMNode node = super.getNamedItem(name);
+						if (node == null) {
+							node = (CMNode) getCaseInsensitiveMap().get(name.toLowerCase(Locale.US));
+						}
+						return node;
+					}
+
+					public void put(CMNode cmNode) {
+						super.put(cmNode);
+						getCaseInsensitiveMap().put(cmNode.getNodeName().toLowerCase(Locale.US), cmNode);
+					}
+				};
+				this.addModelQueryAttributeDeclarations(node, elementDecl, allAttributes);
+
+				String noprefixName = DOMNamespaceHelper.getUnprefixedName(attributeName);
+				if (allAttributes != null) {
+					attrDecl = (CMAttributeDeclaration) allAttributes.getNamedItem(attributeName);
+					if (attrDecl == null) {
+						attrDecl = (CMAttributeDeclaration) allAttributes.getNamedItem(noprefixName);
+					}
+				}
+				if (attrDecl == null) {
+					setErrorMessage(XMLUIMessages.No_known_attribute__UI_ + attributeName);
+				}
+			}
+
+			String currentValue = node.getAttributes().getNamedItem(attributeName).getNodeValue();
+			String proposedInfo = null;
+			//get proposal image
+			Image image = CMImageUtil.getImage(attrDecl);
+			if (image == null) {
+				if ((attrDecl != null) && (attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED)) {
+					image = this.getRequiredAttributeImage();
+				} else {
+					image = this.getNotRequiredAttributeImage();
+				}
+			}
+
+			if ((attrDecl != null) && (attrDecl.getAttrType() != null)) {
+				// attribute is known, prompt with values from the declaration
+				proposedInfo = getAdditionalInfo(elementDecl, attrDecl);
+				List possibleValues = getPossibleDataTypeValues(node, attrDecl);
+				String defaultValue = attrDecl.getAttrType().getImpliedValue();
+				String qualifiedDelimiter = (String) attrDecl.getProperty("qualified-delimiter"); //$NON-NLS-1$
+				if (possibleValues.size() > 0 || defaultValue != null) {
+					// ENUMERATED VALUES
+					String matchString = contentAssistRequest.getMatchString();
+					if (matchString == null) {
+						matchString = ""; //$NON-NLS-1$
+					}
+					if ((matchString.length() > 0) && (matchString.startsWith("\"") || matchString.startsWith("'"))) { //$NON-NLS-1$ //$NON-NLS-2$
+						matchString = matchString.substring(1);
+					}
+					boolean currentValid = false;
+
+					//create suggestions for enumerated values
+					int rOffset = contentAssistRequest.getReplacementBeginPosition();
+					int rLength = contentAssistRequest.getReplacementLength();
+					for (Iterator j = possibleValues.iterator(); j.hasNext();) {
+						String possibleValue = (String) j.next();
+						String alternateMatch = null;
+						if (qualifiedDelimiter != null) {
+							int delimiter = possibleValue.lastIndexOf(qualifiedDelimiter);
+							if (delimiter >= 0 && delimiter < possibleValue.length() - 1) {
+								alternateMatch = possibleValue.substring(delimiter + 1);
+							}
+						}
+						if(!possibleValue.equals(defaultValue)) {
+							currentValid = currentValid || possibleValue.equals(currentValue);
+							if ((matchString.length() == 0) || possibleValue.startsWith(matchString)) {
+								String rString = "\"" + possibleValue + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+								alternateMatch = "\"" + alternateMatch; //$NON-NLS-1$
+								CustomCompletionProposal proposal = new CustomCompletionProposal(
+										rString, rOffset, rLength, possibleValue.length() + 1,
+										XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENUM),
+										rString, alternateMatch, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE, true);
+								contentAssistRequest.addProposal(proposal);
+							}
+						}
+					}
+					if(defaultValue != null && ((matchString.length() == 0) || defaultValue.startsWith(matchString))) {
+						String rString = "\"" + defaultValue + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+						CustomCompletionProposal proposal = new CustomCompletionProposal(
+								rString, rOffset, rLength, defaultValue.length() + 1,
+								XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DEFAULT),
+								rString, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+				else if (((attrDecl.getUsage() == CMAttributeDeclaration.FIXED) ||
+						(attrDecl.getAttrType().getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED)) &&
+						(attrDecl.getAttrType().getImpliedValue() != null)) {
+					
+					// FIXED values
+					String value = attrDecl.getAttrType().getImpliedValue();
+					if ((value != null) && (value.length() > 0)) {
+						String rValue = "\"" + value + "\"";//$NON-NLS-2$//$NON-NLS-1$
+						CustomCompletionProposal proposal = new CustomCompletionProposal(
+								rValue, contentAssistRequest.getReplacementBeginPosition(),
+								contentAssistRequest.getReplacementLength(), rValue.length() + 1,
+								image, rValue, null, proposedInfo,
+								XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+						contentAssistRequest.addProposal(proposal);
+						if ((currentValue.length() > 0) && !value.equals(currentValue)) {
+							rValue = "\"" + currentValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
+							proposal = new CustomCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), rValue.length() + 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+			}
+			else {
+				// unknown attribute, so supply nice empty values
+				proposedInfo = getAdditionalInfo(null, elementDecl);
+				CustomCompletionProposal proposal = null;
+				if ((currentValue != null) && (currentValue.length() > 0)) {
+					String rValue = "\"" + currentValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
+					proposal = new CustomCompletionProposal(rValue,
+							contentAssistRequest.getReplacementBeginPosition(),
+							contentAssistRequest.getReplacementLength(), 1, image,
+							rValue, null, proposedInfo,
+							XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
+					contentAssistRequest.addProposal(proposal);
+				}
+			}
+		}
+		else {
+			setErrorMessage(XMLUIMessages.Content_Assist_not_availab_UI_);
+		}
+	}
+	
+	protected void addCommentProposal(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		contentAssistRequest.addProposal(new CustomCompletionProposal("<!--  -->", //$NON-NLS-1$
+				contentAssistRequest.getReplacementBeginPosition(),
+				contentAssistRequest.getReplacementLength(), 5,
+				XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_COMMENT),
+				NLS.bind(XMLUIMessages.Comment__, (new Object[]{" <!--  -->"})), //$NON-NLS-1$
+				null, null, XMLRelevanceConstants.R_COMMENT));
+	}
+	
+	
+
+	/**
+	 * Add the proposals for the name in an end tag
+	 */
+	protected void addEndTagNameProposals(ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+
+		if (contentAssistRequest.getStartOffset() + contentAssistRequest.getRegion().getTextLength() < contentAssistRequest.getReplacementBeginPosition()) {
+			CustomCompletionProposal proposal = new CustomCompletionProposal(">", //$NON-NLS-1$
+						contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC), NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" '>'"})), //$NON-NLS-1$
+						null, null, XMLRelevanceConstants.R_END_TAG_NAME);
+			contentAssistRequest.addProposal(proposal);
+		}
+		else {
+			Node aNode = contentAssistRequest.getNode();
+			String matchString = contentAssistRequest.getMatchString();
+			if (matchString.startsWith("</")) { //$NON-NLS-1$
+				matchString = matchString.substring(2);
+			}
+			while (aNode != null) {
+				if (aNode.getNodeType() == Node.ELEMENT_NODE) {
+					if (aNode.getNodeName().startsWith(matchString)) {
+						IDOMNode aXMLNode = (IDOMNode) aNode;
+						CMElementDeclaration ed = getCMElementDeclaration(aNode);
+						//declaration must be valid for this computer to make proposal
+						if ((aXMLNode.getEndStructuredDocumentRegion() == null) && (ed == null || (validModelQueryNode(ed) && ed.getContentType() != CMElementDeclaration.EMPTY))) {
+							String replacementText = aNode.getNodeName();
+							String displayText = replacementText;
+							String proposedInfo = (ed != null) ? getAdditionalInfo(null, ed) : null;
+							if(!contentAssistRequest.getDocumentRegion().isEnded()) {
+								replacementText += ">"; //$NON-NLS-1$
+							}
+							CustomCompletionProposal proposal = null;
+							// double check to see if the region acted upon is
+							// a tag name; replace it if so
+							Image image = CMImageUtil.getImage(ed);
+							if (image == null) {
+								image = this.getGenericTagImage();
+							}
+							if (contentAssistRequest.getRegion().getType() == DOMRegionContext.XML_TAG_NAME) {
+								proposal = new CustomCompletionProposal(
+										replacementText, contentAssistRequest.getStartOffset(),
+										contentAssistRequest.getRegion().getTextLength(),
+										replacementText.length(), image, displayText, null,
+										proposedInfo, XMLRelevanceConstants.R_END_TAG_NAME);
+							}
+							else {
+								proposal = new CustomCompletionProposal(
+										replacementText,
+										contentAssistRequest.getReplacementBeginPosition(),
+										contentAssistRequest.getReplacementLength(),
+										replacementText.length(), image,
+										NLS.bind(XMLUIMessages.Close_with__,
+												(new Object[]{"'" + displayText + "'"})), //$NON-NLS-1$ //$NON-NLS-2$
+										null, proposedInfo, XMLRelevanceConstants.R_END_TAG_NAME);
+							}
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+				aNode = aNode.getParentNode();
+			}
+		}
+	}
+
+	/**
+	 * Prompt for end tags to a non-empty Node that hasn't ended Handles these
+	 * cases: <br>
+	 * <tagOpen>| <br>
+	 * <tagOpen>< |<br>
+	 * <tagOpen></ |
+	 * 
+	 * @param contentAssistRequest
+	 */
+	protected void addEndTagProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		IDOMNode node = (IDOMNode) contentAssistRequest.getParent();
+
+		if (isCommentNode(node)) {
+			// loop and find non comment node parent
+			while ((node != null) && isCommentNode(node)) {
+				node = (IDOMNode) node.getParentNode();
+			}
+		}
+
+		// node is already closed
+		if (node.isClosed()) {
+			// loop and find non comment unclose node parent
+			while ((node != null) && node.isClosed()) {
+				node = (IDOMNode) node.getParentNode();
+			}
+		}
+		// there were no unclosed tags
+		if (node == null) {
+			return;
+		}
+
+		// data to create a CustomCompletionProposal
+		String replaceText = node.getNodeName() + ">"; //$NON-NLS-1$
+		int replaceBegin = contentAssistRequest.getReplacementBeginPosition();
+		int replaceLength = contentAssistRequest.getReplacementLength();
+		int cursorOffset = node.getNodeName().length() + 1;
+		String displayString = ""; //$NON-NLS-1$
+		String proposedInfo = ""; //$NON-NLS-1$
+		Image image = this.getGenericTagImage();
+
+		setErrorMessage(null);
+		boolean addProposal = false;
+
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			// ////////////////////////////////////////////////////////////////////////////////////
+			IStructuredDocument sDoc = (IStructuredDocument) context.getDocument();
+			IStructuredDocumentRegion xmlEndTagOpen = sDoc.getRegionAtCharacterOffset(contentAssistRequest.getReplacementBeginPosition());
+			// skip backward to "<", "</", or the (unclosed) start tag, null if not found
+			String type = ""; //$NON-NLS-1$
+			while ((xmlEndTagOpen != null) &&
+					((type = xmlEndTagOpen.getType()) != DOMRegionContext.XML_END_TAG_OPEN) &&
+					(type != DOMRegionContext.XML_TAG_CLOSE) && !needsEndTag(xmlEndTagOpen, context) &&
+					(type != DOMRegionContext.XML_TAG_OPEN)) {
+				
+				xmlEndTagOpen = xmlEndTagOpen.getPrevious();
+			}
+
+			if (xmlEndTagOpen == null) {
+				return;
+			}
+
+			node = (IDOMNode) node.getModel().getIndexedRegion(xmlEndTagOpen.getStartOffset());
+			node = (IDOMNode) node.getParentNode();
+
+			if (isStartTag(xmlEndTagOpen)) {
+				// this is the case for a start tag w/out end tag
+				// eg:
+				// <p>
+				// <% String test = "test"; %>
+				// |
+				if (needsEndTag(xmlEndTagOpen, context)) {
+					String tagName = getTagName(xmlEndTagOpen);
+					xmlEndTagOpen.getTextEndOffset();
+					replaceLength = 0;
+					replaceText = "</" + tagName + ">"; //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
+					cursorOffset = tagName.length() + 3;
+					displayString = NLS.bind(XMLUIMessages.End_with__, (new Object[]{tagName}));
+					addProposal = true;
+				}
+			}
+			else if (type == DOMRegionContext.XML_END_TAG_OPEN) {
+				// this is the case for: <tag> </ |
+				// possibly <tag> </ |<anotherTag>
+				// should only be replacing white space...
+				replaceLength = (replaceBegin > xmlEndTagOpen.getTextEndOffset()) ? replaceBegin - xmlEndTagOpen.getTextEndOffset() : 0;
+				replaceText = node.getNodeName() + ">"; //$NON-NLS-1$
+				cursorOffset = replaceText.length();
+				replaceBegin = xmlEndTagOpen.getTextEndOffset();
+				displayString = NLS.bind(XMLUIMessages.End_with_, (new Object[]{node.getNodeName()}));
+				addProposal = true;
+			}
+			else if (type == DOMRegionContext.XML_TAG_OPEN) {
+				// this is the case for: <tag> < |
+				replaceText = "/" + node.getNodeName() + ">"; //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
+				cursorOffset = replaceText.length();
+
+				// should only be replacing white space...
+				replaceLength = (replaceBegin > xmlEndTagOpen.getTextEndOffset()) ? replaceBegin - xmlEndTagOpen.getTextEndOffset() : 0;
+				replaceBegin = xmlEndTagOpen.getTextEndOffset();
+				displayString = NLS.bind(XMLUIMessages.End_with_, (new Object[]{"/" + node.getNodeName()})); //$NON-NLS-1$
+				addProposal = true;
+			}
+		}
+		// ////////////////////////////////////////////////////////////////////////////////////
+		// sometimes the node is not null, but
+		// getNodeValue() is null, put in a null check
+		else if ((node.getNodeValue() != null) && (node.getNodeValue().indexOf("</") != -1)) { //$NON-NLS-1$
+			// the case where "</" is started, but the nodes comes in as a
+			// text node (instead of element)
+			// like this: <tag> </|
+			Node parent = node.getParentNode();
+			if ((parent != null) && (parent.getNodeType() != Node.DOCUMENT_NODE)) {
+				replaceText = parent.getNodeName() + ">"; //$NON-NLS-1$
+				cursorOffset = replaceText.length();
+				displayString = NLS.bind(XMLUIMessages.End_with__, (new Object[]{parent.getNodeName()}));
+				setErrorMessage(null);
+				addProposal = true;
+			}
+		}
+		// ////////////////////////////////////////////////////////////////////////////////////
+		else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			setErrorMessage(XMLUIMessages.Content_Assist_not_availab_UI_);
+		}
+		if (addProposal == true) {
+			CustomCompletionProposal proposal = new CustomCompletionProposal(replaceText, replaceBegin, replaceLength, cursorOffset, image, displayString, null, proposedInfo, XMLRelevanceConstants.R_END_TAG);
+			contentAssistRequest.addProposal(proposal);
+		}
+	}
+	
+	protected void addEntityProposals(
+			ContentAssistRequest contentAssistRequest,
+			ITextRegion completionRegion, IDOMNode treeNode,
+			CompletionProposalInvocationContext context) {
+		
+		ICompletionProposal[] eps = computeEntityReferenceProposals(completionRegion,
+				treeNode, context);
+		for (int i = 0; (eps != null) && (i < eps.length); i++) {
+			contentAssistRequest.addProposal(eps[i]);
+		}
+	}
+	
+	protected void addEntityProposals(Vector proposals, Properties map,
+			String key, int nodeOffset, IStructuredDocumentRegion sdRegion,
+			ITextRegion completionRegion,
+			CompletionProposalInvocationContext context) {
+		
+		if (map == null) {
+			return;
+		}
+		String entityName = ""; //$NON-NLS-1$
+		String entityValue = ""; //$NON-NLS-1$
+		Image entityIcon = this.getEntityReferenceImage();
+		String replacementText = ""; //$NON-NLS-1$
+		String displayString = ""; //$NON-NLS-1$
+		Enumeration keys = map.keys();
+
+		while ((keys != null) && keys.hasMoreElements()) {
+			entityName = (String) keys.nextElement();
+			entityValue = map.getProperty(entityName);
+			// filter based on partial entity string...
+			if (entityName.toLowerCase().startsWith(key.toLowerCase()) || key.trim().equals("")) //$NON-NLS-1$
+			{
+				// figure out selection...if text is selected, add it to
+				// selection length
+				int selectionLength = nodeOffset;
+				if (context.getViewer() != null) {
+					selectionLength += context.getViewer().getSelectedRange().y;
+				}
+				// create a new proposal for entity string...
+				replacementText = "&" + entityName + ";"; //$NON-NLS-1$ //$NON-NLS-2$ 
+				displayString = "&" + entityName + "; (" + entityValue + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				ICompletionProposal cp = new CustomCompletionProposal(replacementText, sdRegion.getStartOffset(completionRegion), selectionLength, replacementText.length(), entityIcon, displayString, null, null, XMLRelevanceConstants.R_ENTITY);
+				if (cp != null) {
+					proposals.add(cp);
+				}
+			}
+		}
+	}
+	
+	protected void addPCDATAProposal(String nodeName,
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		CustomCompletionProposal proposal = new CustomCompletionProposal("<![CDATA[]]>", //$NON-NLS-1$
+					contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 9, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_CDATASECTION), "CDATA Section", //$NON-NLS-1$
+					null, null, XMLRelevanceConstants.R_CDATA);
+		contentAssistRequest.addProposal(proposal);
+
+		proposal = new CustomCompletionProposal(nodeName, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), nodeName.length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TXTEXT), "#PCDATA", //$NON-NLS-1$
+					null, null, XMLRelevanceConstants.R_CDATA);
+		contentAssistRequest.addProposal(proposal);
+	}
+	
+	protected void addStartDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		//determine if XMLPI is first element
+		Node aNode = contentAssistRequest.getNode();
+		Document owningDocument = aNode.getOwnerDocument();
+		Node first = owningDocument.getFirstChild();
+		boolean xmlpiIsFirstElement = ((first != null) && (first.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE));
+		
+		// make sure xmlpi is root element don't want doctype proposal if XMLPI isn't first element...
+		if (xmlpiIsFirstElement && (owningDocument.getDoctype() == null) &&
+				isCursorAfterXMLPI(contentAssistRequest)) {
+			
+			addDocTypeProposal(contentAssistRequest, context);
+		}
+	}
+	
+	/**
+	 * Close an unclosed start tag
+	 */
+	protected void addTagCloseProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		IDOMNode node = (IDOMNode) contentAssistRequest.getParent();
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+
+			CMElementDeclaration elementDecl = getCMElementDeclaration(node);
+			String proposedInfo = (elementDecl != null) ? getAdditionalInfo(null, elementDecl) : null;
+			int contentType = (elementDecl != null) ? elementDecl.getContentType() : CMElementDeclaration.ANY;
+			// if it's XML and content doesn't HAVE to be element, add "/>" proposal.
+			boolean endWithSlashBracket = (isXMLNode(node) && (contentType != CMElementDeclaration.ELEMENT));
+
+			//get the image
+			Image image = CMImageUtil.getImage(elementDecl);
+			if (image == null) {
+				image = this.getGenericTagImage();
+			}
+
+			// is the start tag ended properly?
+			if ((contentAssistRequest.getDocumentRegion() == node.getFirstStructuredDocumentRegion()) && !(node.getFirstStructuredDocumentRegion()).isEnded()) {
+				setErrorMessage(null);
+				// Is this supposed to be an empty tag? Note that if we can't
+				// tell, we assume it's not.
+				if ((elementDecl != null) && (elementDecl.getContentType() == CMElementDeclaration.EMPTY)) {
+					// prompt with a self-closing end character if needed
+					// this is one of the few times to ignore the length -- always insert
+					// contentAssistRequest.getReplacementLength()
+					CustomCompletionProposal proposal = new CustomCompletionProposal(
+							getContentGenerator().getStartTagClose(node, elementDecl),
+							contentAssistRequest.getReplacementBeginPosition(), 0,
+							getContentGenerator().getStartTagClose(node, elementDecl).length(), image,
+							NLS.bind(XMLUIMessages.Close_with___,(new Object[]{getContentGenerator().getStartTagClose(node, elementDecl)})),
+							null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+					contentAssistRequest.addProposal(proposal);
+				}
+				else {
+					// prompt with a close for the start tag
+					CustomCompletionProposal proposal = new CustomCompletionProposal(">", //$NON-NLS-1$
+								contentAssistRequest.getReplacementBeginPosition(),
+								// this is one of the few times to ignore the
+								// length -- always insert
+								// contentAssistRequest.getReplacementLength(),
+								0, 1, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" '>'"})), //$NON-NLS-1$
+								null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+					contentAssistRequest.addProposal(proposal);
+
+					// prompt with the closer for the start tag and an end tag if one is not present
+					if (node.getEndStructuredDocumentRegion() == null) {
+						// make sure tag name is actually what it thinks it
+						// is...(eg. <%@ vs. <jsp:directive)
+						IStructuredDocumentRegion sdr = contentAssistRequest.getDocumentRegion();
+						String openingTagText = (sdr != null) ? sdr.getFullText() : ""; //$NON-NLS-1$
+						if ((openingTagText != null) && (openingTagText.indexOf(node.getNodeName()) != -1)) {
+							proposal = new CustomCompletionProposal("></" + node.getNodeName() + ">", //$NON-NLS-2$//$NON-NLS-1$
+										contentAssistRequest.getReplacementBeginPosition(),
+										// this is one of the few times to
+										// ignore the length -- always insert
+										// contentAssistRequest.getReplacementLength(),
+										0, 1, image, NLS.bind(XMLUIMessages.Close_with____, (new Object[]{node.getNodeName()})), null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+					// prompt with slash bracket "/>" incase if it's a self ending tag
+					if (endWithSlashBracket) {
+						proposal = new CustomCompletionProposal("/>", //$NON-NLS-1$
+									contentAssistRequest.getReplacementBeginPosition(),
+									// this is one of the few times to ignore
+									// the length -- always insert
+									// contentAssistRequest.getReplacementLength(),
+									0, 2, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" \"/>\""})), //$NON-NLS-1$
+									null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG + 1); // +1
+						// to bring to top of list
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+			}
+			else if ((contentAssistRequest.getDocumentRegion() == node.getLastStructuredDocumentRegion()) && !node.getLastStructuredDocumentRegion().isEnded()) {
+				setErrorMessage(null);
+				// prompt with a closing end character for the end tag
+				CustomCompletionProposal proposal = new CustomCompletionProposal(">", //$NON-NLS-1$
+							contentAssistRequest.getReplacementBeginPosition(),
+							// this is one of the few times to ignore the length -- always insert
+							// contentAssistRequest.getReplacementLength(),
+							0, 1, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{" '>'"})), //$NON-NLS-1$
+							null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);
+				contentAssistRequest.addProposal(proposal);
+			}
+		}
+		else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			setErrorMessage(XMLUIMessages.Content_Assist_not_availab_UI_);
+		}
+	}
+	
+	protected void addTagInsertionProposals(
+			ContentAssistRequest contentAssistRequest, int childPosition,
+			CompletionProposalInvocationContext context) {
+		
+		List cmnodes = null;
+		Node parent = contentAssistRequest.getParent();
+		String error = null;
+
+		// (nsd) This is only valid at the document element level
+		// only valid if it's XML (check added 2/17/2004)
+		if ((parent != null) && (parent.getNodeType() == Node.DOCUMENT_NODE) &&
+				((IDOMDocument) parent).isXMLType() && !isCursorAfterXMLPI(contentAssistRequest)) {
+			return;
+		}
+		// only want proposals if cursor is after doctype...
+		if (!isCursorAfterDoctype(contentAssistRequest)) {
+			return;
+		}
+
+		// fix for meta-info comment nodes.. they currently "hide" other
+		// proposals because the don't
+		// have a content model (so can't propose any children..)
+		if ((parent != null) && (parent instanceof IDOMNode) && isCommentNode((IDOMNode) parent)) {
+			// loop and find non comment node?
+			while ((parent != null) && isCommentNode((IDOMNode) parent)) {
+				parent = parent.getParentNode();
+			}
+		}
+
+		if (parent.getNodeType() == Node.ELEMENT_NODE) {
+			CMElementDeclaration parentDecl = getCMElementDeclaration(parent);
+			if (parentDecl != null) {
+				// XSD-specific ability - no filtering
+				CMDataType childType = parentDecl.getDataType();
+				if (childType != null) {
+					String[] childStrings = childType.getEnumeratedValues();
+					String defaultValue = childType.getImpliedValue();
+					if (childStrings != null || defaultValue != null) {
+						// the content string is the sole valid child...so replace the rest
+						int begin = contentAssistRequest.getReplacementBeginPosition();
+						int length = contentAssistRequest.getReplacementLength();
+						if (parent instanceof IDOMNode) {
+							if (((IDOMNode) parent).getLastStructuredDocumentRegion() != ((IDOMNode) parent).getFirstStructuredDocumentRegion()) {
+								begin = ((IDOMNode) parent).getFirstStructuredDocumentRegion().getEndOffset();
+								length = ((IDOMNode) parent).getLastStructuredDocumentRegion().getStartOffset() - begin;
+							}
+						}
+						String proposedInfo = getAdditionalInfo(parentDecl, childType);
+						for (int i = 0; i < childStrings.length; i++) {
+							if(!childStrings[i].equals(defaultValue)) {
+								CustomCompletionProposal textProposal = new CustomCompletionProposal(
+										childStrings[i],begin, length, childStrings[i].length(),
+										XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENUM),
+										childStrings[i], null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);
+								contentAssistRequest.addProposal(textProposal);
+							}
+						}
+						if(defaultValue != null) {
+							CustomCompletionProposal textProposal = new CustomCompletionProposal(
+									defaultValue, begin, length, defaultValue.length(),
+									XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DEFAULT),
+									defaultValue, null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);
+							contentAssistRequest.addProposal(textProposal);
+						}
+					}
+				}
+			}
+			if ((parentDecl != null) && (parentDecl.getContentType() == CMElementDeclaration.PCDATA)) {
+				addPCDATAProposal(parentDecl.getNodeName(), contentAssistRequest, context);
+			}
+			else {
+				// retrieve the list of all possible children within this parent context
+				cmnodes = getAvailableChildElementDeclarations((Element) parent, childPosition,ModelQueryAction.INSERT);
+
+				// retrieve the list of the possible children within this
+				// parent context and at this index
+				List strictCMNodeSuggestions = null;
+				if (XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_STRICT.equals(XMLUIPlugin.getInstance().getPreferenceStore().getString(XMLUIPreferenceNames.SUGGESTION_STRATEGY))) {
+					strictCMNodeSuggestions = getValidChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);
+				}
+				Iterator nodeIterator = cmnodes.iterator();
+				if (!nodeIterator.hasNext()) {
+					if (getCMElementDeclaration(parent) != null) {
+						error = NLS.bind(XMLUIMessages._Has_no_available_child, (new Object[]{parent.getNodeName()}));
+					}
+					else {
+						error = NLS.bind(XMLUIMessages.Element__is_unknown, (new Object[]{parent.getNodeName()}));
+					}
+				}
+				String matchString = contentAssistRequest.getMatchString();
+				// chop off any leading <'s and whitespace from the matchstring
+				while ((matchString.length() > 0) &&
+						(Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, "<"))) { //$NON-NLS-1$
+					
+					matchString = matchString.substring(1);
+				}
+				while (nodeIterator.hasNext()) {
+					Object o = nodeIterator.next();
+					if (o instanceof CMElementDeclaration) {
+						CMElementDeclaration elementDecl =(CMElementDeclaration) o;
+						// only add proposals for the child element's that
+						// begin with the matchstring
+						String tagname = getRequiredName(parent, elementDecl);
+						boolean isStrictCMNodeSuggestion =
+							strictCMNodeSuggestions != null ? strictCMNodeSuggestions.contains(elementDecl) : false;
+
+						//get the proposal image
+						Image image = CMImageUtil.getImage(elementDecl);
+						if (image == null) {
+							if (strictCMNodeSuggestions != null) {
+								image = isStrictCMNodeSuggestion ? this.getEmphasizedTagImage() : this.getDeemphasizedTagImage();
+							} else {
+								image = this.getGenericTagImage();
+							}
+						}
+
+						if (beginsWith(tagname, matchString)) {
+							String proposedText = getRequiredText(parent, elementDecl);
+
+							// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89811
+							// place cursor in first empty quotes
+							int markupAdjustment = getCursorPositionForProposedText(proposedText);
+
+							String proposedInfo = getAdditionalInfo(parentDecl, elementDecl);
+							int relevance = isStrictCMNodeSuggestion ? XMLRelevanceConstants.R_STRICTLY_VALID_TAG_INSERTION : XMLRelevanceConstants.R_TAG_INSERTION;
+							CustomCompletionProposal proposal = new CustomCompletionProposal(
+									proposedText, contentAssistRequest.getReplacementBeginPosition(),
+									contentAssistRequest.getReplacementLength(), markupAdjustment,
+									image, tagname, null, proposedInfo, relevance);
+							contentAssistRequest.addProposal(proposal);
+						}
+					}
+				}
+				if (contentAssistRequest.getProposals().size() == 0) {
+					if (error != null) {
+						setErrorMessage(error);
+					}
+					else if ((contentAssistRequest.getMatchString() != null) &&
+							(contentAssistRequest.getMatchString().length() > 0)) {
+						
+						setErrorMessage(NLS.bind(
+								XMLUIMessages.No_known_child_tag,
+								(new Object[]{parent.getNodeName(), contentAssistRequest.getMatchString()})));
+					}
+					else {
+						setErrorMessage(NLS.bind(
+								XMLUIMessages.__Has_no_known_child,
+								(new Object[]{parent.getNodeName()})));
+					}
+				}
+			}
+		}
+		else if (parent.getNodeType() == Node.DOCUMENT_NODE) {
+			// Can only prompt with elements if the cursor position is past
+			// the XML processing
+			// instruction and DOCTYPE declaration
+			boolean xmlpiFound = false;
+			boolean doctypeFound = false;
+			int minimumOffset = -1;
+
+			for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
+
+				boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) && child.getNodeName().equals("xml")); //$NON-NLS-1$
+				boolean doctype = child.getNodeType() == Node.DOCUMENT_TYPE_NODE;
+				if (xmlpi || (doctype && (minimumOffset < 0))) {
+					minimumOffset = ((IDOMNode) child).getFirstStructuredDocumentRegion().getStartOffset() + ((IDOMNode) child).getFirstStructuredDocumentRegion().getTextLength();
+				}
+				xmlpiFound = xmlpiFound || xmlpi;
+				doctypeFound = doctypeFound || doctype;
+			}
+
+			if (contentAssistRequest.getReplacementBeginPosition() >= minimumOffset) {
+				List childDecls = getAvailableRootChildren((Document) parent, childPosition);
+				for (int i = 0; i < childDecls.size(); i++) {
+					CMElementDeclaration ed = (CMElementDeclaration) childDecls.get(i);
+					if (ed != null) {
+						Image image = CMImageUtil.getImage(ed);
+						if (image == null) {
+							image = this.getGenericTagImage();
+						}
+						String proposedText = getRequiredText(parent, ed);
+						String tagname = getRequiredName(parent, ed);
+						// account for the &lt; and &gt;
+						int markupAdjustment = getContentGenerator().getMinimalStartTagLength(parent, ed);
+						String proposedInfo = getAdditionalInfo(null, ed);
+						CustomCompletionProposal proposal = new CustomCompletionProposal(
+								proposedText, contentAssistRequest.getReplacementBeginPosition(),
+								contentAssistRequest.getReplacementLength(), markupAdjustment, image,
+								tagname, null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+			}
+		}
+	}
+
+	protected void addTagNameProposals(
+			ContentAssistRequest contentAssistRequest, int childPosition,
+			CompletionProposalInvocationContext context) {
+		
+		List cmnodes = null;
+		Node parent = contentAssistRequest.getParent();
+		IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
+		String error = null;
+		String matchString = contentAssistRequest.getMatchString();
+		if (parent.getNodeType() == Node.ELEMENT_NODE) {
+			// retrieve the list of children
+			// validActions = getAvailableChildrenAtIndex((Element) parent,
+			// childPosition);
+			cmnodes = getAvailableChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);
+			List strictCMNodeSuggestions = null;
+			if (XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_STRICT.equals(XMLUIPlugin.getInstance().getPreferenceStore().getString(XMLUIPreferenceNames.SUGGESTION_STRATEGY))) {
+				strictCMNodeSuggestions = getValidChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);
+			}
+			
+			Iterator nodeIterator = cmnodes.iterator();
+			// chop off any leading <'s and whitespace from the matchstring
+			while ((matchString.length() > 0) &&
+					(Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, "<"))) { //$NON-NLS-1$
+				
+				matchString = matchString.substring(1);
+			}
+			if (!nodeIterator.hasNext()) {
+				error = NLS.bind(XMLUIMessages.__Has_no_known_child, (new Object[]{parent.getNodeName()}));
+			}
+			while (nodeIterator.hasNext()) {
+				CMNode elementDecl = (CMNode) nodeIterator.next();
+				if (elementDecl != null) {
+					// only add proposals for the child element's that begin with the matchstring
+					String proposedText = null;
+					int cursorAdjustment = 0;
+					
+					//determine if strict suggestion
+					boolean isStrictCMNodeSuggestion =
+						strictCMNodeSuggestions != null ? strictCMNodeSuggestions.contains(elementDecl) : false;
+
+					// do a check to see if partial attributes of partial tag names are in list
+					if (((node != null) && (node.getAttributes() != null) &&
+							(node.getAttributes().getLength() > 0) &&
+							attributeInList(node, parent, elementDecl)) ||
+							((node.getNodeType() != Node.TEXT_NODE) &&
+									node.getFirstStructuredDocumentRegion().isEnded())) {
+
+						proposedText = getRequiredName(parent, elementDecl);
+						cursorAdjustment = proposedText.length();
+					}
+					else {
+						proposedText = getRequiredName(parent, elementDecl);
+						
+						cursorAdjustment = proposedText.length();
+						if (elementDecl instanceof CMElementDeclaration) {
+							CMElementDeclaration ed = (CMElementDeclaration) elementDecl;
+							// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89811
+							StringBuffer sb = new StringBuffer();
+							getContentGenerator().generateTag(parent, ed, sb);
+							// since it's a name proposal, assume '<' is already there
+							// only return the rest of the tag
+							proposedText = sb.toString().substring(1);
+							cursorAdjustment = getCursorPositionForProposedText(proposedText);
+						}
+					}
+					if (beginsWith(proposedText, matchString)) {
+						//get the proposal image
+						Image image = CMImageUtil.getImage(elementDecl);
+						if (image == null) {
+							if (strictCMNodeSuggestions != null) {
+								image = isStrictCMNodeSuggestion ? this.getEmphasizedTagImage() : this.getDeemphasizedTagImage();
+							} else {
+								image = this.getGenericTagImage();
+							}
+						}
+						int relevance = isStrictCMNodeSuggestion ? XMLRelevanceConstants.R_STRICTLY_VALID_TAG_NAME : XMLRelevanceConstants.R_TAG_NAME;
+						String proposedInfo = getAdditionalInfo(getCMElementDeclaration(parent), elementDecl);
+						CustomCompletionProposal proposal = new CustomCompletionProposal(
+								proposedText, contentAssistRequest.getReplacementBeginPosition(),
+								contentAssistRequest.getReplacementLength(), cursorAdjustment, image,
+								getRequiredName(parent, elementDecl), null, proposedInfo,
+								relevance);
+						contentAssistRequest.addProposal(proposal);
+					}
+				}
+			}
+			if (contentAssistRequest.getProposals().size() == 0) {
+				if (error != null) {
+					setErrorMessage(error);
+				}
+				else if ((contentAssistRequest.getMatchString() != null) && (contentAssistRequest.getMatchString().length() > 0)) {
+					setErrorMessage(NLS.bind(
+							XMLUIMessages.No_known_child_tag_names,
+							(new Object[]{parent.getNodeName(), contentAssistRequest.getMatchString()})));
+				}
+				else {
+					setErrorMessage(NLS.bind(
+							XMLUIMessages.__Has_no_known_child,
+							(new Object[]{parent.getNodeName()})));
+				}
+			}
+		}
+		else if (parent.getNodeType() == Node.DOCUMENT_NODE) {
+			List childElements = getAvailableRootChildren((Document) parent, childPosition);
+			if ( childElements.size() == 0) {
+				//No doctype available , treat it as empty document
+				addEmptyDocumentProposals(contentAssistRequest, context);
+			}
+			for (int i = 0; i < childElements.size(); i++) {
+				CMNode ed = (CMNode) childElements.get(i);
+				if (ed == null) {
+					continue;
+				}
+				String proposedText = null;
+				int cursorAdjustment = 0;
+				if (ed instanceof CMElementDeclaration) {
+					// proposedText = getRequiredName(parent, ed);
+					StringBuffer sb = new StringBuffer();
+					getContentGenerator().generateTag(parent, (CMElementDeclaration) ed, sb);
+					// tag starts w/ '<', but we want to compare to name
+					proposedText = sb.toString().substring(1);
+
+					if (!beginsWith(proposedText, matchString)) {
+						continue;
+					}
+
+					cursorAdjustment = getCursorPositionForProposedText(proposedText);
+
+					String proposedInfo = getAdditionalInfo(null, ed);
+					Image image = CMImageUtil.getImage(ed);
+					if (image == null) {
+						image = this.getGenericTagImage();
+					}
+					CustomCompletionProposal proposal = new CustomCompletionProposal(
+							proposedText, contentAssistRequest.getReplacementBeginPosition(),
+							contentAssistRequest.getReplacementLength(), cursorAdjustment, image,
+							getRequiredName(parent, ed), null, proposedInfo, XMLRelevanceConstants.R_TAG_NAME);
+					contentAssistRequest.addProposal(proposal);
+				}
+			}
+		}
+	}
+	
+	protected void addEmptyDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		//by default do nothing
+	}
+	
+	/**
+	 * <p>Implementers are allowed to override</p>
+	 * 
+	 * @return the proposal image to display for generic tag proposals
+	 */
+	protected Image getGenericTagImage() {
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);
+	}
+	
+	/**
+	 * <p>Implementers are allowed to override</p>
+	 * 
+	 * @return the proposal image to display for emphasized tag proposals
+	 */
+	protected Image getEmphasizedTagImage() {
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC_EMPHASIZED);
+	}
+	
+	/**
+	 * <p>Implementers are allowed to override</p>
+	 * 
+	 * @return the proposal image to display for de-emphasized tag proposals
+	 */
+	protected Image getDeemphasizedTagImage() {
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC_DEEMPHASIZED);
+	}
+	
+	/**
+	 * <p>Implementers are allowed to override</p>
+	 * 
+	 * @return the proposal image to display for entity reference proposals
+	 */
+	protected Image getEntityReferenceImage() {
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENTITY_REFERENCE);
+	}
+	
+	/**
+	 * <p>Implementers are allowed to override</p>
+	 * 
+	 * @return the proposal image to display for not required attributes
+	 */
+	protected Image getNotRequiredAttributeImage() {
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);
+	}
+	
+	/**
+	 * <p>Implementers are allowed to override</p>
+	 * 
+	 * @return the proposal image to display for required attributes
+	 */
+	protected Image getRequiredAttributeImage() {
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATT_REQ_OBJ);
+	}
+	
+	/**
+	 * This method can check if the cursor is after the XMLPI
+	 * 
+	 * @param car
+	 */
+	protected boolean isCursorAfterXMLPI(ContentAssistRequest car) {
+		Node aNode = car.getNode();
+		boolean xmlpiFound = false;
+		Document parent = aNode.getOwnerDocument();
+		int xmlpiNodePosition = -1;
+		boolean isAfterXMLPI = false;
+
+		if (parent == null) {
+			return true; // blank document case
+		}
+
+		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
+			boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) && child.getNodeName().equals("xml")); //$NON-NLS-1$
+			xmlpiFound = xmlpiFound || xmlpi;
+			if (xmlpiFound) {
+				if (child instanceof IDOMNode) {
+					xmlpiNodePosition = ((IDOMNode) child).getEndOffset();
+					isAfterXMLPI = (car.getReplacementBeginPosition() >= xmlpiNodePosition);
+				}
+				break;
+			}
+		}
+		return isAfterXMLPI;
+	}
+	
+	protected String getRequiredName(Node parentOrOwner, CMNode cmnode) {
+		if ((cmnode == null) || (parentOrOwner == null)) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return ""; //$NON-NLS-1$
+		}
+		return getContentGenerator().getRequiredName(parentOrOwner, cmnode);
+	}
+	
+	private String getRequiredText(Node parentOrOwner, CMAttributeDeclaration attrDecl) {
+		if (attrDecl == null) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null attribute declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return ""; //$NON-NLS-1$
+		}
+		StringBuffer buff = new StringBuffer();
+		getContentGenerator().generateRequiredAttribute(parentOrOwner, attrDecl, buff);
+		return buff.toString();
+	}
+	
+	protected String getRequiredText(Node parentOrOwner, CMElementDeclaration elementDecl) {
+		if (elementDecl == null) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null attribute declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return ""; //$NON-NLS-1$
+		}
+		StringBuffer buff = new StringBuffer();
+		getContentGenerator().generateTag(parentOrOwner, elementDecl, buff);
+		return buff.toString();
+	}
+	
+	/**
+	 * Retrieves all of the possible valid values for this attribute
+	 * declaration
+	 */
+	private List getPossibleDataTypeValues(Node node, CMAttributeDeclaration ad) {
+		List list = null;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			Element element = (Element) node;
+			String[] dataTypeValues = null;
+			// The ModelQuery may not be available if the corresponding
+			// adapter
+			// is absent
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
+			if (modelQuery != null) {
+				dataTypeValues = modelQuery.getPossibleDataTypeValues(element, ad);
+			}
+			else {
+				if (ad.getAttrType() != null) {
+					dataTypeValues = ad.getAttrType().getEnumeratedValues();
+				}
+			}
+			if (dataTypeValues != null) {
+				list = new ArrayList(dataTypeValues.length);
+				for (int i = 0; i < dataTypeValues.length; i++) {
+					list.add(dataTypeValues[i]);
+				}
+			}
+		}
+		if (list == null) {
+			list = new ArrayList(0);
+		}
+		return list;
+	}
+	
+	/**
+	 * This is to determine if a tag is a special meta-info comment tag that
+	 * shows up as an ELEMENT
+	 * 
+	 * @param node
+	 * @return
+	 */
+	private boolean isCommentNode(IDOMNode node) {
+		return ((node != null) && (node instanceof IDOMElement) && ((IDOMElement) node).isCommentTag());
+	}
+	
+	private boolean isStartTag(IStructuredDocumentRegion sdRegion) {
+		boolean result = false;
+		if (sdRegion.getRegions().size() > 0) {
+			ITextRegion r = sdRegion.getRegions().get(0);
+			result = (r.getType() == DOMRegionContext.XML_TAG_OPEN) && sdRegion.isEnded();
+		}
+		return result;
+	}
+	
+	/**
+	 * Gets the corresponding XMLNode, and checks if it's closed.
+	 * 
+	 * @param startTag
+	 * 
+	 */
+	private boolean needsEndTag(IStructuredDocumentRegion startTag,
+			CompletionProposalInvocationContext context) {
+		
+		boolean result = false;
+		IStructuredModel sModel =
+			StructuredModelManager.getModelManager().getExistingModelForRead(context.getDocument());
+		try {
+			if (sModel != null) {
+				IDOMNode xmlNode = (IDOMNode) sModel.getIndexedRegion(startTag.getStart());
+				if (!isStartTag(startTag)) {
+					result = false;
+				}
+				else if (isSelfClosed(startTag)) {
+					result = false;
+				}
+				else if (!xmlNode.isContainer()) {
+					result = false;
+				}
+				else {
+					result = xmlNode.getEndStructuredDocumentRegion() == null;
+				}
+			}
+		}
+		finally {
+			if (sModel != null) {
+				sModel.releaseFromRead();
+			}
+		}
+		return result;
+	}
+	
+	private boolean isSelfClosed(IStructuredDocumentRegion startTag) {
+		ITextRegionList regions = startTag.getRegions();
+		return regions.get(regions.size() - 1).getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE;
+	}
+	
+	private String getTagName(IStructuredDocumentRegion sdRegion) {
+		ITextRegionList regions = sdRegion.getRegions();
+		ITextRegion region = null;
+		String name = ""; //$NON-NLS-1$
+		for (int i = 0; i < regions.size(); i++) {
+			region = regions.get(i);
+			if (region.getType() == DOMRegionContext.XML_TAG_NAME) {
+				name = sdRegion.getText(region);
+				break;
+			}
+		}
+		return name;
+	}
+	
+	/**
+	 * return all possible EntityReferenceProposals (according to current
+	 * position in doc)
+	 */
+	private ICompletionProposal[] computeEntityReferenceProposals(ITextRegion completionRegion,
+			IDOMNode treeNode,CompletionProposalInvocationContext context) {
+		
+		// only handle XML content for now
+		int documentPosition = context.getInvocationOffset();
+		Vector proposals = new Vector(); // ICompletionProposals
+		IStructuredDocumentRegion sdRegion =
+			ContentAssistUtils.getStructuredDocumentRegion(context.getViewer(), context.getInvocationOffset());
+		if ((completionRegion != null) && (completionRegion.getType() == DOMRegionContext.XML_CONTENT)) {
+			int nodeOffset = documentPosition - sdRegion.getStartOffset(completionRegion);
+			String regionText = sdRegion.getFullText(completionRegion);
+
+			// if directly to the right of a &, region will be null, need to
+			// move to
+			// the previous region...there might be a better way to do this
+			if ((regionText != null) && regionText.trim().equals("") && (documentPosition > 0)) { //$NON-NLS-1$
+				IStructuredDocumentRegion prev = treeNode.getStructuredDocument().getRegionAtCharacterOffset(documentPosition - 1);
+				if ((prev != null) && prev.getText().equals("&")) { //$NON-NLS-1$
+					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=206680
+					// examine previous region
+					sdRegion = prev;
+					completionRegion = prev.getLastRegion();
+					regionText = prev.getFullText();
+					nodeOffset = 1;
+				}
+			}
+
+			// string must start w/ &
+			if ((regionText != null) && regionText.startsWith("&")) { //$NON-NLS-1$						 		
+				String key = (nodeOffset > 0) ? regionText.substring(1, nodeOffset) : ""; //$NON-NLS-1$
+
+				// get entity proposals, passing in the appropriate start
+				// string
+				ModelQuery mq = ModelQueryUtil.getModelQuery(((Node) treeNode).getOwnerDocument());
+				if (mq != null) {
+					CMDocument xmlDoc = mq.getCorrespondingCMDocument(treeNode);
+					CMNamedNodeMap cmmap = null;
+					Properties entities = null;
+					if (xmlDoc != null) {
+						cmmap = xmlDoc.getEntities();
+					}
+					if (cmmap != null) {
+						entities = mapToProperties(cmmap);
+					}
+					else // 224787 in absence of content model, just use
+					// minimal 5 entities
+					{
+						entities = new Properties();
+						entities.put("quot", "\""); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("apos", "'"); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("amp", "&"); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("lt", "<"); //$NON-NLS-1$ //$NON-NLS-2$
+						entities.put("gt", ">"); //$NON-NLS-1$ //$NON-NLS-2$	
+						entities.put("nbsp", " "); //$NON-NLS-1$ //$NON-NLS-2$									
+					}
+					addEntityProposals(proposals, entities, key,
+							nodeOffset, sdRegion, completionRegion, context);
+				}
+			}
+		}
+		return (ICompletionProposal[]) ((proposals.size() > 0) ? proposals.toArray(new ICompletionProposal[proposals.size()]) : null);
+	}
+	
+	/**
+	 * Similar to the call in HTMLContentAssistProcessor. Pass in a node, it
+	 * tells you if the document is XML type.
+	 * 
+	 * @param node
+	 * 
+	 */
+	private boolean isXMLNode(Node node) {
+		if (node == null) {
+			return false;
+		}
+
+		Document doc = null;
+		doc = (node.getNodeType() != Node.DOCUMENT_NODE) ? node.getOwnerDocument() : ((Document) node);
+
+		return (doc instanceof IDOMDocument) && ((IDOMDocument) doc).isXMLType();
+	}
+	
+	/**
+	 * Checks if cursor position is after doctype tag...
+	 * 
+	 * @param car
+	 * 
+	 */
+	private boolean isCursorAfterDoctype(ContentAssistRequest car) {
+		Node aNode = car.getNode();
+		Document parent = aNode.getOwnerDocument();
+		int xmldoctypeNodePosition = -1;
+		boolean isAfterDoctype = true;
+
+		if (parent == null) {
+			return true; // blank document case
+		}
+
+		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
+			if (child instanceof IDOMNode) {
+				if (child.getNodeType() == Node.DOCUMENT_TYPE_NODE) {
+					xmldoctypeNodePosition = ((IDOMNode) child).getEndOffset();
+					isAfterDoctype = (car.getReplacementBeginPosition() >= xmldoctypeNodePosition);
+					break;
+				}
+			}
+		}
+		return isAfterDoctype;
+	}
+	
+	/**
+	 * returns a list of CMElementDeclarations
+	 * 
+	 * @param document
+	 * @param childIndex
+	 * @return
+	 */
+	private List getAvailableRootChildren(Document document, int childIndex) {
+		List list = null;
+
+		// extract the valid 'root' node name from the DocumentType Node
+		DocumentType docType = document.getDoctype();
+		String rootName = null;
+		if (docType != null) {
+			rootName = docType.getNodeName();
+		}
+		if (rootName == null) {
+			return new ArrayList(0);
+		}
+
+		for (Node child = document.getFirstChild(); child != null; child = child.getNextSibling()) {
+			// make sure the "root" Element isn't already present
+			// is it required to be an Element?
+			if ((child.getNodeType() == Node.ELEMENT_NODE) && child.getNodeName().equalsIgnoreCase(rootName)) {
+				// if the node is missing either the start or end tag, don't
+				// count it as present
+				if ((child instanceof IDOMNode) && ((((IDOMNode) child).getStartStructuredDocumentRegion() == null) || (((IDOMNode) child).getEndStructuredDocumentRegion() == null))) {
+					continue;
+				}
+				if (Debug.displayInfo) {
+					System.out.println(rootName + " already present!"); //$NON-NLS-1$
+				}
+				setErrorMessage(NLS.bind(XMLUIMessages.The_document_element__, (new Object[]{rootName})));
+				return new ArrayList(0);
+			}
+		}
+
+		list = new ArrayList(1);
+		ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document);
+		if (modelQuery != null) {
+			CMDocument cmdoc = modelQuery.getCorrespondingCMDocument(document);
+			if (cmdoc != null) {
+				if (rootName != null) {
+					CMElementDeclaration rootDecl = (CMElementDeclaration) cmdoc.getElements().getNamedItem(rootName);
+					if (rootDecl != null) {
+						list.add(rootDecl);
+					}
+					else {
+						// supply the given document name anyway, even if it
+						// is an error
+						list.add(new SimpleCMElementDeclaration(rootName));
+
+						String location = "" + (docType.getPublicId() != null ? docType.getPublicId() + "/" : "") + (docType.getSystemId() != null ? docType.getSystemId() : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+						if (location.length() > 0) {
+							setErrorMessage(NLS.bind(
+									XMLUIMessages.No_definition_for_in,
+									(new Object[]{rootName, location})));
+						}
+						else {
+							setErrorMessage(NLS.bind(
+									XMLUIMessages.No_definition_for,
+									(new Object[]{rootName})));
+						}
+					}
+				}
+			}
+			else {
+				String location = "" + (docType.getPublicId() != null ? docType.getPublicId() + "/" : "") + (docType.getSystemId() != null ? docType.getSystemId() : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+				if (location.length() > 0) {
+					setErrorMessage(NLS.bind(
+							XMLUIMessages.No_content_model_for,
+							(new Object[]{location})));
+				}
+				else {
+					setErrorMessage(XMLUIMessages.No_content_model_found_UI_);
+				}
+			}
+		}
+
+		return list;
+	}
+	
+	/**
+	 * This method determines if any of the attributes in the proposed XMLNode
+	 * node, are possible values of attributes from possible Elements at this
+	 * point in the document according to the Content Model.
+	 * 
+	 * @param node
+	 *            the element with attributes that you would like to test if
+	 *            are possible for possible Elements at this point
+	 * @param cmnode
+	 *            possible element at this point in the document (depending on
+	 *            what 'node' is) true if any attributes of 'node' match any
+	 *            possible attributes from 'cmnodes' list.
+	 */
+	private boolean attributeInList(IDOMNode node, Node parent, CMNode cmnode) {
+		if ((node == null) || (parent == null) || (cmnode == null)) {
+			return false;
+		}
+		String elementMatchString = node.getNodeName();
+		String cmnodeName = getRequiredName(parent, cmnode);// cmnode.getNodeName();
+		if (node instanceof Element) {
+			NamedNodeMap map = ((Element) node).getAttributes();
+			String attrMatchString = ""; //$NON-NLS-1$
+			// iterate attribute possibilities for partially started node
+			for (int i = 0; (map != null) && (i < map.getLength()); i++) {
+				attrMatchString = map.item(i).getNodeName();
+				// filter on whatever user typed for element name already
+				if (beginsWith(cmnodeName, elementMatchString)) {
+					if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION) {
+						CMNamedNodeMapImpl attributes = new CMNamedNodeMapImpl(((CMElementDeclaration) cmnode).getAttributes());
+						this.addModelQueryAttributeDeclarations(
+								node,((CMElementDeclaration) cmnode),attributes);
+	
+						// iterate possible attributes from a cmnode in
+						// proposal list
+						for (int k = 0; (attributes != null) && (k < attributes.getLength()); k++) {
+							// check if name matches
+							if (attributes.item(k).getNodeName().equals(attrMatchString)) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		}
+		return false;
+	}
+	
+	private Properties mapToProperties(CMNamedNodeMap map) {
+		Properties p = new Properties();
+		for (int i = 0; i < map.getLength(); i++) {
+			CMEntityDeclaration decl = (CMEntityDeclaration) map.item(i);
+			p.put(decl.getName(), decl.getValue());
+		}
+		return p;
+	}
+	
+	/**
+	 * <p>Adds model query attribute declaration proposals</p>
+	 * 
+	 * @param node
+	 * @param elementDecl
+	 * @param allAttributes
+	 */
+	private void addModelQueryAttributeDeclarations(IDOMNode node,
+			CMElementDeclaration elementDecl, CMNamedNodeMapImpl allAttributes) {
+		
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+			nodes = filterAvailableModelQueryCMNodes(nodes);
+			for (int k = 0; k < nodes.size(); k++) {
+				CMNode cmnode = (CMNode) nodes.get(k);
+				if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+					allAttributes.put(cmnode);
+				}
+			}
+		}
+	}
+	
+	/**
+	 * returns a list of CMNodes that are available within this parent context
+	 * Given the grammar shown below and a snippet of XML code (where the '|'
+	 * indicated the cursor position)
+	 * the list would return all of the element declarations that are
+	 * potential child elements of Foo.
+	 *
+	 * grammar : Foo -> (A, B, C)
+	 * snippet : <Foo><A>|
+	 * result : {A, B, C}
+	 * 
+	 * TODO cs... do we need to pass in the 'kindOfAction'? Seems to me we
+	 * could assume it's always an insert.
+	 *
+	 * @param parent
+	 * @param childPosition
+	 * @param kindOfAction
+	 * @return
+	 */
+	private List getAvailableChildElementDeclarations(Element parent, int childPosition, int kindOfAction) {
+		List modelQueryActions = getAvailableModelQueryActionsAtIndex(parent, childPosition, ModelQuery.VALIDITY_NONE);
+		Iterator iterator = modelQueryActions.iterator();
+		List cmnodes = new Vector();
+		while (iterator.hasNext()) {
+			ModelQueryAction action = (ModelQueryAction) iterator.next();
+			if ((childPosition < 0) || (((action.getStartIndex() <= childPosition) && (childPosition <= action.getEndIndex())) && (action.getKind() == kindOfAction))) {
+				CMNode actionCMNode = action.getCMNode();
+				if ((actionCMNode != null) && !cmnodes.contains(actionCMNode)) {
+					cmnodes.add(actionCMNode);
+				}
+			}
+		}
+		return cmnodes;
+	}
+	
+	/**
+	 * returns a list of CMNodes that can be validly inserted at this
+	 * childPosition
+	 * Given the grammar shown below and a snippet of XML code (where the '|'
+	 * indicated the cursor position)
+	 * the list would return only the element declarations can be inserted
+	 * while maintaing validity of the content.
+	 *
+	 * grammar : Foo -> (A, B, C)
+	 * snippet : <Foo><A>|
+	 * result : {B}
+	 *    
+	 * @param parent
+	 * @param childPosition
+	 * @param kindOfAction
+	 * @return
+	 */
+	private List getValidChildElementDeclarations(Element parent, int childPosition, int kindOfAction) {
+		List modelQueryActions = getAvailableModelQueryActionsAtIndex(parent, childPosition, ModelQuery.VALIDITY_STRICT);
+		Iterator iterator = modelQueryActions.iterator();
+		List cmnodes = new Vector();
+		while (iterator.hasNext()) {
+			ModelQueryAction action = (ModelQueryAction) iterator.next();
+			if ((childPosition < 0) || (((action.getStartIndex() <= childPosition) && (childPosition <= action.getEndIndex())) && (action.getKind() == kindOfAction))) {
+				CMNode actionCMNode = action.getCMNode();
+				if ((actionCMNode != null) && !cmnodes.contains(actionCMNode)) {
+					cmnodes.add(actionCMNode);
+				}
+			}
+		}
+		return cmnodes;
+	}
+	
+	/**
+	 * returns a list of ModelQueryActions
+	 * 
+	 * @param parent
+	 * @param index
+	 * @param validityChecking
+	 * @return
+	 */
+	private List getAvailableModelQueryActionsAtIndex(Element parent, int index, int validityChecking) {
+		List list = new ArrayList();
+		CMElementDeclaration parentDecl = getCMElementDeclaration(parent);
+		if (parentDecl != null) {
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(parent.getOwnerDocument());
+			// taken from ActionManagers
+			// int editMode = modelQuery.getEditMode();
+			int editMode = ModelQuery.EDIT_MODE_UNCONSTRAINED;
+			int ic = (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) ? ModelQuery.INCLUDE_CHILD_NODES | ModelQuery.INCLUDE_SEQUENCE_GROUPS : ModelQuery.INCLUDE_CHILD_NODES;
+			modelQuery.getInsertActions(parent, parentDecl, index, ic, validityChecking, list);
+		}
+		
+		list = filterAvailableModelQueryActions(list);
+		return list;
+	}
+	
+	/**
+	 * <p>Filters out any model query actions that are not valid for this
+	 * implementation of the model query computer based on the {@link CMNode}
+	 * of the action.</p>
+	 * 
+	 * @param modelQueryActions
+	 * @return the filtered list of {@link ModelQueryAction}s
+	 */
+	private List filterAvailableModelQueryActions(List modelQueryActions) {
+		List filtered = new ArrayList(modelQueryActions.size());
+	
+		Iterator iterator = modelQueryActions.iterator();
+		while (iterator.hasNext()) {
+			ModelQueryAction action = (ModelQueryAction) iterator.next();
+			if(validModelQueryNode(action.getCMNode())) {
+				filtered.add(action);
+			}
+		}
+		
+		return filtered;
+	}
+	
+	/**
+	 * <p>Filters out any model query {@link CMNode}s that are not valid for this
+	 * implementation of the model query computer</p>
+	 * 
+	 * @param modelQueryNodes
+	 * @return the filtered list of {@link CMNode}s
+	 */
+	private List filterAvailableModelQueryCMNodes(List modelQueryNodes) {
+		List filtered = new ArrayList(modelQueryNodes.size());
+	
+		Iterator iterator = modelQueryNodes.iterator();
+		while (iterator.hasNext()) {
+			CMNode node = (CMNode) iterator.next();
+			if(validModelQueryNode(node)) {
+				filtered.add(node);
+			}
+		}
+		
+		return filtered;
+	}
+	
+	/**
+	 * <p>Adds a generic doc type proposal</p>
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	private void addDocTypeProposal(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		// if a DocumentElement exists, use that for the root Element name
+		String rootname = "unspecified"; //$NON-NLS-1$
+		if (contentAssistRequest.getNode().getOwnerDocument().getDocumentElement() != null) {
+			rootname = contentAssistRequest.getNode().getOwnerDocument().getDocumentElement().getNodeName();
+		}
+
+		String proposedText = "<!DOCTYPE " + rootname + " PUBLIC \"//UNKNOWN/\" \"unknown.dtd\">"; //$NON-NLS-1$ //$NON-NLS-2$
+		ICompletionProposal proposal = new CustomCompletionProposal(
+				proposedText, contentAssistRequest.getReplacementBeginPosition(),
+				contentAssistRequest.getReplacementLength(), 10,
+				XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DOCTYPE),
+				"<!DOCTYPE ... >", //$NON-NLS-1$
+				null, null, XMLRelevanceConstants.R_DOCTYPE);
+		// TODO provide special documentation on doc type
+		contentAssistRequest.addProposal(proposal);
+	}
+	
+	public static CMElementDeclaration getCMElementDeclaration(Node node) {
+		CMElementDeclaration result = null;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+			if (modelQuery != null) {
+				result = modelQuery.getCMElementDeclaration((Element) node);
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * Retrieves cmnode's documentation to display in the completion
+	 * proposal's additional info. If no documentation exists for cmnode, try
+	 * displaying parentOrOwner's documentation
+	 * 
+	 * String any documentation information to display for cmnode.
+	 * <code>null</code> if there is nothing to display.
+	 */
+	public static String getAdditionalInfo(CMNode parentOrOwner, CMNode cmnode) {
+		String addlInfo = null;
+
+		if (cmnode == null) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return null;
+		}
+
+		addlInfo = infoProvider.getInfo(cmnode);
+		if ((addlInfo == null) && (parentOrOwner != null)) {
+			addlInfo = infoProvider.getInfo(parentOrOwner);
+		}
+		return addlInfo;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformation.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformation.java
new file mode 100644
index 0000000..66e514a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformation.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationExtension;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.ui.internal.util.Assert;
+
+
+/**
+ * Implementation of IContextInformation. Adds knowledge about the information
+ * display string such as required attributes for this context.
+ * 
+ * @author pavery
+ */
+public class AttributeContextInformation implements IContextInformation, IContextInformationExtension {
+	private HashMap fAttr2RangeMap;
+	/** The name of the context */
+	private String fContextDisplayString;
+	/** The image to be displayed */
+	private Image fImage;
+	/** The information to be displayed */
+	private String fInformationDisplayString;
+	private int fPosition = -1;
+
+	/**
+	 * Creates a new context information with an image.
+	 * 
+	 * @param image
+	 *            the image to display when presenting the context information
+	 * @param contextDisplayString
+	 *            the string to be used when presenting the context
+	 * @param informationDisplayString
+	 *            the string to be displayed when presenting the context
+	 *            information, may not be <code>null</code>
+	 */
+	public AttributeContextInformation(Image image, String contextDisplayString, String informationDisplayString, HashMap attr2RangeMap) {
+		Assert.isNotNull(informationDisplayString, "illegal argument: informationDisplayString can not be null"); //$NON-NLS-1$
+
+		fImage = image;
+		fContextDisplayString = contextDisplayString;
+		fInformationDisplayString = informationDisplayString;
+		fAttr2RangeMap = attr2RangeMap;
+	}
+
+	/**
+	 * Creates a new context information without an image.
+	 * 
+	 * @param contextDisplayString
+	 *            the string to be used when presenting the context
+	 * @param informationDisplayString
+	 *            the string to be displayed when presenting the context
+	 *            information
+	 */
+	public AttributeContextInformation(String contextDisplayString, String informationDisplayString, HashMap attr2RangeMap) {
+		this(null, contextDisplayString, informationDisplayString, attr2RangeMap);
+	}
+
+	/**
+	 * Maps (String -> Position). The attribute name to the Text position.
+	 * 
+	 * 
+	 */
+	public HashMap getAttr2RangeMap() {
+		return fAttr2RangeMap;
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.IContextInformation#getContextDisplayString()
+	 */
+	public String getContextDisplayString() {
+		if (fContextDisplayString != null) {
+			return fContextDisplayString;
+		}
+		return fInformationDisplayString;
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.IContextInformationExtension#getContextInformationPosition()
+	 */
+	public int getContextInformationPosition() {
+		return fPosition;
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.IContextInformation#getImage()
+	 */
+	public Image getImage() {
+		return fImage;
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.IContextInformation#getInformationDisplayString()
+	 */
+	public String getInformationDisplayString() {
+		return fInformationDisplayString;
+	}
+
+	public void setContextInformationPosition(int position) {
+		fPosition = position;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformationPresenter.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformationPresenter.java
new file mode 100644
index 0000000..9871c79
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformationPresenter.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContextInformationValidator;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+
+
+/**
+ * Responsible for the presentation of the context info popup. This includes
+ * text style, and when the window should close.
+ * 
+ * @author pavery
+ */
+public class AttributeContextInformationPresenter extends ContextInformationValidator implements IContextInformationPresenter {
+
+	private IContextInformation fInfo = null;
+	private ContextInfoModelUtil fModelUtil = null;
+
+	public AttributeContextInformationPresenter() {
+		super();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.contentassist.ContextInformationValidator#install(org.eclipse.jface.text.contentassist.IContextInformation, org.eclipse.jface.text.ITextViewer, int)
+	 */
+	public void install(IContextInformation info, ITextViewer viewer, int documentPosition) {
+		super.install(info, viewer, documentPosition);
+		this.fInfo = info;
+		this.fModelUtil = new ContextInfoModelUtil((IStructuredDocument) viewer.getDocument());
+	}
+
+	/**
+	 * @see org.eclipse.jface.text.contentassist.IContextInformationPresenter#updatePresentation(int,
+	 *      org.eclipse.jface.text.TextPresentation)
+	 */
+	public boolean updatePresentation(int documentPosition, TextPresentation presentation) {
+		presentation.clear();
+
+		if (!(fInfo instanceof AttributeContextInformation)) {
+			return false;
+		}
+
+		// iterate existing attributes from current node
+		IDOMNode xmlNode = fModelUtil.getXMLNode(documentPosition);
+		if (xmlNode == null)
+			return false;
+		
+		IStructuredDocumentRegion sdRegion = xmlNode.getFirstStructuredDocumentRegion();
+		ITextRegionList regions = sdRegion.getRegions();
+		ITextRegion r = null;
+		String attrName = ""; //$NON-NLS-1$
+		Object temp = null;
+		Position p = null;
+		HashMap map = ((AttributeContextInformation) fInfo).getAttr2RangeMap();
+
+		// so we can add ranges in order
+		StyleRange[] sorted = new StyleRange[fInfo.getInformationDisplayString().length()];
+		for (int i = 0; i < regions.size(); i++) {
+			r = regions.get(i);
+			if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+				attrName = sdRegion.getText(r);
+				temp = map.get(attrName);
+				if (temp != null) {
+					p = (Position) temp;
+					sorted[p.offset] = new StyleRange(p.offset, p.length, null, null, SWT.BOLD);
+				}
+			}
+		}
+		// style ranges need to be added in order
+		StyleRange sr = null;
+		for (int i = 0; i < sorted.length; i++) {
+			sr = sorted[i];
+			if (sr != null) {
+				presentation.addStyleRange(sr);
+			}
+		}
+		return true;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformationProvider.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformationProvider.java
new file mode 100644
index 0000000..f18d7c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AttributeContextInformationProvider.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.contentassist.ContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+/**
+ * Calculates attribute context information based on a StructuedDocument and
+ * document position.
+ * 
+ * @author pavery
+ */
+public class AttributeContextInformationProvider {
+	private final IContextInformation[] EMPTY_CONTEXT_INFO = new IContextInformation[0];
+	private Comparator fComparator;
+
+	private IStructuredDocument fDocument = null;
+	private ContextInfoModelUtil fModelUtil = null;
+
+	public AttributeContextInformationProvider(IStructuredDocument doc, AttributeContextInformationPresenter presenter) {
+		fDocument = doc;
+		fModelUtil = new ContextInfoModelUtil(fDocument);
+	}
+
+	/**
+	 * @param sdRegion
+	 * 
+	 */
+	private boolean canProposeInfo(IStructuredDocumentRegion sdRegion) {
+		if ((sdRegion != null) && isEndTag(sdRegion)) {
+			return false;
+		}
+		else {
+			return true;
+		}
+	}
+
+	public IContextInformation[] getAttributeInformation(int offset) {
+		/*
+		 * need to take care of special cases w/ ambiguous regions <tag>|
+		 * </tag> also end tags..
+		 */
+		IContextInformation[] results = EMPTY_CONTEXT_INFO;
+
+		IStructuredDocumentRegion sdRegion = fModelUtil.getDocument().getRegionAtCharacterOffset(offset);
+		if (!canProposeInfo(sdRegion)) {
+			return EMPTY_CONTEXT_INFO;
+		}
+
+		IDOMNode node = fModelUtil.getXMLNode(offset);
+		if (node != null) {
+			switch (node.getNodeType()) {
+				case Node.ELEMENT_NODE :
+					results = getInfoForElement(node);
+					break;
+				// future...
+				// case Node.TEXT_NODE :
+				// results = getInfoForText(node);
+				// break;
+			}
+		}
+		return results;
+	}
+
+	/**
+	 * Returns a comparator that compares CMAttributeDeclaration names.
+	 * 
+	 * the comparator
+	 */
+	private Comparator getCMAttributeComparator() {
+		if (fComparator == null) {
+			fComparator = new Comparator() {
+				public int compare(Object o1, Object o2) {
+					return ((CMAttributeDeclaration) o1).getAttrName().compareTo(((CMAttributeDeclaration) o2).getAttrName());
+				}
+			};
+		}
+		return fComparator;
+	}
+
+	/**
+	 * @param node
+	 * 
+	 */
+	private IContextInformation[] getInfoForElement(IDOMNode node) {
+		IContextInformation[] results = EMPTY_CONTEXT_INFO;
+		CMElementDeclaration decl = fModelUtil.getModelQuery().getCMElementDeclaration((Element) node);
+		if (decl != null) {
+			CMNamedNodeMap attributes = decl.getAttributes();
+
+			CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributes);
+			List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, decl, ModelQuery.INCLUDE_ATTRIBUTES);
+			for (int k = 0; k < nodes.size(); k++) {
+				CMNode cmnode = (CMNode) nodes.get(k);
+				if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+					allAttributes.put(cmnode);
+				}
+			}
+			attributes = allAttributes;
+			
+			String attrContextString = node.getNodeName();
+			StringBuffer attrInfo = new StringBuffer(" "); //$NON-NLS-1$
+			String name = ""; //$NON-NLS-1$
+			HashMap attrPosMap = new HashMap();
+			int pos = 0;
+			int length = 0;
+			int numPerLine = 8;
+
+			CMAttributeDeclaration[] sortedAttrs = getSortedAttributes(attributes);
+
+			for (int i = 0; i < sortedAttrs.length; i++) {
+				name = sortedAttrs[i].getAttrName();
+				length = name.length();
+				pos = attrInfo.length();
+
+				attrInfo.append(name);
+
+				if (sortedAttrs[i].getUsage() == CMAttributeDeclaration.REQUIRED) {
+					attrInfo.append("*"); //$NON-NLS-1$
+					length++;
+				}
+				if (i < attributes.getLength() - 1) {
+					attrInfo.append(" "); //$NON-NLS-1$
+					if ((i != 0) && (i % numPerLine == 0)) {
+						attrInfo.append("\n "); //$NON-NLS-1$
+					}
+				}
+				attrPosMap.put(name, new Position(pos, length));
+			}
+			if (!attrInfo.toString().trim().equals("")) {
+				return new IContextInformation[]{new AttributeContextInformation(attrContextString, attrInfo.toString(), attrPosMap)};
+			}
+		}
+		return results;
+	}
+
+	/**
+	 * @param node
+	 * 
+	 */
+	IContextInformation[] getInfoForText(IDOMNode node) {
+		Node parent = node.getParentNode();
+		String contextString = node.getNodeName();
+		StringBuffer info = new StringBuffer(" "); //$NON-NLS-1$
+		if ((parent != null) && (parent.getNodeType() == Node.ELEMENT_NODE)) {
+			CMElementDeclaration decl = fModelUtil.getModelQuery().getCMElementDeclaration((Element) parent);
+			CMContent content = decl.getContent();
+			if (content instanceof CMGroup) {
+				CMGroup cmGroup = (CMGroup) content;
+				CMNodeList children = cmGroup.getChildNodes();
+				CMNode cmNode = null;
+				for (int i = 0; i < children.getLength(); i++) {
+					cmNode = children.item(i);
+					contextString = cmNode.getNodeName();
+					if (contextString != null) {
+						info.append("<" + cmNode.getNodeName() + ">"); //$NON-NLS-1$ //$NON-NLS-2$
+						if (i < children.getLength() - 1) {
+							info.append(" "); //$NON-NLS-1$
+						}
+					}
+				}
+			}
+		}
+		if (!info.toString().trim().equals("")) {
+			return new IContextInformation[]{new ContextInformation(contextString, info.toString())};
+		}
+		else {
+			return EMPTY_CONTEXT_INFO;
+		}
+	}
+
+	/**
+	 * Returns sorted array of CMAttributeDeclarations.
+	 * 
+	 * @param attributes
+	 * 
+	 */
+	private CMAttributeDeclaration[] getSortedAttributes(CMNamedNodeMap attributes) {
+		List sorted = new ArrayList();
+		for (int i = 0; i < attributes.getLength(); i++) {
+			sorted.add(attributes.item(i));
+		}
+		Collections.sort(sorted, getCMAttributeComparator());
+		return (CMAttributeDeclaration[]) sorted.toArray(new CMAttributeDeclaration[sorted.size()]);
+	}
+
+	/**
+	 * @param sdRegion
+	 * 
+	 */
+	private boolean isEndTag(IStructuredDocumentRegion sdRegion) {
+		ITextRegionList regions = sdRegion.getRegions();
+		return regions.get(0).getType() == DOMRegionContext.XML_END_TAG_OPEN;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ContentAssistRequest.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ContentAssistRequest.java
new file mode 100644
index 0000000..6a1d3af
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ContentAssistRequest.java
@@ -0,0 +1,260 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.w3c.dom.Node;
+
+
+public class ContentAssistRequest {
+	protected IStructuredDocumentRegion documentRegion = null;
+	protected List macros = new ArrayList();
+	protected String matchString;
+	protected Node node = null;
+	protected Node parent = null;
+	protected List proposals = new ArrayList();
+	protected ITextRegion region = null;
+	protected int replacementBeginPosition;
+	protected int replacementLength;
+
+	// private Boolean separate = null; // (pa) not used
+	// private Boolean sort = null; // (pa) not used
+	/**
+	 * XMLContentAssistRequest constructor comment.
+	 */
+	public ContentAssistRequest(Node node, Node parent, IStructuredDocumentRegion documentRegion, ITextRegion completionRegion, int begin, int length, String filter) {
+		super();
+		setNode(node);
+		setParent(parent);
+		setDocumentRegion(documentRegion);
+		setRegion(completionRegion);
+		setMatchString(filter);
+		setReplacementBeginPosition(begin);
+		setReplacementLength(length);
+	}
+
+	public void addMacro(ICompletionProposal newProposal) {
+		macros.add(newProposal);
+	}
+
+	public void addProposal(ICompletionProposal newProposal) {
+		proposals.add(newProposal);
+	}
+
+	public ICompletionProposal[] getCompletionProposals() {
+		ICompletionProposal results[] = null;
+		if ((getProposals().size() > 0) || (getMacros().size() > 0)) {
+			List allProposals = new ArrayList();
+			if (!shouldSeparate()) {
+				allProposals.addAll(getProposals());
+				// should be empty, as all macros should have gone into the
+				// proposal list
+				allProposals.addAll(getMacros());
+				allProposals = sortProposals(allProposals);
+			}
+			else {
+				allProposals.addAll(sortProposals(getProposals()));
+				allProposals.addAll(sortProposals(getMacros()));
+			}
+
+			results = new ICompletionProposal[allProposals.size()];
+			for (int i = 0; i < allProposals.size(); i++) {
+				results[i] = (ICompletionProposal) allProposals.get(i);
+			}
+		}
+		return results;
+	}
+
+
+	public IStructuredDocumentRegion getDocumentRegion() {
+		return documentRegion;
+	}
+
+	/**
+	 * 
+	 * @return java.util.List
+	 */
+	public java.util.List getMacros() {
+		return macros;
+	}
+
+	/**
+	 * 
+	 * @return java.lang.String
+	 */
+	public java.lang.String getMatchString() {
+		return matchString;
+	}
+
+	/**
+	 * 
+	 * @return org.w3c.dom.Node
+	 */
+	public org.w3c.dom.Node getNode() {
+		return node;
+	}
+
+	/**
+	 * 
+	 * @return org.w3c.dom.Node
+	 */
+	public org.w3c.dom.Node getParent() {
+		return parent;
+	}
+
+	/**
+	 * 
+	 * @return java.util.List
+	 */
+	public java.util.List getProposals() {
+		return proposals;
+	}
+
+	public ITextRegion getRegion() {
+		return region;
+	}
+
+	/**
+	 * 
+	 * @return int
+	 */
+	public int getReplacementBeginPosition() {
+		return replacementBeginPosition;
+	}
+
+	/**
+	 * @return int
+	 */
+	public int getReplacementLength() {
+		return replacementLength;
+	}
+
+	public int getStartOffset() {
+		if ((getDocumentRegion() != null) && (getRegion() != null)) {
+			return ((ITextRegionCollection) getDocumentRegion()).getStartOffset(getRegion());
+		}
+		return -1;
+	}
+
+	public String getText() {
+		if ((getDocumentRegion() != null) && (getRegion() != null)) {
+			return ((ITextRegionCollection) getDocumentRegion()).getText(getRegion());
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	public int getTextEndOffset() {
+		if ((getDocumentRegion() != null) && (getRegion() != null)) {
+			return ((ITextRegionCollection) getDocumentRegion()).getTextEndOffset(getRegion());
+		}
+		return -1;
+	}
+
+	/**
+	 * @param region
+	 */
+	public void setDocumentRegion(IStructuredDocumentRegion region) {
+		documentRegion = region;
+	}
+
+	/**
+	 * 
+	 * @param newMatchString
+	 *            java.lang.String
+	 */
+	public void setMatchString(java.lang.String newMatchString) {
+		matchString = newMatchString;
+	}
+
+	/**
+	 * 
+	 * @param newNode
+	 *            org.w3c.dom.Node
+	 */
+	public void setNode(org.w3c.dom.Node newNode) {
+		node = newNode;
+	}
+
+	/**
+	 * 
+	 * @param newParent
+	 *            org.w3c.dom.Node
+	 */
+	public void setParent(org.w3c.dom.Node newParent) {
+		parent = newParent;
+	}
+
+	/**
+	 * 
+	 * @param newRegion
+	 */
+	public void setRegion(ITextRegion newRegion) {
+		region = newRegion;
+	}
+
+	/**
+	 * 
+	 * @param newReplacementBeginPosition
+	 *            int
+	 */
+	public void setReplacementBeginPosition(int newReplacementBeginPosition) {
+		replacementBeginPosition = newReplacementBeginPosition;
+	}
+
+
+	public void setReplacementLength(int newReplacementLength) {
+		replacementLength = newReplacementLength;
+	}
+
+	public boolean shouldSeparate() {
+		/*
+		 * if (separate == null) { PreferenceManager manager =
+		 * getPreferenceManager(); if(manager == null) { separate =
+		 * Boolean.FALSE; } else { Element caSettings =
+		 * manager.getElement(PreferenceNames.CONTENT_ASSIST); separate = new
+		 * Boolean(caSettings.getAttribute(PreferenceNames.SEPARATE).equals(PreferenceNames.TRUE)); } }
+		 * return separate.booleanValue();
+		 */
+		return false;
+	}
+
+	protected List sortProposals(List proposalsIn) {
+		Collections.sort(proposalsIn, new ProposalComparator());
+		return proposalsIn;
+
+	}
+
+	/**
+	 * 
+	 * @return java.lang.String
+	 */
+	public java.lang.String toString() {
+		return "Node: " + getNode() //$NON-NLS-1$
+					+ "\nParent: " + getParent() //$NON-NLS-1$
+					+ "\nStructuredDocumentRegion: " + StringUtils.escape(getDocumentRegion().toString()) //$NON-NLS-1$
+					+ "\nRegion: " + getRegion() //$NON-NLS-1$
+					+ "\nMatch string: '" + StringUtils.escape(getMatchString()) + "'" //$NON-NLS-2$//$NON-NLS-1$
+					+ "\nOffsets: [" + getReplacementBeginPosition() + "-" + (getReplacementBeginPosition() + getReplacementLength()) + "]\n"; //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ContextInfoModelUtil.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ContextInfoModelUtil.java
new file mode 100644
index 0000000..a0c1c81
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ContextInfoModelUtil.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+
+
+/**
+ * @author pavery
+ */
+public class ContextInfoModelUtil {
+	IStructuredDocument fDocument = null;
+
+	ContextInfoModelUtil(IStructuredDocument doc) {
+		fDocument = doc;
+	}
+
+	public IStructuredDocument getDocument() {
+		return fDocument;
+	}
+
+	public ModelQuery getModelQuery() {
+		ModelQuery mq = null;
+
+		IStructuredModel xmlModel = null;
+		try {
+			xmlModel = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			mq = ModelQueryUtil.getModelQuery(xmlModel);
+		}
+		finally {
+			if (xmlModel != null) {
+				xmlModel.releaseFromRead();
+			}
+		}
+		return mq;
+	}
+
+	public IDOMNode getXMLNode(int offset) {
+		IStructuredModel xmlModel = null;
+		IDOMNode xmlNode = null;
+		try {
+			xmlModel = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			if (xmlModel != null) {
+				xmlNode = (IDOMNode) xmlModel.getIndexedRegion(offset);
+			}
+		}
+		finally {
+			if (xmlModel != null)
+				xmlModel.releaseFromRead();
+		}
+		return xmlNode;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/CustomTemplateProposal.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/CustomTemplateProposal.java
new file mode 100644
index 0000000..f19dd90
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/CustomTemplateProposal.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateProposal;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.contentassist.IRelevanceCompletionProposal;
+
+/**
+ * Purpose of this class is to make the additional proposal info into content
+ * fit for an HTML viewer (by escaping characters)
+ */
+class CustomTemplateProposal extends TemplateProposal implements IRelevanceCompletionProposal {
+	// copies of this class exist in:
+	// org.eclipse.jst.jsp.ui.internal.contentassist
+	// org.eclipse.wst.html.ui.internal.contentassist
+	// org.eclipse.wst.xml.ui.internal.contentassist
+
+	public CustomTemplateProposal(Template template, TemplateContext context, IRegion region, Image image, int relevance) {
+		super(template, context, region, image, relevance);
+	}
+
+	public String getAdditionalProposalInfo() {
+		String additionalInfo = super.getAdditionalProposalInfo();
+		return StringUtils.convertToHTMLContent(additionalInfo);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/DefaultXMLCompletionProposalComputer.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/DefaultXMLCompletionProposalComputer.java
new file mode 100644
index 0000000..5b4024f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/DefaultXMLCompletionProposalComputer.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.Properties;
+import java.util.Vector;
+
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+
+/**
+ * <p>Default implementation of the {@link AbstractXMLCompletionProposalComputer}, defaults are to do nothing</p>
+ */
+public class DefaultXMLCompletionProposalComputer extends
+		AbstractXMLCompletionProposalComputer {
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer#sessionEnded()
+	 */
+	public void sessionEnded() {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer#sessionStarted()
+	 */
+	public void sessionStarted() {
+		//default behavior is to do nothing
+	}
+	
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addAttributeNameProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addAttributeNameProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addAttributeValueProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addAttributeValueProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addCommentProposal(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addCommentProposal(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addDocTypeProposal(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addDocTypeProposal(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addEmptyDocumentProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEmptyDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addEndTagNameProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEndTagNameProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addEndTagProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEndTagProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addEntityProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion, org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEntityProposals(
+			ContentAssistRequest contentAssistRequest,
+			ITextRegion completionRegion, IDOMNode treeNode,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addEntityProposals(java.util.Vector, java.util.Properties, java.lang.String, int, org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion, org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEntityProposals(Vector proposals, Properties map,
+			String key, int nodeOffset, IStructuredDocumentRegion sdRegion,
+			ITextRegion completionRegion,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addPCDATAProposal(java.lang.String, org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addPCDATAProposal(String nodeName,
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addStartDocumentProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addStartDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addTagCloseProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addTagCloseProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addTagInsertionProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, int, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addTagInsertionProposals(
+			ContentAssistRequest contentAssistRequest, int childPosition,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+
+	/**
+	 * Default behavior is do to nothing.
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#addTagNameProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, int, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addTagNameProposals(
+			ContentAssistRequest contentAssistRequest, int childPosition,
+			CompletionProposalInvocationContext context) {
+		//default behavior is to do nothing
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NoRegionContentAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NoRegionContentAssistProcessor.java
new file mode 100644
index 0000000..c713a22
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NoRegionContentAssistProcessor.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+
+
+/**
+ * ContentAssistProcessor to handle special cases in content assist where the
+ * partitioner cannot determine a partition type at the current cursor
+ * position (usually at EOF).
+ * 
+ * @author pavery
+ * @deprecated This class is no longer used locally and will be removed in the future
+ */
+public class NoRegionContentAssistProcessor implements IContentAssistProcessor, IReleasable {
+
+	private static final boolean DEBUG = false;
+	protected char completionProposalAutoActivationCharacters[] = null;
+	protected char contextInformationAutoActivationCharacters[] = null;
+
+	private final ICompletionProposal[] EMPTY_PROPOSAL_SET = new ICompletionProposal[0];
+	protected String fErrorMessage = null;
+	private HashMap fNameToProcessorMap = null;
+	private HashMap fPartitionToProcessorMap = null;
+
+	public NoRegionContentAssistProcessor() {
+		super();
+	}
+
+	protected void addPartitionProcessor(String key, IContentAssistProcessor processor) {
+		addProcessor(getPartitionToProcessorMap(), key, processor);
+	}
+
+	protected void addNameProcessor(String key, IContentAssistProcessor processor) {
+		addProcessor(getNameToProcessorMap(), key, processor);
+	}
+
+	protected IContentAssistProcessor getPartitionProcessor(String key) {
+		return (IContentAssistProcessor) getPartitionToProcessorMap().get(key);
+	}
+
+	/**
+	 * Ensures release if it's a duplicate partition type.
+	 * 
+	 * @param map
+	 * @param key
+	 * @param processor
+	 */
+	private void addProcessor(HashMap map, String key, IContentAssistProcessor processor) {
+		Object o = map.remove(key);
+		if (o != null) {
+			if (o instanceof IReleasable) {
+				((IReleasable) o).release();
+			}
+		}
+		map.put(key, processor);
+	}
+
+	/**
+	 * Figures out what the correct ICompletionProposalProcessor is and
+	 * computesCompletionProposals on that.
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
+		IContentAssistProcessor p = null;
+		ICompletionProposal[] results = EMPTY_PROPOSAL_SET;
+
+		p = guessContentAssistProcessor(viewer, documentOffset);
+		if (p != null) {
+			results = p.computeCompletionProposals(viewer, documentOffset);
+		}
+
+		return (results != null) ? results : EMPTY_PROPOSAL_SET;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
+		// get context info from processor that we end up using...
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return completionProposalAutoActivationCharacters;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters()
+	 */
+	public char[] getContextInformationAutoActivationCharacters() {
+		return contextInformationAutoActivationCharacters;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator()
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		// return the validator for the content assist processor that we
+		// used...
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getErrorMessage()
+	 */
+	public String getErrorMessage() {
+		return fErrorMessage;
+	}
+	
+	private HashMap getNameToProcessorMap() {
+		if (fNameToProcessorMap == null) {
+			fNameToProcessorMap = new HashMap();
+			initNameToProcessorMap();
+		}
+		return fNameToProcessorMap;
+	}
+	
+	private HashMap getPartitionToProcessorMap() {
+		if (fPartitionToProcessorMap == null) {
+			fPartitionToProcessorMap = new HashMap();
+			initPartitionToProcessorMap();
+		}
+		return fPartitionToProcessorMap;
+	}
+
+	/**
+	 * Gives you the document partition type (String) for the given
+	 * StructuredTextViewer and documentPosition.
+	 * 
+	 * @param viewer
+	 * @param documentPosition
+	 * @return String
+	 */
+	protected String getPartitionType(StructuredTextViewer viewer, int documentPosition) {
+		IDocument document = viewer.getDocument();
+		String partitionType = null;
+		ITypedRegion partition = null;
+		try {
+			partition = document.getPartition(documentPosition);
+			partitionType = partition.getType();
+		}
+		catch (BadLocationException e) {
+			partitionType = null;
+		}
+		return partitionType;
+	}
+
+	/**
+	 * Guesses a ContentAssistProcessor based on the TextViewer and
+	 * documentOffset.
+	 * 
+	 * @param viewer
+	 * @param documentOffset
+	 */
+	protected IContentAssistProcessor guessContentAssistProcessor(ITextViewer viewer, int documentOffset) {
+		// mapping logic here...
+		// look @ previous region
+		// look @ previous doc partition type
+		// look @ page language
+		IContentAssistProcessor p = null;
+		IStructuredDocumentRegion sdRegion = ContentAssistUtils.getStructuredDocumentRegion(viewer, documentOffset);
+		if (sdRegion != null) {
+			String currentRegionType = sdRegion.getType();
+			// System.out.println("current region type is >> " +
+			// currentRegionType);
+			if (currentRegionType == DOMRegionContext.UNDEFINED) {
+				IStructuredDocumentRegion sdPrev = sdRegion.getPrevious();
+				if (sdPrev != null) {
+					if (DEBUG) {
+						String prevRegionType = sdPrev.getType();
+						System.out.println("previous region type is >> " + prevRegionType); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+		// working w/ viewer & document partition
+		if ((p == null) && (viewer.getDocument().getLength() > 0)) {
+			String prevPartitionType = getPartitionType((StructuredTextViewer) viewer, documentOffset - 1);
+			// System.out.println("previous partition type is > " +
+			// prevPartitionType);
+			p = (IContentAssistProcessor) getPartitionToProcessorMap().get(prevPartitionType);
+		}
+		return p;
+	}
+
+	/**
+	 * Inits map for extra ContentAssistProcessors (useBean, get/setProperty)
+	 */
+	protected void initNameToProcessorMap() {
+		// nothing to do in this case
+	}
+
+	/**
+	 * Adds all relevent ContentAssistProcessors to the partition to processor
+	 * map (just XML here)
+	 */
+	protected void initPartitionToProcessorMap() {
+		XMLContentAssistProcessor xmlProcessor = new XMLContentAssistProcessor();
+		addProcessor(getPartitionToProcessorMap(), IXMLPartitions.XML_DEFAULT, xmlProcessor);
+	}
+
+	public void release() {
+		releasePartitionToProcessorMap();
+		releaseNameToProcessorMap();
+	}
+
+	protected void releaseMap(HashMap map) {
+		if ((map != null) && !map.isEmpty()) {
+			Iterator it = map.keySet().iterator();
+			Object key = null;
+			while (it.hasNext()) {
+				key = it.next();
+				if (map.get(key) instanceof IReleasable) {
+					((IReleasable) map.get(key)).release();
+				}
+			}
+			map.clear();
+			map = null;
+		}
+	}
+
+	protected void releaseNameToProcessorMap() {
+		releaseMap(fNameToProcessorMap);
+	}
+
+	protected void releasePartitionToProcessorMap() {
+		releaseMap(fPartitionToProcessorMap);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NonValidatingModelQueryAction.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NonValidatingModelQueryAction.java
new file mode 100644
index 0000000..24a397d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NonValidatingModelQueryAction.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public class NonValidatingModelQueryAction implements org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryAction {
+
+	protected CMNode cmnode = null;
+	protected int endIndex = 0;
+	protected int kind = INSERT;
+	protected int startIndex = 0;
+	protected Object userData = null;
+
+	/**
+	 * NonValidatingModelQueryAction constructor comment.
+	 */
+	protected NonValidatingModelQueryAction() {
+		super();
+	}
+
+	/**
+	 * NonValidatingModelQueryAction constructor comment.
+	 */
+	public NonValidatingModelQueryAction(CMNode newChild, int newKind, int newStart, int newEnd, Object newUserData) {
+		super();
+		cmnode = newChild;
+		kind = newKind;
+		startIndex = newStart;
+		endIndex = newEnd;
+		userData = newUserData;
+	}
+
+	/**
+	 * getCMNode method comment.
+	 */
+	public org.eclipse.wst.xml.core.internal.contentmodel.CMNode getCMNode() {
+		return cmnode;
+	}
+
+	/**
+	 * 
+	 * @return int
+	 */
+	public int getEndIndex() {
+		return endIndex;
+	}
+
+	/**
+	 * 
+	 * @return int
+	 */
+	public int getKind() {
+		return kind;
+	}
+
+	/**
+	 * getParent method comment.
+	 */
+	public org.w3c.dom.Node getParent() {
+		return null;
+	}
+
+	/**
+	 * 
+	 * @return int
+	 */
+	public int getStartIndex() {
+		return startIndex;
+	}
+
+	/**
+	 * getUserData method comment.
+	 */
+	public Object getUserData() {
+		return null;
+	}
+
+	/**
+	 * performAction method comment.
+	 */
+	public void performAction() {
+	}
+
+	/**
+	 * setCMNode method comment.
+	 */
+	protected void setCMNode(org.eclipse.wst.xml.core.internal.contentmodel.CMNode newNode) {
+		cmnode = newNode;
+	}
+
+	/**
+	 * 
+	 * @param newEndIndex
+	 *            int
+	 */
+	protected void setEndIndex(int newEndIndex) {
+		endIndex = newEndIndex;
+	}
+
+	/**
+	 * 
+	 * @param newKind
+	 *            int
+	 */
+	protected void setKind(int newKind) {
+		kind = newKind;
+	}
+
+	/**
+	 * 
+	 * @param newStartIndex
+	 *            int
+	 */
+	protected void setStartIndex(int newStartIndex) {
+		startIndex = newStartIndex;
+	}
+
+	/**
+	 * setUserData method comment.
+	 */
+	public void setUserData(Object object) {
+	}
+
+	/**
+	 * 
+	 * @return java.lang.String
+	 */
+	public String toString() {
+		String actionName = null;
+		switch (kind) {
+			case INSERT :
+				actionName = "INSERT";//$NON-NLS-1$
+				break;
+			case REMOVE :
+				actionName = "REMOVE";//$NON-NLS-1$
+				break;
+			case REPLACE :
+				actionName = "REPLACE";//$NON-NLS-1$
+				break;
+			default :
+				actionName = "UNKNOWN ACTION ";//$NON-NLS-1$
+		}
+		String nodeName = (cmnode != null) ? getCMNode().getNodeName() : "(unknown)";//$NON-NLS-1$
+		return actionName + "=" + nodeName + "(" + startIndex + "..." + endIndex + ")";//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ProposalComparator.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ProposalComparator.java
new file mode 100644
index 0000000..ee6e8e8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ProposalComparator.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+
+
+import java.util.Comparator;
+
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.wst.sse.ui.internal.contentassist.IRelevanceCompletionProposal;
+
+
+public class ProposalComparator implements Comparator {
+
+
+	public int compare(Object o1, Object o2) {
+		int relevance = 0;
+		if ((o1 instanceof IRelevanceCompletionProposal) && (o2 instanceof IRelevanceCompletionProposal)) {
+			// sort based on relevance
+			IRelevanceCompletionProposal cp1 = (IRelevanceCompletionProposal) o1;
+			IRelevanceCompletionProposal cp2 = (IRelevanceCompletionProposal) o2;
+
+			relevance = cp2.getRelevance() - cp1.getRelevance();
+
+			// if same relevance, secondary sort (lexigraphically)
+			if ((relevance == 0) && (o1 instanceof ICompletionProposal) && (o2 instanceof ICompletionProposal)) {
+				String displayString1 = ((ICompletionProposal) o1).getDisplayString();
+				String displayString2 = ((ICompletionProposal) o2).getDisplayString();
+				if ((displayString1 != null) && (displayString2 != null)) {
+					// relevance = displayString1.compareTo(displayString2);
+					// // this didn't mix caps w/ lowercase
+					relevance = com.ibm.icu.text.Collator.getInstance().compare(displayString1, displayString2);
+				}
+			}
+		}
+		// otherwise if it's not ISEDRelevanceCompletionProposal, don't sort
+		return relevance;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ReplaceNameTemplateContext.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ReplaceNameTemplateContext.java
new file mode 100644
index 0000000..fefb8a3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/ReplaceNameTemplateContext.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.templates.DocumentTemplateContext;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateVariable;
+
+/**
+ * Just like DocumentTemplateContext except if an insert offset is passed in,
+ * during evaluation, the "prefix" before the template will be checked to see
+ * if it matches the template name. If so, overwrite the template name.
+ * Otherwise, just insert the template at the insert offset location (by not
+ * overwriting the prefix text)
+ */
+public class ReplaceNameTemplateContext extends DocumentTemplateContext {
+	private int fInsertOffset = -1;
+
+	/**
+	 * Creates a document template context.
+	 * 
+	 * @param type
+	 *            the context type
+	 * @param document
+	 *            the document this context applies to
+	 * @param offset
+	 *            the offset of the document region
+	 * @param length
+	 *            the length of the document region
+	 */
+	public ReplaceNameTemplateContext(TemplateContextType type, IDocument document, int offset, int length) {
+		this(type, document, new Position(offset, length));
+	}
+
+	/**
+	 * Creates a document template context. The supplied <code>Position</code>
+	 * will be queried to compute the <code>getStart</code> and
+	 * <code>getEnd</code> methods, which will therefore answer updated
+	 * position data if it is registered with the document.
+	 * 
+	 * @param type
+	 *            the context type
+	 * @param document
+	 *            the document this context applies to
+	 * @param position
+	 *            the position describing the area of the document which forms
+	 *            the template context
+	 * @since 3.1
+	 */
+	public ReplaceNameTemplateContext(TemplateContextType type, IDocument document, Position position) {
+		super(type, document, position);
+	}
+
+	/**
+	 * Creates a document template context.
+	 * 
+	 * @param type
+	 *            the context type
+	 * @param document
+	 *            the document this context applies to
+	 * @param offset
+	 *            the offset of the document region
+	 * @param length
+	 *            the length of the document region
+	 * @param insertOffset
+	 *            the offset of the document region where insert was
+	 *            originally requested
+	 */
+	public ReplaceNameTemplateContext(TemplateContextType type, IDocument document, int offset, int length, int insertOffset) {
+		this(type, document, new Position(offset, length));
+		fInsertOffset = insertOffset;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.templates.TemplateContext#evaluate(org.eclipse.jface.text.templates.Template)
+	 */
+	public TemplateBuffer evaluate(Template template) throws BadLocationException, TemplateException {
+		TemplateBuffer buffer = super.evaluate(template);
+		if (buffer != null) {
+			if ((fInsertOffset > -1) && (fInsertOffset > getStart())) {
+				String prefix = getDocument().get(getStart(), fInsertOffset - getStart());
+				if (!template.getName().startsWith(prefix)) {
+					// generate a new buffer that actually contains the
+					// text that was going to be overwritten
+					int prefixSize = prefix.length();
+					TemplateVariable[] newTemplateVar = buffer.getVariables();
+					for (int i =0; i < newTemplateVar.length; i++ ){
+						int[] offsets = newTemplateVar[i].getOffsets();
+						for (int j=0; j<offsets.length ;j++){
+							offsets[j] += prefixSize;
+						}
+					}
+					buffer = new TemplateBuffer(prefix + buffer.getString(), newTemplateVar);
+				}
+			}
+		}
+		return buffer;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/SimpleCMElementDeclaration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/SimpleCMElementDeclaration.java
new file mode 100644
index 0000000..41a607a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/SimpleCMElementDeclaration.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+
+
+public class SimpleCMElementDeclaration implements org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration {
+
+	String fNodeName;
+
+	/**
+	 * SimpleCMELementDeclaration constructor comment.
+	 */
+	public SimpleCMElementDeclaration() {
+		super();
+	}
+
+	public SimpleCMElementDeclaration(String nodeName) {
+		super();
+		setNodeName(nodeName);
+	}
+
+	/**
+	 * getAttributes method
+	 * 
+	 * @return CMNamedNodeMap
+	 * 
+	 * Returns CMNamedNodeMap of AttributeDeclaration
+	 */
+	public org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap getAttributes() {
+		return null;
+	}
+
+	/**
+	 * getCMContent method
+	 * 
+	 * @return CMContent
+	 * 
+	 * Returns the root node of this element's content model. This can be an
+	 * CMElementDeclaration or a CMGroup
+	 */
+	public org.eclipse.wst.xml.core.internal.contentmodel.CMContent getContent() {
+		return null;
+	}
+
+	/**
+	 * getContentType method
+	 * 
+	 * @return int
+	 * 
+	 * Returns one of : ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA.
+	 */
+	public int getContentType() {
+		return 0;
+	}
+
+	/**
+	 * getDataType method
+	 * 
+	 * @return java.lang.String
+	 */
+	public org.eclipse.wst.xml.core.internal.contentmodel.CMDataType getDataType() {
+		return null;
+	}
+
+	/**
+	 * getElementName method
+	 * 
+	 * @return java.lang.String
+	 */
+	public String getElementName() {
+		return null;
+	}
+
+	/**
+	 * getLocalElements method
+	 * 
+	 * @return CMNamedNodeMap
+	 * 
+	 * Returns a list of locally defined elements.
+	 */
+	public org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap getLocalElements() {
+		return null;
+	}
+
+	/**
+	 * getMaxOccur method
+	 * 
+	 * @return int
+	 * 
+	 * If -1, it's UNBOUNDED.
+	 */
+	public int getMaxOccur() {
+		return 0;
+	}
+
+	/**
+	 * getMinOccur method
+	 * 
+	 * @return int
+	 * 
+	 * If 0, it's OPTIONAL. If 1, it's REQUIRED.
+	 */
+	public int getMinOccur() {
+		return 0;
+	}
+
+	/**
+	 * 
+	 * @return java.lang.String
+	 */
+	public java.lang.String getNodeName() {
+		return fNodeName;
+	}
+
+	/**
+	 * getNodeType method
+	 * 
+	 * @return int
+	 * 
+	 * Returns one of :
+	 * 
+	 */
+	public int getNodeType() {
+		return 0;
+	}
+
+	/**
+	 * getProperty method
+	 * 
+	 * @return java.lang.Object
+	 * 
+	 * Returns the object property desciped by the propertyName
+	 * 
+	 */
+	public Object getProperty(String propertyName) {
+		return null;
+	}
+
+	/**
+	 * 
+	 * @param newNodeName
+	 *            java.lang.String
+	 */
+	public void setNodeName(java.lang.String newNodeName) {
+		fNodeName = newNodeName;
+	}
+
+	/**
+	 * supports method
+	 * 
+	 * @return boolean
+	 * 
+	 * Returns true if the CMNode supports a specified property
+	 * 
+	 */
+	public boolean supports(String propertyName) {
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/SourceEditorImageHelper.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/SourceEditorImageHelper.java
new file mode 100644
index 0000000..fe16777
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/SourceEditorImageHelper.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+
+/**
+ * @deprecated use internal XMLEditorPluginImageHelper or external
+ *             SharedXMLEditorPluginImageHelper instead
+ */
+public class SourceEditorImageHelper {
+
+	public SourceEditorImageHelper() {
+		super();
+	}
+
+	public Image createImage(String resource) {
+		ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin(XMLUIPlugin.ID, resource);
+		Image image = desc.createImage();
+		JFaceResources.getImageRegistry().put(resource, image);
+		return image;
+	}
+
+	public Image getImage(String resource) {
+		Image image = JFaceResources.getImageRegistry().get(resource);
+		if (image == null) {
+			image = createImage(resource);
+		}
+		return image;
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentAssistProcessor.java
new file mode 100644
index 0000000..20d4451
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentAssistProcessor.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+import org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeIdsXML;
+
+/**
+ * @deprecated This class is no longer used locally and will be removed in the future
+ * @see XMLStructuredContentAssistProcessor
+ */
+public class XMLContentAssistProcessor extends AbstractContentAssistProcessor implements IPropertyChangeListener {
+
+	protected IPreferenceStore fPreferenceStore = null;
+	protected IResource fResource = null;
+	private XMLTemplateCompletionProcessor fTemplateProcessor = null;
+	private List fTemplateContexts = new ArrayList();
+
+	public XMLContentAssistProcessor() {
+		super();
+	}
+
+	protected void addAttributeNameProposals(ContentAssistRequest contentAssistRequest) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.ATTRIBUTE);
+		super.addAttributeNameProposals(contentAssistRequest);
+	}
+
+	protected void addAttributeValueProposals(ContentAssistRequest contentAssistRequest) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.ATTRIBUTE_VALUE);
+		super.addAttributeValueProposals(contentAssistRequest);
+	}
+
+	protected void addEmptyDocumentProposals(ContentAssistRequest contentAssistRequest) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.NEW);
+		super.addEmptyDocumentProposals(contentAssistRequest);
+	}
+
+	protected void addTagInsertionProposals(ContentAssistRequest contentAssistRequest, int childPosition) {
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.TAG);
+		super.addTagInsertionProposals(contentAssistRequest, childPosition);
+	}
+
+	/**
+	 * Adds templates to the list of proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 */
+	private void addTemplates(ContentAssistRequest contentAssistRequest, String context) {
+		addTemplates(contentAssistRequest, context, contentAssistRequest.getReplacementBeginPosition());
+	}
+
+	/**
+	 * Adds templates to the list of proposals
+	 * 
+	 * @param contentAssistRequest
+	 * @param context
+	 * @param startOffset
+	 */
+	private void addTemplates(ContentAssistRequest contentAssistRequest, String context, int startOffset) {
+		if (contentAssistRequest == null) {
+			return;
+		}
+
+		// if already adding template proposals for a certain context type, do
+		// not add again
+		if (!fTemplateContexts.contains(context)) {
+			fTemplateContexts.add(context);
+			boolean useProposalList = !contentAssistRequest.shouldSeparate();
+
+			if (getTemplateCompletionProcessor() != null) {
+				getTemplateCompletionProcessor().setContextType(context);
+				ICompletionProposal[] proposals = getTemplateCompletionProcessor().computeCompletionProposals(fTextViewer, startOffset);
+				for (int i = 0; i < proposals.length; ++i) {
+					if (useProposalList) {
+						contentAssistRequest.addProposal(proposals[i]);
+					}
+					else {
+						contentAssistRequest.addMacro(proposals[i]);
+					}
+				}
+			}
+		}
+	}
+
+	protected ContentAssistRequest computeCompletionProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode treeNode, IDOMNode xmlnode) {
+		ContentAssistRequest request = super.computeCompletionProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
+		// bug115927 use original document position for all/any region
+		// templates
+		addTemplates(request, TemplateContextTypeIdsXML.ALL, documentPosition);
+		return request;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.xml.ui.contentassist.AbstractContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer textViewer, int documentPosition) {
+		fTemplateContexts.clear();
+		return super.computeCompletionProposals(textViewer, documentPosition);
+	}
+
+	protected IPreferenceStore getPreferenceStore() {
+		if (fPreferenceStore == null) {
+			fPreferenceStore = XMLUIPlugin.getDefault().getPreferenceStore();
+		}
+		return fPreferenceStore;
+	}
+
+	private XMLTemplateCompletionProcessor getTemplateCompletionProcessor() {
+		if (fTemplateProcessor == null) {
+			fTemplateProcessor = new XMLTemplateCompletionProcessor();
+		}
+		return fTemplateProcessor;
+	}
+
+	protected void init() {
+		getPreferenceStore().addPropertyChangeListener(this);
+		reinit();
+	}
+
+	public void propertyChange(PropertyChangeEvent event) {
+		String property = event.getProperty();
+
+		if ((property.compareTo(XMLUIPreferenceNames.AUTO_PROPOSE) == 0) || (property.compareTo(XMLUIPreferenceNames.AUTO_PROPOSE_CODE) == 0)) {
+			reinit();
+		}
+	}
+
+	protected void reinit() {
+		String key = XMLUIPreferenceNames.AUTO_PROPOSE;
+		boolean doAuto = getPreferenceStore().getBoolean(key);
+		if (doAuto) {
+			key = XMLUIPreferenceNames.AUTO_PROPOSE_CODE;
+			completionProposalAutoActivationCharacters = getPreferenceStore().getString(key).toCharArray();
+		}
+		else {
+			completionProposalAutoActivationCharacters = null;
+		}
+	}
+
+	public void release() {
+		super.release();
+		getPreferenceStore().removePropertyChangeListener(this);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentAssistUtilities.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentAssistUtilities.java
new file mode 100644
index 0000000..4aa4b34
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentAssistUtilities.java
@@ -0,0 +1,516 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.internal.util.ScriptLanguageKeys;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * @author pavery
+ */
+public class XMLContentAssistUtilities extends ContentAssistUtils {
+
+	/**
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	private class DOMJSPRegionContextsPrivateCopy {
+		private static final String JSP_CLOSE = "JSP_CLOSE"; //$NON-NLS-1$
+		private static final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$
+		private static final String JSP_SCRIPTLET_OPEN = "JSP_SCRIPTLET_OPEN"; //$NON-NLS-1$
+		private static final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$NON-NLS-1$
+
+	}
+
+
+	public static final String CONTENT = "Content"; //$NON-NLS-1$
+	public static final String CONTENT_SCRIPT_TYPE = "Content-Script-Type"; //$NON-NLS-1$
+	public static final String HEAD = "HEAD"; //$NON-NLS-1$
+	public static final String HTML = "HTML"; //$NON-NLS-1$
+	public static final String HTTP_EQUIV = "HTTP-EQUIV"; //$NON-NLS-1$
+	public static final String META = "META"; //$NON-NLS-1$
+
+	/**
+	 * A convenience method for getting the closing proposal given the
+	 * contents (IndexedRegion) of a tag that is started, but possibly not
+	 * ended
+	 * 
+	 * @param viewer
+	 *            the text viewer
+	 * @param documentPosition
+	 *            the cursor position in the viewer
+	 * @param indexedNode
+	 *            the contents of the tag that is started but possibly not
+	 *            ended
+	 * @param parentTagName
+	 *            the tag on which you are checkin for an ending tag
+	 * @param imagePath
+	 *            content assist image relative path
+	 * @return ICompletionProposal
+	 */
+	public static ICompletionProposal computeJSPEndTagProposal(ITextViewer viewer, int documentPosition, IndexedRegion indexedNode, String parentTagName, String imagePath) {
+		ICompletionProposal p = null;
+
+		// check if tag is closed
+		boolean hasEndTag = true;
+		boolean isJSPTag = false;
+		IDOMNode xnode = null;
+		String tagName = ""; //$NON-NLS-1$
+		if (indexedNode instanceof IDOMNode) {
+			xnode = ((IDOMNode) indexedNode);
+			// it's ended already...
+			if (xnode.getEndStructuredDocumentRegion() != null) {
+				return null;
+			}
+			IDOMNode openNode = null;
+			if (!xnode.getNodeName().equalsIgnoreCase(parentTagName)) {
+				openNode = (IDOMNode) xnode.getParentNode();
+			}
+			if (openNode != null) {
+				if (openNode instanceof IDOMElement) {
+					isJSPTag = ((IDOMElement) openNode).isJSPTag();
+				}
+				tagName = openNode.getNodeName();
+				hasEndTag = (openNode.getEndStructuredDocumentRegion() != null);
+			}
+		}
+
+		// it's closed, don't add close tag proposal
+		if (!hasEndTag && !isJSPTag) {
+
+			// create appropriate close tag text
+			String proposedText = "</" + tagName; //$NON-NLS-1$
+			String viewerText = viewer.getTextWidget().getText();
+			if ((viewerText.length() >= documentPosition) && (viewerText.length() >= 2) && (documentPosition >= 2)) {
+				String last2chars = viewerText.substring(documentPosition - 2, documentPosition);
+				if (last2chars.endsWith("</")) {
+					proposedText = tagName;
+				}
+				else if (last2chars.endsWith("<")) {
+					proposedText = "/" + tagName; //$NON-NLS-1$
+				}
+			}
+
+			// create proposal
+			p = new CustomCompletionProposal(proposedText + ">", //$NON-NLS-1$
+						documentPosition, 0, proposedText.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(imagePath), NLS.bind(XMLUIMessages.End_with_, (new Object[]{proposedText})), null, null, XMLRelevanceConstants.R_END_TAG);
+		}
+		else if (!hasEndTag && isJSPTag) {
+
+			// create appropriate close tag text
+			String proposedText = "%"; //$NON-NLS-1$
+			String viewerText = viewer.getTextWidget().getText();
+
+			// TODO (pa) make it smarter to add "%>" or just ">" if % is
+			// already there...
+			if ((viewerText.length() >= documentPosition) && (viewerText.length() >= 2)) {
+				String last2chars = viewerText.substring(documentPosition - 2, documentPosition);
+				String lastchar = viewerText.substring(documentPosition - 1, documentPosition);
+				if (lastchar.equals("%")) //$NON-NLS-1$
+				{
+					if (last2chars.endsWith("<%")) {
+						proposedText = "%"; //$NON-NLS-1$
+					}
+					else {
+						proposedText = ""; //$NON-NLS-1$
+					}
+				}
+			}
+
+			// create proposal
+			p = new CustomCompletionProposal(proposedText + ">", //$NON-NLS-1$
+						documentPosition, 0, proposedText.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(imagePath), NLS.bind(XMLUIMessages.End_with_, (new Object[]{proposedText})), null, null, XMLRelevanceConstants.R_END_TAG);
+		}
+
+		return p;
+	}
+
+
+	/**
+	 * A convenience method for getting the closing proposal given the
+	 * contents (IndexedRegion) of a tag that is started, but possibly not
+	 * ended
+	 * 
+	 * @param viewer
+	 *            the text viewer
+	 * @param documentPosition
+	 *            the cursor position in the viewer
+	 * @param indexedNode
+	 *            the contents of the tag that is started but possibly not
+	 *            ended
+	 * @param parentTagName
+	 *            the tag on which you are checkin for an ending tag
+	 * @param imagePath
+	 *            content assist relative image path
+	 * @return ICompletionProposal
+	 */
+	public static ICompletionProposal computeXMLEndTagProposal(ITextViewer viewer, int documentPosition, IndexedRegion indexedNode, String parentTagName, String imagePath) {
+		ICompletionProposal p = null;
+
+		// check if tag is closed
+		boolean hasEndTag = true;
+		IDOMNode xnode = null;
+		String tagName = ""; //$NON-NLS-1$
+		if (indexedNode instanceof IDOMNode) {
+			xnode = ((IDOMNode) indexedNode);
+			// it's ended already...
+			if (xnode.getEndStructuredDocumentRegion() != null) {
+				return null;
+			}
+			IDOMNode styleNode = null;
+			if (!xnode.getNodeName().equalsIgnoreCase(parentTagName)) {
+				styleNode = (IDOMNode) xnode.getParentNode();
+			}
+			if (styleNode != null) {
+				tagName = styleNode.getNodeName();
+				hasEndTag = (styleNode.getEndStructuredDocumentRegion() != null);
+			}
+		}
+
+		// it's closed, don't add close tag proposal
+		if (!hasEndTag) {
+
+			// create appropriate close tag text
+			String proposedText = "</" + tagName; //$NON-NLS-1$
+			String viewerText = viewer.getTextWidget().getText();
+			if ((viewerText.length() >= documentPosition) && (viewerText.length() >= 2) && (documentPosition >= 2)) {
+				String last2chars = viewerText.substring(documentPosition - 2, documentPosition);
+				if (last2chars.endsWith("</")) {
+					proposedText = tagName;
+				}
+				else if (last2chars.endsWith("<")) {
+					proposedText = "/" + tagName; //$NON-NLS-1$
+				}
+			}
+
+			// create proposal
+			p = new CustomCompletionProposal(proposedText + ">", //$NON-NLS-1$
+						documentPosition, 0, proposedText.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(imagePath), NLS.bind(XMLUIMessages.End_with_, (new Object[]{proposedText})), null, null, XMLRelevanceConstants.R_END_TAG);
+		}
+		return p;
+	}
+
+	private static String getMetaScriptType(Document doc) {
+		// Can not just do a Document.getElementsByTagName(String) as this
+		// needs
+		// to be relatively fast.
+		List metas = new ArrayList();
+		// check for META tags under the Document
+		Node html = null;
+		Node head = null;
+		Node child = null;
+		// ----------------------------------------------------------------------
+		// (pa) 20021217
+		// cmvc defect 235554
+		// performance enhancement: using child.getNextSibling() rather than
+		// nodeList(item) for O(n) vs. O(n*n)
+		// ----------------------------------------------------------------------
+
+		for (child = doc.getFirstChild(); child != null; child = child.getNextSibling()) {
+			if (child.getNodeType() != Node.ELEMENT_NODE) {
+				continue;
+			}
+			if (child.getNodeName().equalsIgnoreCase(META)) {
+				metas.add(child);
+			}
+			else if (child.getNodeName().equalsIgnoreCase(HTML)) {
+				html = child;
+			}
+		}
+		// NodeList children = doc.getChildNodes();
+		// for(int i = 0; i < children.getLength(); i++) {
+		// child = children.item(i);
+		// if(child.getNodeType() != Node.ELEMENT_NODE)
+		// continue;
+		// if(child.getNodeName().equalsIgnoreCase(META))
+		// metas.add(child);
+		// else if(child.getNodeName().equalsIgnoreCase(HTML))
+		// html = child;
+		// }
+
+		// check for META tags under HEAD
+		if (html != null) {
+			for (child = html.getFirstChild(); (child != null) && (head == null); child = child.getNextSibling()) {
+				if (child.getNodeType() != Node.ELEMENT_NODE) {
+					continue;
+				}
+				if (child.getNodeName().equalsIgnoreCase(HEAD)) {
+					head = child;
+				}
+			}
+			// children = html.getChildNodes();
+			// for(int i = 0; i < children.getLength() && head == null; i++) {
+			// child = children.item(i);
+			// if(child.getNodeType() != Node.ELEMENT_NODE)
+			// continue;
+			// if(child.getNodeName().equalsIgnoreCase(HEAD))
+			// head = child;
+			// }
+		}
+
+		if (head != null) {
+			for (head.getFirstChild(); child != null; child = child.getNextSibling()) {
+				if (child.getNodeType() != Node.ELEMENT_NODE) {
+					continue;
+				}
+				if (child.getNodeName().equalsIgnoreCase(META)) {
+					metas.add(child);
+				}
+			}
+			// children = head.getChildNodes();
+			// for(int i = 0 ; i < children.getLength(); i++) {
+			// child = children.item(i);
+			// if(child.getNodeType() != Node.ELEMENT_NODE)
+			// continue;
+			// if(child.getNodeName().equalsIgnoreCase(META))
+			// metas.add(child);
+			// }
+		}
+
+		return getMetaScriptType(metas);
+	}
+
+	private static String getMetaScriptType(List metaNodeList) {
+		Node meta = null;
+		NamedNodeMap attributes = null;
+		boolean httpEquiv = false;
+		String contentScriptType = null;
+
+		for (int i = metaNodeList.size() - 1; i >= 0; i--) {
+			meta = (Node) metaNodeList.get(i);
+			attributes = meta.getAttributes();
+			httpEquiv = false;
+			contentScriptType = null;
+			for (int j = 0; j < attributes.getLength(); j++) {
+				if (attributes.item(j).getNodeName().equalsIgnoreCase(HTTP_EQUIV)) {
+					httpEquiv = attributes.item(j).getNodeValue().equalsIgnoreCase(CONTENT_SCRIPT_TYPE);
+				}
+				else if (attributes.item(j).getNodeName().equalsIgnoreCase(CONTENT)) {
+					contentScriptType = attributes.item(j).getNodeValue();
+				}
+			}
+			if (httpEquiv && (contentScriptType != null)) {
+				return contentScriptType;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the scripting language the scriptNode is in Currently returns
+	 * javascript unless some unknown type or language is specified. Then the
+	 * unknown type/language is returned
+	 * 
+	 * @param scriptNode
+	 */
+	public static String getScriptLanguage(Node scriptNode) {
+		Node attr = null;
+
+		boolean specified = false;
+		// try to find a scripting adapter for 'type'
+		if ((scriptNode == null) || (scriptNode.getAttributes() == null)) {
+			return null;
+		}
+
+		attr = scriptNode.getAttributes().getNamedItem("type");//$NON-NLS-1$
+		if (attr != null) {
+			specified = true;
+			String type = attr.getNodeValue();
+			return lookupScriptType(type);
+		}
+		// now try to find a scripting adapter for 'language' (deprecated by
+		// HTML specifications)
+		attr = scriptNode.getAttributes().getNamedItem("language");//$NON-NLS-1$
+		if (attr != null) {
+			specified = true;
+			String language = attr.getNodeValue();
+			return lookupScriptLanguage(language);
+		}
+		// check if one is specified by a META tag at the root level or inside
+		// of HEAD
+		String type = null;
+		if (!specified) {
+			type = getMetaScriptType(scriptNode.getOwnerDocument());
+		}
+		if (type != null) {
+			specified = true;
+			return lookupScriptType(type);
+		}
+		// return default
+		if (!specified) {
+			return ScriptLanguageKeys.JAVASCRIPT;
+		}
+		return null;
+	}
+
+	/**
+	 * Tells you if the flatnode is the %> delimiter
+	 * 
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	public static boolean isJSPCloseDelimiter(IStructuredDocumentRegion fn) {
+		if (fn == null) {
+			return false;
+		}
+		return isJSPCloseDelimiter(fn.getType());
+	}
+
+	/**
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	public static boolean isJSPCloseDelimiter(String type) {
+		if (type == null) {
+			return false;
+		}
+		return (type.equals(DOMJSPRegionContextsPrivateCopy.JSP_CLOSE) || type.equals(DOMRegionContext.XML_TAG_CLOSE));
+	}
+
+	/**
+	 * Tells you if the flatnode is the JSP region <%%>, <%=%>, <%!%>
+	 * 
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	public static boolean isJSPDelimiter(IStructuredDocumentRegion fn) {
+		boolean isDelimiter = false;
+		String type = fn.getType();
+		if (type != null) {
+			isDelimiter = isJSPDelimiter(type);
+		}
+		return isDelimiter;
+	}
+
+	/**
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	public static boolean isJSPDelimiter(String type) {
+		if (type == null) {
+			return false;
+		}
+		return (isJSPOpenDelimiter(type) || isJSPCloseDelimiter(type));
+	}
+
+	/**
+	 * Tells you if the flatnode is <%, <%=, or <%! ISSUE: this is a bit of
+	 * hidden JSP knowledge that was implemented this way for expedency.
+	 * Should be evolved in future to depend on "nestedContext".
+	 */
+	public static boolean isJSPOpenDelimiter(IStructuredDocumentRegion fn) {
+		if (fn == null) {
+			return false;
+		}
+		return isJSPOpenDelimiter(fn.getType());
+	}
+
+	/**
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	public static boolean isJSPOpenDelimiter(String type) {
+		if (type == null) {
+			return false;
+		}
+		return (type.equals(DOMJSPRegionContextsPrivateCopy.JSP_SCRIPTLET_OPEN) || type.equals(DOMJSPRegionContextsPrivateCopy.JSP_DECLARATION_OPEN) || type.equals(DOMJSPRegionContextsPrivateCopy.JSP_EXPRESSION_OPEN));
+	}
+
+	/**
+	 * Tells you if the flatnode is the <jsp:scriptlet>, <jsp:expression>, or
+	 * <jsp:declaration>tag
+	 * 
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	public static boolean isXMLJSPDelimiter(IStructuredDocumentRegion fn) {
+		boolean isDelimiter = false;
+		if ((fn != null) && (fn instanceof ITextRegionContainer)) {
+			Object[] regions = ((ITextRegionContainer) fn).getRegions().toArray();
+			ITextRegion temp = null;
+			String regionText = ""; //$NON-NLS-1$
+			for (int i = 0; i < regions.length; i++) {
+				temp = (ITextRegion) regions[i];
+				if (temp.getType() == DOMRegionContext.XML_TAG_NAME) {
+					regionText = fn.getText(temp);
+					if (regionText.equalsIgnoreCase("jsp:scriptlet") || regionText.equalsIgnoreCase("jsp:expression") || regionText.equalsIgnoreCase("jsp:declaration")) {
+						isDelimiter = true;
+					}
+				}
+			}
+		}
+		return isDelimiter;
+	}
+
+	/**
+	 * Returns "javascript" if language attribute is some form of javascript,
+	 * "java" if language attribute is some form of java. Otherwise, just
+	 * returns type.
+	 * 
+	 * @param language
+	 */
+	public static String lookupScriptLanguage(String language) {
+		for (int i = 0; i < ScriptLanguageKeys.JAVASCRIPT_LANGUAGE_KEYS.length; i++) {
+			if (ScriptLanguageKeys.JAVASCRIPT_LANGUAGE_KEYS[i].equalsIgnoreCase(language)) {
+				return ScriptLanguageKeys.JAVASCRIPT;
+			}
+		}
+		for (int i = 0; i < ScriptLanguageKeys.JAVA_LANGUAGE_KEYS.length; i++) {
+			if (ScriptLanguageKeys.JAVA_LANGUAGE_KEYS[i].equalsIgnoreCase(language)) {
+				return ScriptLanguageKeys.JAVA;
+			}
+		}
+		return language;
+	}
+
+	/**
+	 * Returns "javascript" if type (used in <script type="xxx"> is actually
+	 * javascript type. Otherwise, just returns type
+	 * 
+	 * @param type
+	 */
+	public static String lookupScriptType(String type) {
+		for (int i = 0; i < ScriptLanguageKeys.JAVASCRIPT_MIME_TYPE_KEYS.length; i++) {
+			if (ScriptLanguageKeys.JAVASCRIPT_MIME_TYPE_KEYS[i].equalsIgnoreCase(type)) {
+				return ScriptLanguageKeys.JAVASCRIPT;
+			}
+		}
+		return type;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentModelGenerator.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentModelGenerator.java
new file mode 100644
index 0000000..2896432
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLContentModelGenerator.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+
+
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.w3c.dom.Node;
+
+
+public class XMLContentModelGenerator extends AbstractContentModelGenerator {
+
+	/**
+	 * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+	 * way for expedency. Should be evolved in future to depend on
+	 * "nestedContext".
+	 */
+	private class DOMJSPRegionContextsPrivateCopy {
+		private static final String JSP_DIRECTIVE_OPEN = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$
+	}
+
+	/**
+	 * XMLContentModelGenerator constructor comment.
+	 */
+	public XMLContentModelGenerator() {
+		super();
+	}
+
+	public void generateAttribute(CMAttributeDeclaration attrDecl, StringBuffer buffer) {
+		if ((attrDecl == null) || (buffer == null)) {
+			return;
+		}
+		int usage = attrDecl.getUsage();
+		if (usage == CMAttributeDeclaration.REQUIRED) {
+			buffer.append(" "); //$NON-NLS-1$
+			generateRequiredAttribute(null, attrDecl, buffer); // todo pass
+			// ownerNode as
+			// 1st param
+		}
+		return;
+	}
+
+	protected void generateEndTag(String tagName, Node parentNode, CMElementDeclaration elementDecl, StringBuffer buffer) {
+		if (elementDecl == null) {
+			return;
+		}
+		if (elementDecl.getContentType() != CMElementDeclaration.EMPTY) {
+			buffer.append("</" + tagName + ">");//$NON-NLS-2$//$NON-NLS-1$
+		}
+		return;
+	}
+
+	public void generateRequiredAttribute(Node ownerNode, CMAttributeDeclaration attrDecl, StringBuffer buffer) {
+		if ((attrDecl == null) || (buffer == null)) {
+			return;
+		}
+
+		// attribute name
+		String attributeName = getRequiredName(ownerNode, attrDecl);
+		CMDataType attrType = attrDecl.getAttrType();
+		String defaultValue = null;
+		// = sign
+		buffer.append(attributeName + "="); //$NON-NLS-1$
+		// attribute value
+		if (attrType != null) {
+			// insert any value that is implied
+			if ((attrType.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_NONE) && (attrType.getImpliedValue() != null)) {
+				defaultValue = attrType.getImpliedValue();
+			}
+			// otherwise, if an enumerated list of values exists, use the
+			// first value
+			else if ((attrType.getEnumeratedValues() != null) && (attrType.getEnumeratedValues().length > 0)) {
+				defaultValue = attrType.getEnumeratedValues()[0];
+			}
+		}
+		
+		char attrQuote = '\"';
+		// Found a double quote, wrap the attribute in single quotes
+		if(defaultValue != null && defaultValue.indexOf(attrQuote) >= 0) {
+			attrQuote = '\'';
+		}
+		
+		buffer.append(attrQuote);
+		buffer.append(((defaultValue != null) ? defaultValue : "")); //$NON-NLS-1$
+		buffer.append(attrQuote);
+		return;
+	}
+
+	protected void generateStartTag(String tagName, Node parentNode, CMElementDeclaration elementDecl, StringBuffer buffer) {
+		if ((elementDecl == null) || (buffer == null)) {
+			return;
+		}
+		buffer.append("<" + tagName);//$NON-NLS-1$
+		generateAttributes(elementDecl, buffer);
+		buffer.append(getStartTagClose(parentNode, elementDecl));
+		return;
+	}
+
+	public int getMinimalStartTagLength(Node node, CMElementDeclaration elementDecl) {
+		if (elementDecl == null) {
+			return 0;
+		}
+		if (requiresAttributes(elementDecl)) {
+			return getRequiredName(node, elementDecl).length() + 2; // < +
+			// name +
+			// space
+		}
+		else {
+			return 1 + getRequiredName(node, elementDecl).length() + getStartTagClose(node, elementDecl).length(); // < +
+			// name
+			// +
+			// appropriate
+			// close
+		}
+	}
+
+	protected String getOtherClose(Node notATagNode) {
+		if (notATagNode instanceof IDOMNode) {
+			IStructuredDocumentRegion node = ((IDOMNode) notATagNode).getStartStructuredDocumentRegion();
+			if ((node != null) && (node.getNumberOfRegions() > 1) && node.getRegions().get(0).getType().equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_OPEN)) {
+				return "%>"; //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	public String getStartTagClose(Node parentNode, CMElementDeclaration elementDecl) {
+		String other = getOtherClose(parentNode);
+		if (other != null) {
+			return other;
+		}
+		if (elementDecl == null) {
+			return ">";//$NON-NLS-1$
+		}
+		if (elementDecl.getContentType() == CMElementDeclaration.EMPTY) {
+			return "/>"; //$NON-NLS-1$
+		}
+		return ">"; //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLRelevanceConstants.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLRelevanceConstants.java
new file mode 100644
index 0000000..8fc1457
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLRelevanceConstants.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import org.eclipse.wst.sse.ui.internal.contentassist.IRelevanceConstants;
+
+
+
+/**
+ * some relevance constants for content assist higher relevance means it shows
+ * up higher on the list
+ */
+public interface XMLRelevanceConstants extends IRelevanceConstants {
+
+	int R_CDATA = 400;
+	int R_CLOSE_TAG = 1500;
+
+	int R_COMMENT = 100;
+
+	// moved this above macros
+	int R_DOCTYPE = 600;
+	int R_END_TAG = 1400;
+	int R_END_TAG_NAME = 1100;
+	int R_ENTITY = 1000;
+	int R_JSP = 500;
+
+	int R_JSP_ATTRIBUTE_VALUE = 700;
+
+	// (pa) make these the same relevance so proposals are same order for V501
+	int R_MACRO = 500;
+
+	// add this onto "required" attrs, elements, etc to bubble them up on
+	// sorting...
+	// CMVC 246618
+	int R_REQUIRED = 10;
+	int R_TAG_INSERTION = 500;
+	int R_STRICTLY_VALID_TAG_INSERTION = 600;
+	int R_TAG_NAME = 1200;
+	int R_STRICTLY_VALID_TAG_NAME = 1250;
+	int R_XML_ATTRIBUTE_NAME = 900;
+	int R_XML_ATTRIBUTE_VALUE = 800;
+	int R_XML_DECLARATION = 1300;
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLStructuredContentAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLStructuredContentAssistProcessor.java
new file mode 100644
index 0000000..69d040b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLStructuredContentAssistProcessor.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+
+/**
+ * <p>Implementation of {@link StructuredContentAssistProcessor} for XML documents</p>
+ * 
+ * <p>This implementation will react to user preference changes for auto activation
+ * characters for XML pages</p>
+ * 
+ * @see StructuredContentAssistProcessor
+ */
+public class XMLStructuredContentAssistProcessor extends StructuredContentAssistProcessor {
+	/** the auto activation characters for this processor, set by user preference */
+	private char[] fCompletionProposalAutoActivationCharacters;
+	
+	/** the context information validator for this processor */
+	private IContextInformationValidator fContextInformationValidator;
+	
+	/**
+	 * <p>Constructor</p>
+	 * 
+	 * @param assistant {@link ContentAssistant} to use
+	 * @param partitionTypeID the partition type this processor is for
+	 * @param viewer {@link ITextViewer} this processor is acting in
+	 */
+	public XMLStructuredContentAssistProcessor(ContentAssistant assistant,
+			String partitionTypeID, ITextViewer viewer) {
+		
+		super(assistant, partitionTypeID, viewer, XMLUIPlugin.getDefault().getPreferenceStore());
+		getAutoActivationCharacterPreferences();
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#getContextInformationValidator()
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		if (this.fContextInformationValidator == null) {
+			this.fContextInformationValidator = new AttributeContextInformationPresenter();
+		}
+		return this.fContextInformationValidator;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return super.getCompletionProposalAutoActivationCharacters() != null ? super.getCompletionProposalAutoActivationCharacters() : this.fCompletionProposalAutoActivationCharacters;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#propertyChange(
+	 * 	org.eclipse.jface.util.PropertyChangeEvent)
+	 */
+	public void propertyChange(PropertyChangeEvent event) {
+		if(event.getProperty().equals(XMLUIPreferenceNames.AUTO_PROPOSE) ||
+				event.getProperty().equals(XMLUIPreferenceNames.AUTO_PROPOSE_CODE)) {
+			getAutoActivationCharacterPreferences();
+		}
+	}
+	
+
+	protected void getAutoActivationCharacterPreferences() {
+		String key = XMLUIPreferenceNames.AUTO_PROPOSE;
+		boolean doAuto = getPreferenceStore().getBoolean(key);
+		if (doAuto) {
+			key = XMLUIPreferenceNames.AUTO_PROPOSE_CODE;
+			fCompletionProposalAutoActivationCharacters = getPreferenceStore().getString(key).toCharArray();
+		}
+		else {
+			fCompletionProposalAutoActivationCharacters = null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTagsCompletionProposalComputer.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTagsCompletionProposalComputer.java
new file mode 100644
index 0000000..ae03566
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTagsCompletionProposalComputer.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * <p>{@link AbstractXMLModelQueryCompletionProposalComputer} used to
+ * generate XML tag content assist proposals</p>
+ * 
+ * <p><b>NOTE:</b> Currently this computer does not filter out any of the 
+ * model query results so it will return all proposals from the model query
+ * for the current content type.  In the future this may need to change.</p>
+ */
+public class XMLTagsCompletionProposalComputer extends
+		AbstractXMLModelQueryCompletionProposalComputer {
+
+	/** the generated used to generate the proposals */
+	protected XMLContentModelGenerator fGenerator;
+	
+	/** the context information validator for this computer */
+	private IContextInformationValidator fContextInformationValidator;
+	
+	/**
+	 * <p>Default constructor</p>
+	 */
+	public XMLTagsCompletionProposalComputer() {
+		this.fContextInformationValidator = null;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLModelQueryCompletionProposalComputer#getContentGenerator()
+	 */
+	protected XMLContentModelGenerator getContentGenerator() {
+		if (fGenerator == null) {
+			fGenerator = new XMLContentModelGenerator();
+		}
+		return fGenerator;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLCompletionProposalComputer#computeContextInformation(org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public List computeContextInformation(
+			CompletionProposalInvocationContext context,
+			IProgressMonitor monitor) {
+		
+		AttributeContextInformationProvider attributeInfoProvider =
+			new AttributeContextInformationProvider((IStructuredDocument)context.getDocument(),
+					(AttributeContextInformationPresenter) getContextInformationValidator());
+		return Arrays.asList(attributeInfoProvider.getAttributeInformation(context.getInvocationOffset()));
+	}
+	
+	/**
+	 * <p>Filters out any model query actions that are not specific to XML</p>
+	 * <p><b>NOTE:</b> Currently nothing is filtered so this computer returns all
+	 * results from the model query for the current content type</p>
+	 * 
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.AbstractXMLModelQueryCompletionProposalComputer#validModelQueryNode(org.eclipse.wst.xml.core.internal.contentmodel.CMNode)
+	 */
+	protected boolean validModelQueryNode(CMNode node) {
+		return true;
+	}
+	
+	/**
+	 * Returns a validator used to determine when displayed context
+	 * information should be dismissed. May only return <code>null</code> if
+	 * the processor is incapable of computing context information.
+	 * 
+	 * a context information validator, or <code>null</code> if the
+	 * processor is incapable of computing context information
+	 */
+	private IContextInformationValidator getContextInformationValidator() {
+		if (fContextInformationValidator == null) {
+			fContextInformationValidator = new AttributeContextInformationPresenter();
+		}
+		return fContextInformationValidator;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTemplateCompletionProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTemplateCompletionProcessor.java
new file mode 100644
index 0000000..d0bb83c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTemplateCompletionProcessor.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateProposal;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+
+/**
+ * <p>Completion computer for XML templates</p>
+ */
+class XMLTemplateCompletionProcessor extends TemplateCompletionProcessor {
+	private static final class ProposalComparator implements Comparator {
+		public int compare(Object o1, Object o2) {
+			return ((TemplateProposal) o2).getRelevance() - ((TemplateProposal) o1).getRelevance();
+		}
+	}
+
+	private static final Comparator fgProposalComparator = new ProposalComparator();
+	private String fContextTypeId = null;
+
+	/*
+	 * Copied from super class except instead of calling createContext(viewer,
+	 * region) call createContext(viewer, region, offset) instead
+	 */
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+
+		ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+
+		// adjust offset to end of normalized selection
+		if (selection.getOffset() == offset) {
+			offset = selection.getOffset() + selection.getLength();
+		}
+
+		String prefix = extractPrefix(viewer, offset);
+		Region region = new Region(offset - prefix.length(), prefix.length());
+		TemplateContext context = createContext(viewer, region, offset);
+		if (context == null) {
+			return new ICompletionProposal[0];
+		}
+
+		// name of the selection variables {line, word}_selection
+		context.setVariable("selection", selection.getText()); //$NON-NLS-1$
+
+		Template[] templates = getTemplates(context.getContextType().getId());
+
+		List matches = new ArrayList();
+		for (int i = 0; i < templates.length; i++) {
+			Template template = templates[i];
+			try {
+				context.getContextType().validate(template.getPattern());
+			}
+			catch (TemplateException e) {
+				continue;
+			}
+			if (template.matches(prefix, context.getContextType().getId())) {
+				matches.add(createProposal(template, context, (IRegion) region, getRelevance(template, prefix)));
+			}
+		}
+
+		Collections.sort(matches, fgProposalComparator);
+
+		return (ICompletionProposal[]) matches.toArray(new ICompletionProposal[matches.size()]);
+	}
+
+	/**
+	 * Creates a concrete template context for the given region in the
+	 * document. This involves finding out which context type is valid at the
+	 * given location, and then creating a context of this type. The default
+	 * implementation returns a <code>SmartReplaceTemplateContext</code> for
+	 * the context type at the given location. This takes the offset at which
+	 * content assist was invoked into consideration.
+	 * 
+	 * @param viewer
+	 *            the viewer for which the context is created
+	 * @param region
+	 *            the region into <code>document</code> for which the
+	 *            context is created
+	 * @param offset
+	 *            the original offset where content assist was invoked
+	 * @return a template context that can handle template insertion at the
+	 *         given location, or <code>null</code>
+	 */
+	private TemplateContext createContext(ITextViewer viewer, IRegion region, int offset) {
+		// pretty much same code as super.createContext except create
+		// SmartReplaceTemplateContext
+		TemplateContextType contextType = getContextType(viewer, region);
+		if (contextType != null) {
+			IDocument document = viewer.getDocument();
+			return new ReplaceNameTemplateContext(contextType, document, region.getOffset(), region.getLength(), offset);
+		}
+		return null;
+	}
+
+	protected ICompletionProposal createProposal(Template template, TemplateContext context, IRegion region, int relevance) {
+		return new CustomTemplateProposal(template, context, region, getImage(template), relevance);
+	}
+
+	protected TemplateContextType getContextType(ITextViewer viewer, IRegion region) {
+		TemplateContextType type = null;
+
+		ContextTypeRegistry registry = getTemplateContextRegistry();
+		if (registry != null) {
+			type = registry.getContextType(fContextTypeId);
+		}
+
+		return type;
+	}
+
+	protected Image getImage(Template template) {
+		// just return the same image for now
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_MACRO);
+	}
+
+	private ContextTypeRegistry getTemplateContextRegistry() {
+		return XMLUIPlugin.getDefault().getTemplateContextRegistry();
+	}
+
+	protected Template[] getTemplates(String contextTypeId) {
+		Template templates[] = null;
+
+		TemplateStore store = getTemplateStore();
+		if (store != null) {
+			templates = store.getTemplates(contextTypeId);
+		}
+
+		return templates;
+	}
+
+	private TemplateStore getTemplateStore() {
+		return XMLUIPlugin.getDefault().getTemplateStore();
+	}
+
+	void setContextType(String contextTypeId) {
+		fContextTypeId = contextTypeId;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTemplatesCompletionProposalComputer.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTemplatesCompletionProposalComputer.java
new file mode 100644
index 0000000..287baaa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/XMLTemplatesCompletionProposalComputer.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentassist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeIdsXML;
+
+/**
+ * <p>Proposal computer used to computer XML template content assist
+ * proposals</p>
+ */
+public class XMLTemplatesCompletionProposalComputer extends
+		DefaultXMLCompletionProposalComputer {
+
+	/** <p>The template processor used to create the proposals</p> */
+	private XMLTemplateCompletionProcessor fTemplateProcessor = null;
+
+	/**
+	 * Create the computer
+	 */
+	public XMLTemplatesCompletionProposalComputer() {
+		super();
+		fTemplateProcessor = new XMLTemplateCompletionProcessor();
+	}
+
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addAttributeNameProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addAttributeNameProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.ATTRIBUTE, context);
+	}
+
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addAttributeValueProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addAttributeValueProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.ATTRIBUTE_VALUE, context);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addEmptyDocumentProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addEmptyDocumentProposals(
+			ContentAssistRequest contentAssistRequest,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.NEW, context);
+	}
+	
+	/**
+	 * @see org.eclipse.wst.xml.ui.internal.contentassist.DefaultXMLCompletionProposalComputer#addTagInsertionProposals(org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest, int, org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext)
+	 */
+	protected void addTagInsertionProposals(
+			ContentAssistRequest contentAssistRequest, int childPosition,
+			CompletionProposalInvocationContext context) {
+		
+		addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.TAG, context);
+	}
+	
+	/**
+	 * <p>Adds templates to the list of proposals</p>
+	 * 
+	 * @param contentAssistRequest
+	 * @param templateContext
+	 * @param context
+	 */
+	private void addTemplates(ContentAssistRequest contentAssistRequest, String templateContext,
+			CompletionProposalInvocationContext context) {
+		
+		if (contentAssistRequest != null) {
+
+			boolean useProposalList = !contentAssistRequest.shouldSeparate();
+	
+			if (fTemplateProcessor != null) {
+				fTemplateProcessor.setContextType(templateContext);
+				ICompletionProposal[] proposals =
+					fTemplateProcessor.computeCompletionProposals(
+							context.getViewer(), context.getInvocationOffset());
+				for (int i = 0; i < proposals.length; ++i) {
+					if (useProposalList) {
+						contentAssistRequest.addProposal(proposals[i]);
+					}
+					else {
+						contentAssistRequest.addMacro(proposals[i]);
+					}
+				}
+			}
+		}
+	}
+
+	public List computeCompletionProposals(CompletionProposalInvocationContext context, IProgressMonitor monitor) {
+		List list = new ArrayList(super.computeCompletionProposals(context, monitor));
+
+		if (fTemplateProcessor != null) {
+			fTemplateProcessor.setContextType(TemplateContextTypeIdsXML.ALL);
+			ICompletionProposal[] proposals = fTemplateProcessor.computeCompletionProposals(context.getViewer(), context.getInvocationOffset());
+			if (proposals != null) {
+				for (int i = 0; i < proposals.length; i++) {
+					list.add(proposals[i]);
+				}
+			}
+		}
+		return list;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeAdapter.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeAdapter.java
new file mode 100644
index 0000000..0ea3570
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeAdapter.java
@@ -0,0 +1,257 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentoutline;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.xml.ui.internal.editor.CMImageUtil;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.w3c.dom.Node;
+
+/**
+ * Adapts a DOM node to a JFace viewer.
+ */
+public class JFaceNodeAdapter implements IJFaceNodeAdapter {
+
+	final static Class ADAPTER_KEY = IJFaceNodeAdapter.class;
+
+	/**
+	 * debug .option
+	 */
+	private static final boolean DEBUG = getDebugValue();
+
+	private static boolean getDebugValue() {
+		String value = Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/outline"); //$NON-NLS-1$
+		boolean result = (value != null) && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+		return result;
+	}
+
+	JFaceNodeAdapterFactory fAdapterFactory;
+	RefreshStructureJob fRefreshJob = null;
+
+	public JFaceNodeAdapter(JFaceNodeAdapterFactory adapterFactory) {
+		super();
+		this.fAdapterFactory = adapterFactory;
+	}
+
+	protected Image createImage(Object object) {
+		Image image = null;
+		Node node = (Node) object;
+		switch (node.getNodeType()) {
+			case Node.ELEMENT_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ELEMENT);
+				break;
+			}
+			case Node.ATTRIBUTE_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);
+				break;
+			}
+			case Node.TEXT_NODE : { // actually, TEXT should never be seen in
+				// the tree
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_TXTEXT);
+				break;
+			}
+			case Node.CDATA_SECTION_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_CDATASECTION);
+				break;
+			}
+			case Node.ENTITY_REFERENCE_NODE :
+			case Node.ENTITY_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_ENTITY);
+				break;
+			}
+			case Node.PROCESSING_INSTRUCTION_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_PROCESSINGINSTRUCTION);
+				break;
+			}
+			case Node.COMMENT_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_COMMENT);
+				break;
+			}
+			case Node.DOCUMENT_TYPE_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_DOCTYPE);
+				break;
+			}
+			case Node.NOTATION_NODE : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_NOTATION);
+				break;
+			}
+			default : {
+				image = createXMLImageDescriptor(XMLEditorPluginImages.IMG_OBJ_TXTEXT);
+				break;
+			}
+		}
+		return image;
+	}
+
+	protected Image createXMLImageDescriptor(String imageResourceName) {
+		return XMLEditorPluginImageHelper.getInstance().getImage(imageResourceName);
+	}
+
+	public Object[] getChildren(Object object) {
+
+		// (pa) 20021217
+		// cmvc defect 235554
+		// performance enhancement: using child.getNextSibling() rather than
+		// nodeList(item) for O(n) vs. O(n*n)
+		//
+		ArrayList v = new ArrayList();
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
+				Node n = child;
+				if (n.getNodeType() != Node.TEXT_NODE) {
+					v.add(n);
+				}
+			}
+		}
+		return v.toArray();
+	}
+
+	/**
+	 * Returns an enumeration with the elements belonging to the passed
+	 * element. These are the top level items in a list, tree, table, etc...
+	 */
+	public Object[] getElements(Object node) {
+		return getChildren(node);
+	}
+
+	/**
+	 * Fetches the label image specific to this object instance.
+	 */
+	public Image getLabelImage(Object node) {
+		Image image = null;
+		if (node instanceof Node) {
+			// check for an image from the content model
+			image = CMImageUtil.getImage(CMImageUtil.getDeclaration((Node) node));
+			if (image == null) {
+				/*
+				 * Create/get image based on Node type. Images are cached
+				 * transparently in this class, subclasses must do this for
+				 * themselves if they're going to return their own results.
+				 */
+				image = createImage(node);
+			}
+		}
+		return image;
+	}
+
+	/**
+	 * Fetches the label text specific to this object instance.
+	 */
+	public String getLabelText(Object node) {
+		return getNodeName(node);
+	}
+
+	private String getNodeName(Object object) {
+		StringBuffer nodeName = new StringBuffer();
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			nodeName.append(node.getNodeName());
+
+			if (node.getNodeType() == Node.DOCUMENT_TYPE_NODE) {
+				nodeName.insert(0, "DOCTYPE:"); //$NON-NLS-1$
+			}
+
+		}
+		return nodeName.toString();
+	}
+
+
+	public Object getParent(Object object) {
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			return node.getParentNode();
+		}
+		return null;
+	}
+
+	private synchronized RefreshStructureJob getRefreshJob() {
+		if (fRefreshJob == null) {
+			fRefreshJob = new RefreshStructureJob();
+		}
+		return fRefreshJob;
+	}
+
+
+	public boolean hasChildren(Object object) {
+		// (pa) 20021217
+		// cmvc defect 235554 > use child.getNextSibling() instead of
+		// nodeList(item) for O(n) vs. O(n*n)
+		Node node = (Node) object;
+		for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
+			if (child.getNodeType() != Node.TEXT_NODE) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Allowing the INodeAdapter to compare itself against the type allows it
+	 * to return true in more than one case.
+	 */
+	public boolean isAdapterForType(Object type) {
+		if (type == null) {
+			return false;
+		}
+		return type.equals(ADAPTER_KEY);
+	}
+
+	/**
+	 * Called by the object being adapter (the notifier) when something has
+	 * changed.
+	 */
+	public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+		// future_TODO: the 'uijobs' used in this method were added to solve
+		// threading problems when the dom
+		// is updated in the background while the editor is open. They may be
+		// a bit overkill and not that useful.
+		// (That is, may be be worthy of job manager management). If they are
+		// found to be important enough to leave in,
+		// there's probably some optimization that can be done.
+		if (notifier instanceof Node) {
+			Collection listeners = fAdapterFactory.getListeners();
+			Iterator iterator = listeners.iterator();
+
+			while (iterator.hasNext()) {
+				Object listener = iterator.next();
+				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=90637
+				// if (notifier instanceof Node && (listener instanceof
+				// StructuredViewer) && (eventType ==
+				// INodeNotifier.STRUCTURE_CHANGED || (eventType ==
+				// INodeNotifier.CHANGE && changedFeature == null))) {
+				if ((listener instanceof StructuredViewer) && ((eventType == INodeNotifier.STRUCTURE_CHANGED) || (eventType == INodeNotifier.CONTENT_CHANGED) || (eventType == INodeNotifier.CHANGE))) {
+					if (DEBUG) {
+						System.out.println("JFaceNodeAdapter notified on event type > " + eventType); //$NON-NLS-1$
+					}
+
+					// refresh on structural and "unknown" changes
+					StructuredViewer structuredViewer = (StructuredViewer) listener;
+					// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=5230
+					if (structuredViewer.getControl() != null) {
+						getRefreshJob().refresh(structuredViewer, (Node) notifier);
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeAdapterFactory.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeAdapterFactory.java
new file mode 100644
index 0000000..3943403
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeAdapterFactory.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentoutline;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.util.Assert;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapterFactory;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManagerListener;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+
+/**
+ * An adapter factory to create JFaceNodeAdapters. Use this adapter factory
+ * with a JFaceAdapterContentProvider to display DOM nodes in a tree.
+ */
+public class JFaceNodeAdapterFactory extends AbstractAdapterFactory implements IJFaceNodeAdapterFactory {
+	public class CMDocumentManagerListenerImpl implements CMDocumentManagerListener {
+		private static final int UPDATE_DELAY = 200;
+
+		public void cacheCleared(CMDocumentCache cache) {
+			// nothing to do
+		}
+
+		public void cacheUpdated(CMDocumentCache cache, final String uri, int oldStatus, int newStatus, CMDocument cmDocument) {
+			if ((newStatus == CMDocumentCache.STATUS_LOADED) || (newStatus == CMDocumentCache.STATUS_ERROR)) {
+				refreshViewers();
+			}
+		}
+
+		public void propertyChanged(CMDocumentManager cmDocumentManager, String propertyName) {
+			if (cmDocumentManager.getPropertyEnabled(CMDocumentManager.PROPERTY_AUTO_LOAD)) {
+				refreshViewers();
+			}
+		}
+
+		private void refreshViewers() {
+			Object[] listeners = getListeners().toArray();
+			for (int i = 0; i < listeners.length; i++) {
+				if (listeners[i] instanceof StructuredViewer) {
+					final StructuredViewer viewer = (StructuredViewer) listeners[i];
+					Job refresh = new UIJob(XMLUIMessages.refreshoutline_0) {
+						public IStatus runInUIThread(IProgressMonitor monitor) {
+							Control refreshControl = viewer.getControl();
+							if ((refreshControl != null) && !refreshControl.isDisposed()) {
+								viewer.refresh(true);
+							}
+							return Status.OK_STATUS;
+						}
+					};
+					refresh.setSystem(true);
+					refresh.setPriority(Job.SHORT);
+					refresh.schedule(UPDATE_DELAY);
+				}
+				else if (listeners[i] instanceof Viewer) {
+					final Viewer viewer = (Viewer) listeners[i];
+					Job refresh = new UIJob(XMLUIMessages.refreshoutline_0) {
+						public IStatus runInUIThread(IProgressMonitor monitor) {
+							Control refreshControl = viewer.getControl();
+							if ((refreshControl != null) && !refreshControl.isDisposed()) {
+								viewer.refresh();
+							}
+							return Status.OK_STATUS;
+						}
+					};
+					refresh.setSystem(true);
+					refresh.setPriority(Job.SHORT);
+					refresh.schedule(UPDATE_DELAY);
+				}
+			}
+		}
+	}
+
+	private CMDocumentManager cmDocumentManager;
+	private CMDocumentManagerListenerImpl fCMDocumentManagerListener = null;
+	/**
+	 * This keeps track of all the listeners.
+	 */
+	private Set fListeners = new HashSet();
+
+	protected INodeAdapter singletonAdapter;
+
+	public JFaceNodeAdapterFactory() {
+		this(IJFaceNodeAdapter.class, true);
+	}
+
+	public JFaceNodeAdapterFactory(Object adapterKey, boolean registerAdapters) {
+		super(adapterKey, registerAdapters);
+	}
+
+	public synchronized void addListener(Object listener) {
+		fListeners.add(listener);
+	}
+
+	public INodeAdapterFactory copy() {
+		return new JFaceNodeAdapterFactory(getAdapterKey(), isShouldRegisterAdapter());
+	}
+
+	/**
+	 * Create a new JFace adapter for the DOM node passed in
+	 */
+	protected INodeAdapter createAdapter(INodeNotifier node) {
+		if (singletonAdapter == null) {
+			// create the JFaceNodeAdapter
+			singletonAdapter = new JFaceNodeAdapter(this);
+			initAdapter(singletonAdapter, node);
+		}
+		return singletonAdapter;
+	}
+
+
+	/**
+	 * returns "copy" so no one can modify our list. It is a shallow copy.
+	 */
+	public synchronized Collection getListeners() {
+		return new ArrayList(fListeners);
+	}
+
+	protected void initAdapter(INodeAdapter adapter, INodeNotifier node) {
+		Assert.isTrue(cmDocumentManager == null);
+		Assert.isTrue(fCMDocumentManagerListener == null);
+
+		// register for CMDocumentManager events
+		ModelQueryAdapter mqadapter = (ModelQueryAdapter) node.getAdapterFor(ModelQueryAdapter.class);
+		if (mqadapter != null) {
+			ModelQuery mquery = mqadapter.getModelQuery();
+			if ((mquery != null) && (mquery.getCMDocumentManager() != null)) {
+				cmDocumentManager = mquery.getCMDocumentManager();
+				fCMDocumentManagerListener = new CMDocumentManagerListenerImpl();
+				cmDocumentManager.addListener(fCMDocumentManagerListener);
+			}
+		}
+	}
+
+	public void release() {
+		// deregister from CMDocumentManager events
+		if ((cmDocumentManager != null) && (fCMDocumentManagerListener != null)) {
+			cmDocumentManager.removeListener(fCMDocumentManagerListener);
+		}
+		fListeners.clear();
+		if (singletonAdapter != null && singletonAdapter instanceof JFaceNodeAdapter) {
+			RefreshStructureJob refreshJob = ((JFaceNodeAdapter) singletonAdapter).fRefreshJob;
+			if (refreshJob != null) {
+				refreshJob.cancel();
+			}
+		}
+	}
+
+	public synchronized void removeListener(Object listener) {
+		fListeners.remove(listener);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeContentProvider.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeContentProvider.java
new file mode 100644
index 0000000..f3c5452
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeContentProvider.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentoutline;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapterFactory;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+
+
+/**
+ * An ITreeContentProvider for a TreeViewers used to display DOM nodes. This
+ * content provider takes an adapter factory to create JFace adapters for the
+ * nodes in the tree.
+ */
+public class JFaceNodeContentProvider implements ITreeContentProvider {
+
+	public JFaceNodeContentProvider() {
+		super();
+	}
+
+	/**
+	 * The visual part that is using this content provider is about to be
+	 * disposed. Deallocate all allocated SWT resources.
+	 */
+	public void dispose() {
+	}
+
+	/**
+	 * Returns the JFace adapter for the specified object.
+	 * 
+	 * @param adaptable
+	 *            java.lang.Object The object to get the adapter for
+	 */
+	protected IJFaceNodeAdapter getAdapter(Object adaptable) {
+		if (adaptable instanceof INodeNotifier) {
+			INodeAdapter adapter = ((INodeNotifier) adaptable).getAdapterFor(IJFaceNodeAdapter.class);
+			if (adapter instanceof IJFaceNodeAdapter) {
+				return (IJFaceNodeAdapter) adapter;
+			}
+		}
+		return null;
+	}
+
+	public Object[] getChildren(Object object) {
+		IJFaceNodeAdapter adapter = getAdapter(object);
+
+		if (adapter != null) {
+			return adapter.getChildren(object);
+		}
+
+		return new Object[0];
+	}
+
+	public Object[] getElements(Object object) {
+		// The root is usually an instance of an XMLStructuredModel in
+		// which case we want to extract the document.
+		Object topNode = object;
+		if (object instanceof IDOMModel) {
+			topNode = ((IDOMModel) object).getDocument();
+		}
+
+		IJFaceNodeAdapter adapter = getAdapter(topNode);
+
+		if (adapter != null) {
+			return adapter.getElements(topNode);
+		}
+
+		return new Object[0];
+	}
+
+	public Object getParent(Object object) {
+		IJFaceNodeAdapter adapter = getAdapter(object);
+
+		if (adapter != null) {
+			return adapter.getParent(object);
+		}
+
+		return null;
+	}
+
+	public boolean hasChildren(Object object) {
+		IJFaceNodeAdapter adapter = getAdapter(object);
+
+		if (adapter != null) {
+			return adapter.hasChildren(object);
+		}
+
+		return false;
+	}
+
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		if ((oldInput != null) && (oldInput instanceof IStructuredModel)) {
+			IJFaceNodeAdapterFactory factory = (IJFaceNodeAdapterFactory) ((IStructuredModel) oldInput).getFactoryRegistry().getFactoryFor(IJFaceNodeAdapter.class);
+			if (factory != null) {
+				factory.removeListener(viewer);
+			}
+		}
+		if ((newInput != null) && (newInput instanceof IStructuredModel)) {
+			IJFaceNodeAdapterFactory factory = (IJFaceNodeAdapterFactory) ((IStructuredModel) newInput).getFactoryRegistry().getFactoryFor(IJFaceNodeAdapter.class);
+			if (factory != null) {
+				factory.addListener(viewer);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeLabelProvider.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeLabelProvider.java
new file mode 100644
index 0000000..6168dde
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/JFaceNodeLabelProvider.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentoutline;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+
+/**
+ * A (column) label provider backed by JFaceNodeAdapters.
+ */
+public class JFaceNodeLabelProvider extends ColumnLabelProvider {
+	/**
+	 * JFaceNodeLabelProvider constructor comment.
+	 */
+	public JFaceNodeLabelProvider() {
+		super();
+	}
+
+	/**
+	 * Returns the JFace adapter for the specified object.
+	 * 
+	 * @param adaptable
+	 *            java.lang.Object The object to get the adapter for
+	 */
+	protected IJFaceNodeAdapter getAdapter(Object adaptable) {
+		if (adaptable instanceof INodeNotifier) {
+			INodeAdapter adapter = ((INodeNotifier) adaptable).getAdapterFor(IJFaceNodeAdapter.class);
+			if (adapter instanceof IJFaceNodeAdapter) {
+				return (IJFaceNodeAdapter) adapter;
+			}
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+	 */
+	public Image getImage(Object element) {
+		IJFaceNodeAdapter adapter = getAdapter(element);
+		if (adapter != null)
+			return adapter.getLabelImage(element);
+		return super.getImage(element);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+	 */
+	public String getText(Object element) {
+		IJFaceNodeAdapter adapter = getAdapter(element);
+		if (adapter != null)
+			return adapter.getLabelText(element);
+		return super.getText(element);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+	 *      java.lang.String)
+	 */
+	public boolean isLabelProperty(Object element, String property) {
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/RefreshStructureJob.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/RefreshStructureJob.java
new file mode 100644
index 0000000..55c9390
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/RefreshStructureJob.java
@@ -0,0 +1,368 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentoutline;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * This job holds a queue of updates (affected nodes) for multiple structured
+ * viewers. When a new request comes in, the current run is cancelled, the new
+ * request is added to the queue, then the job is re-scheduled. Support for
+ * multiple structured viewers is required because refresh updates are usually
+ * triggered by model changes, and the model may be visible in more than one
+ * viewer.
+ * 
+ * @author pavery
+ */
+class RefreshStructureJob extends Job {
+
+	/** debug flag */
+	static final boolean DEBUG;
+	private static final long UPDATE_DELAY = 300;
+	static {
+		String value = Platform.getDebugOption("org.eclipse.wst.sse.ui/debug/refreshStructure"); //$NON-NLS-1$
+		DEBUG = (value != null) && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+	}
+	/** List of refresh requests (Nodes) */
+	private final List fRefreshes;
+	/** List of update requests (Nodes) */
+	private final List fUpdates;
+	/** List of update requests (Nodes) */
+	private final List fUpdateProperties;
+	/** the structured viewers */
+	Set fRefreshViewers = new HashSet(3);
+	Set fUpdateViewers = new HashSet(3);
+
+	public RefreshStructureJob() {
+		super(XMLUIMessages.refreshoutline_0);
+		setPriority(Job.LONG);
+		setSystem(true);
+		fRefreshes = new ArrayList(5);
+		fUpdates = new ArrayList(5);
+		fUpdateProperties = new ArrayList(5);
+	}
+
+	private synchronized void addUpdateRequest(Node newNodeRequest, String[] updateProperties) {
+		/*
+		 * If we get to here, either from existing request list being zero
+		 * length, or no exisitng requests "matched" new request, then add the
+		 * new request.
+		 */
+		fUpdates.add(newNodeRequest);
+		fUpdateProperties.add(updateProperties);
+	}
+
+	private synchronized void addUpdateViewer(StructuredViewer viewer) {
+		fUpdateViewers.add(viewer);
+	}
+
+	private synchronized void addRefreshRequest(Node newNodeRequest) {
+		/*
+		 * note: the caller must NOT pass in null node request (which, since
+		 * private method, we do not need to gaurd against here, as long as we
+		 * gaurd against it in calling method.
+		 */
+		int size = fRefreshes.size();
+		for (int i = 0; i < size; i++) {
+			Node existingNodeRequest = (Node) fRefreshes.get(i);
+			/*
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=157427 If we
+			 * already have a request which equals the new request, discard
+			 * the new request
+			 */
+			if (existingNodeRequest.equals(newNodeRequest)) {
+				return;
+			}
+			/*
+			 * If we already have a request which contains the new request,
+			 * discard the new request
+			 */
+			if (contains(existingNodeRequest, newNodeRequest)) {
+				return;
+			}
+			/*
+			 * If new request contains any existing requests, replace it with
+			 * new request. ISSUE: technically, we should replace ALL
+			 * contained, existing requests (such as if many siblings already
+			 * que'd up when their common parent is then requested, but, I'm
+			 * not sure if that occurs much, in practice, or if there's an
+			 * algorithm to quickly find them all. Actually, I guess we could
+			 * just go through the _rest_ of the list (i+1 to size) and remove
+			 * any that are contained by new request ... in future :) .
+			 */
+			if (contains(newNodeRequest, existingNodeRequest)) {
+				fRefreshes.set(i, newNodeRequest);
+				return;
+			}
+		}
+		/*
+		 * If we get to here, either from existing request list being zero
+		 * length, or no exisitng requests "matched" new request, then add the
+		 * new request.
+		 */
+		fRefreshes.add(newNodeRequest);
+	}
+
+	private synchronized void addRefreshViewer(StructuredViewer viewer) {
+		fRefreshViewers.add(viewer);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#canceling()
+	 */
+	protected void canceling() {
+		fUpdates.clear();
+		fUpdateViewers.clear();
+		super.canceling();
+	}
+
+	/**
+	 * Simple hierarchical containment relationship. Note, this method returns
+	 * "false" if the two nodes are equal!
+	 * 
+	 * @param root
+	 * @param possible
+	 * @return if the root is parent of possible, return true, otherwise
+	 *         return false
+	 */
+	private boolean contains(Node root, Node possible) {
+		if (DEBUG) {
+			System.out.println("=============================================================================================================="); //$NON-NLS-1$
+			System.out.println("recursive call w/ root: " + root.getNodeName() + " and possible: " + possible); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.println("--------------------------------------------------------------------------------------------------------------"); //$NON-NLS-1$
+		}
+
+		// the following checks are important
+		// #document node will break the algorithm otherwise
+
+		// can't contain the child if it's null
+		if (root == null) {
+			if (DEBUG) {
+				System.out.println("returning false: root is null"); //$NON-NLS-1$
+			}
+			return false;
+		}
+		// nothing can be parent of Document node
+		if (possible instanceof Document) {
+			if (DEBUG) {
+				System.out.println("returning false: possible is Document node"); //$NON-NLS-1$
+			}
+			return false;
+		}
+		// document contains everything
+		if (root instanceof Document) {
+			if (DEBUG) {
+				System.out.println("returning true: root is Document node"); //$NON-NLS-1$
+			}
+			return true;
+		}
+
+		// check parentage
+		Node current = possible;
+		// loop parents
+		while ((current != null) && (current.getNodeType() != Node.DOCUMENT_NODE)) {
+			// found it
+			if (root.equals(current)) {
+				if (DEBUG) {
+					System.out.println("   !!! found: " + possible.getNodeName() + " in subelement of: " + root.getNodeName()); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+				return true;
+			}
+			current = current.getParentNode();
+		}
+		// never found it
+		return false;
+	}
+
+	/**
+	 * Refresh must be on UI thread because it's on a SWT widget.
+	 * 
+	 * @param node
+	 */
+	private void doRefresh(final Node node, final StructuredViewer[] viewers) {
+		final Display display = PlatformUI.getWorkbench().getDisplay();
+		display.asyncExec(new Runnable() {
+			public void run() {
+				if (DEBUG) {
+					System.out.println("refresh on: [" + node.getNodeName() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+
+				for (int i = 0; i < viewers.length; i++) {
+					if (!viewers[i].getControl().isDisposed()) {
+						if (node.getNodeType() == Node.DOCUMENT_NODE) {
+							viewers[i].refresh(true);
+						}
+						else {
+							viewers[i].refresh(node, true);
+						}
+					}
+					else {
+						if (DEBUG) {
+							System.out.println("   !!! skipped refreshing disposed viewer: " + viewers[i]); //$NON-NLS-1$
+						}
+					}
+				}
+			}
+		});
+	}
+
+	/**
+	 * Update must be on UI thread because it's on a SWT widget.
+	 * 
+	 * @param node
+	 */
+	private void doUpdate(final StructuredViewer[] viewers, final Node node, final String[] properties) {
+		final Display display = PlatformUI.getWorkbench().getDisplay();
+		display.asyncExec(new Runnable() {
+			public void run() {
+				if (DEBUG) {
+					System.out.println("refresh on: [" + node.getNodeName() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+
+				for (int i = 0; i < viewers.length; i++) {
+					if (!viewers[i].getControl().isDisposed()) {
+						viewers[i].update(node, properties);
+					}
+					else {
+						if (DEBUG) {
+							System.out.println("   !!! skipped refreshing disposed viewer: " + viewers[i]); //$NON-NLS-1$
+						}
+					}
+				}
+			}
+		});
+	}
+
+	/**
+	 * This method also synchronized because it accesses the fRefreshes queue
+	 * and fRefreshViewers list
+	 * 
+	 * @return an array containing and array of the currently requested Nodes
+	 *         to refresh and the viewers in which to refresh them
+	 */
+	private synchronized Object[] getRefreshRequests() {
+		Node[] toRefresh = (Node[]) fRefreshes.toArray(new Node[fRefreshes.size()]);
+		fRefreshes.clear();
+
+		StructuredViewer[] viewers = (StructuredViewer[]) fRefreshViewers.toArray(new StructuredViewer[fRefreshViewers.size()]);
+		fRefreshViewers.clear();
+
+		return new Object[]{toRefresh, viewers};
+	}
+
+	/**
+	 * This method also synchronized because it accesses the fUpdates queue
+	 * and fUpdateViewers list
+	 * 
+	 * @return an array containing and array of the currently requested Nodes
+	 *         to refresh and the viewers in which to refresh them
+	 */
+	private synchronized Object[] getUpdateRequests() {
+		Node[] toUpdate = (Node[]) fUpdates.toArray(new Node[fUpdates.size()]);
+		fUpdates.clear();
+
+		StructuredViewer[] viewers = (StructuredViewer[]) fUpdateViewers.toArray(new StructuredViewer[fUpdateViewers.size()]);
+		fUpdateViewers.clear();
+
+		String[][] properties = (String[][]) fUpdateProperties.toArray(new String[fUpdateProperties.size()][]);
+		fUpdateProperties.clear();
+
+		return new Object[]{toUpdate, viewers, properties};
+	}
+
+	/**
+	 * Invoke a refresh on the viewer on the given node.
+	 * 
+	 * @param node
+	 */
+	public void refresh(StructuredViewer viewer, Node node) {
+		if (node == null) {
+			return;
+		}
+
+		addRefreshViewer(viewer);
+		addRefreshRequest(node);
+		schedule(UPDATE_DELAY);
+	}
+
+	/**
+	 * Invoke a refresh on the viewer on the given node.
+	 * 
+	 * @param node
+	 */
+	public void update(StructuredViewer viewer, Node node, String[] properties) {
+		if (node == null) {
+			return;
+		}
+
+		addUpdateViewer(viewer);
+		addUpdateRequest(node, properties);
+		schedule(UPDATE_DELAY);
+	}
+
+	protected IStatus run(IProgressMonitor monitor) {
+		IStatus status = Status.OK_STATUS;
+		try {
+			performUpdates();
+			
+			performRefreshes(monitor);
+		}
+		finally {
+			monitor.done();
+		}
+		return status;
+	}
+
+	private void performRefreshes(IProgressMonitor monitor) {
+		// Retrieve BOTH viewers and Nodes on one block
+		Object[] requests = getRefreshRequests();
+		Node[] nodes = (Node[]) requests[0];
+		StructuredViewer[] viewers = (StructuredViewer[]) requests[1];
+
+		for (int i = 0; i < nodes.length; i++) {
+			if (monitor.isCanceled()) {
+				throw new OperationCanceledException();
+			}
+			doRefresh(nodes[i], viewers);
+		}
+	}
+
+	private void performUpdates() {
+		// Retrieve BOTH viewers and Nodes on one block
+		Object[] requests = getUpdateRequests();
+		Node[] nodes = (Node[]) requests[0];
+		StructuredViewer[] viewers = (StructuredViewer[]) requests[1];
+		String[][] properties = (String[][]) requests[2];
+
+		for (int i = 0; i < nodes.length; i++) {
+			doUpdate(viewers, nodes[i], properties[i]);
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/XMLNodeActionManager.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/XMLNodeActionManager.java
new file mode 100644
index 0000000..f858071
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentoutline/XMLNodeActionManager.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.contentoutline;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.format.FormatProcessorXML;
+import org.eclipse.wst.xml.ui.internal.actions.AbstractNodeActionManager;
+import org.w3c.dom.Node;
+
+
+public class XMLNodeActionManager extends AbstractNodeActionManager {
+	public XMLNodeActionManager(IStructuredModel model, Viewer viewer) {
+		super(model, ModelQueryUtil.getModelQuery(model), viewer);
+	}
+
+	public void reformat(Node newElement, boolean deep) {
+		try {
+			// tell the model that we are about to make a big model change
+			fModel.aboutToChangeModel();
+
+			// format selected node
+			IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+			formatProcessor.formatNode(newElement);
+		}
+		finally {
+			// tell the model that we are done with the big model change
+			fModel.changedModel();
+		}
+	}
+
+	public void setModel(IStructuredModel newModel) {
+		fModel = newModel;
+		setModelQuery(ModelQueryUtil.getModelQuery(newModel));
+	}
+
+	protected void setModelQuery(ModelQuery newModelQuery) {
+		modelQuery = newModelQuery;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/CorrectionAssistantProviderXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/CorrectionAssistantProviderXML.java
new file mode 100644
index 0000000..2c11048
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/CorrectionAssistantProviderXML.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.ui.internal.correction.CorrectionAssistantProvider;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+
+/**
+ * Correction assistant for XML
+ * 
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public class CorrectionAssistantProviderXML extends CorrectionAssistantProvider {
+
+	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
+		IContentAssistant ca = null;
+
+		if (sourceViewer != null) {
+			ContentAssistant assistant = new ContentAssistant();
+
+			if (sourceViewer != null) {
+				IContentAssistProcessor correctionProcessor = new CorrectionProcessorXML(sourceViewer);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_DEFAULT);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_CDATA);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_COMMENT);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_DECLARATION);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_PI);
+				assistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.DTD_SUBSET);
+			}
+			ca = assistant;
+		}
+
+		return ca;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/CorrectionProcessorXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/CorrectionProcessorXML.java
new file mode 100644
index 0000000..97e73e7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/CorrectionProcessorXML.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.ui.internal.correction.IQuickAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.correction.IQuickFixProcessor;
+import org.eclipse.wst.sse.ui.internal.correction.StructuredCorrectionProcessor;
+
+/**
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public class CorrectionProcessorXML extends StructuredCorrectionProcessor {
+	protected IQuickAssistProcessor fQuickAssistProcessor;
+	protected IQuickFixProcessor fQuickFixProcessor;
+
+	public CorrectionProcessorXML(ISourceViewer sourceViewer) {
+		super(sourceViewer);
+	}
+
+	protected IQuickAssistProcessor getQuickAssistProcessor() {
+		if (fQuickAssistProcessor == null) {
+			fQuickAssistProcessor = new QuickAssistProcessorXML();
+		}
+
+		return fQuickAssistProcessor;
+	}
+
+	protected IQuickFixProcessor getQuickFixProcessor() {
+		if (fQuickFixProcessor == null) {
+			fQuickFixProcessor = new QuickFixProcessorXML();
+		}
+
+		return fQuickFixProcessor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/InsertRequiredAttrsQuickAssistProposal.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/InsertRequiredAttrsQuickAssistProposal.java
new file mode 100644
index 0000000..74947ed
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/InsertRequiredAttrsQuickAssistProposal.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.text.edits.InsertEdit;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+public class InsertRequiredAttrsQuickAssistProposal implements ICompletionProposal, ICompletionProposalExtension2 {
+	private final List fRequiredAttrs;
+
+	/**
+	 * @param requiredAttrs
+	 */
+	public InsertRequiredAttrsQuickAssistProposal(List requiredAttrs) {
+		fRequiredAttrs = requiredAttrs;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#apply(org.eclipse.jface.text.IDocument)
+	 */
+	public void apply(IDocument document) {
+		// not implemented?
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#apply(org.eclipse.jface.text.ITextViewer,
+	 *      char, int, int)
+	 */
+	public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
+		IDOMNode node = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
+		IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
+		int index = startStructuredDocumentRegion.getEndOffset();
+		ITextRegion lastRegion = startStructuredDocumentRegion.getLastRegion();
+		if (lastRegion.getType() == DOMRegionContext.XML_TAG_CLOSE) {
+			index--;
+			lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1);
+		}
+		else if (lastRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+			index = index - 2;
+			lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1);
+		}
+		MultiTextEdit multiTextEdit = new MultiTextEdit();
+		try {
+			for (int i = 0; i < fRequiredAttrs.size(); i++) {
+				CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) fRequiredAttrs.get(i);
+				String requiredAttributeName = attrDecl.getAttrName();
+				String defaultValue = attrDecl.getDefaultValue();
+				if (defaultValue == null) {
+					defaultValue = ""; //$NON-NLS-1$
+				}
+				String nameAndDefaultValue = " "; //$NON-NLS-1$
+				if ((i == 0) && (lastRegion.getLength() > lastRegion.getTextLength())) {
+					nameAndDefaultValue = ""; //$NON-NLS-1$
+				}
+				nameAndDefaultValue += requiredAttributeName + "=\"" + defaultValue + "\""; //$NON-NLS-1$//$NON-NLS-2$
+				multiTextEdit.addChild(new InsertEdit(index, nameAndDefaultValue));
+				// BUG3381: MultiTextEdit applies all child TextEdit's basing
+				// on offsets
+				// in the document before the first TextEdit, not after each
+				// child TextEdit. Therefore, do not need to advance the
+				// index.
+				// index += nameAndDefaultValue.length();
+			}
+			multiTextEdit.apply(viewer.getDocument());
+		}
+		catch (BadLocationException e) {
+			// log, for now, unless we find there's reasons why we get some
+			// here.
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo()
+	 */
+	public String getAdditionalProposalInfo() {
+		return XMLUIMessages.InsertRequiredAttrsQuickAssistProposal_0;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getContextInformation()
+	 */
+	public IContextInformation getContextInformation() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
+	 */
+	public String getDisplayString() {
+		return XMLUIMessages.InsertRequiredAttrsQuickAssistProposal_1;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
+	 */
+	public Image getImage() {
+		// return JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_LOCAL);
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ADD_CORRECTION);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection(org.eclipse.jface.text.IDocument)
+	 */
+	public Point getSelection(IDocument document) {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#selected(org.eclipse.jface.text.ITextViewer,
+	 *      boolean)
+	 */
+	public void selected(ITextViewer viewer, boolean smartToggle) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#unselected(org.eclipse.jface.text.ITextViewer)
+	 */
+	public void unselected(ITextViewer viewer) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#validate(org.eclipse.jface.text.IDocument,
+	 *      int, org.eclipse.jface.text.DocumentEvent)
+	 */
+	public boolean validate(IDocument document, int offset, DocumentEvent event) {
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/ProblemIDsXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/ProblemIDsXML.java
new file mode 100644
index 0000000..8bebba4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/ProblemIDsXML.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+public interface ProblemIDsXML extends org.eclipse.wst.xml.core.internal.validation.ProblemIDsXML {
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/QuickAssistProcessorXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/QuickAssistProcessorXML.java
new file mode 100644
index 0000000..486c6c9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/QuickAssistProcessorXML.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.correction.IQuickAssistProcessor;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor and XMLQuickAssistProcessor
+ */
+public class QuickAssistProcessorXML implements IQuickAssistProcessor {
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.correction.IQuickAssistProcessor#canAssist(org.eclipse.wst.sse.core.text.IStructuredDocument,
+	 *      int)
+	 */
+	public boolean canAssist(StructuredTextViewer viewer, int offset) {
+		return true;
+	}
+
+	/**
+	 * @param proposals
+	 * @param viewer
+	 * @param offset
+	 */
+	protected void getInsertRequiredAttrs(ArrayList proposals, StructuredTextViewer viewer, int offset) {
+		IDOMNode node = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
+		if ((node != null) && (node.getNodeType() == Node.ELEMENT_NODE)) {
+			IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
+			if ((startStructuredDocumentRegion != null) && startStructuredDocumentRegion.containsOffset(offset)) {
+				IDOMNode cursorNode = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
+				List requiredAttrs = getRequiredAttrs(cursorNode);
+				if (requiredAttrs.size() > 0) {
+					NamedNodeMap currentAttrs = node.getAttributes();
+					List insertAttrs = new ArrayList();
+					if (currentAttrs.getLength() == 0) {
+						insertAttrs.addAll(requiredAttrs);
+					}
+					else {
+						for (int i = 0; i < requiredAttrs.size(); i++) {
+							String requiredAttrName = ((CMAttributeDeclaration) requiredAttrs.get(i)).getAttrName();
+							boolean found = false;
+							for (int j = 0; j < currentAttrs.getLength(); j++) {
+								String currentAttrName = currentAttrs.item(j).getNodeName();
+								if (requiredAttrName.compareToIgnoreCase(currentAttrName) == 0) {
+									found = true;
+									break;
+								}
+							}
+							if (!found) {
+								insertAttrs.add(requiredAttrs.get(i));
+							}
+						}
+					}
+					if (insertAttrs.size() > 0) {
+						proposals.add(new InsertRequiredAttrsQuickAssistProposal(insertAttrs));
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * @param proposals
+	 * @param viewer
+	 * @param offset
+	 */
+	protected void getLocalRenameQuickAssistProposal(ArrayList proposals, StructuredTextViewer viewer, int offset) {
+		IDOMNode node = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
+		IStructuredDocumentRegion startStructuredDocumentRegion = node == null ? null : node.getStartStructuredDocumentRegion();
+		IStructuredDocumentRegion endStructuredDocumentRegion = node == null ? null : node.getEndStructuredDocumentRegion();
+
+		ITextRegion region = null;
+		int regionTextEndOffset = 0;
+		if ((startStructuredDocumentRegion != null) && startStructuredDocumentRegion.containsOffset(offset)) {
+			region = startStructuredDocumentRegion.getRegionAtCharacterOffset(offset);
+			regionTextEndOffset = startStructuredDocumentRegion.getTextEndOffset(region);
+		}
+		else if ((endStructuredDocumentRegion != null) && endStructuredDocumentRegion.containsOffset(offset)) {
+			region = endStructuredDocumentRegion.getRegionAtCharacterOffset(offset);
+			regionTextEndOffset = endStructuredDocumentRegion.getTextEndOffset(region);
+		}
+
+		if ((region != null) && ((region.getType() == DOMRegionContext.XML_TAG_NAME) || (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)) && (offset <= regionTextEndOffset)) {
+			proposals.add(new RenameInFileQuickAssistProposal());
+		}
+	}
+
+	protected ModelQuery getModelQuery(Node node) {
+		if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			return ModelQueryUtil.getModelQuery((Document) node);
+		}
+		else {
+			return ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.correction.IQuickAssistProcessor#getProposals(org.eclipse.wst.sse.core.text.IStructuredDocument,
+	 *      int)
+	 */
+	public ICompletionProposal[] getProposals(StructuredTextViewer viewer, int offset) throws CoreException {
+		ArrayList proposals = new ArrayList();
+
+		getLocalRenameQuickAssistProposal(proposals, viewer, offset);
+		getSurroundWithNewElementQuickAssistProposal(proposals, viewer, offset);
+		getInsertRequiredAttrs(proposals, viewer, offset);
+
+		return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
+	}
+
+	protected List getRequiredAttrs(Node node) {
+		List result = new ArrayList();
+
+		ModelQuery modelQuery = getModelQuery(node);
+		if (modelQuery != null) {
+			CMElementDeclaration elementDecl = modelQuery.getCMElementDeclaration((Element) node);
+			if (elementDecl != null) {
+				CMNamedNodeMap attrMap = elementDecl.getAttributes();
+
+				CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attrMap);
+				List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element)node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+				for (int k = 0; k < nodes.size(); k++) {
+					CMNode cmnode = (CMNode) nodes.get(k);
+					if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+						allAttributes.put(cmnode);
+					}
+				}
+				attrMap = allAttributes;
+				
+				Iterator it = attrMap.iterator();
+				CMAttributeDeclaration attr = null;
+				while (it.hasNext()) {
+					attr = (CMAttributeDeclaration) it.next();
+					if (attr.getUsage() == CMAttributeDeclaration.REQUIRED) {
+						result.add(attr);
+					}
+				}
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * @param proposals
+	 * @param viewer
+	 * @param offset
+	 */
+	protected void getSurroundWithNewElementQuickAssistProposal(ArrayList proposals, StructuredTextViewer viewer, int offset) {
+		IDOMNode node = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
+		if (node != null) {
+			proposals.add(new SurroundWithNewElementQuickAssistProposal());
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/QuickFixProcessorXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/QuickFixProcessorXML.java
new file mode 100644
index 0000000..600824f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/QuickFixProcessorXML.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.sse.ui.internal.correction.IQuickFixProcessor;
+import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
+import org.eclipse.wst.xml.core.internal.validation.ProblemIDsXML;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+/**
+ * @deprecated since 2.0 RC0 Use
+ *             org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+ */
+public class QuickFixProcessorXML implements IQuickFixProcessor {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.correction.IQuickFixProcessor#canFix(int)
+	 */
+	public boolean canFix(Annotation annotation) {
+		boolean result = false;
+
+		if (annotation instanceof TemporaryAnnotation) {
+			TemporaryAnnotation tempAnnotation = (TemporaryAnnotation) annotation;
+			int problemID = tempAnnotation.getProblemID();
+			switch (problemID) {
+				case ProblemIDsXML.EmptyTag :
+				case ProblemIDsXML.MissingEndTag :
+				case ProblemIDsXML.AttrsInEndTag :
+				case ProblemIDsXML.MissingAttrValue :
+				case ProblemIDsXML.NoAttrValue :
+				case ProblemIDsXML.SpacesBeforeTagName :
+				case ProblemIDsXML.SpacesBeforePI :
+				case ProblemIDsXML.NamespaceInPI :
+				case ProblemIDsXML.UnknownElement :
+				case ProblemIDsXML.UnknownAttr :
+				case ProblemIDsXML.InvalidAttrValue :
+				case ProblemIDsXML.MissingRequiredAttr :
+				case ProblemIDsXML.AttrValueNotQuoted :
+				case ProblemIDsXML.MissingClosingBracket :
+					result = true;
+			}
+		}
+
+		return result;
+	}
+
+	public Image getImage() {
+		// return
+		// JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE);
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_CORRECTION_CHANGE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.correction.IQuickFixProcessor#getProposals(org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation)
+	 */
+	public ICompletionProposal[] getProposals(Annotation annotation) throws CoreException {
+		ArrayList proposals = new ArrayList();
+
+		if (annotation instanceof TemporaryAnnotation) {
+			TemporaryAnnotation tempAnnotation = (TemporaryAnnotation) annotation;
+			int problemID = tempAnnotation.getProblemID();
+			switch (problemID) {
+				case ProblemIDsXML.EmptyTag :
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_0, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.MissingEndTag :
+					String tagName = (String) ((Object[]) tempAnnotation.getAdditionalFixInfo())[0];
+					String tagClose = (String) ((Object[]) tempAnnotation.getAdditionalFixInfo())[1];
+					int tagCloseOffset = ((Integer) ((Object[]) tempAnnotation.getAdditionalFixInfo())[2]).intValue();
+					int startTagEndOffset = ((Integer) ((Object[]) tempAnnotation.getAdditionalFixInfo())[3]).intValue();
+					int firstChildStartOffset = ((Integer) ((Object[]) tempAnnotation.getAdditionalFixInfo())[4]).intValue();
+					int endOffset = ((Integer) ((Object[]) tempAnnotation.getAdditionalFixInfo())[5]).intValue();
+					proposals.add(new CompletionProposal(tagClose, tagCloseOffset, 0, 0, getImage(), XMLUIMessages.QuickFixProcessorXML_1, null, "")); //$NON-NLS-1$ 
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), startTagEndOffset - tempAnnotation.getPosition().getOffset(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_2, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					proposals.add(new CompletionProposal("</" + tagName + ">", firstChildStartOffset, 0, 0, getImage(), XMLUIMessages.QuickFixProcessorXML_3, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+					proposals.add(new CompletionProposal("</" + tagName + ">", endOffset, 0, 0, getImage(), XMLUIMessages.QuickFixProcessorXML_4, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+					break;
+				case ProblemIDsXML.AttrsInEndTag :
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_5, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.MissingAttrValue :
+					String defaultAttrValue = (String) ((Object[]) tempAnnotation.getAdditionalFixInfo())[0];
+					int insertOffset = ((Integer) ((Object[]) tempAnnotation.getAdditionalFixInfo())[1]).intValue();
+					proposals.add(new CompletionProposal("\"" + defaultAttrValue + "\"", tempAnnotation.getPosition().getOffset() + tempAnnotation.getPosition().getLength() + insertOffset, 0, defaultAttrValue.length() + 2, getImage(), XMLUIMessages.QuickFixProcessorXML_6, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_7, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.NoAttrValue :
+					defaultAttrValue = (String) tempAnnotation.getAdditionalFixInfo();
+					proposals.add(new CompletionProposal("=\"" + defaultAttrValue + "\"", tempAnnotation.getPosition().getOffset() + tempAnnotation.getPosition().getLength(), 0, defaultAttrValue.length() + 3, getImage(), XMLUIMessages.QuickFixProcessorXML_6, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_7, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.SpacesBeforeTagName :
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_8, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.SpacesBeforePI :
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_9, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.NamespaceInPI :
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_10, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.UnknownElement :
+					proposals.add(new RemoveUnknownElementQuickFixProposal(tempAnnotation.getAdditionalFixInfo(), getImage(), XMLUIMessages.QuickFixProcessorXML_11));
+					proposals.add(new RenameInFileQuickAssistProposal());
+					break;
+				case ProblemIDsXML.UnknownAttr :
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_7, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					proposals.add(new RenameInFileQuickAssistProposal());
+					break;
+				case ProblemIDsXML.InvalidAttrValue :
+					proposals.add(new CompletionProposal("", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_12, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				case ProblemIDsXML.MissingRequiredAttr :
+					String requiredAttr = (String) ((Object[]) tempAnnotation.getAdditionalFixInfo())[0];
+					insertOffset = ((Integer) ((Object[]) tempAnnotation.getAdditionalFixInfo())[1]).intValue();
+					proposals.add(new CompletionProposal(requiredAttr, tempAnnotation.getPosition().getOffset() + insertOffset, 0, requiredAttr.length(), getImage(), XMLUIMessages.QuickFixProcessorXML_13, null, "")); //$NON-NLS-1$ 
+					break;
+				case ProblemIDsXML.AttrValueNotQuoted :
+					String attrValue = (String) tempAnnotation.getAdditionalFixInfo();
+					proposals.add(new CompletionProposal("\"" + attrValue + "\"", tempAnnotation.getPosition().getOffset(), tempAnnotation.getPosition().getLength(), attrValue.length() + 2, getImage(), XMLUIMessages.QuickFixProcessorXML_14, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+					break;
+				case ProblemIDsXML.MissingClosingBracket :
+					proposals.add(new CompletionProposal(">", tempAnnotation.getPosition().getOffset() + tempAnnotation.getPosition().getLength(), 0, 1, getImage(), XMLUIMessages.QuickFixProcessorXML_15, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+			}
+		}
+
+		return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/RemoveUnknownElementQuickFixProposal.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/RemoveUnknownElementQuickFixProposal.java
new file mode 100644
index 0000000..b87a2c9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/RemoveUnknownElementQuickFixProposal.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.text.edits.DeleteEdit;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class RemoveUnknownElementQuickFixProposal implements ICompletionProposal, ICompletionProposalExtension2 {
+	private Object fAdditionalFixInfo = null;
+	private String fDisplayString;
+	private Image fImage;
+	private Point fSelection; // initialized by apply()
+
+	public RemoveUnknownElementQuickFixProposal(Object additionalFixInfo, Image image, String displayString) {
+		fAdditionalFixInfo = additionalFixInfo;
+		fImage = image;
+		fDisplayString = displayString;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#apply(org.eclipse.jface.text.IDocument)
+	 */
+	public void apply(IDocument document) {
+		// not implemented?
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#apply(org.eclipse.jface.text.ITextViewer,
+	 *      char, int, int)
+	 */
+	public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
+		int startTagOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[0]).intValue();
+		int startTagLength = ((Integer) ((Object[]) fAdditionalFixInfo)[1]).intValue();
+		int endTagOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[2]).intValue();
+		int endTagLength = ((Integer) ((Object[]) fAdditionalFixInfo)[3]).intValue();
+
+		MultiTextEdit multiTextEdit = new MultiTextEdit();
+		if (endTagOffset != -1) {
+			multiTextEdit.addChild(new DeleteEdit(endTagOffset, endTagLength));
+			fSelection = new Point(endTagOffset, 0);
+		}
+		if (startTagOffset != -1) {
+			multiTextEdit.addChild(new DeleteEdit(startTagOffset, startTagLength));
+			fSelection = new Point(startTagOffset, 0);
+		}
+
+		try {
+			multiTextEdit.apply(viewer.getDocument());
+		}
+		catch (MalformedTreeException e) {
+			// log for now, unless find reasons not to.
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+		catch (BadLocationException e) {
+			// log for now, unless find reasons not to.
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo()
+	 */
+	public String getAdditionalProposalInfo() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getContextInformation()
+	 */
+	public IContextInformation getContextInformation() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
+	 */
+	public String getDisplayString() {
+		if (fDisplayString == null) {
+			fDisplayString = XMLUIMessages.QuickFixProcessorXML_11;
+		}
+
+		return fDisplayString;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
+	 */
+	public Image getImage() {
+		return fImage;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection(org.eclipse.jface.text.IDocument)
+	 */
+	public Point getSelection(IDocument document) {
+		return fSelection;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#selected(org.eclipse.jface.text.ITextViewer,
+	 *      boolean)
+	 */
+	public void selected(ITextViewer viewer, boolean smartToggle) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#unselected(org.eclipse.jface.text.ITextViewer)
+	 */
+	public void unselected(ITextViewer viewer) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#validate(org.eclipse.jface.text.IDocument,
+	 *      int, org.eclipse.jface.text.DocumentEvent)
+	 */
+	public boolean validate(IDocument document, int offset, DocumentEvent event) {
+		return false;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/RenameInFileQuickAssistProposal.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/RenameInFileQuickAssistProposal.java
new file mode 100644
index 0000000..d299f25
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/RenameInFileQuickAssistProposal.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.link.LinkedModeModel;
+import org.eclipse.jface.text.link.LinkedModeUI;
+import org.eclipse.jface.text.link.LinkedPosition;
+import org.eclipse.jface.text.link.LinkedPositionGroup;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.texteditor.link.EditorLinkedModeUI;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+public class RenameInFileQuickAssistProposal implements ICompletionProposal, ICompletionProposalExtension2 {
+	protected IRegion fSelectedRegion; // initialized by apply()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#apply(org.eclipse.jface.text.IDocument)
+	 */
+	public void apply(IDocument document) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#apply(org.eclipse.jface.text.ITextViewer,
+	 *      char, int, int)
+	 */
+	public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
+		IDocument document = viewer.getDocument();
+		LinkedPositionGroup group = new LinkedPositionGroup();
+		try {
+				IDOMNode node = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
+				IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
+				ITextRegion region = (startStructuredDocumentRegion == null) ? null : startStructuredDocumentRegion.getRegionAtCharacterOffset(offset);
+				if (region != null) {
+					group.addPosition(new LinkedPosition(document, startStructuredDocumentRegion.getStartOffset() + region.getStart(), region.getTextLength(), 0));
+
+					if ((region.getType() == DOMRegionContext.XML_TAG_NAME) && (node.getEndStructuredDocumentRegion() != null)) {
+						region = node.getEndStructuredDocumentRegion().getRegions().get(1);
+						if (region != null) {
+							group.addPosition(new LinkedPosition(document, node.getEndStructuredDocumentRegion().getStartOffset() + region.getStart(), region.getTextLength(), 1));
+						}
+					}
+				}
+				else {
+					IStructuredDocumentRegion endStructuredDocumentRegion = node.getEndStructuredDocumentRegion();
+					region = (endStructuredDocumentRegion == null) ? null : endStructuredDocumentRegion.getRegionAtCharacterOffset(offset);
+					if (region != null) {
+						if ((region.getType() == DOMRegionContext.XML_TAG_NAME) && (node.getStartStructuredDocumentRegion() != null)) {
+							ITextRegion startTagNameRegion = node.getStartStructuredDocumentRegion().getRegions().get(1);
+							if (region != null) {
+								group.addPosition(new LinkedPosition(document, node.getStartStructuredDocumentRegion().getStartOffset() + startTagNameRegion.getStart(), startTagNameRegion.getTextLength(), 0));
+								group.addPosition(new LinkedPosition(document, endStructuredDocumentRegion.getStartOffset() + region.getStart(), region.getTextLength(), 1));
+							}
+						}
+						else {
+							group.addPosition(new LinkedPosition(document, endStructuredDocumentRegion.getStartOffset() + region.getStart(), region.getTextLength(), 0));
+						}
+					}
+				}
+
+				// TODO CompletionProposalPopup#insertProposal() calls
+				// IRewriteTarget.beginCompoundChange()
+				// which disables redraw in ITextViewer. Workaround for now.
+				if(viewer instanceof ITextViewerExtension)
+					((ITextViewerExtension) viewer).setRedraw(true);
+
+			LinkedModeModel linkedModeModel = new LinkedModeModel();
+			linkedModeModel.addGroup(group);
+			linkedModeModel.forceInstall();
+
+			LinkedModeUI ui = new EditorLinkedModeUI(linkedModeModel, viewer);
+			ui.setExitPosition(viewer, offset, 0, LinkedPositionGroup.NO_STOP);
+			ui.enter();
+
+			fSelectedRegion = ui.getSelectedRegion();
+		}
+		catch (BadLocationException e) {
+			// log for now, unless find reason not to
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo()
+	 */
+	public String getAdditionalProposalInfo() {
+		return XMLUIMessages.RenameInFileQuickAssistProposal_0;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getContextInformation()
+	 */
+	public IContextInformation getContextInformation() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
+	 */
+	public String getDisplayString() {
+		return XMLUIMessages.RenameInFileQuickAssistProposal_1;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
+	 */
+	public Image getImage() {
+		// return JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_LOCAL);
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_LOCAL_VARIABLE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection(org.eclipse.jface.text.IDocument)
+	 */
+	public Point getSelection(IDocument document) {
+		return new Point(fSelectedRegion.getOffset(), fSelectedRegion.getLength());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#selected(org.eclipse.jface.text.ITextViewer,
+	 *      boolean)
+	 */
+	public void selected(ITextViewer viewer, boolean smartToggle) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#unselected(org.eclipse.jface.text.ITextViewer)
+	 */
+	public void unselected(ITextViewer viewer) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#validate(org.eclipse.jface.text.IDocument,
+	 *      int, org.eclipse.jface.text.DocumentEvent)
+	 */
+	public boolean validate(IDocument document, int offset, DocumentEvent event) {
+		return false;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/SurroundWithNewElementQuickAssistProposal.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/SurroundWithNewElementQuickAssistProposal.java
new file mode 100644
index 0000000..7baffc8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/SurroundWithNewElementQuickAssistProposal.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.text.edits.InsertEdit;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.provisional.format.FormatProcessorXML;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+import org.w3c.dom.Node;
+
+public class SurroundWithNewElementQuickAssistProposal extends RenameInFileQuickAssistProposal {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#apply(org.eclipse.jface.text.ITextViewer,
+	 *      char, int, int)
+	 */
+	public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
+		try {
+			int startTagOffset = offset;
+			int endTagOffset = offset + viewer.getSelectedRange().y;
+
+			// surround the node if no selection
+			if (startTagOffset == endTagOffset) {
+				IDOMNode cursorNode = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
+				// use parent node if text node is empty
+				if ((cursorNode.getNodeType() == Node.TEXT_NODE) && (cursorNode.getNodeValue().trim().length() == 0)) {
+					cursorNode = (IDOMNode) cursorNode.getParentNode();
+				}
+
+				startTagOffset = cursorNode.getStartOffset();
+				endTagOffset = cursorNode.getEndOffset();
+			}
+
+			// insert new element
+			MultiTextEdit multiTextEdit = new MultiTextEdit();
+			// element tag name cannot be DBCS, do not translate "<element>"
+			// and "</element>"
+			multiTextEdit.addChild(new InsertEdit(startTagOffset, "<element>")); //$NON-NLS-1$
+			multiTextEdit.addChild(new InsertEdit(endTagOffset, "</element>")); //$NON-NLS-1$
+			multiTextEdit.apply(viewer.getDocument());
+
+			// get new element node
+			IDOMNode newElementNode = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, startTagOffset);
+
+			// format new element
+			IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+			formatProcessor.formatNode(newElementNode);
+
+			// rename new element
+			super.apply(viewer, trigger, stateMask, newElementNode.getStartOffset() + 1);
+		}
+		catch (MalformedTreeException e) {
+			// log for now, unless find reason not to
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+		catch (BadLocationException e) {
+			// log for now, unless find reason not to
+			Logger.log(Logger.INFO, e.getMessage());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo()
+	 */
+	public String getAdditionalProposalInfo() {
+		return XMLUIMessages.SurroundWithNewElementQuickAssistProposal_0;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
+	 */
+	public String getDisplayString() {
+		return XMLUIMessages.SurroundWithNewElementQuickAssistProposal_1;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
+	 */
+	public Image getImage() {
+		// return JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_LOCAL);
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ADD_CORRECTION);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/XMLQuickAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/XMLQuickAssistProcessor.java
new file mode 100644
index 0000000..4649e94
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/correction/XMLQuickAssistProcessor.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.correction;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class XMLQuickAssistProcessor implements IQuickAssistProcessor {
+
+	public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
+		return true;
+	}
+
+	public boolean canFix(Annotation annotation) {
+		return false;
+	}
+
+	public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext invocationContext) {
+		List proposals = new ArrayList();
+
+		getLocalRenameQuickAssistProposal(proposals, invocationContext.getSourceViewer(), invocationContext.getOffset());
+		getSurroundWithNewElementQuickAssistProposal(proposals, invocationContext.getSourceViewer(), invocationContext.getOffset());
+		getInsertRequiredAttrs(proposals, invocationContext.getSourceViewer(), invocationContext.getOffset());
+
+		return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
+	}
+
+	public String getErrorMessage() {
+		return null;
+	}
+
+	private void getInsertRequiredAttrs(List proposals, ISourceViewer viewer, int offset) {
+		IDOMNode node = (IDOMNode) getNodeAt(viewer, offset);
+		if ((node != null) && (node.getNodeType() == Node.ELEMENT_NODE)) {
+			IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
+			if ((startStructuredDocumentRegion != null) && startStructuredDocumentRegion.containsOffset(offset)) {
+				IDOMNode cursorNode = (IDOMNode) getNodeAt(viewer, offset);
+				List requiredAttrs = getRequiredAttrs(cursorNode);
+				if (requiredAttrs.size() > 0) {
+					NamedNodeMap currentAttrs = node.getAttributes();
+					List insertAttrs = new ArrayList();
+					if (currentAttrs.getLength() == 0) {
+						insertAttrs.addAll(requiredAttrs);
+					}
+					else {
+						for (int i = 0; i < requiredAttrs.size(); i++) {
+							String requiredAttrName = ((CMAttributeDeclaration) requiredAttrs.get(i)).getAttrName();
+							boolean found = false;
+							for (int j = 0; j < currentAttrs.getLength(); j++) {
+								String currentAttrName = currentAttrs.item(j).getNodeName();
+								if (requiredAttrName.compareToIgnoreCase(currentAttrName) == 0) {
+									found = true;
+									break;
+								}
+							}
+							if (!found) {
+								insertAttrs.add(requiredAttrs.get(i));
+							}
+						}
+					}
+					if (insertAttrs.size() > 0) {
+						proposals.add(new InsertRequiredAttrsQuickAssistProposal(insertAttrs));
+					}
+				}
+			}
+		}
+	}
+
+	private void getLocalRenameQuickAssistProposal(List proposals, ISourceViewer viewer, int offset) {
+		IDOMNode node = (IDOMNode) getNodeAt(viewer, offset);
+		IStructuredDocumentRegion startStructuredDocumentRegion = node == null ? null : node.getStartStructuredDocumentRegion();
+		IStructuredDocumentRegion endStructuredDocumentRegion = node == null ? null : node.getEndStructuredDocumentRegion();
+
+		ITextRegion region = null;
+		int regionTextEndOffset = 0;
+		if ((startStructuredDocumentRegion != null) && startStructuredDocumentRegion.containsOffset(offset)) {
+			region = startStructuredDocumentRegion.getRegionAtCharacterOffset(offset);
+			regionTextEndOffset = startStructuredDocumentRegion.getTextEndOffset(region);
+		}
+		else if ((endStructuredDocumentRegion != null) && endStructuredDocumentRegion.containsOffset(offset)) {
+			region = endStructuredDocumentRegion.getRegionAtCharacterOffset(offset);
+			regionTextEndOffset = endStructuredDocumentRegion.getTextEndOffset(region);
+		}
+
+		if ((region != null) && ((region.getType() == DOMRegionContext.XML_TAG_NAME) || (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)) && (offset <= regionTextEndOffset)) {
+			proposals.add(new RenameInFileQuickAssistProposal());
+		}
+	}
+
+	private ModelQuery getModelQuery(Node node) {
+		if (node.getNodeType() == Node.DOCUMENT_NODE) {
+			return ModelQueryUtil.getModelQuery((Document) node);
+		}
+		else {
+			return ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+		}
+	}
+
+	private List getRequiredAttrs(Node node) {
+		List result = new ArrayList();
+
+		ModelQuery modelQuery = getModelQuery(node);
+		if (modelQuery != null) {
+			CMElementDeclaration elementDecl = modelQuery.getCMElementDeclaration((Element) node);
+			if (elementDecl != null) {
+				CMNamedNodeMap attrMap = elementDecl.getAttributes();
+
+				CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attrMap);
+				List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+				for (int k = 0; k < nodes.size(); k++) {
+					CMNode cmnode = (CMNode) nodes.get(k);
+					if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+						allAttributes.put(cmnode);
+					}
+				}
+				attrMap = allAttributes;
+				
+				Iterator it = attrMap.iterator();
+				CMAttributeDeclaration attr = null;
+				while (it.hasNext()) {
+					attr = (CMAttributeDeclaration) it.next();
+					if (attr.getUsage() == CMAttributeDeclaration.REQUIRED) {
+						result.add(attr);
+					}
+				}
+			}
+		}
+
+		return result;
+	}
+
+	private void getSurroundWithNewElementQuickAssistProposal(List proposals, ISourceViewer viewer, int offset) {
+		IDOMNode node = (IDOMNode) getNodeAt(viewer, offset);
+		if (node != null) {
+			proposals.add(new SurroundWithNewElementQuickAssistProposal());
+		}
+	}
+
+	/**
+	 * Returns the closest IndexedRegion for the offset and viewer allowing
+	 * for differences between viewer offsets and model positions. note: this
+	 * method returns an IndexedRegion for read only
+	 * 
+	 * @param viewer
+	 *            the viewer whose document is used to compute the proposals
+	 * @param documentOffset
+	 *            an offset within the document for which completions should
+	 *            be computed
+	 * @return an IndexedRegion
+	 */
+	private IndexedRegion getNodeAt(ITextViewer viewer, int documentOffset) {
+		// copied from ContentAssistUtils.getNodeAt()
+		if (viewer == null)
+			return null;
+
+		IndexedRegion node = null;
+		IModelManager mm = StructuredModelManager.getModelManager();
+		IStructuredModel model = null;
+		if (mm != null)
+			model = mm.getExistingModelForRead(viewer.getDocument());
+		try {
+			if (model != null) {
+				int lastOffset = documentOffset;
+				node = model.getIndexedRegion(documentOffset);
+				while (node == null && lastOffset >= 0) {
+					lastOffset--;
+					node = model.getIndexedRegion(lastOffset);
+				}
+			}
+		}
+		finally {
+			if (model != null)
+				model.releaseFromRead();
+		}
+		return node;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditAttributeDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditAttributeDialog.java
new file mode 100644
index 0000000..e95af80
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditAttributeDialog.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+
+public class EditAttributeDialog extends Dialog implements ModifyListener {
+	protected Attr attribute;
+	protected String attributeName;
+	protected Text attributeNameField;
+	protected String attributeValue;
+	protected Text attributeValueField;
+	protected Label errorMessageLabel;
+	protected Button okButton;
+	protected Element ownerElement;
+
+	public EditAttributeDialog(Shell parentShell, Element ownerElement, Attr attribute) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.ownerElement = ownerElement;
+		this.attribute = attribute;
+	}
+
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			attributeName = getModelValue(attributeNameField.getText());
+			attributeValue = attributeValueField.getText();
+		}
+		super.buttonPressed(buttonId);
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+	protected Control createContents(Composite parent) {
+		Control control = super.createContents(parent);
+		attributeNameField.forceFocus();
+		attributeNameField.selectAll();
+		updateErrorMessage();
+		return control;
+	}
+
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogArea, XMLCommonUIContextIds.XCUI_ATTRIBUTE_DIALOG);
+
+		Composite composite = new Composite(dialogArea, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+
+		//
+		// Style convenience constants
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		Label attributeNameLabel = new Label(composite, SWT.NONE);
+		attributeNameLabel.setText(XMLUIMessages._UI_LABEL_NAME_COLON);
+
+		attributeNameField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 300;
+		attributeNameField.setLayoutData(gd);
+		attributeNameField.setText(getDisplayValue(attribute != null ? attribute.getName() : "")); //$NON-NLS-1$
+		attributeNameField.addModifyListener(this);
+
+		Label attributeValueLabel = new Label(composite, SWT.NONE);
+		attributeValueLabel.setText(XMLUIMessages._UI_LABEL_VALUE_COLON);
+
+		String value = attribute != null ? attribute.getValue() : ""; //$NON-NLS-1$
+		int style = SWT.SINGLE | SWT.BORDER;
+		if (value.indexOf("\n") != -1) { //$NON-NLS-1$
+			style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL;
+		}
+
+		attributeValueField = new Text(composite, style);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 300;
+		attributeValueField.setLayoutData(gd);
+		attributeValueField.setText(getDisplayValue(attribute != null ? attribute.getValue() : "")); //$NON-NLS-1$
+
+		// error message
+		errorMessageLabel = new Label(composite, SWT.WRAP);
+		errorMessageLabel.setText(XMLUIMessages.error_message_goes_here);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 200;
+		gd.heightHint = Math.max(30, errorMessageLabel.computeSize(0, 0, false).y * 2);
+		gd.horizontalSpan = 2;
+		errorMessageLabel.setLayoutData(gd);
+		Color color = new Color(errorMessageLabel.getDisplay(), 200, 0, 0);
+		errorMessageLabel.setForeground(color);
+
+		return dialogArea;
+	}
+
+	public String getAttributeName() {
+		return attributeName;
+	}
+
+	public String getAttributeValue() {
+		return attributeValue;
+	}
+
+	protected String getDisplayValue(String string) {
+		return string != null ? string : ""; //$NON-NLS-1$
+	}
+
+	protected String getModelValue(String string) {
+		String result = null;
+		if ((string != null) && (string.trim().length() > 0)) {
+			result = string;
+		}
+		return result;
+	}
+
+	public void modifyText(ModifyEvent e) {
+		updateErrorMessage();
+	}
+
+	protected void updateErrorMessage() {
+		String errorMessage = null;
+		String name = attributeNameField.getText().trim();
+		if (name.length() > 0) {
+			Attr matchingAttribute = ownerElement.getAttributeNode(name);
+			if ((matchingAttribute != null) && (matchingAttribute != attribute)) {
+				errorMessage = XMLUIMessages._ERROR_XML_ATTRIBUTE_ALREADY_EXISTS;
+			}
+			else {
+				// TODO get checkName from Model
+				// errorMessage = ValidateHelper.checkXMLName(name);
+			}
+		}
+		else {
+			errorMessage = ""; //$NON-NLS-1$
+		}
+
+		errorMessageLabel.setText(errorMessage != null ? errorMessage : ""); //$NON-NLS-1$
+		errorMessageLabel.getParent().layout();
+		okButton.setEnabled(errorMessage == null);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditDoctypeDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditDoctypeDialog.java
new file mode 100644
index 0000000..6e071ba
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditDoctypeDialog.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *	   David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;
+import org.w3c.dom.DocumentType;
+
+public class EditDoctypeDialog extends Dialog {
+	protected boolean computeSystemId;
+	protected String[] doctypeData;
+	protected boolean errorChecking;
+	protected Label errorMessageLabel;
+	protected Button okButton;
+	protected Button publicIdBrowseButton;
+	protected Text publicIdField;
+	protected IPath resourceLocation;
+	protected Text rootElementNameField;
+	protected Button systemIdBrowseButton;
+	protected Text systemIdField;
+
+	public EditDoctypeDialog(Shell parentShell, DocumentType doctype) {
+		this(parentShell, doctype.getName(), doctype.getPublicId(), doctype.getSystemId());
+	}
+
+	public EditDoctypeDialog(Shell parentShell, String name, String publicId, String systemId) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		doctypeData = new String[3];
+		doctypeData[0] = name;
+		doctypeData[1] = publicId;
+		doctypeData[2] = systemId;
+	}
+
+	protected void buttonPressed(int buttonId) {
+		doctypeData[0] = getModelValue(rootElementNameField.getText());
+		doctypeData[1] = getModelValue(publicIdField.getText());
+		doctypeData[2] = getModelValue(systemIdField.getText());
+		super.buttonPressed(buttonId);
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+
+	protected Control createContents(Composite parent) {
+		Control control = super.createContents(parent);
+		updateErrorMessage();
+		return control;
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogControl = (Composite) super.createDialogArea(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogControl, XMLCommonUIContextIds.XCUI_DOCTYPE_DIALOG);
+
+		Composite composite = new Composite(dialogControl, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 3;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+
+		ModifyListener modifyListener = new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				if (e.widget == systemIdField) {
+					computeSystemId = false;
+				}
+				updateErrorMessage();
+			}
+		};
+
+		// row 1
+		//
+		Label rootElementNameLabel = new Label(composite, SWT.NONE);
+		rootElementNameLabel.setText(XMLUIMessages._UI_LABEL_ROOT_ELEMENT_NAME_COLON);
+
+		rootElementNameField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(rootElementNameField, XMLCommonUIContextIds.XCUI_DOCTYPE_ROOT);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 200;
+		rootElementNameField.setLayoutData(gd);
+		rootElementNameField.setText(getDisplayValue(doctypeData[0]));
+		rootElementNameField.addModifyListener(modifyListener);
+
+		Label placeHolder = new Label(composite, SWT.NONE);
+		placeHolder.setLayoutData(new GridData());
+
+		// row 2
+		//
+		Label publicIdLabel = new Label(composite, SWT.NONE);
+		publicIdLabel.setText(XMLUIMessages._UI_LABEL_PUBLIC_ID_COLON);
+
+		publicIdField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(publicIdField, XMLCommonUIContextIds.XCUI_DOCTYPE_PUBLIC);
+		publicIdField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		publicIdField.setText(getDisplayValue(doctypeData[1]));
+
+		SelectionListener selectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				EditEntityHelper helper = new EditEntityHelper();
+				if (e.widget == publicIdBrowseButton) {
+					helper.performBrowseForPublicId(getShell(), publicIdField, computeSystemId ? systemIdField : null);
+				}
+				else if (e.widget == systemIdBrowseButton) {
+					helper.performBrowseForSystemId(getShell(), systemIdField, resourceLocation);
+				}
+			}
+		};
+
+		publicIdBrowseButton = new Button(composite, SWT.NONE);
+		publicIdBrowseButton.setText(XMLUIMessages._UI_LABEL_BROWSE);
+		publicIdBrowseButton.addSelectionListener(selectionListener);
+
+		// row 3
+		Label systemIdLabel = new Label(composite, SWT.NONE);
+		systemIdLabel.setText(XMLUIMessages._UI_LABEL_SYSTEM_ID_COLON);
+
+		systemIdField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(systemIdField, XMLCommonUIContextIds.XCUI_DOCTYPE_SYSTEM);
+		systemIdField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		systemIdField.setText(getDisplayValue(doctypeData[2]));
+		systemIdField.addModifyListener(modifyListener);
+
+
+		systemIdBrowseButton = new Button(composite, SWT.NONE);
+		systemIdBrowseButton.setText(XMLUIMessages._UI_LABEL_BROWSE);
+		systemIdBrowseButton.addSelectionListener(selectionListener);
+
+		// error message
+		errorMessageLabel = new Label(dialogControl, SWT.NONE);
+		errorMessageLabel.setText(""); //$NON-NLS-1$
+		errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		Color color = new Color(errorMessageLabel.getDisplay(), 200, 0, 0);
+		errorMessageLabel.setForeground(color);
+
+		Dialog.applyDialogFont(parent);
+		return dialogControl;
+	}
+
+
+	protected Label createMessageArea(Composite composite) {
+		Label label = new Label(composite, SWT.NONE);
+		// label.setText(message);
+		return label;
+	}
+
+
+	protected String getDisplayValue(String string) {
+		return string != null ? string : ""; //$NON-NLS-1$
+	}
+
+	public boolean getErrorChecking() {
+		return errorChecking;
+	}
+
+
+	protected String getModelValue(String string) {
+		String result = null;
+		if ((string != null) && (string.trim().length() > 0)) {
+			result = string;
+		}
+		return result;
+	}
+
+	public String getName() {
+		return doctypeData[0];
+	}
+
+	public String getPublicId() {
+		return doctypeData[1];
+	}
+
+	public String getSystemId() {
+		return doctypeData[2];
+	}
+
+	public void setComputeSystemId(boolean computeSystemId) {
+		this.computeSystemId = computeSystemId;
+	}
+
+	public void setErrorChecking(boolean errorChecking) {
+		this.errorChecking = errorChecking;
+	}
+
+	public void setResourceLocation(IPath path) {
+		resourceLocation = path;
+	}
+
+	public void updateErrorMessage() {
+		if (errorChecking) {
+			String errorMessage = null;
+			if (getModelValue(systemIdField.getText()) == null) {
+				errorMessage = XMLUIMessages._UI_WARNING_SYSTEM_ID_MUST_BE_SPECIFIED;
+			}
+			else if (getModelValue(rootElementNameField.getText()) == null) {
+				errorMessage = XMLUIMessages._UI_WARNING_ROOT_ELEMENT_MUST_BE_SPECIFIED;
+			}
+
+			errorMessageLabel.setText(errorMessage != null ? errorMessage : ""); //$NON-NLS-1$
+			okButton.setEnabled(errorMessage == null);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditElementDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditElementDialog.java
new file mode 100644
index 0000000..adad381
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditElementDialog.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.core.internal.provisional.NameValidator;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;
+import org.w3c.dom.Element;
+
+public class EditElementDialog extends Dialog implements ModifyListener {
+	protected Element element;
+	protected String elementName;
+	protected Text elementNameField;
+	protected Label errorMessageLabel;
+	protected Button okButton;
+
+	public EditElementDialog(Shell parentShell, Element element) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.element = element;
+	}
+
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			elementName = getModelValue(elementNameField.getText());
+		}
+		super.buttonPressed(buttonId);
+	}
+
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+	protected Control createContents(Composite parent) {
+		Control control = super.createContents(parent);
+		elementNameField.forceFocus();
+		elementNameField.selectAll();
+		updateErrorMessage();
+		return control;
+	}
+
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogArea, XMLCommonUIContextIds.XCUI_ELEMENT_DIALOG);
+
+		Composite composite = new Composite(dialogArea, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		Label elementNameLabel = new Label(composite, SWT.NONE);
+		elementNameLabel.setText(XMLUIMessages._UI_LABEL_ELEMENT_NAME);
+
+		elementNameField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 200;
+		elementNameField.setLayoutData(gd);
+		elementNameField.setText(getDisplayValue(element != null ? element.getNodeName() : "")); //$NON-NLS-1$
+		elementNameField.addModifyListener(this);
+
+		// error message
+		errorMessageLabel = new Label(composite, SWT.NONE);
+		errorMessageLabel.setText(XMLUIMessages.error_message_goes_here);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = 2;
+		errorMessageLabel.setLayoutData(gd);
+		Color color = new Color(errorMessageLabel.getDisplay(), 200, 0, 0);
+		errorMessageLabel.setForeground(color);
+
+		return dialogArea;
+	}
+
+	protected String getDisplayValue(String string) {
+		return string != null ? string : ""; //$NON-NLS-1$
+	}
+
+	public String getElementName() {
+		return elementName;
+	}
+
+	protected String getModelValue(String string) {
+		String result = null;
+		if ((string != null) && (string.trim().length() > 0)) {
+			result = string;
+		}
+		return result;
+	}
+
+	public void modifyText(ModifyEvent e) {
+		updateErrorMessage();
+	}
+
+	protected void updateErrorMessage() {
+		String errorMessage = null;
+		String name = elementNameField.getText();
+		// String name = elementNameField.getText().trim();
+		if (name.length() > 0) {
+			// TODO use checkName from model level
+			// errorMessage = ValidateHelper.checkXMLName(name);
+			if (!NameValidator.isValid(name)) {
+				errorMessage = XMLUIMessages._UI_INVALID_NAME;
+			}
+		}
+		else {
+			errorMessage = ""; //$NON-NLS-1$
+		}
+
+		errorMessageLabel.setText(errorMessage != null ? errorMessage : ""); //$NON-NLS-1$
+		okButton.setEnabled(errorMessage == null);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditEntityHelper.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditEntityHelper.java
new file mode 100644
index 0000000..25eb64d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditEntityHelper.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class EditEntityHelper {
+
+	public void performBrowseForPublicId(Shell parentShell, Text publicIdField) {
+		performBrowseForPublicId(parentShell, publicIdField, null);
+	}
+
+	public void performBrowseForPublicId(Shell parentShell, Text publicIdField, Text systemIdField) {
+		String[] extensions = {"dtd", "txt"}; //$NON-NLS-1$ //$NON-NLS-2$
+		SelectXMLCatalogIdDialog dialog = new SelectXMLCatalogIdDialog(parentShell, extensions);
+		dialog.create();
+		dialog.getShell().setText(XMLUIMessages._UI_LABEL_SELECT_XML_CATALOG_ENTRY);
+		dialog.setBlockOnOpen(true);
+		dialog.open();
+		if (dialog.getReturnCode() == Window.OK) {
+			String id = dialog.getId();
+			if (id != null) {
+				publicIdField.setText(id);
+				if ((systemIdField != null) && (dialog.getSystemId() != null)) {
+					systemIdField.setText(dialog.getSystemId());
+				}
+			}
+		}
+	}
+
+	public void performBrowseForSystemId(Shell parentShell, Text systemIdField, IPath resourceLocation) {
+		String[] extensions = {"dtd"}; //$NON-NLS-1$
+		SelectFileOrXMLCatalogIdDialog dialog = new SelectFileOrXMLCatalogIdDialog(parentShell, extensions, ICatalogEntry.ENTRY_TYPE_SYSTEM);
+		dialog.create();
+		dialog.getShell().setText(XMLUIMessages._UI_LABEL_SPECIFY_SYSTEM_ID);
+		dialog.setBlockOnOpen(true);
+		dialog.open();
+		if (dialog.getReturnCode() == Window.OK) {
+			String id = dialog.getId();
+			IFile file = dialog.getFile();
+			if (id != null) {
+				systemIdField.setText(id);
+			}
+			else if (file != null) {
+				String uri = null;
+				if (resourceLocation != null) {
+					uri = URIHelper.getRelativeURI(file.getLocation(), resourceLocation);
+				}
+				else {
+					uri = file.getLocation().toOSString();
+				}
+				systemIdField.setText(uri);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditNamespaceInfoDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditNamespaceInfoDialog.java
new file mode 100644
index 0000000..844ac60
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditNamespaceInfoDialog.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.ContentModelManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;
+
+public class EditNamespaceInfoDialog extends Dialog {
+
+	public static EditNamespaceInfoDialog invokeDialog(Shell shell, String title, NamespaceInfo info, IPath resourceLocation) {
+		EditNamespaceInfoDialog dialog = new EditNamespaceInfoDialog(shell, info);
+		dialog.create();
+		dialog.getShell().setText(title);
+		dialog.setBlockOnOpen(true);
+		dialog.setResourceLocation(resourceLocation);
+		dialog.open();
+		return dialog;
+	}
+
+	protected Button browseButton;
+	protected String errorMessage;
+
+	protected Label errorMessageLabel;
+	protected NamespaceInfo fInfo;
+	protected Text locationHintField;
+
+	protected Button okButton;
+	protected Text prefixField;
+	protected IPath resourceLocation;
+	protected Text uriField;
+
+	public EditNamespaceInfoDialog(Shell parentShell, NamespaceInfo info) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.fInfo = info;
+	}
+
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			fInfo.uri = uriField.getText();
+			fInfo.prefix = prefixField.getText();
+			fInfo.locationHint = locationHintField.getText();
+		}
+		super.buttonPressed(buttonId);
+	}
+
+	protected void computeErrorMessage() {
+		errorMessage = null;
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		okButton.setEnabled(false);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+		updateWidgets();
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogsubArea = (Composite) super.createDialogArea(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogsubArea, XMLCommonUIContextIds.XCUI_NAMESPACE_DIALOG);
+
+		Composite composite = new Composite(dialogsubArea, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 3;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 350;
+		composite.setLayoutData(gd);
+
+		ModifyListener modifyListener = new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				updateWidgets();
+			}
+		};
+
+
+		// row 1
+		//
+		Label uriLabel = new Label(composite, SWT.NONE);
+		uriLabel.setText(XMLUIMessages._UI_LABEL_NAMESPACE_NAME_COLON);
+
+		uriField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.grabExcessHorizontalSpace = true;
+		uriField.setLayoutData(gd);
+		uriField.setText(getDisplayValue(fInfo.uri));
+		uriField.addModifyListener(modifyListener);
+		uriField.setEnabled(fInfo.getProperty("uri-readOnly") == null); //$NON-NLS-1$
+
+		// never read
+		Label placeHolder1 = new Label(composite, SWT.NONE);
+		placeHolder1.setText(""); //$NON-NLS-1$
+
+		// row 2
+		//
+		Label prefixLabel = new Label(composite, SWT.NONE);
+		prefixLabel.setText(XMLUIMessages._UI_LABEL_PREFIX_COLON);
+
+		prefixField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.grabExcessHorizontalSpace = true;
+		prefixField.setLayoutData(gd);
+		prefixField.setText(getDisplayValue(fInfo.prefix));
+		prefixField.addModifyListener(modifyListener);
+		prefixField.setEnabled(fInfo.getProperty("prefix-readOnly") == null); //$NON-NLS-1$
+
+		// never read
+		Label placeHolder2 = new Label(composite, SWT.NONE);
+		placeHolder2.setText(""); //$NON-NLS-1$
+
+		// row 3
+		//
+		Label locationHintLabel = new Label(composite, SWT.NONE);
+		locationHintLabel.setText(XMLUIMessages._UI_LABEL_LOCATION_HINT_COLON);
+
+		locationHintField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.grabExcessHorizontalSpace = true;
+		locationHintField.setLayoutData(gd);
+		locationHintField.setText(getDisplayValue(fInfo.locationHint));
+		locationHintField.addModifyListener(modifyListener);
+		locationHintField.setEnabled(fInfo.getProperty("locationHint-readOnly") == null); //$NON-NLS-1$
+
+		SelectionListener selectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				performBrowse();
+			}
+		};
+
+		browseButton = new Button(composite, SWT.NONE);
+		browseButton.setText(XMLUIMessages._UI_LABEL_BROWSE);
+		browseButton.addSelectionListener(selectionListener);
+		browseButton.setEnabled(locationHintField.getEnabled());
+
+		// error message
+		errorMessageLabel = new Label(dialogsubArea, SWT.NONE);
+		errorMessageLabel.setText(XMLUIMessages.error_message_goes_here);
+		errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		Color color = new Color(errorMessageLabel.getDisplay(), 200, 0, 0);
+		errorMessageLabel.setForeground(color);
+
+		return dialogsubArea;
+	}
+
+	protected String getDisplayValue(String string) {
+		return string != null ? string : ""; //$NON-NLS-1$
+	}
+
+	protected void performBrowse() {
+		String[] extensions = {".xsd"}; //$NON-NLS-1$
+		SelectFileOrXMLCatalogIdDialog dialog = new SelectFileOrXMLCatalogIdDialog(getShell(), extensions);
+		dialog.create();
+		dialog.getShell().setText(XMLUIMessages._UI_LABEL_SELECT_FILE);
+		dialog.setBlockOnOpen(true);
+		dialog.open();
+
+		if (dialog.getReturnCode() == Window.OK) {
+			String grammarURI = null;
+			IFile file = dialog.getFile();
+			String id = dialog.getId();
+			if (file != null) {
+				String uri = null;
+				if (resourceLocation != null) {
+					IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(resourceLocation);
+					if (resource != null) {
+						IPath location = resource.getLocation();
+						if (location != null) {
+							uri = URIHelper.getRelativeURI(file.getLocation(), location);
+						}
+					}
+					else {
+					  uri = URIHelper.getRelativeURI(file.getLocation(), resourceLocation);
+					}
+					grammarURI = file.getLocation().toOSString();
+				}
+				else {
+					uri = file.getLocation().toOSString();
+					grammarURI = uri;
+				}
+				locationHintField.setText(uri);
+			}
+			else if (id != null) {
+				locationHintField.setText(id);
+				URIResolver resolver = URIResolverPlugin.createResolver();
+				grammarURI = resolver.resolve(null, id, id);
+			}
+
+
+			CMDocument document = ContentModelManager.getInstance().createCMDocument(URIHelper.getURIForFilePath(grammarURI), "xsd"); //$NON-NLS-1$
+			if(document != null) {
+				List namespaceInfoList = (List) document.getProperty("http://org.eclipse.wst/cm/properties/namespaceInfo"); //$NON-NLS-1$
+				if(namespaceInfoList != null) {
+					NamespaceInfo info = (NamespaceInfo) namespaceInfoList.get(0);
+					if(info != null) {
+						if ((uriField.getText().trim().length() == 0) && (info.uri != null)) {
+							uriField.setText(info.uri);
+						}
+						if ((prefixField.getText().trim().length() == 0) && (info.prefix != null)) {
+							prefixField.setText(info.prefix);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	public void setResourceLocation(IPath path) {
+		resourceLocation = path;
+	}
+
+	protected void updateErrorMessageLabel() {
+		errorMessageLabel.setText(errorMessage != null ? errorMessage : ""); //$NON-NLS-1$
+	}
+
+	protected void updateOKButtonState() {
+		if (okButton != null) {
+			if ((uriField.getText().trim().length() == 0) && (prefixField.getText().trim().length() == 0) && (locationHintField.getText().trim().length() == 0)) {
+				okButton.setEnabled(false);
+			}
+			else {
+				okButton.setEnabled(errorMessage == null);
+			}
+		}
+	}
+
+	protected void updateWidgets() {
+		computeErrorMessage();
+		updateErrorMessageLabel();
+		updateOKButtonState();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditProcessingInstructionDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditProcessingInstructionDialog.java
new file mode 100644
index 0000000..6742855
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditProcessingInstructionDialog.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;
+import org.w3c.dom.ProcessingInstruction;
+
+public class EditProcessingInstructionDialog extends Dialog {
+	protected String data;
+	protected Text dataField;
+	protected String target;
+	protected Text targetField;
+
+	public EditProcessingInstructionDialog(Shell parentShell, ProcessingInstruction pi) {
+		this(parentShell, pi.getTarget(), pi.getData());
+	}
+
+	public EditProcessingInstructionDialog(Shell parentShell, String target, String data) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.target = target;
+		this.data = data;
+	}
+
+	protected void buttonPressed(int buttonId) {
+		target = getModelValue(targetField.getText());
+		data = getModelValue(dataField.getText());
+		super.buttonPressed(buttonId);
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea1 = (Composite) super.createDialogArea(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogArea1, XMLCommonUIContextIds.XCUI_PROCESSING_DIALOG);
+
+		Composite composite = new Composite(dialogArea1, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 250;
+
+		Label targetLabel = new Label(composite, SWT.NONE);
+		targetLabel.setText(XMLUIMessages._UI_LABEL_TARGET_COLON);
+
+		targetField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		targetField.setLayoutData(gd);
+		targetField.setText(getDisplayValue(target));
+
+		Label dataLabel = new Label(composite, SWT.NONE);
+		dataLabel.setText(XMLUIMessages._UI_LABEL_DATA_COLON);
+
+		dataField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		dataField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		dataField.setText(getDisplayValue(data));
+
+		return dialogArea1;
+	}
+
+	protected Label createMessageArea(Composite composite) {
+		Label label = new Label(composite, SWT.NONE);
+		// label.setText(message);
+		return label;
+	}
+
+	public String getData() {
+		return data;
+	}
+
+	protected String getDisplayValue(String string) {
+		return string != null ? string : ""; //$NON-NLS-1$
+	}
+
+	protected String getModelValue(String string) {
+		String result = null;
+		if ((string != null) && (string.trim().length() > 0)) {
+			result = string;
+		}
+		return result;
+	}
+
+
+	public String getTarget() {
+		return target;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditSchemaInfoDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditSchemaInfoDialog.java
new file mode 100644
index 0000000..d445809
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/EditSchemaInfoDialog.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.nsedit.CommonEditNamespacesDialog;
+import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;
+
+public class EditSchemaInfoDialog extends Dialog implements UpdateListener {
+	// protected NamespaceInfoTable namespaceInfoTable;
+	protected Label errorMessageLabel;
+	protected List namespaceInfoList;
+	protected IPath resourceLocation;
+
+	public EditSchemaInfoDialog(Shell parentShell, IPath resourceLocation) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.resourceLocation = resourceLocation;
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogArea, XMLCommonUIContextIds.XCUI_SCHEMA_INFO_DIALOG);
+
+		CommonEditNamespacesDialog editNamespacesControl = new CommonEditNamespacesDialog(dialogArea, resourceLocation, XMLUIMessages._UI_NAMESPACE_DECLARATIONS, false, true);
+		editNamespacesControl.setNamespaceInfoList(namespaceInfoList);
+
+		editNamespacesControl.updateErrorMessage(namespaceInfoList);
+
+		return dialogArea;
+	}
+
+	protected Control getDialogArea(Composite parent) {
+		return super.createDialogArea(parent);
+	}
+
+	public List getNamespaceInfoList() {
+		return namespaceInfoList;
+	}
+
+	public void setNamespaceInfoList(List list) {
+		namespaceInfoList = list;
+	}
+
+	public void updateErrorMessage(List namespaceInfoList) {
+		NamespaceInfoErrorHelper helper = new NamespaceInfoErrorHelper();
+		String errorMessage = helper.computeErrorMessage(namespaceInfoList, null);
+		errorMessageLabel.setText(errorMessage != null ? errorMessage : ""); //$NON-NLS-1$
+	}
+
+	public void updateOccured(Object object, Object arg) {
+		updateErrorMessage((List) arg);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/NamespaceInfoErrorHelper.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/NamespaceInfoErrorHelper.java
new file mode 100644
index 0000000..540df93
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/NamespaceInfoErrorHelper.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceInfoManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class NamespaceInfoErrorHelper {
+
+	protected List errorList;
+
+	public NamespaceInfoErrorHelper() {
+	}
+
+	public String computeErrorMessage(List namespaceInfoList, URIResolver idResolver) {
+		String result = null;
+		Hashtable prefixTable = new Hashtable();
+		Hashtable uriTable = new Hashtable();
+		for (Iterator iterator = namespaceInfoList.iterator(); iterator.hasNext();) {
+			NamespaceInfo nsInfo = (NamespaceInfo) iterator.next();
+			nsInfo.normalize();
+
+			String urikey = nsInfo.uri != null ? nsInfo.uri : ""; //$NON-NLS-1$
+			NamespaceInfo nsInfo2 = null;
+			if ((nsInfo2 = (NamespaceInfo) uriTable.get(urikey)) != null) {
+				if ((nsInfo.uri != null) && nsInfo.uri.equals(nsInfo2.uri)) {
+					result = XMLUIMessages._UI_WARNING_MORE_THAN_ONE_NS_WITH_NAME + "'" + nsInfo.uri + "'"; //$NON-NLS-1$ //$NON-NLS-2$ 
+				}
+				else {
+					result = XMLUIMessages._UI_WARNING_MORE_THAN_ONE_NS_WITHOUT_NAME;
+				}
+				break;
+			}
+			else {
+				uriTable.put(urikey, nsInfo);
+			}
+
+			if (nsInfo.uri != null) {
+				String key = nsInfo.prefix != null ? nsInfo.prefix : ""; //$NON-NLS-1$
+				if (prefixTable.get(key) != null) {
+					if (nsInfo.prefix != null) {
+						result = XMLUIMessages._UI_WARNING_MORE_THAN_ONE_NS_WITH_PREFIX + "'" + nsInfo.prefix + "'"; //$NON-NLS-1$ //$NON-NLS-2$ 
+						break;
+					}
+					else {
+						result = XMLUIMessages._UI_WARNING_MORE_THAN_ONE_NS_WITHOUT_PREFIX;
+						break;
+					}
+				}
+				else {
+					prefixTable.put(key, nsInfo);
+				}
+
+				if ((nsInfo.locationHint != null) && (idResolver != null)) {
+					String grammarURI = idResolver.resolve(null, nsInfo.locationHint, nsInfo.locationHint);
+					if (!URIHelper.isReadableURI(grammarURI, false)) {
+						result = XMLUIMessages._UI_WARNING_SCHEMA_CAN_NOT_BE_LOCATED + " '" + nsInfo.locationHint + "'"; //$NON-NLS-1$ //$NON-NLS-2$ 
+						break;
+					}
+				}
+				if ((idResolver != null) && (nsInfo.locationHint == null) && !nsInfo.uri.equals(DOMNamespaceInfoManager.XSI_URI)) {
+					result = XMLUIMessages._UI_WARNING_LOCATION_HINT_NOT_SPECIFIED + " '" + nsInfo.uri + "'"; //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				}
+			}
+			else {
+				if (nsInfo.prefix != null) {
+					result = XMLUIMessages._UI_WARNING_NAMESPACE_NAME_NOT_SPECIFIED + " '" + nsInfo.prefix + "'"; //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				}
+			}
+		}
+		// additional tests
+		if (result == null) {
+			for (Iterator iterator = namespaceInfoList.iterator(); iterator.hasNext();) {
+				NamespaceInfo nsInfo = (NamespaceInfo) iterator.next();
+				nsInfo.normalize();
+				if ((nsInfo.uri != null) && nsInfo.isPrefixRequired && (nsInfo.prefix == null)) {
+					result = XMLUIMessages._UI_WARNING_PREFIX_NOT_SPECIFIED + " '" + nsInfo.uri + "'"; //$NON-NLS-1$ //$NON-NLS-2$ 
+					break;
+				}
+			}
+		}
+
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/NamespaceInfoTable.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/NamespaceInfoTable.java
new file mode 100644
index 0000000..8a438dc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/NamespaceInfoTable.java
@@ -0,0 +1,398 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+public class NamespaceInfoTable extends Composite {
+
+	/**
+	 * NamespaceInfoTableLabelProvider
+	 */
+	protected class NamespaceInfoTableLabelProvider implements ITableLabelProvider, IStructuredContentProvider {
+
+		public void addListener(ILabelProviderListener listener) {
+		}
+
+		public void dispose() {
+		}
+
+		public Image getColumnImage(Object object, int columnIndex) {
+			return null;
+		}
+
+		public String getColumnText(Object object, int column) {
+			NamespaceInfo info = (NamespaceInfo) object;
+			String result = null;
+			switch (column) {
+				case 0 : {
+					result = info.uri;
+					break;
+				}
+				case 1 : {
+					result = info.prefix;
+					break;
+				}
+				case 2 : {
+					result = info.locationHint;
+					break;
+				}
+			}
+			result = result != null ? result : ""; //$NON-NLS-1$
+			if (result.equals("")) { //$NON-NLS-1$
+				switch (column) {
+					case 0 : {
+						result = XMLUIMessages._UI_NO_NAMESPACE_NAME;
+						break;
+					}
+					case 1 : {
+						result = XMLUIMessages._UI_NO_PREFIX;
+						break;
+					}
+				}
+			}
+			return result;
+		}
+
+		String getDefaultPrefix() {
+			String defaultPrefix = "p"; //$NON-NLS-1$
+			if (namespaceInfoList == null) {
+				return defaultPrefix;
+			}
+			Vector v = new Vector();
+			for (int i = 0; i < namespaceInfoList.size(); i++) {
+				NamespaceInfo nsinfo = (NamespaceInfo) namespaceInfoList.get(i);
+				if (nsinfo.prefix != null) {
+					v.addElement(nsinfo.prefix);
+				}
+			}
+			if (v.contains(defaultPrefix)) {
+				String s = defaultPrefix;
+				for (int j = 0; v.contains(s); j++) {
+					s = defaultPrefix + Integer.toString(j);
+				}
+				return s;
+			}
+			else {
+				return defaultPrefix;
+			}
+		}
+
+		public Object[] getElements(Object inputElement) {
+			return namespaceInfoList.toArray();
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+
+		public boolean isDeleted(Object element) {
+			return false;
+		}
+
+		public boolean isLabelProperty(Object object, Object property) {
+			return false;
+		}
+
+		public boolean isLabelProperty(Object element, String property) {
+			return false;
+		}
+
+		public void removeListener(ILabelProviderListener listener) {
+		}
+	}
+
+	protected static final String LOCATION_HINT = XMLUIMessages._UI_LABEL_LOCATION_HINT;
+	protected static final String NAMESPACE_URI = XMLUIMessages._UI_LABEL_NAMESPACE_NAME;
+	protected static final String PREFIX = XMLUIMessages._UI_LABEL_PREFIX;
+	protected Button deleteButton;
+	protected boolean dummyRowsRemoved = false;
+	protected Button editButton;
+	protected List namespaceInfoList = new Vector();
+	protected Button newButton;
+	protected NamespaceInfoTableLabelProvider provider;
+	protected IPath resourceLocation;
+	protected TableViewer tableViewer;
+	protected UpdateListener updateListener;
+	protected int visibleRows = -1;
+
+	public NamespaceInfoTable(Composite parent) {
+		this(parent, -1, -1, -1);
+	}
+
+	public NamespaceInfoTable(Composite parent, int visibleRows) {
+		this(parent, -1, -1, visibleRows);
+	}
+
+	public NamespaceInfoTable(Composite parent, int widthHint, int heightHint) {
+		this(parent, widthHint, heightHint, -1);
+	}
+
+	public NamespaceInfoTable(Composite parent, int widthHint, int heightHint, int visibleRows) {
+		super(parent, SWT.NONE);
+		setLayout(createGridLayout());
+		setLayoutData(new GridData(GridData.FILL_BOTH));
+		Group namespaceInfoGroup = new Group(this, SWT.NONE);
+		namespaceInfoGroup.setText(XMLUIMessages._UI_LABEL_XML_SCHEMA_INFORMATION);
+		namespaceInfoGroup.setLayout(new GridLayout());
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		if (widthHint != -1) {
+			gd.widthHint = widthHint;
+		}
+		if (heightHint != -1) {
+			gd.heightHint = heightHint;
+		}
+		namespaceInfoGroup.setLayoutData(gd);
+		// WorkbenchHelp.setHelp(namespaceInfoGroup, new
+		// ControlContextComputer(namespaceInfoGroup,
+		// XMLBuilderContextIds.XMLC_NAMESPACE_GROUP));
+		String[] titleArray = {NAMESPACE_URI, PREFIX, LOCATION_HINT};
+		tableViewer = new TableViewer(namespaceInfoGroup, SWT.FULL_SELECTION);
+		provider = new NamespaceInfoTableLabelProvider();
+		tableViewer.setContentProvider(provider);
+		tableViewer.setLabelProvider(provider);
+		tableViewer.setColumnProperties(titleArray);
+		Table table = tableViewer.getTable();
+		table.setHeaderVisible(true);
+		table.setLayoutData(new GridData(GridData.FILL_BOTH));
+		int[] widthArray = {50, 20, 30};
+		TableLayout layout = new TableLayout();
+		for (int i = 0; i < titleArray.length; i++) {
+			TableColumn column = new TableColumn(table, i);
+			column.setText(titleArray[i]);
+			column.setAlignment(SWT.LEFT);
+			layout.addColumnData(new ColumnWeightData(widthArray[i], true));
+		}
+		this.visibleRows = visibleRows;
+		for (int i = 0; i < visibleRows; i++) {
+			TableItem item = new TableItem(table, SWT.NONE);
+			item.setText("#######"); //$NON-NLS-1$
+		}
+		table.setLayout(layout);
+		CellEditor[] cellEditors = new CellEditor[titleArray.length];
+		cellEditors[1] = new TextCellEditor(table);
+		cellEditors[2] = new TextCellEditor(table);
+		tableViewer.setCellEditors(cellEditors);
+		MouseAdapter mouseAdapter = new MouseAdapter() {
+			public void mouseDoubleClick(MouseEvent e) {
+				if (tableViewer.getTable().getItem(new Point(e.x, e.y)) != null) {
+					performEdit();
+				}
+			}
+		};
+		table.addMouseListener(mouseAdapter);
+		createButtons(namespaceInfoGroup);
+		ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateButtonEnabledState();
+			}
+		};
+		tableViewer.addSelectionChangedListener(selectionChangedListener);
+	}
+
+	protected void createButtons(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		gridLayout.marginHeight = 0;
+		gridLayout.marginWidth = 0;
+		composite.setLayout(gridLayout);
+		Button hiddenButton = new Button(composite, SWT.NONE);
+		hiddenButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		hiddenButton.setVisible(false);
+		hiddenButton.setEnabled(false);
+		SelectionListener selectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (e.widget == newButton) {
+					performNew();
+				}
+				else if (e.widget == editButton) {
+					performEdit();
+				}
+				else if (e.widget == deleteButton) {
+					performDelete();
+				}
+			}
+		};
+		// create a composite to hold the three buttons
+		Composite buttonComposite = new Composite(composite, SWT.NONE);
+		buttonComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		GridLayout buttonGridLayout = new GridLayout();
+		buttonGridLayout.numColumns = 3;
+		buttonGridLayout.makeColumnsEqualWidth = true;
+		buttonComposite.setLayout(buttonGridLayout);
+		// add the New button
+		//
+		newButton = new Button(buttonComposite, SWT.NONE);
+		newButton.setText(XMLUIMessages._UI_BUTTON_NEW);
+		newButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		newButton.addSelectionListener(selectionListener);
+		// add the Edit button
+		//
+		editButton = new Button(buttonComposite, SWT.NONE);
+		editButton.setText(XMLUIMessages._UI_BUTTON_EDIT);
+		editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		editButton.addSelectionListener(selectionListener);
+		// add the Delete button
+		//
+		deleteButton = new Button(buttonComposite, SWT.NONE);
+		deleteButton.setText(XMLUIMessages._UI_BUTTON_DELETE);
+		deleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		deleteButton.addSelectionListener(selectionListener);
+	}
+
+	public GridLayout createGridLayout() {
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.marginWidth = 0;
+		gridLayout.horizontalSpacing = 0;
+		return gridLayout;
+	}
+
+	public List getNamespaceInfoList() {
+		return namespaceInfoList;
+	}
+
+	protected NamespaceInfo getTargetNamespaceInfo() {
+		return ((namespaceInfoList != null) && (namespaceInfoList.size() > 0)) ? (NamespaceInfo) namespaceInfoList.get(0) : null;
+	}
+
+	protected EditNamespaceInfoDialog invokeDialog(String title, NamespaceInfo info) {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		EditNamespaceInfoDialog dialog = new EditNamespaceInfoDialog(shell, info);
+		dialog.create();
+		dialog.getShell().setText(title);
+		dialog.setBlockOnOpen(true);
+		dialog.setResourceLocation(resourceLocation);
+		dialog.open();
+		return dialog;
+	}
+
+	protected void performDelayedUpdate() {
+		Runnable delayedUpdate = new Runnable() {
+			public void run() {
+				update();
+			}
+		};
+		getDisplay().asyncExec(delayedUpdate);
+		if (updateListener != null) {
+			updateListener.updateOccured(this, namespaceInfoList);
+		}
+	}
+
+	public void performDelete() {
+		ISelection selection = tableViewer.getSelection();
+		Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;
+		if (selectedObject != null) {
+			namespaceInfoList.remove(selectedObject);
+			performDelayedUpdate();
+		}
+	}
+
+	public void performEdit() {
+		ISelection selection = tableViewer.getSelection();
+		Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;
+		if (selectedObject instanceof NamespaceInfo) {
+			invokeDialog(XMLUIMessages._UI_LABEL_NEW_NAMESPACE_INFORMATION, (NamespaceInfo) selectedObject);
+			performDelayedUpdate();
+		}
+	}
+
+	public void performNew() {
+		NamespaceInfo info = new NamespaceInfo();
+		EditNamespaceInfoDialog dialog = invokeDialog(XMLUIMessages._UI_LABEL_NEW_NAMESPACE_INFORMATION, info);
+		if (dialog.getReturnCode() == Window.OK) {
+			namespaceInfoList.add(info);
+			performDelayedUpdate();
+		}
+	}
+
+	public void setNamespaceInfoList(List namespaceInfoList) {
+		this.namespaceInfoList = namespaceInfoList;
+		update();
+	}
+
+	public void setResourceLocation(IPath resourceLocation) {
+		this.resourceLocation = resourceLocation;
+	}
+
+	public void setUpdateListener(UpdateListener updateListener) {
+		this.updateListener = updateListener;
+	}
+
+	public void update() {
+		updateHelper(namespaceInfoList);
+	}
+
+	public void updateButtonEnabledState() {
+		ISelection selection = tableViewer.getSelection();
+		Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;
+		NamespaceInfo info = (NamespaceInfo) selectedObject;
+		editButton.setEnabled(info != null);
+		deleteButton.setEnabled((info != null) && (info.getProperty("unremovable") == null)); //$NON-NLS-1$
+	}
+
+	public void updateHelper(List namespaceInfoList) {
+		if ((visibleRows != -1) && !dummyRowsRemoved) {
+			dummyRowsRemoved = true;
+			tableViewer.getTable().removeAll();
+		}
+		ISelection selection = tableViewer.getSelection();
+		tableViewer.setInput(namespaceInfoList);
+		if (selection.isEmpty()) {
+			if (namespaceInfoList.size() > 0) {
+				tableViewer.setSelection(new StructuredSelection(namespaceInfoList.get(0)));
+			}
+		}
+		else {
+			tableViewer.setSelection(selection);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdDialog.java
new file mode 100644
index 0000000..d36cf7b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdDialog.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+
+public class SelectFileOrXMLCatalogIdDialog extends Dialog {
+	protected int catalogEntryType;
+	protected String[] extensions;
+	protected IFile file;
+	protected String id;
+	protected Button okButton;
+	protected SelectFileOrXMLCatalogIdPanel panel;
+
+	public SelectFileOrXMLCatalogIdDialog(Shell parentShell, String[] extensions) {
+		this(parentShell, extensions, 0);
+	}
+
+	public SelectFileOrXMLCatalogIdDialog(Shell parentShell, String[] extensions, int catalogEntryType) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.extensions = extensions;
+		this.catalogEntryType = catalogEntryType;
+	}
+
+
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			file = panel.getFile();
+			id = panel.getXMLCatalogId();
+		}
+		super.buttonPressed(buttonId);
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		okButton.setEnabled(false);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+
+		panel = new SelectFileOrXMLCatalogIdPanel(dialogArea);
+		panel.setCatalogEntryType(catalogEntryType);
+		panel.setFilterExtensions(extensions);
+		panel.setVisibleHelper(true);
+		SelectFileOrXMLCatalogIdPanel.Listener listener = new SelectFileOrXMLCatalogIdPanel.Listener() {
+			public void completionStateChanged() {
+				updateButtonState();
+			}
+		};
+		panel.setListener(listener);
+
+		return dialogArea;
+	}
+
+	public IFile getFile() {
+		return file;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	protected void updateButtonState() {
+		okButton.setEnabled((panel.getFile() != null) || (panel.getXMLCatalogId() != null));
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdPanel.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdPanel.java
new file mode 100644
index 0000000..2987b04
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdPanel.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *	   David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.wst.common.ui.internal.viewers.SelectSingleFileView;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+
+public class SelectFileOrXMLCatalogIdPanel extends Composite implements SelectionListener {
+
+	/**
+	 * TODO: Change the name of this interface; "Listener" is used by SWT.
+	 */
+	public interface Listener {
+		void completionStateChanged();
+	}
+
+	protected class MySelectSingleFileView extends SelectSingleFileView implements SelectSingleFileView.Listener {
+		protected Control control;
+
+		public MySelectSingleFileView(Composite parent) {
+			super(null, true);
+			// String[] ext = {".dtd"};
+			// addFilterExtensions(ext);
+			control = createControl(parent);
+			control.setLayoutData(new GridData(GridData.FILL_BOTH));
+			MySelectSingleFileView.this.setListener(this);
+		}
+
+		public Control getControl() {
+			return control;
+		}
+
+		public void setControlComplete(boolean isComplete) {
+			updateCompletionStateChange();
+		}
+
+		public void setVisibleHelper(boolean isVisible) {
+			super.setVisibleHelper(isVisible);
+		}
+	}
+
+	protected Listener listener;
+	protected PageBook pageBook;
+
+	protected Button[] radioButton;
+	protected MySelectSingleFileView selectSingleFileView;
+	protected SelectXMLCatalogIdPanel selectXMLCatalogIdPanel;
+
+	public SelectFileOrXMLCatalogIdPanel(Composite parent) {
+		super(parent, SWT.NONE);
+
+		// container group
+		setLayout(new GridLayout());
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 400;
+		gd.widthHint = 400;
+		setLayoutData(gd);
+
+		radioButton = new Button[2];
+		radioButton[0] = new Button(this, SWT.RADIO);
+		radioButton[0].setText(XMLUIMessages._UI_RADIO_BUTTON_SELECT_FROM_WORKSPACE);
+		radioButton[0].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		radioButton[0].setSelection(true);
+		radioButton[0].addSelectionListener(this);
+
+		radioButton[1] = new Button(this, SWT.RADIO);
+		radioButton[1].setText(XMLUIMessages._UI_RADIO_BUTTON_SELECT_FROM_CATALOG);
+		radioButton[1].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		radioButton[1].addSelectionListener(this);
+
+		pageBook = new PageBook(this, SWT.NONE);
+		pageBook.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		selectSingleFileView = new MySelectSingleFileView(pageBook);
+
+		ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		selectXMLCatalogIdPanel = new SelectXMLCatalogIdPanel(pageBook, xmlCatalog);
+		selectXMLCatalogIdPanel.getTableViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateCompletionStateChange();
+			}
+		});
+		Dialog.applyDialogFont(parent);
+		pageBook.showPage(selectSingleFileView.getControl());
+
+	}
+
+	public IFile getFile() {
+		IFile result = null;
+		if (radioButton[0].getSelection()) {
+			result = selectSingleFileView.getFile();
+		}
+		return result;
+	}
+
+	public ICatalogEntry getXMLCatalogEntry() {
+		ICatalogEntry result = null;
+		if (radioButton[1].getSelection()) {
+			result = selectXMLCatalogIdPanel.getXMLCatalogEntry();
+		}
+		return result;
+	}
+
+	public String getXMLCatalogId() {
+		String result = null;
+		if (radioButton[1].getSelection()) {
+			result = selectXMLCatalogIdPanel.getId();
+		}
+		return result;
+	}
+
+	public String getXMLCatalogURI() {
+		String result = null;
+		if (radioButton[1].getSelection()) {
+			result = selectXMLCatalogIdPanel.getURI();
+		}
+		return result;
+	}
+
+	public void setCatalogEntryType(int catalogEntryType) {
+		selectXMLCatalogIdPanel.setCatalogEntryType(catalogEntryType);
+	}
+
+	public void setFilterExtensions(String[] filterExtensions) {
+		selectSingleFileView.resetFilters();
+		selectSingleFileView.addFilterExtensions(filterExtensions);
+
+		selectXMLCatalogIdPanel.getTableViewer().setFilterExtensions(filterExtensions);
+	}
+
+	public void setListener(Listener listener) {
+		this.listener = listener;
+	}
+
+	public void setVisibleHelper(boolean isVisible) {
+		selectSingleFileView.setVisibleHelper(isVisible);
+	}
+
+	public void updateCompletionStateChange() {
+		if (listener != null) {
+			listener.completionStateChanged();
+		}
+	}
+
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	public void widgetSelected(SelectionEvent e) {
+		if (e.widget == radioButton[0]) {
+			pageBook.showPage(selectSingleFileView.getControl());
+		}
+		else {
+			pageBook.showPage(selectXMLCatalogIdPanel);
+		}
+		updateCompletionStateChange();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdDialog.java
new file mode 100644
index 0000000..624c96a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdDialog.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;
+
+
+
+public class SelectXMLCatalogIdDialog extends Dialog {
+	protected String[] extensions;
+	protected Button okButton;
+	protected SelectXMLCatalogIdPanel panel;
+	protected String publicId;
+	protected String systemId;
+
+	public SelectXMLCatalogIdDialog(Shell parentShell, String[] extensions) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.extensions = extensions;
+	}
+
+
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			ISelection selection = panel.getTableViewer().getSelection();
+			Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;
+
+			if (selectedObject instanceof ICatalogEntry) {
+				ICatalogEntry mappingInfo = (ICatalogEntry) selectedObject;
+				publicId = mappingInfo.getKey();
+				systemId = computeDefaultSystemId(mappingInfo);
+			}
+		}
+		super.buttonPressed(buttonId);
+	}
+
+	protected String computeDefaultSystemId(ICatalogEntry mappingInfo) {
+		String result = mappingInfo.getAttributeValue(ICatalogEntry.ATTR_WEB_URL);
+		if ((result == null) && (mappingInfo.getURI() != null)) {
+			int index = mappingInfo.getURI().lastIndexOf("/"); //$NON-NLS-1$
+			String lastSegment = index != -1 ? mappingInfo.getURI().substring(index + 1) : mappingInfo.getURI();
+			result = lastSegment;
+		}
+		return result;
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		okButton.setEnabled(false);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogArea, XMLCommonUIContextIds.XCUI_CATALOG_DIALOG);
+
+		ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		panel = new SelectXMLCatalogIdPanel(dialogArea, xmlCatalog);
+
+		ISelectionChangedListener listener = new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateButtonState();
+			}
+		};
+		panel.getTableViewer().setFilterExtensions(extensions);
+		panel.getTableViewer().addSelectionChangedListener(listener);
+		return dialogArea;
+	}
+
+
+
+	public String getId() {
+		return publicId;
+	}
+
+	public String getSystemId() {
+		return systemId;
+	}
+
+	protected void updateButtonState() {
+		ISelection selection = panel.getTableViewer().getSelection();
+		okButton.setEnabled(!selection.isEmpty());
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdPanel.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdPanel.java
new file mode 100644
index 0000000..c1d5114
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdPanel.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+
+public class SelectXMLCatalogIdPanel extends Composite {
+	protected int catalogEntryType;
+	protected boolean doTableSizeHack = false;
+
+	protected XMLCatalogTableViewer tableViewer;
+	protected ICatalog fXmlCatalog;
+
+	public SelectXMLCatalogIdPanel(Composite parent, ICatalog xmlCatalog) {
+		super(parent, SWT.NONE);
+		this.fXmlCatalog = xmlCatalog;
+
+		GridLayout gridLayout = new GridLayout();
+		this.setLayout(gridLayout);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 200;
+		gd.widthHint = 700;
+		this.setLayoutData(gd);
+
+		Label label = new Label(this, SWT.NONE);
+		label.setText(XMLUIMessages._UI_LABEL_XML_CATALOG_COLON);
+
+		tableViewer = createTableViewer(this);
+		tableViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+		tableViewer.setInput("dummy"); //$NON-NLS-1$
+	}
+
+	protected XMLCatalogTableViewer createTableViewer(Composite parent) {
+		String headings[] = new String[2];
+		headings[0] = XMLUIMessages._UI_LABEL_KEY;
+		headings[1] = XMLUIMessages._UI_LABEL_URI;
+
+		XMLCatalogTableViewer theTableViewer = new XMLCatalogTableViewer(parent, headings) {
+
+			protected void addXMLCatalogEntries(List list, ICatalogEntry[] entries) {
+				for (int i = 0; i < entries.length; i++) {
+					ICatalogEntry entry = entries[i];
+					if (catalogEntryType == 0) {
+						list.add(entry);
+					}
+					else if (catalogEntryType == entry.getEntryType()) {
+						list.add(entry);
+					}
+				}
+			}
+
+			public Collection getXMLCatalogEntries() {
+				List result = null;
+
+				if ((fXmlCatalog == null) || doTableSizeHack) {
+					// this lets us create a table with an initial height of
+					// 10 rows
+					// otherwise we get stuck with 0 row heigh table... that's
+					// too small
+					doTableSizeHack = false;
+					result = new Vector();
+					for (int i = 0; i < 6; i++) {
+						result.add(""); //$NON-NLS-1$
+					}
+				}
+				else {
+					result = new Vector();
+					INextCatalog[] nextCatalogs = fXmlCatalog.getNextCatalogs();
+					for (int i = 0; i < nextCatalogs.length; i++) {
+						INextCatalog catalog = nextCatalogs[i];
+						ICatalog referencedCatalog = catalog.getReferencedCatalog();
+						if (referencedCatalog != null) {
+							if (XMLCorePlugin.SYSTEM_CATALOG_ID.equals(referencedCatalog.getId())) {
+								ICatalog systemCatalog = referencedCatalog;
+								addXMLCatalogEntries(result, systemCatalog.getCatalogEntries());
+
+							}
+							else if (XMLCorePlugin.USER_CATALOG_ID.equals(referencedCatalog.getId())) {
+								ICatalog userCatalog = referencedCatalog;
+								addXMLCatalogEntries(result, userCatalog.getCatalogEntries());
+
+							}
+						}
+					}
+				}
+				return result;
+			}
+		};
+		return theTableViewer;
+	}
+
+
+	public String getId() {
+		ICatalogEntry entry = getXMLCatalogEntry();
+		return entry != null ? entry.getKey() : null;
+	}
+
+	public XMLCatalogTableViewer getTableViewer() {
+		return tableViewer;
+	}
+
+	public String getURI() {
+		ICatalogEntry entry = getXMLCatalogEntry();
+		return entry != null ? entry.getURI() : null;
+	}
+
+	public ICatalogEntry getXMLCatalogEntry() {
+		ICatalogEntry result = null;
+		ISelection selection = tableViewer.getSelection();
+		Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;
+		if (selectedObject instanceof ICatalogEntry) {
+			result = (ICatalogEntry) selectedObject;
+		}
+		return result;
+	}
+
+	public void setCatalogEntryType(int catalogEntryType) {
+		this.catalogEntryType = catalogEntryType;
+		tableViewer.refresh();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/UpdateListener.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/UpdateListener.java
new file mode 100644
index 0000000..607270a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/UpdateListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+public interface UpdateListener {
+
+	public void updateOccured(Object object, Object arg);
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogTableViewer.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogTableViewer.java
new file mode 100644
index 0000000..ada8759
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogTableViewer.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.dialogs;
+
+import com.ibm.icu.text.Collator;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+
+public class XMLCatalogTableViewer extends TableViewer {
+
+
+	public class CatalogEntryContentProvider implements IStructuredContentProvider {
+
+		public void dispose() {
+		}
+
+		public Object[] getElements(Object element) {
+			Object[] array = getXMLCatalogEntries().toArray();
+			Comparator comparator = new Comparator() {
+				public int compare(Object o1, Object o2) {
+					int result = 0;
+					if ((o1 instanceof ICatalogEntry) && (o2 instanceof ICatalogEntry)) {
+						ICatalogEntry mappingInfo1 = (ICatalogEntry) o1;
+						ICatalogEntry mappingInfo2 = (ICatalogEntry) o2;
+						result = Collator.getInstance().compare(mappingInfo1.getKey(), mappingInfo2.getKey());
+					}
+					return result;
+				}
+			};
+			Arrays.sort(array, comparator);
+			return array;
+		}
+
+		public void inputChanged(Viewer viewer, Object old, Object newobj) {
+		}
+
+		public boolean isDeleted(Object object) {
+			return false;
+		}
+	}
+
+	public class CatalogEntryLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+		public Image getColumnImage(Object object, int columnIndex) {
+			Image result = null;
+			if (columnIndex == 0) {
+				Image base = null;
+				if (object instanceof ICatalogEntry) {
+					ICatalogEntry catalogEntry = (ICatalogEntry) object;
+					String uri = catalogEntry.getURI();
+					if (uri.endsWith("dtd")) { //$NON-NLS-1$
+						base = dtdFileImage;
+					}
+					else if (uri.endsWith("xsd")) { //$NON-NLS-1$
+						base = xsdFileImage;
+					}
+					else {
+						base = unknownFileImage;
+					}
+
+					if (base != null) {
+						if (URIHelper.isReadableURI(uri, false)) {
+							result = base;
+						}
+						else {
+							// TODO... SSE port
+							result = base;// imageFactory.createCompositeImage(base,
+							// errorImage,
+							// ImageFactory.BOTTOM_LEFT);
+						}
+					}
+				}
+			}
+			return result;
+		}
+
+		public String getColumnText(Object object, int columnIndex) {
+			String result = null;
+			if (object instanceof ICatalogEntry) {
+				ICatalogEntry catalogEntry = (ICatalogEntry) object;
+				result = columnIndex == 0 ? catalogEntry.getKey() : catalogEntry.getURI();
+				result = URIHelper.removePlatformResourceProtocol(result);
+			}
+			return result != null ? result : ""; //$NON-NLS-1$
+		}
+	}
+
+
+	class XMLCatalogTableViewerFilter extends ViewerFilter {
+		protected String[] extensions;
+
+		public XMLCatalogTableViewerFilter(String[] extensions) {
+			this.extensions = extensions;
+		}
+
+		public boolean isFilterProperty(Object element, Object property) {
+			return false;
+		}
+
+		public boolean select(Viewer viewer, Object parent, Object element) {
+			boolean result = false;
+			if (element instanceof ICatalogEntry) {
+				ICatalogEntry catalogEntry = (ICatalogEntry) element;
+				for (int i = 0; i < extensions.length; i++) {
+					if (catalogEntry.getURI().endsWith(extensions[i])) {
+						result = true;
+						break;
+					}
+				}
+			}
+			return result;
+		}
+	}
+
+	protected static Image dtdFileImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DTDFILE);
+
+	protected static String ERROR_STATE_KEY = "errorstatekey"; //$NON-NLS-1$
+	protected static Image errorImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OVR_ERROR);
+
+	protected static Image unknownFileImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TXTEXT);
+	protected static Image xsdFileImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_XSDFILE);
+
+	// protected ImageFactory imageFactory = new ImageFactory();
+
+	public XMLCatalogTableViewer(Composite parent, String[] columnProperties) {
+		super(parent, SWT.FULL_SELECTION);
+
+		Table table = getTable();
+		table.setLinesVisible(true);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(true);
+
+		TableLayout layout = new TableLayout();
+		for (int i = 0; i < columnProperties.length; i++) {
+			TableColumn column = new TableColumn(table, i);
+			column.setText(columnProperties[i]);
+			column.setAlignment(SWT.LEFT);
+			layout.addColumnData(new ColumnWeightData(50, true));
+		}
+		table.setLayout(layout);
+		table.setLinesVisible(false);
+
+		setColumnProperties(columnProperties);
+
+		setContentProvider(new CatalogEntryContentProvider());
+		setLabelProvider(new CatalogEntryLabelProvider());
+	}
+
+	public Collection getXMLCatalogEntries() {
+		return null;
+	}
+
+
+	public void menuAboutToShow(IMenuManager menuManager) {
+		Action action = new Action("hello") { //$NON-NLS-1$
+			public void run() {
+				System.out.println("run!"); //$NON-NLS-1$
+			}
+		};
+		menuManager.add(action);
+	}
+
+	public void setFilterExtensions(String[] extensions) {
+		resetFilters();
+		addFilter(new XMLCatalogTableViewerFilter(extensions));
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dnd/DragNodeCommand.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dnd/DragNodeCommand.java
new file mode 100644
index 0000000..736fc55
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dnd/DragNodeCommand.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.dnd;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.ui.internal.dnd.DefaultDragAndDropCommand;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Attr;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class DragNodeCommand extends DefaultDragAndDropCommand {
+	private List fSelections;
+	private TreeViewer fTreeViewer;
+
+	public DragNodeCommand(Object target, float location, int operations, int operation, Collection sources, TreeViewer treeViewer) {
+		super(target, location, operations, operation, sources);
+		fTreeViewer = treeViewer;
+		fSelections = new ArrayList();
+	}
+
+	private void beginModelChange(Node node, boolean batchUpdate) {
+		IStructuredModel structuredModel = getStructuredModel(node);
+		if (structuredModel != null) {
+			String undoDesc = new String();
+			if (getOperation() == DND.DROP_MOVE) {
+				undoDesc = XMLUIMessages.DragNodeCommand_0;
+			}
+			else if (getOperation() == DND.DROP_COPY) {
+				undoDesc = XMLUIMessages.DragNodeCommand_1;
+			}
+
+			structuredModel.beginRecording(this, undoDesc);
+			if (batchUpdate) {
+				// structuredModel.aboutToChangeModel();
+			}
+		}
+	}
+
+	public boolean canExecute() {
+		return executeHelper(true);
+	}
+
+	private boolean doModify(Node source, Node parentNode, Node refChild, boolean testOnly) {
+		boolean result = false;
+		if (source.getNodeType() == Node.ATTRIBUTE_NODE) {
+			Attr sourceAttribute = (Attr) source;
+			Element sourceAttributeOwnerElement = sourceAttribute.getOwnerElement();
+			if ((parentNode.getNodeType() == Node.ELEMENT_NODE) && (sourceAttributeOwnerElement != parentNode)) {
+				result = true;
+				if (!testOnly) {
+					try {
+						if (getOperation() == DND.DROP_MOVE) {
+							Element targetElement = (Element) parentNode;
+							sourceAttributeOwnerElement.removeAttributeNode(sourceAttribute);
+							targetElement.getAttributes().setNamedItem(sourceAttribute);
+							fSelections.add(sourceAttribute);
+							}
+						else if (getOperation() == DND.DROP_COPY) {
+							Attr cloneAttribute = (Attr) sourceAttribute.cloneNode(false);
+							Element targetElement = (Element) parentNode;
+							targetElement.getAttributes().setNamedItem(cloneAttribute);
+							fSelections.add(cloneAttribute);
+						}
+					}
+					catch (Exception e) {
+						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+					}
+				}
+			}
+		}
+		else {
+			if (((parentNode.getNodeType() == Node.ELEMENT_NODE) || (parentNode.getNodeType() == Node.DOCUMENT_NODE)) && !(refChild instanceof Attr)) {
+				result = true;
+
+				if (!testOnly) {
+					try {
+						if (isAncestor(source, parentNode)) {
+							// System.out.println("can not perform this drag drop
+							// operation.... todo... pop up dialog");
+						}
+						else {
+							// defect 221055 this test is required or else the
+							// node will
+							// be removed from the tree and the insert will fail
+							if (source != refChild) {
+								if (getOperation() == DND.DROP_MOVE) {
+									Node oldParent = source.getParentNode();
+									Node oldSibling = source.getNextSibling();
+									oldParent.removeChild(source);
+									try {
+										parentNode.insertBefore(source, refChild);
+									} catch (DOMException e) {
+										// bug151692 - if unable to move node to new location, reinsert back to old location
+										oldParent.insertBefore(source, oldSibling);
+									}
+									fSelections.add(source);
+								}
+								else if (getOperation() == DND.DROP_COPY) {
+									Node nodeClone = source.cloneNode(true);
+									parentNode.insertBefore(nodeClone, refChild);
+									fSelections.add(nodeClone);
+								}
+							}
+						}
+					}
+					catch (Exception e) {
+						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	private void endModelChange(Node node, boolean batchUpdate) {
+		IStructuredModel structuredModel = getStructuredModel(node);
+		if (structuredModel != null) {
+			structuredModel.endRecording(this);
+			if (batchUpdate) {
+				// structuredModel.changedModel();
+			}
+		}
+	}
+
+	public void execute() {
+		executeHelper(false);
+
+		// Make our selection if the treeViewer != null
+		if (fTreeViewer != null) {
+			StructuredSelection structuredSelection = new StructuredSelection(fSelections);
+			fTreeViewer.setSelection(structuredSelection);
+		}
+	}
+
+	private boolean executeHelper(boolean testOnly) {
+		boolean result = true;
+		if (target instanceof Node) {
+			Node targetNode = (Node) target;
+			if (!testOnly && fTreeViewer != null && !validateEdit(getStructuredModel(targetNode), fTreeViewer.getControl().getShell()))
+				return false;
+
+			Node parentNode = getParentForDropPosition(targetNode);
+			Node refChild = getRefChild(targetNode);
+
+			Vector sourcesList = new Vector();
+			sourcesList.addAll(sources);
+
+			removeMemberDescendants(sourcesList);
+			boolean performBatchUpdate = sourcesList.size() > 5;
+
+			if (!testOnly) {
+				beginModelChange(targetNode, performBatchUpdate);
+			}
+			for (Iterator i = sourcesList.iterator(); i.hasNext();) {
+				Object source = i.next();
+				if (source instanceof Node) {
+					if (!((refChild == null) && (targetNode instanceof Attr)) && (parentNode != null)) {
+						result = doModify((Node) source, parentNode, refChild, testOnly);
+					}
+					else {
+						result = false;
+					}
+					if (!result) {
+						break;
+					}
+				}
+			}
+			if (!testOnly) {
+				endModelChange(targetNode, performBatchUpdate);
+			}
+		}
+		else {
+			result = false;
+		}
+		return result;
+	}
+
+	/**
+	 * Checks that the resource backing the model is writeable utilizing <code>validateEdit</code>
+	 * on a given <tt>IWorkspace</tt>.
+	 * 
+	 * @param model the model to be checked
+	 * @param context the shell context for which <code>validateEdit</code> will be run
+	 * @return boolean result of checking <code>validateEdit</code>. If the resource is unwriteable, <code>status.isOK()</code>
+	 * will return true; otherwise, false.
+	 */
+	private boolean validateEdit(IStructuredModel model, Shell context) {
+		if (model != null && model.getBaseLocation() != null) {
+			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(model.getBaseLocation()));
+			return !file.isAccessible() || ResourcesPlugin.getWorkspace().validateEdit(new IFile[] {file}, context).isOK();
+		}
+		return false; //$NON-NLS-1$
+	}
+
+	public int getFeedback() {
+		int result = DND.FEEDBACK_SELECT;
+		if (location > 0.75) {
+			result = DND.FEEDBACK_INSERT_AFTER;
+		}
+		else if (location < 0.25) {
+			result = DND.FEEDBACK_INSERT_BEFORE;
+		}
+		return result;
+	}
+
+	private Node getParentForDropPosition(Node node) {
+		Node result = null;
+
+		int feedback = getFeedback();
+		if (feedback == DND.FEEDBACK_SELECT) {
+			result = node;
+		}
+		else {
+			result = getParentOrOwner(node);
+		}
+		return result;
+	}
+
+
+	private Node getParentOrOwner(Node node) {
+		return (node.getNodeType() == Node.ATTRIBUTE_NODE) ? ((Attr) node).getOwnerElement() : node.getParentNode();
+	}
+
+
+	private Node getRefChild(Node node) {
+		Node result = null;
+
+		int feedback = getFeedback();
+
+		if (feedback == DND.FEEDBACK_INSERT_BEFORE) {
+			result = node;
+		}
+		else if (feedback == DND.FEEDBACK_INSERT_AFTER) {
+			result = node.getNextSibling();
+		}
+		return result;
+	}
+
+	private IStructuredModel getStructuredModel(Node node) {
+		IStructuredModel result = null;
+		if (node instanceof IDOMNode) {
+			result = ((IDOMNode) node).getModel();
+		}
+		return result;
+	}
+
+	// returns true if a is an ancestore of b
+	//
+	private boolean isAncestor(Node a, Node b) {
+		boolean result = false;
+		for (Node parent = b; parent != null; parent = parent.getParentNode()) {
+			if (parent == a) {
+				result = true;
+				break;
+			}
+		}
+		return result;
+	}
+
+
+	/**
+	 * This method removes members of the list that have ancestors that are
+	 * also members of the list.
+	 */
+	private void removeMemberDescendants(List list) {
+		Hashtable table = new Hashtable();
+		for (Iterator i = list.iterator(); i.hasNext();) {
+			Object node = i.next();
+			table.put(node, node);
+		}
+
+		for (int i = list.size() - 1; i >= 0; i--) {
+			Object node =  list.get(i); 
+			if (node instanceof Node){
+				for (Node parent = getParentOrOwner((Node)node); parent != null; parent = getParentOrOwner(parent)) {
+					if (table.get(parent) != null) {
+						list.remove(i);
+						break;
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dnd/XMLDragAndDropManager.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dnd/XMLDragAndDropManager.java
new file mode 100644
index 0000000..48097a8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dnd/XMLDragAndDropManager.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.dnd;
+
+import java.util.Collection;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.wst.common.ui.internal.dnd.DragAndDropCommand;
+import org.eclipse.wst.common.ui.internal.dnd.DragAndDropManager;
+import org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer;
+import org.eclipse.wst.common.ui.internal.dnd.ViewerDragAdapter;
+import org.eclipse.wst.common.ui.internal.dnd.ViewerDropAdapter;
+import org.w3c.dom.Node;
+
+public class XMLDragAndDropManager implements DragAndDropManager {
+	private TreeViewer fViewer;
+
+	public static void addDragAndDropSupport(TreeViewer viewer) {
+		int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
+		Transfer[] transfers = new Transfer[]{ObjectTransfer.getInstance()};
+		viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
+		viewer.addDropSupport(dndOperations, transfers, new ViewerDropAdapter(viewer, new XMLDragAndDropManager(viewer)));
+	}
+
+	public XMLDragAndDropManager() {
+		super();
+	}
+
+	public XMLDragAndDropManager(TreeViewer viewer) {
+		fViewer = viewer;
+	}
+
+	public DragAndDropCommand createCommand(Object target, float location, int operations, int operation, Collection source) {
+		DragAndDropCommand result = null;
+		if (target instanceof Node) {
+			result = new DragNodeCommand(target, location, operations, operation, source, fViewer);
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/doubleclick/XMLDoubleClickStrategy.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/doubleclick/XMLDoubleClickStrategy.java
new file mode 100644
index 0000000..4d35d87
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/doubleclick/XMLDoubleClickStrategy.java
@@ -0,0 +1,324 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.doubleclick;
+
+import org.eclipse.jface.text.DefaultTextDoubleClickStrategy;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Node;
+
+
+public class XMLDoubleClickStrategy extends DefaultTextDoubleClickStrategy {
+	protected static final char DOUBLE_QUOTE = '\"';
+	protected static final char SINGLE_QUOTE = '\'';
+	protected static final char SPACE = ' ';
+	protected int fCaretPosition = -1;
+	protected int fDoubleClickCount = 0;
+	protected Node fNode = null;
+	protected IStructuredDocumentRegion fStructuredDocumentRegion = null;
+	protected String fStructuredDocumentRegionText = ""; //$NON-NLS-1$
+	protected IStructuredModel fStructuredModel = null;
+	protected ITextViewer fTextViewer;
+	protected ITextRegion fTextRegion = null;
+
+	public void doubleClicked(ITextViewer textViewer) {
+			fTextViewer = textViewer;
+			try {
+				fStructuredModel = StructuredModelManager.getModelManager().getExistingModelForRead(fTextViewer.getDocument());
+
+				if (fStructuredModel != null) {
+					int caretPosition = textViewer.getSelectedRange().x;
+					if (caretPosition < 0) {
+						return;
+					}
+
+					fNode = (Node) fStructuredModel.getIndexedRegion(caretPosition);
+					if (fNode == null) {
+						return;
+					}
+
+					updateDoubleClickCount(caretPosition);
+					updateStructuredDocumentRegion();
+					updateTextRegion();
+
+					if (fNode.getNodeType() == Node.TEXT_NODE) {
+						processTextDoubleClicked();
+					}
+					else {
+						processElementDoubleClicked();
+					}
+				}
+			}
+			finally {
+				if (fStructuredModel != null) {
+					fStructuredModel.releaseFromRead();
+				}
+			}
+	}
+
+	protected Point getWord(String string, int cursor) {
+		if (string == null) {
+			return null;
+		}
+
+		int wordStart = 0;
+		int wordEnd = string.length();
+
+		wordStart = string.lastIndexOf(SPACE, cursor - 1);
+		int temp = string.lastIndexOf(SINGLE_QUOTE, cursor - 1);
+		wordStart = Math.max(wordStart, temp);
+		temp = string.lastIndexOf(DOUBLE_QUOTE, cursor - 1);
+		wordStart = Math.max(wordStart, temp);
+		if (wordStart == -1) {
+			wordStart = cursor;
+		}
+		else {
+			wordStart++;
+		}
+
+		wordEnd = string.indexOf(SPACE, cursor);
+		if (wordEnd == -1) {
+			wordEnd = string.length();
+		}
+		temp = string.indexOf(SINGLE_QUOTE, cursor);
+		if (temp == -1) {
+			temp = string.length();
+		}
+		wordEnd = Math.min(wordEnd, temp);
+		temp = string.indexOf(DOUBLE_QUOTE, cursor);
+		if (temp == -1) {
+			temp = string.length();
+		}
+		wordEnd = Math.min(wordEnd, temp);
+		if (wordEnd == string.length()) {
+			wordEnd = cursor;
+		}
+
+		if ((wordStart == wordEnd) && !isQuoted(string)) {
+			wordStart = 0;
+			wordEnd = string.length();
+		}
+
+		return new Point(wordStart, wordEnd);
+	}
+
+	protected boolean isQuoted(String string) {
+		if ((string == null) || (string.length() < 2)) {
+			return false;
+		}
+
+		int lastIndex = string.length() - 1;
+		char firstChar = string.charAt(0);
+		char lastChar = string.charAt(lastIndex);
+
+		return (((firstChar == SINGLE_QUOTE) && (lastChar == SINGLE_QUOTE)) || ((firstChar == DOUBLE_QUOTE) && (lastChar == DOUBLE_QUOTE)));
+	}
+
+	protected void processElementAttrEqualsDoubleClicked2Times() {
+		int prevRegionOffset = fStructuredDocumentRegion.getStartOffset(fTextRegion) - 1;
+		ITextRegion prevRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(prevRegionOffset);
+		int nextRegionOffset = fStructuredDocumentRegion.getEndOffset(fTextRegion);
+		ITextRegion nextRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(nextRegionOffset);
+
+		if ((prevRegion != null) && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) && (nextRegion != null) && (nextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
+			fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(prevRegion), nextRegion.getTextEnd() - prevRegion.getStart());
+		}
+	}
+
+	protected void processElementAttrNameDoubleClicked2Times() {
+		int nextRegionOffset = fStructuredDocumentRegion.getEndOffset(fTextRegion);
+		ITextRegion nextRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(nextRegionOffset);
+
+		if (nextRegion != null) {
+			nextRegionOffset = fStructuredDocumentRegion.getEndOffset(nextRegion);
+			nextRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(nextRegionOffset);
+			if ((nextRegion != null) && (nextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion), nextRegion.getTextEnd() - fTextRegion.getStart());
+			}
+			else {
+				// attribute has no value
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart(), fStructuredDocumentRegion.getLength());
+				fDoubleClickCount = 0;
+			}
+		}
+	}
+
+	protected void processElementAttrValueDoubleClicked() {
+		String regionText = fStructuredDocumentRegion.getText(fTextRegion);
+
+		if (fDoubleClickCount == 1) {
+			Point word = getWord(regionText, fCaretPosition - fStructuredDocumentRegion.getStartOffset(fTextRegion));
+			if (word.x == word.y) { // no word found; select whole region
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion), regionText.length());
+				fDoubleClickCount++;
+			}
+			else {
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion) + word.x, word.y - word.x);
+			}
+		}
+		else if (fDoubleClickCount == 2) {
+			if (isQuoted(regionText)) {
+				// ==> // Point word = getWord(regionText, fCaretPosition -
+				// fStructuredDocumentRegion.getStartOffset(fTextRegion));
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion), regionText.length());
+			}
+			else {
+				processElementAttrValueDoubleClicked2Times();
+			}
+		}
+		else if (fDoubleClickCount == 3) {
+			if (isQuoted(regionText)) {
+				processElementAttrValueDoubleClicked2Times();
+			}
+			else {
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart(), fStructuredDocumentRegion.getLength());
+				fDoubleClickCount = 0;
+			}
+		}
+		else { // fDoubleClickCount == 4
+			fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart(), fStructuredDocumentRegion.getLength());
+			fDoubleClickCount = 0;
+		}
+	}
+
+	protected void processElementAttrValueDoubleClicked2Times() {
+		int prevRegionOffset = fStructuredDocumentRegion.getStartOffset(fTextRegion) - 1;
+		ITextRegion prevRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(prevRegionOffset);
+
+		if (prevRegion != null) {
+			prevRegionOffset = fStructuredDocumentRegion.getStartOffset(prevRegion) - 1;
+			prevRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(prevRegionOffset);
+			if ((prevRegion != null) && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)) {
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(prevRegion), fTextRegion.getTextEnd() - prevRegion.getStart());
+			}
+		}
+	}
+
+	protected void processElementDoubleClicked() {
+		if (fTextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+			processElementAttrValueDoubleClicked(); // special handling for
+		}
+		else {
+			if (fDoubleClickCount == 1) {
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart() + fTextRegion.getStart(), fTextRegion.getTextLength());
+			}
+			else if (fDoubleClickCount == 2) {
+				if (fTextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+					processElementAttrNameDoubleClicked2Times();
+				}
+				else if (fTextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+					processElementAttrEqualsDoubleClicked2Times();
+				}
+				else {
+					fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart(), fStructuredDocumentRegion.getLength());
+					fDoubleClickCount = 0;
+				}
+			}
+			else { // fDoubleClickCount == 3
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart(), fStructuredDocumentRegion.getLength());
+				fDoubleClickCount = 0;
+			}
+		}
+	}
+
+	protected void processTextDoubleClicked() {
+		if (fDoubleClickCount == 1) {
+			super.doubleClicked(fTextViewer);
+
+			Point selectedRange = fTextViewer.getSelectedRange();
+			if ((selectedRange.x == fStructuredDocumentRegion.getStartOffset(fTextRegion)) && (selectedRange.y == fTextRegion.getTextLength())) {
+				// only one word in region, skip one level of double click
+				// selection
+				fDoubleClickCount++;
+			}
+		}
+		else if (fDoubleClickCount == 2) {
+			if (fTextRegion.getType() == DOMRegionContext.UNDEFINED) {
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart(), fStructuredDocumentRegion.getLength());
+				fDoubleClickCount = 0;
+			}
+			else {
+				if (isQuoted(fStructuredDocumentRegion.getFullText(fTextRegion))) {
+					fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion) + 1, fTextRegion.getTextLength() - 2);
+				}
+				else {
+					fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion), fTextRegion.getTextLength());
+				}
+			}
+		}
+		else {
+			if ((fDoubleClickCount == 3) && isQuoted(fStructuredDocumentRegion.getFullText(fTextRegion))) {
+				fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion), fTextRegion.getTextLength());
+			}
+			else {
+				if ((fDoubleClickCount == 3) && isQuoted(fStructuredDocumentRegionText)) {
+					fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart() + 1, fStructuredDocumentRegion.getLength() - 2);
+				}
+				else {
+					fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStart(), fStructuredDocumentRegion.getLength());
+					fDoubleClickCount = 0;
+				}
+			}
+		}
+	}
+
+	public void setModel(IStructuredModel structuredModel) {
+		fStructuredModel = structuredModel;
+	}
+
+	protected void updateDoubleClickCount(int caretPosition) {
+		if (fCaretPosition == caretPosition) {
+			if (fStructuredDocumentRegion != null) {
+				fDoubleClickCount++;
+			}
+			else {
+				fDoubleClickCount = 1;
+			}
+		}
+		else {
+			fCaretPosition = caretPosition;
+			fDoubleClickCount = 1;
+		}
+	}
+
+	protected void updateStructuredDocumentRegion() {
+		fStructuredDocumentRegion = fStructuredModel.getStructuredDocument().getRegionAtCharacterOffset(fCaretPosition);
+		if (fStructuredDocumentRegion != null) {
+			fStructuredDocumentRegionText = fStructuredDocumentRegion.getText();
+		}
+		else {
+			fStructuredDocumentRegionText = ""; //$NON-NLS-1$
+		}
+	}
+
+	protected void updateTextRegion() {
+		if (fStructuredDocumentRegion != null) {
+			fTextRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(fCaretPosition);
+			// if fTextRegion is null, it means we are at just past the last
+			// fStructuredDocumentRegion,
+			// at the very end of the document, so we'll use the last text
+			// region in the document
+			if (fTextRegion == null) {
+				fTextRegion = fStructuredDocumentRegion.getRegionAtCharacterOffset(fCaretPosition - 1);
+			}
+		}
+		else {
+			fTextRegion = null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/CMImageUtil.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/CMImageUtil.java
new file mode 100644
index 0000000..7fa80c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/CMImageUtil.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.editor;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.wst.sse.core.internal.util.JarUtilities;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @author nsd
+ */
+public class CMImageUtil {
+
+	public static String SMALL_ICON_URL = "small-icon"; //$NON-NLS-1$
+
+	public static CMNode getDeclaration(Node node) {
+		CMNode decl = null;
+		ModelQuery mq = null;
+		switch (node.getNodeType()) {
+			case Node.ATTRIBUTE_NODE : {
+				mq = ModelQueryUtil.getModelQuery(((Attr) node).getOwnerDocument());
+				decl = mq.getCMAttributeDeclaration((Attr) node);
+			}
+				break;
+			case Node.ELEMENT_NODE : {
+				mq = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+				decl = mq.getCMElementDeclaration((Element) node);
+			}
+				break;
+		}
+		return decl;
+	}
+
+	public static Image getImage(CMNode cmnode) {
+		if (cmnode == null) {
+			return null;
+		}
+		Image image = null;
+		// cache CM-specified images with the XML UI plugin
+		String imageURLString = (String) cmnode.getProperty(SMALL_ICON_URL);
+		if ((imageURLString != null) && (imageURLString.length() > 0)) {
+			/* First ensure that the descriptor itself is cached */
+			ImageDescriptor imageDescriptor = getImageDescriptor(imageURLString);
+			if (imageDescriptor != null) {
+				/*
+				 * Then obtain the image from the registry so that it is both
+				 * cached and properly disposed of later
+				 */
+				image = getImageRegistry().get(imageURLString);
+			}
+		}
+		return image;
+	}
+
+	public static ImageDescriptor getImageDescriptor(CMNode cmnode) {
+		if (cmnode == null) {
+			return null;
+		}
+		// cache CM-specified images with the XML UI plugin
+		String imageURLString = (String) cmnode.getProperty(SMALL_ICON_URL);
+		ImageDescriptor descriptor = null;
+		if ((imageURLString != null) && (imageURLString.length() > 0)) {
+			descriptor = getImageDescriptor(imageURLString);
+		}
+		return descriptor;
+	}
+
+	private static ImageDescriptor getImageDescriptor(String imageURLString) {
+		ImageDescriptor descriptor = getImageRegistry().getDescriptor(imageURLString);
+		if (descriptor == null) {
+			try {
+				URL imageURL = new URL(imageURLString);
+				InputStream inputStream = JarUtilities.getInputStream(imageURL);
+				try {
+					if (inputStream != null) {
+						ImageData data = new ImageData(inputStream);
+						descriptor = ImageDescriptor.createFromImageData(data);
+						getImageRegistry().put(imageURLString, descriptor);
+					}
+				}
+				catch (SWTException e) {
+					/*
+					 * There was a problem loading image from stream
+					 * (corrupt, missing, etc.)
+					 */
+					if (inputStream != null)
+						inputStream.close();
+				}
+			}
+			catch (MalformedURLException e) {
+				descriptor = null;
+			}
+			catch (IOException e) {
+				descriptor = null;
+			}
+		}
+		return descriptor;
+	}
+
+	private static final ImageRegistry getImageRegistry() {
+		return XMLUIPlugin.getInstance().getImageRegistry();
+	}
+
+	/**
+	 * 
+	 */
+	private CMImageUtil() {
+		super();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/DOMSelectionConvertorFactory.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/DOMSelectionConvertorFactory.java
new file mode 100644
index 0000000..0f0988b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/DOMSelectionConvertorFactory.java
@@ -0,0 +1,86 @@
+/*******************************************************************************

+ * Copyright (c) 2008 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * 

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.wst.xml.ui.internal.editor;

+

+import org.eclipse.core.runtime.IAdapterFactory;

+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;

+import org.eclipse.wst.sse.ui.internal.editor.SelectionConvertor;

+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;

+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;

+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;

+import org.w3c.dom.NamedNodeMap;

+

+/**

+ * @author nitin

+ * 

+ */

+public class DOMSelectionConvertorFactory implements IAdapterFactory {

+

+	private static final Class[] ADAPTER_LIST = new Class[]{SelectionConvertor.class};

+

+	private static class XMLSelectionConvertor extends SelectionConvertor {

+		/* (non-Javadoc)

+		 * @see org.eclipse.wst.sse.ui.internal.editor.SelectionConvertor#getElements(org.eclipse.wst.sse.core.internal.provisional.IStructuredModel, int, int)

+		 */

+		public Object[] getElements(IStructuredModel model, int start, int end) {

+			Object[] objects = super.getElements(model, start, end);

+			// narrow single selected Elements into Attrs if possible

+			if (objects.length == 1) {

+				if (objects[0] instanceof IDOMNode) {

+					IDOMNode node = (IDOMNode) objects[0];

+					NamedNodeMap attributes = node.getAttributes();

+					if (attributes != null) {

+						for (int i = 0; i < attributes.getLength(); i++) {

+							IDOMAttr attribute = (IDOMAttr) attributes.item(i);

+							if (attribute.contains(start) && attribute.contains(end)) {

+								objects[0] = attribute;

+								break;

+							}

+						}

+					}

+				}

+			}

+			return objects;

+		}

+	}

+

+	private static final Object selectionConvertor = new XMLSelectionConvertor();

+

+	/**

+	 * 

+	 */

+	public DOMSelectionConvertorFactory() {

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,

+	 * java.lang.Class)

+	 */

+	public Object getAdapter(Object adaptableObject, Class adapterType) {

+		if (adaptableObject instanceof IDOMModel && SelectionConvertor.class.equals(adapterType))

+			return selectionConvertor;

+		return null;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()

+	 */

+	public Class[] getAdapterList() {

+		return ADAPTER_LIST;

+	}

+

+}

diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/IHelpContextIds.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/IHelpContextIds.java
new file mode 100644
index 0000000..f7542e3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/IHelpContextIds.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.editor;
+
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+/**
+ * Help context ids for the XML Source Editor.
+ * <p>
+ * This interface contains constants only; it is not intended to be
+ * implemented.
+ * </p>
+ * 
+ */
+public interface IHelpContextIds {
+	// org.eclipse.wst.xml.ui.
+	public static final String PREFIX = XMLUIPlugin.ID + "."; //$NON-NLS-1$
+
+	// figured out on the fly
+	// // XML Source page editor
+	// public static final String XML_SOURCEVIEW_HELPID =
+	// ContentTypeIdForXML.ContentTypeID_XML +"_source_HelpId"; //$NON-NLS-1$
+
+	// XML Files Preference page
+	public static final String XML_PREFWEBX_FILES_HELPID = PREFIX + "webx0060"; //$NON-NLS-1$
+	// XML Source Preference page
+	public static final String XML_PREFWEBX_SOURCE_HELPID = PREFIX + "webx0061"; //$NON-NLS-1$
+	// XML Styles Preference page
+	public static final String XML_PREFWEBX_STYLES_HELPID = PREFIX + "webx0062"; //$NON-NLS-1$
+	// XML Templates Preference page
+	public static final String XML_PREFWEBX_TEMPLATES_HELPID = PREFIX + "webx0063"; //$NON-NLS-1$
+    // XML Validator Preference page
+    public static final String XML_PREFWEBX_VALIDATOR_HELPID = PREFIX + "webx0064"; //$NON-NLS-1$
+
+	// XML Cleanup dialog
+	public static final String CLEANUP_XML_HELPID = PREFIX + "xmlm1200"; //$NON-NLS-1$
+
+	// XML New File Wizard - Template Page
+	public static final String XML_NEWWIZARD_TEMPLATE_HELPID = PREFIX + "xmlw0010"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/XMLEditorPluginImageHelper.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/XMLEditorPluginImageHelper.java
new file mode 100644
index 0000000..73b6736
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/XMLEditorPluginImageHelper.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.editor;
+
+import java.util.HashMap;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+
+/**
+ * Helper class to handle images provided by this plug-in.
+ * 
+ * NOTE: For internal use only. For images used externally, please use the
+ * Shared***ImageHelper class instead.
+ * 
+ * @author amywu
+ */
+public class XMLEditorPluginImageHelper {
+	private static XMLEditorPluginImageHelper instance = null;
+
+	/**
+	 * Gets the instance.
+	 * 
+	 * @return Returns a XMLEditorPluginImageHelper
+	 */
+	public synchronized static XMLEditorPluginImageHelper getInstance() {
+		if (instance == null) {
+			instance = new XMLEditorPluginImageHelper();
+		}
+		return instance;
+	}
+
+	// save a descriptor for each image
+	private HashMap fImageDescRegistry = null;
+	private final String PLUGINID = XMLUIPlugin.ID;
+
+	/**
+	 * Creates an image from the given resource and adds the image to the
+	 * image registry.
+	 * 
+	 * @param resource
+	 * @return Image
+	 */
+	private Image createImage(String resource) {
+		ImageDescriptor desc = getImageDescriptor(resource);
+		Image image = null;
+
+		if (desc != null) {
+			image = desc.createImage();
+			// dont add the missing image descriptor image to the image
+			// registry
+			if (!desc.equals(ImageDescriptor.getMissingImageDescriptor())) {
+				getImageRegistry().put(resource, image);
+			}
+		}
+		return image;
+	}
+
+	/**
+	 * Creates an image descriptor from the given imageFilePath and adds the
+	 * image descriptor to the image descriptor registry. If an image
+	 * descriptor could not be created, the default "missing" image descriptor
+	 * is returned but not added to the image descriptor registry.
+	 * 
+	 * @param imageFilePath
+	 * @return ImageDescriptor image descriptor for imageFilePath or default
+	 *         "missing" image descriptor if resource could not be found
+	 */
+	private ImageDescriptor createImageDescriptor(String imageFilePath) {
+		ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGINID, imageFilePath);
+		if (imageDescriptor != null) {
+			getImageDescriptorRegistry().put(imageFilePath, imageDescriptor);
+		}
+		else {
+			imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
+		}
+
+		return imageDescriptor;
+	}
+
+	/**
+	 * Retrieves the image associated with resource from the image registry.
+	 * If the image cannot be retrieved, attempt to find and load the image at
+	 * the location specified in resource.
+	 * 
+	 * @param resource
+	 *            the image to retrieve
+	 * @return Image the image associated with resource or null if one could
+	 *         not be found
+	 */
+	public Image getImage(String resource) {
+		Image image = getImageRegistry().get(resource);
+		if (image == null) {
+			// create an image
+			image = createImage(resource);
+		}
+		return image;
+	}
+
+	/**
+	 * Retrieves the image descriptor associated with resource from the image
+	 * descriptor registry. If the image descriptor cannot be retrieved,
+	 * attempt to find and load the image descriptor at the location specified
+	 * in resource.
+	 * 
+	 * @param resource
+	 *            the image descriptor to retrieve
+	 * @return ImageDescriptor the image descriptor assocated with resource or
+	 *         the default "missing" image descriptor if one could not be
+	 *         found
+	 */
+	public ImageDescriptor getImageDescriptor(String resource) {
+		ImageDescriptor imageDescriptor = null;
+		Object o = getImageDescriptorRegistry().get(resource);
+		if (o == null) {
+			// create a descriptor
+			imageDescriptor = createImageDescriptor(resource);
+		}
+		else {
+			imageDescriptor = (ImageDescriptor) o;
+		}
+		return imageDescriptor;
+	}
+
+	/**
+	 * Returns the image descriptor registry for this plugin.
+	 * 
+	 * @return HashMap - image descriptor registry for this plugin
+	 */
+	private HashMap getImageDescriptorRegistry() {
+		if (fImageDescRegistry == null) {
+			fImageDescRegistry = new HashMap();
+		}
+		return fImageDescRegistry;
+	}
+
+	/**
+	 * Returns the image registry for this plugin.
+	 * 
+	 * @return ImageRegistry - image registry for this plugin
+	 */
+	private ImageRegistry getImageRegistry() {
+		return XMLUIPlugin.getDefault().getImageRegistry();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/XMLEditorPluginImages.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/XMLEditorPluginImages.java
new file mode 100644
index 0000000..52c379a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/editor/XMLEditorPluginImages.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.editor;
+
+/**
+ * Bundle of most images used by the XML Source Editor plug-in.
+ */
+public class XMLEditorPluginImages {
+
+	public static final String IMG_DTOOL_CONSTRAINOFF = "icons/full/dtool16/constrainoff.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL_CONSTRAINON = "icons/full/dtool16/constrainon.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL_RLDGRMR = "icons/full/dtool16/rldgrmr.gif"; //$NON-NLS-1$
+	public static final String IMG_DTOOL_VALIDATE = "icons/full/dtool16/validate.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_CONSTRAINOFF = "icons/full/etool16/constrainoff.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_CONSTRAINON = "icons/full/etool16/constrainon.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_RLDGRMR = "icons/full/etool16/rldgrmr.gif"; //$NON-NLS-1$
+	public static final String IMG_ETOOL_VALIDATE = "icons/full/etool16/validate.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_ADD_CORRECTION = "icons/full/obj16/add_correction.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_ATT_REQ_OBJ = "icons/full/obj16/att_req_obj.gif"; //$NON-NLS-1$
+
+	public static final String IMG_OBJ_ATTRIBUTE = "icons/full/obj16/attribute_obj.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_CDATASECTION = "icons/full/obj16/cdatasection.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_COMMENT = "icons/full/obj16/comment_obj.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_CORRECTION_CHANGE = "icons/full/obj16/correction_change.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_DOCTYPE = "icons/full/obj16/doctype.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_DTDFILE = "icons/full/obj16/dtdfile.gif"; //$NON-NLS-1$	
+	public static final String IMG_OBJ_ELEMENT = "icons/full/obj16/element_obj.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_ENTITY = "icons/full/obj16/entity.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_ENTITY_REFERENCE = "icons/full/obj16/entity_reference.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_ENUM = "icons/full/obj16/enum.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_LOCAL_VARIABLE = "icons/full/obj16/localvariable_obj.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_NOTATION = "icons/full/obj16/notation.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_PROCESSINGINSTRUCTION = "icons/full/obj16/proinst_obj.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_SORT = "icons/full/obj16/sort.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_GENERIC = "icons/full/obj16/tag-generic.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_TAG_GENERIC_DEEMPHASIZED = "icons/full/obj16/tag_generic_deemphasized_obj.gif"; //$NON-NLS-1$    
+	public static final String IMG_OBJ_TAG_GENERIC_EMPHASIZED = "icons/full/obj16/tag_generic_emphasized_obj.gif"; //$NON-NLS-1$        
+	public static final String IMG_OBJ_TAG_MACRO = "icons/full/obj16/tag-macro.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_TXTEXT = "icons/full/obj16/text.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_WARNING_OBJ = "icons/full/obj16/warning_obj.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJ_XSDFILE = "icons/full/obj16/XSDFile.gif"; //$NON-NLS-1$
+
+	public static final String IMG_OVR_ERROR = "icons/full/ovr16/error_ovr.gif"; //$NON-NLS-1$
+	public static final String IMG_OVR_STALE_ERROR = "icons/full/ovr16/stale_error_ovr.gif"; //$NON-NLS-1$
+	public static final String IMG_OVR_WARN = "icons/full/ovr16/warn_ovr.gif"; //$NON-NLS-1$
+
+	public static final String IMG_WIZBAN_GENERATEXML = "icons/full/wizban/generatexml_wiz.png"; //$NON-NLS-1$
+	
+	public static final String IMG_OBJ_DEFAULT = "icons/full/obj16/default.gif"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/AbstractSiblingNavigationHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/AbstractSiblingNavigationHandler.java
new file mode 100644
index 0000000..4e0565b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/AbstractSiblingNavigationHandler.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+/**
+ * Provides navigation to next/previous DOM sibling Nodes
+ */
+abstract public class AbstractSiblingNavigationHandler extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+
+			ISelection selection = textEditor.getSelectionProvider().getSelection();
+			if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
+				Object o = ((IStructuredSelection) selection).getFirstElement();
+				if (o instanceof Node) {
+					Node sibling = null;
+
+					if (((Node) o).getNodeType() == Node.ATTRIBUTE_NODE) {
+						o = ((Attr) o).getOwnerElement();
+					}
+					if (moveForward()) {
+						sibling = ((Node) o).getNextSibling();
+						while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+							sibling = sibling.getNextSibling();
+						}
+						if (sibling == null) {
+							sibling = ((Node) o).getParentNode().getFirstChild();
+							while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+								sibling = sibling.getNextSibling();
+							}
+						}
+					}
+					else {
+						sibling = ((Node) o).getPreviousSibling();
+						while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+							sibling = sibling.getPreviousSibling();
+						}
+						if (sibling == null) {
+							sibling = ((Node) o).getParentNode().getLastChild();
+							while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
+								sibling = sibling.getPreviousSibling();
+							}
+						}
+					}
+
+					// The only child is a Text Node, go to the parent Node
+					if (((Node) o).getNodeType() == Node.TEXT_NODE && o.equals(sibling)) {
+						sibling = ((Node) o).getParentNode();
+					}
+
+
+					if (sibling != null) {
+						textEditor.getSelectionProvider().setSelection(new StructuredSelection(sibling));
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	abstract protected boolean moveForward();
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/AddBlockCommentHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/AddBlockCommentHandler.java
new file mode 100644
index 0000000..475f37a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/AddBlockCommentHandler.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.xml.core.internal.document.CommentImpl;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class AddBlockCommentHandler extends CommentHandler implements IHandler {
+
+	public AddBlockCommentHandler() {
+		super();
+	}
+
+	void processAction(ITextEditor textEditor, IDocument document, ITextSelection textSelection) {
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+		if (model != null) {
+			try {
+				IndexedRegion selectionStartIndexedRegion = model.getIndexedRegion(textSelection.getOffset());
+				IndexedRegion selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength());
+
+				if (selectionStartIndexedRegion == null) {
+					return;
+				}
+				if ((selectionEndIndexedRegion == null) && (textSelection.getLength() > 0)) {
+					selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength() - 1);
+				}
+				if (selectionEndIndexedRegion == null) {
+					return;
+				}
+
+				int openCommentOffset = selectionStartIndexedRegion.getStartOffset();
+				int closeCommentOffset = selectionEndIndexedRegion.getEndOffset() + OPEN_COMMENT.length();
+
+				if ((textSelection.getLength() == 0) && (selectionStartIndexedRegion instanceof CommentImpl)) {
+					return;
+				}
+
+				model.beginRecording(this, XMLUIMessages.AddBlockComment_tooltip);
+				model.aboutToChangeModel();
+
+				try {
+					document.replace(openCommentOffset, 0, OPEN_COMMENT);
+					document.replace(closeCommentOffset, 0, CLOSE_COMMENT);
+					super.removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length());
+				}
+				catch (BadLocationException e) {
+					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+				}
+				finally {
+					model.changedModel();
+					model.endRecording(this);
+				}
+			}
+			finally {
+				model.releaseFromEdit();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CleanupdocumentHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CleanupdocumentHandler.java
new file mode 100644
index 0000000..0d46a0e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CleanupdocumentHandler.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation - bug 212330 -
+ *                    Based off CleanupActionXMLDelegate
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupProcessor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.xml.core.internal.cleanup.CleanupProcessorXML;
+import org.eclipse.wst.xml.ui.internal.actions.CleanupDialogXML;
+
+public class CleanupdocumentHandler extends AbstractHandler implements IHandler {
+	private IStructuredCleanupProcessor fCleanupProcessor;
+
+	public void dispose() {
+		// nulling out just in case
+		fCleanupProcessor = null;
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+			final ITextEditor finalTextEditor = textEditor;
+			Dialog cleanupDialog = new CleanupDialogXML(editor.getSite().getShell());
+			if (cleanupDialog.open() == Window.OK) {
+				// setup runnable
+				Runnable runnable = new Runnable() {
+					public void run() {
+						IStructuredCleanupProcessor cleanupProcessor = getCleanupProcessor();
+						if (cleanupProcessor != null) {
+							IStructuredModel model = null;
+							try {
+								model = StructuredModelManager.getModelManager().getExistingModelForEdit(finalTextEditor.getDocumentProvider().getDocument(finalTextEditor.getEditorInput()));
+								if (model != null) {
+									cleanupProcessor.cleanupModel(model);
+								}
+							}
+							finally {
+								if (model != null) {
+									model.releaseFromEdit();
+								}
+							}
+						}
+					}
+				};
+
+				// TODO: make independent of 'model'.
+				IStructuredModel model = null;
+				try {
+					model = StructuredModelManager.getModelManager().getExistingModelForEdit(textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()));
+					if (model != null) {
+						// begin recording
+						ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection();
+						model.beginRecording(this, SSEUIMessages.Cleanup_Document_UI_, SSEUIMessages.Cleanup_Document_UI_, selection.getOffset(), selection.getLength());
+
+						// tell the model that we are about to make a big
+						// model change
+						model.aboutToChangeModel();
+
+						// run
+						BusyIndicator.showWhile(textEditor.getEditorSite().getWorkbenchWindow().getShell().getDisplay(), runnable);
+					}
+				}
+				finally {
+					if (model != null) {
+						// tell the model that we are done with the big
+						// model
+						// change
+						model.changedModel();
+
+						// end recording
+						ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection();
+						model.endRecording(this, selection.getOffset(), selection.getLength());
+						model.releaseFromEdit();
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+
+	IStructuredCleanupProcessor getCleanupProcessor() {
+		if (fCleanupProcessor == null) {
+			fCleanupProcessor = new CleanupProcessorXML();
+		}
+
+		return fCleanupProcessor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CollapseAllHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CollapseAllHandler.java
new file mode 100644
index 0000000..60c644b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CollapseAllHandler.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class CollapseAllHandler extends ExpandCollapseAllHandler implements IHandler {
+
+	/**
+	 * 
+	 */
+	public CollapseAllHandler() {
+		super();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editorPart = HandlerUtil.getActiveEditor(event);
+		
+		viewer = getTableTreeViewerForEditorPart(editorPart);
+		
+		if (viewer != null) {
+			// temporarily set the visibility to false
+			// this has a HUGE performance benefit
+			boolean isVisible = viewer.getControl().getVisible();
+			viewer.getControl().setVisible(false);
+			viewer.collapseAll();
+
+			// restore the previous visibility state
+			// 
+			viewer.getControl().setVisible(isVisible);
+		}		
+		
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CommentHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CommentHandler.java
new file mode 100644
index 0000000..fb94ac6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/CommentHandler.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension;
+import org.eclipse.ui.texteditor.ITextEditorExtension2;
+import org.eclipse.wst.xml.ui.internal.Logger;
+
+public class CommentHandler extends AbstractHandler implements IHandler {
+	static final String CLOSE_COMMENT = "-->"; //$NON-NLS-1$
+	static final String OPEN_COMMENT = "<!--"; //$NON-NLS-1$
+
+	public CommentHandler() {
+		super();
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null && validateEditorInput(textEditor)) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null) {
+				// get current text selection
+				ITextSelection textSelection = getCurrentSelection(textEditor);
+				if (textSelection.isEmpty()) {
+					return null;
+				}
+
+				processAction(textEditor, document, textSelection);
+			}
+		}
+
+		return null;
+	}
+
+	protected boolean validateEditorInput(ITextEditor textEditor) {
+		if (textEditor instanceof ITextEditorExtension2)
+			return ((ITextEditorExtension2)textEditor).validateEditorInputState();
+		else if (textEditor instanceof ITextEditorExtension)
+			return ((ITextEditorExtension)textEditor).isEditorInputReadOnly();
+		else if (textEditor != null)
+			return textEditor.isEditable();
+		return true;
+		
+	}
+
+	protected ITextSelection getCurrentSelection(ITextEditor textEditor) {
+		ISelectionProvider provider = textEditor.getSelectionProvider();
+		if (provider != null) {
+			ISelection selection = provider.getSelection();
+			if (selection instanceof ITextSelection) {
+				return (ITextSelection) selection;
+			}
+		}
+		return TextSelection.emptySelection();
+	}
+
+	void processAction(ITextEditor textEditor, IDocument document, ITextSelection textSelection) {
+		// Implementations to over ride.
+	}
+
+	protected void removeOpenCloseComments(IDocument document, int offset, int length) {
+		try {
+			int adjusted_length = length;
+
+			// remove open comments
+			String string = document.get(offset, length);
+			int index = string.lastIndexOf(OPEN_COMMENT);
+			while (index != -1) {
+				document.replace(offset + index, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+				index = string.lastIndexOf(OPEN_COMMENT, index - 1);
+				adjusted_length -= OPEN_COMMENT.length();
+			}
+
+			// remove close comments
+			string = document.get(offset, adjusted_length);
+			index = string.lastIndexOf(CLOSE_COMMENT);
+			while (index != -1) {
+				document.replace(offset + index, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+				index = string.lastIndexOf(CLOSE_COMMENT, index - 1);
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ExpandAllHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ExpandAllHandler.java
new file mode 100644
index 0000000..9091399
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ExpandAllHandler.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.wst.xml.ui.internal.tabletree.XMLTableTreeViewer;
+
+public class ExpandAllHandler extends ExpandCollapseAllHandler {
+
+	protected XMLTableTreeViewer viewer = null;
+
+	/**
+	 * 
+	 */
+	public ExpandAllHandler() {
+		super();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		
+		IEditorPart editorPart = HandlerUtil.getActiveEditor(event);
+		
+		viewer = getTableTreeViewerForEditorPart(editorPart);
+		
+		if (viewer != null) {
+			// temporarily set the visibility to false
+			// this has a HUGE performance benefit
+			boolean isVisible = viewer.getControl().getVisible();
+			viewer.getControl().setVisible(false);
+			viewer.expandAll();
+
+			// restore the previous visibility state
+			// 
+			viewer.getControl().setVisible(isVisible);
+		}		
+		
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ExpandCollapseAllHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ExpandCollapseAllHandler.java
new file mode 100644
index 0000000..52d40f4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ExpandCollapseAllHandler.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.menus.UIElement;
+import org.eclipse.wst.xml.ui.internal.tabletree.IDesignViewer;
+import org.eclipse.wst.xml.ui.internal.tabletree.XMLTableTreeViewer;
+
+public class ExpandCollapseAllHandler extends AbstractHandler implements IElementUpdater {
+
+	protected XMLTableTreeViewer viewer = null;
+
+	/**
+	 * Command handler for handling Expand and Collapse for Tree Viewer 
+	 */
+	public ExpandCollapseAllHandler() {
+		super();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		// Implementors to put their code here.
+		
+		return null;
+	}
+	
+	protected XMLTableTreeViewer getTableTreeViewerForEditorPart(IEditorPart targetEditor) {
+		XMLTableTreeViewer result = null;
+		Object object = targetEditor.getAdapter(IDesignViewer.class);
+		if (object instanceof XMLTableTreeViewer) {
+			result = (XMLTableTreeViewer) object;
+		}
+		return result;
+	}
+	
+	public void updateElement(UIElement element, Map parameters) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/NextSiblingNavigationHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/NextSiblingNavigationHandler.java
new file mode 100644
index 0000000..c25951c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/NextSiblingNavigationHandler.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+public class NextSiblingNavigationHandler extends AbstractSiblingNavigationHandler {
+
+	protected boolean moveForward() {
+		return true;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/PreviousSiblingNavigationHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/PreviousSiblingNavigationHandler.java
new file mode 100644
index 0000000..3442a8b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/PreviousSiblingNavigationHandler.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+public class PreviousSiblingNavigationHandler extends AbstractSiblingNavigationHandler {
+
+	protected boolean moveForward() {
+		return false;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ReloadDependenciesHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ReloadDependenciesHandler.java
new file mode 100644
index 0000000..c371a18
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ReloadDependenciesHandler.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.CMDocumentLoader;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.InferredGrammarBuildingCMDocumentLoader;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.w3c.dom.Document;
+
+public class ReloadDependenciesHandler extends AbstractHandler implements IHandler {
+	protected IStructuredModel model;
+
+	/**
+	 * 
+	 */
+	public ReloadDependenciesHandler() {
+		// TODO Auto-generated constructor stub
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+			if (model != null) {
+				ModelQuery modelQuery = null;
+				try {
+					modelQuery = ModelQueryUtil.getModelQuery(model);
+				}
+				finally {
+					model.releaseFromRead();
+				}
+				Document domDocument = ((IDOMModel) model).getDocument();
+				if ((modelQuery != null) && (modelQuery.getCMDocumentManager() != null)) {
+					modelQuery.getCMDocumentManager().getCMDocumentCache().clear();
+					// TODO... need to figure out how to access the
+					// DOMObserver via ModelQuery
+					// ...why?
+					CMDocumentLoader loader = new InferredGrammarBuildingCMDocumentLoader(domDocument, modelQuery);
+					loader.loadCMDocuments();
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/RemoveBlockCommentHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/RemoveBlockCommentHandler.java
new file mode 100644
index 0000000..b4080bf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/RemoveBlockCommentHandler.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.xml.core.internal.document.CommentImpl;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * @author dcarver
+ * 
+ */
+public class RemoveBlockCommentHandler extends CommentHandler implements IHandler {
+
+	public RemoveBlockCommentHandler() {
+		super();
+	}
+
+	void processAction(ITextEditor textEditor, IDocument document, ITextSelection textSelection) {
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+		if (model != null) {
+			try {
+				IndexedRegion selectionStartIndexedRegion = model.getIndexedRegion(textSelection.getOffset());
+				IndexedRegion selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength());
+
+				if ((selectionStartIndexedRegion == null) || (selectionEndIndexedRegion == null)) {
+					return;
+				}
+
+				int openCommentOffset = selectionStartIndexedRegion.getStartOffset();
+				int closeCommentOffset = selectionEndIndexedRegion.getEndOffset() - OPEN_COMMENT.length() - CLOSE_COMMENT.length();
+
+				model.beginRecording(this, XMLUIMessages.RemoveBlockComment_tooltip);
+				model.aboutToChangeModel();
+
+				try {
+					if (textSelection.getLength() == 0) {
+						if (selectionStartIndexedRegion instanceof CommentImpl) {
+							document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+							document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+						}
+					}
+					else {
+						if (selectionStartIndexedRegion instanceof CommentImpl) {
+							document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+						}
+
+						if (selectionEndIndexedRegion instanceof CommentImpl) {
+							document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+						}
+					}
+					removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length());
+				}
+				catch (BadLocationException e) {
+					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+				}
+				finally {
+					model.changedModel();
+					model.endRecording(this);
+				}
+			}
+			finally {
+				model.releaseFromEdit();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectEnclosingXMLHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectEnclosingXMLHandler.java
new file mode 100644
index 0000000..f043b6e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectEnclosingXMLHandler.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.handlers.AbstractStructuredSelectHandler;
+import org.w3c.dom.Node;
+
+public class StructuredSelectEnclosingXMLHandler extends AbstractStructuredSelectHandler {
+	protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection) {
+		IndexedRegion indexedRegion = null;
+
+		indexedRegion = getIndexedRegion(document, textSelection.getOffset());
+
+		return indexedRegion;
+	}
+
+	protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node cursorNode = (Node) indexedRegion;
+
+			// use parent node for empty text node
+			if ((cursorNode.getNodeType() == Node.TEXT_NODE) && (cursorNode.getNodeValue().trim().length() == 0)) {
+				cursorNode = cursorNode.getParentNode();
+
+				if (cursorNode instanceof IndexedRegion) {
+					indexedRegion = (IndexedRegion) cursorNode;
+				}
+			}
+
+			Region cursorNodeRegion = new Region(indexedRegion.getStartOffset(), indexedRegion.getEndOffset() - indexedRegion.getStartOffset());
+
+			if ((cursorNodeRegion.getOffset() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() <= textSelection.getOffset() + textSelection.getLength()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() <= textSelection.getOffset() + textSelection.getLength())) {
+				Node newNode = cursorNode.getParentNode();
+
+				if (newNode instanceof IndexedRegion) {
+					IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+					newRegion = new Region(newIndexedRegion.getStartOffset(), newIndexedRegion.getEndOffset() - newIndexedRegion.getStartOffset());
+				}
+			}
+			else {
+				newRegion = cursorNodeRegion;
+			}
+		}
+		return newRegion;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectNextXMLHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectNextXMLHandler.java
new file mode 100644
index 0000000..366789f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectNextXMLHandler.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.handlers.AbstractStructuredSelectHandler;
+import org.w3c.dom.Node;
+
+public class StructuredSelectNextXMLHandler extends AbstractStructuredSelectHandler {
+
+	protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection) {
+		int offset = textSelection.getOffset() + textSelection.getLength() - 1;
+		if (offset < 0) {
+			offset = 0;
+		}
+
+		IndexedRegion indexedRegion = null;
+
+		indexedRegion = getIndexedRegion(document, offset);
+
+		return indexedRegion;
+	}
+
+	protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node cursorNode = (Node) indexedRegion;
+
+			// use parent node for empty text node
+			if ((cursorNode.getNodeType() == Node.TEXT_NODE) && (cursorNode.getNodeValue().trim().length() == 0)) {
+				cursorNode = cursorNode.getParentNode();
+
+				if (cursorNode instanceof IndexedRegion) {
+					indexedRegion = (IndexedRegion) cursorNode;
+				}
+			}
+
+			Region cursorNodeRegion = new Region(indexedRegion.getStartOffset(), indexedRegion.getEndOffset() - indexedRegion.getStartOffset());
+			int currentOffset = textSelection.getOffset();
+			int currentEndOffset = currentOffset + textSelection.getLength();
+			if ((cursorNodeRegion.getOffset() >= currentOffset) && (cursorNodeRegion.getOffset() <= currentEndOffset) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() >= currentOffset) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() <= currentEndOffset)) {
+				newRegion = getNewSelectionRegion2(indexedRegion, textSelection);
+			}
+			else {
+				newRegion = cursorNodeRegion;
+			}
+		}
+		return newRegion;
+	}
+
+	/**
+	 * This method was separated out from getNewSelectionRegion2 because the
+	 * code in here is allowed to be called recursively.
+	 * 
+	 * @param indexedRegion
+	 * @param textSelection
+	 * @return new region to select or null if none
+	 */
+	private Region getNewSelectionRegion2(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node node = (Node) indexedRegion;
+			Node newNode = node.getNextSibling();
+			if (newNode == null) {
+				newNode = node.getParentNode();
+
+				if (newNode instanceof IndexedRegion) {
+					IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+					newRegion = new Region(newIndexedRegion.getStartOffset(), newIndexedRegion.getEndOffset() - newIndexedRegion.getStartOffset());
+				}
+			}
+			else {
+				if (newNode instanceof IndexedRegion) {
+					IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+					newRegion = new Region(textSelection.getOffset(), newIndexedRegion.getEndOffset() - textSelection.getOffset());
+
+					if (newNode.getNodeType() == Node.TEXT_NODE) {
+						newRegion = getNewSelectionRegion2(newIndexedRegion, new TextSelection(newRegion.getOffset(), newRegion.getLength()));
+					}
+				}
+			}
+		}
+		return newRegion;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectPreviousXMLHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectPreviousXMLHandler.java
new file mode 100644
index 0000000..ab57447
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/StructuredSelectPreviousXMLHandler.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.handlers.AbstractStructuredSelectHandler;
+import org.w3c.dom.Node;
+
+public class StructuredSelectPreviousXMLHandler extends AbstractStructuredSelectHandler {
+
+	protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection) {
+		IndexedRegion indexedRegion = null;
+
+		indexedRegion = getIndexedRegion(document, textSelection.getOffset());
+
+		return indexedRegion;
+	}
+
+	protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node cursorNode = (Node) indexedRegion;
+
+			// use parent node for empty text node
+			if ((cursorNode.getNodeType() == Node.TEXT_NODE) && (cursorNode.getNodeValue().trim().length() == 0)) {
+				cursorNode = cursorNode.getParentNode();
+
+				if (cursorNode instanceof IndexedRegion) {
+					indexedRegion = (IndexedRegion) cursorNode;
+				}
+			}
+
+			Region cursorNodeRegion = new Region(indexedRegion.getStartOffset(), indexedRegion.getEndOffset() - indexedRegion.getStartOffset());
+
+			if ((cursorNodeRegion.getOffset() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() <= textSelection.getOffset() + textSelection.getLength()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() <= textSelection.getOffset() + textSelection.getLength())) {
+				Node newNode = cursorNode.getPreviousSibling();
+				if (newNode == null) {
+					newNode = cursorNode.getParentNode();
+
+					if (newNode instanceof IndexedRegion) {
+						IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+						newRegion = new Region(newIndexedRegion.getStartOffset(), newIndexedRegion.getEndOffset() - newIndexedRegion.getStartOffset());
+					}
+				}
+				else {
+					if (newNode instanceof IndexedRegion) {
+						IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+						newRegion = new Region(newIndexedRegion.getStartOffset(), textSelection.getOffset() + textSelection.getLength() - newIndexedRegion.getStartOffset());
+
+						if (newNode.getNodeType() == Node.TEXT_NODE) {
+							newRegion = getNewSelectionRegion(newIndexedRegion, new TextSelection(newRegion.getOffset(), newRegion.getLength()));
+						}
+					}
+				}
+
+			}
+			else {
+				newRegion = cursorNodeRegion;
+			}
+		}
+		return newRegion;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ToggleCommentHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ToggleCommentHandler.java
new file mode 100644
index 0000000..0b75dca
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ToggleCommentHandler.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class ToggleCommentHandler extends CommentHandler implements IHandler {
+	public ToggleCommentHandler() {
+		super();
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null && super.validateEditorInput(textEditor)) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null) {
+				// get current text selection
+				ITextSelection textSelection = getCurrentSelection(textEditor);
+				if (textSelection.isEmpty()) {
+					return null;
+				}
+
+				processAction(textEditor, document, textSelection);
+			}
+		}
+		return null;
+	}
+
+	void processAction(ITextEditor textEditor, IDocument document, ITextSelection textSelection) {
+		// get text selection lines info
+		int selectionStartLine = textSelection.getStartLine();
+		int selectionEndLine = textSelection.getEndLine();
+		try {
+			int selectionEndLineOffset = document.getLineOffset(selectionEndLine);
+			int selectionEndOffset = textSelection.getOffset() + textSelection.getLength();
+
+			// adjust selection end line
+			if ((selectionEndLine > selectionStartLine) && (selectionEndLineOffset == selectionEndOffset)) {
+				selectionEndLine--;
+			}
+
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+
+		// save the selection position since it will be changing
+		Position selectionPosition = null;
+		boolean updateStartOffset = false;
+		try {
+			selectionPosition = new Position(textSelection.getOffset(), textSelection.getLength());
+			document.addPosition(selectionPosition);
+
+			// extra check if commenting from beginning of line
+			int selectionStartLineOffset = document.getLineOffset(selectionStartLine);
+			if ((textSelection.getLength() > 0) && (selectionStartLineOffset == textSelection.getOffset()) && !isCommentLine(document, selectionStartLine)) {
+				updateStartOffset = true;
+			}
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+
+		processAction(document, selectionStartLine, selectionEndLine);
+
+		updateCurrentSelection(textEditor, selectionPosition, document, updateStartOffset);
+	}
+
+	private void processAction(IDocument document, int selectionStartLine, int selectionEndLine) {
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+		if (model != null) {
+			try {
+				model.beginRecording(this, XMLUIMessages.ToggleComment_tooltip);
+				model.aboutToChangeModel();
+
+				for (int i = selectionStartLine; i <= selectionEndLine; i++) {
+					try {
+						if (document.getLineLength(i) > 0) {
+							if (isCommentLine(document, i)) {
+								int lineOffset = document.getLineOffset(i);
+								IRegion region = document.getLineInformation(i);
+								String string = document.get(region.getOffset(), region.getLength());
+								int openCommentOffset = lineOffset + string.indexOf(OPEN_COMMENT);
+								int closeCommentOffset = lineOffset + string.indexOf(CLOSE_COMMENT) - OPEN_COMMENT.length();
+								uncomment(document, openCommentOffset, closeCommentOffset);
+							}
+							else {
+								int openCommentOffset = document.getLineOffset(i);
+								int lineDelimiterLength = document.getLineDelimiter(i) == null ? 0 : document.getLineDelimiter(i).length();
+								int closeCommentOffset = openCommentOffset + document.getLineLength(i) - lineDelimiterLength + OPEN_COMMENT.length();
+								comment(document, openCommentOffset, closeCommentOffset);
+							}
+						}
+					}
+					catch (BadLocationException e) {
+						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+					}
+				}
+			}
+			finally {
+				model.changedModel();
+				model.endRecording(this);
+				model.releaseFromEdit();
+			}
+		}
+	}
+
+	private boolean isCommentLine(IDocument document, int line) {
+		boolean isComment = false;
+
+		try {
+			IRegion region = document.getLineInformation(line);
+			String string = document.get(region.getOffset(), region.getLength()).trim();
+			isComment = (string.length() >= OPEN_COMMENT.length() + CLOSE_COMMENT.length()) && string.startsWith(OPEN_COMMENT) && string.endsWith(CLOSE_COMMENT);
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+		return isComment;
+	}
+
+	private void comment(IDocument document, int openCommentOffset, int closeCommentOffset) {
+		try {
+			document.replace(openCommentOffset, 0, OPEN_COMMENT);
+			document.replace(closeCommentOffset, 0, CLOSE_COMMENT);
+			removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length());
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+
+	private void uncomment(IDocument document, int openCommentOffset, int closeCommentOffset) {
+		try {
+			document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$
+			document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$
+		}
+		catch (BadLocationException e) {
+			Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+		}
+	}
+
+	private void updateCurrentSelection(ITextEditor textEditor, Position selectionPosition, IDocument document, boolean updateStartOffset) {
+		// update the selection if text selection changed
+		if (selectionPosition != null) {
+			ITextSelection selection = null;
+			if (updateStartOffset) {
+				selection = new TextSelection(document, selectionPosition.getOffset() - OPEN_COMMENT.length(), selectionPosition.getLength() + OPEN_COMMENT.length());
+			}
+			else {
+				selection = new TextSelection(document, selectionPosition.getOffset(), selectionPosition.getLength());
+			}
+			ISelectionProvider provider = textEditor.getSelectionProvider();
+			if (provider != null) {
+				provider.setSelection(selection);
+			}
+			document.removePosition(selectionPosition);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ToggleEditModeHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ToggleEditModeHandler.java
new file mode 100644
index 0000000..c36673f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/ToggleEditModeHandler.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation, bug 212330
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+import org.eclipse.ui.services.IServiceScopes;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.tabletree.XMLEditorMessages;
+import org.eclipse.wst.xml.ui.internal.util.SharedXMLEditorPluginImageHelper;
+
+public class ToggleEditModeHandler extends AbstractHandler implements IElementUpdater {
+	protected ImageDescriptor onImage = SharedXMLEditorPluginImageHelper.getImageDescriptor(SharedXMLEditorPluginImageHelper.IMG_ETOOL_CONSTRAINON);
+	protected ImageDescriptor offImage = SharedXMLEditorPluginImageHelper.getImageDescriptor(SharedXMLEditorPluginImageHelper.IMG_ETOOL_CONSTRAINOFF);
+
+	public ToggleEditModeHandler() {
+		super();
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+			if (model != null) {
+				ModelQuery modelQuery;
+				try {
+					modelQuery = ModelQueryUtil.getModelQuery(model);
+				}
+				finally {
+					model.releaseFromRead();
+				}
+				if (modelQuery != null) {
+					int newState = getNextState(modelQuery.getEditMode());
+					modelQuery.setEditMode(newState);
+
+					// Force a Refresh on this command so that the image can
+					// be
+					// updated.
+					ICommandService commandService = (ICommandService) HandlerUtil.getActiveWorkbenchWindow(event).getService(ICommandService.class);
+					Map filter = new HashMap();
+					filter.put(IServiceScopes.WINDOW_SCOPE, HandlerUtil.getActiveWorkbenchWindow(event));
+					commandService.refreshElements(event.getCommand().getId(), filter);
+				}
+			}
+		}
+
+		return null;
+	}
+
+	public int getNextState(int editMode) {
+		int result = -1;
+		if (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) {
+			result = ModelQuery.EDIT_MODE_UNCONSTRAINED;
+		}
+		else {
+			result = ModelQuery.EDIT_MODE_CONSTRAINED_STRICT;
+		}
+		return result;
+	}
+
+
+	// Handlers that need to interact with the ui that the command came from
+	// need to use implement this method.
+	public void updateElement(UIElement element, Map parameters) {
+		IEditorPart editor = XMLUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+		ITextEditor textEditor = null;
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else if (editor != null) {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+		if (textEditor != null) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+			if (model != null) {
+			    ModelQuery modelQuery;
+				try {
+					modelQuery = ModelQueryUtil.getModelQuery(model);
+				}
+				finally {
+					model.releaseFromRead();
+				}
+				if (modelQuery != null) {
+					setAppearanceForEditMode(modelQuery.getEditMode(), element);
+				}
+			}
+		}
+	}
+
+	public void setAppearanceForEditMode(int editMode, UIElement element) {
+		if (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) {
+			element.setTooltip(XMLEditorMessages.XMLTableTreeActionBarContributor_3);
+			element.setText(XMLEditorMessages.XMLTableTreeActionBarContributor_3);
+			element.setIcon(onImage);
+		}
+		else {
+			element.setTooltip(XMLEditorMessages.XMLTableTreeActionBarContributor_5);
+			element.setText(XMLEditorMessages.XMLTableTreeActionBarContributor_5);
+			element.setIcon(offImage);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/XMLFindOccurencesHandler.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/XMLFindOccurencesHandler.java
new file mode 100644
index 0000000..591e5f1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/handlers/XMLFindOccurencesHandler.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - initial API and implementation - bug 212330 -
+ *                    Based off CleanupActionXMLDelegate
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.handlers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesProcessor;
+import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil;
+import org.eclipse.wst.xml.ui.internal.search.XMLFindOccurrencesProcessor;
+
+public class XMLFindOccurencesHandler extends AbstractHandler implements IHandler {
+	private List fProcessors;
+
+	public void dispose() {
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		ITextEditor textEditor = null;
+		boolean okay = false;
+
+		if (editor instanceof ITextEditor)
+			textEditor = (ITextEditor) editor;
+		else {
+			Object o = editor.getAdapter(ITextEditor.class);
+			if (o != null)
+				textEditor = (ITextEditor) o;
+		}
+
+		if (textEditor != null) {
+			IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+			if (document != null) {
+				ITextSelection textSelection = getTextSelection(textEditor);
+				FindOccurrencesProcessor findOccurrenceProcessor = getProcessorForCurrentSelection(document, textSelection);
+				if (findOccurrenceProcessor != null) {
+					if (textEditor.getEditorInput() instanceof IFileEditorInput) {
+						IFile file = ((IFileEditorInput) textEditor.getEditorInput()).getFile();
+						okay = findOccurrenceProcessor.findOccurrences(document, textSelection, file);
+					}
+				}
+			}
+		}
+		if (okay) {
+			// clear status message
+			PlatformStatusLineUtil.clearStatusLine();
+		}
+		else {
+			String errorMessage = SSEUIMessages.FindOccurrencesActionProvider_0; //$NON-NLS-1$
+			if (textEditor instanceof StructuredTextEditor) {
+				PlatformStatusLineUtil.displayTemporaryErrorMessage(((StructuredTextEditor) textEditor).getTextViewer(), errorMessage);
+			}
+			else {
+				PlatformStatusLineUtil.displayErrorMessage(errorMessage);
+				PlatformStatusLineUtil.addOneTimeClearListener();
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * Get the appropriate find occurrences processor
+	 * 
+	 * @param document -
+	 *            assumes not null
+	 * @param textSelection
+	 * @return FindOccurrencesProcessor
+	 */
+	private FindOccurrencesProcessor getProcessorForCurrentSelection(IDocument document, ITextSelection textSelection) {
+		// check if we have an action that's enabled on the current partition
+		ITypedRegion tr = getPartition(document, textSelection);
+		String partition = tr != null ? tr.getType() : ""; //$NON-NLS-1$
+
+		Iterator it = getProcessors().iterator();
+		FindOccurrencesProcessor processor = null;
+		while (it.hasNext()) {
+			processor = (FindOccurrencesProcessor) it.next();
+			// we just choose the first action that can handle the partition
+			if (processor.enabledForParitition(partition))
+				return processor;
+		}
+
+		List extendedFindOccurrencesProcessors = ExtendedConfigurationBuilder.getInstance().getConfigurations(FindOccurrencesProcessor.class.getName(), partition);
+		for (int i = 0; i < extendedFindOccurrencesProcessors.size(); i++) {
+			Object o = extendedFindOccurrencesProcessors.get(i);
+			if (o instanceof FindOccurrencesProcessor) {
+				/*
+				 * We just choose the first registered processor that
+				 * explicitly says it can handle the partition
+				 */
+				processor = (FindOccurrencesProcessor) o;
+				if (processor.enabledForParitition(partition))
+					return processor;
+			}
+		}
+		return null;
+	}
+
+	private ITypedRegion getPartition(IDocument document, ITextSelection textSelection) {
+		ITypedRegion region = null;
+		if (textSelection != null) {
+			try {
+				region = document.getPartition(textSelection.getOffset());
+			}
+			catch (BadLocationException e) {
+				region = null;
+			}
+		}
+		return region;
+	}
+
+	private ITextSelection getTextSelection(ITextEditor textEditor) {
+		ITextSelection textSelection = null;
+		ISelection selection = textEditor.getSelectionProvider().getSelection();
+		if (selection instanceof ITextSelection && !selection.isEmpty()) {
+			textSelection = (ITextSelection) selection;
+		}
+		return textSelection;
+	}
+
+	protected List getProcessors() {
+		if (fProcessors == null) {
+			fProcessors = new ArrayList();
+			XMLFindOccurrencesProcessor htmlProcessor = new XMLFindOccurrencesProcessor();
+			fProcessors.add(htmlProcessor);
+		}
+		return fProcessors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/CatalogEntryHyperlink.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/CatalogEntryHyperlink.java
new file mode 100644
index 0000000..7ef2986
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/CatalogEntryHyperlink.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.hyperlink;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+class CatalogEntryHyperlink implements IHyperlink {
+
+	private IRegion fHyperlinkRegion = null;
+	private ICatalogEntry fEntry = null;
+
+	/**
+	 * @param hyperlinkRegion
+	 * @param entry
+	 */
+	CatalogEntryHyperlink(IRegion hyperlinkRegion, ICatalogEntry entry) {
+		super();
+		fHyperlinkRegion = hyperlinkRegion;
+		fEntry = entry;
+	}
+
+	/**
+	 * @return
+	 */
+	private IHyperlink getHyperlink() {
+		if (fEntry.getURI().startsWith("file:")) { //$NON-NLS-1$
+			return new ExternalFileHyperlink(fHyperlinkRegion, new File(fEntry.getURI().substring(5)));
+		}
+		else if (fEntry.getURI().startsWith("platform:/resource/")) { //$NON-NLS-1$
+			IPath path = new Path(fEntry.getURI().substring(20));
+			if (path.segmentCount() > 1)
+				return new WorkspaceFileHyperlink(fHyperlinkRegion, ResourcesPlugin.getWorkspace().getRoot().getFile(path));
+		}
+		else {
+			/*
+			 * the URL detector will already work on the literal text, so
+			 * offer to open the contents in an editor
+			 */
+			try {
+				if (fEntry.getURI().startsWith("jar:file:"))
+					return new URLStorageHyperlink(fHyperlinkRegion, new URL(fEntry.getURI())) {
+						public String getHyperlinkText() {
+							return NLS.bind(XMLUIMessages.Open, fEntry.getKey());
+						}
+					};
+			}
+			catch (MalformedURLException e) {
+				// not valid?
+			}
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkRegion()
+	 */
+	public IRegion getHyperlinkRegion() {
+		return fHyperlinkRegion;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()
+	 */
+	public String getHyperlinkText() {
+		IHyperlink link = getHyperlink();
+		if (link != null)
+			return link.getHyperlinkText();
+		return NLS.bind(XMLUIMessages.Open, fEntry.getKey());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()
+	 */
+	public String getTypeLabel() {
+		IHyperlink link = getHyperlink();
+		if (link != null)
+			return link.getTypeLabel();
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#open()
+	 */
+	public void open() {
+		IHyperlink link = getHyperlink();
+		if (link != null)
+			link.open();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/ExternalFileEditorInput.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/ExternalFileEditorInput.java
new file mode 100644
index 0000000..86e85d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/ExternalFileEditorInput.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.hyperlink;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.editors.text.ILocationProvider;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+
+/**
+ * EditorInput for external files. Copied from
+ * org.eclipse.ui.internal.editors.text.JavaFileEditorInput
+ */
+class ExternalFileEditorInput implements IEditorInput, ILocationProvider {
+	// copies of this class exist in:
+	// org.eclipse.wst.xml.ui.internal.hyperlink
+	// org.eclipse.wst.html.ui.internal.hyperlink
+	// org.eclipse.jst.jsp.ui.internal.hyperlink
+
+	/**
+	 * The workbench adapter which simply provides the label.
+	 */
+	private class WorkbenchAdapter implements IWorkbenchAdapter {
+		/*
+		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
+		 */
+		public Object[] getChildren(Object o) {
+			return null;
+		}
+
+		/*
+		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
+		 */
+		public ImageDescriptor getImageDescriptor(Object object) {
+			return null;
+		}
+
+		/*
+		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
+		 */
+		public String getLabel(Object o) {
+			return ((ExternalFileEditorInput) o).getName();
+		}
+
+		/*
+		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
+		 */
+		public Object getParent(Object o) {
+			return null;
+		}
+	}
+
+	private File fFile;
+	private WorkbenchAdapter fWorkbenchAdapter = new WorkbenchAdapter();
+
+	public ExternalFileEditorInput(File file) {
+		super();
+		fFile = file;
+		fWorkbenchAdapter = new WorkbenchAdapter();
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#exists()
+	 */
+	public boolean exists() {
+		return fFile.exists();
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+	 */
+	public ImageDescriptor getImageDescriptor() {
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getName()
+	 */
+	public String getName() {
+		return fFile.getName();
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getPersistable()
+	 */
+	public IPersistableElement getPersistable() {
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
+	 */
+	public String getToolTipText() {
+		return fFile.getAbsolutePath();
+	}
+
+	/*
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class adapter) {
+		if (ILocationProvider.class.equals(adapter)) {
+			return this;
+		}
+		if (IWorkbenchAdapter.class.equals(adapter)) {
+			return fWorkbenchAdapter;
+		}
+		return Platform.getAdapterManager().getAdapter(this, adapter);
+	}
+
+	/*
+	 * @see org.eclipse.ui.editors.text.ILocationProvider#getPath(java.lang.Object)
+	 */
+	public IPath getPath(Object element) {
+		if (element instanceof ExternalFileEditorInput) {
+			ExternalFileEditorInput input = (ExternalFileEditorInput) element;
+			return Path.fromOSString(input.fFile.getAbsolutePath());
+		}
+		return null;
+	}
+
+	/*
+	 * @see org.eclipse.ui.IPathEditorInput#getPath()
+	 * @since 3.1
+	 */
+	public IPath getPath() {
+		return Path.fromOSString(fFile.getAbsolutePath());
+	}
+
+	/*
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object o) {
+		if (o == this) {
+			return true;
+		}
+
+		if (o instanceof ExternalFileEditorInput) {
+			ExternalFileEditorInput input = (ExternalFileEditorInput) o;
+			return fFile.equals(input.fFile);
+		}
+
+		if (o instanceof IPathEditorInput) {
+			IPathEditorInput input = (IPathEditorInput) o;
+			return getPath().equals(input.getPath());
+		}
+
+		return false;
+	}
+
+	/*
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return fFile.hashCode();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/ExternalFileHyperlink.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/ExternalFileHyperlink.java
new file mode 100644
index 0000000..6761969
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/ExternalFileHyperlink.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.hyperlink;
+
+import java.io.File;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * Hyperlink for external files.
+ */
+class ExternalFileHyperlink implements IHyperlink {
+	// copies of this class exist in:
+	// org.eclipse.wst.xml.ui.internal.hyperlink
+	// org.eclipse.wst.html.ui.internal.hyperlink
+	// org.eclipse.jst.jsp.ui.internal.hyperlink
+
+	private IRegion fHyperlinkRegion;
+	private File fHyperlinkFile;
+
+	public ExternalFileHyperlink(IRegion region, File file) {
+		fHyperlinkFile = file;
+		fHyperlinkRegion = region;
+	}
+
+	public IRegion getHyperlinkRegion() {
+		return fHyperlinkRegion;
+	}
+
+	public String getTypeLabel() {
+		return null;
+	}
+
+	public String getHyperlinkText() {
+		String path = fHyperlinkFile.getPath();
+		if (path.length() > 60) {
+			path = path.substring(0, 25) + "..." + path.substring(path.length() - 25, path.length());
+		}
+		return NLS.bind(XMLUIMessages.Open, path);
+	}
+
+	public void open() {
+		if (fHyperlinkFile != null) {
+			IEditorInput input = new ExternalFileEditorInput(fHyperlinkFile);
+			IEditorDescriptor descriptor;
+			try {
+				descriptor = IDE.getEditorDescriptor(input.getName(), true);
+				if (descriptor != null) {
+					IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+					IDE.openEditor(page, input, descriptor.getId(), true);
+				}
+			}
+			catch (PartInitException e) {
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/URLStorageHyperlink.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/URLStorageHyperlink.java
new file mode 100644
index 0000000..bc4b03f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/URLStorageHyperlink.java
@@ -0,0 +1,180 @@
+package org.eclipse.wst.xml.ui.internal.hyperlink;
+
+import java.io.InputStream;
+import java.net.URL;
+
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.URLHyperlink;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.sse.core.internal.util.JarUtilities;
+import org.eclipse.wst.xml.core.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+/**
+ * Hyperlink for URLs (opens in read-only mode)
+ */
+class URLStorageHyperlink implements IHyperlink {
+	// copies of this class exist in:
+	// org.eclipse.wst.xml.ui.internal.hyperlink
+	// org.eclipse.wst.html.ui.internal.hyperlink
+	// org.eclipse.jst.jsp.ui.internal.hyperlink
+
+	static class StorageEditorInput implements IStorageEditorInput {
+		IStorage fStorage = null;
+
+		StorageEditorInput(IStorage storage) {
+			fStorage = storage;
+		}
+
+		public IStorage getStorage() throws CoreException {
+			return fStorage;
+		}
+
+		public boolean exists() {
+			return fStorage != null;
+		}
+
+		public boolean equals(Object obj) {
+			if (obj instanceof StorageEditorInput) {
+				return fStorage.equals(((StorageEditorInput) obj).fStorage);
+			}
+			return super.equals(obj);
+		}
+
+		public ImageDescriptor getImageDescriptor() {
+			return null;
+		}
+
+		public String getName() {
+			return fStorage.getName();
+		}
+
+		public IPersistableElement getPersistable() {
+			return null;
+		}
+
+		public String getToolTipText() {
+			return fStorage.getFullPath() != null ? fStorage.getFullPath().toString() : fStorage.getName();
+		}
+
+		public Object getAdapter(Class adapter) {
+			return null;
+		}
+	}
+
+	static class URLStorage implements IStorage {
+		URL fURL = null;
+
+		URLStorage(URL url) {
+			fURL = url;
+		}
+
+		public boolean equals(Object obj) {
+			if (obj instanceof URLStorage) {
+				return fURL.equals(((URLStorage) obj).fURL);
+			}
+			return super.equals(obj);
+		}
+
+		public InputStream getContents() throws CoreException {
+			InputStream stream = null;
+			try {
+				if (fURL.toString().startsWith("jar:file"))
+					stream = JarUtilities.getInputStream(fURL);
+				else
+					stream = fURL.openStream();
+			}
+			catch (Exception e) {
+				throw new CoreException(new Status(IStatus.ERROR, XMLUIPlugin.getDefault().getBundle().getSymbolicName(), IStatus.ERROR, fURL.toString(), e));
+			}
+			return stream;
+		}
+
+		public IPath getFullPath() {
+			return new Path(fURL.toString());
+		}
+
+		public String getName() {
+			return new Path(fURL.getFile()).lastSegment();
+		}
+
+		public boolean isReadOnly() {
+			return true;
+		}
+
+		public Object getAdapter(Class adapter) {
+			return null;
+		}
+
+	}
+
+	private IRegion fRegion;
+	private URL fURL;
+
+	public URLStorageHyperlink(IRegion region, URL url) {
+		fRegion = region;
+		fURL = url;
+	}
+
+	public IRegion getHyperlinkRegion() {
+		return fRegion;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()
+	 */
+	public String getTypeLabel() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()
+	 */
+	public String getHyperlinkText() {
+		return NLS.bind(XMLUIMessages.Open, fURL.toString());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#open()
+	 */
+	public void open() {
+		if (fURL != null) {
+			IEditorInput input = new StorageEditorInput(new URLStorage(fURL));
+			IEditorDescriptor descriptor;
+			try {
+				descriptor = IDE.getEditorDescriptor(input.getName());
+				if (descriptor != null) {
+					IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+					IDE.openEditor(page, input, descriptor.getId(), true);
+				}
+			}
+			catch (PartInitException e) {
+				Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
+				new URLHyperlink(fRegion, fURL.toString()).open();
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/WorkspaceFileHyperlink.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/WorkspaceFileHyperlink.java
new file mode 100644
index 0000000..0319952
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/WorkspaceFileHyperlink.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.hyperlink;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * Hyperlink for files within the workspace. (As long as there is an IFile,
+ * this can be used) Opens the default editor for the file.
+ */
+class WorkspaceFileHyperlink implements IHyperlink {
+	// copies of this class exist in:
+	// org.eclipse.wst.xml.ui.internal.hyperlink
+	// org.eclipse.wst.html.ui.internal.hyperlink
+	// org.eclipse.jst.jsp.ui.internal.hyperlink
+
+	private IRegion fRegion;
+	private IFile fFile;
+	private IRegion fHighlightRange;
+
+	public WorkspaceFileHyperlink(IRegion region, IFile file) {
+		fRegion = region;
+		fFile = file;
+	}
+
+	public WorkspaceFileHyperlink(IRegion region, IFile file, IRegion range) {
+		fRegion = region;
+		fFile = file;
+		fHighlightRange = range;
+	}
+
+	public IRegion getHyperlinkRegion() {
+		return fRegion;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()
+	 */
+	public String getTypeLabel() {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()
+	 */
+	public String getHyperlinkText() {
+		String path = fFile.getFullPath().toString();
+		if (path.length() > 60) {
+			path = path.substring(0, 25) + "..." + path.substring(path.length() - 25, path.length());
+		}
+		return NLS.bind(XMLUIMessages.Open, path);
+	}
+
+	public void open() {
+		if ((fFile != null) && fFile.exists()) {
+			try {
+				IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+				IEditorPart editor = IDE.openEditor(page, fFile, true);
+				// highlight range in editor if possible
+				if ((fHighlightRange != null) && (editor instanceof ITextEditor)) {
+					((ITextEditor) editor).setHighlightRange(fHighlightRange.getOffset(), fHighlightRange.getLength(), true);
+				}
+			}
+			catch (PartInitException pie) {
+				Logger.log(Logger.WARNING_DEBUG, pie.getMessage(), pie);
+			}
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/XMLHyperlinkDetector.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/XMLHyperlinkDetector.java
new file mode 100644
index 0000000..09abdc3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/hyperlink/XMLHyperlinkDetector.java
@@ -0,0 +1,569 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.hyperlink;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.w3c.dom.Attr;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.ibm.icu.util.StringTokenizer;
+
+/**
+ * Detects hyperlinks in XML tags. Includes detection in DOCTYPE and attribute
+ * values. Resolves references to schemas, dtds, etc using the Common URI
+ * Resolver.
+ * 
+ */
+public class XMLHyperlinkDetector extends AbstractHyperlinkDetector {
+	private final String NO_NAMESPACE_SCHEMA_LOCATION = "noNamespaceSchemaLocation"; //$NON-NLS-1$
+	private final String SCHEMA_LOCATION = "schemaLocation"; //$NON-NLS-1$
+	private final String XMLNS = "xmlns"; //$NON-NLS-1$
+	private final String XSI_NAMESPACE_URI = "http://www.w3.org/2001/XMLSchema-instance"; //$NON-NLS-1$
+
+	/**
+	 * Create the appropriate hyperlink
+	 * 
+	 * @param uriString
+	 * @param hyperlinkRegion
+	 * @return IHyperlink
+	 */
+	private IHyperlink createHyperlink(String uriString, IRegion hyperlinkRegion, IDocument document, Node node) {
+		IHyperlink link = null;
+
+		ICatalogEntry entry = getCatalogEntry(uriString);
+		if (entry != null) {
+			link = new CatalogEntryHyperlink(hyperlinkRegion, entry);
+		}
+		else {
+			// try to locate the file in the workspace
+			File systemFile = getFileFromUriString(uriString);
+			if (systemFile != null) {
+				String systemPath = systemFile.getPath();
+				IFile file = getFile(systemPath);
+				if (file != null) {
+					// this is a WorkspaceFileHyperlink since file exists in
+					// workspace
+					link = new WorkspaceFileHyperlink(hyperlinkRegion, file);
+				}
+				else {
+					// this is an ExternalFileHyperlink since file does not
+					// exist in workspace
+					link = new ExternalFileHyperlink(hyperlinkRegion, systemFile);
+				}
+			}
+		}
+		return link;
+	}
+
+	public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+		// for now, only capable of creating 1 hyperlink
+		List hyperlinks = new ArrayList(0);
+
+		if ((region != null) && (textViewer != null)) {
+			IDocument document = textViewer.getDocument();
+			Node currentNode = getCurrentNode(document, region.getOffset());
+			if (currentNode != null) {
+				String uriString = null;
+				if (currentNode.getNodeType() == Node.DOCUMENT_TYPE_NODE) {
+					// doctype nodes
+					uriString = getURIString(currentNode, document);
+				}
+				else if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
+					// element nodes
+					Attr currentAttr = getCurrentAttrNode(currentNode, region.getOffset());
+					if (currentAttr != null) {
+						// try to find link for current attribute
+						// resolve attribute value
+						uriString = getURIString(currentAttr, document);
+						// verify validity of uri string
+						if ((uriString == null) || !isValidURI(uriString)) {
+							// reset current attribute
+							currentAttr = null;
+						}
+					}
+					if (currentAttr == null) {
+						// try to find a linkable attribute within element
+						currentAttr = getLinkableAttr((Element) currentNode);
+						if (currentAttr != null) {
+							uriString = getURIString(currentAttr, document);
+						}
+					}
+					currentNode = currentAttr;
+				}
+				// try to create hyperlink from information gathered
+				if ((uriString != null) && (currentNode != null) && isValidURI(uriString)) {
+					IRegion hyperlinkRegion = getHyperlinkRegion(currentNode);
+					IHyperlink hyperlink = createHyperlink(uriString, hyperlinkRegion, document, currentNode);
+					if (hyperlink != null) {
+						hyperlinks.add(hyperlink);
+					}
+				}
+			}
+		}
+		if (hyperlinks.size() == 0) {
+			return null;
+		}
+		return (IHyperlink[]) hyperlinks.toArray(new IHyperlink[0]);
+	}
+
+	/**
+	 * Get the base location from the current model (local file system)
+	 */
+	private String getBaseLocation(IDocument document) {
+		String result = null;
+
+		// get the base location from the current model
+		IStructuredModel sModel = null;
+		try {
+			sModel = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+			if (sModel != null) {
+				result = sModel.getBaseLocation();
+				
+				IPath path = new Path(result);
+				if (path.segmentCount() > 1) {
+					IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+					if (file.exists()) {
+						String baseLocation = null;
+						if (file.getLocation() != null) {
+							baseLocation = file.getLocation().toString();
+						}
+						if (baseLocation == null && file.getLocationURI() != null) {
+							baseLocation = file.getLocationURI().toString();
+						}
+						if (baseLocation == null) {
+							baseLocation = file.getFullPath().toString();
+						}
+						result = baseLocation;
+					}
+				}
+			}
+		}
+		finally {
+			if (sModel != null) {
+				sModel.releaseFromRead();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Get the CMElementDeclaration for an element
+	 * 
+	 * @param element
+	 * @return CMElementDeclaration
+	 */
+	private CMElementDeclaration getCMElementDeclaration(Element element) {
+		CMElementDeclaration ed = null;
+
+		ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
+		if (mq != null) {
+			ed = mq.getCMElementDeclaration(element);
+		}
+		return ed;
+	}
+
+	/**
+	 * Returns the attribute node within node at offset
+	 * 
+	 * @param node
+	 * @param offset
+	 * @return Attr
+	 */
+	private Attr getCurrentAttrNode(Node node, int offset) {
+		if ((node instanceof IndexedRegion) && ((IndexedRegion) node).contains(offset) && (node.hasAttributes())) {
+			NamedNodeMap attrs = node.getAttributes();
+			// go through each attribute in node and if attribute contains
+			// offset, return that attribute
+			for (int i = 0; i < attrs.getLength(); ++i) {
+				// assumption that if parent node is of type IndexedRegion,
+				// then its attributes will also be of type IndexedRegion
+				IndexedRegion attRegion = (IndexedRegion) attrs.item(i);
+				if (attRegion.contains(offset)) {
+					return (Attr) attrs.item(i);
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the node the cursor is currently on in the document. null if no
+	 * node is selected
+	 * 
+	 * @param offset
+	 * @return Node either element, doctype, text, or null
+	 */
+	private Node getCurrentNode(IDocument document, int offset) {
+		// get the current node at the offset (returns either: element,
+		// doctype, text)
+		IndexedRegion inode = null;
+		IStructuredModel sModel = null;
+		try {
+			sModel = StructuredModelManager.getModelManager().getExistingModelForRead(document);
+			if (sModel != null) {
+				inode = sModel.getIndexedRegion(offset);
+				if (inode == null) {
+					inode = sModel.getIndexedRegion(offset - 1);
+				}
+			}
+		}
+		finally {
+			if (sModel != null) {
+				sModel.releaseFromRead();
+			}
+		}
+
+		if (inode instanceof Node) {
+			return (Node) inode;
+		}
+		return null;
+	}
+
+	/**
+	 * Returns an IFile from the given uri if possible, null if cannot find
+	 * file from uri.
+	 * 
+	 * @param fileString
+	 *            file system path
+	 * @return returns IFile if fileString exists in the workspace
+	 */
+	private IFile getFile(String fileString) {
+		IFile file = null;
+
+		if (fileString != null) {
+			Path filePath = new Path(fileString);
+			if (filePath.segmentCount() > 1 && ResourcesPlugin.getWorkspace().getRoot().getFile(filePath).exists()) {
+				return ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+			}
+			IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(filePath);
+			for (int i = 0; (i < files.length) && (file == null); i++) {
+				if (files[i].exists()) {
+					file = files[i];
+				}
+			}
+		}
+
+		return file;
+	}
+
+	/**
+	 * Create a file from the given uri string
+	 * 
+	 * @param uriString -
+	 *            assumes uriString is not http://
+	 * @return File created from uriString if possible, null otherwise
+	 */
+	private File getFileFromUriString(String uriString) {
+		File file = null;
+		try {
+			// first just try to create a file directly from uriString as
+			// default in case create file from uri does not work
+			file = new File(uriString);
+
+			// try to create file from uri
+			URI uri = new URI(uriString);
+			file = new File(uri);
+		}
+		catch (Exception e) {
+			// if exception is thrown while trying to create File just ignore
+			// and file will be null
+		}
+		return file;
+	}
+
+	private IRegion getHyperlinkRegion(Node node) {
+		IRegion hyperRegion = null;
+
+		if (node != null) {
+			short nodeType = node.getNodeType();
+			if (nodeType == Node.DOCUMENT_TYPE_NODE) {
+				// handle doc type node
+				IDOMNode docNode = (IDOMNode) node;
+				hyperRegion = new Region(docNode.getStartOffset(), docNode.getEndOffset() - docNode.getStartOffset());
+			}
+			else if (nodeType == Node.ATTRIBUTE_NODE) {
+				// handle attribute nodes
+				IDOMAttr att = (IDOMAttr) node;
+				// do not include quotes in attribute value region
+				int regOffset = att.getValueRegionStartOffset();
+				ITextRegion valueRegion = att.getValueRegion();
+				if (valueRegion != null) {
+					int regLength = valueRegion.getTextLength();
+					String attValue = att.getValueRegionText();
+					if (StringUtils.isQuoted(attValue)) {
+						++regOffset;
+						regLength = regLength - 2;
+					}
+					hyperRegion = new Region(regOffset, regLength);
+				}
+			}
+		}
+		return hyperRegion;
+	}
+
+	/**
+	 * Attempts to find an attribute within element that is openable.
+	 * 
+	 * @param element -
+	 *            cannot be null
+	 * @return Attr attribute that can be used for open on, null if no
+	 *         attribute could be found
+	 */
+	private Attr getLinkableAttr(Element element) {
+		CMElementDeclaration ed = getCMElementDeclaration(element);
+		// get the list of attributes for this node
+		NamedNodeMap attrs = element.getAttributes();
+		for (int i = 0; i < attrs.getLength(); ++i) {
+			// check if this attribute is "openOn-able"
+			Attr att = (Attr) attrs.item(i);
+			if (isLinkableAttr(att, ed)) {
+				return att;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Find the location hint for the given namespaceURI if it exists
+	 * 
+	 * @param elementNode -
+	 *            cannot be null
+	 * @param namespaceURI -
+	 *            cannot be null
+	 * @return location hint (systemId) if it was found, null otherwise
+	 */
+	private String getLocationHint(Element elementNode, String namespaceURI) {
+		Attr schemaLocNode = elementNode.getAttributeNodeNS(XSI_NAMESPACE_URI, SCHEMA_LOCATION);
+		if (schemaLocNode != null) {
+			StringTokenizer st = new StringTokenizer(schemaLocNode.getValue());
+			while (st.hasMoreTokens()) {
+				String publicId = st.hasMoreTokens() ? st.nextToken() : null;
+				String systemId = st.hasMoreTokens() ? st.nextToken() : null;
+				// found location hint
+				if (namespaceURI.equalsIgnoreCase(publicId)) {
+					return systemId;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the URI string
+	 * 
+	 * @param node -
+	 *            assumes not null
+	 */
+	private String getURIString(Node node, IDocument document) {
+		String resolvedURI = null;
+		// need the base location, publicId, and systemId for URIResolver
+		String baseLoc = null;
+		String publicId = null;
+		String systemId = null;
+
+		short nodeType = node.getNodeType();
+		// handle doc type node
+		if (nodeType == Node.DOCUMENT_TYPE_NODE) {
+			baseLoc = getBaseLocation(document);
+			publicId = ((DocumentType) node).getPublicId();
+			systemId = ((DocumentType) node).getSystemId();
+		}
+		else if (nodeType == Node.ATTRIBUTE_NODE) {
+			// handle attribute node
+			Attr attrNode = (Attr) node;
+			String attrName = attrNode.getName();
+			String attrValue = attrNode.getValue();
+			attrValue = StringUtils.strip(attrValue);
+			if ((attrValue != null) && (attrValue.length() > 0)) {
+				baseLoc = getBaseLocation(document);
+
+				// handle schemaLocation attribute
+				String prefix = DOMNamespaceHelper.getPrefix(attrName);
+				String unprefixedName = DOMNamespaceHelper.getUnprefixedName(attrName);
+				if ((XMLNS.equals(prefix)) || (XMLNS.equals(unprefixedName))) {
+					publicId = attrValue;
+					systemId = getLocationHint(attrNode.getOwnerElement(), publicId);
+					if (systemId == null) {
+						systemId = attrValue;
+					}
+				}
+				else if ((XSI_NAMESPACE_URI.equals(DOMNamespaceHelper.getNamespaceURI(attrNode))) && (SCHEMA_LOCATION.equals(unprefixedName))) {
+					// for now just use the first pair
+					// need to look into being more precise
+					StringTokenizer st = new StringTokenizer(attrValue);
+					publicId = st.hasMoreTokens() ? st.nextToken() : null;
+					systemId = st.hasMoreTokens() ? st.nextToken() : null;
+					// else check if xmlns publicId = value
+				}
+				else {
+					systemId = attrValue;
+				}
+			}
+		}
+
+		resolvedURI = resolveURI(baseLoc, publicId, systemId);
+		return resolvedURI;
+	}
+
+	/**
+	 * Checks to see if the given attribute is openable. Attribute is openable
+	 * if it is a namespace declaration attribute or if the attribute value is
+	 * of type URI.
+	 * 
+	 * @param attr
+	 *            cannot be null
+	 * @param cmElement
+	 *            CMElementDeclaration associated with the attribute (can be
+	 *            null)
+	 * @return true if this attribute is "openOn-able" false otherwise
+	 */
+	private boolean isLinkableAttr(Attr attr, CMElementDeclaration cmElement) {
+		String attrName = attr.getName();
+		String prefix = DOMNamespaceHelper.getPrefix(attrName);
+		String unprefixedName = DOMNamespaceHelper.getUnprefixedName(attrName);
+		// determine if attribute is namespace declaration
+		if ((XMLNS.equals(prefix)) || (XMLNS.equals(unprefixedName))) {
+			return true;
+		}
+
+		// determine if attribute contains schema location
+		if ((XSI_NAMESPACE_URI.equals(DOMNamespaceHelper.getNamespaceURI(attr))) && ((SCHEMA_LOCATION.equals(unprefixedName)) || (NO_NAMESPACE_SCHEMA_LOCATION.equals(unprefixedName)))) {
+			return true;
+		}
+
+		// determine if attribute value is of type URI
+		if (cmElement != null) {
+			CMNamedNodeMap attrDecls = cmElement.getAttributes();
+			CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attrDecls);
+			List nodes = ModelQueryUtil.getModelQuery(attr.getOwnerDocument()).getAvailableContent(attr.getOwnerElement(), cmElement, ModelQuery.INCLUDE_ATTRIBUTES);
+			for (int k = 0; k < nodes.size(); k++) {
+				CMNode cmnode = (CMNode) nodes.get(k);
+				if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+					allAttributes.put(cmnode);
+				}
+			}
+			attrDecls = allAttributes;
+
+			CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) attrDecls.getNamedItem(attrName);
+			if ((attrDecl != null) && (attrDecl.getAttrType() != null) && (CMDataType.URI.equals(attrDecl.getAttrType().getDataTypeName()))) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Checks whether the given uriString is really pointing to a file
+	 * 
+	 * @param uriString
+	 * @return boolean
+	 */
+	private boolean isValidURI(String uriString) {
+		boolean isValid = false;
+
+		if (getCatalogEntry(uriString) != null) {
+			isValid = true;
+		}
+		else {
+			File file = getFileFromUriString(uriString);
+			if (file != null) {
+				isValid = file.isFile();
+			}
+			if(!isValid) {
+			}
+			
+		}
+		return isValid;
+	}
+
+	/**
+	 * @param uriString
+	 * @return
+	 */
+	private ICatalogEntry getCatalogEntry(String uriString) {
+		ICatalog defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		if (defaultCatalog != null) {
+			// Process default catalog
+			ICatalogEntry[] entries = defaultCatalog.getCatalogEntries();
+			for (int entry = 0; entry < entries.length; entry++) {
+				if (uriString.equals(entries[entry].getKey())||uriString.equals(entries[entry].getURI())) {
+					return entries[entry];
+				}
+			}
+
+			// Process declared OASIS nextCatalogs catalog
+			INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs();
+			for (int nextCatalog = 0; nextCatalog < nextCatalogs.length; nextCatalog++) {
+				ICatalog catalog = nextCatalogs[nextCatalog].getReferencedCatalog();
+				ICatalogEntry[] entries2 = catalog.getCatalogEntries();
+				for (int entry = 0; entry < entries2.length; entry++) {
+					if (uriString.equals(entries2[entry].getKey())||uriString.equals(entries2[entry].getURI()))
+						return entries2[entry];
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Resolves the given URI information
+	 * 
+	 * @param baseLocation
+	 * @param publicId
+	 * @param systemId
+	 * @return String resolved uri.
+	 */
+	private String resolveURI(String baseLocation, String publicId, String systemId) {
+		// dont resolve if there's nothing to resolve
+		if ((baseLocation == null) && (publicId == null) && (systemId == null)) {
+			return null;
+		}
+		return URIResolverPlugin.createResolver().resolve(baseLocation, publicId, systemId);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonAddNamespacesControl.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonAddNamespacesControl.java
new file mode 100644
index 0000000..5a2d83c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonAddNamespacesControl.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.nsedit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.dialogs.SelectFileOrXMLCatalogIdDialog;
+
+public class CommonAddNamespacesControl extends Composite implements SelectionListener {
+
+	class EditNamespaceControl extends Composite {
+		protected Button browseButton;
+		Text locationHintField;
+		Text prefixField;
+		Text uriField;
+
+		// protected NamespaceInfo info;
+
+		public EditNamespaceControl(Composite parent) {
+			super(parent, SWT.NONE); // BORDER);
+			setLayout(new GridLayout());
+			setLayoutData(new GridData(GridData.FILL_BOTH));
+
+			Label label = new Label(this, SWT.NONE);
+			label.setText(XMLUIMessages._UI_ENTER_REQ_PREFIX_AND_NAMESPACE);
+
+			Composite composite = new Composite(this, SWT.NONE);
+			GridLayout layout = new GridLayout();
+			layout.numColumns = 3;
+			layout.marginWidth = 0;
+			layout.verticalSpacing = 1;
+			composite.setLayout(layout);
+
+			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+			gd.widthHint = 350;
+			composite.setLayoutData(gd);
+
+			// row 1
+			//
+			Label prefixLabel = new Label(composite, SWT.NONE);
+			prefixLabel.setText(XMLUIMessages._UI_LABEL_PREFIX_COLON);
+
+			prefixField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+			prefixField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			// prefixField.setText(getDisplayValue(info.prefix));
+			// prefixField.addModifyListener(modifyListener);
+			// prefixField.setEnabled(info.getProperty("prefix-readOnly") ==
+			// null);
+			new Label(composite, SWT.NONE);
+
+			// row 2
+			//
+			Label uriLabel = new Label(composite, SWT.NONE);
+			uriLabel.setText(XMLUIMessages._UI_LABEL_NAMESPACE_NAME_COLON);
+
+			uriField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+			uriField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			// uriField.setText(getDisplayValue(info.uri));
+			// uriField.addModifyListener(modifyListener);
+			// uriField.setEnabled(info.getProperty("uri-readOnly") == null);
+
+			new Label(composite, SWT.NONE);
+
+			// row 3
+			//
+			Label locationHintLabel = new Label(composite, SWT.NONE);
+			locationHintLabel.setText(XMLUIMessages._UI_LABEL_LOCATION_HINT_COLON);
+
+			locationHintField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+			locationHintField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			// locationHintField.setText(getDisplayValue(info.locationHint));
+			// locationHintField.addModifyListener(modifyListener);
+			// locationHintField.setEnabled(info.getProperty("locationHint-readOnly")
+			// == null);
+
+			SelectionListener selectionListener = new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					performBrowse();
+				}
+			};
+
+			browseButton = new Button(composite, SWT.NONE);
+			browseButton.setText(XMLUIMessages._UI_LABEL_BROWSE);
+			browseButton.addSelectionListener(selectionListener);
+			browseButton.setEnabled(locationHintField.getEnabled());
+		}
+
+		protected void performBrowse() {
+			String[] extensions = {".xsd"}; //$NON-NLS-1$
+			SelectFileOrXMLCatalogIdDialog dialog = new SelectFileOrXMLCatalogIdDialog(getShell(), extensions);
+			dialog.create();
+			dialog.getShell().setText(XMLUIMessages._UI_LABEL_SELECT_FILE);
+			dialog.setBlockOnOpen(true);
+			dialog.open();
+
+			if (dialog.getReturnCode() == Window.OK) {
+				// String grammarURI = null;
+				IFile file = dialog.getFile();
+				String id = dialog.getId();
+				if (file != null) {
+					String uri = null;
+					if (resourceLocation != null) {
+						IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(resourceLocation);
+						if (resource != null) {
+							IPath location = resource.getLocation();
+							if (location != null) {
+								uri = URIHelper.getRelativeURI(file.getLocation(), location);
+							}
+						}
+	                    else {
+	                      uri = URIHelper.getRelativeURI(file.getLocation(), resourceLocation);
+	                    }
+						// grammarURI = file.getLocation().toOSString();
+					}
+					else {
+						uri = file.getLocation().toOSString();
+						// grammarURI = uri;
+					}
+					locationHintField.setText(uri);
+				}
+				else if (id != null) {
+					locationHintField.setText(id);
+					// URIResolver resolver =
+					URIResolverPlugin.createResolver();
+					// grammarURI = resolver.resolve(null, id, id);
+				}
+
+				try {
+					// TODO CMDocument document =
+					// CMDocumentBuilderRegistry.getInstance().buildCMDocument(grammarURI);
+					// List namespaceInfoList =
+					// (List)document.getProperty("http://org.eclipse.wst/cm/properties/namespaceInfo");
+					// NamespaceInfo info =
+					// (NamespaceInfo)namespaceInfoList.get(0);
+					// if (uriField.getText().trim().length() == 0 && info.uri
+					// != null)
+					// {
+					// uriField.setText(info.uri);
+					// }
+					// if (prefixField.getText().trim().length() == 0 &&
+					// info.prefix != null)
+					// {
+					// prefixField.setText(info.prefix);
+					// }
+				}
+				catch (Exception e) {
+				}
+			}
+		}
+	}
+
+	protected Button deleteButton;
+	protected Button editButton;
+	protected EditNamespaceControl editNamespaceControl;
+	protected int heightHint = 250;
+	protected List namespaceInfoList = new ArrayList();
+	protected Button newButton;
+	protected PageBook pageBook;
+	protected Button radio1;
+	protected Button radio2;
+	protected IPath resourceLocation;
+	protected Composite tableSection;
+	protected CommonNamespaceInfoTable tableViewer;
+	protected int widthHint = 500;
+
+
+	public CommonAddNamespacesControl(Composite parent, int style, IPath resourceLocation) {
+		super(parent, style);
+		this.resourceLocation = resourceLocation;
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		if (widthHint != -1) {
+			gd.widthHint = widthHint;
+		}
+		if (heightHint != -1) {
+			gd.heightHint = heightHint;
+		}
+		setLayoutData(gd);
+		setLayout(new GridLayout());
+
+		radio1 = new Button(this, SWT.RADIO);
+		radio1.setText(XMLUIMessages._UI_SELECT_REGISTERED_NAMESPACES);
+		radio1.setSelection(true);
+		radio1.addSelectionListener(this);
+
+		radio2 = new Button(this, SWT.RADIO);
+		radio2.setText(XMLUIMessages._UI_SPECIFY_NEW_NAMESPACE);
+		radio2.addSelectionListener(this);
+
+		Label separator = new Label(this, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		// Group namespaceInfoGroup = new Group(this, SWT.NONE);
+		// namespaceInfoGroup.setText("Namespace Declarations");
+		// //XMLCommonUIPlugin.getInstance().getString("_UI_LABEL_XML_SCHEMA_INFORMATION"));
+		// namespaceInfoGroup.setLayout(new GridLayout(2, false));
+		// namespaceInfoGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
+		pageBook = new PageBook(this, SWT.NONE);
+		pageBook.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		tableSection = new Composite(pageBook, SWT.NONE);
+		tableSection.setLayout(new GridLayout());
+		Label label = new Label(tableSection, SWT.NONE);
+		label.setText(XMLUIMessages._UI_SELECT_NAMESPACE_TO_ADD);
+
+		tableViewer = new CommonNamespaceInfoTable(tableSection, SWT.CHECK, 6);
+		editNamespaceControl = new EditNamespaceControl(pageBook);
+		pageBook.showPage(tableSection);
+
+		tableViewer.setInput(namespaceInfoList);
+	}
+
+
+
+	public List getNamespaceInfoList() {
+		List list = new ArrayList();
+		if (radio1.getSelection()) {
+			TableItem[] items = tableViewer.getTable().getItems();
+			for (int i = 0; i < items.length; i++) {
+				TableItem item = items[i];
+				if (item.getChecked()) {
+					list.add(item.getData());
+				}
+			}
+		}
+		else {
+			NamespaceInfo info = new NamespaceInfo();
+			info.prefix = editNamespaceControl.prefixField.getText();
+			info.uri = editNamespaceControl.uriField.getText();
+			info.locationHint = editNamespaceControl.locationHintField.getText();
+			list.add(info);
+		}
+		return list;
+	}
+
+	public void setNamespaceInfoList(List list) {
+		namespaceInfoList = list;
+		tableViewer.setInput(namespaceInfoList);
+	}
+
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	public void widgetSelected(SelectionEvent e) {
+		if (e.widget == radio1) {
+			pageBook.showPage(tableSection);
+		}
+		else if (e.widget == radio2) {
+			pageBook.showPage(editNamespaceControl);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonAddNamespacesDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonAddNamespacesDialog.java
new file mode 100644
index 0000000..269113f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonAddNamespacesDialog.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.nsedit;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+
+
+
+public class CommonAddNamespacesDialog extends Dialog {
+	protected CommonAddNamespacesControl addNamespacesControl;
+	protected List existingNamespaces;
+	protected List namespaceInfoList;
+	protected Button okButton;
+	protected HashMap preferredPrefixTable = new HashMap();
+	protected IPath resourceLocation;
+	protected String title;
+
+	public CommonAddNamespacesDialog(Shell parentShell, String title, IPath resourceLocation, List existingNamespaces) {
+		super(parentShell);
+		this.resourceLocation = resourceLocation;
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.title = title;
+		this.existingNamespaces = existingNamespaces;
+		preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/", "wsdl"); //$NON-NLS-1$ //$NON-NLS-2$
+		preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/soap/", "soap"); //$NON-NLS-1$ //$NON-NLS-2$
+		preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/http/", "http"); //$NON-NLS-1$ //$NON-NLS-2$
+		preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/mime/", "mime"); //$NON-NLS-1$ //$NON-NLS-2$
+		preferredPrefixTable.put("http://schemas.xmlsoap.org/soap/encoding/", "soapenc"); //$NON-NLS-1$ //$NON-NLS-2$
+		preferredPrefixTable.put("http://schemas.xmlsoap.org/soap/envelope/", "soapenv"); //$NON-NLS-1$ //$NON-NLS-2$
+		preferredPrefixTable.put("http://www.w3.org/2001/XMLSchema-instance", "xsi"); //$NON-NLS-1$ //$NON-NLS-2$
+		preferredPrefixTable.put("http://www.w3.org/2001/XMLSchema", "xsd"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	protected void addBuiltInNamespaces(List list) {
+		String xsiNamespace = "http://www.w3.org/2001/XMLSchema-instance"; //$NON-NLS-1$
+		String xsdNamespace = "http://www.w3.org/2001/XMLSchema"; //$NON-NLS-1$
+		if (!isAlreadyDeclared(xsiNamespace)) {
+			list.add(new NamespaceInfo("http://www.w3.org/2001/XMLSchema-instance", "xsi", null)); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		if (!isAlreadyDeclared(xsdNamespace)) {
+			list.add(new NamespaceInfo("http://www.w3.org/2001/XMLSchema", "xsd", null)); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	protected void addCatalogMapToList(ICatalog catalog, List list) {
+		ICatalogEntry[] entries = catalog.getCatalogEntries();
+		for (int i = 0; i < entries.length; i++) {
+			ICatalogEntry entry = entries[i];
+			if ((entry.getEntryType() == ICatalogEntry.ENTRY_TYPE_PUBLIC) && entry.getURI().endsWith(".xsd")) { //$NON-NLS-1$
+				if (!isAlreadyDeclared(entry.getKey())) {
+					NamespaceInfo namespaceInfo = new NamespaceInfo(entry.getKey(), "xx", null); //$NON-NLS-1$
+					list.add(namespaceInfo);
+				}
+			}
+		}
+	}
+
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			namespaceInfoList = addNamespacesControl.getNamespaceInfoList();
+		}
+		super.buttonPressed(buttonId);
+	}
+
+	public void computeAddablePrefixes(List addableList, List exisitingList) {
+		HashMap map = new HashMap();
+		for (Iterator i = exisitingList.iterator(); i.hasNext();) {
+			NamespaceInfo info = (NamespaceInfo) i.next();
+			if (info.prefix != null) {
+				map.put(info.prefix, info);
+			}
+		}
+		for (Iterator i = addableList.iterator(); i.hasNext();) {
+			NamespaceInfo info = (NamespaceInfo) i.next();
+			if (info.uri != null) {
+				String prefix = (String) preferredPrefixTable.get(info.uri);
+				info.prefix = getUniquePrefix(map, prefix, info.uri);
+				map.put(info.prefix, info);
+			}
+		}
+	}
+
+	public int createAndOpen() {
+		create();
+		getShell().setText(title);
+		Rectangle r = getShell().getBounds();
+		getShell().setBounds(r.x + 80, r.y + 80, r.width, r.height);
+		setBlockOnOpen(true);
+		return open();
+	}
+
+	protected void createButtonsForButtonBar(Composite parent) {
+		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+	}
+
+	protected Control createContents(Composite parent) {
+		Control control = super.createContents(parent);
+		return control;
+	}
+
+
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		addNamespacesControl = new CommonAddNamespacesControl(dialogArea, SWT.NONE, resourceLocation);
+		List list = new ArrayList();
+
+		addBuiltInNamespaces(list);
+		ICatalog defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
+		INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs();
+		for (int i = 0; i < nextCatalogs.length; i++) {
+			INextCatalog catalog = nextCatalogs[i];
+			ICatalog referencedCatalog = catalog.getReferencedCatalog();
+			if (referencedCatalog != null) {
+				if (XMLCorePlugin.USER_CATALOG_ID.equals(referencedCatalog.getId())) {
+					ICatalog userCatalog = referencedCatalog;
+					addCatalogMapToList(userCatalog, list);
+
+				}
+				else if (XMLCorePlugin.SYSTEM_CATALOG_ID.equals(referencedCatalog.getId())) {
+					ICatalog systemCatalog = referencedCatalog;
+					addCatalogMapToList(systemCatalog, list);
+				}
+			}
+		}
+
+		computeAddablePrefixes(list, existingNamespaces);
+
+		addNamespacesControl.setNamespaceInfoList(list);
+		return dialogArea;
+	}
+
+	public List getNamespaceInfoList() {
+		return namespaceInfoList;
+	}
+
+	protected String getPreferredPrefix(String namespaceURI) {
+		return (String) preferredPrefixTable.get(namespaceURI);
+	}
+
+	private String getUniquePrefix(HashMap prefixMap, String prefix, String uri) {
+		if (prefix == null) {
+			int lastIndex = uri.lastIndexOf('/');
+			if (lastIndex == uri.length() - 1) {
+				uri = uri.substring(0, lastIndex);
+				lastIndex = uri.lastIndexOf('/');
+			}
+			prefix = uri.substring(lastIndex + 1);
+			if ((prefix.length() > 20) || (prefix.indexOf(':') != -1)) {
+				prefix = null;
+			}
+		}
+		if (prefix == null) {
+			prefix = "p"; //$NON-NLS-1$
+		}
+		if (prefixMap.get(prefix) != null) {
+			String base = prefix;
+			for (int count = 0; prefixMap.get(prefix) != null; count++) {
+				prefix = base + count;
+			}
+		}
+		return prefix;
+	}
+
+	protected boolean isAlreadyDeclared(String namespaceURI) {
+		boolean result = false;
+		for (Iterator i = existingNamespaces.iterator(); i.hasNext();) {
+			NamespaceInfo namespaceInfo = (NamespaceInfo) i.next();
+			if (namespaceURI.equals(namespaceInfo.uri)) {
+				result = true;
+				break;
+			}
+		}
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonEditNamespacesDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonEditNamespacesDialog.java
new file mode 100644
index 0000000..3a358cd
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonEditNamespacesDialog.java
@@ -0,0 +1,327 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.nsedit;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.dialogs.EditNamespaceInfoDialog;
+import org.eclipse.wst.xml.ui.internal.dialogs.NamespaceInfoErrorHelper;
+
+public class CommonEditNamespacesDialog {
+	protected Composite commonComposite;
+	protected Button deleteButton;
+	protected Button editButton;
+
+	protected Label errorMessageLabel;
+	protected int heightHint = 250;
+	protected List namespaceInfoList = new ArrayList();
+
+	protected Button newButton;
+	protected IPath resourceLocation;
+
+	private boolean showLocationText = false;
+	protected String tableLabel = ""; //$NON-NLS-1$
+	protected CommonNamespaceInfoTable tableViewer;
+
+	protected Composite topComposite;
+	protected boolean useGroup;
+	protected int widthHint = 500;
+
+	public CommonEditNamespacesDialog(Composite parent, IPath resourceLocation, String stringTableLabel) {
+		this(parent, resourceLocation, stringTableLabel, false, false);
+	}
+
+	public CommonEditNamespacesDialog(Composite parent, IPath resourceLocation, String stringTableLabel, boolean useGroup, boolean showLocText) {
+		this.resourceLocation = resourceLocation;
+		tableLabel = stringTableLabel;
+		this.useGroup = useGroup;
+		showLocationText = showLocText;
+
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		if (widthHint != -1) {
+			gd.widthHint = widthHint;
+		}
+		if (heightHint != -1) {
+			gd.heightHint = heightHint;
+		}
+
+		// Set GridData and GridLayout for the parent Composite
+		parent.setLayoutData(gd);
+		parent.setLayout(new GridLayout());
+
+		// Create the top Composite
+		topComposite = new Composite(parent, SWT.NONE);
+		GridData topData = new GridData(GridData.FILL_HORIZONTAL);
+		topData.heightHint = 0;
+		topComposite.setLayoutData(topData);
+		topComposite.setLayout(new GridLayout());
+
+		// Create the 'common'/middle Composite
+		if (useGroup) {
+			commonComposite = new Group(parent, SWT.NONE);
+		}
+		else {
+			commonComposite = new Composite(parent, SWT.NONE);
+		}
+		commonComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+		commonComposite.setLayout(new GridLayout(3, false));
+
+		// Add the error Message Label
+		errorMessageLabel = new Label(parent, SWT.NONE);
+		errorMessageLabel.setLayoutData(createHorizontalFill());
+		Color color = new Color(errorMessageLabel.getDisplay(), 200, 0, 0);
+		errorMessageLabel.setForeground(color);
+
+		createControlArea();
+	}
+
+
+	protected void createButtons(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		composite.setLayoutData(new GridData(GridData.FILL_VERTICAL));
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 1;
+		gridLayout.marginHeight = 0;
+		gridLayout.marginWidth = 0;
+		composite.setLayout(gridLayout);
+
+		SelectionListener selectionListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (e.widget == newButton) {
+					performNew();
+				}
+				else if (e.widget == editButton) {
+					performEdit();
+				}
+				else if (e.widget == deleteButton) {
+					performDelete();
+				}
+			}
+		};
+
+		// create a composite to hold the three buttons
+		Composite buttonComposite = new Composite(composite, SWT.NONE);
+		buttonComposite.setLayoutData(createHorizontalFill());
+		GridLayout buttonGridLayout = new GridLayout();
+		// buttonGridLayout.numColumns = 3;
+		// buttonGridLayout.makeColumnsEqualWidth = true;
+		buttonComposite.setLayout(buttonGridLayout);
+
+		// add the New button
+		//
+		newButton = new Button(buttonComposite, SWT.NONE);
+		// newButton.setText(" " +
+		// XMLCommonUIPlugin.getInstance().getString("_UI_BUTTON_NEW") + " ");
+		newButton.setText("   " + XMLUIMessages.CommonEditNamespacesDialog_0 + "   "); //$NON-NLS-1$ //$NON-NLS-2$ 
+		newButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // ViewUtility.createHorizontalFill());
+		newButton.addSelectionListener(selectionListener);
+
+		// add the Edit button
+		//
+		// gd = new GridData();
+		// gd.horizontalAlignment = gd.FILL;
+		// gd.grabExcessHorizontalSpace = true;
+
+		editButton = new Button(buttonComposite, SWT.NONE);
+		editButton.setText(XMLUIMessages._UI_BUTTON_EDIT);
+		editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // ViewUtility.createHorizontalFill());
+		editButton.addSelectionListener(selectionListener);
+
+		// add the Delete button
+		//
+		// gd = new GridData();
+		// gd.horizontalAlignment = gd.FILL;
+		// gd.grabExcessHorizontalSpace = true;
+
+		deleteButton = new Button(buttonComposite, SWT.NONE);
+		deleteButton.setText(XMLUIMessages._UI_BUTTON_DELETE);
+		deleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // ViewUtility.createHorizontalFill());
+		deleteButton.addSelectionListener(selectionListener);
+	}
+
+	private void createControlArea() {
+		if (useGroup) {
+			((Group) commonComposite).setText(tableLabel);
+		}
+		else {
+			Label label = new Label(commonComposite, SWT.NONE);
+			label.setText(tableLabel);
+			label.setLayoutData(createGridData(false, 3));
+		}
+
+		tableViewer = new CommonNamespaceInfoTable(commonComposite, 6, showLocationText);
+		tableViewer.getControl().setLayoutData(createGridData(true, 2));
+		createButtons(commonComposite);
+
+		tableViewer.setInput(namespaceInfoList);
+		updateButtonEnabledState();
+		ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateButtonEnabledState();
+			}
+		};
+		tableViewer.addSelectionChangedListener(selectionChangedListener);
+	}
+
+	protected GridData createGridData(boolean both, int span) {
+		GridData gd = new GridData(both ? GridData.FILL_BOTH : GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = 2;
+		return gd;
+	}
+
+	private GridData createHorizontalFill() {
+		GridData gd = new GridData();
+		gd.horizontalAlignment = GridData.FILL;
+		gd.grabExcessHorizontalSpace = true;
+		return gd;
+	}
+
+
+
+	public NamespaceInfo getNamespaceInfo(String namespace) {
+		NamespaceInfo result = null;
+		for (Iterator i = namespaceInfoList.iterator(); i.hasNext();) {
+			NamespaceInfo info = (NamespaceInfo) i.next();
+			if ((info.uri != null) && info.uri.equals(namespace)) {
+				result = info;
+				break;
+			}
+		}
+		return result;
+	}
+
+	protected Object getSelection(ISelection selection) {
+		if (selection == null) {
+			return null;
+		} // end of if ()
+
+		Object result = null;
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection es = (IStructuredSelection) selection;
+			Iterator i = es.iterator();
+			if (i.hasNext()) {
+				result = i.next();
+			}
+		}
+		return result;
+	}
+
+	/*
+	 * Use the returned Composite to add content above the 'common contents'.
+	 * Note: The GridData for the returned Composite has a heightHint = 0.
+	 * This means when using the returned Composite, the GridData must be
+	 * reset, else the Composite and it's contents will not appear.
+	 */
+	protected Composite getTopComposite() {
+		return topComposite;
+	}
+
+	protected EditNamespaceInfoDialog invokeDialog(String title, NamespaceInfo info) {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		EditNamespaceInfoDialog dialog = new EditNamespaceInfoDialog(shell, info);
+		dialog.create();
+		dialog.getShell().setText(title);
+		dialog.setBlockOnOpen(true);
+		dialog.setResourceLocation(resourceLocation);
+		dialog.open();
+		return dialog;
+	}
+
+	protected void performDelayedUpdate() {
+		tableViewer.refresh();
+		/*
+		 * Runnable delayedUpdate = new Runnable() { public void run() {
+		 * tableViewer.refresh(); } };
+		 * Display.getCurrent().asyncExec(delayedUpdate);
+		 */
+		// if (updateListener != null)
+		// {
+		// updateListener.updateOccured(this, namespaceInfoList);
+		// }
+	}
+
+	public void performDelete() {
+		ISelection selection = tableViewer.getSelection();
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+			namespaceInfoList.removeAll(structuredSelection.toList());
+			updateErrorMessage(namespaceInfoList);
+			performDelayedUpdate();
+		}
+	}
+
+	public void performEdit() {
+		Object selection = getSelection(tableViewer.getSelection());
+		if (selection != null) {
+			invokeDialog(XMLUIMessages._UI_LABEL_NEW_NAMESPACE_INFORMATION, (NamespaceInfo) selection);
+			updateErrorMessage(namespaceInfoList);
+			performDelayedUpdate();
+		}
+	}
+
+	public void performNew() {
+		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		CommonAddNamespacesDialog dialog = new CommonAddNamespacesDialog(shell, XMLUIMessages._UI_ADD_NAMESPACE_DECLARATIONS, resourceLocation, namespaceInfoList);
+		dialog.createAndOpen();
+		if (dialog.getReturnCode() == Window.OK) {
+			namespaceInfoList.addAll(dialog.getNamespaceInfoList());
+			updateErrorMessage(namespaceInfoList);
+			performDelayedUpdate();
+		}
+	}
+
+	public void setNamespaceInfoList(List list) {
+		namespaceInfoList = list;
+		tableViewer.setInput(namespaceInfoList);
+	}
+
+	public void updateButtonEnabledState() {
+		Object selection = getSelection(tableViewer.getSelection());
+		NamespaceInfo info = (NamespaceInfo) selection;
+		editButton.setEnabled(info != null);
+		deleteButton.setEnabled((info != null) && (info.getProperty("unremovable") == null)); //$NON-NLS-1$
+	}
+
+	public void updateErrorMessage(List namespaceInfoList) {
+		NamespaceInfoErrorHelper helper = new NamespaceInfoErrorHelper();
+		String errorMessage = helper.computeErrorMessage(namespaceInfoList, null);
+		errorMessageLabel.setText(errorMessage != null ? errorMessage : ""); //$NON-NLS-1$
+	}
+	
+	public void setResourcePath(IPath path) {
+	  resourceLocation = path;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonEditNamespacesTargetFieldDialog.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonEditNamespacesTargetFieldDialog.java
new file mode 100644
index 0000000..1f6d85a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonEditNamespacesTargetFieldDialog.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.nsedit;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/*
+ * This class is an extension of CommonEditNamespacesDialog. This class adds
+ * the target namespaces dialog field.
+ */
+public class CommonEditNamespacesTargetFieldDialog extends CommonEditNamespacesDialog {
+
+	class TargetNamespaceModifyListener implements ModifyListener {
+		public void modifyText(ModifyEvent e) {
+			String oldTargetNamespace = targetNamespace;
+			targetNamespace = targetNamespaceField.getText();
+			updateTargetNamespaceAndNamespaceInfo(oldTargetNamespace, targetNamespace);
+		}
+	}
+
+	protected String targetNamespace;
+	protected Text targetNamespaceField;
+
+	public CommonEditNamespacesTargetFieldDialog(Composite parent, IPath resourceLocation1) {
+		super(parent, resourceLocation1, XMLUIMessages._UI_NAMESPACE_DECLARATIONS);
+
+		Composite targetComp = getTopComposite();
+		targetComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		Label targetNamespaceLabel = new Label(targetComp, SWT.NONE);
+		targetNamespaceLabel.setLayoutData(gd);
+		targetNamespaceLabel.setText(XMLUIMessages._UI_TARGET_NAMESPACE);
+
+		targetNamespaceField = new Text(targetComp, SWT.BORDER);
+		targetNamespaceField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		targetNamespaceField.addModifyListener(new TargetNamespaceModifyListener());
+
+		// createControlArea();
+	}
+
+	public String getTargetNamespace() {
+		return targetNamespace;
+	}
+
+	public void performEdit() {
+		Object selection = getSelection(tableViewer.getSelection());
+		if (selection != null) {
+			boolean editTargetNamespace = false;
+			NamespaceInfo nsInfo = (NamespaceInfo) selection;
+			if (getTargetNamespace().equals(nsInfo.uri)) {
+				editTargetNamespace = true;
+			}
+
+			invokeDialog(XMLUIMessages._UI_LABEL_NEW_NAMESPACE_INFORMATION, nsInfo);
+			updateErrorMessage(namespaceInfoList);
+			performDelayedUpdate();
+
+			if (editTargetNamespace) {
+				targetNamespaceField.setText(nsInfo.uri);
+			}
+		}
+	}
+
+	public void setTargetNamespace(String theTargetNamespace) {
+		targetNamespace = theTargetNamespace != null ? theTargetNamespace : ""; //$NON-NLS-1$
+		targetNamespaceField.setText(targetNamespace);
+		// updateTargetNamespaceAndNamespaceInfo(targetNamespace);
+	}
+
+	void updateTargetNamespaceAndNamespaceInfo(String oldTargetNamespace, String newTargetNamespace) {
+		NamespaceInfo info = getNamespaceInfo(newTargetNamespace);
+		if (info == null) {
+			info = getNamespaceInfo(oldTargetNamespace);
+			if (info == null) {
+				info = new NamespaceInfo(newTargetNamespace, "tns", null); //$NON-NLS-1$
+				namespaceInfoList.add(info);
+			}
+			else {
+				info.uri = targetNamespace;
+			}
+		}
+		tableViewer.refresh();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonNamespaceInfoTable.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonNamespaceInfoTable.java
new file mode 100644
index 0000000..44162e4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/nsedit/CommonNamespaceInfoTable.java
@@ -0,0 +1,346 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.nsedit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class CommonNamespaceInfoTable extends TableViewer {
+
+	/**
+	 * NamespaceInfoTableLabelProvider
+	 */
+	protected class Provider extends LabelProvider implements ITableLabelProvider, IStructuredContentProvider {
+		Viewer viewer;
+
+		public Image getColumnImage(Object object, int columnIndex) {
+			Image result = null;
+			int columnCode = getColumnCode(columnIndex);
+			if (columnCode == COLUMN_LOCATION_HINT) {
+				NamespaceInfo info = (NamespaceInfo) object;
+				if ((info.locationHint == null) || info.locationHint.trim().equals("")) { //$NON-NLS-1$
+					// Comment this out until we solve the alignment/(space
+					// for image being allocated
+					// to prefix column) ......
+					// result =
+					// XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_WARNING_OBJ);
+				}
+			}
+
+			return result;
+		}
+
+		public String getColumnText(Object object, int column) {
+			NamespaceInfo info = (NamespaceInfo) object;
+			String result = null;
+			int columnCode = getColumnCode(column);
+			switch (columnCode) {
+				case COLUMN_PREFIX : {
+					result = info.prefix;
+					break;
+				}
+				case COLUMN_NAMESPACE_URI : {
+					result = info.uri;
+					break;
+				}
+				case COLUMN_CHECKBOX : {
+					result = ""; // info.locationHint; //$NON-NLS-1$
+					break;
+				}
+				case COLUMN_LOCATION_HINT : {
+					result = info.locationHint;
+					break;
+				}
+			}
+			result = result != null ? result : ""; //$NON-NLS-1$
+			if (result.equals("")) { //$NON-NLS-1$
+				switch (columnCode) {
+					case COLUMN_PREFIX : {
+						result = XMLUIMessages._UI_NO_PREFIX;
+						break;
+					}
+					case COLUMN_NAMESPACE_URI : {
+						result = XMLUIMessages._UI_NO_NAMESPACE_NAME;
+						break;
+					}
+				}
+			}
+			return result;
+		}
+
+		public Object[] getElements(Object inputElement) {
+			List list = (List) viewer.getInput();
+			return list != null ? list.toArray() : null;
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			this.viewer = viewer;
+		}
+	}
+
+	class TableItemChecker extends MouseAdapter {
+		public void mouseDown(MouseEvent e) {
+			TableItem item = getTable().getItem(new Point(e.x, e.y));
+			if (item != null) {
+				Object obj = item.getData();
+				if (obj != null) {
+					NamespaceInfo info = (NamespaceInfo) obj;
+					TableColumn col = getTable().getColumn(0);
+					if (e.x < col.getWidth()) // if the point falls within
+												// the
+					// Select column then perform
+					// check/uncheck
+					{
+						String currentState = (String) info.getProperty("checked"); //$NON-NLS-1$
+						System.out.println("currentState" + currentState); //$NON-NLS-1$
+						if ((currentState == null) || currentState.equals("false")) //$NON-NLS-1$
+						{
+							info.setProperty("checked", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+						}
+						else {
+							info.setProperty("checked", "false"); //$NON-NLS-1$ //$NON-NLS-2$
+						}
+						refresh();
+					}
+				}
+			}
+		}
+	}
+
+	protected static final int COLUMN_CHECKBOX = 1;
+	protected static final int COLUMN_LOCATION_HINT = 4;
+	protected static final int COLUMN_NAMESPACE_URI = 2;
+	protected static final int COLUMN_PREFIX = 3;
+
+	protected static final String LABEL_CHECKBOX = ""; //$NON-NLS-1$
+	protected static final String LABEL_LOCATION_HINT = XMLUIMessages._UI_LABEL_LOCATION_HINT;
+	protected static final String LABEL_NAMESPACE_URI = XMLUIMessages._UI_LABEL_NAMESPACE_NAME;
+	protected static final String LABEL_PREFIX = XMLUIMessages._UI_LABEL_PREFIX;
+	protected List checkedList = new ArrayList();
+
+	// protected List namespaceInfoList = new ArrayList();
+	protected int[] columnIndexMap;
+	protected boolean showCheckBoxes = true;
+	private boolean showLocationText = false;
+
+	private Table table;
+	protected int visibleRows = -1;
+
+	public CommonNamespaceInfoTable(Composite parent, int visibleRows) {
+		this(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER, visibleRows, false);
+	}
+
+	// protected CellEditor getCellEditor(int column)
+	// {
+	// return (column == COLUMN_CHECKBOX) ? checkBoxCellEditor :
+	// textCellEditor;
+	// }
+
+	public CommonNamespaceInfoTable(Composite parent, int visibleRows, boolean showLocationText) {
+		this(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER, visibleRows, showLocationText);
+	}
+
+	public CommonNamespaceInfoTable(Composite parent, int style, int visibleRows) {
+		this(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER | style, visibleRows, false);
+	}
+
+	public CommonNamespaceInfoTable(Composite parent, int style, int visibleRows, boolean showLocationText) {
+		super(new Table(parent, style));
+		getTable().setLinesVisible(true);
+		this.showCheckBoxes = (style & SWT.CHECK) != 0;
+		columnIndexMap = createColumnIndexMap();
+		this.showLocationText = showLocationText;
+
+		Provider provider = new Provider();
+		setContentProvider(provider);
+		setLabelProvider(provider);
+
+		String[] columnPropertiesArray = createColumnPropertiesArray();
+		setColumnProperties(columnPropertiesArray);
+
+		table = getTable();
+		table.setHeaderVisible(true);
+		table.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		TableLayout layout = new TableLayout();
+
+		for (int i = 0; i < columnPropertiesArray.length; i++) {
+			TableColumn column = new TableColumn(table, i);
+			if ((columnPropertiesArray[i]).equals(LABEL_LOCATION_HINT)) {
+				if (showLocationText) {
+					column.setText(columnPropertiesArray[i]);
+				}
+				else {
+					// Comment this out until we solve the alignment/(space
+					// for image being allocated
+					// to prefix column) ......
+					// column.setImage(XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TXTEXT));
+				}
+			}
+			else {
+				column.setText(columnPropertiesArray[i]);
+			}
+			column.setAlignment(SWT.LEFT);
+			layout.addColumnData(new ColumnWeightData(getColumnWidth(i), true));
+		}
+		table.setLayout(layout);
+
+		this.visibleRows = visibleRows;
+		// for (int i = 0; i < visibleRows; i++)
+		// {
+		// TableItem item = new TableItem(table, SWT.NONE);
+		// item.setText("#######");
+		// }
+		// checkBoxCellEditor = new NamespaceInfoCheckboxCellEditor(table);
+		// textCellEditor = new TextCellEditor(table);
+
+		/*
+		 * CellEditor[] cellEditors = new
+		 * CellEditor[columnPropertiesArray.length]; for (int i = 0; i <
+		 * columnPropertiesArray.length; i++) { cellEditors[i] =
+		 * getCellEditor(i); } setCellEditors(cellEditors);
+		 */
+		// if (showCheckBoxes)
+		// {
+		// getTable().addMouseListener(new TableItemChecker());
+		// }
+	}
+
+	// protected CellEditor checkBoxCellEditor;
+	// protected CellEditor textCellEditor;
+
+	protected int[] createColumnIndexMap() {
+		int[] result = new int[showCheckBoxes ? 4 : 3];
+		int i = 0;
+		if (showCheckBoxes) {
+			result[i++] = COLUMN_CHECKBOX;
+		}
+		result[i++] = COLUMN_PREFIX;
+		result[i++] = COLUMN_NAMESPACE_URI;
+		if (!showCheckBoxes) {
+			result[i++] = COLUMN_LOCATION_HINT;
+		}
+		return result;
+	}
+
+	protected String[] createColumnPropertiesArray() {
+		String[] result = new String[3];
+		int i = 0;
+		if (showCheckBoxes) {
+			result[i++] = LABEL_CHECKBOX;
+		}
+		result[i++] = LABEL_PREFIX;
+		result[i++] = LABEL_NAMESPACE_URI;
+		if (!showCheckBoxes) {
+			result[i++] = LABEL_LOCATION_HINT;
+		}
+		return result;
+	}
+
+	protected int getColumnCode(int column) {
+		int result = 0;
+		if (column < columnIndexMap.length) {
+			result = columnIndexMap[column];
+		}
+		return result;
+	}
+
+	protected int getColumnWidth(int column) {
+		int result = 0;
+		switch (getColumnCode(column)) {
+			case COLUMN_PREFIX : {
+				result = 5;
+				break;
+			}
+			case COLUMN_NAMESPACE_URI : {
+				// Size columns differently when location hint text label is
+				// displayed
+				if (showLocationText) {
+					result = 10;
+				}
+				else {
+					result = 20;
+				}
+				break;
+			}
+			case COLUMN_CHECKBOX : {
+				result = 1; // info.locationHint;
+				break;
+			}
+			case COLUMN_LOCATION_HINT : {
+				// Size columns differently when location hint text label is
+				// displayed
+				if (showLocationText) {
+					result = 10;
+				}
+				else {
+					result = 2;
+				}
+				break;
+			}
+		}
+		return result;
+	}
+	/*
+	 * protected class NamespaceInfoCellModifier implements ICellModifier {
+	 * public NamespaceInfoCellModifier() { }
+	 * 
+	 * public boolean canModify(Object element, String property) { if
+	 * (property.equals(LABEL_CHECKBOX)) { return true; } else if
+	 * (property.equals(LABEL_PREFIX)) { return true; } return false; }
+	 * 
+	 * public Object getValue(Object element, String property) { int column =
+	 * 0; if (property.equals(LABEL_CHECKBOX)) { column = 0; } else if
+	 * (property.equals(LABEL_PREFIX)) { column = 1; } else if
+	 * (property.equals(LABEL_NAMESPACE_URI)) { column = 2; }
+	 * 
+	 * //if (element instanceof TableElement) //{ // return
+	 * provider.getColumnText(element, column); //} //else //{ // return null; // }
+	 * return "hello"; }
+	 * 
+	 * public void modify(Object element, String property, Object value) { } }
+	 * 
+	 * protected class NamespaceInfoCheckboxCellEditor extends
+	 * CheckboxCellEditor implements MouseListener { public
+	 * NamespaceInfoCheckboxCellEditor(Composite parent) { super(parent); }
+	 * 
+	 * protected void doSetValue(Object value) { }
+	 * 
+	 * public void activate() { super.activate(); deactivate();
+	 * Display.getCurrent().getFocusControl().redraw(); }
+	 * 
+	 * public void mouseDown(MouseEvent e) { if (getTable().getItem(new
+	 * Point(e.x, e.y)) != null) { } } public void mouseDoubleClick(MouseEvent
+	 * e) { } public void mouseUp(MouseEvent e) { } }
+	 */
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/perspective/XMLPerspectiveFactory.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/perspective/XMLPerspectiveFactory.java
new file mode 100644
index 0000000..93f579c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/perspective/XMLPerspectiveFactory.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 Standards for Technology in Automotive Retail
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Carver - bug 213883 - initial api 
+ *     IBM Corporation - bug 271619 - Move and rename XML perspective definition
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.perspective;
+
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xml.ui.internal.IProductConstants;
+import org.eclipse.wst.xml.ui.internal.ProductProperties;
+
+
+/**
+ * @author dcarver
+ * 
+ */
+public class XMLPerspectiveFactory implements IPerspectiveFactory {
+
+//	private static final String SEARCH_VIEW_ID = "org.eclipse.search.ui.views.SearchView"; //$NON-NLS-1$
+//	private static final String XPATH_VIEW_ID = "org.eclipse.wst.xml.views.XPathView"; //$NON-NLS-1$
+//	private static final String SNIPPETS_VIEW_ID = "org.eclipse.wst.common.snippets.internal.ui.SnippetsView"; //$NON-NLS-1$
+//	private static final String TEXTEDITOR_TEMPLATES_VIEW_ID = "org.eclipse.ui.texteditor.TemplatesView"; //$NON-NLS-1$
+//	private static final String ID_CONSOLE_VIEW = "org.eclipse.ui.console.ConsoleView"; //$NON-NLS-1$
+
+	private static String HIERARCHY_VIEW_ID = "org.eclipse.ui.navigator.ProjectExplorer"; //$NON-NLS-1$
+
+	public XMLPerspectiveFactory() {
+		String viewerID = ProductProperties.getProperty(IProductConstants.PERSPECTIVE_EXPLORER_VIEW);
+		if (viewerID != null) {
+			// verify that the view actually exists
+			if (PlatformUI.getWorkbench().getViewRegistry().find(viewerID) != null){
+				HIERARCHY_VIEW_ID = viewerID;
+			}
+		}
+	}
+	/**
+	 * Creates the initial layout. This is what the layout is reset to when
+	 * the Reset Perspective is selected. It takes as input a IPageLayout
+	 * object.
+	 * 
+	 * @param layout
+	 */
+	public void createInitialLayout(IPageLayout layout) {
+		// Get the Editor Area
+//		String editorArea = layout.getEditorArea();
+
+		// Turn on the Editor Area
+		layout.setEditorAreaVisible(true);
+		layout.setFixed(false);
+
+		layout.addShowViewShortcut(HIERARCHY_VIEW_ID);
+
+		IFolderLayout topLeft = layout.createFolder("topLeft", IPageLayout.LEFT, 0.23f, layout.getEditorArea());//$NON-NLS-1$
+		topLeft.addView(HIERARCHY_VIEW_ID);
+
+		// Create the areas of the layout with their initial views
+//		IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, (float) 0.23, editorArea); //$NON-NLS-1$
+//		left.addView(IPageLayout.ID_PROJECT_EXPLORER);
+//
+//		IFolderLayout bottomLeft = layout.createFolder("bottom-left", IPageLayout.BOTTOM, (float) 0.50, "left"); //$NON-NLS-1$ //$NON-NLS-2$
+//		bottomLeft.addView(XPATH_VIEW_ID); //$NON-NLS-1$
+//
+//		IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT, (float) 0.70, editorArea); //$NON-NLS-1$
+//		right.addView(IPageLayout.ID_OUTLINE);
+//		
+//		IFolderLayout bottomRight = layout.createFolder("bottom-right", IPageLayout.BOTTOM, (float) 0.60, "right"); //$NON-NLS-1$//$NON-NLS-2$
+//		bottomRight.addView(TEXTEDITOR_TEMPLATES_VIEW_ID);
+//
+//		IFolderLayout bottom = layout.createFolder("bottom", IPageLayout.BOTTOM, (float) 0.75, editorArea); //$NON-NLS-1$
+//		bottom.addView(IPageLayout.ID_PROBLEM_VIEW);
+//		bottom.addView(IPageLayout.ID_PROP_SHEET);
+//		bottom.addView(ID_CONSOLE_VIEW);
+//		bottom.addView(SNIPPETS_VIEW_ID);
+//
+//		bottom.addPlaceholder(SEARCH_VIEW_ID);
+	}
+	
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/EmptyFilePreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/EmptyFilePreferencePage.java
new file mode 100644
index 0000000..9870632
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/EmptyFilePreferencePage.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+public class EmptyFilePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+	private Composite createComposite(Composite parent, int numColumns) {
+		noDefaultAndApplyButton();
+
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		// GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+
+		// GridData
+		GridData data = new GridData(GridData.FILL);
+		data.horizontalIndent = 0;
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+	protected Control createContents(Composite parent) {
+		Composite composite = createScrolledComposite(parent);
+
+		String description = XMLUIMessages.EmptyFilePreferencePage_0; 
+		Text text = new Text(composite, SWT.READ_ONLY);
+		// some themes on GTK have different background colors for Text and Labels
+		text.setBackground(composite.getBackground());
+		text.setText(description);
+
+		setSize(composite);
+		return composite;
+	}
+
+	private Composite createScrolledComposite(Composite parent) {
+		// create scrollbars for this parent when needed
+		final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
+		Composite composite = createComposite(sc1, 1);
+		sc1.setContent(composite);
+
+		// not calling setSize for composite will result in a blank composite,
+		// so calling it here initially
+		// setSize actually needs to be called after all controls are created,
+		// so scrolledComposite
+		// has correct minSize
+		setSize(composite);
+		return composite;
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+
+	private void setSize(Composite composite) {
+		if (composite != null) {
+			// Note: The font is set here in anticipation that the class inheriting
+			//       this base class may add widgets to the dialog.   setSize
+			//       is assumed to be called just before we go live.
+			applyDialogFont(composite);
+			Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+			composite.setSize(minSize);
+			// set scrollbar composite's min size so page is expandable but
+			// has scrollbars when needed
+			if (composite.getParent() instanceof ScrolledComposite) {
+				ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
+				sc1.setMinSize(minSize);
+				sc1.setExpandHorizontal(true);
+				sc1.setExpandVertical(true);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/EncodingSettings.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/EncodingSettings.java
new file mode 100644
index 0000000..16fa130
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/EncodingSettings.java
@@ -0,0 +1,360 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import java.util.Vector;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.sse.core.internal.encoding.CommonCharsetNames;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * EncodingSettings is a composite that can be used to display the set of
+ * encoding values that are available to the user. The list of encoding values
+ * is based off the SupportedJavaEncoding class. As the user selects an
+ * encoding from the combo box, the readonly field below it changes to show
+ * the IANA tag for that particular encoding description. The labels for the
+ * widgets are configurable and the initial value to display to the user can
+ * be set using the setIANATag(). The currently selected entry's IANA tag can
+ * be retrieved with getIANATag(). Entries displayed to the user can be added
+ * and removed.
+ */
+public class EncodingSettings extends Composite {
+
+	private class ComboListener implements ModifyListener {
+		public void modifyText(ModifyEvent e) {
+			int i = encodingCombo.getSelectionIndex();
+			if ((i >= 0) && (i < ianaVector.size())) {
+				ianaText.setText((String) (ianaVector.elementAt(encodingCombo.getSelectionIndex())));
+			}
+		}
+	}
+
+	private static String ENCODING_LABEL = XMLUIMessages.EncodingSettings_1;
+
+	private static String IANA_LABEL = XMLUIMessages.EncodingSettings_0;
+
+	private ModifyListener comboListener = new ComboListener();
+	protected Combo encodingCombo;
+	protected Label encodingLabel, ianaLabel;
+	protected Text ianaText;
+	protected Vector ianaVector;
+
+	/**
+	 * Method EncodingSettings.
+	 * 
+	 * @param parent
+	 */
+	public EncodingSettings(Composite parent) {
+		super(parent, SWT.NONE);
+		init(IANA_LABEL, ENCODING_LABEL);
+	}
+
+	/**
+	 * Method EncodingSettings.
+	 * 
+	 * @param parent
+	 * @param encodingLabel -
+	 *            text label to use beside the locale sensitive description of
+	 *            the currently selected encoding
+	 */
+	public EncodingSettings(Composite parent, String encodingLabel) {
+		super(parent, SWT.NONE);
+		init(IANA_LABEL, encodingLabel);
+	}
+
+	/**
+	 * Method EncodingSettings.
+	 * 
+	 * @param parent
+	 * @param ianaLabel =
+	 *            text label to use beside the display only IANA field
+	 * @param encodingLabel -
+	 *            text label to use beside the locale sensitive description of
+	 *            the currently selected encoding
+	 */
+	public EncodingSettings(Composite parent, String ianaLabel, String encodingLabel) {
+		super(parent, SWT.NONE);
+		init(ianaLabel, encodingLabel);
+	}
+
+	/**
+	 * Method addEntry. Add an entry to the end of the Encoding Combobox
+	 * 
+	 * @param description -
+	 *            encoding description to display
+	 * @param ianaTag -
+	 *            IANA tag for the description
+	 */
+	public void addEntry(String description, String ianaTag) {
+		encodingCombo.add(description);
+		ianaVector.add(ianaTag);
+	}
+
+	/**
+	 * Method addEntry. Add an entry to the Encoding Combobox at index index
+	 * 
+	 * @param description -
+	 *            encoding description to display
+	 * @param ianaTag -
+	 *            IANA tag for the description
+	 * @param index -
+	 *            index into the combo to add to
+	 */
+	public void addEntry(String description, String ianaTag, int index) {
+		if (index == ianaVector.size()) {
+			// just add to the end
+			addEntry(description, ianaTag);
+			return;
+		}
+
+		if ((0 <= index) && (index < ianaVector.size())) {
+			encodingCombo.add(description, index);
+			ianaVector.add(index, ianaTag);
+		}
+	}
+
+	protected Combo createComboBox(Composite parent, boolean isReadOnly) {
+		int style = isReadOnly == true ? SWT.READ_ONLY : SWT.DROP_DOWN;
+
+		Combo combo = new Combo(parent, style);
+
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		combo.setLayoutData(data);
+		return combo;
+	}
+
+	/**
+	 * Helper method for creating labels.
+	 */
+	protected Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.LEFT);
+		label.setText(text);
+
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		label.setLayoutData(data);
+		return label;
+	}
+
+	protected Text createTextField(Composite parent, int width) {
+		Text text = new Text(parent, SWT.SINGLE | SWT.READ_ONLY);
+
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		data.widthHint = width;
+		text.setLayoutData(data);
+
+		text.setBackground(text.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+		return text;
+	}
+
+	/**
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		encodingCombo.removeModifyListener(comboListener);
+		super.dispose();
+	}
+
+	private void fillCombo() {
+		try {
+			String[] ianaTags = CommonCharsetNames.getCommonCharsetNames();
+			int totalNum = ianaTags.length;
+			for (int i = 0; i < totalNum; i++) {
+				String iana = ianaTags[i];
+				String enc = CommonCharsetNames.getDisplayString(iana);
+
+				if (enc != null) {
+					encodingCombo.add(enc);
+				}
+				else {
+					Logger.log(Logger.WARNING, "CommonCharsetNames.getDisplayString(" + iana + ") returned null"); //$NON-NLS-1$ //$NON-NLS-2$
+					encodingCombo.add(iana);
+				}
+				ianaVector.add(iana);
+			}
+		}
+		catch (Exception e) {
+			// e.printStackTrace();
+			// MessageDialog.openError(getShell(), "Resource exception",
+			// "Unable to obtain encoding strings. Check resource file");
+			// XMLEncodingPlugin.getPlugin().getMsgLogger().write(e.toString());
+			// XMLEncodingPlugin.getPlugin().getMsgLogger().writeCurrentThread();
+			Logger.log(Logger.ERROR, "Exception", e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * <code>getEncoding</code> Get the descriptive encoding name that was
+	 * selected.
+	 * 
+	 * @return a <code>String</code> value
+	 */
+	public String getEncoding() {
+		return encodingCombo.getText();
+	}
+
+	/**
+	 * Method getEncodingCombo. Returns the combo used to display the encoding
+	 * descriptions.
+	 * 
+	 * @return Combo
+	 */
+	public Combo getEncodingCombo() {
+		return encodingCombo;
+	}
+
+	/**
+	 * <code>getIANATag</code> Get the IANA tag equivalent of the selected
+	 * descriptive encoding name
+	 * 
+	 * @return a <code>String</code> value
+	 */
+	public String getIANATag() {
+		int i = encodingCombo.getSelectionIndex();
+		if (i >= 0) {
+			return (String) (ianaVector.elementAt(i));
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	protected void init(String ianaLabelStr, String encodingLabelStr) {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		setLayout(layout);
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		setLayoutData(data);
+
+		encodingLabel = createLabel(this, encodingLabelStr);
+		encodingCombo = createComboBox(this, true);
+		ianaLabel = createLabel(this, ianaLabelStr);
+		ianaText = createTextField(this, 20);
+		ianaVector = new Vector();
+
+		fillCombo();
+		resetToDefaultEncoding();
+		encodingCombo.addModifyListener(comboListener);
+	}
+
+	/**
+	 * <code>isEncodingInList</code> Checks whether the encoding name is in
+	 * the combo
+	 * 
+	 * @param enc
+	 *            a <code>string</code> value. The encoding name.
+	 * @return a <code>boolean</code> value. TRUE if encoding is in list.
+	 *         FALSE if encoding is not in list.
+	 */
+	public boolean isEncodingInList(String enc) {
+		int i = encodingCombo.indexOf(enc);
+		if (i >= 0) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * <code>isIANATagInList</code> Checks whether the IANA tag is in the
+	 * combo
+	 * 
+	 * @param ianaTag
+	 *            a <code>string</code> value. The IANA tag.
+	 * @return a <code>boolean</code> value. TRUE if tag is in list. FALSE
+	 *         if tag is not in list.
+	 */
+	public boolean isIANATagInList(String ianaTag) {
+		int i = ianaVector.indexOf(ianaTag);
+		if (i >= 0) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Method removeEntry. Removes both the description and the IANA tag at
+	 * the specified index
+	 * 
+	 * @param index
+	 */
+	public void removeEntry(int index) {
+		if ((0 <= index) && (index < ianaVector.size())) {
+			encodingCombo.remove(index);
+			ianaVector.remove(index);
+		}
+	}
+
+	/**
+	 * Method resetToDefaultEncoding. Reset the control to the default
+	 * encoding. Currently UTF-8
+	 */
+	public void resetToDefaultEncoding() {
+		String defaultIANATag = "UTF-8"; //$NON-NLS-1$
+		ianaText.setText(defaultIANATag);
+		setIANATag(defaultIANATag);
+	}
+
+	/**
+	 * Method setEnabled. Enable/disable the EncodingSettings composite.
+	 * 
+	 * @param enabled
+	 */
+	public void setEnabled(boolean enabled) {
+		encodingCombo.setEnabled(enabled);
+		encodingLabel.setEnabled(enabled);
+		ianaLabel.setEnabled(enabled);
+		ianaText.setEnabled(enabled);
+	}
+
+	/**
+	 * <code>setEncoding</code> Set the selection in the combo to the
+	 * descriptive encoding name.
+	 * 
+	 * @param enc
+	 *            a <code>string</code> value. Note this is not the IANA
+	 *            tag.
+	 */
+	public void setEncoding(String enc) {
+		encodingCombo.setText(enc);
+		encodingCombo.select(encodingCombo.indexOf(enc));
+	}
+
+	/**
+	 * <code>setIANATag</code> Set the IANA tag for the combo
+	 * 
+	 * @param ianaTag
+	 *            a <code>string</code> value. The IANA tag.
+	 */
+	public void setIANATag(String ianaTag) {
+		int i = ianaVector.indexOf(ianaTag);
+		if (i >= 0) {
+			encodingCombo.select(i);
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/WorkbenchDefaultEncodingSettings.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/WorkbenchDefaultEncodingSettings.java
new file mode 100644
index 0000000..e7930ed
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/WorkbenchDefaultEncodingSettings.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.sse.core.internal.encoding.CommonCharsetNames;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * WorkbenchDefaultEncodingSettings is an extension of EncodingSettings. This
+ * composite contains EncodingSettings for users to select the encoding they
+ * desire as well as a checkbox for users to select to use the default
+ * workbench encoding instead.
+ * 
+ * @see org.eclipse.wst.xml.ui.internal.preferences.EncodingSettings
+ */
+public class WorkbenchDefaultEncodingSettings extends Composite {
+
+	private final static int INDENT = 15;
+	private static final String WORKBENCH_DEFAULT = ""; //$NON-NLS-1$
+	private EncodingSettings fEncodingSettings;
+	private String fNonDefaultIANA = null;
+	private Button fUseDefaultButton;
+
+	public WorkbenchDefaultEncodingSettings(Composite parent) {
+		super(parent, SWT.NONE);
+		createControls();
+	}
+
+	private void createControls() {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginWidth = 0;
+		setLayout(layout);
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		setLayoutData(data);
+
+		Composite defaultEncodingComposite = new Composite(this, SWT.NONE);
+		layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		data = new GridData(GridData.FILL_BOTH);
+		defaultEncodingComposite.setLayout(layout);
+		defaultEncodingComposite.setLayoutData(data);
+
+		fUseDefaultButton = new Button(defaultEncodingComposite, SWT.CHECK);
+		fUseDefaultButton.setText(XMLUIMessages.WorkbenchDefaultEncodingSettings_0);
+
+		fUseDefaultButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleUseDefaultButtonSelected();
+			}
+		});
+
+		fEncodingSettings = new EncodingSettings(this);
+		((GridLayout) fEncodingSettings.getLayout()).marginWidth = 0;
+		((GridData) fEncodingSettings.getLayoutData()).horizontalIndent = INDENT;
+
+	}
+
+	private Combo getEncodingCombo() {
+		return fEncodingSettings.getEncodingCombo();
+	}
+
+	/**
+	 * <code>getIANATag</code> Get the IANA tag equivalent of the selected
+	 * descriptive encoding name. Returns empty string if using workbench
+	 * encoding.
+	 * 
+	 * @return a <code>String</code> value
+	 */
+	public String getIANATag() {
+		if (!isDefault()) {
+			return fEncodingSettings.getIANATag();
+		}
+		return WORKBENCH_DEFAULT;
+	}
+
+	private String getWorkbenchEncoding() {
+		return ResourcesPlugin.getEncoding();
+	}
+
+	void handleUseDefaultButtonSelected() {
+		if (fUseDefaultButton.getSelection()) {
+			fNonDefaultIANA = fEncodingSettings.getIANATag();
+			String workbenchValue = getWorkbenchEncoding();
+			workbenchValue = CommonCharsetNames.getIanaPreferredCharsetName(workbenchValue);
+			fEncodingSettings.setIANATag(workbenchValue);
+		}
+		else if (fNonDefaultIANA != null) {
+			fEncodingSettings.setIANATag(fNonDefaultIANA);
+		}
+		getEncodingCombo().setEnabled(!fUseDefaultButton.getSelection());
+		fEncodingSettings.setEnabled(!fUseDefaultButton.getSelection());
+	}
+
+	private boolean isDefault() {
+		return fUseDefaultButton.getSelection();
+	}
+
+	/**
+	 * <code>setEncoding</code> Set the selection in the combo to the
+	 * descriptive encoding name. Selects use workbench encoding if ianaTag is
+	 * null or empty string.
+	 * 
+	 */
+	public void setIANATag(String ianaTag) {
+		if ((ianaTag == null) || ianaTag.equals(WORKBENCH_DEFAULT)) {
+			fUseDefaultButton.setSelection(true);
+			handleUseDefaultButtonSelected();
+		}
+		else {
+			fUseDefaultButton.setSelection(false);
+			handleUseDefaultButtonSelected();
+			if (!isDefault()) {
+				fEncodingSettings.setIANATag(ianaTag);
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLColorPage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLColorPage.java
new file mode 100644
index 0000000..4f29d75
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLColorPage.java
@@ -0,0 +1,288 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference 
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore.OverlayKey;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractColorPage;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.StyledTextColorPicker;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML;
+
+/**
+ * @deprecated
+ */
+public class XMLColorPage extends AbstractColorPage {
+
+	protected Control createContents(Composite parent) {
+		Composite pageComponent = createComposite(parent, 1);
+		((GridData) pageComponent.getLayoutData()).horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;
+
+		super.createContents(pageComponent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(pageComponent, IHelpContextIds.XML_PREFWEBX_STYLES_HELPID);
+		return pageComponent;
+	}
+
+	/**
+	 * Set up all the style preference keys in the overlay store
+	 */
+	protected OverlayKey[] createOverlayStoreKeys() {
+		ArrayList overlayKeys = new ArrayList();
+
+		ArrayList styleList = new ArrayList();
+		initStyleList(styleList);
+		Iterator i = styleList.iterator();
+		while (i.hasNext()) {
+			overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, (String) i.next()));
+		}
+
+		OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
+		overlayKeys.toArray(keys);
+		return keys;
+	}
+
+	protected IPreferenceStore doGetPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	public String getSampleText() {
+		return XMLUIMessages.Sample_XML_doc; // = "<?xml
+		// version=\"1.0\"?>\n<?customProcessingInstruction\n\tXML
+		// processor
+		// specific\n\tcontent
+		// ?>\n<!DOCTYPE
+		// colors\n\tPUBLIC
+		// \"//IBM/XML/COLORS/\"
+		// \"colors.dtd\">\n<colors>\n\t<!--
+		// begin color definitions
+		// -->\n\t<color
+		// name=\"plaintext\"
+		// foreground=\"#000000\"\n\t\tbackground=\"#D4D0C8\"/>\n\t<color
+		// name=\"bold\"
+		// foreground=\"#000000\"\n\t\tbackground=\"#B3ACA0\">\n\t<![CDATA[<123456789>]]>\n\tNormal
+		// text content.\n\t<color
+		// name=\"inverse\"
+		// foreground=\"#F0F0F0\"\n\t\tbackground=\"#D4D0C8\"/>\n\n</colors>\n";
+	}
+
+	protected void initCommonContextStyleMap(Dictionary contextStyleMap) {
+
+		contextStyleMap.put(DOMRegionContext.XML_COMMENT_OPEN, IStyleConstantsXML.COMMENT_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_COMMENT_TEXT, IStyleConstantsXML.COMMENT_TEXT);
+		contextStyleMap.put(DOMRegionContext.XML_COMMENT_CLOSE, IStyleConstantsXML.COMMENT_BORDER);
+
+		contextStyleMap.put(DOMRegionContext.XML_TAG_OPEN, IStyleConstantsXML.TAG_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_END_TAG_OPEN, IStyleConstantsXML.TAG_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_TAG_NAME, IStyleConstantsXML.TAG_NAME);
+		contextStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+		contextStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+		contextStyleMap.put(DOMRegionContext.XML_TAG_CLOSE, IStyleConstantsXML.TAG_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_EMPTY_TAG_CLOSE, IStyleConstantsXML.TAG_BORDER);
+
+		contextStyleMap.put(DOMRegionContext.XML_DECLARATION_OPEN, IStyleConstantsXML.DECL_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_DECLARATION_CLOSE, IStyleConstantsXML.DECL_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_ELEMENT_DECLARATION, IStyleConstantsXML.DECL_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_ELEMENT_DECL_CLOSE, IStyleConstantsXML.DECL_BORDER);
+
+		contextStyleMap.put(DOMRegionContext.XML_CHAR_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+		contextStyleMap.put(DOMRegionContext.XML_ENTITY_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+		contextStyleMap.put(DOMRegionContext.XML_PE_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+
+		contextStyleMap.put(DOMRegionContext.XML_CONTENT, IStyleConstantsXML.XML_CONTENT);
+	}
+
+	protected void initCommonDescriptions(Dictionary descriptions) {
+
+		// create descriptions for hilighting types
+		descriptions.put(IStyleConstantsXML.COMMENT_BORDER, XMLUIMessages.Comment_Delimiters_UI_); // =
+		// "Comment
+		// Delimiters"
+		descriptions.put(IStyleConstantsXML.COMMENT_TEXT, XMLUIMessages.Comment_Content_UI_); // =
+		// "Comment
+		// Content"
+		descriptions.put(IStyleConstantsXML.TAG_BORDER, XMLUIMessages.Tag_Delimiters_UI_); // =
+		// "Tag
+		// Delimiters"
+		descriptions.put(IStyleConstantsXML.TAG_NAME, XMLUIMessages.Tag_Names_UI_); // =
+		// "Tag
+		// Names"
+		descriptions.put(IStyleConstantsXML.TAG_ATTRIBUTE_NAME, XMLUIMessages.Attribute_Names_UI_); // =
+		// "Attribute
+		// Names"
+		descriptions.put(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE, XMLUIMessages.Attribute_Values_UI_); // =
+		// "Attribute
+		// Values"
+		descriptions.put(IStyleConstantsXML.DECL_BORDER, XMLUIMessages.Declaration_Delimiters_UI_); // =
+		// "Declaration
+		// Delimiters"
+		descriptions.put(IStyleConstantsXML.XML_CONTENT, XMLUIMessages.Content_UI_); // =
+		// "Content"
+		descriptions.put(IStyleConstantsXML.ENTITY_REFERENCE, XMLUIMessages.Entity_Reference_UI_); //$NON-NLS-1$ = "Entity References"
+	}
+
+	protected void initCommonStyleList(ArrayList list) {
+
+		// list.add(IStyleConstantsXML.CDATA_BORDER);
+		// list.add(IStyleConstantsXML.CDATA_TEXT);
+		// list.add(IStyleConstantsXML.PI_BORDER);
+		// list.add(IStyleConstantsXML.PI_CONTENT);
+
+		list.add(IStyleConstantsXML.TAG_BORDER);
+		list.add(IStyleConstantsXML.TAG_NAME);
+		list.add(IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+		list.add(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+		list.add(IStyleConstantsXML.COMMENT_BORDER);
+		list.add(IStyleConstantsXML.COMMENT_TEXT);
+		list.add(IStyleConstantsXML.DECL_BORDER);
+		list.add(IStyleConstantsXML.XML_CONTENT);
+		list.add(IStyleConstantsXML.ENTITY_REFERENCE);
+	}
+
+	protected void initContextStyleMap(Dictionary contextStyleMap) {
+
+		initCommonContextStyleMap(contextStyleMap);
+		initDocTypeContextStyleMap(contextStyleMap);
+		contextStyleMap.put(DOMRegionContext.XML_CDATA_OPEN, IStyleConstantsXML.CDATA_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_CDATA_TEXT, IStyleConstantsXML.CDATA_TEXT);
+		contextStyleMap.put(DOMRegionContext.XML_CDATA_CLOSE, IStyleConstantsXML.CDATA_BORDER);
+
+		contextStyleMap.put(DOMRegionContext.XML_PI_OPEN, IStyleConstantsXML.PI_BORDER);
+		contextStyleMap.put(DOMRegionContext.XML_PI_CONTENT, IStyleConstantsXML.PI_CONTENT);
+		contextStyleMap.put(DOMRegionContext.XML_PI_CLOSE, IStyleConstantsXML.PI_BORDER);
+
+	}
+
+	protected void initDescriptions(Dictionary descriptions) {
+
+		initCommonDescriptions(descriptions);
+		initDocTypeDescriptions(descriptions);
+		descriptions.put(IStyleConstantsXML.CDATA_BORDER, XMLUIMessages.CDATA_Delimiters_UI_); // =
+		// "CDATA
+		// Delimiters"
+		descriptions.put(IStyleConstantsXML.CDATA_TEXT, XMLUIMessages.CDATA_Content_UI_); // =
+		// "CDATA
+		// Content"
+		descriptions.put(IStyleConstantsXML.PI_BORDER, XMLUIMessages.Processing_Instruction_Del_UI_); // =
+		// "Processing
+		// Instruction
+		// Delimiters"
+		descriptions.put(IStyleConstantsXML.PI_CONTENT, XMLUIMessages.Processing_Instruction_Con_UI__UI_); // =
+		// "Processing
+		// Instruction
+		// Content"
+	}
+
+	protected void initDocTypeContextStyleMap(Dictionary contextStyleMap) {
+
+		contextStyleMap.put(DOMRegionContext.XML_ELEMENT_DECL_NAME, IStyleConstantsXML.DOCTYPE_NAME);
+		contextStyleMap.put(DOMRegionContext.XML_DOCTYPE_DECLARATION, IStyleConstantsXML.TAG_NAME);
+		contextStyleMap.put(DOMRegionContext.XML_DOCTYPE_DECLARATION_CLOSE, IStyleConstantsXML.DECL_BORDER);
+
+		contextStyleMap.put(DOMRegionContext.XML_DOCTYPE_NAME, IStyleConstantsXML.DOCTYPE_NAME);
+		contextStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBLIC, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		contextStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBREF, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+		contextStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSTEM, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		contextStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSREF, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+	}
+
+	protected void initDocTypeDescriptions(Dictionary descriptions) {
+
+		// create descriptions for hilighting types for DOCTYPE related items
+		descriptions.put(IStyleConstantsXML.DOCTYPE_NAME, XMLUIMessages.DOCTYPE_Name_UI_); // =
+		// "DOCTYPE
+		// Name"
+		descriptions.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID, XMLUIMessages.DOCTYPE_SYSTEM_PUBLIC_Keyw_UI_); // =
+		// "DOCTYPE
+		// SYSTEM/PUBLIC
+		// Keyword"
+		descriptions.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF, XMLUIMessages.DOCTYPE_Public_Reference_UI_); // =
+		// "DOCTYPE
+		// Public
+		// Reference"
+		descriptions.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF, XMLUIMessages.DOCTYPE_System_Reference_UI_); // =
+		// "DOCTYPE
+		// System
+		// Reference"
+	}
+
+	protected void initDocTypeStyleList(ArrayList list) {
+
+		list.add(IStyleConstantsXML.DOCTYPE_NAME);
+		list.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		list.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+		list.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+	}
+
+	protected void initStyleList(ArrayList list) {
+		initCommonStyleList(list);
+		initDocTypeStyleList(list);
+		list.add(IStyleConstantsXML.CDATA_BORDER);
+		list.add(IStyleConstantsXML.CDATA_TEXT);
+		list.add(IStyleConstantsXML.PI_BORDER);
+		list.add(IStyleConstantsXML.PI_CONTENT);
+	}
+
+	public boolean performOk() {
+		// required since the superclass *removes* existing preferences before
+		// saving its own
+		super.performOk();
+
+		SSEUIPlugin.getDefault().savePluginPreferences();
+		return true;
+	}
+
+	protected void setupPicker(StyledTextColorPicker picker) {
+		IModelManager mmanager = StructuredModelManager.getModelManager();
+		picker.setParser(mmanager.createStructuredDocumentFor(ContentTypeIdForXML.ContentTypeID_XML).getParser());
+
+		Dictionary descriptions = new Hashtable();
+		initDescriptions(descriptions);
+
+		Dictionary contextStyleMap = new Hashtable();
+		initContextStyleMap(contextStyleMap);
+
+		ArrayList styleList = new ArrayList();
+		initStyleList(styleList);
+
+		picker.setContextStyleMap(contextStyleMap);
+		picker.setDescriptions(descriptions);
+		picker.setStyleList(styleList);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.AbstractColorPage#savePreferences()
+	 */
+	protected void savePreferences() {
+		XMLUIPlugin.getDefault().savePluginPreferences();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLCompletionProposalCategoriesConfiguration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLCompletionProposalCategoriesConfiguration.java
new file mode 100644
index 0000000..92a7ccc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLCompletionProposalCategoriesConfiguration.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+/**
+ * <p>The readable and writable completion proposal categories configuration
+ * for the XML content type</p>
+ */
+public class XMLCompletionProposalCategoriesConfiguration extends AbstractCompletionProposalCategoriesConfiguration {
+
+	/** the ID of the preference page where users can change the preferences */
+	private static final String PREFERENCES_PAGE_ID = "org.eclipse.wst.sse.ui.preferences.xml.contentassist"; //$NON-NLS-1$
+	
+	/**
+	 * <p>Creates the configuration</p>
+	 */
+	public XMLCompletionProposalCategoriesConfiguration() {
+		//nothing to do.
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getPreferenceStore()
+	 */
+	protected IPreferenceStore getPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#hasAssociatedPropertiesPage()
+	 */
+	public boolean hasAssociatedPropertiesPage() {
+		return true;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter#getPropertiesPageID()
+	 */
+	public String getPropertiesPageID() {
+		return PREFERENCES_PAGE_ID;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getShouldNotDisplayOnDefaultPagePrefKey()
+	 */
+	protected String getShouldNotDisplayOnDefaultPagePrefKey() {
+		return XMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_DEFAULT_PAGE;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getShouldNotDisplayOnOwnPagePrefKey()
+	 */
+	protected String getShouldNotDisplayOnOwnPagePrefKey() {
+		return XMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_OWN_PAGE;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getPageSortOrderPrefKey()
+	 */
+	protected String getPageSortOrderPrefKey() {
+		return XMLUIPreferenceNames.CONTENT_ASSIST_OWN_PAGE_SORT_ORDER;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.preferences.AbstractCompletionProposalCategoriesConfiguration#getDefaultPageSortOrderPrefKey()
+	 */
+	protected String getDefaultPageSortOrderPrefKey() {
+		return XMLUIPreferenceNames.CONTENT_ASSIST_DEFAULT_PAGE_SORT_ORDER;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLContentAssistPreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLContentAssistPreferencePage.java
new file mode 100644
index 0000000..3e9ec27
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLContentAssistPreferencePage.java
@@ -0,0 +1,256 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import java.util.Vector;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.sse.ui.internal.contentassist.CompletionProposoalCatigoriesConfigurationRegistry;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+import org.eclipse.wst.sse.ui.preferences.CodeAssistCyclingConfigurationBlock;
+import org.eclipse.wst.sse.ui.preferences.ICompletionProposalCategoriesConfigurationWriter;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+/**
+ * <p>Defines the preference page for allowing the user to change the content
+ * assist preferences</p>
+ */
+public class XMLContentAssistPreferencePage extends AbstractPreferencePage implements
+		IWorkbenchPreferencePage {
+
+	private static final String XML_CONTENT_TYPE_ID = "org.eclipse.core.runtime.xml"; //$NON-NLS-1$
+	
+	// Auto Activation
+	private Button fAutoPropose;
+	private Label fAutoProposeLabel;
+	private Text fAutoProposeText;
+	private Combo fSuggestionStrategyCombo;
+	private Vector fSuggestionStrategies = null;
+	
+	/** configuration block for changing preference having to do with the content assist categories */
+	private CodeAssistCyclingConfigurationBlock fConfigurationBlock;
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		final Composite composite = super.createComposite(parent, 1);
+		
+		createContentsForAutoActivationGroup(composite);
+		createContentsForCyclingGroup(composite);
+		
+		setSize(composite);
+		loadPreferences();
+		
+		return composite;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		performDefaultsForAutoActivationGroup();
+		performDefaultsForCyclingGroup();
+
+		validateValues();
+		enableValues();
+
+		super.performDefaults();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#initializeValues()
+	 */
+	protected void initializeValues() {
+		initializeValuesForAutoActivationGroup();
+		initializeValuesForCyclingGroup();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#storeValues()
+	 */
+	protected void storeValues() {
+		storeValuesForAutoActivationGroup();
+		storeValuesForCyclingGroup();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#enableValues()
+	 */
+	protected void enableValues() {
+		if (fAutoPropose != null) {
+			if (fAutoPropose.getSelection()) {
+				fAutoProposeLabel.setEnabled(true);
+				fAutoProposeText.setEnabled(true);
+			}
+			else {
+				fAutoProposeLabel.setEnabled(false);
+				fAutoProposeText.setEnabled(false);
+			}
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
+	 */
+	protected IPreferenceStore doGetPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	/**
+	 * <p>Create contents for the auto activation preference group</p>
+	 * @param parent {@link Composite} parent of the group
+	 */
+	private void createContentsForAutoActivationGroup(Composite parent) {
+		Group contentAssistGroup = createGroup(parent, 2);
+		contentAssistGroup.setText(XMLUIMessages.XMLContentAssistPreferencePage_Auto_Activation_UI_);
+
+		fAutoPropose = createCheckBox(contentAssistGroup, XMLUIMessages.Automatically_make_suggest_UI_);
+		((GridData) fAutoPropose.getLayoutData()).horizontalSpan = 2;
+		fAutoPropose.addSelectionListener(this);
+
+		fAutoProposeLabel = createLabel(contentAssistGroup, XMLUIMessages.Prompt_when_these_characte_UI_);
+		fAutoProposeText = createTextField(contentAssistGroup);
+
+		createLabel(contentAssistGroup, XMLUIMessages.Suggestion_Strategy);
+		fSuggestionStrategyCombo = new Combo(contentAssistGroup, SWT.READ_ONLY);
+		fSuggestionStrategies = new Vector();
+		fSuggestionStrategyCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		fSuggestionStrategyCombo.add(XMLUIMessages.Suggestion_Strategy_Lax);
+		fSuggestionStrategies.add(XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_LAX);
+		fSuggestionStrategyCombo.add(XMLUIMessages.Suggestion_Strategy_Strict);
+		fSuggestionStrategies.add(XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_STRICT);
+	}
+	
+	/**
+	 * <p>Create the contents for the content assist cycling preference group</p>
+	 * @param parent {@link Composite} parent of the group
+	 */
+	private void createContentsForCyclingGroup(Composite parent) {
+		ICompletionProposalCategoriesConfigurationWriter configurationWriter = CompletionProposoalCatigoriesConfigurationRegistry.getDefault().getWritableConfiguration(XML_CONTENT_TYPE_ID);
+		
+		if(configurationWriter != null) {
+			fConfigurationBlock = new CodeAssistCyclingConfigurationBlock(XML_CONTENT_TYPE_ID, configurationWriter);
+			fConfigurationBlock.createContents(parent, XMLUIMessages.XMLContentAssistPreferencePage_Cycling_UI_);
+		} else {
+			Logger.log(Logger.ERROR, "There should be an ICompletionProposalCategoriesConfigurationWriter" + //$NON-NLS-1$
+					" specified for the XML content type, but can't fine it, thus can't create user" + //$NON-NLS-1$
+					" preference block for editing proposal categories preferences."); //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * <p>Store the values for the auto activation group</p>
+	 */
+	private void storeValuesForAutoActivationGroup() {
+		getPreferenceStore().setValue(XMLUIPreferenceNames.AUTO_PROPOSE, fAutoPropose.getSelection());
+		getPreferenceStore().setValue(XMLUIPreferenceNames.AUTO_PROPOSE_CODE, fAutoProposeText.getText());
+		getPreferenceStore().setValue(XMLUIPreferenceNames.SUGGESTION_STRATEGY, getCurrentAutoActivationSuggestionStrategy());
+	}
+	
+	/**
+	 * <p>Store the values for the cycling group</p>
+	 */
+	private void storeValuesForCyclingGroup() {
+		if (fConfigurationBlock != null) {
+			fConfigurationBlock.storeValues();
+		}
+	}
+	
+	/**
+	 * <p>Initialize the values for the auto activation group</p>
+	 */
+	private void initializeValuesForAutoActivationGroup() {
+		fAutoPropose.setSelection(getPreferenceStore().getBoolean(XMLUIPreferenceNames.AUTO_PROPOSE));
+		fAutoProposeText.setText(getPreferenceStore().getString(XMLUIPreferenceNames.AUTO_PROPOSE_CODE));
+		String suggestionStrategy = getPreferenceStore().getString(XMLUIPreferenceNames.SUGGESTION_STRATEGY);
+		if (suggestionStrategy.length() > 0) {
+			setCurrentAutoActivationSuggestionStrategy(suggestionStrategy);
+		}
+		else {
+			setCurrentAutoActivationSuggestionStrategy(XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_LAX);
+		}
+	}
+	
+	/**
+	 * <p>Initialize the values for the cycling group</p>
+	 */
+	private void initializeValuesForCyclingGroup() {
+		if(fConfigurationBlock != null) {
+			fConfigurationBlock.initializeValues();
+		}
+	}
+	
+	/**
+	 * <p>Load the defaults for the auto activation group</p>
+	 */
+	private void performDefaultsForAutoActivationGroup() {
+		fAutoPropose.setSelection(getPreferenceStore().getDefaultBoolean(XMLUIPreferenceNames.AUTO_PROPOSE));
+		fAutoProposeText.setText(getPreferenceStore().getDefaultString(XMLUIPreferenceNames.AUTO_PROPOSE_CODE));
+		String suggestionStrategy = getPreferenceStore().getDefaultString(XMLUIPreferenceNames.SUGGESTION_STRATEGY);
+		if (suggestionStrategy.length() > 0) {
+			setCurrentAutoActivationSuggestionStrategy(suggestionStrategy);
+		}
+		else {
+			setCurrentAutoActivationSuggestionStrategy(XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_LAX);
+		}
+	}
+	
+	/**
+	 * <p>Load the defaults of the cycling group</p>
+	 */
+	private void performDefaultsForCyclingGroup() {
+		if(fConfigurationBlock != null) {
+			fConfigurationBlock.performDefaults();
+		}
+	}
+	
+	/**
+	 * Return the currently selected suggestion strategy preference
+	 * 
+	 * @return a suggestion strategy constant from XMLUIPreferenceNames
+	 */
+	private String getCurrentAutoActivationSuggestionStrategy() {
+		int i = fSuggestionStrategyCombo.getSelectionIndex();
+		if (i >= 0) {
+			return (String) (fSuggestionStrategies.elementAt(i));
+		}
+		return ""; //$NON-NLS-1$
+	}
+	
+	/**
+	 * Set a suggestion strategy in suggestion strategy combo box
+	 * 
+	 * @param strategy
+	 */
+	private void setCurrentAutoActivationSuggestionStrategy(String strategy) {
+		// Clear the current selection.
+		fSuggestionStrategyCombo.clearSelection();
+		fSuggestionStrategyCombo.deselectAll();
+
+		int i = fSuggestionStrategies.indexOf(strategy);
+		if (i >= 0) {
+			fSuggestionStrategyCombo.select(i);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLFilesPreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLFilesPreferencePage.java
new file mode 100644
index 0000000..8a19fca
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLFilesPreferencePage.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+
+public class XMLFilesPreferencePage extends AbstractPreferencePage {
+	protected EncodingSettings fEncodingSettings = null;
+
+	private Combo fDefaultSuffix;
+	private List fValidExtensions;
+
+	protected Control createContents(Composite parent) {
+		Composite composite = (Composite) super.createContents(parent);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.XML_PREFWEBX_FILES_HELPID);
+		createContentsForCreatingGroup(composite);
+
+		setSize(composite);
+		loadPreferences();
+
+		return composite;
+	}
+
+	protected void createContentsForCreatingGroup(Composite parent) {
+		Group creatingGroup = createGroup(parent, 2);
+		creatingGroup.setText(XMLUIMessages.Creating_files);
+
+		// Default extension for New file Wizard
+		createLabel(creatingGroup, XMLUIMessages.XMLFilesPreferencePage_ExtensionLabel);
+		fDefaultSuffix = createDropDownBox(creatingGroup);
+		String[] validExtensions = (String[]) getValidExtensions().toArray(new String[0]);
+		Arrays.sort(validExtensions);
+		fDefaultSuffix.setItems(validExtensions);
+		fDefaultSuffix.addSelectionListener(this);
+
+		Label label = createLabel(creatingGroup, XMLUIMessages.Encoding_desc);
+		((GridData) label.getLayoutData()).horizontalSpan = 2;
+		fEncodingSettings = new EncodingSettings(creatingGroup, XMLUIMessages.Encoding);
+		((GridData) fEncodingSettings.getLayoutData()).horizontalSpan = 2;
+	}
+
+	public void dispose() {
+		fDefaultSuffix.removeModifyListener(this);
+		super.dispose();
+	}
+
+	protected void doSavePreferenceStore() {
+		XMLCorePlugin.getDefault().savePluginPreferences(); // model
+	}
+
+	/**
+	 * Get content type associated with this new file wizard
+	 * 
+	 * @return IContentType
+	 */
+	protected IContentType getContentType() {
+		return Platform.getContentTypeManager().getContentType(ContentTypeIdForXML.ContentTypeID_XML);
+	}
+
+	/**
+	 * Get list of valid extensions
+	 * 
+	 * @return List
+	 */
+	private List getValidExtensions() {
+		if (fValidExtensions == null) {
+			IContentType type = getContentType();
+			fValidExtensions = new ArrayList(Arrays.asList(type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC)));
+		}
+		return fValidExtensions;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.preferences.ui.AbstractPreferencePage#getModelPreferences()
+	 */
+	protected Preferences getModelPreferences() {
+		return XMLCorePlugin.getDefault().getPluginPreferences();
+	}
+
+	protected void initializeValues() {
+		initializeValuesForCreatingGroup();
+	}
+
+	protected void initializeValuesForCreatingGroup() {
+		String suffix = getModelPreferences().getString(XMLCorePreferenceNames.DEFAULT_EXTENSION);
+		fDefaultSuffix.setText(suffix);
+
+		String encoding = getModelPreferences().getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
+
+		fEncodingSettings.setIANATag(encoding);
+	}
+
+	protected void performDefaults() {
+		performDefaultsForCreatingGroup();
+
+		super.performDefaults();
+	}
+
+	protected void performDefaultsForCreatingGroup() {
+		String suffix = getModelPreferences().getDefaultString(XMLCorePreferenceNames.DEFAULT_EXTENSION);
+		fDefaultSuffix.setText(suffix);
+
+		String encoding = getModelPreferences().getDefaultString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
+
+		fEncodingSettings.setIANATag(encoding);
+		// fEncodingSettings.resetToDefaultEncoding();
+	}
+
+	public boolean performOk() {
+		boolean result = super.performOk();
+
+		doSavePreferenceStore();
+
+		return result;
+	}
+
+	protected void storeValues() {
+		storeValuesForCreatingGroup();
+	}
+
+	protected void storeValuesForCreatingGroup() {
+		String suffix = fDefaultSuffix.getText();
+		getModelPreferences().setValue(XMLCorePreferenceNames.DEFAULT_EXTENSION, suffix);
+
+		getModelPreferences().setValue(CommonEncodingPreferenceNames.OUTPUT_CODESET, fEncodingSettings.getIANATag());
+	}
+
+	protected void validateValues() {
+		boolean isValid = false;
+		Iterator i = getValidExtensions().iterator();
+		while (i.hasNext() && !isValid) {
+			String extension = (String) i.next();
+			isValid = extension.equalsIgnoreCase(fDefaultSuffix.getText());
+		}
+
+		if (!isValid) {
+			setErrorMessage(NLS.bind(XMLUIMessages.XMLFilesPreferencePage_ExtensionError, getValidExtensions().toString()));
+			setValid(false);
+		}
+		else {
+			setErrorMessage(null);
+			setValid(true);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLSourcePreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLSourcePreferencePage.java
new file mode 100644
index 0000000..6545689
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLSourcePreferencePage.java
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferenceLinkArea;
+import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+
+public class XMLSourcePreferencePage extends AbstractPreferencePage implements ModifyListener, SelectionListener, IWorkbenchPreferencePage {
+	private final int MIN_INDENTATION_SIZE = 0;
+	private final int MAX_INDENTATION_SIZE = 16;
+
+	// Formatting
+	protected Label fLineWidthLabel;
+	protected Text fLineWidthText;
+	protected Button fSplitMultiAttrs;
+	private Button fIndentUsingTabs;
+	private Button fIndentUsingSpaces;
+	private Spinner fIndentationSize;
+	private Button fPreservePCDATAContent;
+	private Button fAlignEndBracket;
+	private Button fFormatComments;
+	private Button fFormatCommentsJoinLines;
+	// BUG195264 - Support for removing/adding a space before empty close tags
+	private Button fSpaceBeforeEmptyCloseTag;
+	protected Button fClearAllBlankLines;
+
+	// grammar constraints
+	protected Button fUseInferredGrammar;
+
+	protected Control createContents(Composite parent) {
+		final Composite composite = super.createComposite(parent, 1);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.XML_PREFWEBX_SOURCE_HELPID);
+
+		new PreferenceLinkArea(composite, SWT.WRAP | SWT.MULTI, "org.eclipse.wst.sse.ui.preferences.editor", XMLUIMessages._UI_STRUCTURED_TEXT_EDITOR_PREFS_LINK,//$NON-NLS-1$
+					(IWorkbenchPreferenceContainer) getContainer(), null).getControl().setLayoutData(GridDataFactory.fillDefaults().hint(150, SWT.DEFAULT).create());
+		new Label(composite, SWT.NONE).setLayoutData(GridDataFactory.swtDefaults().create());
+
+		createContentsForFormattingGroup(composite);
+		createContentsForGrammarConstraintsGroup(composite);
+		setSize(composite);
+		loadPreferences();
+
+		return composite;
+	}
+
+	protected void createContentsForFormattingGroup(Composite parent) {
+		Group formattingGroup = createGroup(parent, 2);
+		formattingGroup.setText(XMLUIMessages.Formatting_UI_);
+
+		fLineWidthLabel = createLabel(formattingGroup, XMLUIMessages.Line_width__UI_);
+		fLineWidthText = new Text(formattingGroup, SWT.SINGLE | SWT.BORDER);
+		GridData gData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.BEGINNING);
+		gData.widthHint = 25;
+		fLineWidthText.setLayoutData(gData);
+		fLineWidthText.addModifyListener(this);
+
+		fSplitMultiAttrs = createCheckBox(formattingGroup, XMLUIMessages.Split_multiple_attributes);
+		((GridData) fSplitMultiAttrs.getLayoutData()).horizontalSpan = 2;
+		fAlignEndBracket = createCheckBox(formattingGroup, XMLUIMessages.Align_final_bracket);
+		((GridData) fAlignEndBracket.getLayoutData()).horizontalSpan = 2;
+		fPreservePCDATAContent = createCheckBox(formattingGroup, XMLUIMessages.Preserve_PCDATA_Content);
+		((GridData) fPreservePCDATAContent.getLayoutData()).horizontalSpan = 2;
+		fClearAllBlankLines = createCheckBox(formattingGroup, XMLUIMessages.Clear_all_blank_lines_UI_);
+		((GridData) fClearAllBlankLines.getLayoutData()).horizontalSpan = 2;
+		// formatting comments
+		fFormatComments = createCheckBox(formattingGroup, XMLUIMessages.Format_comments);
+		((GridData) fFormatComments.getLayoutData()).horizontalSpan = 2;
+		fFormatComments.addSelectionListener(this);
+		fFormatCommentsJoinLines = createCheckBox(formattingGroup, XMLUIMessages.Format_comments_join_lines);
+		((GridData) fFormatCommentsJoinLines.getLayoutData()).horizontalSpan = 2;
+		((GridData) fFormatCommentsJoinLines.getLayoutData()).horizontalIndent = 20;
+		// end formatting comments
+		fSpaceBeforeEmptyCloseTag = createCheckBox(formattingGroup, XMLUIMessages.Space_before_empty_close_tag);
+		((GridData) fSpaceBeforeEmptyCloseTag.getLayoutData()).horizontalSpan = 2;
+
+		// [269224] - Place the indent controls in their own composite for proper tab ordering
+		Composite indentComposite = createComposite(formattingGroup, 1);
+		((GridData) indentComposite.getLayoutData()).horizontalSpan = 2;
+		((GridLayout) indentComposite.getLayout()).marginWidth = 0;
+		((GridLayout) indentComposite.getLayout()).marginHeight = 0;
+
+		fIndentUsingTabs = createRadioButton(indentComposite, XMLUIMessages.Indent_using_tabs);
+		((GridData) fIndentUsingTabs.getLayoutData()).horizontalSpan = 1;
+
+		fIndentUsingSpaces = createRadioButton(indentComposite, XMLUIMessages.Indent_using_spaces);
+		((GridData) fIndentUsingSpaces.getLayoutData()).horizontalSpan = 1;
+
+		createLabel(formattingGroup, XMLUIMessages.Indentation_size);
+		fIndentationSize = new Spinner(formattingGroup, SWT.READ_ONLY | SWT.BORDER);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+		fIndentationSize.setLayoutData(gd);
+		fIndentationSize.setToolTipText(XMLUIMessages.Indentation_size_tip);
+		fIndentationSize.setMinimum(MIN_INDENTATION_SIZE);
+		fIndentationSize.setMaximum(MAX_INDENTATION_SIZE);
+		fIndentationSize.setIncrement(1);
+		fIndentationSize.setPageIncrement(4);
+		fIndentationSize.addModifyListener(this);
+	}
+
+	protected void createContentsForGrammarConstraintsGroup(Composite parent) {
+		Group grammarConstraintsGroup = createGroup(parent, 1);
+		grammarConstraintsGroup.setText(XMLUIMessages.Grammar_Constraints);
+		grammarConstraintsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+
+		fUseInferredGrammar = createCheckBox(grammarConstraintsGroup, XMLUIMessages.Use_inferred_grammar_in_absence_of);
+	}
+
+	protected IPreferenceStore doGetPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	protected void doSavePreferenceStore() {
+		XMLUIPlugin.getDefault().savePluginPreferences(); // editor
+		XMLCorePlugin.getDefault().savePluginPreferences(); // model
+	}
+
+	protected void enableValues() {
+		if (fFormatComments != null && fFormatCommentsJoinLines != null) {
+			fFormatCommentsJoinLines.setEnabled(fFormatComments.getSelection());
+		}
+	}
+
+	protected Preferences getModelPreferences() {
+		return XMLCorePlugin.getDefault().getPluginPreferences();
+	}
+
+	protected void initializeValues() {
+		initializeValuesForFormattingGroup();
+		initializeValuesForGrammarConstraintsGroup();
+	}
+
+	protected void initializeValuesForFormattingGroup() {
+		// Formatting
+		fLineWidthText.setText(getModelPreferences().getString(XMLCorePreferenceNames.LINE_WIDTH));
+		fSplitMultiAttrs.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.SPLIT_MULTI_ATTRS));
+		fAlignEndBracket.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.ALIGN_END_BRACKET));
+		fClearAllBlankLines.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES));
+		fPreservePCDATAContent.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.PRESERVE_CDATACONTENT));
+		fSpaceBeforeEmptyCloseTag.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.SPACE_BEFORE_EMPTY_CLOSE_TAG));
+		fFormatComments.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_TEXT));
+		fFormatCommentsJoinLines.setSelection(getModelPreferences().getBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_JOIN_LINES));
+
+		if (XMLCorePreferenceNames.TAB.equals(getModelPreferences().getString(XMLCorePreferenceNames.INDENTATION_CHAR))) {
+			fIndentUsingTabs.setSelection(true);
+			fIndentUsingSpaces.setSelection(false);
+		}
+		else {
+			fIndentUsingSpaces.setSelection(true);
+			fIndentUsingTabs.setSelection(false);
+		}
+
+		fIndentationSize.setSelection(getModelPreferences().getInt(XMLCorePreferenceNames.INDENTATION_SIZE));
+	}
+
+	protected void initializeValuesForGrammarConstraintsGroup() {
+		fUseInferredGrammar.setSelection(getPreferenceStore().getBoolean(XMLUIPreferenceNames.USE_INFERRED_GRAMMAR));
+	}
+
+	protected void performDefaults() {
+		performDefaultsForFormattingGroup();
+		performDefaultsForGrammarConstraintsGroup();
+
+		validateValues();
+		enableValues();
+
+		super.performDefaults();
+	}
+
+	protected void performDefaultsForFormattingGroup() {
+		// Formatting
+		fLineWidthText.setText(getModelPreferences().getDefaultString(XMLCorePreferenceNames.LINE_WIDTH));
+		fSplitMultiAttrs.setSelection(getModelPreferences().getDefaultBoolean(XMLCorePreferenceNames.SPLIT_MULTI_ATTRS));
+		fAlignEndBracket.setSelection(getModelPreferences().getDefaultBoolean(XMLCorePreferenceNames.ALIGN_END_BRACKET));
+		fClearAllBlankLines.setSelection(getModelPreferences().getDefaultBoolean(XMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES));
+		fPreservePCDATAContent.setSelection(getModelPreferences().getDefaultBoolean(XMLCorePreferenceNames.PRESERVE_CDATACONTENT));
+		// BUG195264 - Support for removing/adding a space before empty close tags
+		fSpaceBeforeEmptyCloseTag.setSelection(getModelPreferences().getDefaultBoolean(XMLCorePreferenceNames.SPACE_BEFORE_EMPTY_CLOSE_TAG));
+		fFormatComments.setSelection(getModelPreferences().getDefaultBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_TEXT));
+		fFormatCommentsJoinLines.setSelection(getModelPreferences().getDefaultBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_JOIN_LINES));
+
+		if (XMLCorePreferenceNames.TAB.equals(getModelPreferences().getDefaultString(XMLCorePreferenceNames.INDENTATION_CHAR))) {
+			fIndentUsingTabs.setSelection(true);
+			fIndentUsingSpaces.setSelection(false);
+		}
+		else {
+			fIndentUsingSpaces.setSelection(true);
+			fIndentUsingTabs.setSelection(false);
+		}
+		fIndentationSize.setSelection(getModelPreferences().getDefaultInt(XMLCorePreferenceNames.INDENTATION_SIZE));
+	}
+
+	protected void performDefaultsForGrammarConstraintsGroup() {
+		fUseInferredGrammar.setSelection(getPreferenceStore().getDefaultBoolean(XMLUIPreferenceNames.USE_INFERRED_GRAMMAR));
+	}
+
+	public boolean performOk() {
+		boolean result = super.performOk();
+
+		doSavePreferenceStore();
+
+		return result;
+	}
+
+	protected void storeValues() {
+		storeValuesForFormattingGroup();
+		storeValuesForGrammarConstraintsGroup();
+	}
+
+	protected void storeValuesForFormattingGroup() {
+		// Formatting
+		getModelPreferences().setValue(XMLCorePreferenceNames.LINE_WIDTH, fLineWidthText.getText());
+		getModelPreferences().setValue(XMLCorePreferenceNames.SPLIT_MULTI_ATTRS, fSplitMultiAttrs.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.ALIGN_END_BRACKET, fAlignEndBracket.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES, fClearAllBlankLines.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.PRESERVE_CDATACONTENT, fPreservePCDATAContent.getSelection());
+		// BUG195264 - Support for removing/adding a space before empty close tags
+		getModelPreferences().setValue(XMLCorePreferenceNames.SPACE_BEFORE_EMPTY_CLOSE_TAG, fSpaceBeforeEmptyCloseTag.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.FORMAT_COMMENT_TEXT, fFormatComments.getSelection());
+		getModelPreferences().setValue(XMLCorePreferenceNames.FORMAT_COMMENT_JOIN_LINES, fFormatCommentsJoinLines.getSelection());
+
+		if (fIndentUsingTabs.getSelection()) {
+			getModelPreferences().setValue(XMLCorePreferenceNames.INDENTATION_CHAR, XMLCorePreferenceNames.TAB);
+		}
+		else {
+			getModelPreferences().setValue(XMLCorePreferenceNames.INDENTATION_CHAR, XMLCorePreferenceNames.SPACE);
+		}
+		getModelPreferences().setValue(XMLCorePreferenceNames.INDENTATION_SIZE, fIndentationSize.getSelection());
+	}
+
+	protected void storeValuesForGrammarConstraintsGroup() {
+		getPreferenceStore().setValue(XMLUIPreferenceNames.USE_INFERRED_GRAMMAR, fUseInferredGrammar.getSelection());
+	}
+
+	protected void validateValues() {
+		boolean isError = false;
+		String widthText = null;
+
+		if (fLineWidthText != null) {
+			try {
+				widthText = fLineWidthText.getText();
+				int formattingLineWidth = Integer.parseInt(widthText);
+				if ((formattingLineWidth < WIDTH_VALIDATION_LOWER_LIMIT) || (formattingLineWidth > WIDTH_VALIDATION_UPPER_LIMIT)) {
+					throw new NumberFormatException();
+				}
+			}
+			catch (NumberFormatException nfexc) {
+				setInvalidInputMessage(widthText);
+				setValid(false);
+				isError = true;
+			}
+		}
+
+		int indentSize = 0;
+		if (fIndentationSize != null) {
+			try {
+				indentSize = fIndentationSize.getSelection();
+				if ((indentSize < MIN_INDENTATION_SIZE) || (indentSize > MAX_INDENTATION_SIZE)) {
+					throw new NumberFormatException();
+				}
+			}
+			catch (NumberFormatException nfexc) {
+				setInvalidInputMessage(Integer.toString(indentSize));
+				setValid(false);
+				isError = true;
+			}
+		}
+
+		if (!isError) {
+			setErrorMessage(null);
+			setValid(true);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLSyntaxColoringPage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLSyntaxColoringPage.java
new file mode 100644
index 0000000..245f0ab
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLSyntaxColoringPage.java
@@ -0,0 +1,873 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.preference.ColorSelector;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
+import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore.OverlayKey;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper;
+import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML;
+
+import com.ibm.icu.text.Collator;
+
+/**
+ * A preference page to configure our XML syntax color. It resembles the JDT
+ * and CDT pages far more than our original color page while retaining the
+ * extra "click-to-find" functionality.
+ */
+public final class XMLSyntaxColoringPage extends PreferencePage implements IWorkbenchPreferencePage {
+
+	private Button fBold;
+	private Label fForegroundLabel;
+	private Label fBackgroundLabel;
+	private Button fClearStyle;
+	private Map fContextToStyleMap;
+	private Color fDefaultForeground = null;
+	private Color fDefaultBackground = null;
+	private IStructuredDocument fDocument;
+	private ColorSelector fForegroundColorEditor;
+	private ColorSelector fBackgroundColorEditor;
+	private Button fItalic;
+	private OverlayPreferenceStore fOverlayStore;
+	private Button fStrike;
+	private Collection fStylePreferenceKeys;
+	private StructuredViewer fStylesViewer = null;
+	private Map fStyleToDescriptionMap;
+	private StyledText fText;
+	private Button fUnderline;
+
+	// activate controls based on the given local color type
+	private void activate(String namedStyle) {
+		Color foreground = fDefaultForeground;
+		Color background = fDefaultBackground;
+		if (namedStyle == null) {
+			fClearStyle.setEnabled(false);
+			fBold.setEnabled(false);
+			fItalic.setEnabled(false);
+			fStrike.setEnabled(false);
+			fUnderline.setEnabled(false);
+			fForegroundLabel.setEnabled(false);
+			fBackgroundLabel.setEnabled(false);
+			fForegroundColorEditor.setEnabled(false);
+			fBackgroundColorEditor.setEnabled(false);
+			fBold.setSelection(false);
+			fItalic.setSelection(false);
+			fStrike.setSelection(false);
+			fUnderline.setSelection(false);
+		}
+		else {
+			TextAttribute attribute = getAttributeFor(namedStyle);
+			fClearStyle.setEnabled(true);
+			fBold.setEnabled(true);
+			fItalic.setEnabled(true);
+			fStrike.setEnabled(true);
+			fUnderline.setEnabled(true);
+			fForegroundLabel.setEnabled(true);
+			fBackgroundLabel.setEnabled(true);
+			fForegroundColorEditor.setEnabled(true);
+			fBackgroundColorEditor.setEnabled(true);
+			fBold.setSelection((attribute.getStyle() & SWT.BOLD) != 0);
+			fItalic.setSelection((attribute.getStyle() & SWT.ITALIC) != 0);
+			fStrike.setSelection((attribute.getStyle() & TextAttribute.STRIKETHROUGH) != 0);
+			fUnderline.setSelection((attribute.getStyle() & TextAttribute.UNDERLINE) != 0);
+			if (attribute.getForeground() != null) {
+				foreground = attribute.getForeground();
+			}
+			if (attribute.getBackground() != null) {
+				background = attribute.getBackground();
+			}
+		}
+
+		fForegroundColorEditor.setColorValue(foreground.getRGB());
+		fBackgroundColorEditor.setColorValue(background.getRGB());
+	}
+
+	/**
+	 * Color the text in the sample area according to the current preferences
+	 */
+	void applyStyles() {
+		if (fText == null || fText.isDisposed())
+			return;
+		IStructuredDocumentRegion documentRegion = fDocument.getFirstStructuredDocumentRegion();
+		while (documentRegion != null) {
+			ITextRegionList regions = documentRegion.getRegions();
+			for (int i = 0; i < regions.size(); i++) {
+				ITextRegion currentRegion = regions.get(i);
+				// lookup the local coloring type and apply it
+				String namedStyle = (String) fContextToStyleMap.get(currentRegion.getType());
+				if (namedStyle == null)
+					continue;
+				TextAttribute attribute = getAttributeFor(namedStyle);
+				if (attribute == null)
+					continue;
+				StyleRange style = new StyleRange(documentRegion.getStartOffset(currentRegion), currentRegion.getTextLength(), attribute.getForeground(), attribute.getBackground(), attribute.getStyle());
+				style.strikeout = (attribute.getStyle() & TextAttribute.STRIKETHROUGH) != 0;
+				style.underline = (attribute.getStyle() & TextAttribute.UNDERLINE) != 0;
+				fText.setStyleRange(style);
+			}
+			documentRegion = documentRegion.getNext();
+		}
+	}
+
+	Button createCheckbox(Composite parent, String label) {
+		Button button = new Button(parent, SWT.CHECK);
+		button.setText(label);
+		button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+		return button;
+	}
+
+	/**
+	 * Creates composite control and sets the default layout data.
+	 */
+	private Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+
+		// GridLayout
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		layout.makeColumnsEqualWidth = false;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+
+		// GridData
+		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
+		composite.setLayoutData(data);
+		return composite;
+	}
+
+	protected Control createContents(final Composite parent) {
+		initializeDialogUnits(parent);
+
+		fDefaultForeground = parent.getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+		fDefaultBackground = parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+		Composite pageComponent = createComposite(parent, 2);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(pageComponent, IHelpContextIds.XML_PREFWEBX_STYLES_HELPID);
+
+		Link link = new Link(pageComponent, SWT.WRAP);
+		link.setText(SSEUIMessages.SyntaxColoring_Link);
+		link.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				PreferencesUtil.createPreferenceDialogOn(parent.getShell(), e.text, null, null);
+			}
+		});
+
+		GridData linkData= new GridData(SWT.FILL, SWT.BEGINNING, true, false, 2, 1);
+		linkData.widthHint= 150; // only expand further if anyone else requires it
+		link.setLayoutData(linkData);
+
+		new Label(pageComponent, SWT.NONE).setLayoutData(new GridData());
+		new Label(pageComponent, SWT.NONE).setLayoutData(new GridData());
+
+		SashForm editor = new SashForm(pageComponent, SWT.VERTICAL);
+		GridData gridData2 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData2.horizontalSpan = 2;
+		editor.setLayoutData(gridData2);
+		SashForm top = new SashForm(editor, SWT.HORIZONTAL);
+		Composite styleEditor = createComposite(top, 1);
+		((GridLayout) styleEditor.getLayout()).marginRight = 5;
+		((GridLayout) styleEditor.getLayout()).marginLeft = 0;
+		createLabel(styleEditor, XMLUIMessages.SyntaxColoringPage_0);
+		fStylesViewer = createStylesViewer(styleEditor);
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData.horizontalIndent = 0;
+		Iterator iterator = fStyleToDescriptionMap.values().iterator();
+		while (iterator.hasNext()) {
+			gridData.widthHint = Math.max(gridData.widthHint, convertWidthInCharsToPixels(iterator.next().toString().length()));
+		}
+		gridData.heightHint = convertHeightInCharsToPixels(5);
+		fStylesViewer.getControl().setLayoutData(gridData);
+
+		Composite editingComposite = createComposite(top, 1);
+		((GridLayout) styleEditor.getLayout()).marginLeft = 5;
+		createLabel(editingComposite, ""); //$NON-NLS-1$
+		Button enabler = createCheckbox(editingComposite, XMLUIMessages.SyntaxColoringPage_2);
+		enabler.setEnabled(false);
+		enabler.setSelection(true);
+		Composite editControls = createComposite(editingComposite, 2);
+		((GridLayout) editControls.getLayout()).marginLeft = 20;
+
+		fForegroundLabel = createLabel(editControls, SSEUIMessages.Foreground_UI_);
+		((GridData) fForegroundLabel.getLayoutData()).verticalAlignment = SWT.CENTER;
+		fForegroundLabel.setEnabled(false);
+
+		fForegroundColorEditor = new ColorSelector(editControls);
+		Button fForegroundColor = fForegroundColorEditor.getButton();
+		GridData gd = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
+		fForegroundColor.setLayoutData(gd);
+		fForegroundColorEditor.setEnabled(false);
+
+		fBackgroundLabel = createLabel(editControls, SSEUIMessages.Background_UI_);
+		((GridData) fBackgroundLabel.getLayoutData()).verticalAlignment = SWT.CENTER;
+		fBackgroundLabel.setEnabled(false);
+
+		fBackgroundColorEditor = new ColorSelector(editControls);
+		Button fBackgroundColor = fBackgroundColorEditor.getButton();
+		gd = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
+		fBackgroundColor.setLayoutData(gd);
+		fBackgroundColorEditor.setEnabled(false);
+
+		fBold = createCheckbox(editControls, XMLUIMessages.SyntaxColoringPage_3);
+		fBold.setEnabled(false);
+		((GridData) fBold.getLayoutData()).horizontalSpan = 2;
+		fItalic = createCheckbox(editControls, XMLUIMessages.SyntaxColoringPage_4);
+		fItalic.setEnabled(false);
+		((GridData) fItalic.getLayoutData()).horizontalSpan = 2;
+		fStrike = createCheckbox(editControls, XMLUIMessages.SyntaxColoringPage_5);
+		fStrike.setEnabled(false);
+		((GridData) fStrike.getLayoutData()).horizontalSpan = 2;
+		fUnderline = createCheckbox(editControls, XMLUIMessages.SyntaxColoringPage_6);
+		fUnderline.setEnabled(false);
+		((GridData) fUnderline.getLayoutData()).horizontalSpan = 2;
+		fClearStyle = new Button(editingComposite, SWT.PUSH);
+		fClearStyle.setText(SSEUIMessages.Restore_Default_UI_); //$NON-NLS-1$ = "Restore Default"
+		fClearStyle.setLayoutData(new GridData(SWT.BEGINNING));
+		((GridData) fClearStyle.getLayoutData()).horizontalIndent = 20;
+		fClearStyle.setEnabled(false);
+
+		Composite sampleArea = createComposite(editor, 1);
+
+		((GridLayout) sampleArea.getLayout()).marginLeft = 5;
+		((GridLayout) sampleArea.getLayout()).marginTop = 5;
+		createLabel(sampleArea, SSEUIMessages.Sample_text__UI_); //$NON-NLS-1$ = "&Sample text:"
+		SourceViewer viewer = new SourceViewer(sampleArea, null, SWT.BORDER | SWT.LEFT_TO_RIGHT | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY);
+		fText = viewer.getTextWidget();
+		GridData gridData3 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData3.widthHint = convertWidthInCharsToPixels(20);
+		gridData3.heightHint = convertHeightInCharsToPixels(5);
+		gridData3.horizontalSpan = 2;
+		fText.setLayoutData(gridData3);
+		fText.setEditable(false);
+		fText.setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
+		fText.addKeyListener(getTextKeyListener());
+		fText.addSelectionListener(getTextSelectionListener());
+		fText.addMouseListener(getTextMouseListener());
+		fText.addTraverseListener(getTraverseListener());
+		setAccessible(fText, SSEUIMessages.Sample_text__UI_);
+		fDocument = StructuredModelManager.getModelManager().createStructuredDocumentFor(ContentTypeIdForXML.ContentTypeID_XML);
+		fDocument.set(getExampleText());
+		viewer.setDocument(fDocument);
+
+		top.setWeights(new int[]{1, 1});
+		editor.setWeights(new int[]{1, 1});
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(pageComponent, IHelpContextIds.XML_PREFWEBX_STYLES_HELPID);
+
+		fStylesViewer.setInput(getStylePreferenceKeys());
+
+		applyStyles();
+
+		fStylesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if (!event.getSelection().isEmpty()) {
+					Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
+					String namedStyle = o.toString();
+					activate(namedStyle);
+					if (namedStyle == null)
+						return;
+				}
+			}
+		});
+
+		fForegroundColorEditor.addListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) {
+					Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+					String namedStyle = o.toString();
+					String prefString = getOverlayStore().getString(namedStyle);
+					String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+					if (stylePrefs != null) {
+						String oldValue = stylePrefs[0];
+						// open color dialog to get new color
+						String newValue = ColorHelper.toRGBString(fForegroundColorEditor.getColorValue());
+
+						if (!newValue.equals(oldValue)) {
+							stylePrefs[0] = newValue;
+							String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+							getOverlayStore().setValue(namedStyle, newPrefString);
+							applyStyles();
+							fText.redraw();
+						}
+					}
+				}
+			}
+		});
+
+		fBackgroundColorEditor.addListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				if (event.getProperty().equals(ColorSelector.PROP_COLORCHANGE)) {
+					Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+					String namedStyle = o.toString();
+					String prefString = getOverlayStore().getString(namedStyle);
+					String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+					if (stylePrefs != null) {
+						String oldValue = stylePrefs[1];
+						// open color dialog to get new color
+						String newValue = ColorHelper.toRGBString(fBackgroundColorEditor.getColorValue());
+
+						if (!newValue.equals(oldValue)) {
+							stylePrefs[1] = newValue;
+							String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+							getOverlayStore().setValue(namedStyle, newPrefString);
+							applyStyles();
+							fText.redraw();
+							activate(namedStyle);
+						}
+					}
+				}
+			}
+		});
+
+		fBold.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[2];
+					String newValue = String.valueOf(fBold.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[2] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+
+		fItalic.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[3];
+					String newValue = String.valueOf(fItalic.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[3] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+
+		fStrike.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[4];
+					String newValue = String.valueOf(fStrike.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[4] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+
+		fUnderline.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				super.widgetSelected(e);
+				// get current (newly old) style
+				Object o = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement();
+				String namedStyle = o.toString();
+				String prefString = getOverlayStore().getString(namedStyle);
+				String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+				if (stylePrefs != null) {
+					String oldValue = stylePrefs[5];
+					String newValue = String.valueOf(fUnderline.getSelection());
+					if (!newValue.equals(oldValue)) {
+						stylePrefs[5] = newValue;
+						String newPrefString = ColorHelper.packStylePreferences(stylePrefs);
+						getOverlayStore().setValue(namedStyle, newPrefString);
+						applyStyles();
+						fText.redraw();
+					}
+				}
+			}
+		});
+
+		fClearStyle.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (fStylesViewer.getSelection().isEmpty())
+					return;
+				String namedStyle = ((IStructuredSelection) fStylesViewer.getSelection()).getFirstElement().toString();
+				getOverlayStore().setToDefault(namedStyle);
+				applyStyles();
+				fText.redraw();
+				activate(namedStyle);
+			}
+		});
+
+		return pageComponent;
+	}
+
+	private Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.WRAP);
+		label.setText(text);
+		GridData data = new GridData(SWT.FILL, SWT.FILL, false, false);
+		label.setLayoutData(data);
+		label.setBackground(parent.getBackground());
+		return label;
+	}
+
+	// protected Label createDescriptionLabel(Composite parent) {
+	// return null;
+	// }
+
+	/**
+	 * Set up all the style preference keys in the overlay store
+	 */
+	private OverlayKey[] createOverlayStoreKeys() {
+		List overlayKeys = new ArrayList();
+
+		Iterator i = getStylePreferenceKeys().iterator();
+		while (i.hasNext()) {
+			overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, (String) i.next()));
+		}
+
+		OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
+		overlayKeys.toArray(keys);
+		return keys;
+	}
+
+	/**
+	 * Creates the List viewer where we see the various syntax element display
+	 * names--would it ever be a Tree like JDT's?
+	 * 
+	 * @param parent
+	 * @return
+	 */
+	private StructuredViewer createStylesViewer(Composite parent) {
+		StructuredViewer stylesViewer = new ListViewer(parent, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
+		stylesViewer.setComparator(new ViewerComparator(Collator.getInstance()));
+		stylesViewer.setLabelProvider(new LabelProvider() {
+			public String getText(Object element) {
+				Object description = fStyleToDescriptionMap.get(element);
+				if (description != null)
+					return description.toString();
+				return super.getText(element);
+			}
+		});
+		stylesViewer.setContentProvider(new ITreeContentProvider() {
+			public void dispose() {
+			}
+
+			public Object[] getChildren(Object parentElement) {
+				return getStylePreferenceKeys().toArray();
+			}
+
+			public Object[] getElements(Object inputElement) {
+				return getChildren(inputElement);
+			}
+
+			public Object getParent(Object element) {
+				return getStylePreferenceKeys();
+			}
+
+			public boolean hasChildren(Object element) {
+				return false;
+			}
+
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+		});
+		return stylesViewer;
+	}
+
+	public void dispose() {
+		if (fOverlayStore != null) {
+			fOverlayStore.stop();
+		}
+		super.dispose();
+	}
+
+	protected IPreferenceStore doGetPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	private TextAttribute getAttributeFor(String namedStyle) {
+		TextAttribute ta = new TextAttribute(fDefaultForeground, fDefaultBackground, SWT.NORMAL);
+
+		if (namedStyle != null && fOverlayStore != null) {
+			// note: "namedStyle" *is* the preference key
+			String prefString = getOverlayStore().getString(namedStyle);
+			String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
+			if (stylePrefs != null) {
+				RGB foreground = ColorHelper.toRGB(stylePrefs[0]);
+				RGB background = ColorHelper.toRGB(stylePrefs[1]);
+
+				int fontModifier = SWT.NORMAL;
+
+				if (stylePrefs.length > 2) {
+					boolean on = Boolean.valueOf(stylePrefs[2]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | SWT.BOLD;
+				}
+				if (stylePrefs.length > 3) {
+					boolean on = Boolean.valueOf(stylePrefs[3]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | SWT.ITALIC;
+				}
+				if (stylePrefs.length > 4) {
+					boolean on = Boolean.valueOf(stylePrefs[4]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | TextAttribute.STRIKETHROUGH;
+				}
+				if (stylePrefs.length > 5) {
+					boolean on = Boolean.valueOf(stylePrefs[5]).booleanValue();
+					if (on)
+						fontModifier = fontModifier | TextAttribute.UNDERLINE;
+				}
+
+				ta = new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, fontModifier);
+			}
+		}
+		return ta;
+	}
+
+	private String getExampleText() {
+		return XMLUIMessages.Sample_XML_doc;
+	}
+
+	private String getNamedStyleAtOffset(int offset) {
+		// ensure the offset is clean
+		if (offset >= fDocument.getLength())
+			return getNamedStyleAtOffset(fDocument.getLength() - 1);
+		else if (offset < 0)
+			return getNamedStyleAtOffset(0);
+		IStructuredDocumentRegion documentRegion = fDocument.getFirstStructuredDocumentRegion();
+		while (documentRegion != null && !documentRegion.containsOffset(offset)) {
+			documentRegion = documentRegion.getNext();
+		}
+		if (documentRegion != null) {
+			// find the ITextRegion's Context at this offset
+			ITextRegion interest = documentRegion.getRegionAtCharacterOffset(offset);
+			if (interest == null)
+				return null;
+			if (offset > documentRegion.getTextEndOffset(interest))
+				return null;
+			String regionContext = interest.getType();
+			if (regionContext == null)
+				return null;
+			// find the named style (internal/selectable name) for that
+			// context
+			String namedStyle = (String) fContextToStyleMap.get(regionContext);
+			if (namedStyle != null) {
+				return namedStyle;
+			}
+		}
+		return null;
+	}
+
+	private OverlayPreferenceStore getOverlayStore() {
+		return fOverlayStore;
+	}
+
+	private Collection getStylePreferenceKeys() {
+		if (fStylePreferenceKeys == null) {
+			List styles = new ArrayList();
+			styles.add(IStyleConstantsXML.DOCTYPE_NAME);
+			styles.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+			styles.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+			styles.add(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+			styles.add(IStyleConstantsXML.CDATA_BORDER);
+			styles.add(IStyleConstantsXML.CDATA_TEXT);
+			styles.add(IStyleConstantsXML.PI_BORDER);
+			styles.add(IStyleConstantsXML.PI_CONTENT);
+			styles.add(IStyleConstantsXML.TAG_BORDER);
+			styles.add(IStyleConstantsXML.TAG_NAME);
+			styles.add(IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+			styles.add(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS);
+			styles.add(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+			styles.add(IStyleConstantsXML.COMMENT_BORDER);
+			styles.add(IStyleConstantsXML.COMMENT_TEXT);
+			styles.add(IStyleConstantsXML.DECL_BORDER);
+			styles.add(IStyleConstantsXML.XML_CONTENT);
+			styles.add(IStyleConstantsXML.ENTITY_REFERENCE);
+			fStylePreferenceKeys = styles;
+		}
+		return fStylePreferenceKeys;
+	}
+
+	private KeyListener getTextKeyListener() {
+		return new KeyListener() {
+			public void keyPressed(KeyEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+
+			public void keyReleased(KeyEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+		};
+	}
+
+	private MouseListener getTextMouseListener() {
+		return new MouseListener() {
+			public void mouseDoubleClick(MouseEvent e) {
+			}
+
+			public void mouseDown(MouseEvent e) {
+			}
+
+			public void mouseUp(MouseEvent e) {
+				if (e.widget instanceof StyledText) {
+					int x = ((StyledText) e.widget).getCaretOffset();
+					selectColorAtOffset(x);
+				}
+			}
+		};
+	}
+
+	private SelectionListener getTextSelectionListener() {
+		return new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				selectColorAtOffset(e.x);
+				if (e.widget instanceof StyledText) {
+					((StyledText) e.widget).setSelection(e.x);
+				}
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				selectColorAtOffset(e.x);
+				if (e.widget instanceof StyledText) {
+					((StyledText) e.widget).setSelection(e.x);
+				}
+			}
+		};
+	}
+
+	private TraverseListener getTraverseListener() {
+		return new TraverseListener() {
+			/**
+			 * @see org.eclipse.swt.events.TraverseListener#keyTraversed(TraverseEvent)
+			 */
+			public void keyTraversed(TraverseEvent e) {
+				if (e.widget instanceof StyledText) {
+					if ((e.detail == SWT.TRAVERSE_TAB_NEXT) || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS))
+						e.doit = true;
+				}
+			}
+		};
+	}
+
+	public void init(IWorkbench workbench) {
+		setDescription(SSEUIMessages.SyntaxColoring_Description);
+
+		fStyleToDescriptionMap = new HashMap();
+		fContextToStyleMap = new HashMap();
+
+		initStyleToDescriptionMap();
+		initRegionContextToStyleMap();
+
+		fOverlayStore = new OverlayPreferenceStore(getPreferenceStore(), createOverlayStoreKeys());
+		fOverlayStore.load();
+		fOverlayStore.start();
+	}
+
+	private void initRegionContextToStyleMap() {
+		fContextToStyleMap.put(DOMRegionContext.XML_COMMENT_OPEN, IStyleConstantsXML.COMMENT_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_COMMENT_TEXT, IStyleConstantsXML.COMMENT_TEXT);
+		fContextToStyleMap.put(DOMRegionContext.XML_COMMENT_CLOSE, IStyleConstantsXML.COMMENT_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_OPEN, IStyleConstantsXML.TAG_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_END_TAG_OPEN, IStyleConstantsXML.TAG_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_NAME, IStyleConstantsXML.TAG_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+		fContextToStyleMap.put(DOMRegionContext.XML_TAG_CLOSE, IStyleConstantsXML.TAG_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_EMPTY_TAG_CLOSE, IStyleConstantsXML.TAG_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_DECLARATION_OPEN, IStyleConstantsXML.DECL_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_DECLARATION_CLOSE, IStyleConstantsXML.DECL_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_ELEMENT_DECLARATION, IStyleConstantsXML.DECL_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_ELEMENT_DECL_CLOSE, IStyleConstantsXML.DECL_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_CONTENT, IStyleConstantsXML.XML_CONTENT);
+		fContextToStyleMap.put(DOMRegionContext.XML_CDATA_OPEN, IStyleConstantsXML.CDATA_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_CDATA_TEXT, IStyleConstantsXML.CDATA_TEXT);
+		fContextToStyleMap.put(DOMRegionContext.XML_CDATA_CLOSE, IStyleConstantsXML.CDATA_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_PI_OPEN, IStyleConstantsXML.PI_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_PI_CONTENT, IStyleConstantsXML.PI_CONTENT);
+		fContextToStyleMap.put(DOMRegionContext.XML_PI_CLOSE, IStyleConstantsXML.PI_BORDER);
+		fContextToStyleMap.put(DOMRegionContext.XML_ELEMENT_DECL_NAME, IStyleConstantsXML.DOCTYPE_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_DECLARATION, IStyleConstantsXML.TAG_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_DECLARATION_CLOSE, IStyleConstantsXML.DECL_BORDER);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_NAME, IStyleConstantsXML.DOCTYPE_NAME);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBLIC, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBREF, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSTEM, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		fContextToStyleMap.put(DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSREF, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+
+		fContextToStyleMap.put(DOMRegionContext.XML_CHAR_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+		fContextToStyleMap.put(DOMRegionContext.XML_ENTITY_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+		fContextToStyleMap.put(DOMRegionContext.XML_PE_REFERENCE, IStyleConstantsXML.ENTITY_REFERENCE);
+	}
+
+	private void initStyleToDescriptionMap() {
+		fStyleToDescriptionMap.put(IStyleConstantsXML.CDATA_BORDER, XMLUIMessages.CDATA_Delimiters_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.CDATA_TEXT, XMLUIMessages.CDATA_Content_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.PI_BORDER, XMLUIMessages.Processing_Instruction_Del_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.PI_CONTENT, XMLUIMessages.Processing_Instruction_Con_UI__UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.COMMENT_BORDER, XMLUIMessages.Comment_Delimiters_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.COMMENT_TEXT, XMLUIMessages.Comment_Content_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_BORDER, XMLUIMessages.Tag_Delimiters_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_NAME, XMLUIMessages.Tag_Names_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_ATTRIBUTE_NAME, XMLUIMessages.Attribute_Names_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS, XMLUIMessages.Attribute_Equals_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE, XMLUIMessages.Attribute_Values_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DECL_BORDER, XMLUIMessages.Declaration_Delimiters_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.XML_CONTENT, XMLUIMessages.Content_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_NAME, XMLUIMessages.DOCTYPE_Name_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID, XMLUIMessages.DOCTYPE_SYSTEM_PUBLIC_Keyw_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF, XMLUIMessages.DOCTYPE_Public_Reference_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF, XMLUIMessages.DOCTYPE_System_Reference_UI_);
+		fStyleToDescriptionMap.put(IStyleConstantsXML.ENTITY_REFERENCE, XMLUIMessages.Entity_Reference_UI_);
+	}
+
+	protected void performDefaults() {
+		super.performDefaults();
+		getOverlayStore().loadDefaults();
+		applyStyles();
+		fStylesViewer.setSelection(StructuredSelection.EMPTY);
+		activate(null);
+		fText.redraw();
+	}
+
+	public boolean performOk() {
+		getOverlayStore().propagate();
+
+		XMLUIPlugin.getDefault().savePluginPreferences();
+		SSEUIPlugin.getDefault().savePluginPreferences();
+		return true;
+	}
+
+	private void selectColorAtOffset(int offset) {
+		String namedStyle = getNamedStyleAtOffset(offset);
+		if (namedStyle != null) {
+			fStylesViewer.setSelection(new StructuredSelection(namedStyle));
+			fStylesViewer.reveal(namedStyle);
+		}
+		else {
+			fStylesViewer.setSelection(StructuredSelection.EMPTY);
+		}
+		activate(namedStyle);
+	}
+
+	/**
+	 * Specifically set the reporting name of a control for accessibility
+	 */
+	private void setAccessible(Control control, String name) {
+		if (control == null)
+			return;
+		final String n = name;
+		control.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+			public void getName(AccessibleEvent e) {
+				if (e.childID == ACC.CHILDID_SELF)
+					e.result = n;
+			}
+		});
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLTemplatePreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLTemplatePreferencePage.java
new file mode 100644
index 0000000..ed6dea5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLTemplatePreferencePage.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
+import org.eclipse.wst.xml.ui.StructuredTextViewerConfigurationXML;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+
+
+/**
+ * Preference page for XML templates
+ */
+public class XMLTemplatePreferencePage extends TemplatePreferencePage {
+
+	class XMLEditTemplateDialog extends EditTemplateDialog {
+		public XMLEditTemplateDialog(Shell parent, Template template, boolean edit, boolean isNameModifiable, ContextTypeRegistry registry) {
+			super(parent, template, edit, isNameModifiable, registry);
+		}
+
+		protected SourceViewer createViewer(Composite parent) {
+			SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
+				StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationXML();
+
+				public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+					return baseConfiguration.getConfiguredContentTypes(sourceViewer);
+				}
+
+				public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+					return baseConfiguration.getLineStyleProviders(sourceViewer, partitionType);
+				}
+
+				public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+					ContentAssistant assistant = new ContentAssistant();
+					assistant.enableAutoActivation(true);
+					assistant.enableAutoInsert(true);
+					assistant.setContentAssistProcessor(getTemplateProcessor(), IDocument.DEFAULT_CONTENT_TYPE);
+					return assistant;
+				}
+			};
+			return doCreateViewer(parent, sourceViewerConfiguration);
+		}
+	}
+
+	public XMLTemplatePreferencePage() {
+		XMLUIPlugin xmlEditorPlugin = XMLUIPlugin.getDefault();
+
+		setPreferenceStore(xmlEditorPlugin.getPreferenceStore());
+		setTemplateStore(xmlEditorPlugin.getTemplateStore());
+		setContextTypeRegistry(xmlEditorPlugin.getTemplateContextRegistry());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite ancestor) {
+		Control c = super.createContents(ancestor);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(c, IHelpContextIds.XML_PREFWEBX_TEMPLATES_HELPID);
+		return c;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.templates.TemplatePreferencePage#createViewer(org.eclipse.swt.widgets.Composite)
+	 */
+	protected SourceViewer createViewer(Composite parent) {
+		SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
+			StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationXML();
+
+			public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+				return baseConfiguration.getConfiguredContentTypes(sourceViewer);
+			}
+
+			public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+				return baseConfiguration.getLineStyleProviders(sourceViewer, partitionType);
+			}
+		};
+		return doCreateViewer(parent, sourceViewerConfiguration);
+	}
+
+	SourceViewer doCreateViewer(Composite parent, SourceViewerConfiguration viewerConfiguration) {
+		SourceViewer viewer = null;
+		String contentTypeID = ContentTypeIdForXML.ContentTypeID_XML;
+		viewer = new StructuredTextViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+		viewer.getTextWidget().setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
+		IStructuredModel scratchModel = StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(contentTypeID);
+		IDocument document = scratchModel.getStructuredDocument();
+		viewer.configure(viewerConfiguration);
+		viewer.setDocument(document);
+		return viewer;
+	}
+
+	/**
+	 * Creates the edit dialog. Subclasses may override this method to provide
+	 * a custom dialog.
+	 * 
+	 * @param template
+	 *            the template being edited
+	 * @param edit
+	 *            whether the dialog should be editable
+	 * @param isNameModifiable
+	 *            whether the template name may be modified
+	 * @return the created or modified template, or <code>null</code> if the
+	 *         edition failed
+	 * @since 3.1
+	 */
+	protected Template editTemplate(Template template, boolean edit, boolean isNameModifiable) {
+		EditTemplateDialog dialog = new XMLEditTemplateDialog(getShell(), template, edit, isNameModifiable, getContextTypeRegistry());
+		if (dialog.open() == Window.OK) {
+			return dialog.getTemplate();
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.texteditor.templates.TemplatePreferencePage#isShowFormatterSetting()
+	 */
+	protected boolean isShowFormatterSetting() {
+		// template formatting has not been implemented
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		boolean ok = super.performOk();
+		XMLUIPlugin.getDefault().savePluginPreferences();
+		return ok;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLTypingPreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLTypingPreferencePage.java
new file mode 100644
index 0000000..8487ab2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLTypingPreferencePage.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+ 
+public class XMLTypingPreferencePage extends AbstractPreferencePage {
+
+	private Button fCloseComment;
+	private Button fCloseEndTag;
+	private Button fRemoveEndTag;
+	private Button fCloseElement;
+	private Button fCloseStrings;
+	private Button fCloseBrackets;
+
+	protected Control createContents(Composite parent) {
+		Composite composite = super.createComposite(parent, 1);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.XML_PREFWEBX_FILES_HELPID);
+
+		createStartTagGroup(composite);
+		createEndTagGroup(composite);
+		createAutoComplete(composite);
+		createAutoRemove(composite);
+		
+		setSize(composite);
+		loadPreferences();
+		
+		return composite;
+	}
+	
+	private void createStartTagGroup(Composite parent) {
+		Group group = createGroup(parent, 2);
+
+		group.setText(XMLUIMessages.XMLTyping_Start_Tag);
+
+		fCloseElement = createCheckBox(group, XMLUIMessages.XMLTyping_Complete_Elements);
+		((GridData) fCloseElement.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	private void createEndTagGroup(Composite parent) {
+		Group group = createGroup(parent, 2);
+
+		group.setText(XMLUIMessages.XMLTyping_End_Tag);
+
+		fCloseEndTag = createCheckBox(group, XMLUIMessages.XMLTyping_Complete_End_Tags);
+		((GridData) fCloseEndTag.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	private void createAutoComplete(Composite parent) {
+		Group group = createGroup(parent, 2);
+		
+		group.setText(XMLUIMessages.XMLTyping_Auto_Complete);
+		
+		fCloseComment = createCheckBox(group, XMLUIMessages.XMLTyping_Complete_Comments);
+		((GridData) fCloseComment.getLayoutData()).horizontalSpan = 2;
+
+		fCloseStrings = createCheckBox(group, XMLUIMessages.XMLTyping_Close_Strings);
+		((GridData) fCloseStrings.getLayoutData()).horizontalSpan = 2;
+
+		fCloseBrackets = createCheckBox(group, XMLUIMessages.XMLTyping_Close_Brackets);
+		((GridData) fCloseBrackets.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	private void createAutoRemove(Composite parent) {
+		Group group = createGroup(parent, 2);
+		
+		group.setText(XMLUIMessages.XMLTyping_Auto_Remove);
+		
+		fRemoveEndTag = createCheckBox(group, XMLUIMessages.XMLTyping_Remove_End_Tags);
+		((GridData) fRemoveEndTag.getLayoutData()).horizontalSpan = 2;
+	}
+	
+	public boolean performOk() {
+		boolean result = super.performOk();
+		
+		XMLUIPlugin.getDefault().savePluginPreferences();
+		
+		return result;
+	}
+	
+	protected void initializeValues() {
+		initCheckbox(fCloseComment, XMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS);
+		initCheckbox(fCloseEndTag, XMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS);
+		initCheckbox(fCloseElement, XMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS);
+		initCheckbox(fRemoveEndTag, XMLUIPreferenceNames.TYPING_REMOVE_END_TAGS);
+		initCheckbox(fCloseStrings, XMLUIPreferenceNames.TYPING_CLOSE_STRINGS);
+		initCheckbox(fCloseBrackets, XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS);
+	}
+	
+	protected void performDefaults() {
+		defaultCheckbox(fCloseComment, XMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS);
+		defaultCheckbox(fCloseEndTag, XMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS);
+		defaultCheckbox(fCloseElement, XMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS);
+		defaultCheckbox(fRemoveEndTag, XMLUIPreferenceNames.TYPING_REMOVE_END_TAGS);
+		defaultCheckbox(fCloseStrings, XMLUIPreferenceNames.TYPING_CLOSE_STRINGS);
+		defaultCheckbox(fCloseBrackets, XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS);
+	}
+	
+	protected void storeValues() {
+		getPreferenceStore().setValue(XMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS, (fCloseComment != null) ? fCloseComment.getSelection() : false);
+		getPreferenceStore().setValue(XMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS, (fCloseEndTag != null) ? fCloseEndTag.getSelection() : false);
+		getPreferenceStore().setValue(XMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS, (fCloseElement != null) ? fCloseElement.getSelection() : false);
+		getPreferenceStore().setValue(XMLUIPreferenceNames.TYPING_REMOVE_END_TAGS, (fRemoveEndTag != null) ? fRemoveEndTag.getSelection() : false);
+		getPreferenceStore().setValue(XMLUIPreferenceNames.TYPING_CLOSE_STRINGS, (fCloseStrings != null) ? fCloseStrings.getSelection() : false);
+		getPreferenceStore().setValue(XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS, (fCloseBrackets != null) ? fCloseBrackets.getSelection() : false);
+	}
+	
+	protected IPreferenceStore doGetPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLUIPreferenceInitializer.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLUIPreferenceInitializer.java
new file mode 100644
index 0000000..7632e6b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLUIPreferenceInitializer.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference 
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML;
+
+/**
+ * Sets default values for XML UI preferences
+ */
+public class XMLUIPreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	public void initializeDefaultPreferences() {
+		IPreferenceStore store = XMLUIPlugin.getDefault().getPreferenceStore();
+		ColorRegistry registry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry();
+
+		store.setDefault(XMLUIPreferenceNames.AUTO_PROPOSE, true);
+		store.setDefault(XMLUIPreferenceNames.AUTO_PROPOSE_CODE, "<=:"); //$NON-NLS-1$
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=140946
+		store.setDefault(XMLUIPreferenceNames.SUGGESTION_STRATEGY, XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_STRICT);
+		store.setDefault(XMLUIPreferenceNames.USE_INFERRED_GRAMMAR, true);
+
+		// XML Style Preferences
+		String NOBACKGROUNDBOLD = " | null | false"; //$NON-NLS-1$
+		String JUSTITALIC = " | null | false | true"; //$NON-NLS-1$
+		String styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_ATTRIBUTE_NAME, 127, 0, 127) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.TAG_ATTRIBUTE_NAME, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_ATTRIBUTE_VALUE, 42, 0, 255) + JUSTITALIC;
+		store.setDefault(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE, styleValue);
+
+		styleValue = "null" + NOBACKGROUNDBOLD; //$NON-NLS-1$
+		store.setDefault(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS, styleValue); // specified
+		// value is black; leaving as widget default
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.COMMENT_BORDER, 63, 95, 191) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.COMMENT_BORDER, styleValue);
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.COMMENT_TEXT, 63, 95, 191) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.COMMENT_TEXT, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DECL_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DECL_BORDER, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_NAME, 0, 0, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_NAME, styleValue);
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF, 0, 0, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID, 128, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF, 63, 127, 95) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF, styleValue);
+
+		styleValue = "null" + NOBACKGROUNDBOLD; //$NON-NLS-1$
+		store.setDefault(IStyleConstantsXML.XML_CONTENT, styleValue); // specified
+		// value is black; leaving as widget default
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.TAG_BORDER, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.TAG_NAME, 63, 127, 127) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.TAG_NAME, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.PI_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.PI_BORDER, styleValue);
+
+		styleValue = "null" + NOBACKGROUNDBOLD; //$NON-NLS-1$
+		store.setDefault(IStyleConstantsXML.PI_CONTENT, styleValue); // specified
+		// value is black; leaving as widget default
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.CDATA_BORDER, 0, 128, 128) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.CDATA_BORDER, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.CDATA_TEXT, 0, 0, 0) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.CDATA_TEXT, styleValue);
+
+		styleValue = ColorHelper.findRGBString(registry, IStyleConstantsXML.ENTITY_REFERENCE, 42, 0, 255) + NOBACKGROUNDBOLD;
+		store.setDefault(IStyleConstantsXML.ENTITY_REFERENCE, styleValue);
+		
+		// set default new xml file template to use in new file wizard
+		/*
+		 * Need to find template name that goes with default template id (name
+		 * may change for different language)
+		 */
+		store.setDefault(XMLUIPreferenceNames.NEW_FILE_TEMPLATE_ID, "org.eclipse.wst.xml.ui.internal.templates.xmldeclaration"); //$NON-NLS-1$
+		
+		// Defaults for the Typing preference page
+		store.setDefault(XMLUIPreferenceNames.TYPING_COMPLETE_COMMENTS, true);
+		store.setDefault(XMLUIPreferenceNames.TYPING_COMPLETE_END_TAGS, true);
+		store.setDefault(XMLUIPreferenceNames.TYPING_COMPLETE_ELEMENTS, true);
+		store.setDefault(XMLUIPreferenceNames.TYPING_REMOVE_END_TAGS, true);
+		store.setDefault(XMLUIPreferenceNames.TYPING_CLOSE_STRINGS, true);
+		store.setDefault(XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS, true);
+		
+		// Defaults for Content Assist preference page
+		store.setDefault(XMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_DEFAULT_PAGE, "");
+		store.setDefault(XMLUIPreferenceNames.CONTENT_ASSIST_DO_NOT_DISPLAY_ON_OWN_PAGE, "");
+		store.setDefault(XMLUIPreferenceNames.CONTENT_ASSIST_DEFAULT_PAGE_SORT_ORDER,
+				"org.eclipse.wst.xml.ui.proposalCategory.xmlTags\0" +
+				"org.eclipse.wst.xml.ui.proposalCategory.xmlTemplates");
+		store.setDefault(XMLUIPreferenceNames.CONTENT_ASSIST_OWN_PAGE_SORT_ORDER,
+				"org.eclipse.wst.xml.ui.proposalCategory.xmlTemplates\0"+ 
+				"org.eclipse.wst.xml.ui.proposalCategory.xmlTags");
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLUIPreferenceNames.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLUIPreferenceNames.java
new file mode 100644
index 0000000..f537341
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLUIPreferenceNames.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+/**
+ * Preference keys for XML UI
+ */
+public class XMLUIPreferenceNames {
+
+	public final static String SUGGESTION_STRATEGY_VALUE_LAX = "Lax"; //$NON-NLS-1$
+	public final static String SUGGESTION_STRATEGY_VALUE_STRICT = "Strict"; //$NON-NLS-1$
+	/**
+	 * A named preference that controls if code assist gets auto activated.
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 */
+	public static final String AUTO_PROPOSE = getAutoProposeKey();
+
+	private static String getAutoProposeKey() {
+		return "autoPropose";//$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that holds the characters that auto activate code
+	 * assist.
+	 * <p>
+	 * Value is of type <code>String</code>. All characters that trigger
+	 * auto code assist.
+	 * </p>
+	 */
+	public static final String AUTO_PROPOSE_CODE = getAutoProposeCodeKey();
+
+	private static String getAutoProposeCodeKey() {
+		return "autoProposeCode";//$NON-NLS-1$
+	}
+
+	/**
+	 * The key to store customized templates.
+	 * <p>
+	 * Value is of type <code>String</code>.
+	 * </p>
+	 */
+	public static final String TEMPLATES_KEY = getTemplatesKey();
+
+	private static String getTemplatesKey() {
+		return "org.eclipse.wst.sse.ui.custom_templates"; //$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that controls whether or grammar should be inferred
+	 * or not.
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 */
+	public static final String USE_INFERRED_GRAMMAR = getUseInferredGrammarKey();
+
+	public static class OUTLINE_BEHAVIOR {
+		public static final String ELEMENT_NODE = "outline-behavior.element-node"; //$NON-NLS-1$
+		public static final String ATTRIBUTE_NODE = "outline-behavior.attribute-node"; //$NON-NLS-1$
+		public static final String TEXT_NODE = "outline-behavior.text-node"; //$NON-NLS-1$
+		public static final String CDATA_SECTION_NODE = "outline-behavior.cdata-section-node"; //$NON-NLS-1$
+		public static final String ENTITY_REFERENCE_NODE = "outline-behavior.entity-reference-node"; //$NON-NLS-1$
+		public static final String ENTITY_NODE = "outline-behavior.entity-node"; //$NON-NLS-1$
+		public static final String PROCESSING_INSTRUCTION_NODE = "outline-behavior.instruction-node"; //$NON-NLS-1$
+		public static final String COMMENT_NODE = "outline-behavior.comment-node"; //$NON-NLS-1$
+		public static final String DOCUMENT_NODE = "outline-behavior.document-node"; //$NON-NLS-1$
+		public static final String DOCUMENT_TYPE_NODE = "outline-behavior.document-type-node"; //$NON-NLS-1$
+		public static final String DOCUMENT_FRAGMENT_NODE = "outline-behavior.document-fragment-node"; //$NON-NLS-1$
+		public static final String NOTATION_NODE = "outline-behavior.notation-node"; //$NON-NLS-1$
+	}
+	
+	private static String getUseInferredGrammarKey() {
+		return "useInferredGrammar"; //$NON-NLS-1$
+	}
+
+	/**
+	 * A named preference that holds the characters that auto activate code
+	 * assist.
+	 * <p>
+	 * Value is of type <code>String</code>. All characters that trigger
+	 * auto code assist.
+	 * </p>
+	 */
+	public static final String SUGGESTION_STRATEGY = getSuggestionStrategeyKey();
+
+	private static String getSuggestionStrategeyKey() {
+		return "suggestionStrategy";//$NON-NLS-1$
+	}
+
+	/**
+	 * The key to store the last template name used in new DTD file wizard.
+	 * Template name is stored instead of template id because user-created
+	 * templates do not have template ids.
+	 * <p>
+	 * Value is of type <code>String</code>.
+	 * </p>
+	 */
+	public static final String NEW_FILE_TEMPLATE_NAME = "newFileTemplateName"; //$NON-NLS-1$
+
+	/**
+	 * The initial template ID to be used in the new XML file wizard. In the absence
+	 * of {@link NEW_FILE_TEMPLATE_NAME}, this ID is used to find a template name
+	 */
+	public static final String NEW_FILE_TEMPLATE_ID = "newFileTemplateId"; //$NON-NLS-1$
+
+	/**
+	 * The key to store the option for auto-completing comments while
+	 * typing.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_COMPLETE_COMMENTS = "completeComments"; //$NON-NLS-1$
+	
+	/**
+	 * The key to store the option for auto-completing end-tags after entering
+	 * <code>&lt;/</code>
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_COMPLETE_END_TAGS = "completeEndTags"; //$NON-NLS-1$
+	
+	/**
+	 * The key to store the option for auto-completing the element after entering
+	 * <code>&gt;</code>
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_COMPLETE_ELEMENTS = "completeElements"; //$NON-NLS-1$
+	
+	/**
+	 * The key to store the option for removing an end-tag if the start tag is
+	 * converted to an empty-tag.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_REMOVE_END_TAGS = "removeEndTags"; //$NON-NLS-1$
+
+	/**
+	 * The key to store the option for auto-completing strings (" and ') while
+	 * typing.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_CLOSE_STRINGS = "closeStrings"; //$NON-NLS-1$
+
+	/**
+	 * The key to store the option for auto-completing brackets ([ and () while
+	 * typing.
+	 * <p>
+	 * Value is of type <code>boolean</code>.
+	 * </p>
+	 */
+	public static final String TYPING_CLOSE_BRACKETS = "closeBrackets"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key used for saving which categories should not display on the default page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>), ordered is ignored</p>
+	 */
+	public static final String CONTENT_ASSIST_DO_NOT_DISPLAY_ON_DEFAULT_PAGE = "xml_content_assist_display_on_default_page"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key used for saving which categories should not display on their own page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>), order is ignored</p>
+	 */
+	public static final String CONTENT_ASSIST_DO_NOT_DISPLAY_ON_OWN_PAGE = "xml_content_assist_display_on_own_page"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key for saving the sort order of the categories when displaying them on their own page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>) in the desired sort order.</p>
+	 */
+	public static final String CONTENT_ASSIST_OWN_PAGE_SORT_ORDER= "xml_content_assist_own_page_sort_order"; //$NON-NLS-1$
+	
+	/**
+	 * <p>preference key for saving the sort order of the categories when displaying them on the default page</p>
+	 * 
+	 * <p>Value is of type {@link String} consisting of
+	 * <tt>org.eclipse.wst.sse.ui.completionProposal/proposalCategory/@id</tt>s separated by the null
+	 * character (<tt>\0</tt>) in the desired sort order.</p>
+	 */
+	public static final String CONTENT_ASSIST_DEFAULT_PAGE_SORT_ORDER= "xml_content_assist_default_page_sort_order"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLValidatorPreferencePage.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLValidatorPreferencePage.java
new file mode 100644
index 0000000..155bdaa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/preferences/XMLValidatorPreferencePage.java
@@ -0,0 +1,518 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     David Carver - STAR - [205989] - [validation] validate XML after XInclude resolution
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.preferences;
+
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.dialogs.ControlEnableState;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.editor.IHelpContextIds;
+
+
+public class XMLValidatorPreferencePage extends AbstractPreferencePage {
+  private Combo fIndicateNoGrammar;
+  
+  private Button fHonourAllSchemaLocations;
+
+  private Button fUseXinclude;
+  
+  private Button fExtendedMarkupValidation;
+  
+  private Combo fEmptyElementTag;
+  
+  private Combo fEndTagWithAttributes;
+  
+  private Combo fInvalidWhitespaceBeforeTagname;
+  
+  private Combo fMissingClosingBracket;
+  
+  private Combo fMissingClosingQuote;
+  
+  private Combo fMissingEndTag;
+  
+  private Combo fMissingStartTag;
+  
+  private Combo fMissingQuotes;
+  
+  private Combo fInvalidNamespaceInPI;
+  
+  private Combo fMissingTagName;
+  
+  private Combo fInvalidWhitespaceAtStart;
+
+  private Group fMarkupValidationGroup;
+  private ControlEnableState fMarkupState;
+ 
+  private static final String[] SEVERITIES = {XMLUIMessages.Indicate_no_grammar_specified_severities_error, XMLUIMessages.Indicate_no_grammar_specified_severities_warning, XMLUIMessages.Indicate_no_grammar_specified_severities_ignore};
+  private static final String[] MARKUP_SEVERITIES = {XMLUIMessages.Severity_error, XMLUIMessages.Severity_warning, XMLUIMessages.Severity_ignore};
+
+  protected Control createContents(Composite parent) {
+    Composite composite = (Composite)super.createContents(parent);
+    PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.XML_PREFWEBX_VALIDATOR_HELPID);
+    createContentsForValidatingGroup(composite);
+    createContentsForMarkupValidationGroup(composite);
+    setSize(composite);
+    loadPreferences();
+
+    return composite;
+  }
+
+  protected void createContentsForValidatingGroup(Composite parent) {
+    Group validatingGroup = createGroup(parent, 2);
+    ((GridLayout)validatingGroup.getLayout()).makeColumnsEqualWidth = false;
+    validatingGroup.setText(XMLUIMessages.Validating_files);
+
+    if (fIndicateNoGrammar == null) {
+      createLabel(validatingGroup, XMLUIMessages.Indicate_no_grammar_specified);
+      fIndicateNoGrammar = createCombo(validatingGroup, SEVERITIES);
+    }
+    if (fUseXinclude == null) {
+      fUseXinclude = createCheckBox(validatingGroup, XMLUIMessages.Use_XInclude);
+      ((GridData)fUseXinclude.getLayoutData()).horizontalSpan = 2;
+    }
+    if (fHonourAllSchemaLocations == null) {
+      fHonourAllSchemaLocations = createCheckBox(validatingGroup, XMLUIMessages.Honour_all_schema_locations);
+      ((GridData)fHonourAllSchemaLocations.getLayoutData()).horizontalSpan = 2;
+    }
+  }
+  private void handleMarkupSeveritySelection(boolean selection){
+	  if (selection) {
+		  fMarkupState.restore();
+	  }
+	  else {
+		  fMarkupState = ControlEnableState.disable(fMarkupValidationGroup);
+	  }
+  }
+
+  protected void createContentsForMarkupValidationGroup(Composite parent) {
+	   
+	    if (fExtendedMarkupValidation == null) {
+		    fExtendedMarkupValidation = createCheckBox(parent, XMLUIMessages.MarkupValidation_files);
+		    ((GridData)fExtendedMarkupValidation.getLayoutData()).horizontalSpan = 2;
+		    fExtendedMarkupValidation.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					handleMarkupSeveritySelection(fExtendedMarkupValidation.getSelection());
+				}
+			});
+		}
+	    fMarkupValidationGroup = createGroup(parent, 3);
+	    ((GridLayout)fMarkupValidationGroup.getLayout()).makeColumnsEqualWidth = false;
+	    fMarkupValidationGroup.setText(XMLUIMessages.MarkupValidation_files_label);
+
+	    if (fMissingStartTag == null) {
+	        fMissingStartTag = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Missing_start_tag, MARKUP_SEVERITIES);
+	    }
+	    if (fMissingEndTag == null) {
+	        fMissingEndTag = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Missing_end_tag, MARKUP_SEVERITIES);
+	    }
+	    if (fMissingTagName == null) {
+	        fMissingTagName = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Tag_name_missing, MARKUP_SEVERITIES);
+	    }
+	    if (fMissingQuotes == null) {
+	        fMissingQuotes = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Missing_quotes, MARKUP_SEVERITIES);
+	    }
+	    if (fMissingClosingBracket == null) {
+	        fMissingClosingBracket = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Missing_closing_bracket, MARKUP_SEVERITIES);
+	    }
+	    if (fMissingClosingQuote == null) {
+	        fMissingClosingQuote = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Missing_closing_quote, MARKUP_SEVERITIES);
+	    }
+	    if (fEmptyElementTag == null) {
+	        fEmptyElementTag = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Empty_element_tag, MARKUP_SEVERITIES);
+	    }
+	    if (fEndTagWithAttributes == null) {
+	        fEndTagWithAttributes = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.End_tag_with_attributes, MARKUP_SEVERITIES);
+	    }
+	    if (fInvalidWhitespaceBeforeTagname == null) {
+	        fInvalidWhitespaceBeforeTagname = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Invalid_whitespace_before_tagname, MARKUP_SEVERITIES);
+	    }
+	    if (fInvalidNamespaceInPI == null) {
+	        fInvalidNamespaceInPI = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Namespace_in_pi_target, MARKUP_SEVERITIES);
+	    }
+	    if (fInvalidWhitespaceAtStart == null) {
+	        fInvalidWhitespaceAtStart = createMarkupCombo(fMarkupValidationGroup, XMLUIMessages.Whitespace_at_start, MARKUP_SEVERITIES);
+	    }
+
+  }
+
+  /**
+   * @param parent 
+   * @return
+   */
+  private Combo createCombo(Composite parent, String[] items) {
+    Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+    combo.setItems(items);
+
+    //GridData
+    GridData data = new GridData(SWT.FILL, SWT.CENTER, true, true);
+    combo.setLayoutData(data);
+
+    return combo;
+  }
+
+  private Combo createMarkupCombo(Composite parent, String text, String[] items) {
+	  Label label = new Label(parent, SWT.LEFT);
+	  GridData gd = new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1);
+		label.setFont(JFaceResources.getDialogFont());
+		label.setText(text);
+		label.setLayoutData(gd);
+
+	  Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+	    combo.setItems(items);
+
+	    //GridData
+	   // GridData data = new GridData(SWT.FILL, SWT.CENTER, false, true);
+	    combo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+
+	    return combo;
+  }
+ 
+  protected void initializeValues() {
+    initializeValuesForValidatingGroup();
+    initializeValuesForMarkupValidationGroup();
+  }
+
+  protected void initializeValuesForValidatingGroup() {
+    Preferences modelPreferences = getModelPreferences();
+    int indicateNoGrammarButtonSelected = modelPreferences.getInt(XMLCorePreferenceNames.INDICATE_NO_GRAMMAR);
+    boolean useXIncludeButtonSelected = modelPreferences.getBoolean(XMLCorePreferenceNames.USE_XINCLUDE);
+
+    if (fIndicateNoGrammar != null) {
+      fIndicateNoGrammar.select(2 - indicateNoGrammarButtonSelected);
+      fIndicateNoGrammar.setText(SEVERITIES[2 - indicateNoGrammarButtonSelected]);
+    }
+    if (fUseXinclude != null) {
+      fUseXinclude.setSelection(useXIncludeButtonSelected);
+    }
+
+    boolean honourAllSelected = modelPreferences.getBoolean(XMLCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS);
+    if (fHonourAllSchemaLocations != null) {
+      fHonourAllSchemaLocations.setSelection(honourAllSelected);
+    }
+  }
+  
+  protected void initializeValuesForMarkupValidationGroup() {
+	    Preferences modelPreferences = getModelPreferences();
+	    boolean useExtendedMarkupValidation = modelPreferences.getBoolean(XMLCorePreferenceNames.MARKUP_VALIDATION);
+
+	    
+	    if (fExtendedMarkupValidation != null) {
+	    	fExtendedMarkupValidation.setSelection(useExtendedMarkupValidation);
+	    }
+	    int emptyElementTag = modelPreferences.getInt(XMLCorePreferenceNames.ATTRIBUTE_HAS_NO_VALUE);
+	    
+	    if (fEmptyElementTag != null) {
+	    	fEmptyElementTag.select(2 - emptyElementTag);
+	    	fEmptyElementTag.setText(MARKUP_SEVERITIES[2 - emptyElementTag]);
+		}
+	    
+	    int endTagWithAttributes  = modelPreferences.getInt(XMLCorePreferenceNames.END_TAG_WITH_ATTRIBUTES);
+	    
+	    if (fEndTagWithAttributes != null) {
+	    	fEndTagWithAttributes.select(2 - endTagWithAttributes);
+	    	fEndTagWithAttributes.setText(MARKUP_SEVERITIES[2 - endTagWithAttributes]);
+		}
+	    
+	    int invalidWhitespaceBeforeTagname  = modelPreferences.getInt(XMLCorePreferenceNames.WHITESPACE_BEFORE_TAGNAME);
+	    
+	    if (fInvalidWhitespaceBeforeTagname != null) {
+	    	fInvalidWhitespaceBeforeTagname.select(2 - invalidWhitespaceBeforeTagname);
+	    	fInvalidWhitespaceBeforeTagname.setText(MARKUP_SEVERITIES[2 - invalidWhitespaceBeforeTagname]);
+		}
+	    
+	    int missingClosingBracket  = modelPreferences.getInt(XMLCorePreferenceNames.MISSING_CLOSING_BRACKET);
+	    
+	    if (fMissingClosingBracket != null) {
+	    	fMissingClosingBracket.select(2 - missingClosingBracket);
+	    	fMissingClosingBracket.setText(MARKUP_SEVERITIES[2 - missingClosingBracket]);
+		}
+	    
+	    int missingClosingQuote  = modelPreferences.getInt(XMLCorePreferenceNames.MISSING_CLOSING_QUOTE);
+	    
+	    if (fMissingClosingQuote != null) {
+	    	fMissingClosingQuote.select(2 - missingClosingQuote);
+	    	fMissingClosingQuote.setText(MARKUP_SEVERITIES[2 - missingClosingQuote]);
+		}
+	    
+	    int missingEndTag  = modelPreferences.getInt(XMLCorePreferenceNames.MISSING_END_TAG);
+	    
+	    if (fMissingEndTag != null) {
+	    	fMissingEndTag.select(2 - missingEndTag);
+	    	fMissingEndTag.setText(MARKUP_SEVERITIES[2 - missingEndTag]);
+		}
+	    
+	    int missingStartTag  = modelPreferences.getInt(XMLCorePreferenceNames.MISSING_START_TAG);
+	    
+	    if (fMissingStartTag != null) {
+	    	fMissingStartTag.select(2 - missingStartTag);
+	    	fMissingStartTag.setText(MARKUP_SEVERITIES[2 - missingStartTag]);
+		}
+	    
+	    int missingQuotes  = modelPreferences.getInt(XMLCorePreferenceNames.MISSING_QUOTES);
+	    
+	    if (fMissingQuotes != null) {
+	    	fMissingQuotes.select(2 - missingQuotes);
+	    	fMissingQuotes.setText(MARKUP_SEVERITIES[2 - missingQuotes]);
+		}
+	    
+	    int invalidNamespaceInPI  = modelPreferences.getInt(XMLCorePreferenceNames.NAMESPACE_IN_PI_TARGET);
+	    
+	    if (fInvalidNamespaceInPI != null) {
+	    	fInvalidNamespaceInPI.select(2 - invalidNamespaceInPI);
+	    	fInvalidNamespaceInPI.setText(MARKUP_SEVERITIES[2 - invalidNamespaceInPI]);
+		}
+	    
+	    int tagNameMissing  = modelPreferences.getInt(XMLCorePreferenceNames.MISSING_TAG_NAME);
+	    
+	    if (fMissingTagName != null) {
+	    	fMissingTagName.select(2 - tagNameMissing);
+	    	fMissingTagName.setText(MARKUP_SEVERITIES[2 - tagNameMissing]);
+		}
+	    
+	    int invalidWhitespaceAtStart  = modelPreferences.getInt(XMLCorePreferenceNames.WHITESPACE_AT_START);
+	    
+	    if (fInvalidWhitespaceAtStart != null) {
+	    	fInvalidWhitespaceAtStart.select(2 - invalidWhitespaceAtStart);
+	    	fInvalidWhitespaceAtStart.setText(MARKUP_SEVERITIES[2 - invalidWhitespaceAtStart]);
+		}
+
+	    if (!useExtendedMarkupValidation)
+	    	fMarkupState = ControlEnableState.disable(fMarkupValidationGroup);
+  }
+
+  protected void performDefaultsForValidatingGroup() {
+    Preferences modelPreferences = getModelPreferences();
+    int indicateNoGrammarButtonSelected = modelPreferences.getDefaultInt(XMLCorePreferenceNames.INDICATE_NO_GRAMMAR);
+    boolean useXIncludeButtonSelected = modelPreferences.getDefaultBoolean(XMLCorePreferenceNames.USE_XINCLUDE);
+
+    if (fIndicateNoGrammar != null) {
+      fIndicateNoGrammar.setSelection(new Point(indicateNoGrammarButtonSelected, 2 - indicateNoGrammarButtonSelected));
+      fIndicateNoGrammar.setText(SEVERITIES[indicateNoGrammarButtonSelected]);
+    }
+    if (fUseXinclude != null) {
+      fUseXinclude.setSelection(useXIncludeButtonSelected);
+    }
+
+    boolean honourAllButtonSelected = modelPreferences.getDefaultBoolean(XMLCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS);
+    if (fHonourAllSchemaLocations != null) {
+      fHonourAllSchemaLocations.setSelection(honourAllButtonSelected);
+    }
+  }
+  
+  protected void performDefaultsForMarkupValidationGroup() {
+	  Preferences modelPreferences = getModelPreferences();
+	    boolean useExtendedMarkupValidation = modelPreferences.getDefaultBoolean(XMLCorePreferenceNames.MARKUP_VALIDATION);
+
+	    
+	    if (fExtendedMarkupValidation != null) {
+	    	if (fExtendedMarkupValidation.getSelection() != useExtendedMarkupValidation) {
+	    		handleMarkupSeveritySelection(useExtendedMarkupValidation);
+	    	}
+	    	fExtendedMarkupValidation.setSelection(useExtendedMarkupValidation);
+	    	
+	    }
+	    int emptyElementTag = modelPreferences.getDefaultInt(XMLCorePreferenceNames.ATTRIBUTE_HAS_NO_VALUE);
+	    
+	    if (fEmptyElementTag != null) {
+	    	fEmptyElementTag.setSelection(new Point(emptyElementTag,2 - emptyElementTag));
+	    	fEmptyElementTag.setText(MARKUP_SEVERITIES[2 - emptyElementTag]);
+		}
+	    
+	    int endTagWithAttributes  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.END_TAG_WITH_ATTRIBUTES);
+	    
+	    if (fEndTagWithAttributes != null) {
+	    	fEndTagWithAttributes.setSelection(new Point(endTagWithAttributes,2 - endTagWithAttributes));
+	    	fEndTagWithAttributes.setText(MARKUP_SEVERITIES[2 - endTagWithAttributes]);
+		}
+	    
+	    int invalidWhitespaceBeforeTagname  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.WHITESPACE_BEFORE_TAGNAME);
+	    
+	    if (fInvalidWhitespaceBeforeTagname != null) {
+	    	fInvalidWhitespaceBeforeTagname.setSelection(new Point(invalidWhitespaceBeforeTagname,2 - invalidWhitespaceBeforeTagname));
+	    	fInvalidWhitespaceBeforeTagname.setText(MARKUP_SEVERITIES[2 - invalidWhitespaceBeforeTagname]);
+		}
+	    
+	    int missingClosingBracket  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.MISSING_CLOSING_BRACKET);
+	    
+	    if (fMissingClosingBracket != null) {
+	    	fMissingClosingBracket.setSelection(new Point(missingClosingBracket,2 - missingClosingBracket));
+	    	fMissingClosingBracket.setText(MARKUP_SEVERITIES[2 - missingClosingBracket]);
+		}
+	    
+	    int missingClosingQuote  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.MISSING_CLOSING_QUOTE);
+	    
+	    if (fMissingClosingQuote != null) {
+	    	fMissingClosingQuote.setSelection(new Point(missingClosingQuote,2 - missingClosingQuote));
+	    	fMissingClosingQuote.setText(MARKUP_SEVERITIES[2 - missingClosingQuote]);
+		}
+	    
+	    int missingEndTag  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.MISSING_END_TAG);
+	    
+	    if (fMissingEndTag != null) {
+	    	fMissingEndTag.setSelection(new Point(missingEndTag,2 - missingEndTag));
+	    	fMissingEndTag.setText(MARKUP_SEVERITIES[2 - missingEndTag]);
+		}
+	    
+	    int missingStartTag  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.MISSING_START_TAG);
+	    
+	    if (fMissingStartTag != null) {
+	    	fMissingStartTag.setSelection(new Point(missingStartTag,2 - missingStartTag));
+	    	fMissingStartTag.setText(MARKUP_SEVERITIES[2 - missingStartTag]);
+		}
+	    
+	    int missingQuotes  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.MISSING_QUOTES);
+	    
+	    if (fMissingQuotes != null) {
+	    	fMissingQuotes.setSelection(new Point(missingQuotes,2 - missingQuotes));
+	    	fMissingQuotes.setText(MARKUP_SEVERITIES[2 - missingQuotes]);
+		}
+	    
+	    int invalidNamespaceInPI  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.NAMESPACE_IN_PI_TARGET);
+	    
+	    if (fInvalidNamespaceInPI != null) {
+	    	fInvalidNamespaceInPI.setSelection(new Point(invalidNamespaceInPI,2 - invalidNamespaceInPI));
+	    	fInvalidNamespaceInPI.setText(MARKUP_SEVERITIES[2 - invalidNamespaceInPI]);
+		}
+	    
+	    int tagNameMissing  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.MISSING_TAG_NAME);
+	    
+	    if (fMissingTagName != null) {
+	    	fMissingTagName.setSelection(new Point(tagNameMissing,2 - tagNameMissing));
+	    	fMissingTagName.setText(MARKUP_SEVERITIES[2 - tagNameMissing]);
+		}
+	    
+	    int invalidWhitespaceAtStart  = modelPreferences.getDefaultInt(XMLCorePreferenceNames.WHITESPACE_AT_START);
+	    
+	    if (fInvalidWhitespaceAtStart != null) {
+	    	fInvalidWhitespaceAtStart.setSelection(new Point(invalidWhitespaceAtStart,2 - invalidWhitespaceAtStart));
+	    	fInvalidWhitespaceAtStart.setText(MARKUP_SEVERITIES[2 - invalidWhitespaceAtStart]);
+		}
+	  }
+
+  protected void storeValuesForValidatingGroup()
+  {
+    Preferences modelPreferences = getModelPreferences();
+    if (fIndicateNoGrammar != null) {
+      int warnNoGrammarButtonSelected = 2 - fIndicateNoGrammar.getSelectionIndex();
+      modelPreferences.setValue(XMLCorePreferenceNames.INDICATE_NO_GRAMMAR, warnNoGrammarButtonSelected);
+    }
+    if (fUseXinclude != null) {
+      boolean useXIncludeButtonSelected = fUseXinclude.getSelection();
+      modelPreferences.setValue(XMLCorePreferenceNames.USE_XINCLUDE, useXIncludeButtonSelected);
+    }
+    if (fHonourAllSchemaLocations != null) {
+      boolean honourAllButtonSelected = fHonourAllSchemaLocations.getSelection();
+      modelPreferences.setValue(XMLCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS, honourAllButtonSelected);
+    }
+  }
+  protected void storeValuesForMarkupValidationGroup()
+  {
+    Preferences modelPreferences = getModelPreferences();
+    if (fExtendedMarkupValidation != null) {
+        boolean extendedMarkupValidation = fExtendedMarkupValidation.getSelection();
+        modelPreferences.setValue(XMLCorePreferenceNames.MARKUP_VALIDATION, extendedMarkupValidation);
+    }
+    if (fEmptyElementTag != null) {
+      int emptyElementTag = 2 - fEmptyElementTag.getSelectionIndex();
+      modelPreferences.setValue(XMLCorePreferenceNames.ATTRIBUTE_HAS_NO_VALUE, emptyElementTag);
+    }
+    if (fEndTagWithAttributes != null) {
+        int endTagWithAttributes = 2 - fEndTagWithAttributes.getSelectionIndex();
+        modelPreferences.setValue(XMLCorePreferenceNames.END_TAG_WITH_ATTRIBUTES, endTagWithAttributes);
+    }
+    if (fInvalidWhitespaceBeforeTagname != null) {
+        int invalidWhitespaceBeforeTagname = 2 - fInvalidWhitespaceBeforeTagname.getSelectionIndex();
+        modelPreferences.setValue(XMLCorePreferenceNames.WHITESPACE_BEFORE_TAGNAME, invalidWhitespaceBeforeTagname);
+    }
+    if (fMissingClosingBracket != null) {
+          int missingClosingBracket = 2 - fMissingClosingBracket.getSelectionIndex();
+          modelPreferences.setValue(XMLCorePreferenceNames.MISSING_CLOSING_BRACKET, missingClosingBracket);
+    }
+    if (fMissingClosingQuote != null) {
+        int missingClosingQuote = 2 - fMissingClosingQuote.getSelectionIndex();
+        modelPreferences.setValue(XMLCorePreferenceNames.MISSING_CLOSING_BRACKET, missingClosingQuote);
+    }
+    if (fMissingEndTag != null) {
+        int missingEndTag = 2 - fMissingEndTag.getSelectionIndex();
+        modelPreferences.setValue(XMLCorePreferenceNames.MISSING_END_TAG, missingEndTag);
+        modelPreferences.getInt(XMLCorePreferenceNames.MISSING_END_TAG);
+    }
+	if (fMissingStartTag != null) {
+        int missingStartTag = 2 - fMissingStartTag.getSelectionIndex();
+	    modelPreferences.setValue(XMLCorePreferenceNames.MISSING_START_TAG, missingStartTag);
+	}
+	if (fMissingQuotes != null) {
+        int missingQuotes = 2 - fMissingQuotes.getSelectionIndex();
+	    modelPreferences.setValue(XMLCorePreferenceNames.MISSING_QUOTES, missingQuotes);
+	}
+	if (fInvalidNamespaceInPI != null) {
+        int invalidNamespaceInPI = 2 - fInvalidNamespaceInPI.getSelectionIndex();
+	    modelPreferences.setValue(XMLCorePreferenceNames.NAMESPACE_IN_PI_TARGET, invalidNamespaceInPI);
+	}
+	if (fMissingTagName != null) {
+        int missingTagName = 2 - fMissingTagName.getSelectionIndex();
+	    modelPreferences.setValue(XMLCorePreferenceNames.MISSING_TAG_NAME, missingTagName);
+	}
+	if (fInvalidWhitespaceAtStart != null) {
+        int invalidWhitespaceAtStart = 2 - fInvalidWhitespaceAtStart.getSelectionIndex();
+	    modelPreferences.setValue(XMLCorePreferenceNames.WHITESPACE_AT_START, invalidWhitespaceAtStart);
+	}
+    
+    
+  }
+  
+  protected void storeValues() {
+    storeValuesForValidatingGroup();
+    storeValuesForMarkupValidationGroup();
+  }
+
+  protected void performDefaults() {
+    performDefaultsForValidatingGroup();
+    performDefaultsForMarkupValidationGroup();
+    super.performDefaults();
+  }
+  
+  protected Preferences getModelPreferences() {
+    return XMLCorePlugin.getDefault().getPluginPreferences();
+  }  
+  
+  protected void doSavePreferenceStore() {
+      XMLCorePlugin.getDefault().savePluginPreferences(); // model
+  }
+
+  public boolean performOk() {
+    boolean result = super.performOk();
+
+    doSavePreferenceStore();
+
+    return result;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLCommentFoldingPosition.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLCommentFoldingPosition.java
new file mode 100644
index 0000000..d9740e9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLCommentFoldingPosition.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.projection;
+
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredCommentFoldingPosition;
+
+/**
+ *
+ */
+public class XMLCommentFoldingPosition extends AbstractStructuredCommentFoldingPosition {
+
+	/**
+	 * The region covering an XML comment
+	 */
+	private IStructuredDocumentRegion fRegion;
+	
+	/**
+	 * Create a folding position to cover a XML comment region
+	 * 
+	 * @param region
+	 */
+	public XMLCommentFoldingPosition(IStructuredDocumentRegion region) {
+		//can't use region.getLength here because doesn't work in DTD docs for some reason
+		super(region.getStartOffset(), region.getEndOffset() - region.getStartOffset());
+		this.fRegion = region;
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredCommentFoldingPosition#getEndOffset()
+	 */
+	protected int getEndOffset() {
+		return fRegion.getEndOffset();
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredCommentFoldingPosition#getStartOffset()
+	 */
+	protected int getStartOffset() {
+		return fRegion.getStartOffset();
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLElementFoldingPosition.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLElementFoldingPosition.java
new file mode 100644
index 0000000..233e301
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLElementFoldingPosition.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.projection;
+
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingPosition;
+
+/**
+ * Folds an XML element
+ */
+public class XMLElementFoldingPosition extends AbstractStructuredFoldingPosition {
+
+	/**
+	 * The region representing the start of the folding region
+	 */
+	private IStructuredDocumentRegion fStartRegion;
+	
+	/**
+	 * The region representing the end of the folding region, or <code>null</code>
+	 * if the entire folding region is represented by <code>fStartRegion</code>
+	 */
+	private IStructuredDocumentRegion fEndRegion;
+	
+	/**
+	 * <p>Used to represent a folding position that covers a single
+	 * {@link IStructuredDocumentRegion}.</p>
+	 * 
+	 * @param region the region that covers the entire position of the folding region
+	 */
+	public XMLElementFoldingPosition(IStructuredDocumentRegion region) {
+		super(region.getStartOffset(), region.getEndOffset()-region.getStartOffset());
+		this.fStartRegion = region;
+		this.fEndRegion = null;
+	}
+	
+	/**
+	 * <p>Used to represent a folding position that covers more then one
+	 * {@link IStructuredDocumentRegion}.</p>
+	 * 
+	 * @param startRegion the first region covered by this position
+	 * @param endRegion the last region covered by this position
+	 */
+	public XMLElementFoldingPosition(IStructuredDocumentRegion startRegion, IStructuredDocumentRegion endRegion) {
+		super(startRegion.getStartOffset(), endRegion.getEndOffset()-startRegion.getStartOffset());
+		this.fStartRegion = startRegion;
+		this.fEndRegion = endRegion;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingPosition#getStartOffset()
+	 */
+	protected int getStartOffset() {
+		return fStartRegion.getStartOffset();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingPosition#getEndOffset()
+	 */
+	protected int getEndOffset() {
+		int endOffset;
+		if(fEndRegion != null) {
+			endOffset = fEndRegion.getEndOffset();
+		} else {
+			endOffset = fStartRegion.getEndOffset();
+		}
+		return endOffset;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLFoldingStrategy.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLFoldingStrategy.java
new file mode 100644
index 0000000..227f9d8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/projection/XMLFoldingStrategy.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.projection;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.internal.projection.AbstractStructuredFoldingStrategy;
+import org.eclipse.wst.xml.core.internal.document.CommentImpl;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
+
+
+/**
+ * A folding strategy for XML type structured documents.
+ * See AbstractStructuredFoldingStrategy for more details.
+ */
+public class XMLFoldingStrategy extends AbstractStructuredFoldingStrategy {
+
+	/**
+	 * Create an instance of the folding strategy.
+	 * Be sure to set the viewer and document after creation.
+	 */
+	public XMLFoldingStrategy() {
+		super();
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.projection.AbstractFoldingStrategy#calcNewFoldPosition(org.eclipse.wst.sse.core.internal.provisional.IndexedRegion)
+	 */
+	protected Position calcNewFoldPosition(IndexedRegion indexedRegion) {
+		Position retPos = null;
+		
+		//only want to fold regions of the valid type and with a valid range
+		if(indexedRegion.getStartOffset() >= 0 && indexedRegion.getLength() >= 0) {
+			IDOMNode node = (IDOMNode)indexedRegion;
+			IStructuredDocumentRegion startRegion = node.getStartStructuredDocumentRegion();
+			IStructuredDocumentRegion endRegion = node.getEndStructuredDocumentRegion();
+			
+			//if the node has an endRegion (end tag) then folding region is
+			//	between the start and end tag
+			//else if the region is a comment
+			//else if the region is only an open tag or an open/close tag then don't fold it
+			if(startRegion != null && endRegion != null) {
+				retPos = new XMLElementFoldingPosition(startRegion, endRegion);
+			} else if(startRegion != null && indexedRegion instanceof CommentImpl) {
+				retPos = new XMLCommentFoldingPosition(startRegion);
+			}
+		}
+		
+		return retPos;
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.projection.AbstractFoldingStrategy#indexedRegionValidType(org.eclipse.wst.sse.core.internal.provisional.IndexedRegion)
+	 */
+	protected boolean indexedRegionValidType(IndexedRegion indexedRegion) {
+		return (indexedRegion instanceof IDOMNode) && !(indexedRegion instanceof IDOMText);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/EnumeratedStringPropertyDescriptor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/EnumeratedStringPropertyDescriptor.java
new file mode 100644
index 0000000..a4bd9f6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/EnumeratedStringPropertyDescriptor.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.properties;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * This class should be used for properties which require a combo box cell
+ * editor and whose values consist of a list of enumerated strings.
+ */
+public class EnumeratedStringPropertyDescriptor extends PropertyDescriptor {
+	protected StringComboBoxCellEditor fEditor;
+	protected Composite fParent;
+
+	/**
+	 * The enumerated possible values for the described property
+	 */
+	protected String fValues[] = null;
+
+	public EnumeratedStringPropertyDescriptor(Object id, String newDisplayName, String[] valuesArray) {
+		super(id, newDisplayName);
+		setDescription((String) id);
+		fValues = valuesArray;
+	}
+
+	/**
+	 * Creates and returns a new cell editor for editing this property.
+	 * Returns <code>null</code> if the property is not editable.
+	 * 
+	 * @param parent
+	 *            the parent widget for the cell editor
+	 * @return the cell editor for this property, or <code>null</code> if
+	 *         this property cannot be edited
+	 */
+	public CellEditor createPropertyEditor(Composite parent) {
+		// Check to see if we already have a Cell Editor with a valid Control
+		// under the given parent.
+		// If any of that's not true, create and return a new Cell Editor
+		if ((fEditor == null) || (fEditor.getControl() == null) || fEditor.getControl().isDisposed() || (parent != fParent)) {
+			fEditor = new StringComboBoxCellEditor(parent, fValues);
+		}
+		fParent = parent;
+		return fEditor;
+	}
+
+	public void updateValues(String newValues[]) {
+		if (Arrays.equals(fValues, newValues)) {
+			return;
+		}
+		fValues = newValues;
+		if (fEditor != null) {
+			fEditor.setItems(newValues);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/StringComboBoxCellEditor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/StringComboBoxCellEditor.java
new file mode 100644
index 0000000..a6536be
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/StringComboBoxCellEditor.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.properties;
+
+
+
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.sse.ui.internal.Logger;
+
+
+/**
+ * An extended ComboBoxCellEditor that selects and returns Strings
+ */
+
+public class StringComboBoxCellEditor extends ComboBoxCellEditor {
+	private boolean fSettingValue = false;
+
+	/**
+	 * 
+	 */
+	public StringComboBoxCellEditor() {
+		super();
+	}
+
+	/**
+	 * @param parent
+	 * @param items
+	 */
+	public StringComboBoxCellEditor(Composite parent, String[] items) {
+		super(parent, items);
+	}
+
+	/**
+	 * @param parent
+	 * @param items
+	 * @param style
+	 */
+	public StringComboBoxCellEditor(Composite parent, String[] items, int style) {
+		super(parent, items, style);
+	}
+
+	protected Object doGetValue() {
+		// otherwise limits to set of valid values
+		Object index = super.doGetValue();
+		int selection = -1;
+		if (index instanceof Integer) {
+			selection = ((Integer) index).intValue();
+		}
+		if (selection >= 0) {
+			return getItems()[selection];
+		}
+		else if (getControl() instanceof CCombo) {
+			// retrieve the actual text as the list of valid items doesn't
+			// contain the value
+			return ((CCombo) getControl()).getText();
+		}
+		return null;
+	}
+
+	protected void doSetValue(Object value) {
+		if (fSettingValue) {
+			return;
+		}
+		fSettingValue = true;
+		if (value instanceof Integer) {
+			super.doSetValue(value);
+		}
+		else {
+			String stringValue = value.toString();
+			int selection = -1;
+			for (int i = 0; i < getItems().length; i++) {
+				if (getItems()[i].equals(stringValue)) {
+					selection = i;
+				}
+			}
+			if (selection >= 0) {
+				super.doSetValue(new Integer(selection));
+			}
+			else {
+				super.doSetValue(new Integer(-1));
+				if ((getControl() instanceof CCombo) && !stringValue.equals(((CCombo) getControl()).getText())) {
+					// update the Text widget
+					((CCombo) getControl()).setText(stringValue);
+				}
+			}
+		}
+		fSettingValue = false;
+	}
+
+	public void setItems(String[] newItems) {
+		if ((getControl() == null) || getControl().isDisposed()) {
+			Logger.log(Logger.ERROR, "Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
+			return;
+		}
+
+		// keep selection if possible
+		Object previousSelectedValue = getValue();
+		super.setItems(newItems);
+		if ((previousSelectedValue != null) && (getControl() instanceof CCombo)) {
+			for (int i = 0; i < newItems.length; i++) {
+				if (newItems[i].equals(previousSelectedValue)) {
+					setValue(previousSelectedValue);
+				}
+			}
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/XMLPropertySource.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/XMLPropertySource.java
new file mode 100644
index 0000000..d9c2ed4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/properties/XMLPropertySource.java
@@ -0,0 +1,833 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Stack;
+
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySheetEntry;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.IPropertySource2;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.ui.views.properties.IPropertySourceExtension;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Attr;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * An IPropertySource implementation for a JFace viewer used to display
+ * properties of DOM nodes.
+ */
+public class XMLPropertySource implements IPropertySource, IPropertySourceExtension, IPropertySource2 {
+	protected final static String CATEGORY_ATTRIBUTES = XMLUIMessages.XMLPropertySourceAdapter_0;
+
+	/**
+	 * Controls whether optional attributes are marked as for "experts"
+	 */
+	private static final boolean fSetExpertFilter = false;
+
+	/**
+	 * Controls whether to derive categories from CMDataTypes; disabled by
+	 * default until display strings can be planned
+	 */
+	private boolean fShouldDeriveCategories = false;
+
+	private final static boolean fSortEnumeratedValues = true;
+
+	/**
+	 * Note: we want the default fCaseSensitive to be true, but, to avoid
+	 * meaningless double initialization, we leave default here, and set in
+	 * constructor only.
+	 */
+	private boolean fCaseSensitive;
+	private IPropertyDescriptor[] fDescriptors = null;
+	private Node fNode = null;
+
+	private Stack fValuesBeingSet = new Stack();
+
+	public XMLPropertySource(INodeNotifier target) {
+		super();
+		fNode = initNode(target);
+		fCaseSensitive = initCaseSensitive(fNode);
+	}
+
+	public XMLPropertySource(Node target, boolean useCategories) {
+		super();
+		initNode(target);
+		fNode = target;
+		fCaseSensitive = initCaseSensitive(fNode);
+		fShouldDeriveCategories = useCategories;
+	}
+
+	/** Separate method just to isolate error processing */
+	private static INodeNotifier initNode(Node target) {
+		if (target instanceof INodeNotifier) {
+			return (INodeNotifier) target;
+		}
+		throw new IllegalArgumentException("XMLPropertySource is only for INodeNotifiers"); //$NON-NLS-1$
+	}
+
+	/** Separate method just to isolate error processing */
+	private static Node initNode(INodeNotifier target) {
+		if (target instanceof Node) {
+			return (Node) target;
+		}
+		throw new IllegalArgumentException("XMLPropertySource is only for W3C DOM Nodes"); //$NON-NLS-1$
+	}
+
+	private boolean initCaseSensitive(Node node) {
+		// almost all tags are case sensitive, except that old HTML
+		boolean caseSensitive = true;
+		if (node instanceof IDOMNode) {
+			DocumentTypeAdapter adapter = getDocTypeFromDOMNode(node);
+			if (adapter != null) {
+				caseSensitive = (adapter.getTagNameCase() == DocumentTypeAdapter.STRICT_CASE);
+			}
+		}
+		return caseSensitive;
+	}
+
+	/**
+	 * by "internal spec" the DOCTYPE adapter is only available from Document
+	 * Node
+	 * 
+	 * @return {@link DocumentTypeAdapter}
+	 */
+	private DocumentTypeAdapter getDocTypeFromDOMNode(Node node) {
+		DocumentTypeAdapter adapter = null;
+		Document ownerDocument = node.getOwnerDocument();
+		if (ownerDocument == null) {
+			// if ownerDocument is null, then fNode must be the Document Node
+			// [old, old comment]
+			// hmmmm, guess not. See
+			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=130233
+			// guess this is used for many INodeNotifiers, not just XML.
+			// (and DTD's use IDOMNode? ... that doesn't sound quite right
+			// ... but, maybe a separate issue).
+			if (node instanceof Document) {
+				ownerDocument = (Document) node;
+			}
+		}
+		if (ownerDocument != null) {
+			adapter = (DocumentTypeAdapter) ((INodeNotifier) ownerDocument).getAdapterFor(DocumentTypeAdapter.class);
+		}
+
+		return adapter;
+	}
+
+	private String[] _getValidFixedStrings(CMAttributeDeclaration attrDecl, CMDataType helper) {
+		String attributeName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+		List values = new ArrayList(1);
+		String impliedValue = helper.getImpliedValue();
+		if (impliedValue != null) {
+			values.add(impliedValue);
+		}
+		boolean checkIfCurrentValueIsIncluded = ((fNode.getAttributes() != null) && (fNode.getAttributes().getNamedItem(attributeName) != null) && (fNode.getAttributes().getNamedItem(attributeName).getNodeValue() != null));
+		if (checkIfCurrentValueIsIncluded) {
+			String currentValue = null;
+			currentValue = fNode.getAttributes().getNamedItem(attributeName).getNodeValue();
+			if (!currentValue.equals(impliedValue)) {
+				values.add(currentValue);
+			}
+		}
+		String[] validStrings = new String[values.size()];
+		validStrings = (String[]) values.toArray(validStrings);
+		return validStrings;
+	}
+
+	private String[] _getValidStrings(CMAttributeDeclaration attrDecl, CMDataType valuesHelper) {
+		String attributeName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+		List values = new ArrayList(1);
+		boolean currentValueKnown = false;
+		boolean checkIfCurrentValueIsKnown = ((fNode.getAttributes() != null) && (fNode.getAttributes().getNamedItem(attributeName) != null) && (fNode.getAttributes().getNamedItem(attributeName).getNodeValue() != null));
+		String currentValue = null;
+		if (checkIfCurrentValueIsKnown) {
+			currentValue = fNode.getAttributes().getNamedItem(attributeName).getNodeValue();
+		}
+
+		if ((valuesHelper.getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED) && (valuesHelper.getImpliedValue() != null)) {
+			// FIXED value
+			currentValueKnown = (currentValue != null) && valuesHelper.getImpliedValue().equals(currentValue);
+			values.add(valuesHelper.getImpliedValue());
+		}
+		else {
+			// ENUMERATED values
+			String[] valueStrings = null;
+			// valueStrings = valuesHelper.getEnumeratedValues();
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fNode.getOwnerDocument());
+			if ((modelQuery != null) && (fNode.getNodeType() == Node.ELEMENT_NODE)) {
+				valueStrings = modelQuery.getPossibleDataTypeValues((Element) fNode, attrDecl);
+			}
+			else {
+				valueStrings = attrDecl.getAttrType().getEnumeratedValues();
+			}
+			if (valueStrings != null) {
+				for (int i = 0; i < valueStrings.length; i++) {
+					if (checkIfCurrentValueIsKnown && valueStrings[i].equals(currentValue)) {
+						currentValueKnown = true;
+					}
+					values.add(valueStrings[i]);
+				}
+			}
+		}
+		if ((valuesHelper.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_NONE) && (valuesHelper.getImpliedValue() != null)) {
+			if (!values.contains(valuesHelper.getImpliedValue())) {
+				values.add(valuesHelper.getImpliedValue());
+			}
+		}
+
+		if (checkIfCurrentValueIsKnown && !currentValueKnown && (currentValue != null) && (currentValue.length() > 0)) {
+			values.add(currentValue);
+		}
+		String[] validStrings = new String[values.size()];
+		validStrings = (String[]) values.toArray(validStrings);
+		return validStrings;
+	}
+
+	private IPropertyDescriptor createDefaultPropertyDescriptor(String attributeName) {
+		return createDefaultPropertyDescriptor(attributeName, false);
+	}
+
+	private IPropertyDescriptor createDefaultPropertyDescriptor(String attributeName, boolean hideOnFilter) {
+		// The descriptor class used here is also used in
+		// updatePropertyDescriptors()
+		TextPropertyDescriptor descriptor = new TextPropertyDescriptor(attributeName, attributeName);
+		descriptor.setCategory(getCategory(null, null));
+		descriptor.setDescription(attributeName);
+		if (hideOnFilter && fSetExpertFilter) {
+			descriptor.setFilterFlags(new String[]{IPropertySheetEntry.FILTER_ID_EXPERT});
+		}
+		return descriptor;
+	}
+
+	/**
+	 * Creates a property descriptor for an attribute with ENUMERATED values -
+	 * if the value does not exist, an editable combo box is returned - if the
+	 * value exists but is not one in the enumerated list of value, a combo
+	 * box featuring the current and correct values is returned - if the value
+	 * exists and it is a valid value, a combo box featuring the correct
+	 * values with the current one visible is returned
+	 */
+	private IPropertyDescriptor createEnumeratedPropertyDescriptor(CMAttributeDeclaration attrDecl, CMDataType valuesHelper, Attr attr) {
+		// the displayName MUST be set
+		String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+		EnumeratedStringPropertyDescriptor descriptor = new EnumeratedStringPropertyDescriptor(attrName, attrName, _getValidStrings(attrDecl, valuesHelper));
+		descriptor.setCategory(getCategory(attrDecl, attr));
+		descriptor.setDescription(attrName);
+		if ((attrDecl.getUsage() != CMAttributeDeclaration.REQUIRED) && fSetExpertFilter) {
+			descriptor.setFilterFlags(new String[]{IPropertySheetEntry.FILTER_ID_EXPERT});
+		}
+		return descriptor;
+	}
+
+	/**
+	 * Creates a property descriptor for an attribute with a FIXED value - if
+	 * the value does not exist, an editable combo box is returned - if the
+	 * value exists but is not the fixed/default value, a combo box featuring
+	 * the current and correct value is returned - if the value exists and it
+	 * is the fixed/default value, no cell editor is provided "locking" the
+	 * value in
+	 */
+	private IPropertyDescriptor createFixedPropertyDescriptor(CMAttributeDeclaration attrDecl, CMDataType helper, Attr attr) {
+		// the displayName MUST be set
+		String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+		EnumeratedStringPropertyDescriptor descriptor = new EnumeratedStringPropertyDescriptor(attrName, attrName, _getValidFixedStrings(attrDecl, helper));
+		descriptor.setCategory(getCategory(attrDecl, attr));
+		descriptor.setDescription(DOMNamespaceHelper.computeName(attrDecl, fNode, null));
+		return descriptor;
+	}
+
+	protected IPropertyDescriptor createPropertyDescriptor(CMAttributeDeclaration attrDecl, Attr attr) {
+		IPropertyDescriptor descriptor = null;
+		CMDataType attrType = attrDecl.getAttrType();
+
+		if (attrType != null) {
+			// handle declarations that provide FIXED/ENUMERATED values
+			if ((attrType.getEnumeratedValues() != null) && (attrType.getEnumeratedValues().length > 0)) {
+				descriptor = createEnumeratedPropertyDescriptor(attrDecl, attrType, attr);
+			}
+			else if (((attrDecl.getUsage() == CMAttributeDeclaration.FIXED) || (attrType.getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED)) && (attrType.getImpliedValue() != null)) {
+				descriptor = createFixedPropertyDescriptor(attrDecl, attrType, attr);
+			}
+			else {
+				// plain text
+				descriptor = createTextPropertyDescriptor(attrDecl, attr);
+			}
+		}
+		else {
+			// no extra information given
+			descriptor = createTextPropertyDescriptor(attrDecl, attr);
+		}
+		return descriptor;
+	}
+
+	/**
+	 * Returns the current collection of property descriptors.
+	 * 
+	 * @return all valid descriptors.
+	 */
+	private IPropertyDescriptor[] createPropertyDescriptors() {
+		CMNamedNodeMap attrMap = null;
+		CMElementDeclaration ed = getDeclaration();
+		if (ed != null) {
+			attrMap = ed.getAttributes();
+			CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attrMap);
+			List nodes = ModelQueryUtil.getModelQuery(fNode.getOwnerDocument()).getAvailableContent((Element) fNode, ed, ModelQuery.INCLUDE_ATTRIBUTES);
+			for (int k = 0; k < nodes.size(); k++) {
+				CMNode cmnode = (CMNode) nodes.get(k);
+				if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+					allAttributes.put(cmnode);
+				}
+			}
+			attrMap = allAttributes;
+		}
+
+		List descriptorList = new ArrayList();
+		List names = new ArrayList();
+		IPropertyDescriptor descriptor;
+
+		CMAttributeDeclaration attrDecl = null;
+
+		// add descriptors for existing attributes
+		NamedNodeMap attributes = fNode.getAttributes();
+		if (attributes != null) {
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Attr attr = (Attr) attributes.item(i);
+				// if metainfo is present for this attribute, use the
+				// CMAttributeDeclaration to derive a descriptor
+				if (attrMap != null) {
+					String attrName = attr.getName();
+					if (fCaseSensitive) {
+						attrDecl = (CMAttributeDeclaration) attrMap.getNamedItem(attrName);
+					}
+					else {
+						attrDecl = null;
+						for (int j = 0; j < attrMap.getLength(); j++) {
+							if (!fCaseSensitive && attrMap.item(j).getNodeName().equalsIgnoreCase(attrName)) {
+								attrDecl = (CMAttributeDeclaration) attrMap.item(j);
+								break;
+							}
+						}
+					}
+				}
+				// be consistent: if there's metainfo, use *that* as the
+				// descriptor ID
+				descriptor = null;
+				if (attrDecl != null) {
+					String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+					if (!names.contains(attrName)) {
+						descriptor = createPropertyDescriptor(attrDecl, attr);
+						if (descriptor != null)
+							names.add(attrName);
+					}
+				}
+				else {
+					if (!names.contains(attr.getName())) {
+						descriptor = createDefaultPropertyDescriptor(attr.getName());
+						if (descriptor != null)
+							names.add(attr.getName());
+					}
+				}
+				if (descriptor != null) {
+					descriptorList.add(descriptor);
+				}
+			}
+		}
+
+		// add descriptors from the metainfo that are not yet listed
+		if (attrMap != null) {
+			for (int i = 0; i < attrMap.getLength(); i++) {
+				attrDecl = (CMAttributeDeclaration) attrMap.item(i);
+				String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+				if (!names.contains(attrName)) {
+					IPropertyDescriptor holdDescriptor = createPropertyDescriptor(attrDecl, null);
+					if (holdDescriptor != null) {
+						names.add(attrName);
+						descriptorList.add(holdDescriptor);
+					}
+				}
+			}
+		}
+
+		// add MQE-based descriptors
+		if (ed != null && fNode.getNodeType() == Node.ELEMENT_NODE) {
+			List nodes = ModelQueryUtil.getModelQuery(fNode.getOwnerDocument()).getAvailableContent((Element) fNode, ed, ModelQuery.INCLUDE_ATTRIBUTES);
+			for (int i = 0; i < nodes.size(); i++) {
+				CMNode node = (CMNode) nodes.get(i);
+				if (node.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+					attrDecl = (CMAttributeDeclaration) node;
+					String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+					if (!names.contains(attrName)) {
+						IPropertyDescriptor holdDescriptor = createPropertyDescriptor(attrDecl, null);
+						if (holdDescriptor != null) {
+							names.add(attrName);
+							descriptorList.add(holdDescriptor);
+						}
+					}
+				}
+			}
+		}
+
+
+		IPropertyDescriptor[] descriptors = new IPropertyDescriptor[descriptorList.size()];
+		for (int i = 0; i < descriptors.length; i++) {
+			descriptors[i] = (IPropertyDescriptor) descriptorList.get(i);
+		}
+		return descriptors;
+	}
+
+	private IPropertyDescriptor createTextPropertyDescriptor(CMAttributeDeclaration attrDecl, Attr attr) {
+		String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+		TextPropertyDescriptor descriptor = new TextPropertyDescriptor(attrName, attrName);
+		descriptor.setCategory(getCategory(attrDecl, attr));
+		descriptor.setDescription(attrName);
+		if ((attrDecl.getUsage() != CMAttributeDeclaration.REQUIRED) && fSetExpertFilter) {
+			descriptor.setFilterFlags(new String[]{IPropertySheetEntry.FILTER_ID_EXPERT});
+		}
+		return descriptor;
+	}
+
+	private String getCategory(CMAttributeDeclaration attrDecl, Attr attr) {
+		if (attr != null) {
+			String namespaceURI = attr.getNamespaceURI();
+			if (namespaceURI == null)
+				namespaceURI = attr.getOwnerElement().getNamespaceURI();
+			if (namespaceURI != null)
+				return namespaceURI;
+		}
+		if (attrDecl != null) {
+			if (attrDecl.supports("category")) { //$NON-NLS-1$
+				return (String) attrDecl.getProperty("category"); //$NON-NLS-1$
+			}
+			if (fShouldDeriveCategories && (attrDecl.getAttrType() != null) && (attrDecl.getAttrType().getDataTypeName() != null) && (attrDecl.getAttrType().getDataTypeName().length() > 0)) {
+				return attrDecl.getAttrType().getDataTypeName();
+			}
+		}
+		return CATEGORY_ATTRIBUTES;
+	}
+
+	private CMElementDeclaration getDeclaration() {
+		if ((fNode == null) || (fNode.getNodeType() != Node.ELEMENT_NODE)) {
+			return null;
+		}
+		ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fNode.getOwnerDocument());
+		if (modelQuery != null) {
+			return modelQuery.getCMElementDeclaration((Element) fNode);
+		}
+		return null;
+	}
+
+	private Display getDisplay() {
+
+		return PlatformUI.getWorkbench().getDisplay();
+	}
+
+	/**
+	 * Returns a value for this Node that can be editted in a property sheet.
+	 * 
+	 * @return a value that can be editted
+	 */
+	public Object getEditableValue() {
+		return null;
+	}
+
+	/**
+	 * Returns the current collection of property descriptors.
+	 * 
+	 * @return all valid descriptors.
+	 */
+	public final IPropertyDescriptor[] getPropertyDescriptors() {
+		if ((fDescriptors == null) || (fDescriptors.length == 0)) {
+			fDescriptors = createPropertyDescriptors();
+		}
+		else {
+			updatePropertyDescriptors();
+		}
+		return fDescriptors;
+	}
+
+	/**
+	 * Returns the current value for the named property.
+	 * 
+	 */
+	public Object getPropertyValue(Object nameObject) {
+		String name = nameObject.toString();
+		String returnedValue = null;
+		NamedNodeMap attrMap = fNode.getAttributes();
+		if (attrMap != null) {
+			Node attribute = attrMap.getNamedItem(name);
+			if (attribute != null) {
+				if (attribute instanceof IDOMNode) {
+					returnedValue = ((IDOMNode) attribute).getValueSource();
+				}
+				else {
+					returnedValue = attribute.getNodeValue();
+				}
+			}
+		}
+		if (returnedValue == null) {
+			returnedValue = ""; //$NON-NLS-1$
+		}
+		return returnedValue;
+	}
+
+	private String[] getValidValues(CMAttributeDeclaration attrDecl) {
+		if (attrDecl == null) {
+			return new String[0];
+		}
+
+		String[] validValues = null;
+		CMDataType attrType = attrDecl.getAttrType();
+		if (attrType != null) {
+			validValues = _getValidStrings(attrDecl, attrType);
+			if (fSortEnumeratedValues) {
+				Arrays.sort(validValues);
+			}
+		}
+		if (validValues == null) {
+			validValues = new String[0];
+		}
+		return validValues;
+	}
+
+	public boolean isPropertyRemovable(Object id) {
+		return true;
+	}
+
+	public boolean isPropertyResettable(Object id) {
+		return fNode != null && fNode.getNodeType() == Node.ELEMENT_NODE;
+	}
+
+	/**
+	 * Returns whether the property value has changed from the default.
+	 * 
+	 * @return <code>true</code> if the value of the specified property has
+	 *         changed from its original default value; <code>false</code>
+	 *         otherwise.
+	 */
+	public boolean isPropertySet(Object propertyObject) {
+		String property = propertyObject.toString();
+
+		NamedNodeMap attrMap = fNode.getAttributes();
+		if (attrMap != null) {
+			return attrMap.getNamedItem(property) != null;
+		}
+		return false;
+	}
+
+	/**
+	 * Remove the given attribute from the Node
+	 * 
+	 * @param propertyObject
+	 */
+	public void removeProperty(Object propertyObject) {
+		NamedNodeMap attrMap = fNode.getAttributes();
+		if (attrMap != null) {
+			Node attribute = attrMap.getNamedItem(propertyObject.toString());
+			if (attribute != null) {
+				try {
+					attrMap.removeNamedItem(propertyObject.toString());
+				}
+				catch (DOMException e) {
+					if (e.code != DOMException.INVALID_MODIFICATION_ERR) {
+						Logger.logException(e);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Resets the specified property's value to its default value.
+	 */
+	public void resetPropertyValue(Object propertyObject) {
+		String property = propertyObject.toString();
+		CMNamedNodeMap attrDecls = null;
+
+		CMElementDeclaration ed = getDeclaration();
+		if (ed != null) {
+			attrDecls = ed.getAttributes();
+			CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attrDecls);
+			List nodes = ModelQueryUtil.getModelQuery(fNode.getOwnerDocument()).getAvailableContent((Element) fNode, ed, ModelQuery.INCLUDE_ATTRIBUTES);
+			for (int k = 0; k < nodes.size(); k++) {
+				CMNode cmnode = (CMNode) nodes.get(k);
+				if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+					allAttributes.put(cmnode);
+				}
+			}
+			attrDecls = allAttributes;
+		}
+
+		NamedNodeMap attrMap = fNode.getAttributes();
+		if (attrDecls != null) {
+			CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) attrDecls.getNamedItem(property);
+			String defValue = null;
+			if (attrDecl != null) {
+				if (attrDecl.getAttrType() != null) {
+					CMDataType helper = attrDecl.getAttrType();
+					if ((helper.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_NONE) && (helper.getImpliedValue() != null)) {
+						defValue = helper.getImpliedValue();
+					}
+				}
+			}
+			if ((defValue != null) && (defValue.length() > 0)) {
+				((Attr) attrMap.getNamedItem(property)).setValue(defValue);
+			}
+			else {
+				// remember, this method is for reset, not remove
+				((Attr) attrMap.getNamedItem(property)).setValue(""); //$NON-NLS-1$
+			}
+		}
+		else {
+			// remember, this method is for reset, not remove
+			((Attr) attrMap.getNamedItem(property)).setValue(""); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Sets the named property to the given value.
+	 * 
+	 */
+	public void setPropertyValue(Object nameObject, Object value) {
+		// Avoid cycling - can happen if a closing cell editor causes a
+		// refresh
+		// on the PropertySheet page and the setInput again asks the editor to
+		// close; besides, why apply the same value twice?
+		if (!fValuesBeingSet.isEmpty() && (fValuesBeingSet.peek() == nameObject)) {
+			return;
+		}
+		fValuesBeingSet.push(nameObject);
+		String name = nameObject.toString();
+		String valueString = ""; //$NON-NLS-1$
+		if (value != null) {
+			valueString = value.toString();
+		}
+		NamedNodeMap attrMap = fNode.getAttributes();
+		try {
+			if (attrMap != null) {
+				Attr attr = (Attr) attrMap.getNamedItem(name);
+				if (attr != null) {
+					// EXISTING VALUE
+					// potential out of control loop if updating the value
+					// triggers a viewer update, forcing the
+					// active cell editor to save its value and causing the
+					// loop to continue
+					if ((attr.getValue() == null) || !attr.getValue().equals(valueString)) {
+						if (attr instanceof IDOMNode) {
+							((IDOMNode) attr).setValueSource(valueString);
+						}
+						else {
+							attr.setValue(valueString);
+						}
+					}
+				}
+				else {
+					// NEW(?) value
+					Attr newAttr = fNode.getOwnerDocument().createAttribute(name);
+					if (newAttr instanceof IDOMNode) {
+						((IDOMNode) newAttr).setValueSource(valueString);
+					}
+					else {
+						newAttr.setValue(valueString);
+					}
+					attrMap.setNamedItem(newAttr);
+				}
+			}
+			else {
+				if (fNode instanceof Element) {
+					((Element) fNode).setAttribute(name, valueString);
+				}
+			}
+		}
+		catch (DOMException e) {
+			Display d = getDisplay();
+			if (d != null) {
+				d.beep();
+			}
+		}
+		fValuesBeingSet.pop();
+	}
+
+	protected void updatePropertyDescriptors() {
+		if ((fDescriptors == null) || (fDescriptors.length == 0)) {
+			// Nothing to update
+			return;
+		}
+
+		// List of all names encountered in the tag and defined by the element
+		List declaredNames = new ArrayList();
+		// New descriptor list that will become fDescriptors after all
+		// processing is done
+		List descriptors = new ArrayList();
+		// Names of the descriptors in the above List
+		List descriptorNames = new ArrayList();
+
+		// Update any descriptors derived from the metainfo
+		CMElementDeclaration ed = getDeclaration();
+		CMNamedNodeMap attrMap = null;
+		if (ed != null) {
+			attrMap = ed.getAttributes();
+			CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attrMap);
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fNode.getOwnerDocument());
+			if(modelQuery != null) {
+			List nodes = modelQuery.getAvailableContent((Element) fNode, ed, ModelQuery.INCLUDE_ATTRIBUTES);
+				for (int k = 0; k < nodes.size(); k++) {
+					CMNode cmnode = (CMNode) nodes.get(k);
+					if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+						allAttributes.put(cmnode);
+					}
+				}
+			}
+			attrMap = allAttributes;
+		}
+		// Update exiting descriptors; not added to the final list here
+		if (attrMap != null) {
+			// Update existing descriptor types based on metainfo
+			CMAttributeDeclaration attrDecl = null;
+			for (int i = 0; i < attrMap.getLength(); i++) {
+				attrDecl = (CMAttributeDeclaration) attrMap.item(i);
+				String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+				if (!declaredNames.contains(attrName)) {
+					declaredNames.add(attrName);
+				}
+				for (int j = 0; j < fDescriptors.length; j++) {
+					boolean sameName = (fCaseSensitive && fDescriptors[j].getId().equals(attrDecl.getNodeName())) || (!fCaseSensitive && attrDecl.getNodeName().equals(fDescriptors[j].getId().toString()));
+					if (sameName) {
+						String[] validValues = getValidValues(attrDecl);
+						// Update the descriptor for this
+						// CMAttributeDeclaration (only enumerated values get
+						// updated for now)
+						if (fDescriptors[j] instanceof EnumeratedStringPropertyDescriptor) {
+							((EnumeratedStringPropertyDescriptor) fDescriptors[j]).updateValues(validValues);
+						}
+						// Replace with better descriptor
+						else if ((validValues != null) && (validValues.length > 0)) {
+							fDescriptors[j] = createPropertyDescriptor(attrDecl, null);
+						}
+					}
+				}
+			}
+		}
+		else {
+			// Update existing descriptors based on not having any metainfo
+			for (int j = 0; j < fDescriptors.length; j++) {
+				// Replace with basic descriptor
+				if (!(fDescriptors[j] instanceof TextPropertyDescriptor)) {
+					fDescriptors[j] = createDefaultPropertyDescriptor((String) fDescriptors[j].getId());
+				}
+			}
+		}
+
+		NamedNodeMap attributes = fNode.getAttributes();
+
+		// Remove descriptors for attributes that aren't present AND aren't
+		// known through metainfo,
+		// do this by only reusing existing descriptors for attributes that
+		// are present or declared
+		for (int i = 0; i < fDescriptors.length; i++) {
+			if (fDescriptors[i] != null) {
+				String descriptorName = fDescriptors[i].getId().toString();
+				if ((declaredNames.contains(descriptorName) || (attributes.getNamedItem(descriptorName) != null)) && !descriptorNames.contains(descriptorName)) {
+					descriptorNames.add(descriptorName);
+					descriptors.add(fDescriptors[i]);
+				}
+			}
+		}
+
+		// Add descriptors for declared attributes that don't already have one
+		if (attrMap != null) {
+			// Update existing descriptor types based on metainfo
+			CMAttributeDeclaration attrDecl = null;
+			for (int i = 0; i < attrMap.getLength(); i++) {
+				attrDecl = (CMAttributeDeclaration) attrMap.item(i);
+				String attrName = DOMNamespaceHelper.computeName(attrDecl, fNode, null);
+				if (fCaseSensitive) {
+					if (!descriptorNames.contains(attrName)) {
+						IPropertyDescriptor descriptor = createPropertyDescriptor(attrDecl, null);
+						if (descriptor != null) {
+							descriptorNames.add(attrName);
+							descriptors.add(descriptor);
+						}
+					}
+				}
+				else {
+					boolean exists = false;
+					for (int j = 0; j < descriptorNames.size(); j++) {
+						exists = (descriptorNames.get(j).toString().equalsIgnoreCase(attrName)) || exists;
+					}
+					if (!exists) {
+						descriptorNames.add(attrName);
+						IPropertyDescriptor descriptor = createPropertyDescriptor(attrDecl, null);
+						if (descriptor != null) {
+							descriptorNames.add(attrName);
+							descriptors.add(descriptor);
+						}
+					}
+				}
+			}
+		}
+
+		// Add descriptors for existing attributes that don't already have one
+		if (attributes != null) {
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Attr attr = (Attr) attributes.item(i);
+				String attrName = attr.getName();
+				if (fCaseSensitive) {
+					if (!descriptorNames.contains(attrName)) {
+						descriptorNames.add(attrName);
+						descriptors.add(createDefaultPropertyDescriptor(attrName));
+					}
+				}
+				else {
+					boolean exists = false;
+					for (int j = 0; j < descriptorNames.size(); j++) {
+						exists = (descriptorNames.get(j).toString().equalsIgnoreCase(attrName)) || exists;
+					}
+					if (!exists) {
+						descriptorNames.add(attrName);
+						descriptors.add(createDefaultPropertyDescriptor(attrName));
+					}
+				}
+			}
+		}
+
+		// Update fDescriptors
+		IPropertyDescriptor[] newDescriptors = new IPropertyDescriptor[descriptors.size()];
+		for (int i = 0; i < newDescriptors.length; i++) {
+			newDescriptors[i] = (IPropertyDescriptor) descriptors.get(i);
+		}
+		fDescriptors = newDescriptors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/IDOMSourceEditingTextTools.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/IDOMSourceEditingTextTools.java
new file mode 100644
index 0000000..a018b08
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/IDOMSourceEditingTextTools.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.provisional;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.NodeLocation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public interface IDOMSourceEditingTextTools extends ISourceEditingTextTools {
+	/**
+	 * Returns a W3C DOM document
+	 * 
+	 * @return Document object or <code>null</code> if corresponding
+	 *         document does not exist
+	 */
+	Document getDOMDocument();
+
+	/**
+	 * Returns the W3C DOM Node at the given offset
+	 * 
+	 * @param offset
+	 *            the offset within the IDocument
+	 * @return a Node at that location, if one is present
+	 * 
+	 * @throws BadLocationException
+	 *             for invalid offsets
+	 */
+	Node getNode(int offset) throws BadLocationException;
+
+	/**
+	 * Returns a NodeLocation object describing the position information of
+	 * the Node's start and end tags.
+	 * 
+	 * @param node
+	 * @return The NodeLocation for this Node, null for unsupported Node
+	 *         instances.
+	 */
+	NodeLocation getNodeLocation(Node node);
+
+	/**
+	 * Returns the current server-side page language for the Document of the
+	 * given Node.
+	 * 
+	 * @return The server-side page language for this nodem null for Nodes
+	 *         within unsupported Documents.
+	 */
+	String getPageLanguage(Node node);
+
+	/**
+	 * Returns start offset of given Node.
+	 * 
+	 * @param node
+	 *            w3c <code>Node</code> object to check
+	 * @return the start offset or -1 for unsupported Nodes
+	 */
+	int getStartOffset(Node node);
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/XMLSourceEditingTextTools.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/XMLSourceEditingTextTools.java
new file mode 100644
index 0000000..63a337e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/XMLSourceEditingTextTools.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.provisional;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.NodeLocation;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * Implements ISourceEditingTextTools interface
+ */
+public class XMLSourceEditingTextTools implements IDOMSourceEditingTextTools, INodeAdapter {
+
+	protected class NodeLocationImpl implements NodeLocation {
+		private IDOMNode node;
+
+		public NodeLocationImpl(IDOMNode xmlnode) {
+			super();
+			node = xmlnode;
+		}
+
+		public int getEndTagEndOffset() {
+			if (node.getEndStructuredDocumentRegion() != null) {
+				return node.getEndStructuredDocumentRegion().getEndOffset();
+			}
+			return -1;
+		}
+
+		public int getEndTagStartOffset() {
+			if (node.getEndStructuredDocumentRegion() != null) {
+				return node.getEndStructuredDocumentRegion().getStartOffset();
+			}
+			return -1;
+		}
+
+		public int getStartTagEndOffset() {
+			if (node.getStartStructuredDocumentRegion() != null) {
+				return node.getStartStructuredDocumentRegion().getEndOffset();
+			}
+			return -1;
+		}
+
+		public int getStartTagStartOffset() {
+			if (node.getStartStructuredDocumentRegion() != null) {
+				return node.getStartStructuredDocumentRegion().getStartOffset();
+			}
+			return -1;
+		}
+	}
+
+	StructuredTextEditor fTextEditor = null;
+
+	public int getCaretOffset() {
+		StructuredTextViewer stv = fTextEditor.getTextViewer();
+		if ((stv != null) && (stv.getTextWidget() != null) && !stv.getTextWidget().isDisposed()) {
+			return stv.widgetOffset2ModelOffset(stv.getTextWidget().getCaretOffset());
+		}
+		return 0;
+	}
+
+	public IDocument getDocument() {
+		return fTextEditor.getDocumentProvider().getDocument(fTextEditor.getEditorInput());
+	}
+
+	public Document getDOMDocument() {
+		return (Document) fTextEditor.getModel().getAdapter(Document.class);
+	}
+
+	/*
+	 * If similar function is needed, composite it around the text editor's
+	 * instance. Removed also because it returns an alread-released model
+	 * 
+	 * public Document getDOMDocument(IMarker marker) { if (marker == null)
+	 * return null;
+	 * 
+	 * IResource res = marker.getResource(); if (res == null || !(res
+	 * instanceof IFile)) return null;
+	 * 
+	 * IModelManager mm = StructuredModelManager.getModelManager();
+	 * IStructuredModel model = null; try { model =
+	 * mm.getExistingModelForRead((IFile) res); if (model == null || !(model
+	 * instanceof IDOMModel)) return null;
+	 * 
+	 * return ((IDOMModel) model).getDocument(); } finally { if (model !=
+	 * null) model.releaseFromRead(); } }
+	 */
+
+	public IEditorPart getEditorPart() {
+		return fTextEditor.getEditorPart();
+	}
+
+	public Node getNode(int offset) throws BadLocationException {
+		Node node = null;
+		if ((0 <= offset) && (offset <= getDocument().getLength())) {
+			node = (Node) fTextEditor.getModel().getIndexedRegion(offset);
+		}
+		else {
+			throw new BadLocationException();
+		}
+		return node;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.extensions.SourceEditingTextTools#getNodeLocation(org.w3c.dom.Node)
+	 */
+	public NodeLocation getNodeLocation(Node node) {
+		if ((node.getNodeType() == Node.ELEMENT_NODE) && (node instanceof IDOMNode)) {
+			return new NodeLocationImpl((IDOMNode) node);
+		}
+		return null;
+	}
+
+	public String getPageLanguage(Node node) {
+		return ""; //$NON-NLS-1$
+	}
+
+	public ITextSelection getSelection() {
+		return (ITextSelection) fTextEditor.getSelectionProvider().getSelection();
+	}
+
+	/**
+	 * IExtendedMarkupEditor method
+	 */
+	// public List getSelectedNodes() {
+	// ViewerSelectionManager vsm = getViewerSelectionManager();
+	// return (vsm != null) ? vsm.getSelectedNodes() : null;
+	// }
+	public int getStartOffset(Node node) {
+		if ((node == null) || !(node instanceof IDOMText)) {
+			return -1;
+		}
+
+		IStructuredDocumentRegion fnode = ((IDOMText) node).getFirstStructuredDocumentRegion();
+		return fnode.getStartOffset();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.core.core.INodeAdapter#isAdapterForType(java.lang.Object)
+	 */
+	public boolean isAdapterForType(Object type) {
+		return ISourceEditingTextTools.class.equals(type);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.core.core.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.core.INodeNotifier,
+	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
+	 */
+	public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+	}
+
+	public void setTextEditor(StructuredTextEditor editor) {
+		fTextEditor = editor;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/quickoutline/XMLContentSelectionProvider.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/quickoutline/XMLContentSelectionProvider.java
new file mode 100644
index 0000000..a3c9c75
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/quickoutline/XMLContentSelectionProvider.java
@@ -0,0 +1,46 @@
+package org.eclipse.wst.xml.ui.internal.quickoutline;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.wst.sse.ui.IContentSelectionProvider;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+public class XMLContentSelectionProvider implements IContentSelectionProvider {
+
+	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
+		ISelection filteredSelection = selection;
+		if (selection instanceof IStructuredSelection) {
+			Object[] filteredNodes = getFilteredNodes(((IStructuredSelection) selection).toArray());
+			filteredSelection = new StructuredSelection(filteredNodes);
+		}
+		return filteredSelection;
+	}
+
+	private Object[] getFilteredNodes(Object[] filteredNodes) {
+		for (int i = 0; i < filteredNodes.length; i++) {
+			filteredNodes[i] = getFilteredNode(filteredNodes[i]);
+		}
+		return filteredNodes;
+	}
+
+	private Object getFilteredNode(Object object) {
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			short nodeType = node.getNodeType();
+			// replace attribute node in selection with its parent
+			if (nodeType == Node.ATTRIBUTE_NODE) {
+				node = ((Attr) node).getOwnerElement();
+			}
+			// anything else not visible, replace with parent node
+			else if (nodeType == Node.TEXT_NODE) {
+				node = node.getParentNode();
+			}
+			return node;
+		}
+		return object;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/quickoutline/XMLQuickOutlineConfiguration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/quickoutline/XMLQuickOutlineConfiguration.java
new file mode 100644
index 0000000..16d21a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/quickoutline/XMLQuickOutlineConfiguration.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.quickoutline;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.wst.sse.ui.IContentSelectionProvider;
+import org.eclipse.wst.sse.ui.quickoutline.AbstractQuickOutlineConfiguration;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeContentProvider;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
+
+public class XMLQuickOutlineConfiguration extends AbstractQuickOutlineConfiguration {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.IOutlineContentManager#getContentProvider()
+	 */
+	public ITreeContentProvider getContentProvider() {
+		return new JFaceNodeContentProvider();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.IOutlineContentManager#getContentSelectionProvider()
+	 */
+	public IContentSelectionProvider getContentSelectionProvider() {
+		return new XMLContentSelectionProvider();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.IOutlineContentManager#getLabelProvider()
+	 */
+	public ILabelProvider getLabelProvider() {
+		return new JFaceNodeLabelProvider();
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/registry/AdapterFactoryProviderForXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/registry/AdapterFactoryProviderForXML.java
new file mode 100644
index 0000000..3794a17
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/registry/AdapterFactoryProviderForXML.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.registry;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler;
+import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.util.Assert;
+import org.eclipse.wst.sse.ui.internal.contentoutline.IJFaceNodeAdapter;
+import org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelhandler.ModelHandlerForXML;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.ui.internal.DOMObserver;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeAdapterFactory;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+
+/**
+ * 
+ */
+public class AdapterFactoryProviderForXML implements AdapterFactoryProvider {
+
+	/*
+	 * @see AdapterFactoryProvider#addAdapterFactories(IStructuredModel)
+	 */
+	public void addAdapterFactories(IStructuredModel structuredModel) {
+
+		// add the normal content based factories to model's registry
+		addContentBasedFactories(structuredModel);
+	}
+
+	protected void addContentBasedFactories(IStructuredModel structuredModel) {
+		FactoryRegistry factoryRegistry = structuredModel.getFactoryRegistry();
+		Assert.isNotNull(factoryRegistry, "Program Error: client caller must ensure model has factory registry"); //$NON-NLS-1$
+		INodeAdapterFactory factory = null;
+
+		factory = factoryRegistry.getFactoryFor(IJFaceNodeAdapter.class);
+		if (factory == null) {
+			factory = new JFaceNodeAdapterFactory();
+			factoryRegistry.addFactory(factory);
+		}
+
+		// cs... added for inferred grammar support
+		//
+		if (structuredModel != null) {
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(structuredModel);
+			if (modelQuery != null) {
+				CMDocumentManager documentManager = modelQuery.getCMDocumentManager();
+				if (documentManager != null) {
+					IPreferenceStore store = XMLUIPlugin.getDefault().getPreferenceStore();
+					boolean useInferredGrammar = (store != null) ? store.getBoolean(XMLUIPreferenceNames.USE_INFERRED_GRAMMAR) : true;
+
+					documentManager.setPropertyEnabled(CMDocumentManager.PROPERTY_ASYNC_LOAD, true);
+					documentManager.setPropertyEnabled(CMDocumentManager.PROPERTY_AUTO_LOAD, false);
+					documentManager.setPropertyEnabled(CMDocumentManager.PROPERTY_USE_CACHED_RESOLVED_URI, true);
+					DOMObserver domObserver = new DOMObserver(structuredModel);
+					domObserver.setGrammarInferenceEnabled(useInferredGrammar);
+					domObserver.init();
+				}
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.internal.provisional.registry.AdapterFactoryProvider#isFor(org.eclipse.wst.sse.core.internal.ltk.modelhandler.IDocumentTypeHandler)
+	 */
+	public boolean isFor(IDocumentTypeHandler contentTypeDescription) {
+		return (contentTypeDescription instanceof ModelHandlerForXML);
+	}
+
+	public void reinitializeFactories(IStructuredModel structuredModel) {
+		// nothing to do, since no embedded type
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/search/XMLFindOccurrencesActionDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/search/XMLFindOccurrencesActionDelegate.java
new file mode 100644
index 0000000..84f2ec9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/search/XMLFindOccurrencesActionDelegate.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.search;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesActionDelegate;
+
+/**
+ * Sets up FindOccurrencesActionDelegate for xml find occurrences processors
+ */
+public class XMLFindOccurrencesActionDelegate extends FindOccurrencesActionDelegate {
+	private List fProcessors;
+
+	protected List getProcessors() {
+		if (fProcessors == null) {
+			fProcessors = new ArrayList();
+			XMLFindOccurrencesProcessor htmlProcessor = new XMLFindOccurrencesProcessor();
+			fProcessors.add(htmlProcessor);
+		}
+		return fProcessors;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/search/XMLFindOccurrencesProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/search/XMLFindOccurrencesProcessor.java
new file mode 100644
index 0000000..6b12fec
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/search/XMLFindOccurrencesProcessor.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.search;
+
+import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesProcessor;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+
+/**
+ * Configures a FindOccurrencesProcessor with XML partitions and regions
+ */
+public class XMLFindOccurrencesProcessor extends FindOccurrencesProcessor {
+
+	protected String[] getPartitionTypes() {
+		return new String[]{IXMLPartitions.XML_DEFAULT};
+	}
+
+	protected String[] getRegionTypes() {
+		return new String[]{DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE};
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectEnclosingXMLActionDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectEnclosingXMLActionDelegate.java
new file mode 100644
index 0000000..258be52
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectEnclosingXMLActionDelegate.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.selection;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.selection.StructuredSelectActionDelegate;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Node;
+
+public class StructuredSelectEnclosingXMLActionDelegate extends StructuredSelectActionDelegate {
+
+	protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection) {
+		IndexedRegion indexedRegion = null;
+
+		indexedRegion = getIndexedRegion(document, textSelection.getOffset());
+
+		return indexedRegion;
+	}
+
+	protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node cursorNode = (Node) indexedRegion;
+
+			// use parent node for empty text node
+			if ((cursorNode.getNodeType() == Node.TEXT_NODE) && (cursorNode.getNodeValue().trim().length() == 0)) {
+				cursorNode = cursorNode.getParentNode();
+
+				if (cursorNode instanceof IndexedRegion) {
+					indexedRegion = (IndexedRegion) cursorNode;
+				}
+			}
+
+			Region cursorNodeRegion = new Region(indexedRegion.getStartOffset(), indexedRegion.getEndOffset() - indexedRegion.getStartOffset());
+
+			if ((cursorNodeRegion.getOffset() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() <= textSelection.getOffset() + textSelection.getLength()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() <= textSelection.getOffset() + textSelection.getLength())) {
+				Node newNode = cursorNode.getParentNode();
+
+				if (newNode instanceof IndexedRegion) {
+					IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+					newRegion = new Region(newIndexedRegion.getStartOffset(), newIndexedRegion.getEndOffset() - newIndexedRegion.getStartOffset());
+				}
+			}
+			else {
+				newRegion = cursorNodeRegion;
+			}
+		}
+		return newRegion;
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(XMLUIMessages.StructureSelectEnclosing_label);
+			action.setToolTipText(XMLUIMessages.StructureSelectEnclosing_tooltip);
+			action.setDescription(XMLUIMessages.StructureSelectEnclosing_description);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectNextXMLActionDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectNextXMLActionDelegate.java
new file mode 100644
index 0000000..f5088c3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectNextXMLActionDelegate.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.selection;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.selection.StructuredSelectActionDelegate;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Node;
+
+public class StructuredSelectNextXMLActionDelegate extends StructuredSelectActionDelegate {
+
+	protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection) {
+		int offset = textSelection.getOffset() + textSelection.getLength() - 1;
+		if (offset < 0) {
+			offset = 0;
+		}
+
+		IndexedRegion indexedRegion = null;
+
+		indexedRegion = getIndexedRegion(document, offset);
+
+		return indexedRegion;
+	}
+
+	protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node cursorNode = (Node) indexedRegion;
+
+			// use parent node for empty text node
+			if ((cursorNode.getNodeType() == Node.TEXT_NODE) && (cursorNode.getNodeValue().trim().length() == 0)) {
+				cursorNode = cursorNode.getParentNode();
+
+				if (cursorNode instanceof IndexedRegion) {
+					indexedRegion = (IndexedRegion) cursorNode;
+				}
+			}
+
+			Region cursorNodeRegion = new Region(indexedRegion.getStartOffset(), indexedRegion.getEndOffset() - indexedRegion.getStartOffset());
+			int currentOffset = textSelection.getOffset();
+			int currentEndOffset = currentOffset + textSelection.getLength();
+			if ((cursorNodeRegion.getOffset() >= currentOffset) && (cursorNodeRegion.getOffset() <= currentEndOffset) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() >= currentOffset) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() <= currentEndOffset)) {
+				newRegion = getNewSelectionRegion2(indexedRegion, textSelection);
+			}
+			else {
+				newRegion = cursorNodeRegion;
+			}
+		}
+		return newRegion;
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(XMLUIMessages.StructureSelectNext_label);
+			action.setToolTipText(XMLUIMessages.StructureSelectNext_tooltip);
+			action.setDescription(XMLUIMessages.StructureSelectNext_description);
+		}
+	}
+
+	/**
+	 * This method was separated out from getNewSelectionRegion2 because the
+	 * code in here is allowed to be called recursively.
+	 * 
+	 * @param indexedRegion
+	 * @param textSelection
+	 * @return new region to select or null if none
+	 */
+	private Region getNewSelectionRegion2(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node node = (Node) indexedRegion;
+			Node newNode = node.getNextSibling();
+			if (newNode == null) {
+				newNode = node.getParentNode();
+
+				if (newNode instanceof IndexedRegion) {
+					IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+					newRegion = new Region(newIndexedRegion.getStartOffset(), newIndexedRegion.getEndOffset() - newIndexedRegion.getStartOffset());
+				}
+			}
+			else {
+				if (newNode instanceof IndexedRegion) {
+					IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+					newRegion = new Region(textSelection.getOffset(), newIndexedRegion.getEndOffset() - textSelection.getOffset());
+
+					if (newNode.getNodeType() == Node.TEXT_NODE) {
+						newRegion = getNewSelectionRegion2(newIndexedRegion, new TextSelection(newRegion.getOffset(), newRegion.getLength()));
+					}
+				}
+			}
+		}
+		return newRegion;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectPreviousXMLActionDelegate.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectPreviousXMLActionDelegate.java
new file mode 100644
index 0000000..8939c32
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/selection/StructuredSelectPreviousXMLActionDelegate.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.selection;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.selection.StructuredSelectActionDelegate;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Node;
+
+public class StructuredSelectPreviousXMLActionDelegate extends StructuredSelectActionDelegate {
+
+	protected IndexedRegion getCursorIndexedRegion(IDocument document, ITextSelection textSelection) {
+		IndexedRegion indexedRegion = null;
+
+		indexedRegion = getIndexedRegion(document, textSelection.getOffset());
+
+		return indexedRegion;
+	}
+
+	protected Region getNewSelectionRegion(IndexedRegion indexedRegion, ITextSelection textSelection) {
+		Region newRegion = null;
+		if (indexedRegion instanceof Node) {
+			Node cursorNode = (Node) indexedRegion;
+
+			// use parent node for empty text node
+			if ((cursorNode.getNodeType() == Node.TEXT_NODE) && (cursorNode.getNodeValue().trim().length() == 0)) {
+				cursorNode = cursorNode.getParentNode();
+
+				if (cursorNode instanceof IndexedRegion) {
+					indexedRegion = (IndexedRegion) cursorNode;
+				}
+			}
+
+			Region cursorNodeRegion = new Region(indexedRegion.getStartOffset(), indexedRegion.getEndOffset() - indexedRegion.getStartOffset());
+
+			if ((cursorNodeRegion.getOffset() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() <= textSelection.getOffset() + textSelection.getLength()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() >= textSelection.getOffset()) && (cursorNodeRegion.getOffset() + cursorNodeRegion.getLength() <= textSelection.getOffset() + textSelection.getLength())) {
+				Node newNode = cursorNode.getPreviousSibling();
+				if (newNode == null) {
+					newNode = cursorNode.getParentNode();
+
+					if (newNode instanceof IndexedRegion) {
+						IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+						newRegion = new Region(newIndexedRegion.getStartOffset(), newIndexedRegion.getEndOffset() - newIndexedRegion.getStartOffset());
+					}
+				}
+				else {
+					if (newNode instanceof IndexedRegion) {
+						IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
+						newRegion = new Region(newIndexedRegion.getStartOffset(), textSelection.getOffset() + textSelection.getLength() - newIndexedRegion.getStartOffset());
+
+						if (newNode.getNodeType() == Node.TEXT_NODE) {
+							newRegion = getNewSelectionRegion(newIndexedRegion, new TextSelection(newRegion.getOffset(), newRegion.getLength()));
+						}
+					}
+				}
+
+			}
+			else {
+				newRegion = cursorNodeRegion;
+			}
+		}
+		return newRegion;
+	}
+
+	public void init(IAction action) {
+		if (action != null) {
+			action.setText(XMLUIMessages.StructureSelectPrevious_label);
+			action.setToolTipText(XMLUIMessages.StructureSelectPrevious_tooltip);
+			action.setDescription(XMLUIMessages.StructureSelectPrevious_description);
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/spelling/SpellcheckDelegateAdapterFactory.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/spelling/SpellcheckDelegateAdapterFactory.java
new file mode 100644
index 0000000..d77bea1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/spelling/SpellcheckDelegateAdapterFactory.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.spelling;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.spelling.ISpellcheckDelegate;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+/**
+ * An <code>IAdapterFactory</code> to adapt an <code>IDOMModel</code> to a
+ * <code>ISpellcheckDelegate</code>.
+ */
+public class SpellcheckDelegateAdapterFactory implements IAdapterFactory {
+	/**
+	 * This list of classes this factory adapts to.
+	 */
+	private static final Class[] ADAPTER_LIST = new Class[]{ISpellcheckDelegate.class};
+	
+	/**
+	 * The <code>ISpellcheckDelegate</code> this factory adapts to
+	 */
+	private static final ISpellcheckDelegate DELEGATE = new XMLSpellcheckDelegate();
+	
+	/**
+	 * Implementation of <code>ISpellcheckDelegate</code> for XML type documents.
+	 */
+	private static class XMLSpellcheckDelegate implements ISpellcheckDelegate {
+		
+		/**
+		 * If the region in the given <code>model</code> at the given <code>offset</code> is a
+		 * <code>Comment</code> region then it should be spell checked, otherwise it should not.
+		 * 
+		 * @see org.eclipse.wst.sse.ui.internal.spelling.ISpellcheckDelegate#shouldSpellcheck(org.eclipse.wst.sse.core.internal.provisional.IndexedRegion)
+		 */
+		public boolean shouldSpellcheck(int offset, IStructuredModel model) {
+			boolean shouldSpellcheck = true;
+			
+			IndexedRegion region = model.getIndexedRegion(offset);
+			if(region != null) {
+				shouldSpellcheck = region instanceof Comment;
+				if (!shouldSpellcheck && region instanceof Text) {
+					final Node parent = ((Text) (region)).getParentNode();
+					if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) {
+						final ModelQuery mq = ModelQueryUtil.getModelQuery(parent.getOwnerDocument());
+						if (mq != null) {
+							final CMElementDeclaration decl = mq.getCMElementDeclaration((Element) parent);
+							if (decl != null) {
+								final CMDataType type= decl.getDataType();
+								shouldSpellcheck = type == null || type.getEnumeratedValues() == null || type.getEnumeratedValues().length == 0;
+							}
+						}
+					}
+				}
+			}
+			
+			return shouldSpellcheck;
+		}
+		
+	}
+	
+	/** 
+	 * Adapts <code>IDOMModel</code> to <code>ISpellcheckDelegate</code>.
+	 * 
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
+	 */
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		ISpellcheckDelegate decision = null;
+		
+		if (adaptableObject instanceof IDOMModel && ISpellcheckDelegate.class.equals(adapterType)) {
+			decision = DELEGATE;
+		}
+		
+		return decision;
+	}
+
+	/**
+	 *  This adapter only adapts to <code>ISpellcheckDelegate</code>
+	 *  
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
+	 */
+	public Class[] getAdapterList() {
+		return ADAPTER_LIST;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/style/IStyleConstantsXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/style/IStyleConstantsXML.java
new file mode 100644
index 0000000..79055b6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/style/IStyleConstantsXML.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference      
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.style;
+
+/**
+ * Contains the symbolic name of styles used by LineStyleProvider,
+ * ColorManager, and any others who may be interested
+ */
+public interface IStyleConstantsXML {
+	public static final String BACKGROUND = "background"; //$NON-NLS-1$
+	public static final String CDATA_BORDER = "cdataBorder";//$NON-NLS-1$
+	public static final String CDATA_TEXT = "cdataText";//$NON-NLS-1$
+	public static final String COMMENT_BORDER = "commentBorder";//$NON-NLS-1$
+	public static final String COMMENT_TEXT = "commentText";//$NON-NLS-1$
+	public static final String DECL_BORDER = "declBoder";//$NON-NLS-1$
+	public static final String DOCTYPE_EXTERNAL_ID = "doctypeExternalId";//$NON-NLS-1$
+	public static final String DOCTYPE_EXTERNAL_ID_PUBREF = "doctypeExternalPubref";//$NON-NLS-1$
+	public static final String DOCTYPE_EXTERNAL_ID_SYSREF = "doctypeExtrenalSysref";//$NON-NLS-1$
+	public static final String DOCTYPE_NAME = "doctypeName";//$NON-NLS-1$
+
+	public static final String FOREGROUND = "foreground"; //$NON-NLS-1$
+	public static final String PI_BORDER = "piBorder";//$NON-NLS-1$
+	public static final String PI_CONTENT = "piContent";//$NON-NLS-1$
+
+	public static final String TAG_ATTRIBUTE_EQUALS = "tagAttributeEquals"; //$NON-NLS-1$
+	public static final String TAG_ATTRIBUTE_NAME = "tagAttributeName";//$NON-NLS-1$
+	public static final String TAG_ATTRIBUTE_VALUE = "tagAttributeValue";//$NON-NLS-1$
+	public static final String TAG_BORDER = "tagBorder";//$NON-NLS-1$
+	public static final String TAG_NAME = "tagName";//$NON-NLS-1$
+	public static final String XML_CONTENT = "xmlContent";//$NON-NLS-1$
+	public static final String ENTITY_REFERENCE = "entityReference";//$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/style/LineStyleProviderForXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/style/LineStyleProviderForXML.java
new file mode 100644
index 0000000..1241201
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/style/LineStyleProviderForXML.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Benjamin Muskalla, b.muskalla@gmx.net - [158660] character entities should have their own syntax highlighting preference     
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.style;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.internal.provisional.style.AbstractLineStyleProvider;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+public class LineStyleProviderForXML extends AbstractLineStyleProvider implements LineStyleProvider {
+	public LineStyleProviderForXML() {
+		super();
+	}
+
+	protected TextAttribute getAttributeFor(ITextRegion region) {
+		/**
+		 * a method to centralize all the "format rules" for regions
+		 * specifically associated for how to "open" the region.
+		 */
+		// not sure why this is coming through null, but just to catch it
+		if (region == null) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.CDATA_TEXT);
+		}
+		
+		String type = region.getType();
+		if ((type == DOMRegionContext.XML_CONTENT) || (type == DOMRegionContext.XML_DOCTYPE_INTERNAL_SUBSET) || (type == DOMRegionContext.UNDEFINED)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.XML_CONTENT);
+		}
+		if ((type == DOMRegionContext.XML_TAG_OPEN) || (type == DOMRegionContext.XML_END_TAG_OPEN) || (type == DOMRegionContext.XML_TAG_CLOSE) || (type == DOMRegionContext.XML_EMPTY_TAG_CLOSE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_BORDER);
+		}
+		if ((type == DOMRegionContext.XML_CDATA_OPEN) || (type == DOMRegionContext.XML_CDATA_CLOSE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.CDATA_BORDER);
+		}
+		if (type == DOMRegionContext.XML_CDATA_TEXT) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.CDATA_TEXT);
+		}
+		if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+		}
+		if (type == DOMRegionContext.XML_DOCTYPE_DECLARATION) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_NAME);
+		}
+		if (type == DOMRegionContext.XML_TAG_NAME) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_NAME);
+		}
+		if ((type == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+		}
+		if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS);
+		}
+		if ((type == DOMRegionContext.XML_COMMENT_OPEN) || (type == DOMRegionContext.XML_COMMENT_CLOSE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.COMMENT_BORDER);
+		}
+		if (type == DOMRegionContext.XML_COMMENT_TEXT) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.COMMENT_TEXT);
+		}
+		if (type == DOMRegionContext.XML_DOCTYPE_NAME) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.DOCTYPE_NAME);
+		}
+		if ((type == DOMRegionContext.XML_CHAR_REFERENCE) || (type == DOMRegionContext.XML_ENTITY_REFERENCE) || (type == DOMRegionContext.XML_PE_REFERENCE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.ENTITY_REFERENCE);
+		}
+		if (type == DOMRegionContext.XML_PI_CONTENT) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.PI_CONTENT);
+		}
+		if ((type == DOMRegionContext.XML_PI_OPEN) || (type == DOMRegionContext.XML_PI_CLOSE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.PI_BORDER);
+		}
+		if ((type == DOMRegionContext.XML_DECLARATION_OPEN) || (type == DOMRegionContext.XML_DECLARATION_CLOSE)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.DECL_BORDER);
+		}
+		if (type == DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSREF) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+		}
+		if (type == DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBREF) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+		}
+		if ((type == DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBLIC) || (type == DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSTEM)) {
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		}
+		if (type == DOMRegionContext.WHITE_SPACE) {
+			/*
+			 * White space is normally not on its own ... but when it is,
+			 * we'll treat as content
+			 */
+			return (TextAttribute) getTextAttributes().get(IStyleConstantsXML.XML_CONTENT);
+		}
+		/*
+		 * default, return null to signal "not handled" in which case, other
+		 * providers should be tried
+		 */
+		return null;
+	}
+
+	protected IPreferenceStore getColorPreferences() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	protected void handlePropertyChange(PropertyChangeEvent event) {
+		String styleKey = null;
+
+		if (event != null) {
+			String prefKey = event.getProperty();
+			// check if preference changed is a style preference
+			if (IStyleConstantsXML.TAG_NAME.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.TAG_NAME;
+			}
+			else if (IStyleConstantsXML.TAG_BORDER.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.TAG_BORDER;
+			}
+			else if (IStyleConstantsXML.TAG_ATTRIBUTE_NAME.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.TAG_ATTRIBUTE_NAME;
+			}
+			else if (IStyleConstantsXML.TAG_ATTRIBUTE_VALUE.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.TAG_ATTRIBUTE_VALUE;
+			}
+			else if (IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS;
+			}
+			else if (IStyleConstantsXML.COMMENT_BORDER.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.COMMENT_BORDER;
+			}
+			else if (IStyleConstantsXML.COMMENT_TEXT.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.COMMENT_TEXT;
+			}
+			else if (IStyleConstantsXML.ENTITY_REFERENCE.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.ENTITY_REFERENCE;
+			}
+			else if (IStyleConstantsXML.CDATA_BORDER.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.CDATA_BORDER;
+			}
+			else if (IStyleConstantsXML.CDATA_TEXT.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.CDATA_TEXT;
+			}
+			else if (IStyleConstantsXML.DECL_BORDER.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.DECL_BORDER;
+			}
+			else if (IStyleConstantsXML.DOCTYPE_EXTERNAL_ID.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.DOCTYPE_EXTERNAL_ID;
+			}
+			else if (IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF;
+			}
+			else if (IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF;
+			}
+			else if (IStyleConstantsXML.DOCTYPE_NAME.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.DOCTYPE_NAME;
+			}
+			else if (IStyleConstantsXML.PI_CONTENT.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.PI_CONTENT;
+			}
+			else if (IStyleConstantsXML.PI_BORDER.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.PI_BORDER;
+			}
+			else if (IStyleConstantsXML.XML_CONTENT.equals(prefKey)) {
+				styleKey = IStyleConstantsXML.XML_CONTENT;
+			}
+		}
+
+		if (styleKey != null) {
+			// overwrite style preference with new value
+			addTextAttribute(styleKey);
+			super.handlePropertyChange(event);
+		}
+	}
+
+	/**
+	 * Loads text attributes into map. Make sure map is cleared before calling
+	 * this.
+	 */
+	protected void loadColors() {
+		addTextAttribute(IStyleConstantsXML.TAG_NAME);
+		addTextAttribute(IStyleConstantsXML.TAG_BORDER);
+		addTextAttribute(IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
+		addTextAttribute(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
+		addTextAttribute(IStyleConstantsXML.TAG_ATTRIBUTE_EQUALS);
+		addTextAttribute(IStyleConstantsXML.COMMENT_BORDER);
+		addTextAttribute(IStyleConstantsXML.COMMENT_TEXT);
+		addTextAttribute(IStyleConstantsXML.CDATA_BORDER);
+		addTextAttribute(IStyleConstantsXML.CDATA_TEXT);
+		addTextAttribute(IStyleConstantsXML.DECL_BORDER);
+		addTextAttribute(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID);
+		addTextAttribute(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_PUBREF);
+		addTextAttribute(IStyleConstantsXML.DOCTYPE_EXTERNAL_ID_SYSREF);
+		addTextAttribute(IStyleConstantsXML.DOCTYPE_NAME);
+		addTextAttribute(IStyleConstantsXML.PI_CONTENT);
+		addTextAttribute(IStyleConstantsXML.PI_BORDER);
+		addTextAttribute(IStyleConstantsXML.XML_CONTENT);
+		addTextAttribute(IStyleConstantsXML.ENTITY_REFERENCE);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/MarkupTagInfoProvider.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/MarkupTagInfoProvider.java
new file mode 100644
index 0000000..9615ad4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/MarkupTagInfoProvider.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.taginfo;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocumentation;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDescriptionBuilder;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+/**
+ * Provides basic tag information such as element/attribute name, data type,
+ * and tag info/documentation for CMNodes. Uses HTML to enhance presentation.
+ */
+public class MarkupTagInfoProvider {
+	protected final static String BOLD_END = "</b>"; //$NON-NLS-1$
+	protected final static String BOLD_START = "<b>"; //$NON-NLS-1$
+	protected final static String HEADING_END = "</h5>"; //$NON-NLS-1$
+	protected final static String HEADING_START = "<h5>"; //$NON-NLS-1$
+	protected final static String LIST_BEGIN = "<ul>"; //$NON-NLS-1$
+	protected final static String LIST_ELEMENT = "<li>"; //$NON-NLS-1$
+	protected final static String NEW_LINE = "<dl>"; //$NON-NLS-1$
+	protected final static String PARAGRAPH_END = "</p>"; //$NON-NLS-1$
+	protected final static String PARAGRAPH_START = "<p>"; //$NON-NLS-1$
+	protected final static String SPACE = " "; //$NON-NLS-1$
+
+	/**
+	 * Returns basic tag information for display given a CMNode
+	 * 
+	 * @return String
+	 */
+	public String getInfo(CMNode node) {
+		if (node == null) {
+			return null;
+		}
+		StringBuffer sb = new StringBuffer();
+		// we assume that if there is tagInfo present, only display tagInfo
+		printTagInfo(sb, node);
+
+		// no tagInfo present, so try to display tag description
+		if (sb.length() == 0) {
+			printDescription(sb, node);
+		}
+
+		// no tag description present either, so display default info
+		if (sb.length() == 0) {
+			printDefaultInfo(node, sb);
+		}
+
+		return sb.toString();
+	}
+
+	/**
+	 * Adds dataType's data type information, including enumerated type values
+	 * to string buffer, sb
+	 * 
+	 */
+	protected void printDataTypeInfo(StringBuffer sb, CMDataType dataType) {
+		String dataTypeName = dataType.getNodeName();
+		if ((dataTypeName != null) && (dataTypeName.length() > 0)) {
+			sb.append(PARAGRAPH_START + BOLD_START + XMLUIMessages.Data_Type____4 + SPACE + BOLD_END);
+			sb.append(dataTypeName);
+			sb.append(PARAGRAPH_END);
+		}
+		String defaultValue = dataType.getImpliedValue();
+		if(defaultValue != null) {
+			sb.append(PARAGRAPH_START + BOLD_START + XMLUIMessages.Default_Value____6 + SPACE + BOLD_END);
+			sb.append(defaultValue);
+			sb.append(PARAGRAPH_END);
+		}
+		String[] enumeratedValue = dataType.getEnumeratedValues();
+		if ((enumeratedValue != null) && (enumeratedValue.length > 0)) {
+			sb.append(PARAGRAPH_START + BOLD_START + XMLUIMessages.Enumerated_Values____5 + SPACE + BOLD_END);
+			sb.append(LIST_BEGIN);
+			for (int i = 0; i < enumeratedValue.length; i++) {
+				sb.append(LIST_ELEMENT + enumeratedValue[i]);
+			}
+			sb.append(PARAGRAPH_END);
+		}
+	}
+
+	/**
+	 * Adds the default info (element name, content model, data type) of
+	 * CMNode to the string buffer, sb
+	 * 
+	 */
+	protected void printDefaultInfo(CMNode node, StringBuffer sb) {
+		{
+
+			if (node.getNodeType() == CMNode.ELEMENT_DECLARATION) {
+				CMElementDeclaration ed = (CMElementDeclaration) node;
+				sb.append(PARAGRAPH_START + BOLD_START + XMLUIMessages.Element____1 + SPACE + BOLD_END);
+				sb.append(node.getNodeName());
+				sb.append(PARAGRAPH_END);
+				printDocumentation(sb, node);
+				if (ed.getContentType() == CMElementDeclaration.PCDATA) {
+					CMDataType dataType = ed.getDataType();
+					if (dataType != null) {
+						printDataTypeInfo(sb, dataType);
+					}
+				}
+				else {
+					CMDescriptionBuilder builder = new CMDescriptionBuilder();
+					String description = builder.buildDescription(node);
+					if ((description != null) && (description.length() > 0)) {
+						sb.append(PARAGRAPH_START + BOLD_START + XMLUIMessages.Content_Model____2 + SPACE + BOLD_END);
+						sb.append(description + PARAGRAPH_END);
+					}
+				}
+			}
+			else if (node.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+				CMAttributeDeclaration ad = (CMAttributeDeclaration) node;
+				sb.append(PARAGRAPH_START + BOLD_START + XMLUIMessages.Attribute____3 + SPACE + BOLD_END);
+				sb.append(node.getNodeName());
+				sb.append(PARAGRAPH_END);
+				printDocumentation(sb, node);
+				CMDataType dataType = ad.getAttrType();
+				if (dataType != null) {
+					printDataTypeInfo(sb, dataType);
+				}
+			}
+			else if (node.getNodeType() == CMNode.DATA_TYPE) {
+				sb.append(PARAGRAPH_START + BOLD_START + XMLUIMessages.Data_Type____4 + SPACE + BOLD_END);
+				sb.append(node.getNodeName());
+				sb.append(PARAGRAPH_END);
+				printDocumentation(sb, node);
+			}
+		}
+	}
+
+	/**
+	 * Adds the description property of the CMNode to the string buffer, sb
+	 * 
+	 */
+	protected void printDescription(StringBuffer sb, CMNode node) {
+		String tagInfo = (String) node.getProperty("description"); //$NON-NLS-1$
+		if (tagInfo != null) {
+			sb.append(PARAGRAPH_START + tagInfo.trim() + PARAGRAPH_END);
+		}
+	}
+
+	/**
+	 * Adds the tag documentation property of the CMNode to the string buffer,
+	 * sb
+	 * 
+	 */
+	protected void printDocumentation(StringBuffer sb, CMNode node) {
+		CMNodeList nodeList = (CMNodeList) node.getProperty("documentation"); //$NON-NLS-1$
+		if ((nodeList != null) && (nodeList.getLength() > 0)) {
+			for (int i = 0; i < nodeList.getLength(); i++) {
+				CMDocumentation documentation = (CMDocumentation) nodeList.item(i);
+				String doc = documentation.getValue();
+				if (doc != null) {
+					sb.append(PARAGRAPH_START + doc.trim() + PARAGRAPH_END);
+				}
+			}
+			sb.append(NEW_LINE);
+		}
+	}
+
+	/**
+	 * Adds the tag info property of the CMNode to the string buffer, sb
+	 * 
+	 */
+	protected void printTagInfo(StringBuffer sb, CMNode node) {
+		String tagInfo = (String) node.getProperty("tagInfo"); //$NON-NLS-1$
+		if (tagInfo != null) {
+			sb.append(PARAGRAPH_START + tagInfo.trim() + PARAGRAPH_END);
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLInformationProvider.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLInformationProvider.java
new file mode 100644
index 0000000..fe76a69
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLInformationProvider.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.taginfo;
+
+
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.IInformationProviderExtension;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
+
+/**
+ * Provides context information for XML tags (Shows tooltip description)
+ * 
+ * @deprecated StructuredTextViewerConfiguration creates the appropriate
+ *             information provider
+ */
+public class XMLInformationProvider implements IInformationProvider, IInformationProviderExtension {
+
+	private ITextHover fTextHover = null;
+
+	public XMLInformationProvider() {
+		fTextHover = SSEUIPlugin.getDefault().getTextHoverManager().createBestMatchHover(new XMLTagInfoHoverProcessor());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.information.IInformationProvider#getInformation(org.eclipse.jface.text.ITextViewer,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public String getInformation(ITextViewer textViewer, IRegion subject) {
+		return (String) getInformation2(textViewer, subject);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.information.IInformationProviderExtension#getInformation2(org.eclipse.jface.text.ITextViewer,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public Object getInformation2(ITextViewer textViewer, IRegion subject) {
+		return fTextHover.getHoverInfo(textViewer, subject);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.information.IInformationProvider#getSubject(org.eclipse.jface.text.ITextViewer,
+	 *      int)
+	 */
+	public IRegion getSubject(ITextViewer textViewer, int offset) {
+		return fTextHover.getHoverRegion(textViewer, offset);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLTagInfoHoverProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLTagInfoHoverProcessor.java
new file mode 100644
index 0000000..47276fc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLTagInfoHoverProcessor.java
@@ -0,0 +1,362 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.taginfo;
+
+
+
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.core.internal.util.Debug;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.taginfo.AbstractHoverProcessor;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+/**
+ * Provides hover help documentation for xml tags
+ * 
+ * @see org.eclipse.jface.text.ITextHover
+ */
+public class XMLTagInfoHoverProcessor extends AbstractHoverProcessor {
+	protected MarkupTagInfoProvider fInfoProvider = null;
+
+	/**
+	 * Constructor for XMLTextHoverProcessor.
+	 */
+	public XMLTagInfoHoverProcessor() {
+		// nothing
+	}
+
+	/**
+	 * Retreives documentation to display in the hover help popup.
+	 * 
+	 * @return String any documentation information to display
+	 *         <code>null</code> if there is nothing to display.
+	 * 
+	 */
+	protected String computeHoverHelp(ITextViewer textViewer, int documentPosition) {
+		String result = null;
+
+		IndexedRegion treeNode = ContentAssistUtils.getNodeAt(textViewer, documentPosition);
+		if (treeNode == null) {
+			return null;
+		}
+		Node node = (Node) treeNode;
+
+		while ((node != null) && (node.getNodeType() == Node.TEXT_NODE) && (node.getParentNode() != null)) {
+			node = node.getParentNode();
+		}
+		IDOMNode parentNode = (IDOMNode) node;
+
+		IStructuredDocumentRegion flatNode = ((IStructuredDocument) textViewer.getDocument()).getRegionAtCharacterOffset(documentPosition);
+		if (flatNode != null) {
+			ITextRegion region = flatNode.getRegionAtCharacterOffset(documentPosition);
+			if (region != null) {
+				result = computeRegionHelp(treeNode, parentNode, flatNode, region);
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * Computes the hoverhelp based on region
+	 * 
+	 * @return String hoverhelp
+	 */
+	protected String computeRegionHelp(IndexedRegion treeNode, IDOMNode parentNode, IStructuredDocumentRegion flatNode, ITextRegion region) {
+		String result = null;
+		if (region == null) {
+			return null;
+		}
+		String regionType = region.getType();
+		if (regionType == DOMRegionContext.XML_TAG_NAME) {
+			result = computeTagNameHelp((IDOMNode) treeNode, parentNode, flatNode, region);
+		}
+		else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+			result = computeTagAttNameHelp((IDOMNode) treeNode, parentNode, flatNode, region);
+		}
+		else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+			result = computeTagAttValueHelp((IDOMNode) treeNode, parentNode, flatNode, region);
+		}
+		return result;
+	}
+
+	/**
+	 * Computes the hover help for the attribute name
+	 */
+	protected String computeTagAttNameHelp(IDOMNode xmlnode, IDOMNode parentNode, IStructuredDocumentRegion flatNode, ITextRegion region) {
+		CMElementDeclaration elementDecl = getCMElementDeclaration(xmlnode);
+		String attName = flatNode.getText(region);
+		CMAttributeDeclaration attDecl = getCMAttributeDeclaration(xmlnode, elementDecl, attName);
+		return getAdditionalInfo(elementDecl, attDecl);
+	}
+
+	/**
+	 * Computes the hover help for the attribute value (this is the same as
+	 * the attribute name's help)
+	 */
+	protected String computeTagAttValueHelp(IDOMNode xmlnode, IDOMNode parentNode, IStructuredDocumentRegion flatNode, ITextRegion region) {
+		CMElementDeclaration elementDecl = getCMElementDeclaration(xmlnode);
+		ITextRegion attrNameRegion = getAttrNameRegion(xmlnode, region);
+
+		String attName = flatNode.getText(attrNameRegion);
+		CMAttributeDeclaration attDecl = getCMAttributeDeclaration(xmlnode, elementDecl, attName);
+		return getAdditionalInfo(elementDecl, attDecl);
+	}
+
+	/**
+	 * Computes the hover help for the tag name
+	 */
+	protected String computeTagNameHelp(IDOMNode xmlnode, IDOMNode parentNode, IStructuredDocumentRegion flatNode, ITextRegion region) {
+		CMElementDeclaration elementDecl = getCMElementDeclaration(xmlnode);
+		CMElementDeclaration pelementDecl = getCMElementDeclaration(parentNode);
+		return getAdditionalInfo(pelementDecl, elementDecl);
+	}
+
+	/**
+	 * Retreives cmnode's documentation to display in the hover help popup. If
+	 * no documentation exists for cmnode, try displaying parentOrOwner's
+	 * documentation
+	 * 
+	 * @return String any documentation information to display for cmnode.
+	 *         <code>null</code> if there is nothing to display.
+	 */
+	protected String getAdditionalInfo(CMNode parentOrOwner, CMNode cmnode) {
+		String addlInfo = null;
+
+		if (cmnode == null) {
+			if (Debug.displayWarnings) {
+				new IllegalArgumentException("Null declaration!").printStackTrace(); //$NON-NLS-1$
+			}
+			return null;
+		}
+
+		addlInfo = getInfoProvider().getInfo(cmnode);
+		if ((addlInfo == null) && (parentOrOwner != null)) {
+			addlInfo = getInfoProvider().getInfo(parentOrOwner);
+		}
+		return addlInfo;
+	}
+
+	/**
+	 * Find the region of the attribute name for the given attribute value
+	 * region
+	 * 
+	 */
+	protected ITextRegion getAttrNameRegion(IDOMNode node, ITextRegion region) {
+		// Find the attribute name for which this position should have a value
+		IStructuredDocumentRegion open = node.getFirstStructuredDocumentRegion();
+		ITextRegionList openRegions = open.getRegions();
+		int i = openRegions.indexOf(region);
+		if (i < 0) {
+			return null;
+		}
+		ITextRegion nameRegion = null;
+		while (i >= 0) {
+			nameRegion = openRegions.get(i--);
+			if (nameRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+				break;
+			}
+		}
+		return nameRegion;
+	}
+
+	/**
+	 * Retreives CMAttributeDeclaration indicated by attribute name within
+	 * elementDecl
+	 */
+	protected CMAttributeDeclaration getCMAttributeDeclaration(IDOMNode node, CMElementDeclaration elementDecl, String attName) {
+		CMAttributeDeclaration attrDecl = null;
+
+		if (elementDecl != null) {
+			CMNamedNodeMap attributes = elementDecl.getAttributes();
+			
+			CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributes);
+			List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+			for (int k = 0; k < nodes.size(); k++) {
+				CMNode cmnode = (CMNode) nodes.get(k);
+				if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+					allAttributes.put(cmnode);
+				}
+			}
+			attributes = allAttributes;
+
+			String noprefixName = DOMNamespaceHelper.getUnprefixedName(attName);
+			if (attributes != null) {
+				attrDecl = (CMAttributeDeclaration) attributes.getNamedItem(noprefixName);
+				if (attrDecl == null) {
+					attrDecl = (CMAttributeDeclaration) attributes.getNamedItem(attName);
+				}
+			}
+		}
+		return attrDecl;
+	}
+
+	/**
+	 * Retreives CMElementDeclaration for given node
+	 * 
+	 * @return CMElementDeclaration - CMElementDeclaration of node or
+	 *         <code>null</code> if not possible
+	 */
+	protected CMElementDeclaration getCMElementDeclaration(Node node) {
+		CMElementDeclaration result = null;
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
+			if (modelQuery != null) {
+				result = modelQuery.getCMElementDeclaration((Element) node);
+			}
+		}
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer,
+	 *      org.eclipse.jface.text.IRegion)
+	 */
+	public String getHoverInfo(ITextViewer viewer, IRegion hoverRegion) {
+		if ((hoverRegion == null) || (viewer == null) || (viewer.getDocument() == null)) {
+			return null;
+		}
+
+		String displayText = null;
+		int documentOffset = hoverRegion.getOffset();
+		displayText = computeHoverHelp(viewer, documentOffset);
+
+		return displayText;
+	}
+
+	/**
+	 * Returns the region to hover the text over based on the offset.
+	 * 
+	 * @param textViewer
+	 * @param offset
+	 * 
+	 * @return IRegion region to hover over if offset is within tag name,
+	 *         attribute name, or attribute value and if offset is not over
+	 *         invalid whitespace. otherwise, returns <code>null</code>
+	 * 
+	 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(ITextViewer, int)
+	 */
+	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+		if ((textViewer == null) || (textViewer.getDocument() == null)) {
+			return null;
+		}
+
+		IStructuredDocumentRegion flatNode = ((IStructuredDocument) textViewer.getDocument()).getRegionAtCharacterOffset(offset);
+		ITextRegion region = null;
+
+		if (flatNode != null) {
+			region = flatNode.getRegionAtCharacterOffset(offset);
+		}
+
+		if (region != null) {
+			// only supply hoverhelp for tag name, attribute name, or
+			// attribute value
+			String regionType = region.getType();
+			if ((regionType == DOMRegionContext.XML_TAG_NAME) || (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) || (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
+				try {
+					// check if we are at whitespace before or after line
+					IRegion line = textViewer.getDocument().getLineInformationOfOffset(offset);
+					if ((offset > (line.getOffset())) && (offset < (line.getOffset() + line.getLength()))) {
+						// check if we are in region's trailing whitespace
+						// (whitespace after relevant info)
+						if (offset < flatNode.getTextEndOffset(region)) {
+							return new Region(flatNode.getStartOffset(region), region.getTextLength());
+						}
+					}
+				}
+				catch (BadLocationException e) {
+					Logger.logException(e);
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * @deprecated if enabled flag is false, dont call getHoverRegion in the
+	 *             first place if true, use getHoverRegion(ITextViewer, int)
+	 */
+	public IRegion getHoverRegion(ITextViewer textViewer, int offset, boolean enabled) {
+		if ((!enabled) || (textViewer == null) || (textViewer.getDocument() == null)) {
+			return null;
+		}
+
+		IStructuredDocumentRegion flatNode = ((IStructuredDocument) textViewer.getDocument()).getRegionAtCharacterOffset(offset);
+		ITextRegion region = null;
+
+		if (flatNode != null) {
+			region = flatNode.getRegionAtCharacterOffset(offset);
+		}
+
+		if (region != null) {
+			// only supply hoverhelp for tag name, attribute name, or
+			// attribute value
+			String regionType = region.getType();
+			if ((regionType == DOMRegionContext.XML_TAG_NAME) || (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) || (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
+				try {
+					// check if we are at whitespace before or after line
+					IRegion line = textViewer.getDocument().getLineInformationOfOffset(offset);
+					if ((offset > (line.getOffset())) && (offset < (line.getOffset() + line.getLength()))) {
+						// check if we are in region's trailing whitespace
+						// (whitespace after relevant info)
+						if (offset < flatNode.getTextEndOffset(region)) {
+							return new Region(flatNode.getStartOffset(region), region.getTextLength());
+						}
+					}
+				}
+				catch (BadLocationException e) {
+					Logger.logException(e);
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Gets the infoProvider.
+	 * 
+	 * @return Returns fInfoProvider and if fInfoProvider was
+	 *         <code>null</code> set fInfoProvider to DefaultInfoProvider
+	 */
+	public MarkupTagInfoProvider getInfoProvider() {
+		if (fInfoProvider == null) {
+			fInfoProvider = new MarkupTagInfoProvider();
+		}
+		return fInfoProvider;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/EncodingTemplateVariableResolverXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/EncodingTemplateVariableResolverXML.java
new file mode 100644
index 0000000..079b042
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/EncodingTemplateVariableResolverXML.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.templates;
+
+import org.eclipse.jface.text.templates.SimpleTemplateVariableResolver;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+
+
+public class EncodingTemplateVariableResolverXML extends SimpleTemplateVariableResolver {
+	private static final String ENCODING_TYPE = getEncodingType();
+
+	private static String getEncodingType() {
+		return "encoding"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Creates a new encoding variable
+	 */
+	public EncodingTemplateVariableResolverXML() {
+		super(ENCODING_TYPE, XMLUIMessages.Creating_files_encoding);
+	}
+
+	protected String resolve(TemplateContext context) {
+		return XMLCorePlugin.getDefault().getPluginPreferences().getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/TemplateContextTypeIdsXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/TemplateContextTypeIdsXML.java
new file mode 100644
index 0000000..f7993e2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/TemplateContextTypeIdsXML.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.templates;
+
+public class TemplateContextTypeIdsXML {
+
+	public static final String ALL = getAll();
+
+	public static final String ATTRIBUTE = getAttribute();
+
+	public static final String ATTRIBUTE_VALUE = getAttributeValue();
+
+	public static final String NEW = getNew();
+
+	public static final String TAG = getTag();
+
+	private static String getAll() {
+		return getPrefix() + "_all"; //$NON-NLS-1$
+	}
+
+	private static String getAttribute() {
+		return getPrefix() + "_attribute"; //$NON-NLS-1$
+	}
+
+	private static String getAttributeValue() {
+		return getPrefix() + "_attribute_value"; //$NON-NLS-1$
+	}
+
+	private static String getNew() {
+		return getPrefix() + "_new"; //$NON-NLS-1$
+	}
+
+	private static String getPrefix() {
+		return "xml"; //$NON-NLS-1$
+	}
+
+	private static String getTag() {
+		return getPrefix() + "_tag"; //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/TemplateContextTypeXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/TemplateContextTypeXML.java
new file mode 100644
index 0000000..43ccf20
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/templates/TemplateContextTypeXML.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.templates;
+
+import org.eclipse.jface.text.templates.GlobalTemplateVariables;
+import org.eclipse.jface.text.templates.TemplateContextType;
+
+/**
+ * Base class for XML template context types. Templates of this context type
+ * apply to any place within XML content type.
+ */
+public class TemplateContextTypeXML extends TemplateContextType {
+
+	public TemplateContextTypeXML() {
+		super();
+		addResolver(new GlobalTemplateVariables.Cursor());
+		addResolver(new GlobalTemplateVariables.Date());
+		addResolver(new GlobalTemplateVariables.Dollar());
+		addResolver(new GlobalTemplateVariables.LineSelection());
+		addResolver(new GlobalTemplateVariables.Time());
+		addResolver(new GlobalTemplateVariables.User());
+		addResolver(new GlobalTemplateVariables.WordSelection());
+		addResolver(new GlobalTemplateVariables.Year());
+		addResolver(new EncodingTemplateVariableResolverXML());
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/text/CharacterPairInserter.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/text/CharacterPairInserter.java
new file mode 100644
index 0000000..2f61324
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/text/CharacterPairInserter.java
@@ -0,0 +1,106 @@
+/*******************************************************************************

+ * Copyright (c) 2009, 2010 IBM Corporation and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *     IBM Corporation - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.wst.xml.ui.internal.text;

+

+import org.eclipse.jface.preference.IPreferenceStore;

+import org.eclipse.jface.text.IDocument;

+import org.eclipse.jface.text.source.ISourceViewer;

+import org.eclipse.jface.util.IPropertyChangeListener;

+import org.eclipse.jface.util.PropertyChangeEvent;

+import org.eclipse.swt.graphics.Point;

+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;

+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

+import org.eclipse.wst.sse.ui.typing.AbstractCharacterPairInserter;

+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;

+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;

+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;

+

+public class CharacterPairInserter extends AbstractCharacterPairInserter implements IPropertyChangeListener {

+

+	// preferences

+	private boolean fCloseStrings = true;

+	private boolean fCloseBrackets = true;

+

+	protected boolean shouldPair(ISourceViewer viewer, char c) {

+		switch (c) {

+			case '\'':

+			case '"':

+				return fCloseStrings ? checkRegion(viewer) : false;

+			default:

+				return fCloseBrackets;

+		}

+	}

+

+	/**

+	 * Checks if the region should support paired quotes

+	 * @param viewer the viewer

+	 * @return true if the region is not in an XML attribute value

+	 */

+	private boolean checkRegion(ISourceViewer viewer) {

+		IDocument doc = viewer.getDocument();

+		final Point selection= viewer.getSelectedRange();

+		final int offset= selection.x;

+

+		if (doc instanceof IStructuredDocument) {

+			IStructuredDocumentRegion[] regions = ((IStructuredDocument) doc).getStructuredDocumentRegions(offset, 0);

+			if (regions != null && regions.length > 0) {

+				ITextRegion region = regions[0].getRegionAtCharacterOffset(offset);

+				return region != null && region.getType() != DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE;

+			}

+		}

+		return true;

+	}

+

+	public boolean hasPair(char c) {

+		switch (c) {

+			case '"':

+			case '\'':

+			case '[':

+			case '(':

+				return true;

+			default:

+				return false;

+		}

+	}

+

+	protected char getPair(char c) {

+		switch (c) {

+			case '\'':

+			case '"':

+				return c;

+			case '(':

+				return ')';

+			case '[':

+				return ']';

+			default:

+				throw new IllegalArgumentException();

+		}

+	}

+

+	public void initialize() {

+		IPreferenceStore store = XMLUIPlugin.getInstance().getPreferenceStore();

+		fCloseStrings = store.getBoolean(XMLUIPreferenceNames.TYPING_CLOSE_STRINGS);

+		fCloseBrackets = store.getBoolean(XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS);

+		store.addPropertyChangeListener(this);

+	}

+

+	public void dispose() {

+		XMLUIPlugin.getInstance().getPreferenceStore().removePropertyChangeListener(this);

+	}

+

+	public void propertyChange(PropertyChangeEvent event) {

+		if (XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS.equals(event.getProperty()))

+			fCloseBrackets = ((Boolean) event.getNewValue()).booleanValue();

+		else if (XMLUIPreferenceNames.TYPING_CLOSE_STRINGS.equals(event.getProperty()))

+			fCloseStrings = ((Boolean) event.getNewValue()).booleanValue();

+	}

+}

diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/text/XMLDocumentRegionEdgeMatcher.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/text/XMLDocumentRegionEdgeMatcher.java
new file mode 100644
index 0000000..b29fd9b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/text/XMLDocumentRegionEdgeMatcher.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.text;
+
+import org.eclipse.jface.text.source.DefaultCharacterPairMatcher;
+import org.eclipse.wst.sse.ui.internal.text.DocumentRegionEdgeMatcher;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+
+
+public class XMLDocumentRegionEdgeMatcher extends DocumentRegionEdgeMatcher {
+
+	private static final char[] PAIRS = {'{', '}', '(', ')', '[', ']','"','"','\'','\''};
+
+	public XMLDocumentRegionEdgeMatcher() {
+		super(new String[]{DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_CDATA_TEXT, DOMRegionContext.XML_PI_OPEN, DOMRegionContext.XML_PI_CONTENT}, new DefaultCharacterPairMatcher(PAIRS));
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/SharedXMLEditorPluginImageHelper.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/SharedXMLEditorPluginImageHelper.java
new file mode 100644
index 0000000..9981244
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/SharedXMLEditorPluginImageHelper.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+
+public class SharedXMLEditorPluginImageHelper {
+	public static final String IMG_DTOOL_CONSTRAINOFF = XMLEditorPluginImages.IMG_DTOOL_CONSTRAINOFF;
+	public static final String IMG_DTOOL_CONSTRAINON = XMLEditorPluginImages.IMG_DTOOL_CONSTRAINON;
+	public static final String IMG_DTOOL_RLDGRMR = XMLEditorPluginImages.IMG_DTOOL_RLDGRMR;
+	public static final String IMG_DTOOL_VALIDATE = XMLEditorPluginImages.IMG_DTOOL_VALIDATE;
+	public static final String IMG_ETOOL_CONSTRAINOFF = XMLEditorPluginImages.IMG_ETOOL_CONSTRAINOFF;
+	public static final String IMG_ETOOL_CONSTRAINON = XMLEditorPluginImages.IMG_ETOOL_CONSTRAINON;
+	public static final String IMG_ETOOL_RLDGRMR = XMLEditorPluginImages.IMG_ETOOL_RLDGRMR;
+	public static final String IMG_ETOOL_VALIDATE = XMLEditorPluginImages.IMG_ETOOL_VALIDATE;
+	public static final String IMG_OBJ_ATTRIBUTE = XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE;
+	public static final String IMG_OBJ_CDATASECTION = XMLEditorPluginImages.IMG_OBJ_CDATASECTION;
+	public static final String IMG_OBJ_COMMENT = XMLEditorPluginImages.IMG_OBJ_COMMENT;
+	public static final String IMG_OBJ_DOCTYPE = XMLEditorPluginImages.IMG_OBJ_DOCTYPE;
+	public static final String IMG_OBJ_ELEMENT = XMLEditorPluginImages.IMG_OBJ_ELEMENT;
+	public static final String IMG_OBJ_ENTITY = XMLEditorPluginImages.IMG_OBJ_ENTITY;
+	public static final String IMG_OBJ_ENTITY_REFERENCE = XMLEditorPluginImages.IMG_OBJ_ENTITY_REFERENCE;
+	public static final String IMG_OBJ_NOTATION = XMLEditorPluginImages.IMG_OBJ_NOTATION;
+	public static final String IMG_OBJ_PROCESSINGINSTRUCTION = XMLEditorPluginImages.IMG_OBJ_PROCESSINGINSTRUCTION;
+	public static final String IMG_OBJ_TAG_GENERIC = XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC;
+	public static final String IMG_OBJ_TAG_MACRO = XMLEditorPluginImages.IMG_OBJ_TAG_MACRO;
+	public static final String IMG_OBJ_TXTEXT = XMLEditorPluginImages.IMG_OBJ_TXTEXT;
+
+	/**
+	 * Retrieves the specified image from the xml source editor plugin's image
+	 * registry. Note: The returned <code>Image</code> is managed by the
+	 * workbench; clients must <b>not </b> dispose of the returned image.
+	 * 
+	 * @param symbolicName
+	 *            the symbolic name of the image; there are constants declared
+	 *            in this class for build-in images that come with the xml
+	 *            source editor
+	 * @return the image, or <code>null</code> if not found
+	 */
+	public static Image getImage(String symbolicName) {
+		return XMLEditorPluginImageHelper.getInstance().getImage(symbolicName);
+	}
+
+	/**
+	 * Retrieves the image descriptor for specified image from the xml source
+	 * editor plugin's image registry. Unlike <code>Image</code>s, image
+	 * descriptors themselves do not need to be disposed.
+	 * 
+	 * @param symbolicName
+	 *            the symbolic name of the image; there are constants declared
+	 *            in this interface for build-in images that come with the xml
+	 *            source editor
+	 * @return the image descriptor, or <code>null</code> if not found
+	 */
+	public static ImageDescriptor getImageDescriptor(String symbolicName) {
+		return XMLEditorPluginImageHelper.getInstance().getImageDescriptor(symbolicName);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/XMLCommonResources.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/XMLCommonResources.java
new file mode 100644
index 0000000..a3ba0bb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/XMLCommonResources.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.util;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+
+/**
+ * @deprecated use XMLUIPlugin.getResourceString() instead
+ */
+/**
+ * This class exists temporarily until the properties files can be
+ * re-organized and the various resource references can be updated
+ */
+public class XMLCommonResources {
+	protected static XMLCommonResources instance;
+
+	public synchronized static XMLCommonResources getInstance() {
+		if (instance == null) {
+			instance = new XMLCommonResources(XMLUIPlugin.getDefault());
+		}
+		return instance;
+	}
+
+	private XMLUIPlugin editorPlugin;
+
+	private ResourceBundle resourceBundle;
+
+	public XMLCommonResources(XMLUIPlugin editorPlugin) {
+		instance = this;
+		this.editorPlugin = editorPlugin;
+		try {
+			resourceBundle = ResourceBundle.getBundle("org.eclipse.wst.xml.ui.internal.XMLUIPluginResources"); //$NON-NLS-1$
+		}
+		catch (MissingResourceException exception) {
+			// TODO... log an error message
+			// B2BUtilPlugin.getPlugin().getMsgLogger().write(B2BUtilPlugin.getGUIString("_WARN_PLUGIN_PROPERTIES_MISSING")
+			// + descriptor.getLabel());
+			resourceBundle = null;
+		}
+	}
+
+	ImageDescriptor _getImageDescriptor(String iconName) {
+		return AbstractUIPlugin.imageDescriptorFromPlugin(XMLUIPlugin.ID, iconName);
+	}
+
+
+	public ResourceBundle getResourceBundle() {
+		return resourceBundle;
+	}
+
+	/**
+	 * This gets the string resource.
+	 */
+	public String getString(String key) {
+		return getResourceBundle().getString(key);
+	}
+
+	/**
+	 * This gets the string resource and does one substitution.
+	 */
+	public String getString(String key, Object s1) {
+		return MessageFormat.format(getString(key), new Object[]{s1});
+	}
+
+	/**
+	 * This gets the string resource and does two substitutions.
+	 */
+	public String getString(String key, Object s1, Object s2) {
+		return MessageFormat.format(getString(key), new Object[]{s1, s2});
+	}
+
+	public IWorkbench getWorkbench() {
+		return editorPlugin.getWorkbench();
+	}
+	/*
+	 * public ImageFactory getImageFactory() { return imageFactory; }
+	 */
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/XMLCommonUIContextIds.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/XMLCommonUIContextIds.java
new file mode 100644
index 0000000..763d502
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/util/XMLCommonUIContextIds.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+
+
+package org.eclipse.wst.xml.ui.internal.util;
+
+/**
+ * Context help id constants.
+ */
+public interface XMLCommonUIContextIds {
+	public static final String PLUGIN_NAME = "org.eclipse.wst.xml.ui"; //$NON-NLS-1$
+
+	/* CONTEXT_ID xcui0500 for Edit Attribute Instruction Dialog */
+	public static final String XCUI_ATTRIBUTE_DIALOG = PLUGIN_NAME + ".xcui0500"; //$NON-NLS-1$
+
+	/* CONTEXT_ID xcui0400 for Select XML Catalog ID Dialog */
+	public static final String XCUI_CATALOG_DIALOG = PLUGIN_NAME + ".xcui0400"; //$NON-NLS-1$
+
+	/* CONTEXT_IDs for XML Common UI use xcuixxx context IDs */
+
+	/* CONTEXT_ID xcui0010 for Edit Doctype Dialog */
+	public static final String XCUI_DOCTYPE_DIALOG = PLUGIN_NAME + ".xcui0010"; //$NON-NLS-1$
+	/* CONTEXT_ID xcui0030 for Public ID Text Edit */
+	public static final String XCUI_DOCTYPE_PUBLIC = PLUGIN_NAME + ".xcui0030"; //$NON-NLS-1$
+	/* CONTEXT_ID xcui0020 for Root Element Name Text Edit */
+	public static final String XCUI_DOCTYPE_ROOT = PLUGIN_NAME + ".xcui0020"; //$NON-NLS-1$
+	/* CONTEXT_ID xcui0040 for System ID Text Edit */
+	public static final String XCUI_DOCTYPE_SYSTEM = PLUGIN_NAME + ".xcui0050"; //$NON-NLS-1$
+
+	/* CONTEXT_ID xcui0300 for Edit Element Instruction Dialog */
+	public static final String XCUI_ELEMENT_DIALOG = PLUGIN_NAME + ".xcui0600"; //$NON-NLS-1$
+
+	/* CONTEXT_ID xcui0200 for Edit Namespace Dialog */
+	public static final String XCUI_NAMESPACE_DIALOG = PLUGIN_NAME + ".xcui0200"; //$NON-NLS-1$
+
+	/* CONTEXT_ID xcui0300 for Edit Processing Instruction Dialog */
+	public static final String XCUI_PROCESSING_DIALOG = PLUGIN_NAME + ".xcui0300"; //$NON-NLS-1$
+
+	/* CONTEXT_ID xcui0100 for Edit Schema Information Dialog */
+	public static final String XCUI_SCHEMA_INFO_DIALOG = PLUGIN_NAME + ".xcui0100"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidator.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidator.java
new file mode 100644
index 0000000..9a2c070
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidator.java
@@ -0,0 +1,654 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.validation;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.AnnotationInfo;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.IncrementalReporter;
+import org.eclipse.wst.validation.internal.core.IMessageAccess;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IProjectValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
+import org.eclipse.wst.xml.core.internal.validation.AnnotationMsg;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A DelegatingReconcileValidator calls its delegate validator to get a list
+ * of validation error IMessages. Using information in this IMessage the
+ * DelegatingReconcileValidator updates the IMessage with an offset and length
+ * to give a good range to be "squiggled" and adds the messages to the
+ * IReporter
+ * 
+ * @author Mark Hutchinson
+ * 
+ */
+public abstract class DelegatingSourceValidator implements IValidator {
+	// the selection strategies:
+	protected static final String ALL_ATTRIBUTES = "ALL_ATTRIBUTES"; //$NON-NLS-1$
+	protected static final String ATTRIBUTE_NAME = "ATTRIBUTE_NAME"; //$NON-NLS-1$
+	protected static final String ATTRIBUTE_VALUE = "ATTRIBUTE_VALUE"; //$NON-NLS-1$
+	protected static final String START_TAG = "START_TAG"; //$NON-NLS-1$
+	protected static final String TEXT = "TEXT"; //$NON-NLS-1$
+	protected static final String FIRST_NON_WHITESPACE_TEXT = "FIRST_NON_WHITESPACE_TEXT"; //$NON-NLS-1$
+	protected static final String TEXT_ENTITY_REFERENCE = "TEXT_ENTITY_REFERENCE"; //$NON-NLS-1$
+	protected static final String VALUE_OF_ATTRIBUTE_WITH_GIVEN_VALUE = "VALUE_OF_ATTRIBUTE_WITH_GIVEN_VALUE"; //$NON-NLS-1$
+	protected static final String END_TAG = "END_TAG"; //$NON-NLS-1$
+	private static final String QUICKASSISTPROCESSOR = IQuickAssistProcessor.class.getName();
+	
+
+
+	/**
+	 * This constant specifies the attribute name that specifies the side of
+	 * the 'start tag' that the validator has used to report an error. A
+	 * validator may choose to report a message at the left (the start of the
+	 * start tag)or at the right (the end of the start tag). When this
+	 * attribute is not specified error ERROR_SIDE_LEFT is the default.
+	 */
+	protected static final String ERROR_SIDE = "ERROR_SIDE"; //$NON-NLS-1$
+
+	/**
+	 * When the ERROR_SIDE attribute specifies the ERROR_SIDE_LEFT value it is
+	 * assumed that the message specifies a location to the left of the start
+	 * tag
+	 */
+	protected static final String ERROR_SIDE_LEFT = "ERROR_SIDE_LEFT"; //$NON-NLS-1$	
+
+	/**
+	 * When the ERROR_SIDE attribute specifies the ERROR_SIDE_RIGHT value it
+	 * is assumed that the message specifies a location to the right of the
+	 * start tag
+	 */
+	protected static final String ERROR_SIDE_RIGHT = "ERROR_SIDE_RIGHT"; //$NON-NLS-1$	
+
+	protected static final String COLUMN_NUMBER_ATTRIBUTE = "columnNumber"; //$NON-NLS-1$
+	protected static final String SQUIGGLE_SELECTION_STRATEGY_ATTRIBUTE = "squiggleSelectionStrategy"; //$NON-NLS-1$
+	protected static final String SQUIGGLE_NAME_OR_VALUE_ATTRIBUTE = "squiggleNameOrValue"; //$NON-NLS-1$
+
+	public DelegatingSourceValidator() {
+		super(); // constructor
+	}
+
+	public void cleanup(IReporter arg0) { // don't need to implement
+	}
+
+	// My Implementation of IHelper
+	class MyHelper implements IProjectValidationContext {
+		InputStream inputStream;
+
+		IFile file;
+
+		public MyHelper(InputStream inputStream, IFile file) {
+			this.inputStream = inputStream;
+			this.file = file;
+		}
+
+		public int getBuildKind() {
+			return 0;
+		}
+
+		public Object loadModel(String symbolicName, Object[] parms) {
+			if (symbolicName.equals("getFile")) { //$NON-NLS-1$
+				return file;
+			}
+			return null;
+		}
+
+		public Object loadModel(String symbolicName) {
+			if (symbolicName.equals("inputStream")) { //$NON-NLS-1$
+				return inputStream;
+			}
+			return null;
+		}
+
+		public String[] getURIs() {
+			if (file != null) {
+				return new String[]{file.getFullPath().toString()};
+			}
+			return new String[0];
+		}
+
+		public IProject getProject() {
+			if (file != null) {
+				return file.getProject();
+			}
+			return null;
+		}
+	}
+
+	// My Implementation of IReporter
+	class MyReporter implements IReporter {
+		List list = new ArrayList();
+
+		public MyReporter() {
+			super();
+		}
+
+		public void addMessage(IValidator origin, IMessage message) {
+			list.add(message);
+		}
+
+		public void displaySubtask(IValidator validator, IMessage message) {
+			/* do not need to implement */
+		}
+
+		public IMessageAccess getMessageAccess() {
+			return null;
+		}
+
+		public boolean isCancelled() {
+			return false;
+		}
+
+		public void removeAllMessages(IValidator origin, Object object) { // do
+			/* do not need to implement */
+		}
+
+		public void removeAllMessages(IValidator origin) {
+			/* do not need to implement */
+		}
+
+		public void removeMessageSubset(IValidator validator, Object obj, String groupName) {// do
+			/* do not need to implement */
+		}
+
+		public List getMessages() {
+			return list;
+		}
+	}
+
+	protected abstract IValidator getDelegateValidator();
+
+	/**
+	 * Calls a delegate validator getting and updates it's list of
+	 * ValidationMessages with a good squiggle offset and length.
+	 * 
+	 * @param helper
+	 *            loads an object.
+	 * @param reporter
+	 *            Is an instance of an IReporter interface, which is used for
+	 *            interaction with the user.
+	 */
+	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
+		String[] delta = helper.getURIs();
+		if (delta.length > 0) {
+			// get the file, model and document:
+			IFile file = getFile(delta[0]);
+			IDOMModel xmlModel = null;
+			if (file != null)
+				xmlModel = getModelForResource(file);
+			// some problem occurred, abort
+			if (xmlModel == null)
+				return;
+			
+			try {
+				IDOMDocument document = xmlModel.getDocument();
+
+				// store the text in a byte array; make a full copy to ease
+				// any threading problems
+				byte[] byteArray;
+				try {
+					byteArray = xmlModel.getStructuredDocument().get().getBytes("UTF-8");
+				}
+				catch (UnsupportedEncodingException e) {
+					// Not likely to happen
+					byteArray = xmlModel.getStructuredDocument().get().getBytes();
+				}
+
+				if (isDelegateValidatorEnabled(file)) {
+					IValidator validator = getDelegateValidator();
+					if (validator != null) {
+						// Validate the file:
+						IValidationContext vHelper = new MyHelper(new ByteArrayInputStream(byteArray), file);
+						MyReporter vReporter = new MyReporter();
+						if (validator instanceof IValidatorJob) {
+							((IValidatorJob) validator).validateInJob(vHelper, vReporter);
+						}
+						else {
+							validator.validate(vHelper, vReporter);
+						}
+						List messages = vReporter.list;
+
+						// set the offset and length
+						updateValidationMessages(messages, document, reporter);
+					}
+				}
+			}
+
+
+			finally {
+				if (xmlModel != null) {
+					xmlModel.releaseFromRead();
+				}
+			}
+		}
+	}
+
+	/**
+	 * iterates through the messages and calculates a "better" offset and
+	 * length
+	 * 
+	 * @param messages -
+	 *            a List of IMessages
+	 * @param document -
+	 *            the document
+	 * @param reporter -
+	 *            the reporter the messages are to be added to
+	 */
+	protected void updateValidationMessages(List messages, IDOMDocument document, IReporter reporter) {
+		for (int i = 0; i < messages.size(); i++) {
+			IMessage message = (IMessage) messages.get(i);
+			try {
+				if (message.getAttribute(COLUMN_NUMBER_ATTRIBUTE) != null) {
+					int column = ((Integer) message.getAttribute(COLUMN_NUMBER_ATTRIBUTE)).intValue();
+					if (message.getAttribute(AnnotationMsg.PROBMLEM_ID) != null && reporter instanceof IncrementalReporter){
+						Integer problemId = (Integer)message.getAttribute(AnnotationMsg.PROBMLEM_ID);
+						MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+						processor.setProblemId(problemId.intValue());
+						message.setOffset(column);
+						Integer length = (Integer) message.getAttribute(AnnotationMsg.LENGTH);
+						message.setLength( length.intValue());
+						Object attrValue = message.getAttribute(AnnotationMsg.ATTRVALUETEXT);
+						if (attrValue != null)
+							processor.setAdditionalFixInfo(attrValue);
+						else{
+							Object attrValueNo = message.getAttribute(AnnotationMsg.ATTRVALUENO);
+							if (attrValueNo != null){
+								int len = ((Integer)attrValueNo).intValue();
+								Object[] objArray = new Object[len];
+								for ( int j=0; j<len; j++){
+									objArray[j] = message.getAttribute(AnnotationMsg.ATTRNO + j);
+								}
+								processor.setAdditionalFixInfo(objArray);
+							}
+							
+						}
+						message.setAttribute(QUICKASSISTPROCESSOR, processor);
+						AnnotationInfo info = new AnnotationInfo(message);
+						((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+					}
+					else  {
+						String selectionStrategy = (String) message.getAttribute(SQUIGGLE_SELECTION_STRATEGY_ATTRIBUTE);
+						String nameOrValue = (String) message.getAttribute(SQUIGGLE_NAME_OR_VALUE_ATTRIBUTE);
+
+						// convert the line and Column numbers to an offset:
+						int start = document.getStructuredDocument().getLineOffset(message.getLineNumber() - 1) + column - 1;
+						int[] result = computeStartAndEndLocation(start, selectionStrategy, getErrorSide(message), nameOrValue, document);
+						if (result != null) {
+							message.setOffset(result[0]);
+							message.setLength(result[1] - result[0]);
+						
+							reporter.addMessage(this, message);
+						}
+					}
+					}
+				
+			}
+			catch (BadLocationException e) { // this exception should not
+				// occur - it is thrown if
+				// trying to convert an
+				// invalid line number to and
+				// offset
+			}
+
+		}
+	}
+
+	/**
+	 * @param delta
+	 *            the IFileDelta containing the file name to get
+	 * @return the IFile
+	 */
+	public IFile getFile(String delta) {
+		IPath path = new Path(delta);
+		if (path.segmentCount() > 1) {
+		  IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+		  if (file != null && file.exists())
+		    return file;
+		}
+		return null;
+	}
+
+	/**
+	 * 
+	 * @param file
+	 *            the file to get the model for
+	 * @return the file's XMLModel or null
+	 */
+	protected IDOMModel getModelForResource(IFile file) {
+		IStructuredModel model = null;
+		IModelManager manager = StructuredModelManager.getModelManager();
+
+		try {
+			model = manager.getModelForRead(file);
+			// TODO.. HTML validator tries again to get a model a 2nd way
+		}
+		catch (Exception e) {
+			Logger.log(Logger.ERROR_DEBUG, file.getFullPath().toString(), e);
+		}
+
+		if (model instanceof IDOMModel)
+			return (IDOMModel) model;
+		if (model != null)
+			model.releaseFromRead();
+		return null;
+	}
+
+	/**
+	 * @deprecated use computeStartEndLocation(int startOffset, String
+	 *             errorMessage, String selectionStrategy, boolean leftError,
+	 *             String nameOrValue, IDOMDocument document) {
+	 * 
+	 */
+	protected int[] computeStartEndLocation(int startOffset, String errorMessage, String selectionStrategy, String nameOrValue, IDOMDocument document) {
+		return computeStartAndEndLocation(startOffset, selectionStrategy, ERROR_SIDE_RIGHT, nameOrValue, document);
+	}
+
+	/**
+	 * Calculates the "better" offsets.
+	 * 
+	 * @param startOffset -
+	 *            the offset given by Xerces
+	 * @param errorMessage -
+	 *            the Xerces error Message
+	 * @param selectionStrategy -
+	 *            the selectionStrategy
+	 * @param document -
+	 *            the document
+	 * @return int[] - position 0 has the start offset of the squiggle range,
+	 *         position 1 has the endOffset
+	 */
+	/*
+	 * The way the offsets is calculated is: - find the indexed region
+	 * (element) closest to the given offset - if we are between two elements,
+	 * choosing left or right element will depend on parameter 'errorSide' -
+	 * based on the selectionStrategy choose the underlining strategy (eg
+	 * START_TAG means underline the start tag of that element) - use
+	 * information from nameOrValue and the DOM to get better offsets
+	 * 
+	 */
+	protected int[] computeStartAndEndLocation(int startOffset, String selectionStrategy, String errorSide, String nameOrValue, IDOMDocument document) {
+		try {
+			int startEndPositions[] = new int[2];
+
+			IndexedRegion region = document.getModel().getIndexedRegion(startOffset);
+			IndexedRegion prevRegion = document.getModel().getIndexedRegion(startOffset - 1);
+
+			if (prevRegion != region) {
+				// if between two regions we use the 'errorSide' to understand
+				// which
+				// element is applicable. if we know the error has been
+				// reported to the
+				// right of the tag, then we can assume we need to step back
+				// to the previous
+				// region to land at the 'correct location. Otherwise assume
+				// we're
+				// exactly where we need to be.
+				if (ERROR_SIDE_LEFT.equals(errorSide)) {
+					region = prevRegion;
+				}
+			}
+
+			// initialize start and end positions to be the start positions
+			// this means if the
+			// special case is not taken care of below the start and end
+			// offset are set to be
+			// the start of the region where the error was
+			if (region != null) {
+				startEndPositions[0] = region.getStartOffset();
+				startEndPositions[1] = startEndPositions[0];
+			}
+			else { // this will message will not get added to the IReporter
+				// since the length is 0
+				startEndPositions[0] = 0;
+				startEndPositions[1] = 0;
+			}
+			if (region instanceof Node) {
+				Node node = (Node) region;
+
+				if (START_TAG.equals(selectionStrategy)) {// then we want to
+					// underline the opening tag
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						IDOMElement element = (IDOMElement) node;
+						startEndPositions[0] = element.getStartOffset() + 1;
+						startEndPositions[1] = startEndPositions[0] + element.getTagName().length();
+					}
+				}
+				else if (END_TAG.equals(selectionStrategy)) {// then we want to
+					// underline the end tag
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						IDOMElement element = (IDOMElement) node;
+						startEndPositions[0] = element.getEndStartOffset();
+						startEndPositions[1] = element.getEndOffset();
+					}
+				}
+				else if (ATTRIBUTE_NAME.equals(selectionStrategy)) { // in
+					// underline the attribute's name
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						IDOMElement element = (IDOMElement) node;
+						IDOMNode attributeNode = (IDOMNode) (element.getAttributeNode(nameOrValue));
+						if (attributeNode != null) {
+							startEndPositions[0] = attributeNode.getStartOffset();
+							startEndPositions[1] = attributeNode.getStartOffset() + nameOrValue.length();
+						}
+					}
+				}
+				else if (ATTRIBUTE_VALUE.equals(selectionStrategy)) {
+					// underline the attribute's value
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						IDOMElement element = (IDOMElement) node;
+						IDOMAttr attributeNode = (IDOMAttr) (element.getAttributeNode(nameOrValue));
+						if (attributeNode != null) {
+							startEndPositions[0] = attributeNode.getValueRegionStartOffset();
+							String valueRegionText = attributeNode.getValueRegionText();
+							int valueRegionLength = valueRegionText == null ? 0 : valueRegionText.length(); 
+							startEndPositions[1] = startEndPositions[0] + valueRegionLength;
+						}
+					}
+				}
+				else if (ALL_ATTRIBUTES.equals(selectionStrategy)) {
+					// underline all attributes
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						IDOMElement element = (IDOMElement) node;
+						NamedNodeMap attributes = element.getAttributes();
+						if (attributes != null) {
+							IDOMNode first = (IDOMNode) attributes.item(0);
+							IDOMNode last = (IDOMNode) attributes.item(attributes.getLength() - 1);
+							if ((first != null) && (last != null)) {
+								startEndPositions[0] = first.getStartOffset();
+								startEndPositions[1] = last.getEndOffset();
+							}
+						}
+					}
+				}
+				else if (TEXT.equals(selectionStrategy)) {
+					// underline the text between the tags
+					if (node.getNodeType() == Node.TEXT_NODE) {
+						IDOMText textNode = (IDOMText) node;
+						int start = textNode.getStartOffset();
+						String value = textNode.getNodeValue();
+						int index = 0;
+						char curChar = value.charAt(index);
+						// here we are finding start offset by skipping over
+						// whitespace:
+						while ((curChar == '\n') || (curChar == '\t') || (curChar == '\r') || (curChar == ' ')) {
+							curChar = value.charAt(index);
+							index++;
+						}
+						if (index > 0) {
+							index--;
+
+						}
+						start = start + index;
+						startEndPositions[0] = start;
+						startEndPositions[1] = start + value.trim().length();
+					}
+					else if (node.getNodeType() == Node.ELEMENT_NODE) {
+						IDOMElement element = (IDOMElement) node;
+						Node child = element.getFirstChild();
+						if (child instanceof IDOMNode) {
+							IDOMNode xmlChild = ((IDOMNode) child);
+							startEndPositions[0] = xmlChild.getStartOffset();
+							startEndPositions[1] = xmlChild.getEndOffset();
+						}
+					}
+				}
+				else if (FIRST_NON_WHITESPACE_TEXT.equals(selectionStrategy)) {
+					// search through all child nodes and return range of
+					// first non-whitespace
+					// text node
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						NodeList nodes = node.getChildNodes();
+						for (int i = 0; i < nodes.getLength(); i++) {
+							Node currentNode = nodes.item(i);
+							if (currentNode.getNodeType() == Node.TEXT_NODE) {
+								// TODO (Trung) I don't think we should call
+								// getNodeValue(), trim(), length()
+								// repeatedly.
+								// This is inefficient, to improve use local
+								// variables to store values.
+								IDOMText textNode = (IDOMText) currentNode;
+								if (textNode.getNodeValue().trim().length() > 0) {
+									String value = textNode.getNodeValue();
+									int index = 0;
+									int start = textNode.getStartOffset();
+									char curChar = value.charAt(index);
+									// here we are finding start offset by
+									// skipping over whitespace:
+									while ((curChar == '\n') || (curChar == '\t') || (curChar == '\r') || (curChar == ' ')) {
+										curChar = value.charAt(index);
+										index++;
+									}
+									if (index > 0) {
+										index--;
+
+									}
+									start = start + index;
+									startEndPositions[0] = start;
+									startEndPositions[1] = start + value.trim().length();
+									break;
+								}
+							}
+
+						}
+					}
+				}
+
+				else if (TEXT_ENTITY_REFERENCE.equals(selectionStrategy)) {
+					if (node.getNodeType() == Node.ENTITY_REFERENCE_NODE) {
+						startEndPositions[0] = region.getStartOffset();
+						startEndPositions[1] = region.getEndOffset();
+					}
+					else if (node.getNodeType() == Node.ELEMENT_NODE) {
+						/*
+						 * In this case the undeclared entity might be in one
+						 * of the attribute values. Search through the
+						 * attributes to find the range of the undeclared
+						 * entity.
+						 */
+						String entity = "&" + nameOrValue + ";"; //$NON-NLS-1$ //$NON-NLS-2$
+						NamedNodeMap attributes = node.getAttributes();
+						for (int i = 0; i < attributes.getLength(); i++) {
+							IDOMAttr attr = (IDOMAttr) attributes.item(i);
+							String nodeValue = attr.getNodeValue();
+							int index = nodeValue.indexOf(entity);
+							if (index != -1) {
+								startEndPositions[0] = attr.getValueRegionStartOffset() + index + 1;
+								startEndPositions[1] = startEndPositions[0] + entity.length();
+							}
+						}
+					}
+
+				}
+				else if (VALUE_OF_ATTRIBUTE_WITH_GIVEN_VALUE.equals(selectionStrategy)) {
+					// TODO (Trung) do we really need this strategy ?
+					// If we know the name of the name of the attribute, we
+					// can retrieve its value.
+					// Hence, we can incoperate this strategy with
+					// ATTRIBUTE_VALUE ?
+					if (node.getNodeType() == Node.ELEMENT_NODE) {
+						// here we will search through all attributes for the
+						// one with the
+						// with the value we want:
+						// TODO (Trung) I see a potential problem here.
+						// What happens when there is another attribute having
+						// the same value
+						// with this attribute's buggy value ?
+						// Need to solve when time permits.
+						NamedNodeMap attributes = node.getAttributes();
+						for (int i = 0; i < attributes.getLength(); i++) {
+							IDOMAttr attr = (IDOMAttr) attributes.item(i);
+							String nodeValue = attr.getNodeValue().trim();
+							if (nodeValue.equals(nameOrValue)) {
+								startEndPositions[0] = attr.getValueRegionStartOffset() + 1;
+								startEndPositions[1] = startEndPositions[0] + nodeValue.length();
+								break;
+							}
+						}
+					}
+				}
+			}
+			return startEndPositions;
+		}
+		// catch (Exception e) { // e.printStackTrace();
+		// }
+		finally {
+		}
+		// return null;
+	}
+
+	/**
+	 * Returns true if delegate validator is enabled based on Validation
+	 * preferences
+	 * 
+	 * @param file
+	 * @return false if delegate validator is not enabled based on Validatoin
+	 *         preferences, true otherwise
+	 */
+	protected boolean isDelegateValidatorEnabled(IFile file) {
+		return true;
+	}
+
+	protected String getErrorSide(IMessage message) {
+		// note that if the ERROR_SIDE is unspecified we return the default
+		// value ERROR_SIDE_LEFT
+		Object value = message.getAttribute(ERROR_SIDE);
+		return ERROR_SIDE_RIGHT.equals(value) ? ERROR_SIDE_RIGHT : ERROR_SIDE_LEFT;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidatorForXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidatorForXML.java
new file mode 100644
index 0000000..414a85b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidatorForXML.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xml.ui.internal.validation;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.wst.validation.ValidationFramework;
+import org.eclipse.wst.validation.Validator;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This performs as you type validation for XML files
+ */
+public class DelegatingSourceValidatorForXML extends DelegatingSourceValidator
+{
+  private final static String Id = "org.eclipse.wst.xml.core.xml"; //$NON-NLS-1$
+
+  private Validator _validator;
+
+  public DelegatingSourceValidatorForXML()
+  {
+  }
+
+  private Validator getValidator()
+  {
+    if (_validator == null)
+      _validator = ValidationFramework.getDefault().getValidator(Id);
+    return _validator;
+  }
+
+  protected IValidator getDelegateValidator()
+  {
+    Validator v = getValidator();
+    if (v == null)
+      return null;
+    return v.asIValidator();
+  }
+
+  protected boolean isDelegateValidatorEnabled(IFile file)
+  {
+    Validator v = getValidator();
+    if (v == null)
+      return false;
+    if (!v.shouldValidate(file, false, false))
+      return false;
+    return v.isBuildValidation() || v.isManualValidation();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/MarkupQuickAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/MarkupQuickAssistProcessor.java
new file mode 100644
index 0000000..c5bb299
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/MarkupQuickAssistProcessor.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.validation;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xml.core.internal.validation.ProblemIDsXML;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.correction.RemoveUnknownElementQuickFixProposal;
+import org.eclipse.wst.xml.ui.internal.correction.RenameInFileQuickAssistProposal;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
+import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
+
+/**
+ * Quick assist processor for problems found by the markup validator
+ */
+class MarkupQuickAssistProcessor implements IQuickAssistProcessor {
+	private int fProblemId;
+	private Object fAdditionalFixInfo = null;
+
+	public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
+		return false;
+	}
+
+	public boolean canFix(Annotation annotation) {
+		boolean result = false;
+
+		switch (fProblemId) {
+			case ProblemIDsXML.EmptyTag :
+			case ProblemIDsXML.MissingEndTag :
+			case ProblemIDsXML.AttrsInEndTag :
+			case ProblemIDsXML.MissingAttrValue :
+			case ProblemIDsXML.NoAttrValue :
+			case ProblemIDsXML.SpacesBeforeTagName :
+			case ProblemIDsXML.SpacesBeforePI :
+			case ProblemIDsXML.NamespaceInPI :
+			case ProblemIDsXML.UnknownElement :
+			case ProblemIDsXML.UnknownAttr :
+			case ProblemIDsXML.InvalidAttrValue :
+			case ProblemIDsXML.MissingRequiredAttr :
+			case ProblemIDsXML.AttrValueNotQuoted :
+			case ProblemIDsXML.MissingClosingBracket :
+				result = true;
+		}
+
+		return result;
+	}
+
+	public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext invocationContext) {
+		ArrayList proposals = new ArrayList();
+
+		switch (fProblemId) {
+			case ProblemIDsXML.EmptyTag :
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_0, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.MissingEndTag :
+				String tagName = (String) ((Object[]) fAdditionalFixInfo)[0];
+				String tagClose = (String) ((Object[]) fAdditionalFixInfo)[1];
+				int tagCloseOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[2]).intValue();
+				int startTagEndOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[3]).intValue();
+				int firstChildStartOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[4]).intValue();
+				int endOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[5]).intValue();
+				proposals.add(new CompletionProposal(tagClose, tagCloseOffset, 0, 0, getImage(), XMLUIMessages.QuickFixProcessorXML_1, null, "")); //$NON-NLS-1$ 
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), startTagEndOffset - invocationContext.getOffset(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_2, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				proposals.add(new CompletionProposal("</" + tagName + ">", firstChildStartOffset, 0, 0, getImage(), XMLUIMessages.QuickFixProcessorXML_3, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+				proposals.add(new CompletionProposal("</" + tagName + ">", endOffset, 0, 0, getImage(), XMLUIMessages.QuickFixProcessorXML_4, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+				break;
+			case ProblemIDsXML.AttrsInEndTag :
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_5, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.MissingAttrValue :
+				String defaultAttrValue = (String) ((Object[]) fAdditionalFixInfo)[0];
+				int insertOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[1]).intValue();
+				proposals.add(new CompletionProposal("\"" + defaultAttrValue + "\"", invocationContext.getOffset() + invocationContext.getLength() + insertOffset, 0, defaultAttrValue.length() + 2, getImage(), XMLUIMessages.QuickFixProcessorXML_6, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_7, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.NoAttrValue :
+				defaultAttrValue = (String) fAdditionalFixInfo;
+				proposals.add(new CompletionProposal("=\"" + defaultAttrValue + "\"", invocationContext.getOffset() + invocationContext.getLength(), 0, defaultAttrValue.length() + 3, getImage(), XMLUIMessages.QuickFixProcessorXML_6, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_7, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.SpacesBeforeTagName :
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_8, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.SpacesBeforePI :
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_9, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.NamespaceInPI :
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_10, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.UnknownElement :
+				proposals.add(new RemoveUnknownElementQuickFixProposal(fAdditionalFixInfo, getImage(), XMLUIMessages.QuickFixProcessorXML_11));
+				proposals.add(new RenameInFileQuickAssistProposal());
+				break;
+			case ProblemIDsXML.UnknownAttr :
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_7, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				proposals.add(new RenameInFileQuickAssistProposal());
+				break;
+			case ProblemIDsXML.InvalidAttrValue :
+				proposals.add(new CompletionProposal("", invocationContext.getOffset(), invocationContext.getLength(), 0, getImage(), XMLUIMessages.QuickFixProcessorXML_12, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+			case ProblemIDsXML.MissingRequiredAttr :
+				String requiredAttr = (String) ((Object[]) fAdditionalFixInfo)[0];
+				insertOffset = ((Integer) ((Object[]) fAdditionalFixInfo)[1]).intValue();
+				proposals.add(new CompletionProposal(requiredAttr, invocationContext.getOffset() + insertOffset, 0, requiredAttr.length(), getImage(), XMLUIMessages.QuickFixProcessorXML_13, null, "")); //$NON-NLS-1$ 
+				break;
+			case ProblemIDsXML.AttrValueNotQuoted :
+				String attrValue = (String) fAdditionalFixInfo;
+				proposals.add(new CompletionProposal("\"" + attrValue + "\"", invocationContext.getOffset(), invocationContext.getLength(), attrValue.length() + 2, getImage(), XMLUIMessages.QuickFixProcessorXML_14, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+				break;
+			case ProblemIDsXML.MissingClosingBracket :
+				proposals.add(new CompletionProposal(">", invocationContext.getOffset() + invocationContext.getLength(), 0, 1, getImage(), XMLUIMessages.QuickFixProcessorXML_15, null, "")); //$NON-NLS-1$ //$NON-NLS-2$ 
+				break;
+		}
+		return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
+	}
+
+	public String getErrorMessage() {
+		return null;
+	}
+
+	private Image getImage() {
+		return XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_CORRECTION_CHANGE);
+	}
+
+	public void setProblemId(int problemId) {
+		fProblemId = problemId;
+	}
+
+	public void setAdditionalFixInfo(Object fixInfo) {
+		fAdditionalFixInfo = fixInfo;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/MarkupValidator.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/MarkupValidator.java
new file mode 100644
index 0000000..d228699
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/MarkupValidator.java
@@ -0,0 +1,1042 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.internal.validation;
+
+import java.util.Locale;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceProxy;
+import org.eclipse.core.resources.IResourceProxyVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy;
+import org.eclipse.wst.sse.ui.internal.reconcile.ReconcileAnnotationKey;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.AnnotationInfo;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.IncrementalReporter;
+import org.eclipse.wst.validation.AbstractValidator;
+import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.ValidationState;
+import org.eclipse.wst.validation.internal.core.Message;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
+import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.eclipse.wst.xml.core.internal.validation.ProblemIDsXML;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.w3c.dom.Node;
+
+/**
+ * Basic XML syntax checking step.
+ * @deprecated No longer used as the source validator for XML documents. Instead {@link DelegatingSourceValidatorForXML}
+ * is the source validator, and the markup validation is done as a step in {@link XMLValidator} by {@link org.eclipse.wst.xml.core.internal.validation.MarkupValidator}.
+ * 
+ *  @see org.eclipse.wst.xml.core.internal.validation.MarkupValidator
+ *  @see DelegatingSourceValidatorForXML
+ *  @see XMLValidator
+ */
+public class MarkupValidator extends AbstractValidator implements IValidator, ISourceValidator {
+	private String DQUOTE = "\""; //$NON-NLS-1$
+	private String SQUOTE = "'"; //$NON-NLS-1$
+	private final String QUICKASSISTPROCESSOR = IQuickAssistProcessor.class.getName();
+
+	private IDocument fDocument;
+
+	private IContentType fRootContentType = null;
+
+    private int SEVERITY_ATTRIBUTE_HAS_NO_VALUE = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_END_TAG_WITH_ATTRIBUTES = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_INVALID_WHITESPACE_BEFORE_TAGNAME = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_MISSING_CLOSING_BRACKET = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_MISSING_CLOSING_QUOTE = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_MISSING_END_TAG = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_MISSING_START_TAG = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_MISSING_QUOTES = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_NAMESPACE_IN_PI_TARGET = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_TAG_NAME_MISSING = IMessage.HIGH_SEVERITY;
+	private int SEVERITY_WHITESPACE_AT_START = IMessage.HIGH_SEVERITY;
+        
+	private void addAttributeError(String messageText, String attributeValueText, int start, int length, int problemId, IStructuredDocumentRegion sdRegion, IReporter reporter, int messageSeverity) {
+
+		if (sdRegion.isDeleted()) {
+			return;
+		}
+
+		int lineNo = getLineNumber(start);
+		LocalizedMessage message = new LocalizedMessage(messageSeverity, messageText);
+		message.setOffset(start);
+		message.setLength(length);
+		message.setLineNo(lineNo);
+
+
+		if (reporter instanceof IncrementalReporter) {
+			MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+			processor.setProblemId(problemId);
+			processor.setAdditionalFixInfo(attributeValueText);
+			message.setAttribute(QUICKASSISTPROCESSOR, processor);
+			AnnotationInfo info = new AnnotationInfo(message);
+			((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+		}
+		else {
+			reporter.addMessage(this, message);
+		}
+	}
+
+	private void checkAttributesInEndTag(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		ITextRegionList textRegions = structuredDocumentRegion.getRegions();
+		int errorCount = 0;
+		int start = structuredDocumentRegion.getEndOffset();
+		int end = structuredDocumentRegion.getEndOffset();
+		for (int i = 0; (i < textRegions.size()) && (errorCount < AbstractStructuredTextReconcilingStrategy.ELEMENT_ERROR_LIMIT) && !structuredDocumentRegion.isDeleted(); i++) {
+			ITextRegion textRegion = textRegions.get(i);
+			if ((textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) || (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) || (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
+				if (start > structuredDocumentRegion.getStartOffset(textRegion)) {
+					start = structuredDocumentRegion.getStartOffset(textRegion);
+				}
+				end = structuredDocumentRegion.getEndOffset(textRegion);
+				errorCount++;
+			}
+		}
+		// create one error for all attributes in the end tag
+		if (errorCount > 0) {
+			// Position p = new Position(start, end - start);
+			String messageText = XMLUIMessages.End_tag_has_attributes;
+			LocalizedMessage message = new LocalizedMessage(SEVERITY_END_TAG_WITH_ATTRIBUTES, messageText);
+			message.setOffset(start);
+			message.setLength(end - start);
+			message.setLineNo(getLineNumber(start));
+
+			if (reporter instanceof IncrementalReporter) {
+				MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+				processor.setProblemId(ProblemIDsXML.AttrsInEndTag);
+				message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+				AnnotationInfo info = new AnnotationInfo(message);
+				((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+			}
+			else {
+				reporter.addMessage(this, message);
+			}
+		}
+	}
+
+
+	private void checkClosingBracket(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		ITextRegion r = null;
+		boolean closed = false;
+		for (int i = 0; (i < regions.size()) && !structuredDocumentRegion.isDeleted(); i++) {
+			r = regions.get(i);
+			if ((r.getType() == DOMRegionContext.XML_TAG_CLOSE) || (r.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE)) {
+				closed = true;
+			}
+		}
+		if (!closed) {
+
+			String messageText = XMLUIMessages.ReconcileStepForMarkup_6;
+
+			int start = structuredDocumentRegion.getStartOffset();
+			int length = structuredDocumentRegion.getText().trim().length();
+			int lineNo = getLineNumber(start);
+
+			LocalizedMessage message = new LocalizedMessage(SEVERITY_MISSING_CLOSING_BRACKET , messageText);
+			message.setOffset(start);
+			message.setLength(length);
+			message.setLineNo(lineNo);
+
+			if (reporter instanceof IncrementalReporter) {
+				MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+				processor.setProblemId(ProblemIDsXML.MissingClosingBracket);
+				message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+				AnnotationInfo info = new AnnotationInfo(message);
+				((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+			}
+			else {
+				reporter.addMessage(this, message);
+			}
+		}
+	}
+
+	private void checkEmptyTag(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		// navigate to name
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		if (regions.size() == 2) {
+			// missing name region
+			if ((regions.get(0).getType() == DOMRegionContext.XML_TAG_OPEN) && (regions.get(1).getType() == DOMRegionContext.XML_TAG_CLOSE)) {
+				String messageText = XMLUIMessages.ReconcileStepForMarkup_3;
+				int start = structuredDocumentRegion.getStartOffset();
+				int length = structuredDocumentRegion.getLength();
+				int lineNo = getLineNumber(start);
+
+				LocalizedMessage message = new LocalizedMessage(SEVERITY_TAG_NAME_MISSING , messageText);
+				message.setOffset(start);
+				message.setLength(length);
+				message.setLineNo(lineNo);
+
+				if (reporter instanceof IncrementalReporter) {
+					MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+					processor.setProblemId(ProblemIDsXML.EmptyTag);
+					message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+					AnnotationInfo info = new AnnotationInfo(message);
+					((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+				}
+				else {
+					reporter.addMessage(this, message);
+				}
+			}
+		}
+	}
+
+	private int getLineNumber(int start) {
+		int lineNo = -1;
+		try {
+			lineNo = getDocument().getLineOfOffset(start) + 1;
+		}
+		catch (BadLocationException e) {
+			Logger.logException(e);
+		}
+		return lineNo;
+	}
+
+	private void checkForAttributeValue(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		// check for attributes without a value
+		// track the attribute/equals/value sequence using a state of 0, 1 ,2
+		// representing the name, =, and value, respectively
+		int attrState = 0;
+		ITextRegionList textRegions = structuredDocumentRegion.getRegions();
+		// ReconcileAnnotationKey key = createKey(structuredDocumentRegion,
+		// getScope());
+
+		int errorCount = 0;
+		for (int i = 0; (i < textRegions.size()) && (errorCount < AbstractStructuredTextReconcilingStrategy.ELEMENT_ERROR_LIMIT); i++) {
+			ITextRegion textRegion = textRegions.get(i);
+			if ((textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) || isTagCloseTextRegion(textRegion)) {
+				// dangling name and '='
+				if ((attrState == 2) && (i >= 2)) {
+					// create annotation
+					ITextRegion nameRegion = textRegions.get(i - 2);
+					if (!(nameRegion instanceof ITextRegionContainer)) {
+						Object[] args = {structuredDocumentRegion.getText(nameRegion)};
+						String messageText = NLS.bind(XMLUIMessages.Attribute__is_missing_a_value, args);
+
+						int start = structuredDocumentRegion.getStartOffset(nameRegion);
+						int end = structuredDocumentRegion.getEndOffset();
+						int lineNo = getLineNumber(start);
+						int textLength = structuredDocumentRegion.getText(nameRegion).trim().length();
+
+						LocalizedMessage message = new LocalizedMessage(SEVERITY_ATTRIBUTE_HAS_NO_VALUE , messageText);
+						message.setOffset(start);
+						message.setLength(textLength);
+						message.setLineNo(lineNo);
+
+						// quick fix info
+						ITextRegion equalsRegion = textRegions.get(i - 2 + 1);
+						int insertOffset = structuredDocumentRegion.getTextEndOffset(equalsRegion) - end;
+						Object[] additionalFixInfo = {structuredDocumentRegion.getText(nameRegion), new Integer(insertOffset)};
+
+						if (reporter instanceof IncrementalReporter) {
+							MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+							processor.setProblemId(ProblemIDsXML.MissingAttrValue);
+							processor.setAdditionalFixInfo(additionalFixInfo);
+							message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+							AnnotationInfo info = new AnnotationInfo(message);
+							((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+						}
+						else {
+							reporter.addMessage(this, message);
+						}
+						errorCount++;
+					}
+				}
+				// name but no '=' (XML only)
+				else if ((attrState == 1) && (i >= 1)) {
+					// create annotation
+					ITextRegion previousRegion = textRegions.get(i - 1);
+					if (!(previousRegion instanceof ITextRegionContainer)) {
+						Object[] args = {structuredDocumentRegion.getText(previousRegion)};
+						String messageText = NLS.bind(XMLUIMessages.Attribute__has_no_value, args);
+						int start = structuredDocumentRegion.getStartOffset(previousRegion);
+						int textLength = structuredDocumentRegion.getText(previousRegion).trim().length();
+						int lineNo = getLineNumber(start);
+
+						LocalizedMessage message = new LocalizedMessage(SEVERITY_ATTRIBUTE_HAS_NO_VALUE, messageText);
+						message.setOffset(start);
+						message.setLength(textLength);
+						message.setLineNo(lineNo);
+
+						if (reporter instanceof IncrementalReporter) {
+							MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+							processor.setProblemId(ProblemIDsXML.NoAttrValue);
+							processor.setAdditionalFixInfo(structuredDocumentRegion.getText(previousRegion));
+							message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+							AnnotationInfo info = new AnnotationInfo(message);
+							((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+						}
+						else {
+							reporter.addMessage(this, message);
+						}
+
+						errorCount++;
+					}
+				}
+				attrState = 1;
+			}
+			else if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+				attrState = 2;
+			}
+			else if (textRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+				attrState = 0;
+			}
+		}
+
+	}
+
+	private void checkForSpaceBeforeName(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		String sdRegionText = structuredDocumentRegion.getFullText();
+		if (sdRegionText.startsWith(" ")) { //$NON-NLS-1$
+			IStructuredDocumentRegion prev = structuredDocumentRegion.getPrevious();
+			if (prev != null) {
+				// this is possibly the case of "< tag"
+				if ((prev.getRegions().size() == 1) && isStartTag(prev)) {
+					// add the error for preceding space in tag name
+					String messageText = XMLUIMessages.ReconcileStepForMarkup_2;
+					int start = structuredDocumentRegion.getStartOffset();
+					// find length of whitespace
+					int length = sdRegionText.trim().equals("") ? sdRegionText.length() : sdRegionText.indexOf(sdRegionText.trim()); //$NON-NLS-1$
+
+					LocalizedMessage message = new LocalizedMessage(SEVERITY_INVALID_WHITESPACE_BEFORE_TAGNAME , messageText);
+					message.setOffset(start);
+					message.setLength(length);
+					message.setLineNo(getLineNumber(start));
+
+					if (reporter instanceof IncrementalReporter) {
+						MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+						processor.setProblemId(ProblemIDsXML.SpacesBeforeTagName);
+						message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+						AnnotationInfo info = new AnnotationInfo(message);
+						((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+					}
+					else {
+						reporter.addMessage(this, message);
+					}
+				}
+			}
+		}
+	}
+
+	private void checkNoNamespaceInPI(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		// navigate to name
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		ITextRegion r = null;
+		int errorCount = 0;
+		for (int i = 0; (i < regions.size()) && (errorCount < AbstractStructuredTextReconcilingStrategy.ELEMENT_ERROR_LIMIT) && !structuredDocumentRegion.isDeleted(); i++) {
+			r = regions.get(i);
+			if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+				String piText = structuredDocumentRegion.getText(r);
+				int index = piText.indexOf(":"); //$NON-NLS-1$
+				if (index != -1) {
+					String messageText = XMLUIMessages.ReconcileStepForMarkup_4;
+					int start = structuredDocumentRegion.getStartOffset(r) + index;
+					int length = piText.trim().length() - index;
+
+					LocalizedMessage message = new LocalizedMessage(SEVERITY_NAMESPACE_IN_PI_TARGET , messageText);
+					message.setOffset(start);
+					message.setLength(length);
+					message.setLineNo(getLineNumber(start));
+
+					if (reporter instanceof IncrementalReporter) {
+						MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+						processor.setProblemId(ProblemIDsXML.NamespaceInPI);
+						message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+						AnnotationInfo info = new AnnotationInfo(message);
+						((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+					}
+					else {
+						reporter.addMessage(this, message);
+					}
+
+					errorCount++;
+				}
+			}
+		}
+	}
+
+	private void checkQuotesForAttributeValues(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+		ITextRegionList regions = structuredDocumentRegion.getRegions();
+		ITextRegion r = null;
+		String attrValueText = ""; //$NON-NLS-1$
+		int errorCount = 0;
+		for (int i = 0; (i < regions.size()) && (errorCount < AbstractStructuredTextReconcilingStrategy.ELEMENT_ERROR_LIMIT); i++) {
+			r = regions.get(i);
+			if (r.getType() != DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+				continue;
+			}
+
+			attrValueText = structuredDocumentRegion.getText(r);
+			// attribute value includes quotes in the string
+			// split up attribute value on quotes
+			/*
+			 * WORKAROUND till
+			 * http://dev.icu-project.org/cgi-bin/icu-bugs/incoming?findid=5207
+			 * is fixed. (Also see BUG143628)
+			 */
+
+			java.util.StringTokenizer st = new java.util.StringTokenizer(attrValueText, "\"'", true); //$NON-NLS-1$
+			int size = st.countTokens();
+			// get the pieces of the attribute value
+			String one = "", two = ""; //$NON-NLS-1$ //$NON-NLS-2$
+			if (size > 0) {
+				one = st.nextToken();
+			}
+			if (size > 1) {
+				two = st.nextToken();
+			}
+			if (size > 2) {
+				// should be handled by parsing...
+				// as in we can't have an attribute value like: <element
+				// attr="a"b"c"/>
+				// and <element attr='a"b"c' /> is legal
+				continue;
+			}
+
+
+			if (size == 1) {
+				if (one.equals(DQUOTE) || one.equals(SQUOTE)) {
+					// missing closing quote
+					String message = XMLUIMessages.ReconcileStepForMarkup_0;
+					addAttributeError(message, attrValueText, structuredDocumentRegion.getStartOffset(r), attrValueText.trim().length(), ProblemIDsXML.Unclassified, structuredDocumentRegion, reporter, SEVERITY_MISSING_CLOSING_QUOTE);
+					errorCount++;
+				}
+				else {
+					// missing both
+					String message = XMLUIMessages.ReconcileStepForMarkup_1;
+					addAttributeError(message, attrValueText, structuredDocumentRegion.getStartOffset(r), attrValueText.trim().length(), ProblemIDsXML.AttrValueNotQuoted, structuredDocumentRegion, reporter, SEVERITY_MISSING_QUOTES);
+					errorCount++;
+				}
+			}
+			else if (size == 2) {
+				if ((one.equals(SQUOTE) && !two.equals(SQUOTE)) || (one.equals(DQUOTE) && !two.equals(DQUOTE))) {
+					// missing closing quote
+					String message = XMLUIMessages.ReconcileStepForMarkup_0;
+					addAttributeError(message, attrValueText, structuredDocumentRegion.getStartOffset(r), attrValueText.trim().length(), ProblemIDsXML.Unclassified, structuredDocumentRegion, reporter, SEVERITY_MISSING_CLOSING_QUOTE);
+					errorCount++;
+				}
+			}
+		}
+		// end of region for loop
+	}
+
+	private void checkStartEndTagPairs(IStructuredDocumentRegion sdRegion, IReporter reporter) {
+
+		if (sdRegion.isDeleted()) {
+			return;
+		}
+
+		// check start/end tag pairs
+		IDOMNode xmlNode = getXMLNode(sdRegion);
+
+		if (xmlNode == null) {
+			return;
+		}
+
+		boolean selfClosed = false;
+		String tagName = null;
+
+		/**
+		 * For tags that aren't meant to be EMPTY, make sure it's empty or has an end tag
+		 */
+		if (xmlNode.isContainer()) {
+			IStructuredDocumentRegion endRegion = xmlNode.getEndStructuredDocumentRegion();
+			if (endRegion == null) {
+				IStructuredDocumentRegion startRegion = xmlNode.getStartStructuredDocumentRegion();
+				if (startRegion != null && !startRegion.isDeleted() && DOMRegionContext.XML_TAG_OPEN.equals(startRegion.getFirstRegion().getType())) {
+					// analyze the tag (check self closing)
+					ITextRegionList regions = startRegion.getRegions();
+					ITextRegion r = null;
+					int start = sdRegion.getStart();
+					int length = sdRegion.getTextLength();
+					for (int i = 0; i < regions.size(); i++) {
+						r = regions.get(i);
+						if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+							tagName = sdRegion.getText(r);
+							start = sdRegion.getStartOffset(r);
+							length = r.getTextLength();
+						}
+						else if (r.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+							selfClosed = true;
+						}
+					}
+
+
+					if (!selfClosed && (tagName != null)) {
+						Object[] args = {tagName};
+						String messageText = NLS.bind(XMLUIMessages.Missing_end_tag_, args);
+
+						int lineNumber = getLineNumber(start);
+
+						IMessage message = new LocalizedMessage(SEVERITY_MISSING_END_TAG , messageText);
+						message.setOffset(start);
+						message.setLength(length);
+						message.setLineNo(lineNumber);
+
+						if (reporter instanceof IncrementalReporter) {
+							Object[] additionalFixInfo = getStartEndFixInfo(xmlNode, tagName, r);
+
+							MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+							processor.setProblemId(ProblemIDsXML.MissingEndTag);
+							processor.setAdditionalFixInfo(additionalFixInfo);
+							message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+							AnnotationInfo info = new AnnotationInfo(message);
+
+							((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+						}
+						else {
+							reporter.addMessage(this, message);
+						}
+					}
+				}
+			}
+			else {
+				IStructuredDocumentRegion startRegion = xmlNode.getStartStructuredDocumentRegion();
+				if (startRegion == null || startRegion.isDeleted()) {
+					// analyze the tag (check self closing)
+					ITextRegionList regions = endRegion.getRegions();
+					ITextRegion r = null;
+					int start = sdRegion.getStart();
+					int length = sdRegion.getTextLength();
+					for (int i = 0; i < regions.size(); i++) {
+						r = regions.get(i);
+						if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+							tagName = sdRegion.getText(r);
+							start = sdRegion.getStartOffset(r);
+							length = r.getTextLength();
+						}
+					}
+
+					if (tagName != null) {
+						Object[] args = {tagName};
+						String messageText = NLS.bind(XMLUIMessages.Missing_start_tag_, args);
+
+						int lineNumber = getLineNumber(start);
+
+						IMessage message = new LocalizedMessage(SEVERITY_MISSING_START_TAG, messageText);
+						message.setOffset(start);
+						message.setLength(length);
+						message.setLineNo(lineNumber);
+
+						if (reporter instanceof IncrementalReporter) {
+							Object[] additionalFixInfo = getStartEndFixInfo(xmlNode, tagName, r);
+
+							MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+							processor.setProblemId(ProblemIDsXML.MissingStartTag);
+							processor.setAdditionalFixInfo(additionalFixInfo);
+							message.setAttribute(QUICKASSISTPROCESSOR, processor);
+
+							AnnotationInfo info = new AnnotationInfo(message);
+
+							((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+						}
+						else {
+							reporter.addMessage(this, message);
+						}
+					}
+				}
+			}
+
+		}
+		/*
+		 * Check for an end tag that has no start tag
+		 */
+		else {
+			IStructuredDocumentRegion startRegion = xmlNode.getStartStructuredDocumentRegion();
+			if (startRegion == null) {
+				IStructuredDocumentRegion endRegion = xmlNode.getEndStructuredDocumentRegion();
+				if (!endRegion.isDeleted()) {
+					// get name
+					ITextRegionList regions = endRegion.getRegions();
+					ITextRegion r = null;
+					for (int i = 0; i < regions.size(); i++) {
+						r = regions.get(i);
+						if (r.getType() == DOMRegionContext.XML_TAG_NAME) {
+							tagName = sdRegion.getText(r);
+						}
+					}
+
+					if (!selfClosed && (tagName != null)) {
+						String messageText = XMLUIMessages.Indicate_no_grammar_specified_severities_error;
+
+						int start = sdRegion.getStart();
+						int lineNumber = getLineNumber(start);
+
+						// SEVERITY_STRUCTURE == IMessage.HIGH_SEVERITY
+						IMessage message = new LocalizedMessage(IMessage.HIGH_SEVERITY, messageText);
+						message.setOffset(start);
+						message.setLength(sdRegion.getTextLength());
+						message.setLineNo(lineNumber);
+
+						reporter.addMessage(this, message);
+					}
+				}
+			}
+		}
+	}
+
+	private Object[] getStartEndFixInfo(IDOMNode xmlNode, String tagName, ITextRegion r) {
+		// quick fix info
+		String tagClose = "/>"; //$NON-NLS-1$
+		int tagCloseOffset = xmlNode.getFirstStructuredDocumentRegion().getEndOffset();
+		if ((r != null) && (r.getType() == DOMRegionContext.XML_TAG_CLOSE)) {
+			tagClose = "/"; //$NON-NLS-1$
+			tagCloseOffset--;
+		}
+		IDOMNode firstChild = (IDOMNode) xmlNode.getFirstChild();
+		while ((firstChild != null) && (firstChild.getNodeType() == Node.TEXT_NODE)) {
+			firstChild = (IDOMNode) firstChild.getNextSibling();
+		}
+		int endOffset = xmlNode.getEndOffset();
+		int firstChildStartOffset = firstChild == null ? endOffset : firstChild.getStartOffset();
+		Object[] additionalFixInfo = {tagName, tagClose, new Integer(tagCloseOffset), new Integer(xmlNode.getFirstStructuredDocumentRegion().getEndOffset()), // startTagEndOffset
+					new Integer(firstChildStartOffset), // firstChildStartOffset
+					new Integer(endOffset)}; // endOffset
+		return additionalFixInfo;
+	}
+
+	private void checkStartingSpaceForPI(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion.isDeleted()) {
+			return;
+		}
+
+		IStructuredDocumentRegion prev = structuredDocumentRegion.getPrevious();
+		if ((prev != null) && prev.getStartOffset() == 0) {
+			if (prev.getType() == DOMRegionContext.XML_CONTENT) {
+				String messageText = XMLUIMessages.ReconcileStepForMarkup_5;
+				int start = prev.getStartOffset();
+				int length = prev.getLength();
+
+				LocalizedMessage message = new LocalizedMessage(SEVERITY_WHITESPACE_AT_START , messageText);
+				message.setOffset(start);
+				message.setLength(length);
+				message.setLineNo(getLineNumber(start));
+
+				if (reporter instanceof IncrementalReporter) {
+					MarkupQuickAssistProcessor processor = new MarkupQuickAssistProcessor();
+					processor.setProblemId(ProblemIDsXML.SpacesBeforePI);
+					message.setAttribute(QUICKASSISTPROCESSOR, processor);
+	
+					AnnotationInfo info = new AnnotationInfo(message);
+					((IncrementalReporter) reporter).addAnnotationInfo(this, info);
+				}
+				else {
+					reporter.addMessage(this, message);
+				}
+				// Position p = new Position(start, length);
+				//				
+				// ReconcileAnnotationKey key =
+				// createKey(structuredDocumentRegion, getScope());
+				// TemporaryAnnotation annotation = new TemporaryAnnotation(p,
+				// SEVERITY_SYNTAX_ERROR, message, key,
+				// ProblemIDsXML.SpacesBeforePI);
+				// results.add(annotation);
+			}
+		}
+	}
+
+	public int getScope() {
+		return ReconcileAnnotationKey.PARTIAL;
+	}
+
+	private IDOMNode getXMLNode(IStructuredDocumentRegion sdRegion) {
+
+		if (sdRegion == null) {
+			return null;
+		}
+
+		IStructuredModel xModel = null;
+		IDOMNode xmlNode = null;
+		// get/release models should always be in a try/finally block
+		try {
+			xModel = StructuredModelManager.getModelManager().getExistingModelForRead(getDocument());
+			// xModel is sometime null, when closing editor, for example
+			if (xModel != null) {
+				xmlNode = (IDOMNode) xModel.getIndexedRegion(sdRegion.getStart());
+			}
+		}
+		finally {
+			if (xModel != null) {
+				xModel.releaseFromRead();
+			}
+		}
+		return xmlNode;
+	}
+
+	/**
+	 * Determines whether the IStructuredDocumentRegion is a XML "end tag"
+	 * since they're not allowed to have attribute ITextRegions
+	 * 
+	 * @param structuredDocumentRegion
+	 */
+	private boolean isEndTag(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN;
+	}
+
+	/**
+	 * Determines if the IStructuredDocumentRegion is an XML Processing
+	 * Instruction
+	 * 
+	 * @param structuredDocumentRegion
+	 * 
+	 */
+	private boolean isPI(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_PI_OPEN;
+	}
+
+	/**
+	 * Determines whether the IStructuredDocumentRegion is a XML "start tag"
+	 * since they need to be checked for proper XML attribute region sequences
+	 * 
+	 * @param structuredDocumentRegion
+	 * 
+	 */
+	private boolean isStartTag(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN;
+	}
+
+	// Because we check the "proper" closing separately from attribute
+	// sequencing, we need to know what's
+	// an appropriate close.
+	private boolean isTagCloseTextRegion(ITextRegion textRegion) {
+		return (textRegion.getType() == DOMRegionContext.XML_TAG_CLOSE) || (textRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE);
+	}
+
+	/**
+	 * Determines if the IStructuredDocumentRegion is XML Content
+	 * 
+	 * @param structuredDocumentRegion
+	 * 
+	 */
+	private boolean isXMLContent(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_CONTENT;
+	}
+
+	private void setDocument(IDocument doc) {
+		fDocument = doc;
+	}
+
+	private IDocument getDocument() {
+		return fDocument;
+	}
+
+	public void connect(IDocument document) {
+		setDocument(document);
+	}
+
+	public void disconnect(IDocument document) {
+		setDocument(null);
+	}
+
+	public void validate(IRegion dirtyRegion, IValidationContext helper, IReporter reporter) {
+		if (getDocument() == null) {
+			return;
+		}
+		if (!(reporter instanceof IncrementalReporter)) {
+			return;
+		}
+		if (!(getDocument() instanceof IStructuredDocument)) {
+			return;
+		}
+
+		// remove old messages
+		reporter.removeAllMessages(this);
+
+		IStructuredDocumentRegion[] regions = ((IStructuredDocument) fDocument).getStructuredDocumentRegions(dirtyRegion.getOffset(), dirtyRegion.getLength());
+		for (int i = 0; i < regions.length; i++) {
+			validate(regions[i], reporter);
+		}
+	}
+
+	public void validate(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+
+		if (structuredDocumentRegion == null) {
+			return;
+		}
+
+		if (isStartTag(structuredDocumentRegion)) {
+			// check for attributes without a value
+			checkForAttributeValue(structuredDocumentRegion, reporter);
+			// check if started tag is ended
+			checkStartEndTagPairs(structuredDocumentRegion, reporter);
+			// check empty tag <>
+			checkEmptyTag(structuredDocumentRegion, reporter);
+			// check that each attribute has quotes
+			checkQuotesForAttributeValues(structuredDocumentRegion, reporter);
+			// check that the closing '>' is there
+			checkClosingBracket(structuredDocumentRegion, reporter);
+		}
+		else if (isEndTag(structuredDocumentRegion)) {
+			// check if ending tag was started
+			checkStartEndTagPairs(structuredDocumentRegion, reporter);
+			// check for attributes in an end tag
+			checkAttributesInEndTag(structuredDocumentRegion, reporter);
+			// check that the closing '>' is there
+			checkClosingBracket(structuredDocumentRegion, reporter);
+		}
+		else if (isPI(structuredDocumentRegion)) {
+			// check validity of processing instruction
+			checkStartingSpaceForPI(structuredDocumentRegion, reporter);
+			checkNoNamespaceInPI(structuredDocumentRegion, reporter);
+		}
+		else if (isXMLContent(structuredDocumentRegion)) {
+			checkForSpaceBeforeName(structuredDocumentRegion, reporter);
+		}
+		else if (isXMLDoctypeDeclaration(structuredDocumentRegion)) {
+			checkDocumentTypeReferences(structuredDocumentRegion, reporter);
+		}
+	}
+
+	/**
+	 * @param structuredDocumentRegion
+	 * @param reporter
+	 */
+	private void checkDocumentTypeReferences(IStructuredDocumentRegion structuredDocumentRegion, IReporter reporter) {
+	}
+
+	/**
+	 * @param structuredDocumentRegion
+	 * @return
+	 */
+	private boolean isXMLDoctypeDeclaration(IStructuredDocumentRegion structuredDocumentRegion) {
+		if ((structuredDocumentRegion == null) || structuredDocumentRegion.isDeleted()) {
+			return false;
+		}
+		return structuredDocumentRegion.getFirstRegion().getType() == DOMRegionContext.XML_DECLARATION_OPEN && structuredDocumentRegion.getType().equals(DOMRegionContext.XML_DOCTYPE_DECLARATION);
+	}
+
+	public void cleanup(IReporter reporter) {
+		fDocument = null;
+	}
+
+	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
+		String[] uris = helper.getURIs();
+		IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
+		if (uris.length > 0) {
+			IFile currentFile = null;
+
+			for (int i = 0; i < uris.length && !reporter.isCancelled(); i++) {
+				// might be called with just project path?
+				IPath path = new Path(uris[i]);
+				if (path.segmentCount() > 1) {
+					currentFile = wsRoot.getFile(path);
+					if (shouldValidate(currentFile, true)) {
+						validateV1File(currentFile, reporter);
+					}
+				}
+				else if (uris.length == 1) {
+					validateV1Project(helper, reporter);
+				}
+			}
+		}
+		else
+			validateV1Project(helper, reporter);
+	}
+	
+	private boolean shouldValidate(IResourceProxy proxy) {
+		if(proxy.getType() == IResource.FILE) {
+			String name = proxy.getName();
+			if(name.toLowerCase(Locale.US).endsWith(".xml")) {
+				return true;
+			}
+		}
+		return shouldValidate(proxy.requestResource(), false);
+	}
+	
+	private boolean shouldValidate(IResource file, boolean checkExtension) {
+		if (file == null || !file.exists() || file.getType() != IResource.FILE)
+			return false;
+		if (checkExtension) {
+			String extension = file.getFileExtension();
+			if (extension != null && "xml".endsWith(extension.toLowerCase(Locale.US)))
+				return true;
+		}
+
+		IContentDescription contentDescription = null;
+		try {
+			contentDescription = ((IFile) file).getContentDescription();
+			if (contentDescription != null) {
+				IContentType contentType = contentDescription.getContentType();
+				return contentDescription != null && contentType.isKindOf(getXMLContentType());
+			}
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+		return false;
+	}
+
+	/**
+	 * @param helper
+	 * @param reporter
+	 */
+	private void validateV1Project(IValidationContext helper, final IReporter reporter) {
+		// if uris[] length 0 -> validate() gets called for each project
+		if (helper instanceof IWorkbenchContext) {
+			IProject project = ((IWorkbenchContext) helper).getProject();
+			IResourceProxyVisitor visitor = new IResourceProxyVisitor() {
+				public boolean visit(IResourceProxy proxy) throws CoreException {
+					if (shouldValidate(proxy)) {
+						validateV1File((IFile) proxy.requestResource(), reporter);
+					}
+					return true;
+				}
+			};
+			try {
+				// collect all jsp files for the project
+				project.accept(visitor, IResource.DEPTH_INFINITE);
+			}
+			catch (CoreException e) {
+				Logger.logException(e);
+			}
+		}
+	}
+	
+
+	/**
+	 * @param currentFile
+	 * @param reporter
+	 */
+	private void validateV1File(IFile currentFile, IReporter reporter) {
+		Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, currentFile.getFullPath().toString().substring(1));
+		reporter.displaySubtask(MarkupValidator.this, message);
+
+		IStructuredModel model = null;
+		try {
+			model = StructuredModelManager.getModelManager().getModelForRead(currentFile);
+			IStructuredDocument document = null;
+			if (model != null) {
+				document = model.getStructuredDocument();
+				connect(document);
+				IStructuredDocumentRegion validationRegion = document.getFirstStructuredDocumentRegion();
+				while (validationRegion != null) {
+					validate(validationRegion, reporter);
+					validationRegion = validationRegion.getNext();
+				}
+				disconnect(document);
+			}
+		}
+		catch (Exception e) {
+			Logger.logException(e);
+		}
+		finally {
+			if (model != null) {
+				model.releaseFromRead();
+			}
+		}
+	}
+
+	/**
+	 * @return
+	 */
+	private IContentType getXMLContentType() {
+		if (fRootContentType == null) {
+			fRootContentType = Platform.getContentTypeManager().getContentType("org.eclipse.core.runtime.xml");
+		}
+		return fRootContentType;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.validation.AbstractValidator#validate(org.eclipse.core.resources.IResource, int, org.eclipse.wst.validation.ValidationState, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
+		if (resource.getType() != IResource.FILE)
+			return null;
+		ValidationResult result = new ValidationResult();
+		IReporter reporter = result.getReporter(monitor);
+		validateV1File((IFile) resource, reporter);
+		return result;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/AbstractXMLContentOutlineConfiguration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/AbstractXMLContentOutlineConfiguration.java
new file mode 100644
index 0000000..00b2cf5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/AbstractXMLContentOutlineConfiguration.java
@@ -0,0 +1,342 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.views.contentoutline;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.util.TransferDragSourceListener;
+import org.eclipse.jface.util.TransferDropTargetListener;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+import org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration;
+import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeContentProvider;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
+import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
+import org.eclipse.wst.xml.ui.internal.dnd.DragNodeCommand;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+/**
+ * Basic Outline Configuration for generic XML support.  Expects that the viewer's
+ * input will be the DOM Model, and provides basic label and content providers.
+ * 
+ * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration
+ * @since 3.1
+ */
+public abstract class AbstractXMLContentOutlineConfiguration extends ContentOutlineConfiguration {
+	private class ActionManagerMenuListener implements IMenuListener, IReleasable {
+		private XMLNodeActionManager fActionManager;
+		private TreeViewer fTreeViewer;
+
+		public ActionManagerMenuListener(TreeViewer viewer) {
+			fTreeViewer = viewer;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
+		 */
+		public void menuAboutToShow(IMenuManager manager) {
+			if (fActionManager == null) {
+				fActionManager = createNodeActionManager(fTreeViewer);
+			}
+			if (fActionManager != null) {
+				fActionManager.fillContextMenu(manager, fTreeViewer.getSelection());
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.wst.sse.ui.internal.IReleasable#release()
+		 */
+		public void release() {
+			fTreeViewer = null;
+			if (fActionManager != null) {
+				fActionManager.setModel(null);
+			}
+		}
+	}
+	
+	private static class StatusLineLabelProvider extends JFaceNodeLabelProvider {
+		public StatusLineLabelProvider() {
+			super();
+		}
+
+		public String getText(Object element) {
+			if (element == null)
+				return null;
+
+			if (!(element instanceof Node)) {
+				return super.getText(element);
+			}
+
+			StringBuffer s = new StringBuffer();
+			Node node = (Node) element;
+			while (node != null) {
+				if (node.getNodeType() != Node.DOCUMENT_NODE) {
+					s.insert(0, super.getText(node));
+				}
+				
+				if (node.getNodeType() == Node.ATTRIBUTE_NODE)
+					node = ((Attr) node).getOwnerElement();
+				else
+					node = node.getParentNode();
+			
+				if (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
+					s.insert(0, IPath.SEPARATOR);
+				}
+			}
+			return s.toString();
+		}
+	}
+
+	private IContentProvider fContentProvider = null;
+
+	private ActionManagerMenuListener fContextMenuFiller = null;
+
+	private ILabelProvider fLabelProvider = null;
+
+	boolean fShowAttributes = false;
+
+	private ILabelProvider fSimpleLabelProvider;
+	private TransferDragSourceListener[] fTransferDragSourceListeners;
+
+	private TransferDropTargetListener[] fTransferDropTargetListeners;
+
+	/**
+	 * Create new instance of XMLContentOutlineConfiguration
+	 */
+	public AbstractXMLContentOutlineConfiguration() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+	}
+
+	/**
+	 * Returns the NodeActionManager to use for the given treeViewer.
+	 * <p>
+	 * Not API. May be removed in the future.
+	 * </p>
+	 * 
+	 * @param treeViewer
+	 *            the TreeViewer associated with this configuration
+	 * @return a node action manager for use with this tree viewer
+	 */
+	protected XMLNodeActionManager createNodeActionManager(TreeViewer treeViewer) {
+		return new XMLNodeActionManager((IStructuredModel) treeViewer.getInput(), treeViewer);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getContentProvider(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public IContentProvider getContentProvider(TreeViewer viewer) {
+		if (fContentProvider == null) {
+			fContentProvider = new JFaceNodeContentProvider();
+		}
+		return fContentProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getLabelProvider(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public ILabelProvider getLabelProvider(TreeViewer viewer) {
+		if (fLabelProvider == null) {
+			fLabelProvider = new JFaceNodeLabelProvider();
+		}
+		return fLabelProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getMenuListener(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public IMenuListener getMenuListener(TreeViewer viewer) {
+		if (fContextMenuFiller == null) {
+			fContextMenuFiller = new ActionManagerMenuListener(viewer);
+		}
+		return fContextMenuFiller;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getPreferenceStore()
+	 */
+	protected IPreferenceStore getPreferenceStore() {
+		return XMLUIPlugin.getDefault().getPreferenceStore();
+	}
+
+	public ILabelProvider getStatusLineLabelProvider(TreeViewer treeViewer) {
+		if (fSimpleLabelProvider == null) {
+			fSimpleLabelProvider = new StatusLineLabelProvider();
+		}
+		return fSimpleLabelProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public TransferDragSourceListener[] getTransferDragSourceListeners(final TreeViewer treeViewer) {
+		if (fTransferDragSourceListeners == null) {
+			fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
+
+				public void dragFinished(DragSourceEvent event) {
+					LocalSelectionTransfer.getTransfer().setSelection(null);
+				}
+
+				public void dragSetData(DragSourceEvent event) {
+				}
+
+				public void dragStart(DragSourceEvent event) {
+					LocalSelectionTransfer.getTransfer().setSelection(treeViewer.getSelection());
+				}
+
+				public Transfer getTransfer() {
+					return LocalSelectionTransfer.getTransfer();
+				}
+			}};
+		}
+
+		return fTransferDragSourceListeners;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public TransferDropTargetListener[] getTransferDropTargetListeners(final TreeViewer treeViewer) {
+		if (fTransferDropTargetListeners == null) {
+			fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
+				public void dragEnter(DropTargetEvent event) {
+				}
+
+				public void dragLeave(DropTargetEvent event) {
+				}
+
+				public void dragOperationChanged(DropTargetEvent event) {
+				}
+
+				public void dragOver(DropTargetEvent event) {
+					event.feedback = DND.FEEDBACK_SELECT;
+					float feedbackFloat = getHeightInItem(event);
+					if (feedbackFloat > 0.75) {
+						event.feedback = DND.FEEDBACK_INSERT_AFTER;
+					}
+					else if (feedbackFloat < 0.25) {
+						event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+					}
+					event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
+				}
+
+				public void drop(DropTargetEvent event) {
+					if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() != null && !LocalSelectionTransfer.getTransfer().getSelection().isEmpty()) {
+						IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+						if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+							/*
+							 * the command uses these numbers instead of the
+							 * feedback constants (even though it converts in
+							 * the other direction as well)
+							 */
+							float feedbackFloat = getHeightInItem(event);
+
+							final DragNodeCommand command = new DragNodeCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList(), treeViewer);
+							if (command != null && command.canExecute()) {
+								SafeRunnable.run(new SafeRunnable() {
+									public void run() throws Exception {
+										command.execute();
+									}
+								});
+							}
+						}
+					}
+				}
+
+				public void dropAccept(DropTargetEvent event) {
+				}
+
+				private float getHeightInItem(DropTargetEvent event) {
+					if (event.item == null)
+						return .5f;
+					if (event.item instanceof TreeItem) {
+						TreeItem treeItem = (TreeItem) event.item;
+						Control control = treeItem.getParent();
+						Point point = control.toControl(new Point(event.x, event.y));
+						Rectangle bounds = treeItem.getBounds();
+						return (float) (point.y - bounds.y) / (float) bounds.height;
+					}
+					else if (event.item instanceof TableItem) {
+						TableItem tableItem = (TableItem) event.item;
+						Control control = tableItem.getParent();
+						Point point = control.toControl(new Point(event.x, event.y));
+						Rectangle bounds = tableItem.getBounds(0);
+						return (float) (point.y - bounds.y) / (float) bounds.height;
+					}
+					else {
+						return 0.0F;
+					}
+				}
+
+				public Transfer getTransfer() {
+					return LocalSelectionTransfer.getTransfer();
+				}
+
+				public boolean isEnabled(DropTargetEvent event) {
+					return getTransfer().isSupportedType(event.currentDataType);
+				}
+			}};
+		}
+		return fTransferDropTargetListeners;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#unconfigure(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public void unconfigure(TreeViewer viewer) {
+		super.unconfigure(viewer);
+		fTransferDragSourceListeners = null;
+		fTransferDropTargetListeners = null;
+		if (fContextMenuFiller != null) {
+			fContextMenuFiller.release();
+			fContextMenuFiller = null;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
new file mode 100644
index 0000000..ec3f156
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
@@ -0,0 +1,411 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.views.contentoutline;
+
+import java.util.List;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateAction;
+import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateActionContributionItem;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
+import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeContentProvider;
+import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
+import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * More advanced Outline Configuration for XML support.  Expects that the viewer's
+ * input will be the DOM Model.
+ * 
+ * @see AbstractXMLContentOutlineConfiguration
+ * @since 1.0
+ */
+public class XMLContentOutlineConfiguration extends AbstractXMLContentOutlineConfiguration {
+	static final String ATTR_NAME = "name";
+	static final String ATTR_ID = "id";
+
+	private class AttributeShowingLabelProvider extends JFaceNodeLabelProvider {
+		public boolean isLabelProperty(Object element, String property) {
+			return true;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+		 */
+		public String getText(Object o) {
+			StringBuffer text = null;
+			if (o instanceof Node) {
+				Node node = (Node) o;
+				if ((node.getNodeType() == Node.ELEMENT_NODE) && fShowAttributes) {
+					text = new StringBuffer(super.getText(o));
+					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88444
+					if (node.hasAttributes()) {
+						Element element = (Element) node;
+						NamedNodeMap attributes = element.getAttributes();
+						Node idTypedAttribute = null;
+						Node requiredAttribute = null;
+						boolean hasId = false;
+						boolean hasName = false;
+						Node shownAttribute = null;
+
+						// try to get content model element
+						// declaration
+						CMElementDeclaration elementDecl = null;
+						ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
+						if (mq != null) {
+							elementDecl = mq.getCMElementDeclaration(element);
+						}
+						// find an attribute of type (or just named)
+						// ID
+						if (elementDecl != null) {
+							int i = 0;
+							while ((i < attributes.getLength()) && (idTypedAttribute == null)) {
+								Node attr = attributes.item(i);
+								String attrName = attr.getNodeName();
+								CMNamedNodeMap attributeDeclarationMap = elementDecl.getAttributes();
+								
+								CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributeDeclarationMap);
+								List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent(element, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
+								for (int k = 0; k < nodes.size(); k++) {
+									CMNode cmnode = (CMNode) nodes.get(k);
+									if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
+										allAttributes.put(cmnode);
+									}
+								}
+								attributeDeclarationMap = allAttributes;
+
+								CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) attributeDeclarationMap.getNamedItem(attrName);
+								if (attrDecl != null) {
+									if ((attrDecl.getAttrType() != null) && (CMDataType.ID.equals(attrDecl.getAttrType().getDataTypeName()))) {
+										idTypedAttribute = attr;
+									}
+									else if ((attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED) && (requiredAttribute == null)) {
+										// as a backup, keep tabs on
+										// any required
+										// attributes
+										requiredAttribute = attr;
+									}
+									else {
+										hasId = hasId || attrName.equals(ATTR_ID);
+										hasName = hasName || attrName.equals(ATTR_NAME);
+									}
+								}
+								++i;
+							}
+						}
+
+						/*
+						 * If no suitable attribute was found, try using a
+						 * required attribute, if none, then prefer "id" or
+						 * "name", otherwise just use first attribute
+						 */
+						if (idTypedAttribute != null) {
+							shownAttribute = idTypedAttribute;
+						}
+						else if (requiredAttribute != null) {
+							shownAttribute = requiredAttribute;
+						}
+						else if (hasId) {
+							shownAttribute = attributes.getNamedItem(ATTR_ID);
+						}
+						else if (hasName) {
+							shownAttribute = attributes.getNamedItem(ATTR_NAME);
+						}
+						if (shownAttribute == null) {
+							shownAttribute = attributes.item(0);
+						}
+
+						// display the attribute and value (without quotes)
+						String attributeName = shownAttribute.getNodeName();
+						if ((attributeName != null) && (attributeName.length() > 0)) {
+							text.append(" "); //$NON-NLS-1$
+							text.append(attributeName);
+							String attributeValue = shownAttribute.getNodeValue();
+							if ((attributeValue != null) && (attributeValue.length() > 0)) {
+								text.append("="); //$NON-NLS-1$
+								text.append(StringUtils.strip(attributeValue));
+							}
+						}
+					}
+				}
+				else {
+					text = new StringBuffer(super.getText(o));
+				}
+			}
+			else {
+				return super.toString();
+			}
+			return text.toString();
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object)
+		 */
+		public String getToolTipText(Object element) {
+			if (element instanceof Node) {
+				switch (((Node) element).getNodeType()) {
+					case Node.COMMENT_NODE :
+					case Node.CDATA_SECTION_NODE :
+					case Node.PROCESSING_INSTRUCTION_NODE :
+					case Node.TEXT_NODE : {
+						String nodeValue = ((Node) element).getNodeValue().trim();
+						return prepareText(nodeValue);
+					}
+					case Node.ELEMENT_NODE : {
+						// show the preceding comment's tooltip information
+						Node previous = ((Node) element).getPreviousSibling();
+						if (previous != null && previous.getNodeType() == Node.TEXT_NODE)
+							previous = previous.getPreviousSibling();
+						if (previous != null && previous.getNodeType() == Node.COMMENT_NODE)
+							return getToolTipText(previous);
+					}
+				}
+			}
+			return super.getToolTipText(element);
+		}
+
+		/**
+		 * Remove leading indentation from each line in the give string.
+		 * @param text
+		 * @return
+		 */
+		private String prepareText(String text) {
+			StringBuffer nodeText = new StringBuffer();
+			for (int i = 0; i < text.length(); i++) {
+				char c = text.charAt(i);
+				if (c != '\r' && c != '\n') {
+					nodeText.append(c);
+				}
+				else if (c == '\r' || c == '\n') {
+					nodeText.append('\n');
+					while (Character.isWhitespace(c) && i < text.length()) {
+						i++;
+						c = text.charAt(i);
+					}
+					nodeText.append(c);
+				}
+			}
+			return nodeText.toString();
+		}
+	}
+
+	/**
+	 * Toggle action for whether or not to display element's first attribute
+	 */
+	private class ToggleShowAttributeAction extends PropertyChangeUpdateAction {
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88444
+		private TreeViewer fTreeViewer;
+
+		public ToggleShowAttributeAction(IPreferenceStore store, String preference, TreeViewer treeViewer) {
+			super(XMLUIMessages.XMLContentOutlineConfiguration_0, store, preference, true);
+			setToolTipText(getText());
+			// images needed
+			// setDisabledImageDescriptor(SYNCED_D);
+			// (nsd) temporarily re-use Properties view image
+			setImageDescriptor(EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_OBJ_PROP_PS));
+			fTreeViewer = treeViewer;
+			update();
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.ui.texteditor.IUpdate#update()
+		 */
+		public void update() {
+			super.update();
+			fShowAttributes = isChecked();
+
+			// notify the configuration of the change
+			enableShowAttributes(fShowAttributes, fTreeViewer);
+
+			// refresh the outline view
+			fTreeViewer.refresh(true);
+		}
+	}
+	
+	private ILabelProvider fAttributeShowingLabelProvider;
+	private IContentProvider fContentProvider = null;
+
+	boolean fShowAttributes = false;
+
+	/*
+	 * Preference key for Show Attributes
+	 */
+	private final String OUTLINE_SHOW_ATTRIBUTE_PREF = "outline-show-attribute"; //$NON-NLS-1$
+
+	/**
+	 * Create new instance of XMLContentOutlineConfiguration
+	 */
+	public XMLContentOutlineConfiguration() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+
+		/**
+		 * Set up our preference store here. This is done so that subclasses
+		 * aren't required to set their own values, although if they have,
+		 * those will be used instead.
+		 */
+		IPreferenceStore store = getPreferenceStore();
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.DOCUMENT_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.DOCUMENT_NODE, "1, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.PROCESSING_INSTRUCTION_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.PROCESSING_INSTRUCTION_NODE, "2, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.DOCUMENT_TYPE_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.DOCUMENT_TYPE_NODE, "3, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.DOCUMENT_FRAGMENT_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.DOCUMENT_FRAGMENT_NODE, "4, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.COMMENT_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.COMMENT_NODE, "5, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ATTRIBUTE_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ATTRIBUTE_NODE, "6, false");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ELEMENT_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ELEMENT_NODE, "7, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ENTITY_REFERENCE_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ENTITY_REFERENCE_NODE, "8, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.CDATA_SECTION_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.CDATA_SECTION_NODE, "9, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ENTITY_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.ENTITY_NODE, "10, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.NOTATION_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.NOTATION_NODE, "11, true");
+		if (store.getDefaultString(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.TEXT_NODE).length() == 0)
+			store.setDefault(XMLUIPreferenceNames.OUTLINE_BEHAVIOR.TEXT_NODE, "12, false");
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#createMenuContributions(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	protected IContributionItem[] createMenuContributions(TreeViewer viewer) {
+		IContributionItem[] items;
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88444
+		IContributionItem showAttributeItem = new PropertyChangeUpdateActionContributionItem(new ToggleShowAttributeAction(getPreferenceStore(), OUTLINE_SHOW_ATTRIBUTE_PREF, viewer));
+
+		items = super.createMenuContributions(viewer);
+		if (items == null) {
+			items = new IContributionItem[]{showAttributeItem};
+		}
+		else {
+			IContributionItem[] combinedItems = new IContributionItem[items.length + 1];
+			System.arraycopy(items, 0, combinedItems, 0, items.length);
+			combinedItems[items.length] = showAttributeItem;
+			items = combinedItems;
+		}
+		return items;
+	}
+
+	/**
+	 * Notifies this configuration that the flag that indicates whether or not
+	 * to show attribute values in the tree viewer has changed. The tree
+	 * viewer is automatically refreshed afterwards to update the labels.
+	 * 
+	 * Clients should not call this method, but rather should react to it.
+	 * 
+	 * @param showAttributes
+	 *            flag indicating whether or not to show attribute values in
+	 *            the tree viewer
+	 * @param treeViewer
+	 *            the TreeViewer associated with this configuration
+	 */
+	protected void enableShowAttributes(boolean showAttributes, TreeViewer treeViewer) {
+		// nothing by default
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getContentProvider(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public IContentProvider getContentProvider(TreeViewer viewer) {
+		if (fContentProvider == null) {
+			fContentProvider = new JFaceNodeContentProvider();
+		}
+		return fContentProvider;
+	}
+
+	private Object getFilteredNode(Object object) {
+		if (object instanceof Node) {
+			Node node = (Node) object;
+			short nodeType = node.getNodeType();
+			// replace attribute node in selection with its parent
+			if (nodeType == Node.ATTRIBUTE_NODE) {
+				node = ((Attr) node).getOwnerElement();
+			}
+			// anything else not visible, replace with parent node
+			else if (nodeType == Node.TEXT_NODE) {
+				node = node.getParentNode();
+			}
+			return node;
+		}
+		return object;
+	}
+
+	private Object[] getFilteredNodes(Object[] filteredNodes) {
+		for (int i = 0; i < filteredNodes.length; i++) {
+			filteredNodes[i] = getFilteredNode(filteredNodes[i]);
+		}
+		return filteredNodes;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getLabelProvider(org.eclipse.jface.viewers.TreeViewer)
+	 */
+	public ILabelProvider getLabelProvider(TreeViewer viewer) {
+		if (fAttributeShowingLabelProvider == null) {
+			fAttributeShowingLabelProvider = new AttributeShowingLabelProvider();
+		}
+		return fAttributeShowingLabelProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getSelection(org.eclipse.jface.viewers.TreeViewer,
+	 *      org.eclipse.jface.viewers.ISelection)
+	 */
+	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
+		ISelection filteredSelection = selection;
+		if (selection instanceof IStructuredSelection) {
+			Object[] filteredNodes = getFilteredNodes(((IStructuredSelection) selection).toArray());
+			filteredSelection = new StructuredSelection(filteredNodes);
+		}
+		return filteredSelection;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/properties/XMLPropertySheetConfiguration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/properties/XMLPropertySheetConfiguration.java
new file mode 100644
index 0000000..a4f3a4e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/properties/XMLPropertySheetConfiguration.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.xml.ui.views.properties;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManager;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.CMDocumentManagerListener;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
+import org.eclipse.wst.xml.ui.internal.properties.XMLPropertySource;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Configuration for property sheet page which shows XML content.
+ * 
+ * @see org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration
+ * @since 1.0
+ */
+public class XMLPropertySheetConfiguration extends PropertySheetConfiguration {
+	private class CMDocumentManagerListenerImpl implements CMDocumentManagerListener {
+		public void cacheCleared(CMDocumentCache cache) {
+			// nothing to do
+		}
+
+		public void cacheUpdated(CMDocumentCache cache, final String uri, int oldStatus, int newStatus, CMDocument cmDocument) {
+			if ((newStatus == CMDocumentCache.STATUS_LOADED) || (newStatus == CMDocumentCache.STATUS_ERROR)) {
+				refreshPages();
+			}
+		}
+
+		public void propertyChanged(CMDocumentManager cmDocumentManager, String propertyName) {
+			if (cmDocumentManager.getPropertyEnabled(CMDocumentManager.PROPERTY_AUTO_LOAD)) {
+				refreshPages();
+			}
+		}
+
+		private void refreshPages() {
+			getPropertiesRefreshJob().addPropertySheetPage(fPropertySheetPage);
+			getPropertiesRefreshJob().schedule(PropertiesRefreshJob.UPDATE_DELAY);
+		}
+	}
+
+	private class PropertiesRefreshJob extends UIJob {
+		public static final int UPDATE_DELAY = 200;
+
+		Set propertySheetPages = null;
+
+		public PropertiesRefreshJob() {
+			super(XMLUIMessages.JFaceNodeAdapter_1);
+			setSystem(true);
+			setPriority(Job.SHORT);
+			propertySheetPages = new HashSet(1);
+		}
+
+		void addPropertySheetPage(IPropertySheetPage page) {
+			if (page != null && propertySheetPages != null) {
+				propertySheetPages.add(page);
+				schedule(UPDATE_DELAY);
+			}
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.core.runtime.jobs.Job#canceling()
+		 */
+		protected void canceling() {
+			propertySheetPages.clear();
+			super.canceling();
+		}
+
+		public IStatus runInUIThread(IProgressMonitor monitor) {
+			Object[] pages = propertySheetPages.toArray();
+			propertySheetPages.clear();
+
+			for (int i = 0; i < pages.length; i++) {
+				PropertySheetPage page = (PropertySheetPage) pages[i];
+				if ((page != null) && (page.getControl() != null) && !page.getControl().isDisposed()) {
+					page.refresh();
+				}
+			}
+
+			return Status.OK_STATUS;
+		}
+	}
+
+	private class XMLPropertySheetRefreshAdapter implements INodeAdapter {
+		public boolean isAdapterForType(Object type) {
+			return false;
+		}
+
+		public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+			if (fPropertySheetPage != null) {
+				getPropertiesRefreshJob().addPropertySheetPage(fPropertySheetPage);
+			}
+		}
+	}
+
+	private class XMLPropertySourceProvider implements IPropertySourceProvider {
+		private IPropertySource fPropertySource = null;
+		private INodeNotifier fSource = null;
+
+		public IPropertySource getPropertySource(Object object) {
+			if ((fSource != null) && object.equals(fSource)) {
+				return fPropertySource;
+			}
+
+			if (object instanceof IDOMNode) {
+				fSource = (INodeNotifier) object;
+				fPropertySource = (IPropertySource) fSource.getAdapterFor(IPropertySource.class);
+				if (fPropertySource == null) {
+					fPropertySource = new XMLPropertySource((INodeNotifier) object) {
+						public void setPropertyValue(Object nameObject, Object value) {
+							// https://bugs.eclipse.org/bugs/show_bug.cgi?id=218979
+							for (int i = 0; i < fSelectedNotifiers.length; i++) {
+								fSelectedNotifiers[i].removeAdapter(fRefreshAdapter);
+							}
+							super.setPropertyValue(nameObject, value);
+							for (int i = 0; i < fSelectedNotifiers.length; i++) {
+								fSelectedNotifiers[i].addAdapter(fRefreshAdapter);
+							}
+						}
+					};
+				}
+			}
+			else {
+				fSource = null;
+				fPropertySource = null;
+			}
+			return fPropertySource;
+		}
+	}
+
+	private CMDocumentManagerListenerImpl fCMDocumentManagerListener = new CMDocumentManagerListenerImpl();
+	private PropertiesRefreshJob fPropertiesRefreshJob = null;
+	IPropertySheetPage fPropertySheetPage = null;
+	private IPropertySourceProvider fPropertySourceProvider = null;
+	private INodeAdapter fRefreshAdapter = new XMLPropertySheetRefreshAdapter();
+	private CMDocumentManager[] fSelectedCMDocumentManagers = new CMDocumentManager[0];
+	private INodeNotifier[] fSelectedNotifiers = new INodeNotifier[0];
+
+
+	/**
+	 * Create new instance of XMLPropertySheetConfiguration
+	 */
+	public XMLPropertySheetConfiguration() {
+		// Must have empty constructor to createExecutableExtension
+		super();
+	}
+
+	public ISelection getInputSelection(IWorkbenchPart selectingPart, ISelection selection) {
+		if (fSelectedNotifiers != null) {
+			for (int i = 0; i < fSelectedNotifiers.length; i++) {
+				fSelectedNotifiers[i].removeAdapter(fRefreshAdapter);
+			}
+			fSelectedNotifiers = null;
+		}
+		for (int i = 0; i < fSelectedCMDocumentManagers.length; i++) {
+			fSelectedCMDocumentManagers[i].removeListener(fCMDocumentManagerListener);
+		}
+
+		ISelection preferredSelection = selection;
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection structuredSel = (IStructuredSelection) selection;
+
+			/*
+			 * On Attr nodes, select the owner Element. On Text nodes, select
+			 * the parent Element.
+			 */
+			Object[] selectedObjects = new Object[structuredSel.size()];
+			System.arraycopy(structuredSel.toArray(), 0, selectedObjects, 0, selectedObjects.length);
+			for (int i = 0; i < selectedObjects.length; i++) {
+				Object inode = selectedObjects[i];
+				if (inode instanceof Node) {
+					Node node = (Node) inode;
+					// replace Attribute Node with its owner
+					Node parentNode = node.getParentNode();
+					if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+						Element ownerElement = ((Attr) node).getOwnerElement();
+						selectedObjects[i] = ownerElement;
+					}
+					// replace Text Node with its parent
+					else if (((node.getNodeType() == Node.TEXT_NODE) || (node.getNodeType() == Node.CDATA_SECTION_NODE)) && (parentNode != null)) {
+						selectedObjects[i] = parentNode;
+					}
+				}
+			}
+
+			if (selectedObjects.length > 0) {
+				Set managers = new HashSet(1);
+				Set selectedNotifiers = new HashSet(1);
+
+				for (int i = 0; i < selectedObjects.length; i++) {
+					if (selectedObjects[i] instanceof Node) {
+						ModelQuery query = ModelQueryUtil.getModelQuery(((Node) selectedObjects[i]).getOwnerDocument());
+						if (query != null) {
+							CMDocumentManager mgr = query.getCMDocumentManager();
+							if (mgr != null) {
+								managers.add(mgr);
+								mgr.addListener(fCMDocumentManagerListener);
+							}
+						}
+					}
+					/*
+					 * Add UI refresh adapters and remember notifiers for
+					 * later removal
+					 */
+					if (selectedObjects[i] instanceof INodeNotifier) {
+						selectedNotifiers.add(selectedObjects[i]);
+						((INodeNotifier) selectedObjects[i]).addAdapter(fRefreshAdapter);
+					}
+				}
+				fSelectedCMDocumentManagers = (CMDocumentManager[]) managers.toArray(new CMDocumentManager[managers.size()]);
+				fSelectedNotifiers = (INodeNotifier[]) selectedNotifiers.toArray(new INodeNotifier[selectedNotifiers.size()]);
+			}
+
+
+			preferredSelection = new StructuredSelection(selectedObjects);
+		}
+		return preferredSelection;
+	}
+
+	PropertiesRefreshJob getPropertiesRefreshJob() {
+		if (fPropertiesRefreshJob == null) {
+			fPropertiesRefreshJob = new PropertiesRefreshJob();
+		}
+		return fPropertiesRefreshJob;
+	}
+
+	public IPropertySourceProvider getPropertySourceProvider(IPropertySheetPage page) {
+		if (fPropertySourceProvider == null) {
+			fPropertySheetPage = page;
+			fPropertySourceProvider = new XMLPropertySourceProvider();
+		}
+		return fPropertySourceProvider;
+	}
+
+
+	public void unconfigure() {
+		super.unconfigure();
+		for (int i = 0; i < fSelectedCMDocumentManagers.length; i++) {
+			fSelectedCMDocumentManagers[i].removeListener(fCMDocumentManagerListener);
+		}
+		if(fPropertiesRefreshJob != null) {
+			fPropertiesRefreshJob.cancel();
+			fPropertiesRefreshJob.propertySheetPages = null;
+		}
+		fPropertySheetPage = null;
+	}
+}
diff --git a/bundles/org.eclipse.wst.xml.ui/templates/xmldefault-templates.properties b/bundles/org.eclipse.wst.xml.ui/templates/xmldefault-templates.properties
new file mode 100644
index 0000000..8b5177a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/templates/xmldefault-templates.properties
@@ -0,0 +1,26 @@
+###############################################################################
+# Copyright (c) 2001, 2005 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     Jens Lukowski/Innoopract - initial renaming/restructuring
+#     
+###############################################################################
+Templates.comment.name=comment
+Templates.comment.desc=xml comment
+Templates.xmldeclaration.name=xml declaration
+Templates.xmldeclaration.desc=xml declaration
+Templates.xslpi.name=XSL processing instruction
+Templates.xslpi.desc=XSL processing instruction
+Templates.xsinsp.name=xsinsp
+Templates.xsinsp.desc=XML Schema name space
+Templates.schemaLoc.name=schemaLoc
+Templates.schemaLoc.desc=XML Schema location attribute
+Templates.noschemaLoc.name=noschemaLoc
+Templates.noschemaLoc.desc=No Namespace Schema Location
+Templates.defaultnsp.name=default namespace
+Templates.defaultnsp.desc=Default Namespace Attribute
diff --git a/bundles/org.eclipse.wst.xml.ui/templates/xmldefault-templates.xml b/bundles/org.eclipse.wst.xml.ui/templates/xmldefault-templates.xml
new file mode 100644
index 0000000..b4ad498
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/templates/xmldefault-templates.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Carver - added templates for xsi namespace, schemaLocation, and
+                      default namespace
+ *******************************************************************************/
+ -->
+<templates>
+  <template name="%Templates.xmldeclaration.name" description="%Templates.xmldeclaration.desc" id="org.eclipse.wst.xml.ui.internal.templates.xmldeclaration" context="xml_new" enabled="true">&lt;?xml version="1.0" encoding="${encoding}"?&gt;</template>
+  <template name="%Templates.comment.name" description="%Templates.comment.desc" id="org.eclipse.wst.xml.ui.internal.templates.comment" context="xml_tag" enabled="true">&lt;!-- ${cursor} --&gt;</template>
+  <template name="%Templates.xslpi.name" description="%Templates.xslpi.desc" id="org.eclipse.wst.xml.ui.internal.templates.xslpi" context="xml_tag" enabled="true">&lt;?xml-stylesheet type="text/xsl" href="${cursor}"?&gt;</template>
+  <template name="%Templates.xsinsp.name" description="%Templates.xsinsp.desc" id="org.eclipse.wst.xml.ui.internal.templates.xsinsp" context="xml_attribute" enabled="true">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</template>
+  <template name="%Templates.schemaLoc.name" description="%Templates.schemaLoc.desc" id="org.eclipse.wst.xml.ui.internal.templates.schemaLoc" context="xml_attribute" enabled="true">xsi:schemaLocation="{namespace} {location}"</template>
+  <template name="%Templates.noschemaLoc.name" description="%Templates.noschemaLoc.desc" id="org.eclipse.wst.xml.ui.internal.templates.noschemaLoc" context="xml_attribute" enabled="true">xsi:noNamespaceSchemaLocation="{location}"</template>
+  <template name="%Templates.defaultnsp.name" description="%Templates.defaultnsp.desc" id="org.eclipse.wst.xml.ui.internal.templates.defaultnsp" context="xml_attribute" enabled="true">xmlns="default namespace"</template>
+</templates>
diff --git a/bundles/org.eclipse.wst.xsd.core/.classpath b/bundles/org.eclipse.wst.xsd.core/.classpath
new file mode 100644
index 0000000..4710c45
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/.classpath
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src-contentmodel" />
+	<classpathentry kind="src" path="src-validation" />
+	<classpathentry kind="src" path="src" />
+	<classpathentry kind="con"
+		path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4">
+		<accessrules>
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/impl/Constants" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/parsers/XMLGrammarPreparser" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/util/XMLGrammarPoolImpl" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/xni/XMLResourceIdentifier" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/xni/XNIException" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/xni/grammars/XMLGrammarDescription" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/xni/parser/XMLEntityResolver" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/xni/parser/XMLErrorHandler" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/xni/parser/XMLInputSource" />
+			<accessrule kind="accessible"
+				pattern="org/apache/xerces/xni/parser/XMLParseException" />
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="con"
+		path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/provisional/core/IMessage" />
+			<accessrule kind="accessible"
+				pattern="org/eclipse/wst/validation/internal/delegates/DelegatingValidator" />
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="output" path="bin" />
+</classpath>
diff --git a/bundles/org.eclipse.wst.xsd.core/.cvsignore b/bundles/org.eclipse.wst.xsd.core/.cvsignore
new file mode 100644
index 0000000..33dd7de
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/.cvsignore
@@ -0,0 +1,6 @@
+bin
+temp.folder
+build.xml
+@dot
+src.zip
+javaCompiler...args
diff --git a/bundles/org.eclipse.wst.xsd.core/.project b/bundles/org.eclipse.wst.xsd.core/.project
new file mode 100644
index 0000000..a95f8ef
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.xsd.core</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.resources.prefs
rename to bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.core.resources.prefs
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.core.runtime.prefs
similarity index 100%
rename from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.core.runtime.prefs
rename to bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.core.runtime.prefs
diff --git a/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ab5558f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,79 @@
+#Sat Mar 24 02:19:12 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.jdt.ui.prefs
similarity index 100%
rename from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.jdt.ui.prefs
rename to bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.jdt.ui.prefs
diff --git a/bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.ltk.core.refactoring.prefs
similarity index 100%
rename from bundles/org.eclipse.wst.sse.core/.settings/org.eclipse.ltk.core.refactoring.prefs
rename to bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.ltk.core.refactoring.prefs
diff --git a/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e70985d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,16 @@
+#Wed Nov 15 02:13:10 EST 2006
+compilers.incompatible-environment=0
+compilers.p.build=0
+compilers.p.deprecated=1
+compilers.p.illegal-att-value=0
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=0
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.p.unused-element-or-attribute=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.wst.xsd.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xsd.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..36e0b49
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %_UI_PLUGIN_NAME
+Bundle-SymbolicName: org.eclipse.wst.xsd.core; singleton:=true
+Bundle-Version: 1.1.503.qualifier
+Bundle-Activator: org.eclipse.wst.xsd.core.internal.XSDCorePlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: org.eclipse.wst.xsd.contentmodel.internal;x-friends:="org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.xsd.contentmodel.internal.util;x-internal:=true,
+ org.eclipse.wst.xsd.core.internal;x-friends:="org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.xsd.core.internal.preferences;x-friends:="org.eclipse.wst.xsd.ui",
+ org.eclipse.wst.xsd.core.internal.validation;x-internal:=true,
+ org.eclipse.wst.xsd.core.internal.validation.eclipse;x-internal:=true 
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.xsd;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.validation;bundle-version="[1.2.0,1.3.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+
diff --git a/bundles/org.eclipse.wst.sse.core/about.html b/bundles/org.eclipse.wst.xsd.core/about.html
similarity index 100%
rename from bundles/org.eclipse.wst.sse.core/about.html
rename to bundles/org.eclipse.wst.xsd.core/about.html
diff --git a/bundles/org.eclipse.wst.xsd.core/build.properties b/bundles/org.eclipse.wst.xsd.core/build.properties
new file mode 100644
index 0000000..984631d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/build.properties
@@ -0,0 +1,21 @@
+###############################################################################
+# Copyright (c) 2001, 2005 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+#     
+###############################################################################
+bin.includes = META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               .,\
+               about.html
+jars.compile.order = .
+output.. = bin/
+source.. = src-contentmodel/,\
+           src-validation/,\
+           src/
diff --git a/bundles/org.eclipse.wst.xsd.core/plugin.properties b/bundles/org.eclipse.wst.xsd.core/plugin.properties
new file mode 100644
index 0000000..42ba557
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/plugin.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2001, 2006 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+! Properties file for component: XML Schema Validator
+
+!
+! Plugin
+!
+_UI_PLUGIN_NAME                           = XSD Core Plugin
+XSD_Content_Type=XSD
+
+_UI_XML_SCHEMA_VALIDATOR                  = XML Schema Validator
+_UI_XERCES_VALIDATOR_DELEGATE       	  = Xerces-based XML Schema Validator
+
+Bundle-Vendor.0 = Eclipse Web Tools Platform
diff --git a/bundles/org.eclipse.wst.xsd.core/plugin.xml b/bundles/org.eclipse.wst.xsd.core/plugin.xml
new file mode 100644
index 0000000..878e651
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/plugin.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+	<extension point="org.eclipse.core.contenttype.contentTypes">
+		<content-type
+			priority="high"
+			name="%XSD_Content_Type"
+			id="xsdsource"
+			base-type="org.eclipse.core.runtime.xml"
+			default-charset="UTF-8"
+			file-extensions="xsd" />
+	</extension>
+
+	<extension point="org.eclipse.wst.xml.core.documentFactories">
+		<factory
+			type="xsd"
+			class="org.eclipse.wst.xsd.contentmodel.internal.CMDocumentFactoryXSD">
+		</factory>
+	</extension>
+	
+	<!-- ====================================================== -->
+	<!-- Register the XSD validator with the validation 		-->
+	<!-- framework. 										    -->
+	<!-- ====================================================== -->
+	<!--
+	<extension
+		id="xsdValidator"
+		name="%_UI_XML_SCHEMA_VALIDATOR"
+		point="org.eclipse.wst.validation.validator">
+		<validator>
+			<filter
+				objectClass="org.eclipse.core.resources.IFile"
+				caseSensitive="false"
+				nameFilter="*.xsd">
+			</filter>
+			
+			<helper
+				class="org.eclipse.wst.xml.core.internal.validation.core.Helper">
+			</helper>
+			
+			<run
+         async="true"
+         class="org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator"
+         enabled="true"
+         fullBuild="true"
+         incremental="true">
+			</run>
+		</validator>
+	</extension>
+	-->
+	
+   <extension id="xsd" name="%_UI_XML_SCHEMA_VALIDATOR" point="org.eclipse.wst.validation.validatorV2">
+      <validator
+            build="true"
+            class="org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator"
+            manual="true"
+            sourceid="org.eclipse.wst.xsd.ui.internal.validation.DelegatingSourceValidatorForXSD"
+            version="2"
+            markerId="org.eclipse.xsd.diagnostic">
+         <include>
+            <rules>
+               <fileext caseSensitive="false" ext="xsd"></fileext>
+            </rules>
+         </include>
+      </validator>
+   </extension>
+
+	<extension
+       point="org.eclipse.wst.validation.validatorDelegates">
+    	<delegate
+        	class="org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator"
+			name="%_UI_XERCES_VALIDATOR_DELEGATE"
+        	target="org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator"/>
+	 </extension>
+ 	 
+	 <!-- initialize xml core preferences -->
+	<extension point="org.eclipse.core.runtime.preferences">
+		<initializer
+			class="org.eclipse.wst.xsd.core.internal.preferences.XSDCorePreferenceInitializer" />
+	</extension>
+
+	<!-- ====================================================== -->
+	<!-- Add schemas to XML Catalog                             -->
+	<!-- ====================================================== -->
+	<extension
+		point="org.eclipse.wst.xml.core.catalogContributions">
+		<catalogContribution id="default">
+			<uri
+				name="http://www.w3.org/2001/XMLSchema"
+				uri="platform:/plugin/org.eclipse.xsd/cache/www.w3.org/2001/XMLSchema.xsd" />
+			<system
+				systemId="http://www.w3.org/2001/xml.xsd"
+				uri="platform:/plugin/org.eclipse.xsd/cache/www.w3.org/2001/xml.xsd"/>				
+		</catalogContribution>
+	</extension>
+
+</plugin>
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/CMDocumentFactoryXSD.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/CMDocumentFactoryXSD.java
new file mode 100644
index 0000000..eaeb5d7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/CMDocumentFactoryXSD.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.factory.CMDocumentFactory;
+import org.eclipse.xsd.XSDPackage;
+
+/**
+ *  This builder handles building .dtd / .xsd grammar files
+ */
+public class CMDocumentFactoryXSD implements CMDocumentFactory
+{
+  public static final String XSD_FILE_TYPE = "XSD";
+
+  public CMDocumentFactoryXSD() 
+  {  
+    // here we call init on the XSD and DTD packages to avoid strange initialization bugs
+    //
+    XSDPackage.eINSTANCE.eClass();
+    XSDPackage.eINSTANCE.getXSDFactory();  
+  }
+
+ 
+  public CMDocument createCMDocument(String uri)
+  {                  	
+    CMDocument result = null;
+    try
+    {                                
+        result = XSDImpl.buildCMDocument(uri);     
+    }
+    catch (Exception e)
+    {
+    	e.printStackTrace();
+    }
+    return result;  
+  } 
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/CMNodeImpl.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/CMNodeImpl.java
new file mode 100644
index 0000000..9fca578
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/CMNodeImpl.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal;
+
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+public abstract class CMNodeImpl extends AdapterImpl implements CMNode
+{
+  protected static final String PROPERTY_DOCUMENTATION = "documentation";
+  protected static final String PROPERTY_DOCUMENTATION_SOURCE = "documentationSource";
+  protected static final String PROPERTY_DOCUMENTATION_LANGUAGE = "documentationLanguage";
+  protected static final String PROPERTY_MOF_NOTIFIER = "key";
+  protected static final String PROPERTY_DEFINITION_INFO = "http://org.eclipse.wst/cm/properties/definitionInfo";
+  protected static final String PROPERTY_DEFINITION = "http://org.eclipse.wst/cm/properties/definition";
+
+  public abstract Object getKey();
+
+  public boolean supports(String propertyName)
+  {
+    return propertyName.equals(PROPERTY_MOF_NOTIFIER);
+  }
+
+  public Object getProperty(String propertyName)
+  {
+    return null;
+  }
+
+  public void setProperty(String propertyName, Object object)
+  {
+	  //no propertyes supported? 
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDCMManager.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDCMManager.java
new file mode 100644
index 0000000..3461a54
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDCMManager.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Plugin;
+
+public class XSDCMManager extends Plugin 
+{
+  private static XSDCMManager instance;
+  
+  public XSDCMManager() 
+  {
+    super();
+  }
+  
+  public static XSDCMManager getInstance() {
+    if (instance == null) {
+      instance = new XSDCMManager();
+    }
+    return instance;
+  }
+
+
+  public void startup() throws CoreException 
+  {
+    XSDTypeUtil.initialize();
+    //ContentModelManager.getInstance().setInferredGrammarFactory(new InferredGrammarFactoryImpl());
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDImpl.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDImpl.java
new file mode 100644
index 0000000..9abdc21
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDImpl.java
@@ -0,0 +1,3141 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Carver - STAR - bug 157254 - referenced Attributes and Elements
+ *        were not being checked to see if they had the annotations if
+ *        none were defined locally. (Initial fix modified - see bug)
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAnyElement;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocumentation;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+import org.eclipse.wst.xml.core.internal.contentmodel.annotation.AnnotationMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMAttributeDeclarationImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMDataTypeImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMDocumentImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMEntityDeclarationImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMGroupImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNodeListImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDescriptionBuilder;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xsd.contentmodel.internal.util.XSDSchemaLocatorAdapterFactory;
+import org.eclipse.xsd.XSDAnnotation;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDAttributeUseCategory;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDConstraint;
+import org.eclipse.xsd.XSDContentTypeCategory;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDEnumerationFacet;
+import org.eclipse.xsd.XSDForm;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDParticleContent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaContent;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDVariety;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.impl.XSDSchemaImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.eclipse.xsd.util.XSDResourceImpl;
+import org.eclipse.xsd.util.XSDSwitch;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * Utility class to build cmnodes from XML Schema nodes. The XML Schema model is
+ * found in the org.eclipse.xsd plugin.
+ * 
+ * TODO: getNamespaceURI()currently always returns '##any'.
+ */
+public class XSDImpl
+{
+  /*
+   * properties common to all cmnodes the following properties defined in
+   * CMNodeImpl class: PROPERTY_DOCUMENTATION PROPERTY_DOCUMENTATION_SOURCE
+   * PROPERTY_DOCUMENTATION_LANGUAGE PROPERTY_MOF_NOTIFIER
+   * PROPERTY_DEFINITION_INFO PROPERTY_DEFINITION
+   * 
+   * the following properties defined in this class, XSDImpl:
+   * PROPERTY_CMDOCUMENT PROPERTY_USES_LOCAL_ELEMENT_DECLARATIONS
+   * PROPERTY_IS_NAME_SPACE_AWARE PROPERTY_NS_PREFIX_QUALIFICATION
+   * PROPERTY_NILLABLE PROPERTY_SPEC
+   */
+  public static final String PROPERTY_CMDOCUMENT = "CMDocument";
+  public static final String PROPERTY_USES_LOCAL_ELEMENT_DECLARATIONS = "http://org.eclipse.wst/cm/properties/usesLocalElementDeclarations";
+  public static final String PROPERTY_IS_NAME_SPACE_AWARE = "http://org.eclipse.wst/cm/properties/isNameSpaceAware";
+  public static final String PROPERTY_NS_PREFIX_QUALIFICATION = "http://org.eclipse.wst/cm/properties/nsPrefixQualification";
+  public static final String PROPERTY_NILLABLE = "http://org.eclipse.wst/cm/properties/nillable";
+  public static final String PROPERTY_SPEC = "spec";
+  /*
+   * properties common to all CMDocument nodes: PROPERTY_TARGET_NAMESPACE_URI
+   * PROPERTY_IMPORTED_NAMESPACE_INFO PROPERTY_NAMESPACE_INFO
+   * PROPERTY_ELEMENT_FORM_DEFAULT PROPERTY_ANNOTATION_MAP
+   */
+  public static final String PROPERTY_TARGET_NAMESPACE_URI = "http://org.eclipse.wst/cm/properties/targetNamespaceURI";
+  public static final String PROPERTY_IMPORTED_NAMESPACE_INFO = "http://org.eclipse.wst/cm/properties/importedNamespaceInfo";
+  public static final String PROPERTY_NAMESPACE_INFO = "http://org.eclipse.wst/cm/properties/namespaceInfo";
+  public static final String PROPERTY_ELEMENT_FORM_DEFAULT = "http://org.eclipse.wst/cm/properties/elementFormDefault";
+  public static final String PROPERTY_ANNOTATION_MAP = "annotationMap";
+  public static final String PROPERTY_COMPLETE_NAMESPACE_INFO = "http://org.eclipse.wst/cm/properties/completeNamespaceInfo";
+  /*
+   * properties common to all CMElementDeclaration nodes: PROPERTY_XSITYPES
+   * PROPERTY_DERIVED_ELEMENT_DECLARATION PROPERTY_SUBSTITUTION_GROUP
+   * PROPERTY_ABSTRACT
+   */
+  public static final String PROPERTY_XSITYPES = "XSITypes";
+  public static final String PROPERTY_DERIVED_ELEMENT_DECLARATION = "DerivedElementDeclaration";
+  public static final String PROPERTY_SUBSTITUTION_GROUP = "SubstitutionGroup";
+  public static final String PROPERTY_SUBSTITUTION_GROUP_VALUE = "SubstitutionGroupValue";
+  public static final String PROPERTY_ABSTRACT = "Abstract";
+  public static final String PROPERTY_WHITESPACE_FACET = "org.eclipse.wst.xsd.cm.properties/whitespace"; //$NON-NLS-1$
+  /**
+   * Definition info for element declarations.
+   */
+  public static final String DEFINITION_INFO_GLOBAL = "global";
+  public static final String DEFINITION_INFO_LOCAL = "local";
+  public static final String XML_LANG_ATTRIBUTE = "xml:lang";
+  public static final String PLATFORM_PROTOCOL = "platform:";
+  protected static XSDAdapterFactoryImpl xsdAdapterFactoryImpl = new XSDAdapterFactoryImpl();
+  protected static XSIDocument xsiDocument = new XSIDocument();
+
+  /**
+   * Given uri for an XML Schema document, parse the document and build
+   * corresponding CMDocument node.
+   * 
+   * @param uri -
+   *          the uri for an XML Schema document
+   * @param grammarErrorChecking -
+   *          grammar error checking flag
+   * @param errorList -
+   *          the resulting error list
+   * @return the corresponding CMDocument node.
+   * @deprecated -- use buildCMDocument(String uri)
+   */
+  public static CMDocument buildCMDocument(String uri, int grammarErrorChecking, List errorList)
+  {
+    return buildCMDocument(uri);
+  }
+
+  /**
+   * Given uri for an XML Schema document, parse the document and build
+   * corresponding CMDocument node.
+   * 
+   * @param uri -
+   *          the uri for an XML Schema document
+   * @return the corresponding CMDocument node.
+   */
+  public static CMDocument buildCMDocument(String uri)
+  {
+    CMDocument cmDocument = null;
+    XSDSchema xsdSchema = buildXSDModel(uri);
+    if (xsdSchema != null)
+    {
+      cmDocument = (CMDocument) getAdapter(xsdSchema);
+    }
+    return cmDocument;
+  }
+
+  /**
+   * Given uri for an XML Schema document, parse the document and build
+   * corresponding CMDocument node.
+   * 
+   * @param uri -
+   *          the uri for an XML Schema document
+   * @return the corresponding CMDocument node.
+   */
+  public static XSDSchema buildXSDModel(String uriString)
+  {
+    XSDSchema xsdSchema = null;
+ 
+    try
+    {
+      // if XML Schema for Schema is requested, get it through schema model 
+      if (uriString.endsWith("2001/XMLSchema.xsd"))
+      {
+      	xsdSchema = XSDSchemaImpl.getSchemaForSchema(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);			
+      }
+      else
+      { 	
+        ResourceSet resourceSet = new ResourceSetImpl();
+        //resourceSet.getAdapterFactories().add(new XSDSchemaLocationResolverAdapterFactory());
+        resourceSet.getAdapterFactories().add(new XSDSchemaLocatorAdapterFactory());
+          
+        URI uri = createURI(uriString);   
+        
+        // CS : bug 113537 ensure we perform physical resolution before opening a stream for the resource
+        //
+        String physicalLocation = URIResolverPlugin.createResolver().resolvePhysicalLocation("", "", uriString);       
+        InputStream inputStream = resourceSet.getURIConverter().createInputStream(URI.createURI(physicalLocation));
+        XSDResourceImpl resource = (XSDResourceImpl)resourceSet.createResource(URI.createURI("*.xsd"));
+        resource.setURI(uri);
+        resource.load(inputStream, null);         
+        xsdSchema = resource.getSchema();      
+      }
+    }
+    catch (Exception e)
+    {
+    }
+    return xsdSchema;
+  }
+  
+  // TODO ... looks like we can remove this class?
+  //
+  static class InternalURIConverter extends URIConverterImpl
+  {
+    protected InputStream createURLInputStream(URI uri) throws IOException
+    {
+      if ("http".equals(uri.scheme()))
+      {
+        String theURI = uri.toString();
+        String mapped = URIResolverPlugin.createResolver().resolve(theURI, theURI, theURI);
+        if (mapped != null)
+        {
+          uri = createURI(mapped);
+        }
+      }
+      return super.createURLInputStream(uri);
+    }
+  }
+
+  /**
+   * Returns an appropriate URI based on a uri string.
+   * 
+   * @param uriString -
+   *          a uri string.
+   * @return an appropriate URI based on a uri string.
+   */
+  public static URI createURI(String uriString)
+  {
+    if (hasProtocol(uriString))
+      return URI.createURI(uriString);
+    else
+      return URI.createFileURI(uriString);
+  }
+
+  private static boolean hasProtocol(String uri)
+  {
+    boolean result = false;
+    if (uri != null)
+    {
+      int index = uri.indexOf(":");
+      if (index != -1 && index > 2) // assume protocol with be length 3 so that
+                                    // the'C' in 'C:/' is not interpreted as a
+                                    // protocol
+      {
+        result = true;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Returns true if string begins with platform protocol.
+   * 
+   * @param uriString -
+   *          a uri string.
+   * @return true if string begins with platform protocol.
+   */
+  public static boolean withPlatformProtocol(String uriString)
+  {
+    return uriString.startsWith(PLATFORM_PROTOCOL);
+  }
+
+  /**
+   * Returns the value of the 'Min Occurs' attribute. The default value is "1".
+   * 
+   * @param component -
+   *          a concrete component.
+   * @return the value of the 'Min Occurs' attribute.
+   */
+  public static int getMinOccurs(XSDConcreteComponent component)
+  {
+    int minOccur = 1;
+    if (component != null)
+    {
+      Object o = component.getContainer();
+      if (o instanceof XSDParticle)
+      {
+        if (((XSDParticle) o).isSetMinOccurs())
+        {
+          try
+          {
+            minOccur = ((XSDParticle) o).getMinOccurs();
+          }
+          catch (Exception e)
+          {
+            minOccur = 1;
+          }
+        }
+      }
+    }
+    return minOccur;
+  }
+
+  /**
+   * Returns the value of the 'Max Occurs' attribute. The default value is "1".
+   * 
+   * @param component -
+   *          a concrete component.
+   * @return the value of the 'Max Occurs' attribute.
+   */
+  public static int getMaxOccurs(XSDConcreteComponent component)
+  {
+    int maxOccur = 1;
+    if (component != null)
+    {
+      Object o = component.getContainer();
+      if (o instanceof XSDParticle)
+      {
+        if (((XSDParticle) o).isSetMaxOccurs())
+        {
+          try
+          {
+            maxOccur = ((XSDParticle) o).getMaxOccurs();
+          }
+          catch (Exception e)
+          {
+            maxOccur = 1;
+          }
+        }
+      }
+    }
+    return maxOccur;
+  }
+
+  /**
+   * Returns the enumerated values for the given type.
+   * 
+   * @param type -
+   *          a type definition.
+   * @return the enumerated values for the given type.
+   */
+  private final static String TYPE_NAME_BOOLEAN = "boolean"; //$NON-NLS-1$
+  private final static String TYPE_VALUE_TRUE = "true"; //$NON-NLS-1$
+  private final static String TYPE_VALUE_FALSE= "false"; //$NON-NLS-1$  
+  
+  public static String[] getEnumeratedValuesForType(XSDTypeDefinition type)
+  {
+    List result = new ArrayList();
+    // See bug 214804 - Content assist not showing valid values when it's a complex
+    // type with simple content
+    if (type instanceof XSDComplexTypeDefinition)
+    {
+      type = ((XSDComplexTypeDefinition)type).getSimpleType();
+    }
+    if (type instanceof XSDSimpleTypeDefinition)
+    {         
+      if (TYPE_NAME_BOOLEAN.equals(type.getName()) && type.getSchema().getSchemaForSchema() == type.getSchema())
+      {
+        result.add(TYPE_VALUE_TRUE);
+        result.add(TYPE_VALUE_FALSE);
+      } 
+      else
+      {
+        // Simple types can be one of: atomic, list or union.
+        int varietyType = ((XSDSimpleTypeDefinition) type).getVariety().getValue();
+
+        switch (varietyType)
+        {
+          case XSDVariety.ATOMIC:
+            {
+              XSDTypeDefinition baseType = type.getBaseType();
+              if (baseType != null && !(type.getSchema().getSchemaForSchema() == baseType.getSchema()))
+              {
+                getEnumeratedValuesForSimpleType(baseType, result);
+              }
+              else
+              {
+                getEnumeratedValuesForSimpleType(type, result);
+              }
+            }
+            break;
+          case XSDVariety.LIST:
+            {
+              XSDSimpleTypeDefinition itemTypeDefinition = ((XSDSimpleTypeDefinition) type).getItemTypeDefinition();
+              String[] values = getEnumeratedValuesForType(itemTypeDefinition);
+              for (int j = 0; j < values.length; j++) {
+            	  if(result.indexOf(values[j]) == -1) {
+            		  result.add(values[j]);
+            	  }
+              }
+            }
+            break;
+          case XSDVariety.UNION:
+            {
+              List memberTypes = ((XSDSimpleTypeDefinition) type).getMemberTypeDefinitions();
+              if (memberTypes != null && memberTypes.size() > 0)
+              {
+                Iterator i = memberTypes.iterator();
+                while (i.hasNext())
+                {
+                  XSDSimpleTypeDefinition simpleType = (XSDSimpleTypeDefinition) i.next();
+                  String[] values = getEnumeratedValuesForType(simpleType);
+                  for (int j = 0; j < values.length; j++) {
+                	  if(result.indexOf(values[j]) == -1) {
+                		  result.add(values[j]);
+                	  }
+                  }
+                }
+              }
+            }
+            break;
+        }
+      }
+    }  
+    String[] array = new String[result.size()];
+    result.toArray(array);
+    return array;
+  }
+
+  private static void getEnumeratedValuesForSimpleType(XSDTypeDefinition type, List result)
+  {
+    List enumerationFacets = ((XSDSimpleTypeDefinition) type).getEnumerationFacets();
+    for (Iterator i = enumerationFacets.iterator(); i.hasNext();)
+    {
+      XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) i.next();
+      List values = enumFacet.getValue();
+      for (Iterator j = values.iterator(); j.hasNext();)
+      {
+        Object o = j.next();
+        if (o != null)
+        {
+          if (!result.contains(o))
+          {
+            result.add(o.toString());
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Return a list of documentation elements from the given annotation. Working
+   * with documentation elements requires dropping down into the DOM model.
+   * 
+   * @param annotation -
+   *          an XSDAnnotation node.
+   * @return a list of documentation elements.
+   */
+  public static CMNodeList getDocumentations(XSDAnnotation annotation)
+  {
+    CMNodeListImpl documentations = new CMNodeListImpl();
+    if (annotation != null)
+    {
+      List documentationsElements = annotation.getUserInformation();
+      for (Iterator i = documentationsElements.iterator(); i.hasNext();)
+      {
+        documentations.getList().add(new DocumentationImpl((Element) i.next()));
+      }
+    }
+    return documentations;
+  }
+
+  /**
+   * Adapted from public static List findTypesDerivedFrom(XSDSchema schema,
+   * String namespace, String localName) in class XSDSchemaQueryTools found in
+   * org.eclipse.xsd plugin.
+   * 
+   * Find typeDefinitions that derive from a given type.
+   * 
+   * @param type
+   *          the type derived from
+   * @return List of any XSDTypeDefinitions found
+   */
+  public static List findTypesDerivedFrom(XSDTypeDefinition type)
+  {
+    ArrayList typesDerivedFrom = new ArrayList();
+    if (type != null)
+    {
+      XSDSchema schema = type.getSchema();
+      String localName = type.getName();
+      if ((null != schema) && (null != localName))
+      {
+        String namespace = schema.getTargetNamespace();
+        // A handy convenience method quickly gets all
+        // typeDefinitions within our schema; note that
+        // whether or not this returns types in included,
+        // imported, or redefined schemas is subject to change
+        List typedefs = schema.getTypeDefinitions();
+        for (Iterator iter = typedefs.iterator(); iter.hasNext();)
+        {
+          XSDTypeDefinition typedef = (XSDTypeDefinition) iter.next();
+          if (typedef instanceof XSDComplexTypeDefinition)
+          {
+            // Walk the baseTypes from this typedef seeing if any
+            // of them match the requested one
+            if (isTypeDerivedFrom(typedef, namespace, localName))
+            {
+              // We found it, return the original one and continue
+              typesDerivedFrom.add(typedef);
+              continue;
+            }
+          }
+        }
+      }
+    }
+    return typesDerivedFrom;
+  }
+
+  /**
+   * Adapted from protected static boolean isTypeDerivedFrom(XSDTypeDefinition
+   * typedef, String namespace, String localName) in class XSDSchemaQueryTools
+   * found in org.eclipse.xsd plugin.
+   * 
+   * Recursive worker method to find typeDefinitions that derive from a named
+   * type.
+   * 
+   * @see #findTypesDerivedFrom(XSDSchema, String, String)
+   * @param typeDef
+   *          to see if it's derived from
+   * @param namespace
+   *          for the type derived from
+   * @param localName
+   *          for the type derived from
+   * @return true if it is; false otherwise
+   */
+  protected static boolean isTypeDerivedFrom(XSDTypeDefinition typedef, String namespace, String localName)
+  {
+    // Walk the baseTypes from this typedef seeing if any
+    // of them match the requested one
+    XSDTypeDefinition baseType = typedef.getBaseType();
+    if (baseType == null)
+   	{
+      // typedef is a root type like xsd:anyType, so it has no base
+      return false;
+    }
+    
+    // As this convenience method if our parameters match
+    if (baseType.hasNameAndTargetNamespace(localName, namespace))
+    {
+      return true;
+    }
+    XSDTypeDefinition rootType = typedef.getRootType();
+
+    if (rootType == baseType)
+    {
+      // If we've hit the root, we aren't derived from it
+      return false;
+    }
+    else
+    {
+      // Need to check if the base type is redefined/circular
+      // otherwise this will be an endless recursive call.
+      // Moved.  See https://bugs.eclipse.org/bugs/show_bug.cgi?id=213543
+      // This method should be replaced with     XSDConstants.isOrIsDerivedFrom(baseType, localName, namespace);
+      if (rootType.isCircular())
+      {
+        return true;
+      }
+      // Otherwise continue to traverse upwards
+      return isTypeDerivedFrom(baseType, namespace, localName);
+    }
+  }
+
+  /**
+   * Returns the corresponding cmnode of the specified XML Schema node.
+   * 
+   * @param target -
+   *          an XML Schema node
+   * @return the corresponding cmnode.
+   */
+  public static CMNode getAdapter(Notifier o)
+  {
+    return (CMNode) xsdAdapterFactoryImpl.adapt(o);
+  }
+
+  /**
+   * Adapted from public String getPrefix(String ns, boolean withColon) in class
+   * TypesHelper found in org.eclipse.wst.xsd.editor plugin.
+   * 
+   * @param schema -
+   *          the relevant schema
+   * @param ns -
+   *          the relevant namespace
+   */
+  public static String getPrefix(XSDSchema schema, String ns)
+  {
+    String key = "";
+    if ((schema != null) && (ns != null))
+    {
+      Map map = schema.getQNamePrefixToNamespaceMap();
+      Iterator iter = map.keySet().iterator();
+      while (iter.hasNext())
+      {
+        Object keyObj = iter.next();
+        Object value = map.get(keyObj);
+        if (value != null && value.toString().equals(ns))
+        {
+          if (keyObj != null)
+          {
+            key = keyObj.toString();
+          }
+          else
+          {
+            key = "";
+          }
+          break;
+        }
+      }
+    }
+    return key;
+  }
+  /**
+   * The Factory for the XSD adapter model. It provides a create method for each
+   * non-abstract class of the model.
+   */
+  public static class XSDAdapterFactoryImpl extends AdapterFactoryImpl
+  {
+    public Adapter createAdapter(Notifier target)
+    {
+      XSDSwitch xsdSwitch = new XSDSwitch()
+      {
+        public Object caseXSDWildcard(XSDWildcard object)
+        {
+          return new XSDWildcardAdapter(object);
+        }
+
+        public Object caseXSDModelGroupDefinition(XSDModelGroupDefinition object)
+        {
+          return new XSDModelGroupDefinitionAdapter(object);
+        }
+
+        public Object caseXSDAttributeUse(XSDAttributeUse object)
+        {
+          return new XSDAttributeUseAdapter(object);
+        }
+
+        public Object caseXSDElementDeclaration(XSDElementDeclaration object)
+        {
+          return new XSDElementDeclarationAdapter(object);
+        }
+
+        public Object caseXSDModelGroup(XSDModelGroup object)
+        {
+          return new XSDModelGroupAdapter(object);
+        }
+
+        public Object caseXSDSchema(XSDSchema object)
+        {
+          return new XSDSchemaAdapter(object);
+        }
+      };
+      Object o = xsdSwitch.doSwitch((EObject) target);
+      Adapter result = null;
+      if (o instanceof Adapter)
+      {
+        result = (Adapter) o;
+      }
+      else
+      {
+        Thread.dumpStack();
+      }
+      return result;
+    }
+
+    public Adapter adapt(Notifier target)
+    {
+      return adapt(target, this);
+    }
+  }
+  /**
+   * XSDBaseAdapter -- an abstract base node in the model. All other model nodes
+   * are derived from it.
+   */
+  public static abstract class XSDBaseAdapter extends CMNodeImpl
+  {
+    protected CMNodeListImpl documentation = new CMNodeListImpl();
+
+    /**
+     * Returns the name of the node. The default value is an empty string value.
+     * All derived classes must override this method if they do not want the
+     * default value.
+     * 
+     * @return the name of the node.
+     */
+    public String getNodeName()
+    {
+      return "";
+    }
+
+    /**
+     * Returns true of the given factory is the factory for this XSD adapter
+     * model.
+     * 
+     * @param type -
+     *          a factory
+     * @return true if the type is the adapter factory for this model.
+     */
+    public boolean isAdapterForType(Object type)
+    {
+      return type == xsdAdapterFactoryImpl;
+    }
+
+    /**
+     * Returns true if the property is supported for this class.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return true if the property is supported.
+     */
+    public boolean supports(String propertyName)
+    {
+      return propertyName.equals(PROPERTY_NS_PREFIX_QUALIFICATION) || propertyName.equals(PROPERTY_NILLABLE) || propertyName.equals(PROPERTY_USES_LOCAL_ELEMENT_DECLARATIONS)
+          || propertyName.equals(PROPERTY_DOCUMENTATION) || propertyName.equals(PROPERTY_DOCUMENTATION_SOURCE) || propertyName.equals(PROPERTY_DOCUMENTATION_LANGUAGE)
+          || propertyName.equals(PROPERTY_MOF_NOTIFIER) || propertyName.equals(PROPERTY_DEFINITION_INFO) || propertyName.equals(PROPERTY_DEFINITION) || propertyName.equals(PROPERTY_CMDOCUMENT)
+          || propertyName.equals(PROPERTY_IS_NAME_SPACE_AWARE) || propertyName.equals(PROPERTY_SPEC) || super.supports(propertyName);
+    }
+
+    /**
+     * Returns the value of the 'Nillable' attribute. This represents the
+     * nillable infoset property. The default value is false. All derived
+     * classes must override this method if they do not want the default value.
+     * 
+     * @return the value of the 'Nillable' attribute.
+     */
+    public boolean isNillable()
+    {
+      return false;
+    }
+
+    /**
+     * Returns the cmdocument that is the owner of this cmnode. The default
+     * value is null; All derived classes must override this method if they do
+     * not want the default value.
+     * 
+     * @return the cmdocument corresponding to this cmnode.
+     */
+    public CMDocument getCMDocument()
+    {
+      return null;
+    }
+
+    /**
+     * Return a list of documentation elements. The default value is an empty
+     * CMNodeList; All derived classes must override this method if they do not
+     * want the default value.
+     * 
+     * @return a list of documentation elements.
+     */
+    protected CMNodeList getDocumentation()
+    {
+      return documentation;
+    }
+
+    /**
+     * Returns the property value for the property name. Returns null if the
+     * property is not supported.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return the property value for the property name.
+     */
+    public Object getProperty(String propertyName)
+    {
+      Object result = null;
+      if (propertyName.equals(PROPERTY_CMDOCUMENT))
+      {
+        result = getCMDocument();
+      }
+      else if (propertyName.equals(PROPERTY_DOCUMENTATION))
+      {
+        result = getDocumentation();
+      }
+      else if (propertyName.equals(PROPERTY_USES_LOCAL_ELEMENT_DECLARATIONS))
+      {
+        result = Boolean.TRUE;
+      }
+      else if (propertyName.equals(PROPERTY_IS_NAME_SPACE_AWARE))
+      {
+        result = Boolean.TRUE;
+      }
+      else if (propertyName.equals(PROPERTY_NS_PREFIX_QUALIFICATION))
+      {
+        result = getNSPrefixQualification();
+      }
+      else if (propertyName.equals(PROPERTY_NILLABLE))
+      {
+        result = isNillable() ? xsiDocument.nilAttribute : null;
+      }
+      else if (propertyName.equals(PROPERTY_MOF_NOTIFIER))
+      {
+        result = getKey();
+      }
+      else if (propertyName.equals(PROPERTY_SPEC))
+      {
+        result = getSpec();
+      }
+      else
+      {
+        result = super.getProperty(propertyName);
+        {
+          CMDocument cmDocument = getCMDocument();
+          if (cmDocument instanceof XSDSchemaAdapter)
+          {
+            AnnotationMap map = ((XSDSchemaAdapter) cmDocument).annotationMap;
+            if (map != null)
+            {
+              String spec = getSpec();
+              if (spec != null)
+              {
+                result = map.getProperty(getSpec(), propertyName);
+              }
+            }
+          }
+        }
+      }
+      return result;
+    }
+       
+
+
+    /*
+     * Returns the value of the form [attribute] which affects the target
+     * namespace of locally scoped features. The default value is null. All
+     * derived classes must override this method if they do not want the default
+     * value. @return the value of the form [attribute].
+     */
+    public Object getNSPrefixQualification()
+    {
+      return null;
+    }
+
+    /**
+     * Returns a general XPath expression for the node.
+     * 
+     * @return a general XPath expression for the node.
+     */
+    public String getSpec()
+    {
+      return "//" + getNodeName();
+    }
+  }
+  /**
+   * XSDSchemaAdapter implements CMDocument. A representation of the model
+   * object 'Schema'.
+   */
+  public static class XSDSchemaAdapter extends XSDBaseAdapter implements CMDocument
+  {
+    protected XSDSchema xsdSchema;
+    protected CMNamedNodeMapImpl namedNodeMap;
+    protected CMNamedNodeMapImpl entityNodeMap;
+    protected AnnotationMap annotationMap = new AnnotationMap();
+    protected Hashtable substitutionGroupTable;
+
+    /**
+     * Constructor.
+     * 
+     * @param xsdSchema -
+     *          the schema node.
+     */
+    public XSDSchemaAdapter(XSDSchema xsdSchema)
+    {
+      this.xsdSchema = xsdSchema;
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public Object getKey()
+    {
+      return xsdSchema;
+    }
+
+    /**
+     * Returns the filename.
+     * 
+     * @return the filename.
+     */
+    public String getNodeName()
+    {
+      // See buildCMDocument() above.
+      return xsdSchema.getSchemaLocation();
+    }
+
+    /**
+     * Returns true if the property is supported for this class.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return true if the property is supported.
+     */
+    public boolean supports(String propertyName)
+    {
+      return propertyName.equals(PROPERTY_TARGET_NAMESPACE_URI) || propertyName.equals(PROPERTY_IMPORTED_NAMESPACE_INFO) || propertyName.equals(PROPERTY_NAMESPACE_INFO)
+          || propertyName.equals(PROPERTY_ELEMENT_FORM_DEFAULT) || propertyName.equals(PROPERTY_ANNOTATION_MAP) || super.supports(propertyName);
+    }
+
+    /**
+     * Returns true if a prefix is globally required for elements.
+     * 
+     * @param xsdSchema -
+     *          the corresponding schema node.
+     * @return true if a prefix is globally required for elements.
+     */
+    protected boolean isPrefixRequired(XSDSchema xsdSchema)
+    {
+      boolean result = true;
+      if (xsdSchema.isSetElementFormDefault())
+        result = !(xsdSchema.getElementFormDefault().getValue() == XSDForm.QUALIFIED);
+      return result;
+    }
+
+    /**
+     * Returns the property value for the property name. Returns null if the
+     * property is not supported.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return the property value for the property name.
+     */
+    public Object getProperty(String propertyName)
+    {
+      Object result = null;
+      if (propertyName.equals(PROPERTY_TARGET_NAMESPACE_URI))
+      {
+        result = xsdSchema.getTargetNamespace();
+      }
+      else if (propertyName.equals(PROPERTY_IMPORTED_NAMESPACE_INFO))
+      {
+        List list = new Vector();
+        getImportedNamespaceInfo(xsdSchema, list);
+        result = list;
+      }
+      else if (propertyName.equals(PROPERTY_NAMESPACE_INFO))
+      {
+        List list = new Vector();
+        NamespaceInfo info = new NamespaceInfo();
+        info.uri = xsdSchema.getTargetNamespace();
+        info.prefix = getPrefix(xsdSchema, info.uri);
+        info.locationHint = null; // note that this locationHint info is null
+                                  // for the root xsd file
+        info.isPrefixRequired = isPrefixRequired(xsdSchema);
+        list.add(info);
+        getImportedNamespaceInfo(xsdSchema, list);
+        result = list;
+      }
+      else if (propertyName.equals(PROPERTY_COMPLETE_NAMESPACE_INFO))
+      {
+    	  result = getAllNamespaceInfo();
+      }
+      else if (propertyName.equals(PROPERTY_ELEMENT_FORM_DEFAULT))
+      {
+        result = xsdSchema.getElementFormDefault().getName();
+      }
+      else if (propertyName.equals(PROPERTY_ANNOTATION_MAP))
+      {
+        result = annotationMap;
+      }
+      else if (propertyName.equals("allElements"))
+      {
+        result = getAllElements();
+      }  
+      else if (propertyName.startsWith("getElementForType#"))
+      {
+        int index = propertyName.indexOf("#");
+        String typeName = propertyName.substring(index + 1, propertyName.length());
+        //
+        //
+        XSDTypeDefinition td = xsdSchema.resolveTypeDefinition(typeName);
+        if (td != null)
+        {
+          LocalElementVisitor localElementVisitor = new LocalElementVisitor();
+          localElementVisitor.visitTypeDefinition(td);
+          result = localElementVisitor.getCMNamedNodeMap();
+        }
+      }
+      else
+      {
+        result = super.getProperty(propertyName);
+      }
+      return result;
+    }
+
+    /**
+     * Gather information on namespaces used in external references.
+     * 
+     * @param theXSDSchema -
+     *          the corresponding schema node
+     * @param list -
+     *          the list of imported namespaces.
+     */
+    public void getImportedNamespaceInfo(XSDSchema theXSDSchema, List list)
+    {
+      for (Iterator iterator = theXSDSchema.getContents().iterator(); iterator.hasNext();)
+      {
+        XSDSchemaContent content = (XSDSchemaContent) iterator.next();
+        if (content instanceof XSDImport)
+        {
+          XSDImport xImport = (XSDImport) content;
+          XSDSchema importedXSDSchema = xImport.getResolvedSchema();
+          NamespaceInfo info = new NamespaceInfo();
+          info.uri = xImport.getNamespace();
+          info.prefix = getPrefix(importedXSDSchema, info.uri);
+          info.locationHint = xImport.getSchemaLocation();
+          if (importedXSDSchema != null)
+          {
+            info.isPrefixRequired = isPrefixRequired(importedXSDSchema);
+          }
+          list.add(info);
+        }
+      }
+    }
+
+    /**
+     * Returns set of named (top-level) element declarations for this schema
+     * node.
+     * 
+     * @return a set of named (top-level) element declarations.
+     */
+    public CMNamedNodeMap getElements()
+    {
+      if (namedNodeMap == null)
+      {
+        namedNodeMap = new CMNamedNodeMapImpl();
+        
+        // Note that if we call xsdSchema.getElementDeclarations()
+        // we get 'more' elements than we really want since we also
+        // get 'imported' elements.  Below we test to ensure the elements
+        // actually have the same target namespace as the schema.
+        String targetNamespace = xsdSchema.getTargetNamespace();
+        for (Iterator i = xsdSchema.getElementDeclarations().iterator(); i.hasNext();)
+        {
+          XSDElementDeclaration ed = (XSDElementDeclaration) i.next();
+          if (targetNamespace != null ? targetNamespace.equals(ed.getTargetNamespace()) : ed.getTargetNamespace() == null)
+          {
+            XSDElementDeclarationAdapter adapter = (XSDElementDeclarationAdapter) getAdapter(ed);
+            namedNodeMap.getHashtable().put(adapter.getNodeName(), adapter);
+          }
+        }
+      }
+      return namedNodeMap;
+    }
+
+    /**
+     * Returns the built-in entity declarations.
+     * 
+     * @return the built-in entity declarations.
+     */
+    public CMNamedNodeMap getEntities()
+    {
+      if (entityNodeMap == null)
+      {
+        entityNodeMap = new CMNamedNodeMapImpl();
+        // add the built in entity declarations
+        entityNodeMap.getHashtable().put("amp", new CMEntityDeclarationImpl("amp", "&"));
+        entityNodeMap.getHashtable().put("lt", new CMEntityDeclarationImpl("lt", "<"));
+        entityNodeMap.getHashtable().put("gt", new CMEntityDeclarationImpl("gt", ">"));
+        entityNodeMap.getHashtable().put("quot", new CMEntityDeclarationImpl("quot", "\""));
+        entityNodeMap.getHashtable().put("apos", new CMEntityDeclarationImpl("apos", "'"));
+      }
+      return entityNodeMap;
+    }
+
+    /**
+     * Returns the type of the node. The types are defined in CMNode class
+     * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+     * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+     * DOCUMENTATION).
+     * 
+     * @return the type of this node.
+     */
+    public int getNodeType()
+    {
+      return DOCUMENT;
+    }
+
+    /*
+     * Returns null. !!! Why are we not implementing this???? @return null.
+     */
+    public CMNamespace getNamespace()
+    {
+      return null;
+    }
+
+    /**
+     * Returns this.
+     * 
+     * @return this.
+     */
+    public CMDocument getCMDocument()
+    {
+      return this;
+    }
+    
+    public CMNamedNodeMap getAllElements()
+    {
+      CMNamedNodeMapImpl map = new CMNamedNodeMapImpl();
+      for (Iterator i = getElements().iterator(); i.hasNext(); )
+      {
+        CMElementDeclaration ed = (CMElementDeclaration)i.next();
+        map.put(ed);           
+        addLocalElementDefinitions(map, ed);              
+      }     
+      return map;
+    }
+    
+    protected void addLocalElementDefinitions(CMNamedNodeMapImpl map, CMElementDeclaration parentElementDeclaration)
+    {
+      CMNamedNodeMap localElementMap = parentElementDeclaration.getLocalElements();
+      for (Iterator i = localElementMap.iterator(); i.hasNext(); )
+      {
+        CMElementDeclaration ed = (CMElementDeclaration)i.next();
+        if (map.getNamedItem(ed.getNodeName()) == null)
+        {  
+          map.put(ed);        
+          addLocalElementDefinitions(map, ed);
+        }  
+      }               
+    } 
+    
+    
+    /**
+     * Generates a List of NamespaceInfo objects corresponding to the target namespace of the given schema 
+     * and the target namespaces of all its recursively imported/included referenced schemas. All namespace
+     * prefixes in the list are guaranteed to be unique. Prefix collitions are resolved by concatenating
+     * integer numbers to each repeated prefix found i.e. tns, tns1, tns2...
+     * All schema locations in the list are formated as encoded URIs relative to the given schema.
+     * Schemas that are imported/included but not referenced will not appear in the list.
+     * @return List of NamespaceInfo objects
+     * 
+     */
+	public List getAllNamespaceInfo() {
+		List namespaceList = new ArrayList();
+		List resources  = xsdSchema.eResource().getResourceSet().getResources();
+		Iterator i = resources.iterator();
+		while(i.hasNext()) {
+			XSDResourceImpl resource = (XSDResourceImpl) i.next();
+			if(resource.isLoaded()) {
+				XSDSchema schema = resource.getSchema();
+				if(!isDataInNamespaceList(namespaceList, 0, schema.getTargetNamespace())) {
+					NamespaceInfo info = new NamespaceInfo();
+					info.uri = schema.getTargetNamespace();
+					info.isPrefixRequired = isPrefixRequired(schema);
+					info.prefix = getPrefix(schema,schema.getTargetNamespace());
+					if("http://www.w3.org/XML/1998/namespace".equals(info.uri)) {
+    					info.prefix = "xml";
+    				} else if("http://www.w3.org/2000/xmlns".equals(info.uri)) {
+    					info.prefix = "xmlns";
+    				} else {
+    					if(info.uri != null && info.uri != "") {
+	    					int n = 1;
+	    	    			if(info.prefix == null || info.prefix.equals("")) {
+	    	    				info.prefix = "p";
+	    	    			}
+	    	    			String prefix = info.prefix;
+	    	    			while(isDataInNamespaceList(namespaceList, 1, info.prefix)) {
+	    	    				info.prefix = prefix + n++;
+	    	    			}
+    					}
+    				}
+	    			URI relative = URI.createURI(xsdSchema.getSchemaLocation(), true);
+					URI absolute = URI.createURI(schema.getSchemaLocation(), true);
+					URI resolvedRelative = absolute.deresolve(relative);
+					info.locationHint = resolvedRelative.toString();
+	    			namespaceList.add(info);
+				}
+			}
+		}
+		return namespaceList;	
+	}
+
+
+    /**
+     * Searches for a given value in a list of namespaces.
+     * 
+     * @param namespaceList:	List of NamespaceInfo objects
+     * @param data:				integer representing the data in the namespace as follows:
+     * 								0:	uri
+     * 								1:	prefix
+     * 								2:	locationHint
+     * @param value				String containing the value for search
+     * @return					true if the value is found, false otherwise
+     */
+    private boolean isDataInNamespaceList(List namespaceList, int data, String value) {
+		if (namespaceList != null) {
+			Iterator i = namespaceList.iterator();
+			while (i.hasNext()) {
+				NamespaceInfo namespaceInfo = (NamespaceInfo) i.next();
+				switch(data) {
+					case 0:	if (namespaceInfo.uri != null && namespaceInfo.uri.equals(value)) {
+						return true;
+					}
+					case 1:	if (namespaceInfo.prefix != null && namespaceInfo.prefix.equals(value)) {
+						return true;
+					}
+					case 2:	if (namespaceInfo.locationHint != null && namespaceInfo.locationHint.equals(value)) {
+						return true;
+					}
+				}
+			}
+		}
+    	return false;
+    }
+  }
+  /**
+   * XSDAttributeUseAdapter implements CMAttributeDeclaration. A representation
+   * of the model object 'Attribute Use'.
+   */
+  public static class XSDAttributeUseAdapter extends XSDBaseAdapter implements CMAttributeDeclaration
+  {
+    // provides access to the XML Schema node
+    protected XSDAttributeUse xsdAttributeUse;
+    // provides access to the type of the attribute
+    protected CMDataType dataType = new DataTypeImpl();
+
+    /**
+     * Constructor.
+     * 
+     * @param xsdAttributeUse -
+     *          the XML Schema node.
+     */
+    public XSDAttributeUseAdapter(XSDAttributeUse xsdAttributeUse)
+    {
+      this.xsdAttributeUse = xsdAttributeUse;
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public Object getKey()
+    {
+      return xsdAttributeUse;
+    }
+
+    /**
+     * Returns a general XPath expression for the node.
+     * 
+     * @return a general XPath expression for the node.
+     */
+    public String getSpec()
+    {
+      return "//@" + getAttrName();
+    }
+
+    /**
+     * Returns the type of the node. The types are defined in CMNode class
+     * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+     * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+     * DOCUMENTATION).
+     * 
+     * @return the type of this node.
+     */
+    public int getNodeType()
+    {
+      return ATTRIBUTE_DECLARATION;
+    }
+
+    /**
+     * Returns the name of the node. Similar to getAttrName().
+     * 
+     * @return the name of the node.
+     */
+    public String getNodeName()
+    {
+      return getAttrName();
+    }
+
+    /**
+     * getEnumAttr method
+     * 
+     * @return java.util.Enumeration
+     * @deprecated -- to be replaced in future with additional CMDataType
+     *             methods (currently found on CMDataTypeHelper)
+     */
+    public Enumeration getEnumAttr()
+    {
+      return Collections.enumeration(Collections.EMPTY_LIST);
+    }
+
+    /**
+     * Returns the name of this attribute. Similar to getNodeName().
+     * 
+     * @return the name of this attribute.
+     */
+    public String getAttrName()
+    {
+      return xsdAttributeUse.getAttributeDeclaration().getName();
+    }
+
+    /**
+     * Returns the type of the attribute.
+     * 
+     * @return the type of the attribute.
+     */
+    public CMDataType getAttrType()
+    {
+      return dataType;
+    }
+
+    /**
+     * Returns the value of the default or fixed constraint.
+     * 
+     * @return the value of the default or fixed constraint.
+     */
+    public String getDefaultValue()
+    {
+      return dataType.getImpliedValue();
+    }
+
+    /**
+     * Returns the usage constraint for this attribute. The usages are defined
+     * in CMAttributeDeclaration class (OPTIONAL, REQUIRED, FIXED or
+     * PROHIBITED).
+     * 
+     * @return the usage constraint for this attribute.
+     */
+    public int getUsage()
+    {
+      int useKind = OPTIONAL;
+      switch (xsdAttributeUse.getUse().getValue())
+      {
+        case XSDAttributeUseCategory.OPTIONAL : {
+          useKind = OPTIONAL;
+          break;
+        }
+        case XSDAttributeUseCategory.PROHIBITED : {
+          useKind = PROHIBITED;
+          break;
+        }
+        case XSDAttributeUseCategory.REQUIRED : {
+          useKind = REQUIRED;
+          break;
+        }
+      }
+      return useKind;
+    }
+
+    /*
+     * Returns the value of the form [attribute] which affects the target
+     * namespace of locally scoped features. If the form is not set on this
+     * attribute, then see if there is a globally defined default. @return the
+     * value of the form [attribute].
+     */
+    public Object getNSPrefixQualification()
+    {
+      String form = null;
+      if (xsdAttributeUse.getContent() != xsdAttributeUse.getAttributeDeclaration())
+      {
+      	form =  "qualified";
+      }	
+      else if (xsdAttributeUse.getContent().isSetForm())
+      {
+        form = xsdAttributeUse.getContent().getForm().getName();
+      }
+      else
+      {
+        XSDSchema schema = xsdAttributeUse.getSchema();
+        if (schema != null)
+          form = schema.getAttributeFormDefault().getName();
+      }
+      return form;
+    }
+
+    /**
+     * Return a list of documentation elements.
+     * 
+     * @return a list of documentation elements.
+     */
+    protected CMNodeList getDocumentation()
+    {
+      // Check if it is an attribute reference first
+      XSDAttributeDeclaration xsdAttributeRef = xsdAttributeUse.getContent();
+      if (xsdAttributeRef != null && xsdAttributeRef.isAttributeDeclarationReference())
+      {
+        // Determine if it has annotations
+        boolean refHasDocumentation = false;
+        XSDAnnotation refAnnotation = xsdAttributeRef.getAnnotation();
+        if (refAnnotation != null)
+        {
+          // Determine if there is documentation
+          if (!refAnnotation.getUserInformation().isEmpty())
+          {
+            refHasDocumentation = true;
+          }
+        }
+        if (refHasDocumentation)
+          return getDocumentations(refAnnotation);
+      }
+      
+      // Otherwise proceed with getting the documentation as usual
+      XSDAttributeDeclaration xsdAttributeDeclaration =  xsdAttributeUse.getAttributeDeclaration();      
+      XSDAnnotation annotation = xsdAttributeDeclaration.getAnnotation();
+      
+      return getDocumentations(annotation);
+    }
+
+    /**
+     * Returns the cmdocument that is the owner of this cmnode.
+     * 
+     * @return the cmdocument corresponding to this cmnode.
+     */
+    public CMDocument getCMDocument()
+    {
+      return (CMDocument) getAdapter(xsdAttributeUse.getSchema());
+    }
+    /**
+     * XSDAttributeUseAdapter.DataTypeImpl An inner class to hold type
+     * information for this attribute.
+     */
+    public class DataTypeImpl implements CMDataType
+    {
+      /**
+       * Returns the type of the node. The types are defined in CMNode class
+       * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+       * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+       * DOCUMENTATION).
+       * 
+       * @return the type of this node.
+       */
+      public int getNodeType()
+      {
+        return CMNode.DATA_TYPE;
+      }
+
+      /**
+       * Returns the name of the attribute type. Same as getDataTypeName().
+       * 
+       * @return the name of the attribute type.
+       */
+      public String getNodeName()
+      {
+        return getDataTypeName();
+      }
+
+      /**
+       * Returns true if the property is supported for this class.
+       * 
+       * @param propertyName -
+       *          name of a property
+       * @return true if the property is supported.
+       */
+      public boolean supports(String propertyName)
+      {
+    	  return (PROPERTY_WHITESPACE_FACET.equals(propertyName));
+      }
+
+      /**
+       * Returns the property value for the property name. Returns null if the
+       * property is not supported.
+       * 
+       * @param propertyName -
+       *          name of a property
+       * @return the property value for the property name.
+       */
+      public Object getProperty(String propertyName)
+      {
+    	  if(PROPERTY_WHITESPACE_FACET.equals(propertyName))
+		  	return getWhiteSpaceFacetValue();
+    	  return null;
+      }
+
+      /**
+       * Returns the name of the attribute type. Same as getNodeName().
+       * 
+       * @return the name of the attribute type.
+       */
+      public String getDataTypeName()
+      {
+        XSDSimpleTypeDefinition sc = xsdAttributeUse.getAttributeDeclaration().getTypeDefinition();
+        String typeName = sc.getName();
+        return typeName != null ? typeName : "string";  //$NON-NLS-1$
+      }
+
+      /**
+       * Returns the kind of constraint: none, default or fixed. The kinds are
+       * defined in CMDataType class (IMPLIED_VALUE_NONE, IMPLIED_VALUE_FIXED or
+       * IMPLIED_VALUE_DEFAULT).
+       * 
+       * @return the kind of constraint: none, default or fixed.
+       */
+      public int getImpliedValueKind()
+      {
+        int result = IMPLIED_VALUE_NONE;
+        if (xsdAttributeUse.isSetConstraint())
+        {
+          if (xsdAttributeUse.getConstraint().getValue() == XSDConstraint.DEFAULT)
+            result = IMPLIED_VALUE_DEFAULT;
+          else if (xsdAttributeUse.getConstraint().getValue() == XSDConstraint.FIXED)
+            result = IMPLIED_VALUE_FIXED;
+        }
+        return result;
+      }
+
+      /**
+       * Returns the value of the default or fixed constraint.
+       * 
+       * @return the value of the default or fixed constraint.
+       */
+      public String getImpliedValue()
+      {
+        String result = null;
+        if (xsdAttributeUse.isSetConstraint())
+        {
+          result = xsdAttributeUse.getLexicalValue();
+        }
+        return result;
+      }
+
+      /**
+       * Returns the enumerated values for the attribute type.
+       * 
+       * @return the enumerated values for the attribute type.
+       */
+      public String[] getEnumeratedValues()
+      {
+        return getEnumeratedValuesForType(getXSDType());
+      }
+
+      /**
+       * Generate a valid value for the attribute based on its type.
+       * 
+       * @return a valid value for the attribute based on its type.
+       */
+      public String generateInstanceValue()
+      {
+        XSDAttributeDeclaration attr = xsdAttributeUse.getAttributeDeclaration();
+        return XSDTypeUtil.getInstanceValue(attr.getResolvedAttributeDeclaration().getTypeDefinition());
+      }
+
+      /**
+       * Returns the corresponding XML Schema type definition.
+       * 
+       * @return the corresponding XML Schema type definition.
+       */
+      protected XSDTypeDefinition getXSDType()
+      {
+        XSDAttributeDeclaration attr = xsdAttributeUse.getAttributeDeclaration();
+        return attr.getResolvedAttributeDeclaration().getTypeDefinition();
+      }
+      
+      /**
+       * Obtains the whitespace facet of the XSD simple type.
+       * 
+       * @return The whitespace facet for the XSD type. If none is
+       * defined, or it is a complex type, null.
+       */
+      private String getWhiteSpaceFacetValue()
+      {
+        XSDSimpleTypeDefinition def = getXSDType().getSimpleType();
+        return (def != null && def.getEffectiveWhiteSpaceFacet() != null) ? def.getEffectiveWhiteSpaceFacet().getLexicalValue() : null ;
+      }
+    }
+  }
+  /**
+   * ElementDeclarationBaseImpl implements CMElementDeclaration. This is the
+   * base class for XSDElementDeclaration and DerivedElementDeclarationImpl.
+   * 
+   * Abstract methods in this class are: public abstract Object getKey(); public
+   * abstract Object getNSPrefixQualification(); public abstract
+   * XSDElementDeclaration getXSDElementDeclaration(); public abstract
+   * XSDTypeDefinition getXSDType(); public abstract List getXSITypes(); public
+   * abstract CMElementDeclaration getDerivedElementDeclaration(String
+   * uriQualifiedTypeName); public abstract CMNode getDefinition(); public
+   * abstract String getDefinitionInfo(); public abstract CMNodeListImpl
+   * getSubstitutionGroup();
+   */
+  public static abstract class ElementDeclarationBaseImpl extends XSDBaseAdapter implements CMElementDeclaration
+  {
+    protected CMDataType dataType = new DataTypeImpl();
+    protected CMNamedNodeMap namedNodeMap;
+
+    /**
+     * Returns corresponding XML Schema element declaration.
+     * 
+     * @return corresponding XML Schema element declaration.
+     */
+    protected abstract XSDElementDeclaration getXSDElementDeclaration();
+
+    /**
+     * Returns corresponding XML Schema element declaration.
+     * 
+     * @return corresponding XML Schema element declaration.
+     */
+    protected abstract XSDElementDeclaration getResolvedXSDElementDeclaration();
+
+    /**
+     * Returns the type of the node. The types are defined in CMNode class
+     * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+     * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+     * DOCUMENTATION).
+     * 
+     * @return the type of this node.
+     */
+    public int getNodeType()
+    {
+      return ELEMENT_DECLARATION;
+    }
+
+    /**
+     * Returns the name of the node. The same as getElementName().
+     * 
+     * @return the name of the node.
+     */
+    public String getNodeName()
+    {
+      return getElementName();
+    }
+
+    /**
+     * Returns the name of this element. The same as getNodeName().
+     * 
+     * @return the name of this element.
+     */
+    public String getElementName()
+    {
+      String result = getResolvedXSDElementDeclaration().getName();
+      return result != null ? result : "";
+    }
+
+    /**
+     * Returns true if the property is supported for this class.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return true if the property is supported.
+     */
+    public boolean supports(String propertyName)
+    {
+      return propertyName.equals(PROPERTY_XSITYPES) || propertyName.equals(PROPERTY_DERIVED_ELEMENT_DECLARATION) || propertyName.equals(PROPERTY_SUBSTITUTION_GROUP)
+          || propertyName.equals(PROPERTY_ABSTRACT) || super.supports(propertyName);
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public abstract Object getKey();
+
+    /**
+     * Returns the set of attributes defined for this element.
+     * 
+     * @return the set of attributes defined for this element.
+     */
+    public CMNamedNodeMap getAttributes()
+    {
+      CMNamedNodeMapImpl map = new CMNamedNodeMapImpl();
+      XSDTypeDefinition td = getXSDType();
+      getAttributes(map, td);
+      addXSITypeAttribute(map);
+      return map;
+    }
+
+    /**
+     * Gather the set of attributes defined for this element.
+     * 
+     * @param map -
+     *          used for returning the set of attributes.
+     * @param xsdTypeDefinition -
+     *          the type definition for this element.
+     */
+    public void getAttributes(CMNamedNodeMapImpl map, XSDTypeDefinition xsdTypeDefinition)
+    {
+      if (xsdTypeDefinition instanceof XSDComplexTypeDefinition)
+      {
+        XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition) xsdTypeDefinition;
+        for (Iterator i = ctd.getAttributeUses().iterator(); i.hasNext();)
+        {
+          XSDAttributeUse xsdAttributeUse = (XSDAttributeUse) i.next();
+          XSDAttributeUseAdapter adapter = (XSDAttributeUseAdapter) getAdapter(xsdAttributeUse);
+          if (adapter != null && adapter.getNodeName() != null)
+          {
+            map.getHashtable().put(adapter.getNodeName(), adapter);
+          }
+        }
+      }
+    }
+
+    /**
+     * Returns the content for this element.
+     * 
+     * @return the content for this element.
+     */
+    public CMContent getContent()
+    {
+      CMContent result = null;
+      XSDTypeDefinition td = getXSDType();
+      if (td instanceof XSDComplexTypeDefinition)
+      {
+        DerivedChildVisitor dcv = new DerivedChildVisitor(td);
+        dcv.visitTypeDefinition(td);
+        CMNodeList nodeList = dcv.getChildNodeList();
+        if (nodeList.getLength() > 1)
+        {
+          result = new CMGroupImpl(nodeList, CMGroup.SEQUENCE);
+        }
+        else if (nodeList.getLength() > 0)
+        {
+          result = (CMContent) nodeList.item(0);
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Returns the content type of this element. The content type is defined in
+     * CMElementDeclaration (ANY, EMPTY, ELEMENT, MIXED, PCDATA or CDATA).
+     * 
+     * @return the content type of this element.
+     */
+    public int getContentType()
+    {
+      int contentType = EMPTY;
+      XSDTypeDefinition td = getXSDType();
+      if (td instanceof XSDSimpleTypeDefinition)
+      {
+        String typeName = td.getName();
+        if (typeName != null && typeName.equals("anyType"))
+        {
+          contentType = ANY;
+        }
+        else
+        {
+          contentType = PCDATA;
+        }
+      }
+      else if (td instanceof XSDComplexTypeDefinition)
+      {
+        XSDContentTypeCategory category = ((XSDComplexTypeDefinition) td).getContentTypeCategory();
+        if (category != null)
+        {
+          switch (category.getValue())
+          {
+            case XSDContentTypeCategory.ELEMENT_ONLY :
+              contentType = ELEMENT;
+              break;
+            case XSDContentTypeCategory.EMPTY :
+              contentType = EMPTY;
+              break;
+            case XSDContentTypeCategory.MIXED :
+              contentType = MIXED;
+              break;
+            case XSDContentTypeCategory.SIMPLE :
+              contentType = PCDATA;
+              break;
+          }
+        }
+      }
+      return contentType;
+    }
+
+    /**
+     * Returns the name of the element type.
+     * 
+     * @return the name of the element type.
+     */
+    public CMDataType getDataType()
+    {
+      CMDataType result = null;
+      int contentType = getContentType();
+      boolean hasDataType = contentType == PCDATA || contentType == MIXED;
+      if (hasDataType)
+      {
+        result = dataType;
+      }
+      return result;
+    }
+
+    /**
+     * Returns the value of 'Min Occurs' attribute. The default value is "1".
+     * 
+     * @return the value of the 'Min Occurs' attribute.
+     */
+    public int getMinOccur()
+    {
+      return getMinOccurs(getXSDElementDeclaration());
+    }
+
+    /**
+     * Returns the value of the 'Max Occurs' attribute. The default value is
+     * "1".
+     * 
+     * @return the value of the 'Max Occurs' attribute.
+     */
+    public int getMaxOccur()
+    {
+      return getMaxOccurs(getXSDElementDeclaration());
+    }
+
+    /**
+     * Returns the referenced element declaration if this is an element
+     * reference. Otherwise it returns itself.
+     * 
+     * @return an element declaration.
+     */
+    protected abstract CMNode getDefinition();
+
+    /**
+     * Returns a string indicating whether the element declaration is global or
+     * local. Returns null if this is an element reference.
+     * 
+     * @return a string indicating whether the element declaration is global or
+     *         local.
+     */
+    protected abstract String getDefinitionInfo();
+
+    /**
+     * Returns the elements local to this element declaration.
+     * 
+     * @return the elements local to this element declaration.
+     */
+    public CMNamedNodeMap getLocalElements()
+    {
+      if (namedNodeMap == null)
+      {
+        LocalElementVisitor localElementVisitor = new LocalElementVisitor();
+        localElementVisitor.visitTypeDefinition(getXSDType());
+        namedNodeMap = localElementVisitor.getCMNamedNodeMap();
+      }
+      return namedNodeMap;
+    }
+
+    /**
+     * Returns the property value for the property name. Returns null if the
+     * property is not supported.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return the property value for the property name.
+     */
+    public Object getProperty(String propertyName)
+    {
+      Object result = null;
+      if (propertyName.equals(PROPERTY_DEFINITION_INFO))
+      {
+        result = getDefinitionInfo();
+      }
+      else if (propertyName.equals(PROPERTY_DEFINITION))
+      {
+        result = getDefinition();
+      }
+      else if (propertyName.equals(PROPERTY_XSITYPES))
+      {
+        result = getXSITypes();
+      }
+      else if (propertyName.startsWith(PROPERTY_DERIVED_ELEMENT_DECLARATION))
+      {
+        int index = propertyName.indexOf("=");
+        if (index != -1)
+        {
+          String uriQualifiedTypeName = propertyName.substring(index + 1);
+          result = getDerivedElementDeclaration(uriQualifiedTypeName);
+        }
+      }
+      else if (propertyName.equals(PROPERTY_SUBSTITUTION_GROUP))
+      {
+        return getSubstitutionGroup();
+      }
+      else if (propertyName.equals(PROPERTY_SUBSTITUTION_GROUP_VALUE))
+      {
+        return getSubstitutionGroupValue();
+      }
+      else if (propertyName.equals(PROPERTY_ABSTRACT))
+      {
+        return getAbstract();
+      }
+      else
+      {
+        result = super.getProperty(propertyName);
+      }
+      return result;
+    }
+
+    /**
+     * Returns the value of the 'Nillable' attribute. This represents the
+     * nillable infoset property. The default value is false.
+     * 
+     * @return the value of the 'Nillable' attribute.
+     */
+    public boolean isNillable()
+    {
+      if (getXSDElementDeclaration().isSetNillable())
+        return getXSDElementDeclaration().isNillable();
+      else
+        return false;
+    }
+
+    /**
+     * Returns the value of the substitutionGroup attribute.
+     * 
+     * @return value of the substitutionGroup attribute
+     */
+    public String getSubstitutionGroupValue()
+    {
+    	XSDElementDeclaration xsdElementDeclaration = getResolvedXSDElementDeclaration();
+    	if(xsdElementDeclaration != null)
+    	{
+    		Element element = xsdElementDeclaration.getElement();
+    		if(element != null)
+    		{
+    			if (element.hasAttribute(XSDConstants.SUBSTITUTIONGROUP_ATTRIBUTE))
+    				return element.getAttribute(XSDConstants.SUBSTITUTIONGROUP_ATTRIBUTE);
+    			else return null;
+    		}
+    	}
+      return "";
+    }
+    
+    
+    /**
+     * Returns whether the element is 'Abstract'.
+     * 
+     * @return true if the element is 'Abstract'.
+     */
+    public Boolean getAbstract()
+    {
+      boolean result = getResolvedXSDElementDeclaration().isAbstract();
+      // TODO... how do we handle elements with abstract type's ?
+      return result ? Boolean.TRUE : Boolean.FALSE;
+    }
+
+    /**
+     * Returns a list of documentation elements.
+     * 
+     * @return a list of documentation elements.
+     */
+    protected CMNodeList getDocumentation()
+    {
+      XSDElementDeclaration xsdElementDeclaration = getXSDElementDeclaration();
+      XSDAnnotation annotation = xsdElementDeclaration.getAnnotation();
+      
+      // Need to check to see if there are any documentation elements.  Just because
+      // there is an annotation element doesn't mean that the documentation element is
+      // also there, as it could contain just appinfo elements.
+      
+      boolean hasDocumentation = false;
+      
+      if (annotation != null) {
+    	  if (!annotation.getUserInformation().isEmpty()) {
+    		  hasDocumentation = true;
+    	  }
+      }
+
+      // The element may not have annotation and if it is referenced
+      // check the referenced attribute for the annotations.
+      if (hasDocumentation == false) {
+          if (xsdElementDeclaration.isElementDeclarationReference()) {
+        	  annotation = xsdElementDeclaration.getResolvedElementDeclaration().getAnnotation();
+          }
+      }
+      
+      return getDocumentations(annotation);
+    }
+
+    /**
+     * Returns the corresponding XML Schema type definition.
+     * 
+     * @return the corresponding XML Schema type definition.
+     */
+    protected abstract XSDTypeDefinition getXSDType();
+
+    /**
+     * Returns a list of type names.
+     * 
+     * @return a list of type names.
+     */
+    protected abstract List getXSITypes();
+
+    /**
+     * Return the element declaration corresponding to the given uri qualified
+     * type name.
+     * 
+     * @param uriQualifiedTypeName -
+     *          a uri qualified type name
+     * @return corresponding element declaration.
+     */
+    protected abstract CMElementDeclaration getDerivedElementDeclaration(String uriQualifiedTypeName);
+
+    /**
+     * Returns a list of documentation elements.
+     * 
+     * @return a list of documentation elements.
+     */
+    protected void addXSITypeAttribute(CMNamedNodeMapImpl map)
+    {
+      List list = getXSITypes();
+      int listSize = list.size();
+      if (listSize > 1)
+      {
+        CMDataType dataType = new CMDataTypeImpl("typeNames", (String) null);
+        CMAttributeDeclarationImpl attribute = new CMAttributeDeclarationImpl("type", CMAttributeDeclaration.OPTIONAL, dataType);
+        attribute.setCMDocument(xsiDocument);
+        attribute.setPrefixQualification(true);
+        attribute.setXSITypes(list);
+
+        // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=225447
+        // For now, don't clobber the attribute with the same 'type' name defined in the grammar
+        // with the xsi:type attribute.  The impact of this change will be that for content assist, the non-xsi
+        // type attribute will be presented; the generated XML from XSD will have this attribute created, and
+        // not the xsi:type attribute.
+        Hashtable hashTable = map.getHashtable();
+        String name = attribute.getNodeName();
+        if (!hashTable.containsKey(name))
+          hashTable.put(name, attribute);
+      }
+    }
+
+    /**
+     * Returns the cmdocument that is the owner of this cmnode.
+     * 
+     * @return the cmdocument corresponding to this cmnode.
+     */
+    public CMDocument getCMDocument()
+    {      
+      XSDSchema schema = getResolvedXSDElementDeclaration().getSchema();
+      if (schema == null)
+        return null;
+      else  
+        return (CMDocument) getAdapter(schema);
+    }
+
+    /**
+     * Returns the substitution group for this element. The group consists of:
+     * 1. the element declaration itself 2. and any element declaration that has
+     * a {substitution group affiliation} in the group
+     * 
+     * @return the substitution group for this element.
+     */
+    protected abstract CMNodeListImpl getSubstitutionGroup();
+    /*
+     * XSDElementDeclarationAdapter.DataTypeImpl An inner class to hold type
+     * information for this element.
+     */
+    public class DataTypeImpl implements CMDataType
+    {
+      /**
+       * Returns the type of the node. The types are defined in CMNode class
+       * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+       * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+       * DOCUMENTATION).
+       * 
+       * @return the type of this node.
+       */
+      public int getNodeType()
+      {
+        return CMNode.DATA_TYPE;
+      }
+
+      /**
+       * Returns the name of the element type. Same as getDataTypeName().
+       * 
+       * @return the name of the element type.
+       */
+      public String getNodeName()
+      {
+        return getDataTypeName();
+      }
+
+      /**
+       * Returns true if the property is supported for this class.
+       * 
+       * @param propertyName -
+       *          name of a property
+       * @return true if the property is supported.
+       */
+      public boolean supports(String propertyName)
+      {
+        return (PROPERTY_WHITESPACE_FACET.equals(propertyName));
+      }
+
+      /**
+       * Returns the property value for the property name. Returns null if the
+       * property is not supported.
+       * 
+       * @param propertyName -
+       *          name of a property
+       * @return the property value for the property name.
+       */
+      public Object getProperty(String propertyName)
+      {
+        if(PROPERTY_WHITESPACE_FACET.equals(propertyName))
+        	return getWhiteSpaceFacetValue();
+        return null;
+      }
+
+      /**
+       * Returns the name of the element type. Same as getNodeName().
+       * 
+       * @return the name of the element type.
+       */
+      public String getDataTypeName()
+      {
+        String typeName = null;
+        XSDSimpleTypeDefinition std = getXSDType().getSimpleType();
+        if (std != null)
+          typeName = std.getName();
+        return typeName != null ? typeName : "string"; //$NON-NLS-1$
+      }
+
+      /**
+       * Returns the kind of constraint: none, default or fixed. The kinds are
+       * defined in CMDataType class (IMPLIED_VALUE_NONE, IMPLIED_VALUE_FIXED or
+       * IMPLIED_VALUE_DEFAULT).
+       * 
+       * @return the kind of constraint: none, default or fixed.
+       */
+      public int getImpliedValueKind()
+      {
+        int result = IMPLIED_VALUE_NONE;
+        if (getXSDElementDeclaration().isSetConstraint())
+        {
+          if (getXSDElementDeclaration().getConstraint().getValue() == XSDConstraint.DEFAULT)
+            result = IMPLIED_VALUE_DEFAULT;
+          else if (getXSDElementDeclaration().getConstraint().getValue() == XSDConstraint.FIXED)
+            result = IMPLIED_VALUE_FIXED;
+        }
+        return result;
+      }
+
+      /**
+       * Returns the value of the default or fixed constraint.
+       * 
+       * @return the value of the default or fixed constraint.
+       */
+      public String getImpliedValue()
+      {
+        String result = null;
+        if (getXSDElementDeclaration().isSetConstraint())
+        {
+          result = getXSDElementDeclaration().getLexicalValue();
+        }
+        return result;
+      }
+
+      /**
+       * Returns the enumerated values for the attribute type.
+       * 
+       * @return the enumerated values for the attribute type.
+       */
+      public String[] getEnumeratedValues()
+      {
+        return getEnumeratedValuesForType(getXSDType());
+      }
+
+      public String generateInstanceValue()
+      {
+        return XSDTypeUtil.getInstanceValue(getXSDType());
+      }
+
+      /**
+       * Returns the cmdocument that is the owner of this cmnode.
+       * 
+       * @return the cmdocument corresponding to this cmnode.
+       */
+      public CMDocument getCMDocument()
+      {
+        return (CMDocument) getAdapter(getXSDElementDeclaration().getSchema());
+      }
+      
+      /**
+       * Obtains the whitespace facet of the XSD simple type.
+       * 
+       * @return The whitespace facet for the XSD type. If none is
+       * defined, or it is a complex type, null.
+       */
+      private String getWhiteSpaceFacetValue()
+      {
+        XSDSimpleTypeDefinition def = getXSDType().getSimpleType();
+        return (def != null && def.getEffectiveWhiteSpaceFacet() != null) ? def.getEffectiveWhiteSpaceFacet().getLexicalValue() : null ;
+      }
+    }
+  }
+  /**
+   * XSDElementDeclarationAdapter implements CMElementDeclaration. A
+   * representation of the model object 'Element Declaration'.
+   */
+  public static class XSDElementDeclarationAdapter extends ElementDeclarationBaseImpl
+  {
+    protected List derivedElementDeclarations = null;
+    protected List xsiTypes = null;
+    protected XSDElementDeclaration xsdElementDeclaration;
+    protected CMNodeListImpl substitutionGroup;
+
+    /**
+     * Constructor.
+     * 
+     * @param xsdElementDeclaration -
+     *          the XML Schema node.
+     */
+    public XSDElementDeclarationAdapter(XSDElementDeclaration xsdElementDeclaration)
+    {
+      this.xsdElementDeclaration = xsdElementDeclaration;
+    }
+
+    /**
+     * Returns corresponding XML Schema element declaration.
+     * 
+     * @return corresponding XML Schema element declaration.
+     */
+    protected XSDElementDeclaration getXSDElementDeclaration()
+    {
+      return xsdElementDeclaration;
+    }
+
+    /**
+     * Returns corresponding XML Schema element declaration.
+     * 
+     * @return corresponding XML Schema element declaration.
+     */
+    protected XSDElementDeclaration getResolvedXSDElementDeclaration()
+    {
+      return xsdElementDeclaration.getResolvedElementDeclaration();
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public Object getKey()
+    {
+      return xsdElementDeclaration;
+    }
+
+    /**
+     * Returns the referenced element declaration if this is an element
+     * reference. Otherwise it returns itself.
+     * 
+     * @return an element declaration.
+     */
+    public CMNode getDefinition()
+    {
+      return getAdapter(xsdElementDeclaration.getResolvedElementDeclaration());
+    }
+
+    /**
+     * Returns a string indicating whether the element declaration is global or
+     * local. Returns null if this is an element reference.
+     * 
+     * @return a string indicating whether the element declaration is global or
+     *         local.
+     */
+    protected String getDefinitionInfo()
+    {
+      if (xsdElementDeclaration.isElementDeclarationReference())
+        return null;
+      else if (xsdElementDeclaration.isGlobal())
+        return DEFINITION_INFO_GLOBAL;
+      else
+        return DEFINITION_INFO_LOCAL;
+    }
+
+    public Object getNSPrefixQualification()
+    {
+      String form = null;
+      if (xsdElementDeclaration.isElementDeclarationReference())
+      {
+        form = "qualified";
+      }
+      else
+      {
+        if (xsdElementDeclaration.isSetForm())
+        {
+          form = xsdElementDeclaration.getForm().getName();
+        }
+        else
+        {
+          XSDSchema schema = xsdElementDeclaration.getSchema();
+          if (schema != null)
+            form = schema.getElementFormDefault().getName();
+        }
+      }
+      return form;
+    }
+
+    /**
+     * Returns the corresponding XML Schema type definition.
+     * 
+     * @return the corresponding XML Schema type definition.
+     */
+    protected XSDTypeDefinition getXSDType()
+    {
+      return xsdElementDeclaration.getResolvedElementDeclaration().getTypeDefinition();
+    }
+
+    /**
+     * Returns a list of type names.
+     * 
+     * @return a list of type names.
+     */
+    protected List getXSITypes()
+    {
+      if (xsiTypes == null)
+      {
+        computeDerivedTypeInfo();
+      }
+      return xsiTypes;
+    }
+
+    protected void computeDerivedTypeInfo()
+    {
+      xsiTypes = new Vector();
+      derivedElementDeclarations = new Vector();
+      computeDerivedTypeInfoHelper(getXSDType(), xsiTypes, derivedElementDeclarations);
+    }
+
+    protected void computeDerivedTypeInfoHelper(XSDTypeDefinition type, List typeNameList, List edList)
+    {
+      if (type instanceof XSDComplexTypeDefinition)
+      {
+        List derivedTypes = findTypesDerivedFrom(type);
+        ArrayList inclusiveDerivedTypes = new ArrayList();
+        inclusiveDerivedTypes.add(type);
+        if ((derivedTypes != null) && (derivedTypes.size() > 0))
+        {
+          inclusiveDerivedTypes.addAll(derivedTypes);
+        }
+        for (Iterator i = inclusiveDerivedTypes.iterator(); i.hasNext();)
+        {
+          XSDTypeDefinition derivedType = (XSDTypeDefinition) i.next();
+          XSDSchema schema = derivedType.getSchema();
+          if (schema != null)
+          {
+            String uri = schema.getTargetNamespace();
+            String name = derivedType.getName();
+            if (name != null)
+            {
+              name = uri != null ? ("[" + uri + "]" + name) : name;
+              typeNameList.add(name);
+              DerivedElementDeclarationImpl ed = new DerivedElementDeclarationImpl(this, derivedType, name);
+              edList.add(ed);
+            }
+          }
+        }
+      }
+    }
+
+    /**
+     * Return the element declaration corresponding to the given uri qualified
+     * type name.
+     * 
+     * @param uriQualifiedTypeName -
+     *          a uri qualified type name
+     * @return corresponding element declaration.
+     */
+    protected CMElementDeclaration getDerivedElementDeclaration(String uriQualifiedTypeName)
+    {
+      CMElementDeclaration result = null;
+      if (derivedElementDeclarations == null)
+      {
+        computeDerivedTypeInfo();
+      }
+      for (Iterator i = derivedElementDeclarations.iterator(); i.hasNext();)
+      {
+        DerivedElementDeclarationImpl ed = (DerivedElementDeclarationImpl) i.next();
+        if ((ed != null) && (ed.uriQualifiedTypeName != null))
+        {
+          if (ed.uriQualifiedTypeName.equals(uriQualifiedTypeName))
+          {
+            result = ed;
+            break;
+          }
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Returns the substitution group for this element. The group consists of:
+     * 1. the element declaration itself 2. and any element declaration that has
+     * a {substitution group affiliation} in the group
+     * 
+     * @return the substitution group for this element.
+     */
+    protected CMNodeListImpl getSubstitutionGroup()
+    {
+      if (substitutionGroup == null)
+      {
+        substitutionGroup = new CMNodeListImpl();
+        List sgroup = getResolvedXSDElementDeclaration().getSubstitutionGroup();
+        for (Iterator i = sgroup.iterator(); i.hasNext();)
+        {
+          XSDElementDeclaration ed = (XSDElementDeclaration) i.next();  
+          substitutionGroup.add(getAdapter(ed));
+        }
+      }
+      return substitutionGroup;
+    }
+  }
+  /**
+   * DerivedElementDeclarationImpl extends ElementDeclarationBaseImpl
+   *  
+   */
+  public static class DerivedElementDeclarationImpl extends ElementDeclarationBaseImpl
+  {
+    protected XSDElementDeclarationAdapter owner;
+    protected XSDTypeDefinition xsdType;
+    public String uriQualifiedTypeName;
+
+    /**
+     * Constructor.
+     * 
+     * @param owner -
+     * @param xsdType -
+     * @param uriQualifiedTypeName -
+     */
+    public DerivedElementDeclarationImpl(XSDElementDeclarationAdapter owner, XSDTypeDefinition xsdType, String uriQualifiedTypeName)
+    {
+      this.owner = owner;
+      this.xsdType = xsdType;
+      this.uriQualifiedTypeName = uriQualifiedTypeName;
+    }
+
+    /**
+     * Returns corresponding XML Schema element declaration.
+     * 
+     * @return corresponding XML Schema element declaration.
+     */
+    protected XSDElementDeclaration getXSDElementDeclaration()
+    {
+      return (XSDElementDeclaration) owner.getKey();
+    }
+
+    /**
+     * Returns corresponding XML Schema element declaration.
+     * 
+     * @return corresponding XML Schema element declaration.
+     */
+    protected XSDElementDeclaration getResolvedXSDElementDeclaration()
+    {
+      return ((XSDElementDeclaration) owner.getKey()).getResolvedElementDeclaration();
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public Object getKey()
+    {
+      return owner.getKey();
+    }
+
+    /**
+     * Returns the corresponding XML Schema type definition.
+     * 
+     * @return the corresponding XML Schema type definition.
+     */
+    protected XSDTypeDefinition getXSDType()
+    {
+      return xsdType;
+    }
+
+    /**
+     * Returns a list of type names.
+     * 
+     * @return a list of type names.
+     */
+    protected List getXSITypes()
+    {
+      return owner.getXSITypes();
+    }
+
+    /**
+     * Return the element declaration corresponding to the given uri qualified
+     * type name.
+     * 
+     * @param uriQualifiedTypeName -
+     *          a uri qualified type name
+     * @return corresponding element declaration.
+     */
+    protected CMElementDeclaration getDerivedElementDeclaration(String uriQualifiedTypeName)
+    {
+      return owner.getDerivedElementDeclaration(uriQualifiedTypeName);
+    }
+
+    /**
+     * Returns the referenced element declaration if this is an element
+     * reference. Otherwise it returns itself.
+     * 
+     * @return an element declaration.
+     */
+    protected CMNode getDefinition()
+    {
+      return this;
+    }
+
+    /**
+     * Returns a string indicating whether the element declaration is global or
+     * local. Returns null if this is an element reference.
+     * 
+     * @return a string indicating whether the element declaration is global or
+     *         local.
+     */
+    protected String getDefinitionInfo()
+    {
+      return owner.getDefinitionInfo();
+    }
+
+    /*
+     * Returns the value of the form [attribute] which affects the target
+     * namespace of locally scoped features. @return the value of the form
+     * [attribute].
+     */
+    public Object getNSPrefixQualification()
+    {
+      return owner.getNSPrefixQualification();
+    }
+
+    /**
+     * Returns the substitution group for this element. The group consists of:
+     * 1. the element declaration itself 2. and any element declaration that has
+     * a {substitution group affiliation} in the group
+     * 
+     * @return the substitution group for this element.
+     */
+    protected CMNodeListImpl getSubstitutionGroup()
+    {
+      return owner.getSubstitutionGroup();
+    }
+  }
+  /**
+   * XSDWildcardAdapter
+   */
+  public static class XSDWildcardAdapter extends XSDBaseAdapter implements CMAnyElement
+  {
+    protected XSDWildcard xsdWildcard;
+
+    public XSDWildcardAdapter(XSDWildcard xsdWildcard)
+    {
+      this.xsdWildcard = xsdWildcard;
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public Object getKey()
+    {
+      return xsdWildcard;
+    }
+
+    /**
+     * Returns the type of the node. The types are defined in CMNode class
+     * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+     * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+     * DOCUMENTATION).
+     * 
+     * @return the type of this node.
+     */
+    public int getNodeType()
+    {
+      return ANY_ELEMENT;
+    }
+
+    /**
+     * Returns the name of the node. The default value is an empty string value.
+     * All derived classes must override this method if they do not want the
+     * default value.
+     * 
+     * @return the name of the node.
+     */
+    public String getNodeName()
+    {
+      return "any";
+    }
+
+    public String getNamespaceURI()
+    {
+    	if (xsdWildcard.getElement().hasAttribute(XSDConstants.NAMESPACE_ATTRIBUTE))
+    	{
+    		return xsdWildcard.getElement().getAttribute(XSDConstants.NAMESPACE_ATTRIBUTE);
+    	}
+    	else 
+    		return "##any";
+    }
+
+    /**
+     * Returns the value of 'Min Occurs' attribute. The default value is "1".
+     * 
+     * @return the value of the 'Min Occurs' attribute.
+     */
+    public int getMinOccur()
+    {
+      return getMinOccurs(xsdWildcard);
+    }
+
+    /**
+     * Returns the value of the 'Max Occurs' attribute. The default value is
+     * "1".
+     * 
+     * @return the value of the 'Max Occurs' attribute.
+     */
+    public int getMaxOccur()
+    {
+      return getMaxOccurs(xsdWildcard);
+    }
+
+    /**
+     * Returns the cmdocument that is the owner of this cmnode.
+     * 
+     * @return the cmdocument corresponding to this cmnode.
+     */
+    public CMDocument getCMDocument()
+    {
+      return (CMDocument) getAdapter(xsdWildcard.getSchema());
+    }
+
+    /**
+     * Returns a list of documentation elements.
+     * 
+     * @return a list of documentation elements.
+     */
+    protected CMNodeList getDocumentation()
+    {
+      XSDAnnotation annotation = xsdWildcard.getAnnotation();
+      return getDocumentations(annotation);
+    }
+  }
+  /**
+   * XSDModelGroupAdapter
+   */
+  public static class XSDModelGroupAdapter extends XSDBaseAdapter implements CMGroup
+  {
+    protected XSDModelGroup xsdModelGroup;
+
+    public XSDModelGroupAdapter()
+    {
+    }
+
+    public XSDModelGroupAdapter(XSDModelGroup xsdModelGroup)
+    {
+      this.xsdModelGroup = xsdModelGroup;
+    }
+
+    /**
+     * Returns the type of the node. The types are defined in CMNode class
+     * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+     * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+     * DOCUMENTATION).
+     * 
+     * @return the type of this node.
+     */
+    public int getNodeType()
+    {
+      return GROUP;
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public Object getKey()
+    {
+      return xsdModelGroup;
+    }
+
+    /**
+     * Returns a list of the children of this group.
+     * 
+     * @return a list of the children of this group.
+     */
+    public CMNodeList getChildNodes()
+    {
+      CMNodeListImpl nodeList = new CMNodeListImpl();
+      if (xsdModelGroup != null)
+      {
+        for (Iterator i = xsdModelGroup.getParticles().iterator(); i.hasNext();)
+        {
+          XSDParticle particle = (XSDParticle) i.next();
+          XSDParticleContent content = particle.getContent();
+          CMNode adapter = getAdapter(content);
+          if (adapter != null)
+          {
+            nodeList.getList().add(adapter);
+          }
+        }
+      }
+      return nodeList;
+    }
+
+    /**
+     * Returns the name of the node. The default value is an empty string value.
+     * All derived classes must override this method if they do not want the
+     * default value.
+     * 
+     * @return the name of the node.
+     */
+    public String getNodeName()
+    {
+      CMDescriptionBuilder descriptionBuilder = new CMDescriptionBuilder();
+      return descriptionBuilder.buildDescription(this);
+    }
+
+    /**
+     * Returns the value of 'Min Occurs' attribute. The default value is "1".
+     * 
+     * @return the value of the 'Min Occurs' attribute.
+     */
+    public int getMinOccur()
+    {
+      return getMinOccurs(xsdModelGroup);
+    }
+
+    /**
+     * Returns the value of the 'Max Occurs' attribute. The default value is
+     * "1".
+     * 
+     * @return the value of the 'Max Occurs' attribute.
+     */
+    public int getMaxOccur()
+    {
+      return getMaxOccurs(xsdModelGroup);
+    }
+
+    /**
+     * Return operator of this group -- CHOICE, SEQUENCE or ALL value.
+     * 
+     * @return the operator of this group.
+     */
+    public int getOperator()
+    {
+      int result = 0;
+      //todo... handle ALONE case by checkig if child count == 1
+      if (xsdModelGroup != null)
+      {
+        switch (xsdModelGroup.getCompositor().getValue())
+        {
+          case XSDCompositor.CHOICE : {
+            result = CHOICE;
+            break;
+          }
+          case XSDCompositor.SEQUENCE : {
+            result = SEQUENCE;
+            break;
+          }
+          case XSDCompositor.ALL : {
+            result = ALL;
+            break;
+          }
+        }
+      }
+      return result;
+    }
+
+    /**
+     * Returns a list of documentation elements.
+     * 
+     * @return a list of documentation elements.
+     */
+    protected CMNodeList getDocumentation()
+    {
+      XSDAnnotation annotation = xsdModelGroup.getAnnotation();
+      return getDocumentations(annotation);
+    }
+
+    /**
+     * Returns the cmdocument that is the owner of this cmnode.
+     * 
+     * @return the cmdocument corresponding to this cmnode.
+     */
+    public CMDocument getCMDocument()
+    {
+      return (CMDocument) getAdapter(xsdModelGroup.getSchema());
+    }
+  }
+  /**
+   * XSDModelGroupDefinitionAdapter
+   */
+  public static class XSDModelGroupDefinitionAdapter extends XSDBaseAdapter implements CMGroup
+  {
+    protected XSDModelGroupDefinition xsdModelGroupDefinition;
+
+    public XSDModelGroupDefinitionAdapter(XSDModelGroupDefinition xsdModelGroupDefinition)
+    {
+      this.xsdModelGroupDefinition = xsdModelGroupDefinition;
+    }
+
+    /**
+     * Returns the type of the node. The types are defined in CMNode class
+     * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+     * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+     * DOCUMENTATION).
+     * 
+     * @return the type of this node.
+     */
+    public int getNodeType()
+    {
+      return GROUP;
+    }
+
+    /**
+     * Returns the key for this cmnode which is the corresponding XML Schema
+     * node.
+     * 
+     * @return the key for this cmnode.
+     */
+    public Object getKey()
+    {
+      return xsdModelGroupDefinition;
+    }
+
+    /**
+     * Returns a list of the children of this group.
+     * 
+     * @return a list of the children of this group.
+     */
+    public CMNodeList getChildNodes()
+    {
+      CMNodeListImpl nodeList = new CMNodeListImpl();
+      XSDModelGroup modelGroup = xsdModelGroupDefinition.getResolvedModelGroupDefinition().getModelGroup();
+      if (modelGroup != null)
+      {
+        CMNode adapter = getAdapter(modelGroup);
+        nodeList.add(adapter);
+      }
+      return nodeList;
+    }
+
+    /**
+     * Returns the name of the node. The default value is an empty string value.
+     * All derived classes must override this method if they do not want the
+     * default value.
+     * 
+     * @return the name of the node.
+     */
+    public String getNodeName()
+    {
+      CMDescriptionBuilder descriptionBuilder = new CMDescriptionBuilder();
+      return descriptionBuilder.buildDescription(this);
+    }
+
+    /**
+     * Returns the value of 'Min Occurs' attribute. The default value is "1".
+     * 
+     * @return the value of the 'Min Occurs' attribute.
+     */
+    public int getMinOccur()
+    {
+      return getMinOccurs(xsdModelGroupDefinition);
+    }
+
+    /**
+     * Returns the value of the 'Max Occurs' attribute. The default value is
+     * "1".
+     * 
+     * @return the value of the 'Max Occurs' attribute.
+     */
+    public int getMaxOccur()
+    {
+      return getMaxOccurs(xsdModelGroupDefinition);
+    }
+
+    /**
+     * Return operator of this group -- CHOICE, SEQUENCE or ALL value.
+     * 
+     * @return the operator of this group.
+     */
+    public int getOperator()
+    {
+      return XSDCompositor.SEQUENCE;
+    }
+
+    /**
+     * Returns a list of documentation elements.
+     * 
+     * @return a list of documentation elements.
+     */
+    protected CMNodeList getDocumentation()
+    {
+      XSDAnnotation annotation = xsdModelGroupDefinition.getAnnotation();
+      return getDocumentations(annotation);
+    }
+
+    /**
+     * Returns the cmdocument that is the owner of this cmnode.
+     * 
+     * @return the cmdocument corresponding to this cmnode.
+     */
+    public CMDocument getCMDocument()
+    {
+      return (CMDocument) getAdapter(xsdModelGroupDefinition.getSchema());
+    }
+  }
+  /**
+   * DocumentationImpl implements CMDocumentation. A representation of the
+   * documentation element part of the 'User Information' feature. Working with
+   * the documentation element requires dropping down into the DOM model.
+   */
+  public static class DocumentationImpl implements CMDocumentation
+  {
+    protected Element documentation;
+
+    /**
+     * Constructor.
+     * 
+     * @param documentation -
+     *          a documentation element.
+     */
+    public DocumentationImpl(Element documentation)
+    {
+      this.documentation = documentation;
+    }
+
+    /**
+     * Returns the type of the node. The types are defined in CMNode class
+     * (ANY_ELEMENT, ATTRIBUTE_DECLARATION, DATA_TYPE, DOCUMENT,
+     * ELEMENT_DECLARATION, ENTITY_DECLARATION, GROUP, NAME_SPACE or
+     * DOCUMENTATION).
+     * 
+     * @return the type of this node.
+     */
+    public int getNodeType()
+    {
+      return DOCUMENTATION;
+    }
+
+    /**
+     * Returns an empty string value.
+     * 
+     * @return an empty string value.
+     */
+    public String getNodeName()
+    {
+      return "";
+    }
+
+    /**
+     * Returns false. This class does not support any properties.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return false.
+     */
+    public boolean supports(String propertyName)
+    {
+      return false;
+    }
+
+    /**
+     * Returns null. This class does not support any properties.
+     * 
+     * @param propertyName -
+     *          name of a property
+     * @return null.
+     */
+    public Object getProperty(String propertyName)
+    {
+      return null;
+    }
+
+    /**
+     * Returns the content of the documentation element.
+     * 
+     * @return the content of the documentation element.
+     */
+    public String getValue()
+    {
+      String content = "";
+      boolean contentFound = false;
+      NodeList nodes = documentation.getChildNodes();
+      for (int i = 0; i < nodes.getLength(); i++)
+      {
+        Node node = nodes.item(i);
+        if (node instanceof Text)
+        {
+          contentFound = true;
+          content += node.getNodeValue();
+        }
+      }
+      return contentFound ? content : null;
+    }
+
+    /**
+     * Returns the xml:lang attribute value of the documentation element.
+     * 
+     * @return the xml:lang attribute value of the documentation element.
+     */
+    public String getLanguage()
+    {
+      return documentation.hasAttributeNS(XSDConstants.XML_NAMESPACE_URI_1998, XML_LANG_ATTRIBUTE) ? documentation.getAttributeNS(XSDConstants.XML_NAMESPACE_URI_1998, XML_LANG_ATTRIBUTE) : null;
+    }
+
+    /**
+     * Returns the source attribute value of the documentation element.
+     * 
+     * @return the source attribute value of the documentation element.
+     */
+    public String getSource()
+    {
+      return documentation.hasAttributeNS(null, XSDConstants.SOURCE_ATTRIBUTE) ? documentation.getAttributeNS(null, XSDConstants.SOURCE_ATTRIBUTE) : null;
+    }
+  }
+  /**
+   * XSIDocument extends CMDocumentImpl. This class is used to hold those
+   * attributes that are for direct use in any XML documents. These attributes
+   * are in a different namespace, which has the namespace name
+   * http://www.w3.org/2001/XMLSchema-instance. Attributes in this namespace
+   * include: xsi:type xsi:nil xsi:schemaLocation xsi:noNamespaceSchemaLocation
+   */
+  public static class XSIDocument extends CMDocumentImpl
+  {
+    public CMAttributeDeclarationImpl nilAttribute;
+
+    /**
+     * Constructor. Creates the 'xsi:nil'
+     */
+    public XSIDocument()
+    {
+      super(XSDConstants.SCHEMA_INSTANCE_URI_2001);
+      // create the 'nill' attribute
+      String[] values = {"false", "true"};
+      nilAttribute = new CMAttributeDeclarationImpl("nil", CMAttributeDeclaration.REQUIRED, new CMDataTypeImpl("boolean", values));
+      nilAttribute.setPrefixQualification(true);
+      nilAttribute.setCMDocument(this);
+    }
+  }
+  /**
+   * Note this XSD model visitor differs from the XSD model visitor in
+   * org.eclipse.wst.xsd.editor plugin. In visitModelGroup method we call
+   * getParticles() instead of getContents(). This gathers all of the content of
+   * a derived type.
+   */
+  public static class XSDCMVisitor extends XSDVisitor
+  {
+    public void visitSimpleTypeDefinition(XSDSimpleTypeDefinition type)
+    {
+      XSDParticle ctd = type.getComplexType();
+      if (ctd != null)
+        visitParticle(ctd);
+    }
+
+    public void visitModelGroup(XSDModelGroup modelGroup)
+    {
+      if (modelGroup.getParticles() != null)
+      {
+        for (Iterator iterator = modelGroup.getParticles().iterator(); iterator.hasNext();)
+        {
+          XSDParticle particle = (XSDParticle) iterator.next();
+          visitParticle(particle);
+        }
+      }
+    }
+
+    public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroupDef)
+    {
+      XSDModelGroup modelGroup = modelGroupDef.getResolvedModelGroupDefinition().getModelGroup();
+      if (modelGroup != null)
+      {
+        visitModelGroup(modelGroup);
+      }
+    }
+  }
+  /**
+   * A visitor class that walks the xsd model and computes the list of children
+   * that belong to the initially visited element type.
+   */
+  public static class DerivedChildVisitor extends XSDCMVisitor
+  {
+    protected CMNodeListImpl childNodeList = new CMNodeListImpl();
+    protected List baseTypeList = new Vector();
+    Object root;
+
+    DerivedChildVisitor(Object root)
+    {
+      this.root = root;
+    }
+
+    public CMNodeListImpl getChildNodeList()
+    {
+      return childNodeList;
+    }
+
+    public void visitWildcard(XSDWildcard wildcard)
+    {
+      childNodeList.getList().add(getAdapter(wildcard));
+    }
+
+    public void visitElementDeclaration(XSDElementDeclaration element)
+    {
+      childNodeList.getList().add(getAdapter(element));
+    }
+
+    public void visitModelGroup(XSDModelGroup modelGroup)
+    {
+      childNodeList.getList().add(getAdapter(modelGroup));
+    }
+
+    public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroupDefinition)
+    {
+      childNodeList.getList().add(getAdapter(modelGroupDefinition));
+    }
+  }
+  /**
+   * A visitor class that gathers all of the elements within a type definition.
+   */
+  public static class LocalElementVisitor extends XSDCMVisitor
+  {
+    protected CMNamedNodeMapImpl namedNodeMap = new CMNamedNodeMapImpl();
+    protected List baseTypeList = new Vector();
+
+    public void visitElementDeclaration(XSDElementDeclaration element)
+    {
+      XSDElementDeclarationAdapter adapter = (XSDElementDeclarationAdapter) getAdapter(element);
+      namedNodeMap.getHashtable().put(adapter.getNodeName(), adapter);
+    }
+
+    public CMNamedNodeMap getCMNamedNodeMap()
+    {
+      return namedNodeMap;
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDTypeUtil.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDTypeUtil.java
new file mode 100644
index 0000000..1ab69ef
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDTypeUtil.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+/**
+ * Helper class to generate valid values for built-in simple types.
+ */
+
+public class XSDTypeUtil
+{
+  protected static Map defaultValue = new HashMap();
+
+  public static void initialize()
+  {
+    defaultValue.put("anySimpleType", null);
+    defaultValue.put("anyType", null);
+    defaultValue.put("anyURI", "http://tempuri.org");
+    defaultValue.put("base64Binary", "MA==");
+    defaultValue.put("boolean", "true");
+    defaultValue.put("byte", "0");
+    defaultValue.put("date", "2001-01-01");
+    defaultValue.put("dateTime", "2001-12-31T12:00:00");
+    defaultValue.put("decimal", "0.0");
+    defaultValue.put("double", "0.0");
+    defaultValue.put("duration", "P1D");
+    defaultValue.put("ENTITY", "entity");
+    defaultValue.put("ENTITIES", "entities");
+    defaultValue.put("float", "0.0");
+    defaultValue.put("gDay", "---01");
+    defaultValue.put("gMonth", "--01--");
+    defaultValue.put("gMonthDay", "--01-01");
+    defaultValue.put("gYear", "2001");
+    defaultValue.put("gYearMonth", "2001-01");
+    defaultValue.put("hexBinary", "0F00");
+    defaultValue.put("ID", null);
+    defaultValue.put("IDREF", null);
+    defaultValue.put("IDREFS", null);
+    defaultValue.put("int", "0");
+    defaultValue.put("integer", "0");
+    defaultValue.put("language", "EN");
+    defaultValue.put("long", "0");
+    defaultValue.put("Name", "Name");
+    defaultValue.put("NCName", "NCName");
+    defaultValue.put("negativeInteger", "-1");
+    defaultValue.put("NMTOKEN", "NMTOKEN");
+    defaultValue.put("NMTOKENS", "NMTOKENS");
+    defaultValue.put("nonNegativeInteger", "0");
+    defaultValue.put("nonPositiveInteger", "0");
+    defaultValue.put("normalizedString", null);
+    defaultValue.put("NOTATION", "NOTATION");
+    defaultValue.put("positiveInteger", "1");
+    defaultValue.put("QName", "QName");
+    defaultValue.put("short", "0");
+    defaultValue.put("string", null);
+    defaultValue.put("time", "12:00:00");
+    defaultValue.put("token", "token");
+    defaultValue.put("unsignedByte", "0");
+    defaultValue.put("unsignedInt", "0");
+    defaultValue.put("unsignedLong", "0");
+    defaultValue.put("unsignedShort", "0");
+  }
+
+
+  /*
+   * Returns true if the type is built-in.
+   * @param type - an XSDTypeDefinition object.
+   * @return true if the type is built-in.
+   */
+  public static boolean isBuiltIn(XSDTypeDefinition type)
+  { 
+    boolean result = false;
+    if (type instanceof XSDSimpleTypeDefinition)
+    {
+      String name = type.getName();
+      if (name != null)
+      {
+        return  defaultValue.containsKey(name); 
+      }
+    }
+    return result;
+  }
+
+
+  /**
+   * Returns a valid default value for the simple type.
+   * @param type - a simple built-in type.
+   * @return a valid default value for the simple type.
+   */
+  public static String getInstanceValue(XSDTypeDefinition type)
+  {
+    if (type != null)
+    {
+      if (isBuiltIn(type))
+      {
+        String nameID = type.getName();
+        return (String)defaultValue.get(nameID);
+      }
+      else
+      {
+        XSDTypeDefinition basetype = type.getBaseType();
+        if (basetype != type) return getInstanceValue(basetype);
+      }
+    }
+    return null;
+  }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDVisitor.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDVisitor.java
new file mode 100644
index 0000000..59f5838
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/XSDVisitor.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal;
+
+import java.util.Iterator;
+import java.util.Stack;
+
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDComplexTypeContent;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDIdentityConstraintDefinition;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDParticleContent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+
+public class XSDVisitor
+{
+  public XSDVisitor()
+  {
+  }
+  
+  protected XSDSchema schema;
+  protected Stack particleStack = new Stack();
+  
+  public void visitSchema(XSDSchema schema)
+  {
+    this.schema = schema;
+    for (Iterator iterator = schema.getAttributeDeclarations().iterator(); iterator.hasNext();)
+    {
+      XSDAttributeDeclaration attr = (XSDAttributeDeclaration) iterator.next();
+      visitAttributeDeclaration(attr);
+    }
+    for (Iterator iterator = schema.getTypeDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDTypeDefinition type = (XSDTypeDefinition) iterator.next();
+      visitTypeDefinition(type);
+    }
+    for (Iterator iterator = schema.getElementDeclarations().iterator(); iterator.hasNext();)
+    {
+      XSDElementDeclaration element = (XSDElementDeclaration) iterator.next();
+      visitElementDeclaration(element);
+    }
+    for (Iterator iterator = schema.getIdentityConstraintDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDIdentityConstraintDefinition identityConstraint = (XSDIdentityConstraintDefinition) iterator.next();
+      visitIdentityConstraintDefinition(identityConstraint);
+    }
+    for (Iterator iterator = schema.getModelGroupDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDModelGroupDefinition modelGroup = (XSDModelGroupDefinition) iterator.next();
+      visitModelGroupDefinition(modelGroup);
+    }
+    for (Iterator iterator = schema.getAttributeGroupDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDAttributeGroupDefinition attributeGroup = (XSDAttributeGroupDefinition) iterator.next();
+      visitAttributeGroupDefinition(attributeGroup);
+    }
+    for (Iterator iterator = schema.getNotationDeclarations().iterator(); iterator.hasNext();)
+    {
+      XSDNotationDeclaration element = (XSDNotationDeclaration) iterator.next();
+      visitNotationDeclaration(element);
+    }
+    
+  }
+  
+  public void visitAttributeDeclaration(XSDAttributeDeclaration attr)
+  {
+  }
+  
+  public void visitTypeDefinition(XSDTypeDefinition type)
+  {
+    if (type instanceof XSDSimpleTypeDefinition)
+    {
+      visitSimpleTypeDefinition((XSDSimpleTypeDefinition)type);
+    }
+    else if (type instanceof XSDComplexTypeDefinition)
+    {
+      visitComplexTypeDefinition((XSDComplexTypeDefinition)type);
+    }
+  }
+  
+  public void visitElementDeclaration(XSDElementDeclaration element)
+  {
+    if (element.isElementDeclarationReference())
+    {
+    }
+    else if (element.getAnonymousTypeDefinition() != null)
+    {
+      visitTypeDefinition(element.getAnonymousTypeDefinition());
+    }
+  }
+  
+  public void visitIdentityConstraintDefinition(XSDIdentityConstraintDefinition identityConstraint)
+  {
+  }
+  
+  public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroupDef)
+  {
+    if (!modelGroupDef.isModelGroupDefinitionReference())
+    {
+      if (modelGroupDef.getModelGroup() != null)
+      {
+        visitModelGroup(modelGroupDef.getModelGroup());
+      }
+    }
+  }
+  
+  public void visitAttributeGroupDefinition(XSDAttributeGroupDefinition attributeGroup)
+  {
+  }
+  
+  public void visitNotationDeclaration(XSDNotationDeclaration notation)
+  {
+  }
+  
+  public void visitSimpleTypeDefinition(XSDSimpleTypeDefinition type)
+  {
+  }
+  
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    if (type.getContentType() != null)
+    {
+      XSDComplexTypeContent complexContent = type.getContentType();
+      if (complexContent instanceof XSDSimpleTypeDefinition)
+      {
+        visitSimpleTypeDefinition((XSDSimpleTypeDefinition)complexContent);
+      }
+      else if (complexContent instanceof XSDParticle)
+      {
+        visitParticle((XSDParticle) complexContent);
+      }
+    }
+  }
+  
+  public void visitParticle(XSDParticle particle)
+  {
+    visitParticleContent(particle.getContent());
+  }
+  
+  public void visitParticleContent(XSDParticleContent particleContent)
+  {
+    if (particleContent instanceof XSDModelGroupDefinition)
+    {
+      XSDModelGroupDefinition modelGroupDef = (XSDModelGroupDefinition) particleContent;
+
+      if (particleStack.contains(modelGroupDef))
+      {
+        return;
+      }
+        
+      particleStack.push(modelGroupDef);
+      
+      visitModelGroupDefinition(modelGroupDef);
+      
+      particleStack.pop();
+    }
+    else if (particleContent instanceof XSDModelGroup)
+    {
+      visitModelGroup((XSDModelGroup)particleContent);
+    }
+    else if (particleContent instanceof XSDElementDeclaration)
+    {
+      visitElementDeclaration((XSDElementDeclaration)particleContent);
+    }
+    else if (particleContent instanceof XSDWildcard)
+    {
+      visitWildcard((XSDWildcard)particleContent);
+    }
+  }
+  
+  public void visitModelGroup(XSDModelGroup modelGroup)
+  {
+    if (modelGroup.getContents() != null)
+    {
+      for (Iterator iterator = modelGroup.getContents().iterator(); iterator.hasNext();)
+      {
+        XSDParticle particle = (XSDParticle) iterator.next();
+        visitParticle(particle);
+      }
+    }
+  }
+  
+  public void visitWildcard(XSDWildcard wildcard)
+  {
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/util/XSDSchemaLocatorAdapterFactory.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/util/XSDSchemaLocatorAdapterFactory.java
new file mode 100644
index 0000000..c0309f1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/util/XSDSchemaLocatorAdapterFactory.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+import org.eclipse.xsd.util.XSDSchemaLocator;
+
+public class XSDSchemaLocatorAdapterFactory extends AdapterFactoryImpl
+{
+    protected XSDSchemaLocatorImpl schemaLocator = new XSDSchemaLocatorImpl();
+
+    public boolean isFactoryForType(Object type)
+    {
+      return type == XSDSchemaLocator.class;
+    }
+
+    public Adapter adaptNew(Notifier target, Object type)
+    {
+      return schemaLocator;
+    }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/util/XSDSchemaLocatorImpl.java b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/util/XSDSchemaLocatorImpl.java
new file mode 100644
index 0000000..cbf0183
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-contentmodel/org/eclipse/wst/xsd/contentmodel/internal/util/XSDSchemaLocatorImpl.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.contentmodel.internal.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDResourceImpl;
+import org.eclipse.xsd.util.XSDSchemaLocator;
+
+public class XSDSchemaLocatorImpl extends AdapterImpl implements XSDSchemaLocator
+{
+    /**
+     * @see org.eclipse.xsd.util.XSDSchemaLocator#locateSchema(org.eclipse.xsd.XSDSchema,
+     *      java.lang.String, java.lang.String, java.lang.String)
+     */
+    public XSDSchema locateSchema(XSDSchema xsdSchema, String namespaceURI, String rawSchemaLocationURI, String resolvedSchemaLocationURI)
+    {
+      XSDSchema result = null;
+      String baseLocation = xsdSchema.getSchemaLocation();      
+      String resolvedURI = URIResolverPlugin.createResolver().resolve(baseLocation, namespaceURI, rawSchemaLocationURI); 
+      if (resolvedURI == null) 
+      {
+        resolvedURI = resolvedSchemaLocationURI;       
+      }
+      try
+      {        
+        ResourceSet resourceSet = xsdSchema.eResource().getResourceSet();
+        URI uri = URI.createURI(resolvedURI);
+        Resource r = resourceSet.getResource(uri, false); 
+        XSDResourceImpl resolvedResource = null;
+        if (r instanceof XSDResourceImpl)
+        {
+          resolvedResource = (XSDResourceImpl)r;
+        }
+        else        
+        {  
+          String physicalLocation = URIResolverPlugin.createResolver().resolvePhysicalLocation(baseLocation, namespaceURI, resolvedURI);     
+          InputStream inputStream = resourceSet.getURIConverter().createInputStream(URI.createURI(physicalLocation));
+          resolvedResource = (XSDResourceImpl)resourceSet.createResource(URI.createURI("*.xsd"));
+          resolvedResource.setURI(uri);
+          resolvedResource.load(inputStream, null);           
+        }
+
+        result = resolvedResource.getSchema();
+      }
+      catch (IOException exception)
+      {
+        // It is generally not an error to fail to resolve.
+        // If a resource is actually created, 
+        // which happens only when we can create an input stream,
+        // then it's an error if it's not a good schema
+      }
+      return result;
+    }
+
+    public boolean isAdatperForType(Object type)
+    {
+      return type == XSDSchemaLocator.class;
+    }  
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/XSDValidationConfiguration.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/XSDValidationConfiguration.java
new file mode 100644
index 0000000..0a57f95
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/XSDValidationConfiguration.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Carver, Standards for Technology in Automotive Retail, bug 1147033
+ *******************************************************************************/
+package org.eclipse.wst.xsd.core.internal.validation;
+
+/**
+ * An XSD validation configuration allows setting specific configuration
+ * information for a WTP XSD validation run. Any features and properties
+ * set on this configuration should not be confused with those from
+ * parsers such as Xerces. (This object does not by default wrap features
+ * and properties from specific parsers.)
+ */
+public class XSDValidationConfiguration 
+{
+  public static String HONOUR_ALL_SCHEMA_LOCATIONS = "HONOUR_ALL_SCHEMA_LOCATIONS"; //$NON-NLS-1$
+  public static String FULL_SCHEMA_CONFORMANCE = "FULL_SCHEMA_CONFORMANCE"; //$NON-NLS-1$
+  private boolean honour_all_schema_locations = false;
+  private boolean fullSchemaConformance = true;
+  
+  /**
+   * Set a feature of this configuration.
+   * 
+   * @param feature
+   * 		The feature to set.
+   * @param value
+   * 		The value to set for the feature.
+   * @throws 
+   * 		An exception is thrown if the feature is not recognized.
+   */
+  public void setFeature(String feature, boolean value) throws Exception
+  {
+	if(HONOUR_ALL_SCHEMA_LOCATIONS.equals(feature))
+	  honour_all_schema_locations = value;
+	else if (FULL_SCHEMA_CONFORMANCE.equals(feature))
+		fullSchemaConformance = value;
+	else
+	  throw new Exception("Feature not recognized."); //$NON-NLS-1$
+	
+  }
+  
+  
+  /**
+   * Get the value for a given feature. If the feature is not defined
+   * this method will throw an exception.
+   * 
+   * @param feature
+   * 		The feature for which to retrieve the value.
+   * @return
+   * 		The feature's value, true or false.
+   * @throws 
+   * 		An exception is thrown if the feature is not recognized.
+   */
+  public boolean getFeature(String feature) throws Exception
+  {
+	if(HONOUR_ALL_SCHEMA_LOCATIONS.equals(feature))
+	  return honour_all_schema_locations;
+	else if (FULL_SCHEMA_CONFORMANCE.equals(feature))
+      return fullSchemaConformance;
+	
+	throw new Exception("Feature not recognized."); //$NON-NLS-1$
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/XSDValidator.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/XSDValidator.java
new file mode 100644
index 0000000..1a6b5e9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/XSDValidator.java
@@ -0,0 +1,250 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Carver, Standards for Technology in Automotive Retail, bug 1147033
+ *******************************************************************************/
+package org.eclipse.wst.xsd.core.internal.validation;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.xerces.impl.Constants;
+import org.apache.xerces.parsers.XMLGrammarPreparser;
+import org.apache.xerces.util.XMLGrammarPoolImpl;
+import org.apache.xerces.xni.XMLResourceIdentifier;
+import org.apache.xerces.xni.XNIException;
+import org.apache.xerces.xni.grammars.XMLGrammarDescription;
+import org.apache.xerces.xni.parser.XMLEntityResolver;
+import org.apache.xerces.xni.parser.XMLErrorHandler;
+import org.apache.xerces.xni.parser.XMLInputSource;
+import org.apache.xerces.xni.parser.XMLParseException;
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
+import org.eclipse.wst.xml.core.internal.validation.XMLValidator;
+import org.eclipse.wst.xml.core.internal.validation.core.ValidationInfo;
+import org.eclipse.wst.xml.core.internal.validation.core.ValidationReport;
+import org.w3c.dom.DOMError;
+
+/**
+ * The XSDValidator will validate XSD files.
+ */
+public class XSDValidator
+{
+  protected URIResolver uriresolver = null;
+
+  public ValidationReport validate(String uri)
+  {
+    return validate(uri, null);
+  }
+  
+  public ValidationReport validate(String uri, InputStream inputStream)
+  {
+	return validate(uri, null, null);
+  }
+  
+  /**
+   * Validate the XSD file specified by the URI.
+   * 
+   * @param uri
+   * 		The URI of the XSD file to validate.
+   * @param inputStream 
+   * 		An input stream representing the XSD file to validate.
+   * @param configuration
+   * 		A configuration for this validation run.
+   */
+  public ValidationReport validate(String uri, InputStream inputStream, XSDValidationConfiguration configuration)
+  {
+	if(configuration == null)
+	{
+	  configuration = new XSDValidationConfiguration();
+	}
+	ValidationInfo valinfo = new ValidationInfo(uri);
+	XSDErrorHandler errorHandler = new XSDErrorHandler(valinfo);
+	try
+	{
+	  XMLGrammarPreparser grammarPreparser = new XMLGrammarPreparser();
+	  grammarPreparser.registerPreparser(XMLGrammarDescription.XML_SCHEMA,null/*schemaLoader*/);
+		  
+	  grammarPreparser.setProperty(Constants.XERCES_PROPERTY_PREFIX + Constants.XMLGRAMMAR_POOL_PROPERTY, new XMLGrammarPoolImpl());
+	  grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.CONTINUE_AFTER_FATAL_ERROR_FEATURE, false);
+      grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE, true);
+      grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.NAMESPACE_PREFIXES_FEATURE, true);
+	  grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.VALIDATION_FEATURE, true);
+	  grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_VALIDATION_FEATURE, true);
+
+	  grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.EXTERNAL_GENERAL_ENTITIES_FEATURE, true);
+	  grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.EXTERNAL_PARAMETER_ENTITIES_FEATURE, true);
+	  grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_DUPLICATE_ATTDEF_FEATURE, true);
+	     
+	  if(configuration.getFeature(XSDValidationConfiguration.HONOUR_ALL_SCHEMA_LOCATIONS))
+	  {
+	    try
+	    {
+	      grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + "honour-all-schemaLocations", true); //$NON-NLS-1$
+	    }
+        catch (Exception e)
+	    {
+	      // catch the exception and ignore
+	    }
+	  }
+	  
+	  if(configuration.getFeature(XSDValidationConfiguration.FULL_SCHEMA_CONFORMANCE)) {
+		try
+		{
+		  grammarPreparser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_FULL_CHECKING, true);
+		}
+		catch (Exception e)
+		{
+			// ignore since we don't want to set it or can't.
+		}
+		
+	  }
+	      
+	  grammarPreparser.setErrorHandler(errorHandler);
+	  if (uriresolver != null)
+	  {
+	    XSDEntityResolver resolver = new XSDEntityResolver(uriresolver, uri);
+	    if (resolver != null)
+	    {
+	      grammarPreparser.setEntityResolver(resolver);
+	    }
+	  }
+
+	  try
+	  {
+	  	XMLInputSource is = new XMLInputSource(null, uri, uri, inputStream, null);
+	    grammarPreparser.getLoader(XMLGrammarDescription.XML_SCHEMA);
+		grammarPreparser.preparseGrammar(XMLGrammarDescription.XML_SCHEMA,is);
+	  }
+	  catch (Exception e)
+	  {
+	    //parser will return null pointer exception if the document is structurally invalid
+		//TODO: log error message
+		//System.out.println(e);
+      }
+	}
+	catch (Exception e)
+	{
+      // TODO: log error.
+	  //System.out.println(e);
+	}
+	return valinfo;
+  }
+
+  /**
+   * Set the URI resolver to use with XSD validation.
+   * 
+   * @param uriresolver
+   *          The URI resolver to use.
+   */
+  public void setURIResolver(URIResolver uriresolver)
+  {
+    this.uriresolver = uriresolver;
+  }
+
+  /**
+   * The XSDErrorHandler handle Xerces parsing errors and puts the errors
+   * into the given ValidationInfo object.
+   */
+  protected class XSDErrorHandler implements XMLErrorHandler
+  {
+	  
+    private final ValidationInfo valinfo;
+
+    public XSDErrorHandler(ValidationInfo valinfo)
+    {
+      this.valinfo = valinfo;
+    }
+    
+    /**
+     * Add a validation message with the given severity.
+     * 
+     * @param errorKey The Xerces error key.
+     * @param exception The exception that contains the information about the message.
+     * @param severity The severity of the validation message.
+     */
+    protected void addValidationMessage(String errorKey, XMLParseException exception, int severity)
+    { 
+      String systemId = exception.getExpandedSystemId();
+      if (systemId != null)
+      {
+        if (severity == DOMError.SEVERITY_WARNING)
+        {
+          valinfo.addWarning(exception.getLocalizedMessage(), exception.getLineNumber(), exception.getColumnNumber(), systemId);
+        }
+        else
+        {
+          valinfo.addError(exception.getLocalizedMessage(), exception.getLineNumber(), exception.getColumnNumber(), systemId, errorKey, null);
+        }
+      }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.xerces.xni.parser.XMLErrorHandler#warning(java.lang.String, java.lang.String, org.apache.xerces.xni.parser.XMLParseException)
+     */
+    public void warning(String domain, String key, XMLParseException exception) throws XNIException
+	{
+    	addValidationMessage(key, exception, DOMError.SEVERITY_WARNING);
+	}
+
+    /* (non-Javadoc)
+     * @see org.apache.xerces.xni.parser.XMLErrorHandler#error(java.lang.String, java.lang.String, org.apache.xerces.xni.parser.XMLParseException)
+     */
+    public void error(String domain, String key, XMLParseException exception) throws XNIException
+    {
+    	addValidationMessage(key, exception, DOMError.SEVERITY_ERROR);
+	}
+
+    /* (non-Javadoc)
+     * @see org.apache.xerces.xni.parser.XMLErrorHandler#fatalError(java.lang.String, java.lang.String, org.apache.xerces.xni.parser.XMLParseException)
+     */
+    public void fatalError(String domain, String key, XMLParseException exception) throws XNIException
+	{
+    	addValidationMessage(key, exception, DOMError.SEVERITY_FATAL_ERROR);
+	}
+  }
+
+  /**
+   * The XSDEntityResolver wraps an idresolver to provide entity resolution to
+   * the XSD validator.
+   */
+  protected class XSDEntityResolver implements XMLEntityResolver
+  {
+    private URIResolver uriresolver = null;
+
+    /**
+     * Constructor.
+     * 
+     * @param idresolver
+     *          The idresolver this entity resolver wraps.
+     * @param baselocation The base location to resolve with.
+     */
+    public XSDEntityResolver(URIResolver uriresolver, String baselocation)
+    {
+      this.uriresolver = uriresolver;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.apache.xerces.xni.parser.XMLEntityResolver#resolveEntity(org.apache.xerces.xni.XMLResourceIdentifier)
+     */
+    public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) throws XNIException, IOException
+    {
+      String literalSystemId = resourceIdentifier.getLiteralSystemId();
+      if(literalSystemId != null)
+      {
+    	resourceIdentifier.setLiteralSystemId(literalSystemId.replace('\\','/'));
+      }
+        // TODO cs: In revision 1.1 we explicitly opened a stream to ensure
+        // file I/O problems produced messages. I've remove this fudge for now
+        // since I can't seem to reproduce the problem it was intended to fix.
+        // I'm hoping the newer Xerces code base has fixed this problem and the fudge is defunct.
+        return XMLValidator._internalResolveEntity(uriresolver, resourceIdentifier);
+      
+    }
+  }   
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/Validator.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/Validator.java
new file mode 100644
index 0000000..5da031b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/Validator.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     David Carver, Standards for Technology in Automotive Retail, bug 1147033
+ *******************************************************************************/
+
+package org.eclipse.wst.xsd.core.internal.validation.eclipse;
+
+import java.io.InputStream;
+import java.util.HashMap;
+
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
+import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
+import org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator;
+import org.eclipse.wst.xml.core.internal.validation.core.NestedValidatorContext;
+import org.eclipse.wst.xml.core.internal.validation.core.ValidationMessage;
+import org.eclipse.wst.xml.core.internal.validation.core.ValidationReport;
+import org.eclipse.wst.xsd.core.internal.XSDCorePlugin;
+import org.eclipse.wst.xsd.core.internal.preferences.XSDCorePreferenceNames;
+import org.eclipse.wst.xsd.core.internal.validation.XSDValidationConfiguration;
+
+public class Validator extends AbstractNestedValidator
+{
+  protected HashMap xsdConfigurations = new HashMap();
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator#setupValidation(org.eclipse.wst.xml.core.internal.validation.core.NestedValidatorContext)
+   */
+  protected void setupValidation(NestedValidatorContext context) 
+  {
+	XSDValidationConfiguration configuration = new XSDValidationConfiguration();
+	boolean honourAllSchemaLocations = XMLCorePlugin.getDefault().getPluginPreferences().getBoolean(XMLCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS);
+	boolean fullSchemaConformance = XSDCorePlugin.getDefault().getPluginPreferences().getBoolean(XSDCorePreferenceNames.FULL_SCHEMA_CONFORMANCE);
+	try
+	{
+	  configuration.setFeature(XSDValidationConfiguration.HONOUR_ALL_SCHEMA_LOCATIONS, honourAllSchemaLocations);
+	  configuration.setFeature(XSDValidationConfiguration.FULL_SCHEMA_CONFORMANCE, fullSchemaConformance);
+	}
+	catch(Exception e)
+	{
+	  // Unable to set the honour all schema locations option. Do nothing.
+	}
+	xsdConfigurations.put(context, configuration);
+	
+	super.setupValidation(context);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator#teardownValidation(org.eclipse.wst.xml.core.internal.validation.core.NestedValidatorContext)
+   */
+  protected void teardownValidation(NestedValidatorContext context) 
+  {
+	xsdConfigurations.remove(context);
+	
+	super.teardownValidation(context);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator#validate(java.lang.String, java.io.InputStream, org.eclipse.wst.xml.core.internal.validation.core.NestedValidatorContext)
+   */
+  public ValidationReport validate(String uri, InputStream inputstream, NestedValidatorContext context)
+  {  
+	XSDValidator validator = XSDValidator.getInstance();
+	
+	XSDValidationConfiguration configuration = (XSDValidationConfiguration)xsdConfigurations.get(context);
+
+	ValidationReport valreport = null;
+	
+	valreport = validator.validate(uri, inputstream, configuration);
+		        
+	return valreport;
+  }
+	  
+  /**
+   * Store additional information in the message parameters. For XSD validation there
+   * are three additional pieces of information to store:
+   * param[0] = the column number of the error
+   * param[1] = the 'squiggle selection strategy' for which DOM part to squiggle
+   * param[2] = the name or value of what is to be squiggled
+   * 
+   * @see org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator#addInfoToMessage(org.eclipse.wst.xml.core.internal.validation.core.ValidationMessage, org.eclipse.wst.validation.internal.provisional.core.IMessage)
+   */
+  protected void addInfoToMessage(ValidationMessage validationMessage, IMessage message)
+  { 
+	String key = validationMessage.getKey();
+	if(key != null)
+	{
+	  XSDMessageInfoHelper messageInfoHelper = new XSDMessageInfoHelper();
+	  String[] messageInfo = messageInfoHelper.createMessageInfo(key, validationMessage.getMessage());
+
+	  message.setAttribute(COLUMN_NUMBER_ATTRIBUTE, new Integer(validationMessage.getColumnNumber()));
+	  message.setAttribute(SQUIGGLE_SELECTION_STRATEGY_ATTRIBUTE, messageInfo[0]);
+	  message.setAttribute(SQUIGGLE_NAME_OR_VALUE_ATTRIBUTE, messageInfo[1]);
+	}
+  }
+
+  /*
+   * (non-Javadoc)
+   * @see org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator#getValidatorID()
+   */
+  protected String getValidatorID()
+  {
+    // Because this class is used as a delegate, return the id of the validator
+    // which delegates to this class.
+
+    return XSDDelegatingValidator.class.getName();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDDelegatingValidator.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDDelegatingValidator.java
new file mode 100644
index 0000000..3f615ba
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDDelegatingValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xsd.core.internal.validation.eclipse;
+
+import org.eclipse.wst.validation.internal.delegates.DelegatingValidator;
+
+/**
+ * This class provides a unique name (class name) which the validation framework
+ * will use to identify the XSD validator. The actual delegating validator
+ * functionality is provided by the base class. The actual validation
+ * functionality is provided by the delegates registered with this class as
+ * their target.
+ */
+public class XSDDelegatingValidator extends DelegatingValidator
+{
+  /**
+   * Default constructor.
+   */
+  public XSDDelegatingValidator()
+  {
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDMessageInfoHelper.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDMessageInfoHelper.java
new file mode 100644
index 0000000..5de3299
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDMessageInfoHelper.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.core.internal.validation.eclipse;
+
+
+/**
+ * The XSDMessageInfoHelper creates a string with the
+ */
+public class XSDMessageInfoHelper
+{
+  public XSDMessageInfoHelper()
+  { super();
+  }
+
+  public String[] createMessageInfo(String errorKey, String errorMessage)
+  { 
+    //Now map the error key to what we would want to underline:
+    String nameOrValue = "";
+    String selectionStrategy = "";
+    if(errorKey != null)
+    {
+      if (errorKey.equals("s4s-elt-invalid-content.1") || errorKey.equals("s4s-elt-must-match.1") || 
+    		  errorKey.equals("s4s-att-must-appear") || errorKey.equals("s4s-elt-invalid-content.2"))  //$NON-NLS-1$  //$NON-NLS-2$  //$NON-NLS-3$  //$NON-NLS-4$
+      { 
+    	selectionStrategy = "START_TAG"; //$NON-NLS-1$
+      }
+      else if (errorKey.equals("s4s-att-not-allowed")) //$NON-NLS-1$
+      { 
+    	selectionStrategy = "ATTRIBUTE_NAME"; //$NON-NLS-1$
+        nameOrValue = getFirstStringBetweenSingleQuotes(errorMessage);
+      }
+      else if (errorKey.equals("s4s-att-invalid-value")) //$NON-NLS-1$
+      { 
+    	selectionStrategy = "ATTRIBUTE_VALUE"; //$NON-NLS-1$
+        nameOrValue = getFirstStringBetweenSingleQuotes(errorMessage);
+      }
+      else if (errorKey.equals("s4s-elt-character")) //$NON-NLS-1$
+      { 
+    	selectionStrategy = "TEXT"; //$NON-NLS-1$
+      }
+      else if (errorKey.equals("src-resolve.4.2") || errorKey.equals("src-resolve"))  //$NON-NLS-1$  //$NON-NLS-2$
+      { 
+    	selectionStrategy = "VALUE_OF_ATTRIBUTE_WITH_GIVEN_VALUE"; //$NON-NLS-1$
+        nameOrValue = getFirstStringBetweenSingleQuotes(errorMessage);
+      }
+      else if (errorKey.equals("EqRequiredInAttribute") || errorKey.equals("OpenQuoteExpected") || 
+    		  errorKey.equals("LessthanInAttValue")) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+      {
+      	selectionStrategy = "ATTRIBUTE_NAME"; //$NON-NLS-1$
+        nameOrValue = getFirstStringBetweenQuotes(errorMessage);
+      }
+      else if (errorKey.equals("ElementUnterminated")) //$NON-NLS-1$
+      {
+        selectionStrategy = "ENTIRE_ELEMENT"; //$NON-NLS-1$
+      }
+      else if (errorKey.equals("ETagUnterminated") || errorKey.equals("ETagRequired")) //$NON-NLS-1$  //$NON-NLS-2$
+      {
+        selectionStrategy = "END_TAG"; //$NON-NLS-1$
+      }
+    }
+    String messageInfo[] = new String[2];
+    messageInfo[0] = selectionStrategy;
+    messageInfo[1] = nameOrValue;
+    return messageInfo;    
+  }
+
+  /**
+   * This method is used to get the value between the first pair of single quotes
+   * It is used to extract information from the error Message (for example
+   * an attribute name)
+   * 
+   * @param s
+   * 		The string to extract the value from.
+   */
+  protected String getFirstStringBetweenSingleQuotes(String s)
+  {
+    return getFirstStringBetweenDelimiters(s, '\'');
+  }
+
+  /**
+   * This method is used to get the value between the first pair of quotes
+   * It is used to extract information from the error Message (for example
+   * an attribute name)
+   * 
+   * @param s
+   * 		The string to extract the value from.
+   */
+  protected String getFirstStringBetweenQuotes(String s)
+  {
+    return getFirstStringBetweenDelimiters(s, '\"');
+  }
+
+  /**
+   * This method is used to get the value between the first start and end occurrences of the given delimiter character.
+   * 
+   * @param s
+   * 		The string to extract the value from.
+   * @param delimiter 
+   * 		The start and end character
+   */
+  protected String getFirstStringBetweenDelimiters(String s, char delimiter)
+  {
+    int first = s.indexOf(delimiter);
+    int second = s.indexOf(delimiter, first + 1);
+    String stringBetweenDelimiters = null;
+    if (first != -1 && second != -1)
+    { 
+      stringBetweenDelimiters = s.substring(first + 1, second);
+    }
+    return stringBetweenDelimiters;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDValidator.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDValidator.java
new file mode 100644
index 0000000..fbe1a03
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDValidator.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xsd.core.internal.validation.eclipse;
+
+import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+
+
+/**
+ * An XSD validator specific to Eclipse. This validator will wrap the internal
+ * XSD validator an provide automatic URI resolution support.
+ * Using this class is equivalent to using the internal XSD validator and registering
+ * the URI resolver from the URI resolution framework.
+ */
+public class XSDValidator extends org.eclipse.wst.xsd.core.internal.validation.XSDValidator
+{
+  private static XSDValidator instance = null;
+  
+  /**
+   * Return the one and only instance of the XSD validator. The validator
+   * can be reused and cannot be customized so there should only be one instance of it.
+   * 
+   * @return The one and only instance of the XSD validator.
+   */
+  public static XSDValidator getInstance()
+  {
+    if(instance == null)
+    {
+      instance = new XSDValidator();
+    }
+    return instance;
+  }
+  /**
+   * Constructor. Create the XSD validator and set the URI resolver.
+   */
+  protected XSDValidator()
+  {
+    this.setURIResolver(URIResolverPlugin.createResolver());
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/XSDCorePlugin.java b/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/XSDCorePlugin.java
new file mode 100644
index 0000000..7b30f26
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/XSDCorePlugin.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+* Copyright (c) 2004, 2005 IBM Corporation and others.
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+* 
+* Contributors:
+*     IBM Corporation - Initial API and implementation
+*******************************************************************************/
+package org.eclipse.wst.xsd.core.internal;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.wst.xsd.contentmodel.internal.XSDCMManager;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class XSDCorePlugin extends Plugin {
+	//The shared instance.
+	private static XSDCorePlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public XSDCorePlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+    XSDCMManager.getInstance().startup();
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static XSDCorePlugin getDefault() {
+		return plugin;
+	}
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/preferences/XSDCorePreferenceInitializer.java b/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/preferences/XSDCorePreferenceInitializer.java
new file mode 100644
index 0000000..f81f24d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/preferences/XSDCorePreferenceInitializer.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.core.internal.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.wst.xsd.core.internal.XSDCorePlugin;
+
+/**
+ * Sets default values for XSD Core preferences
+ */
+public class XSDCorePreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	public void initializeDefaultPreferences() {
+		IEclipsePreferences node = new DefaultScope().getNode(XSDCorePlugin.getDefault().getBundle().getSymbolicName());
+		
+		// In order to provide the best compatibility and conformance to the XML Schema
+		// specification it is recommended that this be defaulted to true.
+		node.putBoolean(XSDCorePreferenceNames.FULL_SCHEMA_CONFORMANCE, true);
+		
+	}
+}
diff --git a/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/preferences/XSDCorePreferenceNames.java b/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/preferences/XSDCorePreferenceNames.java
new file mode 100644
index 0000000..06fc74e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src/org/eclipse/wst/xsd/core/internal/preferences/XSDCorePreferenceNames.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xsd.core.internal.preferences;
+
+/**
+ * Common preference keys used by XSD core
+ */
+public class XSDCorePreferenceNames {
+	private XSDCorePreferenceNames() {
+		// empty private constructor so users cannot instantiate class
+	}
+	/**
+	 * Indicates whether or not all schema locations should be honoured
+	 * during XSD validation.
+	 * <p>
+	 * Value is of type <code>boolean</code>.<br />
+	 * Possible values: {TRUE, FALSE}
+	 * </p>
+	 * @deprecated
+	 */
+	public static final String HONOUR_ALL_SCHEMA_LOCATIONS = "honourAllSchemaLocations";//$NON-NLS-1$
+	public static final String FULL_SCHEMA_CONFORMANCE = "fullSchemaConformance";//$NON-NLS-1$
+}
diff --git a/features/org.eclipse.wst.web_core.feature.patch/.project b/features/org.eclipse.wst.web_core.feature.patch/.project
index 55af69c..1825661 100644
--- a/features/org.eclipse.wst.web_core.feature.patch/.project
+++ b/features/org.eclipse.wst.web_core.feature.patch/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.wst.web_core.feature.patch 2.0.2 Patches</name>
+	<name>org.eclipse.wst.web_core.feature.patch</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/features/org.eclipse.wst.web_core.feature.patch/buildnotes_org.eclipse.wst.web_core.feature.patch.html b/features/org.eclipse.wst.web_core.feature.patch/buildnotes_org.eclipse.wst.web_core.feature.patch.html
index d67d5b6..8b3d25d 100644
--- a/features/org.eclipse.wst.web_core.feature.patch/buildnotes_org.eclipse.wst.web_core.feature.patch.html
+++ b/features/org.eclipse.wst.web_core.feature.patch/buildnotes_org.eclipse.wst.web_core.feature.patch.html
@@ -4,16 +4,17 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <meta name="Build" content="Build">
-<title>WTP 2.0.2 Patches</title>
+<title>WTP 3.2.2 Patches</title>
 </head>
 
 <body>
 
-<h1>WTP 2.0.2 Patches</h1>
+<h1>WTP 3.2.2 Patches</h1>
 
 <h2>org.eclipse.wst.web_core.feature</h2>
-<h3>org.eclipse.wst.common.modulecore</h3>
-<p>Bug <a href="https://bugs.eclipse.org/201318">201318</a>.
-EAR Libraries container fails to initalize ...</p>
+<h3>org.eclipse.wst.html.core</h3>
+<p>Bug <a href="https://bugs.eclipse.org/326470">326470</a>. Script element for HTML5 is lacking attribute declarations</p>
+<p>Bug <a href="https://bugs.eclipse.org/326482">326482</a>. [content model] target attribute in <a> tag incorrectly flagged as warning in HTML5 page</p>
+<p>Bug <a href='https://bugs.eclipse.org/326632'>326632</a>. [ui] Project web content settings is not saved when Document type is set to HTML5</p> 
 </body>
-</html>
+</html>
\ No newline at end of file
diff --git a/features/org.eclipse.wst.web_core.feature.patch/epl-v10.html b/features/org.eclipse.wst.web_core.feature.patch/epl-v10.html
index 84ec251..abeecc4 100644
--- a/features/org.eclipse.wst.web_core.feature.patch/epl-v10.html
+++ b/features/org.eclipse.wst.web_core.feature.patch/epl-v10.html
@@ -27,7 +27,7 @@
 
 <body lang="EN-US">
 
-<p align=center><b>Eclipse Public License - v 1.0</b></p>
+<h2>Eclipse Public License - v 1.0</h2>
 
 <p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
 PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
@@ -41,6 +41,7 @@
 <p class="list">a) in the case of the initial Contributor, the initial
 code and documentation distributed under this Agreement, and</p>
 <p class="list">b) in the case of each subsequent Contributor:</p>
+
 <p class="list">i) changes to the Program, and</p>
 <p class="list">ii) additions to the Program;</p>
 <p class="list">where such changes and/or additions to the Program
diff --git a/features/org.eclipse.wst.web_core.feature.patch/feature.properties b/features/org.eclipse.wst.web_core.feature.patch/feature.properties
index da49220..254b306 100644
--- a/features/org.eclipse.wst.web_core.feature.patch/feature.properties
+++ b/features/org.eclipse.wst.web_core.feature.patch/feature.properties
@@ -15,10 +15,10 @@
 # This file should be translated.
 
 # "featureName" property - name of the feature
-featureName=WST Web Core Patches
+featureName=WTP Patches for org.eclipse.wst.web_core.feature
 
 # "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 
 # "updateSiteName" property - label for the update site
 updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
@@ -27,11 +27,13 @@
 description=\
 The bugs and fixes are described in the following bugzilla entries:\n\
 \n\
-Bug https://bugs.eclipse.org/201318 EAR Libraries container fails to initalize ...\n\
-
+Bug https://bugs.eclipse.org/326470 Script element for HTML5 is lacking attribute declarations\n\
+Bug https://bugs.eclipse.org/326482 [content model] target attribute in <a> tag incorrectly flagged as warning in HTML5 page\n\
+Bug https://bugs.eclipse.org/326632 [ui] Project web content settings is not saved when Document type is set to HTML5\n\
+\n\
 # "copyright" property - text of the "Feature Update Copyright"
 copyright=\
-Copyright (c) 2008 IBM Corporation and others.\n\
+Copyright (c) 2010 IBM Corporation and others.\n\
 All rights reserved. This program and the accompanying materials\n\
 are made available under the terms of the Eclipse Public License v1.0\n\
 which accompanies this distribution, and is available at\n\
@@ -48,8 +50,8 @@
 # "license" property - text of the "Feature Update License"
 # should be plain text version of license agreement pointed to be "licenseURL"
 license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-September 27, 2007\n\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
 \n\
 Usage Of Content\n\
 \n\
@@ -57,42 +59,38 @@
 OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
 USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
 AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
 AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
 AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
 TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
 OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
 BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
 \n\
 Applicable Licenses\n\
 \n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
 For purposes of the EPL, "Program" will mean the Content.\n\
 \n\
 Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
 as downloadable archives ("Downloads").\n\
 \n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
 \n\
 The terms and conditions governing Plug-ins and Fragments should be\n\
 contained in files named "about.html" ("Abouts"). The terms and\n\
@@ -101,47 +99,77 @@
 Licenses may be located in any directory of a Download or Module\n\
 including, but not limited to the following locations:\n\
 \n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
 \n\
 Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
 Included Features, the Feature Update License should either provide you\n\
 with the terms and conditions governing the Included Features or inform\n\
 you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
 \n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
 TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
 SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
 \n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
 \n\
 IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
 is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
 govern that particular Content.\n\
 \n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
 Cryptography\n\
 \n\
 Content may contain encryption software. The country in which you are\n\
 currently may have restrictions on the import, possession, and use,\n\
 and/or re-export to another country, of encryption software. BEFORE\n\
 using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
 \n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
 ########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.web_core.feature.patch/feature.xml b/features/org.eclipse.wst.web_core.feature.patch/feature.xml
index 4b3af0b..312f05a 100644
--- a/features/org.eclipse.wst.web_core.feature.patch/feature.xml
+++ b/features/org.eclipse.wst.web_core.feature.patch/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.web_core.feature.patch"
       label="%featureName"
-      version="2.0.2.qualifier"
+      version="3.2.2.qualifier"
       provider-name="%providerName">
 
       <description>%description</description>
@@ -14,11 +14,11 @@
 
 
    <requires>
-      <import feature="org.eclipse.wst.web_core.feature" version="2.0.2.v200802150100-42CN_kE77a8F9XCOEL" patch="true"/>
+      <import feature="org.eclipse.wst.web_core.feature" version="3.2.2.v201008100100-7E7AFHwAJrn5PM15pUYBwJLkSG8j" patch="true"/>
    </requires>
 
    <plugin
-         id="org.eclipse.wst.common.modulecore"
+         id="org.eclipse.wst.html.core"
          download-size="0"
          install-size="0"
          version="0.0.0"
diff --git a/features/org.eclipse.wst.web_core.feature.patch/license.html b/features/org.eclipse.wst.web_core.feature.patch/license.html
index fd7c16d..c184ca3 100644
--- a/features/org.eclipse.wst.web_core.feature.patch/license.html
+++ b/features/org.eclipse.wst.web_core.feature.patch/license.html
@@ -1,111 +1,107 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML>
-<HEAD>
-<TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR>
-</HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June, 2008</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,
-INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-(COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS
-AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF
-LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING
-THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE
-TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR
-REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the
-Eclipse Foundation is provided to you under the terms and conditions of
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is
-provided with this Content and is also available at <A
-	href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object
-code, documentation and other files maintained in the Eclipse.org CVS
-repository ("Repository") in CVS modules ("Modules") and made available
-as downloadable archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in
-fragments ("Fragments"), and features ("Features"). A Feature is a
-bundle of one or more Plug-ins and/or Fragments and associated material.
-Files named "feature.xml" may contain a list of the names and version
-numbers of the Plug-ins and/or Fragments associated with a Feature.
-Plug-ins and Fragments are located in directories named "plugins" and
-Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features").
-Files named "feature.xml" may contain a list of the names and version
-numbers of Included Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should
-be contained in files named "about.html" ("Abouts"). The terms and
-conditions governing Features and Included Features should be contained
-in files named "license.html" ("Feature Licenses"). Abouts and Feature
-Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</P>
-<UL>
-	<LI>The top-level (root) directory
-	<LI>Plug-in and Fragment directories
-	<LI>Subdirectories of the directory named "src" of certain
-	Plug-ins
-	<LI>Feature directories</LI>
-</UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is
-installed using the Eclipse Update Manager, you must agree to a license
-("Feature Update License") during the installation process. If the
-Feature contains Included Features, the Feature Update License should
-either provide you with the terms and conditions governing the Included
-Features or inform you where you can locate them. Feature Update
-Licenses may be found in the "license" property of files named
-"feature.properties". Such Abouts, Feature Licenses and Feature Update
-Licenses contain the terms and conditions (or references to such terms
-and conditions) that govern your use of the associated Content in that
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY
-REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND
-CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE
-NOT LIMITED TO):</P>
-<UL>
-	<LI>Common Public License Version 1.0 (available at <A
-		href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>)
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
 
-	
-	<LI>Apache Software License 1.1 (available at <A
-		href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>)
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
 
-	
-	<LI>Apache Software License 2.0 (available at <A
-		href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>)
+<h3>Usage Of Content</h3>
 
-	
-	<LI>IBM Public License 1.0 (available at <A
-		href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>)
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
 
-	
-	<LI>Metro Link Public License 1.00 (available at <A
-		href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>)
+<h3>Applicable Licenses</h3>
 
-	
-	<LI>Mozilla Public License Version 1.1 (available at <A
-		href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)
-	</LI>
-</UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND
-CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License or
-Feature Update License is provided, please contact the Eclipse
-Foundation to determine what terms and conditions govern that particular
-Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you
-are currently may have restrictions on the import, possession, and use,
-and/or re-export to another country, of encryption software. BEFORE
-using any encryption software, please check the country's laws,
-regulations and policies concerning the import, possession, or use, and
-re-export of encryption software, to see if this is permitted.</P>
-</BODY>
-</HTML>
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/.project b/features/org.eclipse.wst.web_ui.feature.patch/.project
new file mode 100644
index 0000000..3a1805e
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/.project
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.web_ui.feature.patch</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/build.properties b/features/org.eclipse.wst.web_ui.feature.patch/build.properties
new file mode 100644
index 0000000..cb50260
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               license.html,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/buildnotes_org.eclipse.wst.web_ui.feature.patch.html b/features/org.eclipse.wst.web_ui.feature.patch/buildnotes_org.eclipse.wst.web_ui.feature.patch.html
new file mode 100644
index 0000000..1a4e09e
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/buildnotes_org.eclipse.wst.web_ui.feature.patch.html
@@ -0,0 +1,22 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="Build" content="Build">
+<title>WTP 3.2.2 Patches</title>
+</head>
+
+<body>
+
+<h1>WTP 3.2.2 Patches</h1>
+
+<h2>org.eclipse.wst.web_ui.feature</h2>
+
+<p>Bug <a href='https://bugs.eclipse.org/326602'>326602</a>. Auto activation does not work in javascript regions in webpages</p>
+<p>Bug <a href='https://bugs.eclipse.org/326632'>326632</a>. [ui] Project web content settings is not saved when Document type is set to HTML5</p>
+<p>Bug <a href='https://bugs.eclipse.org/326817'>326817</a>. [editor] Leading and trailing HTML style comments in a JS region are not syntax highlighted as expected</p>
+<p>Bug <a href='https://bugs.eclipse.org/326818'>326818</a>. [validation] Text after HTML style comment in JavaScript region marked as validation error</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/eclipse_update_120.jpg b/features/org.eclipse.wst.web_ui.feature.patch/eclipse_update_120.jpg
new file mode 100644
index 0000000..bfdf708
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/eclipse_update_120.jpg
Binary files differ
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/epl-v10.html b/features/org.eclipse.wst.web_ui.feature.patch/epl-v10.html
new file mode 100644
index 0000000..abeecc4
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/epl-v10.html
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/feature.properties b/features/org.eclipse.wst.web_ui.feature.patch/feature.properties
new file mode 100644
index 0000000..d2832c2
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/feature.properties
@@ -0,0 +1,176 @@
+###############################################################################
+# Copyright (c) 2008 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=WTP Patch for org.eclipse.wst.web_ui.feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse Web Tools Platform
+
+# "updateSiteName" property - label for the update site
+updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
+
+# "description" property - description of the feature
+description=\
+Contains fixes for the following bugs: \n\
+\n\
+Bug https://bugs.eclipse.org/326602 Auto activation does not work in javascript regions in webpages\n\
+Bug https://bugs.eclipse.org/326632 [ui] Project web content settings is not saved when Document type is set to HTML5\n\
+Bug https://bugs.eclipse.org/326817 [editor] Leading and trailing HTML style comments in a JS region are not syntax highlighted as expected\n\
+Bug https://bugs.eclipse.org/326818 [validation] Text after HTML style comment in JavaScript region marked as validation error\n\
+\n\
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2010 IBM Corporation and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+    IBM Corporation - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/feature.xml b/features/org.eclipse.wst.web_ui.feature.patch/feature.xml
new file mode 100644
index 0000000..f0b56c2
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/feature.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.wst.web_ui.feature.patch"
+      label="%featureName"
+      version="3.2.2.qualifier"
+      provider-name="%providerName">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.wst.web_ui.feature" version="3.2.2.v201008100100-7O7CFbKEMf84nUlEJyX7-SPQjhYZ" patch="true"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.wst.jsdt.web.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.wst.jsdt.web.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.wst.html.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/features/org.eclipse.wst.web_ui.feature.patch/license.html b/features/org.eclipse.wst.web_ui.feature.patch/license.html
new file mode 100644
index 0000000..c184ca3
--- /dev/null
+++ b/features/org.eclipse.wst.web_ui.feature.patch/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html b/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html
index 6356913..a7a08db 100644
--- a/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html
+++ b/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html
@@ -7,9 +7,8 @@
 <body>
 
 
-<h1>WTP 3.0.1 Patches</h1>
+<h1>WTP 3.2.2 Patches</h1>
 
-<p>Bug <a href="https://bugs.eclipse.org/243747">243747</a>.
-"Cannot find the tag library descriptor" after removing a taglib file with duplicate URI.</p>
+<p>Bug <a href='https://bugs.eclipse.org/325818'>325818</a>. Attribute value parsed incorrectly in a jsp</p>
 </body>
 </head>
\ No newline at end of file
diff --git a/features/org.eclipse.wst.xml_core.feature.patch/epl-v10.html b/features/org.eclipse.wst.xml_core.feature.patch/epl-v10.html
index ed4b196..abeecc4 100644
--- a/features/org.eclipse.wst.xml_core.feature.patch/epl-v10.html
+++ b/features/org.eclipse.wst.xml_core.feature.patch/epl-v10.html
@@ -1,328 +1,262 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
 
 <head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
 <title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
 </head>
 
-<body lang=EN-US style='tab-interval:.5in'>
+<body lang="EN-US">
 
-<div class=Section1>
+<h2>Eclipse Public License - v 1.0</h2>
 
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
 
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
+<p><b>1. DEFINITIONS</b></p>
 
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+<p>&quot;Contribution&quot; means:</p>
 
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
 
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
 
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
+<p><b>2. GRANT OF RIGHTS</b></p>
 
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
 
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
 
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
+<p><b>3. REQUIREMENTS</b></p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
 
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+<p class="list">b) its license agreement:</p>
 
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
+<p>When the Program is made available in source code form:</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
+<p class="list">a) it must be made available under this Agreement; and</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
 
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
 
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
 
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
 
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
 
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+<p><b>5. NO WARRANTY</b></p>
 
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
 
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
 
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
 
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
+<p><b>7. GENERAL</b></p>
 
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
 
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
 
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
 distribution of the Program as soon as reasonably practicable. However,
 Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
+Recipient relating to the Program shall continue and survive.</p>
 
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
 
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
 
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/features/org.eclipse.wst.xml_core.feature.patch/feature.properties b/features/org.eclipse.wst.xml_core.feature.patch/feature.properties
index 6edee72..26345db 100644
--- a/features/org.eclipse.wst.xml_core.feature.patch/feature.properties
+++ b/features/org.eclipse.wst.xml_core.feature.patch/feature.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
+# Copyright (c) 2008 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -15,10 +15,10 @@
 # This file should be translated.
 
 # "featureName" property - name of the feature
-featureName=WST XML Core Patch Feature
+featureName=WTP Patches for org.eclipse.wst.xml_core.feature
 
 # "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 
 # "updateSiteName" property - label for the update site
 updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
@@ -27,11 +27,11 @@
 description=\
 The bugs and fixes are described in the following bugzilla entries:\n\
 \n\
-Bug https://bugs.eclipse.org/243747 Cannot find the tag library descriptor" after removing a taglib file with duplicate URI.\n\
-
+Bug https://bugs.eclipse.org/325818 Attribute value parsed incorrectly in a jsp\n\
+\n\
 # "copyright" property - text of the "Feature Update Copyright"
 copyright=\
-Copyright (c) 2006 IBM Corporation and others.\n\
+Copyright (c) 2010 IBM Corporation and others.\n\
 All rights reserved. This program and the accompanying materials\n\
 are made available under the terms of the Eclipse Public License v1.0\n\
 which accompanies this distribution, and is available at\n\
@@ -48,8 +48,8 @@
 # "license" property - text of the "Feature Update License"
 # should be plain text version of license agreement pointed to be "licenseURL"
 license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-March 17, 2005\n\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
 \n\
 Usage Of Content\n\
 \n\
@@ -57,42 +57,38 @@
 OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
 USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
 AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
 AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
 AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
 TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
 OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
 BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
 \n\
 Applicable Licenses\n\
 \n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
 For purposes of the EPL, "Program" will mean the Content.\n\
 \n\
 Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
 as downloadable archives ("Downloads").\n\
 \n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
 \n\
 The terms and conditions governing Plug-ins and Fragments should be\n\
 contained in files named "about.html" ("Abouts"). The terms and\n\
@@ -101,47 +97,77 @@
 Licenses may be located in any directory of a Download or Module\n\
 including, but not limited to the following locations:\n\
 \n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
 \n\
 Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
 Included Features, the Feature Update License should either provide you\n\
 with the terms and conditions governing the Included Features or inform\n\
 you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
 \n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
 TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
 SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
 \n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
 \n\
 IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
 is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
 govern that particular Content.\n\
 \n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
 Cryptography\n\
 \n\
 Content may contain encryption software. The country in which you are\n\
 currently may have restrictions on the import, possession, and use,\n\
 and/or re-export to another country, of encryption software. BEFORE\n\
 using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
 \n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
 ########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.xml_core.feature.patch/feature.xml b/features/org.eclipse.wst.xml_core.feature.patch/feature.xml
index 9b23ea4..5835104 100644
--- a/features/org.eclipse.wst.xml_core.feature.patch/feature.xml
+++ b/features/org.eclipse.wst.xml_core.feature.patch/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.xml_core.feature.patch"
       label="%featureName"
-      version="3.0.1.qualifier"
+      version="3.2.2.qualifier"
       provider-name="%providerName">
 
    <description>
@@ -22,7 +22,7 @@
    </url>
 
    <requires>
-      <import feature="org.eclipse.wst.xml_core.feature" version="3.0.1.v200807220139-7A7NEGuE7QYGHNH_NuKhUl" patch="true"/>
+      <import feature="org.eclipse.wst.xml_core.feature" version="3.2.2.v201008170029-7C7OFXYF7RZHQHI5PyJwPT" patch="true"/>
    </requires>
 
    <plugin
@@ -32,4 +32,4 @@
          version="0.0.0"
          unpack="false"/>
 
-</feature>
+   </feature>
diff --git a/features/org.eclipse.wst.xml_core.feature.patch/license.html b/features/org.eclipse.wst.xml_core.feature.patch/license.html
index 2347060..c184ca3 100644
--- a/features/org.eclipse.wst.xml_core.feature.patch/license.html
+++ b/features/org.eclipse.wst.xml_core.feature.patch/license.html
@@ -1,93 +1,107 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>January 28, 2005</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
 
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
 
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
+<h3>Usage Of Content</h3>
 
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
 
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
+<h3>Applicable Licenses</h3>
 
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>) 
-  </LI></UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/.project b/features/org.eclipse.wst.xml_ui.feature.patch/.project
new file mode 100644
index 0000000..b6f918a
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.xml_ui.feature.patch R30Patches</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/build.properties b/features/org.eclipse.wst.xml_ui.feature.patch/build.properties
new file mode 100644
index 0000000..cb50260
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               license.html,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/buildnotes_org.eclipse.wst.xml_ui.feature.patch.html b/features/org.eclipse.wst.xml_ui.feature.patch/buildnotes_org.eclipse.wst.xml_ui.feature.patch.html
new file mode 100644
index 0000000..ae85f73
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/buildnotes_org.eclipse.wst.xml_ui.feature.patch.html
@@ -0,0 +1,19 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="Build" content="Build">
+<title>WTP XML 3.2.1 Patches</title>
+</head>
+
+<body>
+
+<h1>WTP XML 3.2.1 Patches</h1>
+
+<h2>org.eclipse.wst.xml_ui.feature.patch</h2>
+
+<p>Bug <a href='https://bugs.eclipse.org/321529'>321529</a>. NPE when opening any source editor if JSP plugins are not loaded</p>
+
+</body>
+</html>
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/eclipse_update_120.jpg b/features/org.eclipse.wst.xml_ui.feature.patch/eclipse_update_120.jpg
new file mode 100644
index 0000000..bfdf708
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/eclipse_update_120.jpg
Binary files differ
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/epl-v10.html b/features/org.eclipse.wst.xml_ui.feature.patch/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+  <o:Revision>2</o:Revision>
+  <o:TotalTime>3</o:TotalTime>
+  <o:Created>2004-03-05T23:03:00Z</o:Created>
+  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+  <o:Pages>4</o:Pages>
+  <o:Words>1626</o:Words>
+  <o:Characters>9270</o:Characters>
+   <o:Lines>77</o:Lines>
+  <o:Paragraphs>18</o:Paragraphs>
+  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+  <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+  <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+@font-face
+	{font-family:Tahoma;
+	panose-1:2 11 6 4 3 5 4 4 2 4;
+	mso-font-charset:0;
+	mso-generic-font-family:swiss;
+	mso-font-pitch:variable;
+	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+	{mso-style-parent:"";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	font-family:"Times New Roman";
+	mso-fareast-font-family:"Times New Roman";}
+p
+	{margin-right:0in;
+	mso-margin-top-alt:auto;
+	mso-margin-bottom-alt:auto;
+	margin-left:0in;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	font-family:"Times New Roman";
+	mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+	{mso-style-name:"Balloon Text";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:8.0pt;
+	font-family:Tahoma;
+	mso-fareast-font-family:"Times New Roman";}
+@page Section1
+	{size:8.5in 11.0in;
+	margin:1.0in 1.25in 1.0in 1.25in;
+	mso-header-margin:.5in;
+	mso-footer-margin:.5in;
+	mso-paper-source:0;}
+div.Section1
+	{page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor (&quot;Commercial
+Contributor&quot;) hereby agrees to defend and indemnify every other
+Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
+costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/feature.properties b/features/org.eclipse.wst.xml_ui.feature.patch/feature.properties
new file mode 100644
index 0000000..d944e30
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/feature.properties
@@ -0,0 +1,174 @@
+###############################################################################
+# Copyright (c) 2008 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=WTP Patch for org.eclipse.wst.xml_ui.feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
+
+# "description" property - description of the feature
+description=\
+Contains fixes for the following bugs:\n\
+\n\
+Bug https://bugs.eclipse.org/321529 NPE when opening any source editor if JSP plugins are not loaded\n\
+\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2008 IBM Corporation and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+    IBM Corporation - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/feature.xml b/features/org.eclipse.wst.xml_ui.feature.patch/feature.xml
new file mode 100644
index 0000000..ab5a447
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/feature.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.wst.xml_ui.feature.patch"
+      label="%featureName"
+      version="3.2.1.qualifier"
+      provider-name="%providerName">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.wst.xml_ui.feature" version="3.2.1.v201007132152-7H7AFUMDxumQGOh8tejUU2Uw_Mx0" patch="true"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.wst.sse.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/features/org.eclipse.wst.xml_ui.feature.patch/license.html b/features/org.eclipse.wst.xml_ui.feature.patch/license.html
new file mode 100644
index 0000000..c184ca3
--- /dev/null
+++ b/features/org.eclipse.wst.xml_ui.feature.patch/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>